xref: /petsc/src/dm/impls/da/grvtk.c (revision 7a8be3513cf479fb6a672bd91de7eb6883fcfd02)
1af0996ceSBarry Smith #include <petsc/private/dmdaimpl.h>
294fbd55eSBarry Smith /*
394fbd55eSBarry Smith    Note that the API for using PETSCVIEWERVTK is totally wrong since its use requires
494fbd55eSBarry Smith    including the private vtkvimpl.h file. The code should be refactored.
594fbd55eSBarry Smith */
65c6c1daeSBarry Smith #include <../src/sys/classes/viewer/impls/vtk/vtkvimpl.h>
74061b8bfSJed Brown 
8fb5bd1c2SPatrick Sanan /* Helper function which determines if any DMDA fields are named.  This is used
9fb5bd1c2SPatrick Sanan    as a proxy for the user's intention to use DMDA fields as distinct
10fb5bd1c2SPatrick Sanan    scalar-valued fields as opposed to a single vector-valued field */
11fb5bd1c2SPatrick Sanan static PetscErrorCode DMDAGetFieldsNamed(DM da,PetscBool *fieldsnamed)
12fb5bd1c2SPatrick Sanan {
13fb5bd1c2SPatrick Sanan   PetscErrorCode ierr;
14fb5bd1c2SPatrick Sanan   PetscInt       f,bs;
15fb5bd1c2SPatrick Sanan 
16fb5bd1c2SPatrick Sanan   PetscFunctionBegin;
17fb5bd1c2SPatrick Sanan   *fieldsnamed = PETSC_FALSE;
18277f51e8SBarry Smith   ierr = DMDAGetDof(da,&bs);CHKERRQ(ierr);
19fb5bd1c2SPatrick Sanan   for (f=0; f<bs; ++f) {
20fb5bd1c2SPatrick Sanan     const char * fieldname;
21fb5bd1c2SPatrick Sanan     ierr = DMDAGetFieldName(da,f,&fieldname);CHKERRQ(ierr);
22fb5bd1c2SPatrick Sanan     if (fieldname) {
23fb5bd1c2SPatrick Sanan       *fieldsnamed = PETSC_TRUE;
24fb5bd1c2SPatrick Sanan       break;
25fb5bd1c2SPatrick Sanan     }
26fb5bd1c2SPatrick Sanan   }
27fb5bd1c2SPatrick Sanan   PetscFunctionReturn(0);
28fb5bd1c2SPatrick Sanan }
29fb5bd1c2SPatrick Sanan 
304061b8bfSJed Brown static PetscErrorCode DMDAVTKWriteAll_VTS(DM da,PetscViewer viewer)
314061b8bfSJed Brown {
3230815ce0SLisandro Dalcin   const char *byte_order = PetscBinaryBigEndian() ? "BigEndian" : "LittleEndian";
334061b8bfSJed Brown #if defined(PETSC_USE_REAL_SINGLE)
344061b8bfSJed Brown   const char precision[] = "Float32";
354061b8bfSJed Brown #elif defined(PETSC_USE_REAL_DOUBLE)
364061b8bfSJed Brown   const char precision[] = "Float64";
374061b8bfSJed Brown #else
384061b8bfSJed Brown   const char precision[] = "UnknownPrecision";
394061b8bfSJed Brown #endif
40ce94432eSBarry Smith   MPI_Comm                 comm;
412eaa9ef4SLisandro Dalcin   Vec                      Coords;
424061b8bfSJed Brown   PetscViewer_VTK          *vtk = (PetscViewer_VTK*)viewer->data;
434061b8bfSJed Brown   PetscViewerVTKObjectLink link;
444061b8bfSJed Brown   FILE                     *fp;
454061b8bfSJed Brown   PetscMPIInt              rank,size,tag;
464061b8bfSJed Brown   DMDALocalInfo            info;
47ea2d7708SPatrick Sanan   PetscInt                 dim,mx,my,mz,cdim,bs,boffset,maxnnodes,maxbs,i,j,k,r;
480298fd71SBarry Smith   PetscInt                 rloc[6],(*grloc)[6] = NULL;
494061b8bfSJed Brown   PetscScalar              *array,*array2;
504061b8bfSJed Brown   PetscErrorCode           ierr;
514061b8bfSJed Brown 
524061b8bfSJed Brown   PetscFunctionBegin;
53094921d9SJed Brown   ierr = PetscObjectGetComm((PetscObject)da,&comm);CHKERRQ(ierr);
542c71b3e2SJacob Faibussowitsch   PetscCheckFalse(PetscDefined(USE_COMPLEX),PETSC_COMM_SELF,PETSC_ERR_SUP,"Complex values not supported");
55ffc4695bSBarry Smith   ierr = MPI_Comm_size(comm,&size);CHKERRMPI(ierr);
56ffc4695bSBarry Smith   ierr = MPI_Comm_rank(comm,&rank);CHKERRMPI(ierr);
57ea78f98cSLisandro Dalcin   ierr = DMDAGetInfo(da,&dim,&mx,&my,&mz,NULL,NULL,NULL,&bs,NULL,NULL,NULL,NULL,NULL);CHKERRQ(ierr);
584061b8bfSJed Brown   ierr = DMDAGetLocalInfo(da,&info);CHKERRQ(ierr);
592eaa9ef4SLisandro Dalcin   ierr = DMGetCoordinates(da,&Coords);CHKERRQ(ierr);
602eaa9ef4SLisandro Dalcin   if (Coords) {
612eaa9ef4SLisandro Dalcin     PetscInt csize;
622eaa9ef4SLisandro Dalcin     ierr = VecGetSize(Coords,&csize);CHKERRQ(ierr);
632c71b3e2SJacob Faibussowitsch     PetscCheckFalse(csize % (mx*my*mz),PETSC_COMM_SELF,PETSC_ERR_PLIB,"Coordinate vector size mismatch");
642eaa9ef4SLisandro Dalcin     cdim = csize/(mx*my*mz);
652c71b3e2SJacob Faibussowitsch     PetscCheckFalse(cdim < dim || cdim > 3,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Coordinate vector size mismatch");
662eaa9ef4SLisandro Dalcin   } else {
672eaa9ef4SLisandro Dalcin     cdim = dim;
682eaa9ef4SLisandro Dalcin   }
694061b8bfSJed Brown 
704061b8bfSJed Brown   ierr = PetscFOpen(comm,vtk->filename,"wb",&fp);CHKERRQ(ierr);
714061b8bfSJed Brown   ierr = PetscFPrintf(comm,fp,"<?xml version=\"1.0\"?>\n");CHKERRQ(ierr);
7230815ce0SLisandro Dalcin   ierr = PetscFPrintf(comm,fp,"<VTKFile type=\"StructuredGrid\" version=\"0.1\" byte_order=\"%s\">\n",byte_order);CHKERRQ(ierr);
734061b8bfSJed Brown   ierr = PetscFPrintf(comm,fp,"  <StructuredGrid WholeExtent=\"%D %D %D %D %D %D\">\n",0,mx-1,0,my-1,0,mz-1);CHKERRQ(ierr);
744061b8bfSJed Brown 
75dd400576SPatrick Sanan   if (rank == 0) {ierr = PetscMalloc1(size*6,&grloc);CHKERRQ(ierr);}
764061b8bfSJed Brown   rloc[0] = info.xs;
774061b8bfSJed Brown   rloc[1] = info.xm;
784061b8bfSJed Brown   rloc[2] = info.ys;
794061b8bfSJed Brown   rloc[3] = info.ym;
804061b8bfSJed Brown   rloc[4] = info.zs;
814061b8bfSJed Brown   rloc[5] = info.zm;
8255b25c41SPierre Jolivet   ierr    = MPI_Gather(rloc,6,MPIU_INT,&grloc[0][0],6,MPIU_INT,0,comm);CHKERRMPI(ierr);
834061b8bfSJed Brown 
844061b8bfSJed Brown   /* Write XML header */
854061b8bfSJed Brown   maxnnodes = 0;                /* Used for the temporary array size on rank 0 */
86ea2d7708SPatrick Sanan   maxbs     = 0;                /* Used for the temporary array size on rank 0 */
874061b8bfSJed Brown   boffset   = 0;                /* Offset into binary file */
884061b8bfSJed Brown   for (r=0; r<size; r++) {
894061b8bfSJed Brown     PetscInt xs=-1,xm=-1,ys=-1,ym=-1,zs=-1,zm=-1,nnodes = 0;
90dd400576SPatrick Sanan     if (rank == 0) {
914061b8bfSJed Brown       xs     = grloc[r][0];
924061b8bfSJed Brown       xm     = grloc[r][1];
934061b8bfSJed Brown       ys     = grloc[r][2];
944061b8bfSJed Brown       ym     = grloc[r][3];
954061b8bfSJed Brown       zs     = grloc[r][4];
964061b8bfSJed Brown       zm     = grloc[r][5];
974061b8bfSJed Brown       nnodes = xm*ym*zm;
984061b8bfSJed Brown     }
994061b8bfSJed Brown     maxnnodes = PetscMax(maxnnodes,nnodes);
1004061b8bfSJed Brown     ierr     = PetscFPrintf(comm,fp,"    <Piece Extent=\"%D %D %D %D %D %D\">\n",xs,xs+xm-1,ys,ys+ym-1,zs,zs+zm-1);CHKERRQ(ierr);
1014061b8bfSJed Brown     ierr     = PetscFPrintf(comm,fp,"      <Points>\n");CHKERRQ(ierr);
1024061b8bfSJed Brown     ierr     = PetscFPrintf(comm,fp,"        <DataArray type=\"%s\" Name=\"Position\" NumberOfComponents=\"3\" format=\"appended\" offset=\"%D\" />\n",precision,boffset);CHKERRQ(ierr);
1034061b8bfSJed Brown     boffset += 3*nnodes*sizeof(PetscScalar) + sizeof(int);
1044061b8bfSJed Brown     ierr     = PetscFPrintf(comm,fp,"      </Points>\n");CHKERRQ(ierr);
1054061b8bfSJed Brown 
1064061b8bfSJed Brown     ierr = PetscFPrintf(comm,fp,"      <PointData Scalars=\"ScalarPointData\">\n");CHKERRQ(ierr);
1074061b8bfSJed Brown     for (link=vtk->link; link; link=link->next) {
1084061b8bfSJed Brown       Vec        X = (Vec)link->vec;
109fb5bd1c2SPatrick Sanan       PetscInt   bs,f;
110ea2d7708SPatrick Sanan       DM         daCurr;
111fb5bd1c2SPatrick Sanan       PetscBool  fieldsnamed;
112fb5bd1c2SPatrick Sanan       const char *vecname = "Unnamed";
113ea2d7708SPatrick Sanan 
114ea2d7708SPatrick Sanan       ierr = VecGetDM(X,&daCurr);CHKERRQ(ierr);
115ea78f98cSLisandro Dalcin       ierr = DMDAGetInfo(daCurr,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&bs,NULL,NULL,NULL,NULL,NULL);CHKERRQ(ierr);
116ea2d7708SPatrick Sanan       maxbs = PetscMax(maxbs,bs);
117ea2d7708SPatrick Sanan 
118ea2d7708SPatrick Sanan       if (((PetscObject)X)->name || link != vtk->link) {
1194061b8bfSJed Brown         ierr = PetscObjectGetName((PetscObject)X,&vecname);CHKERRQ(ierr);
1204061b8bfSJed Brown       }
121fb5bd1c2SPatrick Sanan 
122fb5bd1c2SPatrick Sanan       /* If any fields are named, add scalar fields. Otherwise, add a vector field */
123fb5bd1c2SPatrick Sanan       ierr = DMDAGetFieldsNamed(daCurr,&fieldsnamed);CHKERRQ(ierr);
124fb5bd1c2SPatrick Sanan       if (fieldsnamed) {
125fb5bd1c2SPatrick Sanan         for (f=0; f<bs; f++) {
126fb5bd1c2SPatrick Sanan           char       buf[256];
127fb5bd1c2SPatrick Sanan           const char *fieldname;
128fb5bd1c2SPatrick Sanan           ierr = DMDAGetFieldName(daCurr,f,&fieldname);CHKERRQ(ierr);
129fb5bd1c2SPatrick Sanan           if (!fieldname) {
130fb5bd1c2SPatrick Sanan             ierr      = PetscSNPrintf(buf,sizeof(buf),"%D",f);CHKERRQ(ierr);
131fb5bd1c2SPatrick Sanan             fieldname = buf;
132fb5bd1c2SPatrick Sanan           }
133fb5bd1c2SPatrick Sanan           ierr     = PetscFPrintf(comm,fp,"        <DataArray type=\"%s\" Name=\"%s.%s\" NumberOfComponents=\"1\" format=\"appended\" offset=\"%D\" />\n",precision,vecname,fieldname,boffset);CHKERRQ(ierr);
134fb5bd1c2SPatrick Sanan           boffset += nnodes*sizeof(PetscScalar) + sizeof(int);
135fb5bd1c2SPatrick Sanan         }
136fb5bd1c2SPatrick Sanan       } else {
137ea2d7708SPatrick Sanan         ierr     = PetscFPrintf(comm,fp,"        <DataArray type=\"%s\" Name=\"%s\" NumberOfComponents=\"%D\" format=\"appended\" offset=\"%D\" />\n",precision,vecname,bs,boffset);CHKERRQ(ierr);
138ea2d7708SPatrick Sanan         boffset += bs*nnodes*sizeof(PetscScalar) + sizeof(int);
1394061b8bfSJed Brown       }
140fb5bd1c2SPatrick Sanan     }
1414061b8bfSJed Brown     ierr = PetscFPrintf(comm,fp,"      </PointData>\n");CHKERRQ(ierr);
1424061b8bfSJed Brown     ierr = PetscFPrintf(comm,fp,"    </Piece>\n");CHKERRQ(ierr);
1434061b8bfSJed Brown   }
1444061b8bfSJed Brown   ierr = PetscFPrintf(comm,fp,"  </StructuredGrid>\n");CHKERRQ(ierr);
1454061b8bfSJed Brown   ierr = PetscFPrintf(comm,fp,"  <AppendedData encoding=\"raw\">\n");CHKERRQ(ierr);
1464061b8bfSJed Brown   ierr = PetscFPrintf(comm,fp,"_");CHKERRQ(ierr);
1474061b8bfSJed Brown 
1484061b8bfSJed Brown   /* Now write the arrays. */
1494061b8bfSJed Brown   tag  = ((PetscObject)viewer)->tag;
150fb5bd1c2SPatrick Sanan   ierr = PetscMalloc2(maxnnodes*PetscMax(3,maxbs),&array,maxnnodes*PetscMax(3,maxbs),&array2);CHKERRQ(ierr);
1514061b8bfSJed Brown   for (r=0; r<size; r++) {
1524061b8bfSJed Brown     MPI_Status status;
1534061b8bfSJed Brown     PetscInt   xs=-1,xm=-1,ys=-1,ym=-1,zs=-1,zm=-1,nnodes = 0;
154dd400576SPatrick Sanan     if (rank == 0) {
1554061b8bfSJed Brown       xs     = grloc[r][0];
1564061b8bfSJed Brown       xm     = grloc[r][1];
1574061b8bfSJed Brown       ys     = grloc[r][2];
1584061b8bfSJed Brown       ym     = grloc[r][3];
1594061b8bfSJed Brown       zs     = grloc[r][4];
1604061b8bfSJed Brown       zm     = grloc[r][5];
1614061b8bfSJed Brown       nnodes = xm*ym*zm;
1624061b8bfSJed Brown     } else if (r == rank) {
1634061b8bfSJed Brown       nnodes = info.xm*info.ym*info.zm;
1644061b8bfSJed Brown     }
1654061b8bfSJed Brown 
1662eaa9ef4SLisandro Dalcin     /* Write the coordinates */
1674061b8bfSJed Brown     if (Coords) {
1684061b8bfSJed Brown       const PetscScalar *coords;
1694061b8bfSJed Brown       ierr = VecGetArrayRead(Coords,&coords);CHKERRQ(ierr);
170dd400576SPatrick Sanan       if (rank == 0) {
1714061b8bfSJed Brown         if (r) {
1726622f924SJed Brown           PetscMPIInt nn;
173ffc4695bSBarry Smith           ierr = MPI_Recv(array,nnodes*cdim,MPIU_SCALAR,r,tag,comm,&status);CHKERRMPI(ierr);
174ffc4695bSBarry Smith           ierr = MPI_Get_count(&status,MPIU_SCALAR,&nn);CHKERRMPI(ierr);
1752c71b3e2SJacob Faibussowitsch           PetscCheckFalse(nn != nnodes*cdim,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Array size mismatch");
1764061b8bfSJed Brown         } else {
177580bdb30SBarry Smith           ierr = PetscArraycpy(array,coords,nnodes*cdim);CHKERRQ(ierr);
1784061b8bfSJed Brown         }
1794061b8bfSJed Brown         /* Transpose coordinates to VTK (C-style) ordering */
1804061b8bfSJed Brown         for (k=0; k<zm; k++) {
1814061b8bfSJed Brown           for (j=0; j<ym; j++) {
1824061b8bfSJed Brown             for (i=0; i<xm; i++) {
1834061b8bfSJed Brown               PetscInt Iloc = i+xm*(j+ym*k);
1842eaa9ef4SLisandro Dalcin               array2[Iloc*3+0] = array[Iloc*cdim + 0];
1852eaa9ef4SLisandro Dalcin               array2[Iloc*3+1] = cdim > 1 ? array[Iloc*cdim + 1] : 0.0;
1862eaa9ef4SLisandro Dalcin               array2[Iloc*3+2] = cdim > 2 ? array[Iloc*cdim + 2] : 0.0;
1874061b8bfSJed Brown             }
1884061b8bfSJed Brown           }
1894061b8bfSJed Brown         }
1904061b8bfSJed Brown       } else if (r == rank) {
191ffc4695bSBarry Smith         ierr = MPI_Send((void*)coords,nnodes*cdim,MPIU_SCALAR,0,tag,comm);CHKERRMPI(ierr);
1924061b8bfSJed Brown       }
1934061b8bfSJed Brown       ierr = VecRestoreArrayRead(Coords,&coords);CHKERRQ(ierr);
1944061b8bfSJed Brown     } else {       /* Fabricate some coordinates using grid index */
1954061b8bfSJed Brown       for (k=0; k<zm; k++) {
1964061b8bfSJed Brown         for (j=0; j<ym; j++) {
1974061b8bfSJed Brown           for (i=0; i<xm; i++) {
1984061b8bfSJed Brown             PetscInt Iloc = i+xm*(j+ym*k);
1994061b8bfSJed Brown             array2[Iloc*3+0] = xs+i;
2004061b8bfSJed Brown             array2[Iloc*3+1] = ys+j;
2014061b8bfSJed Brown             array2[Iloc*3+2] = zs+k;
2024061b8bfSJed Brown           }
2034061b8bfSJed Brown         }
2044061b8bfSJed Brown       }
2054061b8bfSJed Brown     }
20694fbd55eSBarry Smith     ierr = PetscViewerVTKFWrite(viewer,fp,array2,nnodes*3,MPIU_SCALAR);CHKERRQ(ierr);
2074061b8bfSJed Brown 
2084061b8bfSJed Brown     /* Write each of the objects queued up for this file */
2094061b8bfSJed Brown     for (link=vtk->link; link; link=link->next) {
2104061b8bfSJed Brown       Vec               X = (Vec)link->vec;
2114061b8bfSJed Brown       const PetscScalar *x;
212fb5bd1c2SPatrick Sanan       PetscInt          bs,f;
213ea2d7708SPatrick Sanan       DM                daCurr;
214fb5bd1c2SPatrick Sanan       PetscBool         fieldsnamed;
215ea2d7708SPatrick Sanan       ierr = VecGetDM(X,&daCurr);CHKERRQ(ierr);
216ea78f98cSLisandro Dalcin       ierr = DMDAGetInfo(daCurr,NULL,NULL,NULL,NULL, NULL,NULL,NULL,&bs,NULL,NULL,NULL,NULL,NULL);CHKERRQ(ierr);
2174061b8bfSJed Brown       ierr = VecGetArrayRead(X,&x);CHKERRQ(ierr);
218dd400576SPatrick Sanan       if (rank == 0) {
2194061b8bfSJed Brown         if (r) {
2206622f924SJed Brown           PetscMPIInt nn;
221ffc4695bSBarry Smith           ierr = MPI_Recv(array,nnodes*bs,MPIU_SCALAR,r,tag,comm,&status);CHKERRMPI(ierr);
222ffc4695bSBarry Smith           ierr = MPI_Get_count(&status,MPIU_SCALAR,&nn);CHKERRMPI(ierr);
2232c71b3e2SJacob Faibussowitsch           PetscCheckFalse(nn != nnodes*bs,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Array size mismatch receiving from rank %D",r);
2244061b8bfSJed Brown         } else {
225580bdb30SBarry Smith           ierr = PetscArraycpy(array,x,nnodes*bs);CHKERRQ(ierr);
2264061b8bfSJed Brown         }
227fb5bd1c2SPatrick Sanan 
228fb5bd1c2SPatrick Sanan         /* If any fields are named, add scalar fields. Otherwise, add a vector field */
229fb5bd1c2SPatrick Sanan         ierr = DMDAGetFieldsNamed(daCurr,&fieldsnamed);CHKERRQ(ierr);
230fb5bd1c2SPatrick Sanan         if (fieldsnamed) {
231fb5bd1c2SPatrick Sanan           for (f=0; f<bs; f++) {
232fb5bd1c2SPatrick Sanan             /* Extract and transpose the f'th field */
233fb5bd1c2SPatrick Sanan             for (k=0; k<zm; k++) {
234fb5bd1c2SPatrick Sanan               for (j=0; j<ym; j++) {
235fb5bd1c2SPatrick Sanan                 for (i=0; i<xm; i++) {
236fb5bd1c2SPatrick Sanan                   PetscInt Iloc = i+xm*(j+ym*k);
237fb5bd1c2SPatrick Sanan                   array2[Iloc] = array[Iloc*bs + f];
238fb5bd1c2SPatrick Sanan                 }
239fb5bd1c2SPatrick Sanan               }
240fb5bd1c2SPatrick Sanan             }
241fb5bd1c2SPatrick Sanan             ierr = PetscViewerVTKFWrite(viewer,fp,array2,nnodes,MPIU_SCALAR);CHKERRQ(ierr);
242fb5bd1c2SPatrick Sanan           }
243fb5bd1c2SPatrick Sanan         } else {
244ea2d7708SPatrick Sanan           ierr = PetscViewerVTKFWrite(viewer,fp,array,bs*nnodes,MPIU_SCALAR);CHKERRQ(ierr);
245fb5bd1c2SPatrick Sanan         }
2464061b8bfSJed Brown       } else if (r == rank) {
247ffc4695bSBarry Smith         ierr = MPI_Send((void*)x,nnodes*bs,MPIU_SCALAR,0,tag,comm);CHKERRMPI(ierr);
2484061b8bfSJed Brown       }
2494061b8bfSJed Brown       ierr = VecRestoreArrayRead(X,&x);CHKERRQ(ierr);
2504061b8bfSJed Brown     }
2514061b8bfSJed Brown   }
2524061b8bfSJed Brown   ierr = PetscFree2(array,array2);CHKERRQ(ierr);
2534061b8bfSJed Brown   ierr = PetscFree(grloc);CHKERRQ(ierr);
2544061b8bfSJed Brown 
2554061b8bfSJed Brown   ierr = PetscFPrintf(comm,fp,"\n </AppendedData>\n");CHKERRQ(ierr);
2564061b8bfSJed Brown   ierr = PetscFPrintf(comm,fp,"</VTKFile>\n");CHKERRQ(ierr);
2574061b8bfSJed Brown   ierr = PetscFClose(comm,fp);CHKERRQ(ierr);
2584061b8bfSJed Brown   PetscFunctionReturn(0);
2594061b8bfSJed Brown }
2604061b8bfSJed Brown 
261a13bc4e3SShao-Ching Huang static PetscErrorCode DMDAVTKWriteAll_VTR(DM da,PetscViewer viewer)
262a13bc4e3SShao-Ching Huang {
26330815ce0SLisandro Dalcin   const char *byte_order = PetscBinaryBigEndian() ? "BigEndian" : "LittleEndian";
264a13bc4e3SShao-Ching Huang #if defined(PETSC_USE_REAL_SINGLE)
265a13bc4e3SShao-Ching Huang   const char precision[] = "Float32";
266a13bc4e3SShao-Ching Huang #elif defined(PETSC_USE_REAL_DOUBLE)
267a13bc4e3SShao-Ching Huang   const char precision[] = "Float64";
268a13bc4e3SShao-Ching Huang #else
269a13bc4e3SShao-Ching Huang   const char precision[] = "UnknownPrecision";
270a13bc4e3SShao-Ching Huang #endif
271a13bc4e3SShao-Ching Huang   MPI_Comm                 comm;
272a13bc4e3SShao-Ching Huang   PetscViewer_VTK          *vtk = (PetscViewer_VTK*)viewer->data;
273a13bc4e3SShao-Ching Huang   PetscViewerVTKObjectLink link;
274a13bc4e3SShao-Ching Huang   FILE                     *fp;
275a13bc4e3SShao-Ching Huang   PetscMPIInt              rank,size,tag;
276a13bc4e3SShao-Ching Huang   DMDALocalInfo            info;
277ea2d7708SPatrick Sanan   PetscInt                 dim,mx,my,mz,boffset,maxnnodes,maxbs,i,j,k,r;
278a13bc4e3SShao-Ching Huang   PetscInt                 rloc[6],(*grloc)[6] = NULL;
279a13bc4e3SShao-Ching Huang   PetscScalar              *array,*array2;
280a13bc4e3SShao-Ching Huang   PetscErrorCode           ierr;
281a13bc4e3SShao-Ching Huang 
282a13bc4e3SShao-Ching Huang   PetscFunctionBegin;
283a13bc4e3SShao-Ching Huang   ierr = PetscObjectGetComm((PetscObject)da,&comm);CHKERRQ(ierr);
2842c71b3e2SJacob Faibussowitsch   PetscCheckFalse(PetscDefined(USE_COMPLEX),PETSC_COMM_SELF,PETSC_ERR_SUP,"Complex values not supported");
285ffc4695bSBarry Smith   ierr = MPI_Comm_size(comm,&size);CHKERRMPI(ierr);
286ffc4695bSBarry Smith   ierr = MPI_Comm_rank(comm,&rank);CHKERRMPI(ierr);
287ea78f98cSLisandro Dalcin   ierr = DMDAGetInfo(da,&dim,&mx,&my,&mz,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);CHKERRQ(ierr);
288a13bc4e3SShao-Ching Huang   ierr = DMDAGetLocalInfo(da,&info);CHKERRQ(ierr);
289a13bc4e3SShao-Ching Huang   ierr = PetscFOpen(comm,vtk->filename,"wb",&fp);CHKERRQ(ierr);
290a13bc4e3SShao-Ching Huang   ierr = PetscFPrintf(comm,fp,"<?xml version=\"1.0\"?>\n");CHKERRQ(ierr);
29130815ce0SLisandro Dalcin   ierr = PetscFPrintf(comm,fp,"<VTKFile type=\"RectilinearGrid\" version=\"0.1\" byte_order=\"%s\">\n",byte_order);CHKERRQ(ierr);
292a13bc4e3SShao-Ching Huang   ierr = PetscFPrintf(comm,fp,"  <RectilinearGrid WholeExtent=\"%D %D %D %D %D %D\">\n",0,mx-1,0,my-1,0,mz-1);CHKERRQ(ierr);
293a13bc4e3SShao-Ching Huang 
294dd400576SPatrick Sanan   if (rank == 0) {ierr = PetscMalloc1(size*6,&grloc);CHKERRQ(ierr);}
295a13bc4e3SShao-Ching Huang   rloc[0] = info.xs;
296a13bc4e3SShao-Ching Huang   rloc[1] = info.xm;
297a13bc4e3SShao-Ching Huang   rloc[2] = info.ys;
298a13bc4e3SShao-Ching Huang   rloc[3] = info.ym;
299a13bc4e3SShao-Ching Huang   rloc[4] = info.zs;
300a13bc4e3SShao-Ching Huang   rloc[5] = info.zm;
30155b25c41SPierre Jolivet   ierr    = MPI_Gather(rloc,6,MPIU_INT,&grloc[0][0],6,MPIU_INT,0,comm);CHKERRMPI(ierr);
302a13bc4e3SShao-Ching Huang 
303a13bc4e3SShao-Ching Huang   /* Write XML header */
304a13bc4e3SShao-Ching Huang   maxnnodes = 0;                /* Used for the temporary array size on rank 0 */
305ea2d7708SPatrick Sanan   maxbs     = 0;                /* Used for the temporary array size on rank 0 */
306a13bc4e3SShao-Ching Huang   boffset   = 0;                /* Offset into binary file */
307a13bc4e3SShao-Ching Huang   for (r=0; r<size; r++) {
308a13bc4e3SShao-Ching Huang     PetscInt xs=-1,xm=-1,ys=-1,ym=-1,zs=-1,zm=-1,nnodes = 0;
309dd400576SPatrick Sanan     if (rank == 0) {
310a13bc4e3SShao-Ching Huang       xs     = grloc[r][0];
311a13bc4e3SShao-Ching Huang       xm     = grloc[r][1];
312a13bc4e3SShao-Ching Huang       ys     = grloc[r][2];
313a13bc4e3SShao-Ching Huang       ym     = grloc[r][3];
314a13bc4e3SShao-Ching Huang       zs     = grloc[r][4];
315a13bc4e3SShao-Ching Huang       zm     = grloc[r][5];
316a13bc4e3SShao-Ching Huang       nnodes = xm*ym*zm;
317a13bc4e3SShao-Ching Huang     }
318a13bc4e3SShao-Ching Huang     maxnnodes = PetscMax(maxnnodes,nnodes);
319a13bc4e3SShao-Ching Huang     ierr     = PetscFPrintf(comm,fp,"    <Piece Extent=\"%D %D %D %D %D %D\">\n",xs,xs+xm-1,ys,ys+ym-1,zs,zs+zm-1);CHKERRQ(ierr);
320a13bc4e3SShao-Ching Huang     ierr     = PetscFPrintf(comm,fp,"      <Coordinates>\n");CHKERRQ(ierr);
321a13bc4e3SShao-Ching Huang     ierr     = PetscFPrintf(comm,fp,"        <DataArray type=\"%s\" Name=\"Xcoord\"  format=\"appended\"  offset=\"%D\" />\n",precision,boffset);CHKERRQ(ierr);
322a13bc4e3SShao-Ching Huang     boffset += xm*sizeof(PetscScalar) + sizeof(int);
323a13bc4e3SShao-Ching Huang     ierr     = PetscFPrintf(comm,fp,"        <DataArray type=\"%s\" Name=\"Ycoord\"  format=\"appended\"  offset=\"%D\" />\n",precision,boffset);CHKERRQ(ierr);
324a13bc4e3SShao-Ching Huang     boffset += ym*sizeof(PetscScalar) + sizeof(int);
325a13bc4e3SShao-Ching Huang     ierr     = PetscFPrintf(comm,fp,"        <DataArray type=\"%s\" Name=\"Zcoord\"  format=\"appended\"  offset=\"%D\" />\n",precision,boffset);CHKERRQ(ierr);
326a13bc4e3SShao-Ching Huang     boffset += zm*sizeof(PetscScalar) + sizeof(int);
327a13bc4e3SShao-Ching Huang     ierr     = PetscFPrintf(comm,fp,"      </Coordinates>\n");CHKERRQ(ierr);
328a13bc4e3SShao-Ching Huang     ierr = PetscFPrintf(comm,fp,"      <PointData Scalars=\"ScalarPointData\">\n");CHKERRQ(ierr);
329a13bc4e3SShao-Ching Huang     for (link=vtk->link; link; link=link->next) {
330a13bc4e3SShao-Ching Huang       Vec        X = (Vec)link->vec;
331fb5bd1c2SPatrick Sanan       PetscInt   bs,f;
332ea2d7708SPatrick Sanan       DM         daCurr;
333fb5bd1c2SPatrick Sanan       PetscBool  fieldsnamed;
334fb5bd1c2SPatrick Sanan       const char *vecname = "Unnamed";
335ea2d7708SPatrick Sanan 
336ea2d7708SPatrick Sanan       ierr = VecGetDM(X,&daCurr);CHKERRQ(ierr);
337ea78f98cSLisandro Dalcin       ierr = DMDAGetInfo(daCurr,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&bs,NULL,NULL,NULL,NULL,NULL);CHKERRQ(ierr);
338ea2d7708SPatrick Sanan       maxbs = PetscMax(maxbs,bs);
339ea2d7708SPatrick Sanan       if (((PetscObject)X)->name || link != vtk->link) {
340a13bc4e3SShao-Ching Huang         ierr = PetscObjectGetName((PetscObject)X,&vecname);CHKERRQ(ierr);
341a13bc4e3SShao-Ching Huang       }
342ea2d7708SPatrick Sanan 
343fb5bd1c2SPatrick Sanan       /* If any fields are named, add scalar fields. Otherwise, add a vector field */
344fb5bd1c2SPatrick Sanan       ierr = DMDAGetFieldsNamed(daCurr,&fieldsnamed);CHKERRQ(ierr);
345fb5bd1c2SPatrick Sanan       if (fieldsnamed) {
346fb5bd1c2SPatrick Sanan         for (f=0; f<bs; f++) {
347fb5bd1c2SPatrick Sanan           char       buf[256];
348fb5bd1c2SPatrick Sanan           const char *fieldname;
349fb5bd1c2SPatrick Sanan           ierr = DMDAGetFieldName(daCurr,f,&fieldname);CHKERRQ(ierr);
350fb5bd1c2SPatrick Sanan           if (!fieldname) {
351fb5bd1c2SPatrick Sanan             ierr      = PetscSNPrintf(buf,sizeof(buf),"%D",f);CHKERRQ(ierr);
352fb5bd1c2SPatrick Sanan             fieldname = buf;
353fb5bd1c2SPatrick Sanan           }
354fb5bd1c2SPatrick Sanan           ierr     = PetscFPrintf(comm,fp,"        <DataArray type=\"%s\" Name=\"%s.%s\" NumberOfComponents=\"1\" format=\"appended\" offset=\"%D\" />\n",precision,vecname,fieldname,boffset);CHKERRQ(ierr);
355fb5bd1c2SPatrick Sanan           boffset += nnodes*sizeof(PetscScalar) + sizeof(int);
356fb5bd1c2SPatrick Sanan         }
357fb5bd1c2SPatrick Sanan       } else {
358ea2d7708SPatrick Sanan         ierr     = PetscFPrintf(comm,fp,"        <DataArray type=\"%s\" Name=\"%s\" NumberOfComponents=\"%D\" format=\"appended\" offset=\"%D\" />\n",precision,vecname,bs,boffset);CHKERRQ(ierr);
359ea2d7708SPatrick Sanan         boffset += bs*nnodes*sizeof(PetscScalar) + sizeof(int);
360a13bc4e3SShao-Ching Huang       }
361fb5bd1c2SPatrick Sanan     }
362a13bc4e3SShao-Ching Huang     ierr = PetscFPrintf(comm,fp,"      </PointData>\n");CHKERRQ(ierr);
363a13bc4e3SShao-Ching Huang     ierr = PetscFPrintf(comm,fp,"    </Piece>\n");CHKERRQ(ierr);
364a13bc4e3SShao-Ching Huang   }
365a13bc4e3SShao-Ching Huang   ierr = PetscFPrintf(comm,fp,"  </RectilinearGrid>\n");CHKERRQ(ierr);
366a13bc4e3SShao-Ching Huang   ierr = PetscFPrintf(comm,fp,"  <AppendedData encoding=\"raw\">\n");CHKERRQ(ierr);
367a13bc4e3SShao-Ching Huang   ierr = PetscFPrintf(comm,fp,"_");CHKERRQ(ierr);
368a13bc4e3SShao-Ching Huang 
369a13bc4e3SShao-Ching Huang   /* Now write the arrays. */
370a13bc4e3SShao-Ching Huang   tag  = ((PetscObject)viewer)->tag;
371fb5bd1c2SPatrick Sanan   ierr = PetscMalloc2(PetscMax(maxnnodes*maxbs,info.xm+info.ym+info.zm),&array,PetscMax(maxnnodes*maxbs,info.xm+info.ym+info.zm),&array2);CHKERRQ(ierr);
372a13bc4e3SShao-Ching Huang   for (r=0; r<size; r++) {
373a13bc4e3SShao-Ching Huang     MPI_Status status;
374a13bc4e3SShao-Ching Huang     PetscInt   xs=-1,xm=-1,ys=-1,ym=-1,zs=-1,zm=-1,nnodes = 0;
375dd400576SPatrick Sanan     if (rank == 0) {
376a13bc4e3SShao-Ching Huang       xs     = grloc[r][0];
377a13bc4e3SShao-Ching Huang       xm     = grloc[r][1];
378a13bc4e3SShao-Ching Huang       ys     = grloc[r][2];
379a13bc4e3SShao-Ching Huang       ym     = grloc[r][3];
380a13bc4e3SShao-Ching Huang       zs     = grloc[r][4];
381a13bc4e3SShao-Ching Huang       zm     = grloc[r][5];
382a13bc4e3SShao-Ching Huang       nnodes = xm*ym*zm;
383a13bc4e3SShao-Ching Huang     } else if (r == rank) {
384a13bc4e3SShao-Ching Huang       nnodes = info.xm*info.ym*info.zm;
385a13bc4e3SShao-Ching Huang     }
386a13bc4e3SShao-Ching Huang     {                           /* Write the coordinates */
387a13bc4e3SShao-Ching Huang       Vec Coords;
388ea2d7708SPatrick Sanan 
389a13bc4e3SShao-Ching Huang       ierr = DMGetCoordinates(da,&Coords);CHKERRQ(ierr);
390a13bc4e3SShao-Ching Huang       if (Coords) {
391a13bc4e3SShao-Ching Huang         const PetscScalar *coords;
392a13bc4e3SShao-Ching Huang         ierr = VecGetArrayRead(Coords,&coords);CHKERRQ(ierr);
393dd400576SPatrick Sanan         if (rank == 0) {
394a13bc4e3SShao-Ching Huang           if (r) {
395a13bc4e3SShao-Ching Huang             PetscMPIInt nn;
396ffc4695bSBarry Smith             ierr = MPI_Recv(array,xm+ym+zm,MPIU_SCALAR,r,tag,comm,&status);CHKERRMPI(ierr);
397ffc4695bSBarry Smith             ierr = MPI_Get_count(&status,MPIU_SCALAR,&nn);CHKERRMPI(ierr);
3982c71b3e2SJacob Faibussowitsch             PetscCheckFalse(nn != xm+ym+zm,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Array size mismatch");
399a13bc4e3SShao-Ching Huang           } else {
400a13bc4e3SShao-Ching Huang             /* x coordinates */
401a13bc4e3SShao-Ching Huang             for (j=0, k=0, i=0; i<xm; i++) {
402a13bc4e3SShao-Ching Huang               PetscInt Iloc = i+xm*(j+ym*k);
403a13bc4e3SShao-Ching Huang               array[i] = coords[Iloc*dim + 0];
404a13bc4e3SShao-Ching Huang             }
405a13bc4e3SShao-Ching Huang             /* y coordinates */
406a13bc4e3SShao-Ching Huang             for (i=0, k=0, j=0; j<ym; j++) {
407a13bc4e3SShao-Ching Huang               PetscInt Iloc = i+xm*(j+ym*k);
408a13bc4e3SShao-Ching Huang               array[j+xm] = dim > 1 ? coords[Iloc*dim + 1] : 0;
409a13bc4e3SShao-Ching Huang             }
410a13bc4e3SShao-Ching Huang             /* z coordinates */
411a13bc4e3SShao-Ching Huang             for (i=0, j=0, k=0; k<zm; k++) {
412a13bc4e3SShao-Ching Huang               PetscInt Iloc = i+xm*(j+ym*k);
413a13bc4e3SShao-Ching Huang               array[k+xm+ym] = dim > 2 ? coords[Iloc*dim + 2] : 0;
414a13bc4e3SShao-Ching Huang             }
415a13bc4e3SShao-Ching Huang           }
416a13bc4e3SShao-Ching Huang         } else if (r == rank) {
417a13bc4e3SShao-Ching Huang           xm = info.xm;
418a13bc4e3SShao-Ching Huang           ym = info.ym;
419a13bc4e3SShao-Ching Huang           zm = info.zm;
420a13bc4e3SShao-Ching Huang           for (j=0, k=0, i=0; i<xm; i++) {
421a13bc4e3SShao-Ching Huang             PetscInt Iloc = i+xm*(j+ym*k);
422a13bc4e3SShao-Ching Huang             array2[i] = coords[Iloc*dim + 0];
423a13bc4e3SShao-Ching Huang           }
424a13bc4e3SShao-Ching Huang           for (i=0, k=0, j=0; j<ym; j++) {
425a13bc4e3SShao-Ching Huang             PetscInt Iloc = i+xm*(j+ym*k);
426a13bc4e3SShao-Ching Huang             array2[j+xm] = dim > 1 ? coords[Iloc*dim + 1] : 0;
427a13bc4e3SShao-Ching Huang           }
428a13bc4e3SShao-Ching Huang           for (i=0, j=0, k=0; k<zm; k++) {
429a13bc4e3SShao-Ching Huang             PetscInt Iloc = i+xm*(j+ym*k);
430a13bc4e3SShao-Ching Huang             array2[k+xm+ym] = dim > 2 ? coords[Iloc*dim + 2] : 0;
431a13bc4e3SShao-Ching Huang           }
432ffc4695bSBarry Smith           ierr = MPI_Send((void*)array2,xm+ym+zm,MPIU_SCALAR,0,tag,comm);CHKERRMPI(ierr);
433a13bc4e3SShao-Ching Huang         }
434a13bc4e3SShao-Ching Huang         ierr = VecRestoreArrayRead(Coords,&coords);CHKERRQ(ierr);
435a13bc4e3SShao-Ching Huang       } else {       /* Fabricate some coordinates using grid index */
4363d3eaba7SBarry Smith         for (i=0; i<xm; i++) {
437a13bc4e3SShao-Ching Huang           array[i] = xs+i;
438a13bc4e3SShao-Ching Huang         }
4393d3eaba7SBarry Smith         for (j=0; j<ym; j++) {
440a13bc4e3SShao-Ching Huang           array[j+xm] = ys+j;
441a13bc4e3SShao-Ching Huang         }
4423d3eaba7SBarry Smith         for (k=0; k<zm; k++) {
443a13bc4e3SShao-Ching Huang           array[k+xm+ym] = zs+k;
444a13bc4e3SShao-Ching Huang         }
445a13bc4e3SShao-Ching Huang       }
446dd400576SPatrick Sanan       if (rank == 0) {
44794fbd55eSBarry Smith         ierr = PetscViewerVTKFWrite(viewer,fp,&(array[0]),xm,MPIU_SCALAR);CHKERRQ(ierr);
44894fbd55eSBarry Smith         ierr = PetscViewerVTKFWrite(viewer,fp,&(array[xm]),ym,MPIU_SCALAR);CHKERRQ(ierr);
44994fbd55eSBarry Smith         ierr = PetscViewerVTKFWrite(viewer,fp,&(array[xm+ym]),zm,MPIU_SCALAR);CHKERRQ(ierr);
450a13bc4e3SShao-Ching Huang       }
451a13bc4e3SShao-Ching Huang     }
452a13bc4e3SShao-Ching Huang 
453a13bc4e3SShao-Ching Huang     /* Write each of the objects queued up for this file */
454a13bc4e3SShao-Ching Huang     for (link=vtk->link; link; link=link->next) {
455a13bc4e3SShao-Ching Huang       Vec               X = (Vec)link->vec;
456a13bc4e3SShao-Ching Huang       const PetscScalar *x;
457fb5bd1c2SPatrick Sanan       PetscInt          bs,f;
458ea2d7708SPatrick Sanan       DM                daCurr;
459fb5bd1c2SPatrick Sanan       PetscBool         fieldsnamed;
460ea2d7708SPatrick Sanan       ierr = VecGetDM(X,&daCurr);CHKERRQ(ierr);
461ea78f98cSLisandro Dalcin       ierr = DMDAGetInfo(daCurr,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&bs,NULL,NULL,NULL,NULL,NULL);CHKERRQ(ierr);
462a13bc4e3SShao-Ching Huang 
463a13bc4e3SShao-Ching Huang       ierr = VecGetArrayRead(X,&x);CHKERRQ(ierr);
464dd400576SPatrick Sanan       if (rank == 0) {
465a13bc4e3SShao-Ching Huang         if (r) {
466a13bc4e3SShao-Ching Huang           PetscMPIInt nn;
467ffc4695bSBarry Smith           ierr = MPI_Recv(array,nnodes*bs,MPIU_SCALAR,r,tag,comm,&status);CHKERRMPI(ierr);
468ffc4695bSBarry Smith           ierr = MPI_Get_count(&status,MPIU_SCALAR,&nn);CHKERRMPI(ierr);
4692c71b3e2SJacob Faibussowitsch           PetscCheckFalse(nn != nnodes*bs,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Array size mismatch receiving from rank %D",r);
470a13bc4e3SShao-Ching Huang         } else {
471580bdb30SBarry Smith           ierr = PetscArraycpy(array,x,nnodes*bs);CHKERRQ(ierr);
472a13bc4e3SShao-Ching Huang         }
473fb5bd1c2SPatrick Sanan         /* If any fields are named, add scalar fields. Otherwise, add a vector field */
474fb5bd1c2SPatrick Sanan         ierr = DMDAGetFieldsNamed(daCurr,&fieldsnamed);CHKERRQ(ierr);
475fb5bd1c2SPatrick Sanan         if (fieldsnamed) {
476fb5bd1c2SPatrick Sanan           for (f=0; f<bs; f++) {
477fb5bd1c2SPatrick Sanan             /* Extract and transpose the f'th field */
478fb5bd1c2SPatrick Sanan             for (k=0; k<zm; k++) {
479fb5bd1c2SPatrick Sanan               for (j=0; j<ym; j++) {
480fb5bd1c2SPatrick Sanan                 for (i=0; i<xm; i++) {
481fb5bd1c2SPatrick Sanan                   PetscInt Iloc = i+xm*(j+ym*k);
482fb5bd1c2SPatrick Sanan                   array2[Iloc] = array[Iloc*bs + f];
483fb5bd1c2SPatrick Sanan                 }
484fb5bd1c2SPatrick Sanan               }
485fb5bd1c2SPatrick Sanan             }
486fb5bd1c2SPatrick Sanan             ierr = PetscViewerVTKFWrite(viewer,fp,array2,nnodes,MPIU_SCALAR);CHKERRQ(ierr);
487fb5bd1c2SPatrick Sanan           }
488fb5bd1c2SPatrick Sanan         }
489ea2d7708SPatrick Sanan         ierr = PetscViewerVTKFWrite(viewer,fp,array,nnodes*bs,MPIU_SCALAR);CHKERRQ(ierr);
490ea2d7708SPatrick Sanan 
491a13bc4e3SShao-Ching Huang       } else if (r == rank) {
492ffc4695bSBarry Smith         ierr = MPI_Send((void*)x,nnodes*bs,MPIU_SCALAR,0,tag,comm);CHKERRMPI(ierr);
493a13bc4e3SShao-Ching Huang       }
494a13bc4e3SShao-Ching Huang       ierr = VecRestoreArrayRead(X,&x);CHKERRQ(ierr);
495a13bc4e3SShao-Ching Huang     }
496a13bc4e3SShao-Ching Huang   }
497a13bc4e3SShao-Ching Huang   ierr = PetscFree2(array,array2);CHKERRQ(ierr);
498a13bc4e3SShao-Ching Huang   ierr = PetscFree(grloc);CHKERRQ(ierr);
499a13bc4e3SShao-Ching Huang 
500a13bc4e3SShao-Ching Huang   ierr = PetscFPrintf(comm,fp,"\n </AppendedData>\n");CHKERRQ(ierr);
501a13bc4e3SShao-Ching Huang   ierr = PetscFPrintf(comm,fp,"</VTKFile>\n");CHKERRQ(ierr);
502a13bc4e3SShao-Ching Huang   ierr = PetscFClose(comm,fp);CHKERRQ(ierr);
503a13bc4e3SShao-Ching Huang   PetscFunctionReturn(0);
504a13bc4e3SShao-Ching Huang }
505a13bc4e3SShao-Ching Huang 
5064061b8bfSJed Brown /*@C
5074061b8bfSJed Brown    DMDAVTKWriteAll - Write a file containing all the fields that have been provided to the viewer
5084061b8bfSJed Brown 
5094061b8bfSJed Brown    Collective
5104061b8bfSJed Brown 
5114165533cSJose E. Roman    Input Parameters:
5124165533cSJose E. Roman +  odm - DM specifying the grid layout, passed as a PetscObject
5134165533cSJose E. Roman -  viewer - viewer of type VTK
5144061b8bfSJed Brown 
5154061b8bfSJed Brown    Level: developer
5164061b8bfSJed Brown 
517fb5bd1c2SPatrick Sanan    Notes:
5184061b8bfSJed Brown    This function is a callback used by the VTK viewer to actually write the file.
5194061b8bfSJed Brown    The reason for this odd model is that the VTK file format does not provide any way to write one field at a time.
5204061b8bfSJed Brown    Instead, metadata for the entire file needs to be available up-front before you can start writing the file.
5214061b8bfSJed Brown 
522fb5bd1c2SPatrick Sanan    If any fields have been named (see e.g. DMDASetFieldName()), then individual scalar
523fb5bd1c2SPatrick Sanan    fields are written. Otherwise, a single multi-dof (vector) field is written.
524fb5bd1c2SPatrick Sanan 
5254061b8bfSJed Brown .seealso: PETSCVIEWERVTK
5264061b8bfSJed Brown @*/
5274061b8bfSJed Brown PetscErrorCode DMDAVTKWriteAll(PetscObject odm,PetscViewer viewer)
5284061b8bfSJed Brown {
5294061b8bfSJed Brown   DM             dm = (DM)odm;
5304061b8bfSJed Brown   PetscBool      isvtk;
5314061b8bfSJed Brown   PetscErrorCode ierr;
5324061b8bfSJed Brown 
5334061b8bfSJed Brown   PetscFunctionBegin;
5344061b8bfSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5354061b8bfSJed Brown   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
536251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERVTK,&isvtk);CHKERRQ(ierr);
537*7a8be351SBarry Smith   PetscCheck(isvtk,PetscObjectComm((PetscObject)viewer),PETSC_ERR_ARG_INCOMP,"Cannot use viewer type %s",((PetscObject)viewer)->type_name);
5384061b8bfSJed Brown   switch (viewer->format) {
5394061b8bfSJed Brown   case PETSC_VIEWER_VTK_VTS:
5404061b8bfSJed Brown     ierr = DMDAVTKWriteAll_VTS(dm,viewer);CHKERRQ(ierr);
5414061b8bfSJed Brown     break;
542a13bc4e3SShao-Ching Huang   case PETSC_VIEWER_VTK_VTR:
543a13bc4e3SShao-Ching Huang     ierr = DMDAVTKWriteAll_VTR(dm,viewer);CHKERRQ(ierr);
544a13bc4e3SShao-Ching Huang     break;
54598921bdaSJacob Faibussowitsch   default: SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"No support for format '%s'",PetscViewerFormats[viewer->format]);
5464061b8bfSJed Brown   }
5474061b8bfSJed Brown   PetscFunctionReturn(0);
5484061b8bfSJed Brown }
549