xref: /petsc/src/sys/classes/viewer/impls/vtk/vtkv.c (revision 5c6c1daec53e1d9ab0bec9db5309fd8fc7645b8d)
1*5c6c1daeSBarry Smith #include "../src/sys/classes/viewer/impls/vtk/vtkvimpl.h" /*I "petscviewer.h" I*/
2*5c6c1daeSBarry Smith 
3*5c6c1daeSBarry Smith #undef __FUNCT__
4*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerVTKAddField"
5*5c6c1daeSBarry Smith /*@C
6*5c6c1daeSBarry Smith    PetscViewerVTKAddField - Add a field to the viewer
7*5c6c1daeSBarry Smith 
8*5c6c1daeSBarry Smith    Collective
9*5c6c1daeSBarry Smith 
10*5c6c1daeSBarry Smith    Input Arguments:
11*5c6c1daeSBarry Smith + viewer - VTK viewer
12*5c6c1daeSBarry Smith . dm - DM on which Vec lives
13*5c6c1daeSBarry Smith . func - function to write this Vec
14*5c6c1daeSBarry Smith . fieldtype - Either PETSC_VTK_POINT_FIELD or PETSC_VTK_CELL_FIELD
15*5c6c1daeSBarry Smith - vec - Vec to write
16*5c6c1daeSBarry Smith 
17*5c6c1daeSBarry Smith    Level: developer
18*5c6c1daeSBarry Smith 
19*5c6c1daeSBarry Smith    Note:
20*5c6c1daeSBarry Smith    This routine keeps exclusive ownership of the Vec. The caller should not use or destroy the Vec after adding it.
21*5c6c1daeSBarry Smith 
22*5c6c1daeSBarry Smith .seealso: PetscViewerVTKOpen(), DMDAVTKWriteAll()
23*5c6c1daeSBarry Smith @*/
24*5c6c1daeSBarry Smith PetscErrorCode PetscViewerVTKAddField(PetscViewer viewer,PetscObject dm,PetscViewerVTKWriteFunction func,PetscViewerVTKFieldType fieldtype,PetscObject vec)
25*5c6c1daeSBarry Smith {
26*5c6c1daeSBarry Smith   PetscErrorCode ierr;
27*5c6c1daeSBarry Smith 
28*5c6c1daeSBarry Smith   PetscFunctionBegin;
29*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
30*5c6c1daeSBarry Smith   PetscValidHeader(dm,2);
31*5c6c1daeSBarry Smith   PetscValidHeader(vec,4);
32*5c6c1daeSBarry Smith   ierr = PetscUseMethod(viewer,"PetscViewerVTKAddField_C",(PetscViewer,PetscObject,PetscViewerVTKWriteFunction,PetscViewerVTKFieldType,PetscObject),(viewer,dm,func,fieldtype,vec));CHKERRQ(ierr);
33*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
34*5c6c1daeSBarry Smith }
35*5c6c1daeSBarry Smith 
36*5c6c1daeSBarry Smith #undef __FUNCT__
37*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDestroy_VTK"
38*5c6c1daeSBarry Smith static PetscErrorCode PetscViewerDestroy_VTK(PetscViewer viewer)
39*5c6c1daeSBarry Smith {
40*5c6c1daeSBarry Smith  PetscViewer_VTK *vtk = (PetscViewer_VTK*)viewer->data;
41*5c6c1daeSBarry Smith  PetscErrorCode  ierr;
42*5c6c1daeSBarry Smith 
43*5c6c1daeSBarry Smith  PetscFunctionBegin;
44*5c6c1daeSBarry Smith  ierr = PetscFree(vtk->filename);CHKERRQ(ierr);
45*5c6c1daeSBarry Smith  ierr = PetscFree(vtk);CHKERRQ(ierr);
46*5c6c1daeSBarry Smith  ierr = PetscObjectComposeFunctionDynamic((PetscObject)viewer,"PetscViewerFileSetName_C","",PETSC_NULL);CHKERRQ(ierr);
47*5c6c1daeSBarry Smith  ierr = PetscObjectComposeFunctionDynamic((PetscObject)viewer,"PetscViewerFileSetMode_C","",PETSC_NULL);CHKERRQ(ierr);
48*5c6c1daeSBarry Smith  ierr = PetscObjectComposeFunctionDynamic((PetscObject)viewer,"PetscViewerVTKAddField_C","",PETSC_NULL);CHKERRQ(ierr);
49*5c6c1daeSBarry Smith  PetscFunctionReturn(0);
50*5c6c1daeSBarry Smith }
51*5c6c1daeSBarry Smith 
52*5c6c1daeSBarry Smith #undef __FUNCT__
53*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFlush_VTK"
54*5c6c1daeSBarry Smith static PetscErrorCode PetscViewerFlush_VTK(PetscViewer viewer)
55*5c6c1daeSBarry Smith {
56*5c6c1daeSBarry Smith   PetscViewer_VTK *vtk = (PetscViewer_VTK*)viewer->data;
57*5c6c1daeSBarry Smith   PetscErrorCode ierr;
58*5c6c1daeSBarry Smith   PetscViewerVTKObjectLink   link,next;
59*5c6c1daeSBarry Smith 
60*5c6c1daeSBarry Smith   PetscFunctionBegin;
61*5c6c1daeSBarry Smith   if (vtk->link && (!vtk->dm || !vtk->dmwriteall)) SETERRQ(((PetscObject)viewer)->comm,PETSC_ERR_ARG_WRONGSTATE,"No fields or no grid");
62*5c6c1daeSBarry Smith   if (vtk->dmwriteall) {ierr = (*vtk->dmwriteall)(vtk->dm,viewer);CHKERRQ(ierr);}
63*5c6c1daeSBarry Smith   for (link=vtk->link; link; link=next) {
64*5c6c1daeSBarry Smith     next = link->next;
65*5c6c1daeSBarry Smith     ierr = PetscObjectDestroy(&link->vec);CHKERRQ(ierr);
66*5c6c1daeSBarry Smith     ierr = PetscFree(link);CHKERRQ(ierr);
67*5c6c1daeSBarry Smith   }
68*5c6c1daeSBarry Smith   ierr = PetscObjectDestroy(&vtk->dm);CHKERRQ(ierr);
69*5c6c1daeSBarry Smith   vtk->dmwriteall = PETSC_NULL;
70*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
71*5c6c1daeSBarry Smith }
72*5c6c1daeSBarry Smith 
73*5c6c1daeSBarry Smith EXTERN_C_BEGIN
74*5c6c1daeSBarry Smith #undef __FUNCT__
75*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileSetName_VTK"
76*5c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileSetName_VTK(PetscViewer viewer,const char name[])
77*5c6c1daeSBarry Smith {
78*5c6c1daeSBarry Smith   PetscViewer_VTK *vtk = (PetscViewer_VTK*)viewer->data;
79*5c6c1daeSBarry Smith   PetscErrorCode  ierr;
80*5c6c1daeSBarry Smith   PetscBool       isvtk,isvts,isvtu;
81*5c6c1daeSBarry Smith   size_t          len;
82*5c6c1daeSBarry Smith 
83*5c6c1daeSBarry Smith   PetscFunctionBegin;
84*5c6c1daeSBarry Smith   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
85*5c6c1daeSBarry Smith   ierr = PetscFree(vtk->filename);CHKERRQ(ierr);
86*5c6c1daeSBarry Smith   ierr = PetscStrlen(name,&len);CHKERRQ(ierr);
87*5c6c1daeSBarry Smith   ierr = PetscStrcasecmp(name+len-4,".vtk",&isvtk);CHKERRQ(ierr);
88*5c6c1daeSBarry Smith   ierr = PetscStrcasecmp(name+len-4,".vts",&isvts);CHKERRQ(ierr);
89*5c6c1daeSBarry Smith   ierr = PetscStrcasecmp(name+len-4,".vtu",&isvtu);CHKERRQ(ierr);
90*5c6c1daeSBarry Smith   if (isvtk) {
91*5c6c1daeSBarry Smith     if (viewer->format == PETSC_VIEWER_DEFAULT) {ierr = PetscViewerSetFormat(viewer,PETSC_VIEWER_ASCII_VTK);CHKERRQ(ierr);}
92*5c6c1daeSBarry Smith     if (viewer->format != PETSC_VIEWER_ASCII_VTK) SETERRQ2(((PetscObject)viewer)->comm,PETSC_ERR_ARG_INCOMP,"Cannot use file '%s' with format %s, should have '.vtk' extension",name,PetscViewerFormats[viewer->format]);
93*5c6c1daeSBarry Smith   } else if (isvts) {
94*5c6c1daeSBarry Smith     if (viewer->format == PETSC_VIEWER_DEFAULT) {ierr = PetscViewerSetFormat(viewer,PETSC_VIEWER_VTK_VTS);CHKERRQ(ierr);}
95*5c6c1daeSBarry Smith     if (viewer->format != PETSC_VIEWER_VTK_VTS) SETERRQ2(((PetscObject)viewer)->comm,PETSC_ERR_ARG_INCOMP,"Cannot use file '%s' with format %s, should have '.vts' extension",name,PetscViewerFormats[viewer->format]);
96*5c6c1daeSBarry Smith   } else if (isvtu) {
97*5c6c1daeSBarry Smith     if (viewer->format == PETSC_VIEWER_DEFAULT) {ierr = PetscViewerSetFormat(viewer,PETSC_VIEWER_VTK_VTU);CHKERRQ(ierr);}
98*5c6c1daeSBarry Smith     if (viewer->format != PETSC_VIEWER_VTK_VTU) SETERRQ2(((PetscObject)viewer)->comm,PETSC_ERR_ARG_INCOMP,"Cannot use file '%s' with format %s, should have '.vts' extension",name,PetscViewerFormats[viewer->format]);
99*5c6c1daeSBarry Smith   } else SETERRQ1(((PetscObject)viewer)->comm,PETSC_ERR_ARG_UNKNOWN_TYPE,"File '%s' has unrecognized extension",name);
100*5c6c1daeSBarry Smith   ierr = PetscStrallocpy(name,&vtk->filename);CHKERRQ(ierr);
101*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
102*5c6c1daeSBarry Smith }
103*5c6c1daeSBarry Smith EXTERN_C_END
104*5c6c1daeSBarry Smith 
105*5c6c1daeSBarry Smith EXTERN_C_BEGIN
106*5c6c1daeSBarry Smith #undef __FUNCT__
107*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileSetMode_VTK"
108*5c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileSetMode_VTK(PetscViewer viewer,PetscFileMode type)
109*5c6c1daeSBarry Smith {
110*5c6c1daeSBarry Smith   PetscViewer_VTK *vtk = (PetscViewer_VTK*)viewer->data;
111*5c6c1daeSBarry Smith 
112*5c6c1daeSBarry Smith   PetscFunctionBegin;
113*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
114*5c6c1daeSBarry Smith   vtk->btype = type;
115*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
116*5c6c1daeSBarry Smith }
117*5c6c1daeSBarry Smith EXTERN_C_END
118*5c6c1daeSBarry Smith 
119*5c6c1daeSBarry Smith EXTERN_C_BEGIN
120*5c6c1daeSBarry Smith #undef __FUNCT__
121*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerVTKAddField_VTK"
122*5c6c1daeSBarry Smith PetscErrorCode  PetscViewerVTKAddField_VTK(PetscViewer viewer,PetscObject dm,PetscViewerVTKWriteFunction dmwriteall,PetscViewerVTKFieldType fieldtype,PetscObject vec)
123*5c6c1daeSBarry Smith {
124*5c6c1daeSBarry Smith   PetscViewer_VTK *vtk = (PetscViewer_VTK*)viewer->data;
125*5c6c1daeSBarry Smith   PetscViewerVTKObjectLink link, tail = vtk->link;
126*5c6c1daeSBarry Smith   PetscErrorCode ierr;
127*5c6c1daeSBarry Smith 
128*5c6c1daeSBarry Smith   PetscFunctionBegin;
129*5c6c1daeSBarry Smith   if (vtk->dm) {
130*5c6c1daeSBarry Smith     if (dm != vtk->dm) SETERRQ(((PetscObject)viewer)->comm,PETSC_ERR_ARG_INCOMP,"Cannot write a field from more than one grid to the same VTK file");
131*5c6c1daeSBarry Smith   }
132*5c6c1daeSBarry Smith   vtk->dm = dm;
133*5c6c1daeSBarry Smith   vtk->dmwriteall = dmwriteall;
134*5c6c1daeSBarry Smith   ierr = PetscMalloc(sizeof(struct _n_PetscViewerVTKObjectLink),&link);CHKERRQ(ierr);
135*5c6c1daeSBarry Smith   link->ft = fieldtype;
136*5c6c1daeSBarry Smith   link->vec = vec;
137*5c6c1daeSBarry Smith   link->next = PETSC_NULL;
138*5c6c1daeSBarry Smith   /* Append to list */
139*5c6c1daeSBarry Smith   if (tail) {
140*5c6c1daeSBarry Smith     while(tail->next) tail = tail->next;
141*5c6c1daeSBarry Smith     tail->next = link;
142*5c6c1daeSBarry Smith   } else {
143*5c6c1daeSBarry Smith     vtk->link = link;
144*5c6c1daeSBarry Smith   }
145*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
146*5c6c1daeSBarry Smith }
147*5c6c1daeSBarry Smith EXTERN_C_END
148*5c6c1daeSBarry Smith 
149*5c6c1daeSBarry Smith EXTERN_C_BEGIN
150*5c6c1daeSBarry Smith #undef __FUNCT__
151*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerCreate_VTK"
152*5c6c1daeSBarry Smith PetscErrorCode  PetscViewerCreate_VTK(PetscViewer v)
153*5c6c1daeSBarry Smith {
154*5c6c1daeSBarry Smith   PetscViewer_VTK *vtk;
155*5c6c1daeSBarry Smith   PetscErrorCode  ierr;
156*5c6c1daeSBarry Smith 
157*5c6c1daeSBarry Smith   PetscFunctionBegin;
158*5c6c1daeSBarry Smith   ierr = PetscNewLog(v,PetscViewer_VTK,&vtk);CHKERRQ(ierr);
159*5c6c1daeSBarry Smith 
160*5c6c1daeSBarry Smith   v->data         = (void*)vtk;
161*5c6c1daeSBarry Smith   v->ops->destroy = PetscViewerDestroy_VTK;
162*5c6c1daeSBarry Smith   v->ops->flush   = PetscViewerFlush_VTK;
163*5c6c1daeSBarry Smith   v->iformat      = 0;
164*5c6c1daeSBarry Smith   vtk->btype     = (PetscFileMode) -1;
165*5c6c1daeSBarry Smith   vtk->filename  = 0;
166*5c6c1daeSBarry Smith 
167*5c6c1daeSBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)v,"PetscViewerFileSetName_C","PetscViewerFileSetName_VTK",
168*5c6c1daeSBarry Smith                                            PetscViewerFileSetName_VTK);CHKERRQ(ierr);
169*5c6c1daeSBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)v,"PetscViewerFileSetMode_C","PetscViewerFileSetMode_VTK",
170*5c6c1daeSBarry Smith                                            PetscViewerFileSetMode_VTK);CHKERRQ(ierr);
171*5c6c1daeSBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)v,"PetscViewerVTKAddField_C","PetscViewerVTKAddField_VTK",
172*5c6c1daeSBarry Smith                                            PetscViewerVTKAddField_VTK);CHKERRQ(ierr);
173*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
174*5c6c1daeSBarry Smith }
175*5c6c1daeSBarry Smith EXTERN_C_END
176*5c6c1daeSBarry Smith 
177*5c6c1daeSBarry Smith #undef __FUNCT__
178*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerVTKOpen"
179*5c6c1daeSBarry Smith /*@C
180*5c6c1daeSBarry Smith    PetscViewerVTKOpen - Opens a file for VTK output.
181*5c6c1daeSBarry Smith 
182*5c6c1daeSBarry Smith    Collective on MPI_Comm
183*5c6c1daeSBarry Smith 
184*5c6c1daeSBarry Smith    Input Parameters:
185*5c6c1daeSBarry Smith +  comm - MPI communicator
186*5c6c1daeSBarry Smith .  name - name of file
187*5c6c1daeSBarry Smith -  type - type of file
188*5c6c1daeSBarry Smith $    FILE_MODE_WRITE - create new file for binary output
189*5c6c1daeSBarry Smith $    FILE_MODE_READ - open existing file for binary input (not currently supported)
190*5c6c1daeSBarry Smith $    FILE_MODE_APPEND - open existing file for binary output (not currently supported)
191*5c6c1daeSBarry Smith 
192*5c6c1daeSBarry Smith    Output Parameter:
193*5c6c1daeSBarry Smith .  vtk - PetscViewer for VTK input/output to use with the specified file
194*5c6c1daeSBarry Smith 
195*5c6c1daeSBarry Smith    Level: beginner
196*5c6c1daeSBarry Smith 
197*5c6c1daeSBarry Smith    Note:
198*5c6c1daeSBarry Smith    This PetscViewer should be destroyed with PetscViewerDestroy().
199*5c6c1daeSBarry Smith 
200*5c6c1daeSBarry Smith    Concepts: VTK files
201*5c6c1daeSBarry Smith    Concepts: PetscViewer^creating
202*5c6c1daeSBarry Smith 
203*5c6c1daeSBarry Smith .seealso: PetscViewerASCIIOpen(), PetscViewerSetFormat(), PetscViewerDestroy(),
204*5c6c1daeSBarry Smith           VecView(), MatView(), VecLoad(), MatLoad(),
205*5c6c1daeSBarry Smith           PetscFileMode, PetscViewer
206*5c6c1daeSBarry Smith @*/
207*5c6c1daeSBarry Smith PetscErrorCode PetscViewerVTKOpen(MPI_Comm comm,const char name[],PetscFileMode type,PetscViewer *vtk)
208*5c6c1daeSBarry Smith {
209*5c6c1daeSBarry Smith   PetscErrorCode ierr;
210*5c6c1daeSBarry Smith 
211*5c6c1daeSBarry Smith   PetscFunctionBegin;
212*5c6c1daeSBarry Smith   ierr = PetscViewerCreate(comm,vtk);CHKERRQ(ierr);
213*5c6c1daeSBarry Smith   ierr = PetscViewerSetType(*vtk,PETSCVIEWERVTK);CHKERRQ(ierr);
214*5c6c1daeSBarry Smith   ierr = PetscViewerFileSetMode(*vtk,type);CHKERRQ(ierr);
215*5c6c1daeSBarry Smith   ierr = PetscViewerFileSetName(*vtk,name);CHKERRQ(ierr);
216*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
217*5c6c1daeSBarry Smith }
218*5c6c1daeSBarry Smith 
219*5c6c1daeSBarry Smith #undef __FUNCT__
220*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerVTKFWrite"
221*5c6c1daeSBarry Smith /*@C
222*5c6c1daeSBarry Smith    PetscViewerVTKFWrite - write binary data preceded by 32-bit int length (in bytes), does not do byte swapping.
223*5c6c1daeSBarry Smith 
224*5c6c1daeSBarry Smith    Logically collective on PetscViewer
225*5c6c1daeSBarry Smith 
226*5c6c1daeSBarry Smith    Input Parameters:
227*5c6c1daeSBarry Smith +  viewer - logically collective viewer, data written from rank 0
228*5c6c1daeSBarry Smith .  fp - file pointer valid on rank 0
229*5c6c1daeSBarry Smith .  data - data pointer valid on rank 0
230*5c6c1daeSBarry Smith .  n - number of data items
231*5c6c1daeSBarry Smith -  dtype - data type
232*5c6c1daeSBarry Smith 
233*5c6c1daeSBarry Smith    Level: developer
234*5c6c1daeSBarry Smith 
235*5c6c1daeSBarry Smith    Concepts: VTK files
236*5c6c1daeSBarry Smith    Concepts: PetscViewer^creating
237*5c6c1daeSBarry Smith 
238*5c6c1daeSBarry Smith .seealso: DMDAVTKWriteAll(), DMComplexVTKWriteAll(), PetscViewerSetFormat(), PetscViewerVTKOpen(), PetscBinaryWrite()
239*5c6c1daeSBarry Smith @*/
240*5c6c1daeSBarry Smith PetscErrorCode PetscViewerVTKFWrite(PetscViewer viewer,FILE *fp,const void *data,PetscInt n,PetscDataType dtype)
241*5c6c1daeSBarry Smith {
242*5c6c1daeSBarry Smith   PetscErrorCode ierr;
243*5c6c1daeSBarry Smith   PetscMPIInt rank;
244*5c6c1daeSBarry Smith 
245*5c6c1daeSBarry Smith   PetscFunctionBegin;
246*5c6c1daeSBarry Smith   if (n < 0) SETERRQ1(((PetscObject)viewer)->comm,PETSC_ERR_ARG_OUTOFRANGE,"Trying to write a negative amount of data %D",n);
247*5c6c1daeSBarry Smith   if (!n) PetscFunctionReturn(0);
248*5c6c1daeSBarry Smith   ierr = MPI_Comm_rank(((PetscObject)viewer)->comm,&rank);CHKERRQ(ierr);
249*5c6c1daeSBarry Smith   if (!rank) {
250*5c6c1daeSBarry Smith     size_t count;
251*5c6c1daeSBarry Smith     PetscInt size;
252*5c6c1daeSBarry Smith     PetscVTKInt bytes;
253*5c6c1daeSBarry Smith     switch (dtype) {
254*5c6c1daeSBarry Smith     case PETSC_DOUBLE:
255*5c6c1daeSBarry Smith       size = sizeof(double);
256*5c6c1daeSBarry Smith       break;
257*5c6c1daeSBarry Smith     case PETSC_FLOAT:
258*5c6c1daeSBarry Smith       size = sizeof(float);
259*5c6c1daeSBarry Smith       break;
260*5c6c1daeSBarry Smith     case PETSC_INT:
261*5c6c1daeSBarry Smith       size = sizeof(PetscInt);
262*5c6c1daeSBarry Smith       break;
263*5c6c1daeSBarry Smith     case PETSC_ENUM:
264*5c6c1daeSBarry Smith       size = sizeof(PetscEnum);
265*5c6c1daeSBarry Smith       break;
266*5c6c1daeSBarry Smith     case PETSC_CHAR:
267*5c6c1daeSBarry Smith       size = sizeof(char);
268*5c6c1daeSBarry Smith       break;
269*5c6c1daeSBarry Smith     default: SETERRQ(((PetscObject)viewer)->comm,PETSC_ERR_SUP,"Data type not supported");
270*5c6c1daeSBarry Smith     }
271*5c6c1daeSBarry Smith     bytes = PetscVTKIntCast(size*n);
272*5c6c1daeSBarry Smith 
273*5c6c1daeSBarry Smith     count = fwrite(&bytes,sizeof(int),1,fp);
274*5c6c1daeSBarry Smith     if (count != 1) {
275*5c6c1daeSBarry Smith       SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_WRITE,"Error writing byte count");
276*5c6c1daeSBarry Smith     }
277*5c6c1daeSBarry Smith     count = fwrite(data,size,(size_t)n,fp);
278*5c6c1daeSBarry Smith     if ((PetscInt)count != n) {
279*5c6c1daeSBarry Smith       SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_FILE_WRITE,"Wrote %D/%D array members of size %D",(PetscInt)count,n,(PetscInt)size);
280*5c6c1daeSBarry Smith     }
281*5c6c1daeSBarry Smith   }
282*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
283*5c6c1daeSBarry Smith }
284