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