1*c4762a1bSJed Brown static char help[] = "Test VTK structured grid (.vts) viewer support\n\n"; 2*c4762a1bSJed Brown 3*c4762a1bSJed Brown #include <petscdm.h> 4*c4762a1bSJed Brown #include <petscdmda.h> 5*c4762a1bSJed Brown 6*c4762a1bSJed Brown /* 7*c4762a1bSJed Brown Write 3D DMDA vector with coordinates in VTK .vts format 8*c4762a1bSJed Brown 9*c4762a1bSJed Brown */ 10*c4762a1bSJed Brown PetscErrorCode test_3d(const char filename[]) 11*c4762a1bSJed Brown { 12*c4762a1bSJed Brown MPI_Comm comm = MPI_COMM_WORLD; 13*c4762a1bSJed Brown const PetscInt M=10,N=15,P=30,dof=1,sw=1; 14*c4762a1bSJed Brown const PetscScalar Lx=1.0,Ly=1.0,Lz=1.0; 15*c4762a1bSJed Brown DM da; 16*c4762a1bSJed Brown Vec v; 17*c4762a1bSJed Brown PetscViewer view; 18*c4762a1bSJed Brown DMDALocalInfo info; 19*c4762a1bSJed Brown PetscScalar ***va; 20*c4762a1bSJed Brown PetscInt i,j,k; 21*c4762a1bSJed Brown PetscErrorCode ierr; 22*c4762a1bSJed Brown 23*c4762a1bSJed Brown ierr = DMDACreate3d(comm,DM_BOUNDARY_NONE,DM_BOUNDARY_NONE,DM_BOUNDARY_NONE,DMDA_STENCIL_STAR, M,N,P,PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE,dof,sw,NULL,NULL,NULL,&da);CHKERRQ(ierr); 24*c4762a1bSJed Brown ierr = DMSetFromOptions(da);CHKERRQ(ierr); 25*c4762a1bSJed Brown ierr = DMSetUp(da);CHKERRQ(ierr); 26*c4762a1bSJed Brown 27*c4762a1bSJed Brown ierr = DMDASetUniformCoordinates(da,0.0,Lx,0.0,Ly,0.0,Lz);CHKERRQ(ierr); 28*c4762a1bSJed Brown ierr = DMDAGetLocalInfo(da,&info);CHKERRQ(ierr); 29*c4762a1bSJed Brown ierr = DMCreateGlobalVector(da,&v);CHKERRQ(ierr); 30*c4762a1bSJed Brown ierr = DMDAVecGetArray(da,v,&va);CHKERRQ(ierr); 31*c4762a1bSJed Brown for (k=info.zs; k<info.zs+info.zm; k++) { 32*c4762a1bSJed Brown for (j=info.ys; j<info.ys+info.ym; j++) { 33*c4762a1bSJed Brown for (i=info.xs; i<info.xs+info.xm; i++) { 34*c4762a1bSJed Brown PetscScalar x = (Lx*i)/M; 35*c4762a1bSJed Brown PetscScalar y = (Ly*j)/N; 36*c4762a1bSJed Brown PetscScalar z = (Lz*k)/P; 37*c4762a1bSJed Brown va[k][j][i] = PetscPowScalarInt(x-0.5*Lx,2)+PetscPowScalarInt(y-0.5*Ly,2)+PetscPowScalarInt(z-0.5*Lz,2); 38*c4762a1bSJed Brown } 39*c4762a1bSJed Brown } 40*c4762a1bSJed Brown } 41*c4762a1bSJed Brown ierr = DMDAVecRestoreArray(da,v,&va);CHKERRQ(ierr); 42*c4762a1bSJed Brown ierr = PetscViewerVTKOpen(comm,filename,FILE_MODE_WRITE,&view);CHKERRQ(ierr); 43*c4762a1bSJed Brown ierr = VecView(v,view);CHKERRQ(ierr); 44*c4762a1bSJed Brown ierr = PetscViewerDestroy(&view);CHKERRQ(ierr); 45*c4762a1bSJed Brown ierr = VecDestroy(&v);CHKERRQ(ierr); 46*c4762a1bSJed Brown ierr = DMDestroy(&da);CHKERRQ(ierr); 47*c4762a1bSJed Brown return 0; 48*c4762a1bSJed Brown } 49*c4762a1bSJed Brown 50*c4762a1bSJed Brown 51*c4762a1bSJed Brown /* 52*c4762a1bSJed Brown Write 2D DMDA vector with coordinates in VTK .vts format 53*c4762a1bSJed Brown 54*c4762a1bSJed Brown */ 55*c4762a1bSJed Brown PetscErrorCode test_2d(const char filename[]) 56*c4762a1bSJed Brown { 57*c4762a1bSJed Brown MPI_Comm comm = MPI_COMM_WORLD; 58*c4762a1bSJed Brown const PetscInt M=10,N=20,dof=1,sw=1; 59*c4762a1bSJed Brown const PetscScalar Lx=1.0,Ly=1.0,Lz=1.0; 60*c4762a1bSJed Brown DM da; 61*c4762a1bSJed Brown Vec v; 62*c4762a1bSJed Brown PetscViewer view; 63*c4762a1bSJed Brown DMDALocalInfo info; 64*c4762a1bSJed Brown PetscScalar **va; 65*c4762a1bSJed Brown PetscInt i,j; 66*c4762a1bSJed Brown PetscErrorCode ierr; 67*c4762a1bSJed Brown 68*c4762a1bSJed Brown ierr = DMDACreate2d(comm,DM_BOUNDARY_NONE,DM_BOUNDARY_NONE,DMDA_STENCIL_STAR, M,N,PETSC_DECIDE,PETSC_DECIDE,dof,sw,NULL,NULL,&da);CHKERRQ(ierr); 69*c4762a1bSJed Brown ierr = DMSetFromOptions(da);CHKERRQ(ierr); 70*c4762a1bSJed Brown ierr = DMSetUp(da);CHKERRQ(ierr); 71*c4762a1bSJed Brown ierr = DMDASetUniformCoordinates(da,0.0,Lx,0.0,Ly,0.0,Lz);CHKERRQ(ierr); 72*c4762a1bSJed Brown ierr = DMDAGetLocalInfo(da,&info);CHKERRQ(ierr); 73*c4762a1bSJed Brown ierr = DMCreateGlobalVector(da,&v);CHKERRQ(ierr); 74*c4762a1bSJed Brown ierr = DMDAVecGetArray(da,v,&va);CHKERRQ(ierr); 75*c4762a1bSJed Brown for (j=info.ys; j<info.ys+info.ym; j++) { 76*c4762a1bSJed Brown for (i=info.xs; i<info.xs+info.xm; i++) { 77*c4762a1bSJed Brown PetscScalar x = (Lx*i)/M; 78*c4762a1bSJed Brown PetscScalar y = (Ly*j)/N; 79*c4762a1bSJed Brown va[j][i] = PetscPowScalarInt(x-0.5*Lx,2)+PetscPowScalarInt(y-0.5*Ly,2); 80*c4762a1bSJed Brown } 81*c4762a1bSJed Brown } 82*c4762a1bSJed Brown ierr = DMDAVecRestoreArray(da,v,&va);CHKERRQ(ierr); 83*c4762a1bSJed Brown ierr = PetscViewerVTKOpen(comm,filename,FILE_MODE_WRITE,&view);CHKERRQ(ierr); 84*c4762a1bSJed Brown ierr = VecView(v,view);CHKERRQ(ierr); 85*c4762a1bSJed Brown ierr = PetscViewerDestroy(&view);CHKERRQ(ierr); 86*c4762a1bSJed Brown ierr = VecDestroy(&v);CHKERRQ(ierr); 87*c4762a1bSJed Brown ierr = DMDestroy(&da);CHKERRQ(ierr); 88*c4762a1bSJed Brown return 0; 89*c4762a1bSJed Brown } 90*c4762a1bSJed Brown 91*c4762a1bSJed Brown 92*c4762a1bSJed Brown /* 93*c4762a1bSJed Brown Write 2D DMDA vector without coordinates in VTK .vts format 94*c4762a1bSJed Brown 95*c4762a1bSJed Brown */ 96*c4762a1bSJed Brown PetscErrorCode test_2d_nocoord(const char filename[]) 97*c4762a1bSJed Brown { 98*c4762a1bSJed Brown MPI_Comm comm = MPI_COMM_WORLD; 99*c4762a1bSJed Brown const PetscInt M=10,N=20,dof=1,sw=1; 100*c4762a1bSJed Brown const PetscScalar Lx=1.0,Ly=1.0; 101*c4762a1bSJed Brown DM da; 102*c4762a1bSJed Brown Vec v; 103*c4762a1bSJed Brown PetscViewer view; 104*c4762a1bSJed Brown DMDALocalInfo info; 105*c4762a1bSJed Brown PetscScalar **va; 106*c4762a1bSJed Brown PetscInt i,j; 107*c4762a1bSJed Brown PetscErrorCode ierr; 108*c4762a1bSJed Brown 109*c4762a1bSJed Brown ierr = DMDACreate2d(comm,DM_BOUNDARY_NONE,DM_BOUNDARY_NONE,DMDA_STENCIL_STAR,M,N,PETSC_DECIDE,PETSC_DECIDE,dof,sw,NULL,NULL,&da);CHKERRQ(ierr); 110*c4762a1bSJed Brown ierr = DMSetFromOptions(da);CHKERRQ(ierr); 111*c4762a1bSJed Brown ierr = DMSetUp(da);CHKERRQ(ierr); 112*c4762a1bSJed Brown ierr = DMDAGetLocalInfo(da,&info);CHKERRQ(ierr); 113*c4762a1bSJed Brown ierr = DMCreateGlobalVector(da,&v);CHKERRQ(ierr); 114*c4762a1bSJed Brown ierr = DMDAVecGetArray(da,v,&va);CHKERRQ(ierr); 115*c4762a1bSJed Brown for (j=info.ys; j<info.ys+info.ym; j++) { 116*c4762a1bSJed Brown for (i=info.xs; i<info.xs+info.xm; i++) { 117*c4762a1bSJed Brown PetscScalar x = (Lx*i)/M; 118*c4762a1bSJed Brown PetscScalar y = (Ly*j)/N; 119*c4762a1bSJed Brown va[j][i] = PetscPowScalarInt(x-0.5*Lx,2)+PetscPowScalarInt(y-0.5*Ly,2); 120*c4762a1bSJed Brown } 121*c4762a1bSJed Brown } 122*c4762a1bSJed Brown ierr = DMDAVecRestoreArray(da,v,&va);CHKERRQ(ierr); 123*c4762a1bSJed Brown ierr = PetscViewerVTKOpen(comm,filename,FILE_MODE_WRITE,&view);CHKERRQ(ierr); 124*c4762a1bSJed Brown ierr = VecView(v,view);CHKERRQ(ierr); 125*c4762a1bSJed Brown ierr = PetscViewerDestroy(&view);CHKERRQ(ierr); 126*c4762a1bSJed Brown ierr = VecDestroy(&v);CHKERRQ(ierr); 127*c4762a1bSJed Brown ierr = DMDestroy(&da);CHKERRQ(ierr); 128*c4762a1bSJed Brown return 0; 129*c4762a1bSJed Brown } 130*c4762a1bSJed Brown 131*c4762a1bSJed Brown 132*c4762a1bSJed Brown /* 133*c4762a1bSJed Brown Write 3D DMDA vector without coordinates in VTK .vts format 134*c4762a1bSJed Brown 135*c4762a1bSJed Brown */ 136*c4762a1bSJed Brown PetscErrorCode test_3d_nocoord(const char filename[]) 137*c4762a1bSJed Brown { 138*c4762a1bSJed Brown MPI_Comm comm = MPI_COMM_WORLD; 139*c4762a1bSJed Brown const PetscInt M=10,N=20,P=30,dof=1,sw=1; 140*c4762a1bSJed Brown const PetscScalar Lx=1.0,Ly=1.0,Lz=1.0; 141*c4762a1bSJed Brown DM da; 142*c4762a1bSJed Brown Vec v; 143*c4762a1bSJed Brown PetscViewer view; 144*c4762a1bSJed Brown DMDALocalInfo info; 145*c4762a1bSJed Brown PetscScalar ***va; 146*c4762a1bSJed Brown PetscInt i,j,k; 147*c4762a1bSJed Brown PetscErrorCode ierr; 148*c4762a1bSJed Brown 149*c4762a1bSJed Brown ierr = DMDACreate3d(comm,DM_BOUNDARY_NONE,DM_BOUNDARY_NONE,DM_BOUNDARY_NONE,DMDA_STENCIL_STAR, M,N,P,PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE,dof,sw,NULL,NULL,NULL,&da);CHKERRQ(ierr); 150*c4762a1bSJed Brown ierr = DMSetFromOptions(da);CHKERRQ(ierr); 151*c4762a1bSJed Brown ierr = DMSetUp(da);CHKERRQ(ierr); 152*c4762a1bSJed Brown 153*c4762a1bSJed Brown ierr = DMDAGetLocalInfo(da,&info);CHKERRQ(ierr); 154*c4762a1bSJed Brown ierr = DMCreateGlobalVector(da,&v);CHKERRQ(ierr); 155*c4762a1bSJed Brown ierr = DMDAVecGetArray(da,v,&va);CHKERRQ(ierr); 156*c4762a1bSJed Brown for (k=info.zs; k<info.zs+info.zm; k++) { 157*c4762a1bSJed Brown for (j=info.ys; j<info.ys+info.ym; j++) { 158*c4762a1bSJed Brown for (i=info.xs; i<info.xs+info.xm; i++) { 159*c4762a1bSJed Brown PetscScalar x = (Lx*i)/M; 160*c4762a1bSJed Brown PetscScalar y = (Ly*j)/N; 161*c4762a1bSJed Brown PetscScalar z = (Lz*k)/P; 162*c4762a1bSJed Brown va[k][j][i] = PetscPowScalarInt(x-0.5*Lx,2)+PetscPowScalarInt(y-0.5*Ly,2)+PetscPowScalarInt(z-0.5*Lz,2); 163*c4762a1bSJed Brown } 164*c4762a1bSJed Brown } 165*c4762a1bSJed Brown } 166*c4762a1bSJed Brown ierr = DMDAVecRestoreArray(da,v,&va);CHKERRQ(ierr); 167*c4762a1bSJed Brown ierr = PetscViewerVTKOpen(comm,filename,FILE_MODE_WRITE,&view);CHKERRQ(ierr); 168*c4762a1bSJed Brown ierr = VecView(v,view);CHKERRQ(ierr); 169*c4762a1bSJed Brown ierr = PetscViewerDestroy(&view);CHKERRQ(ierr); 170*c4762a1bSJed Brown ierr = VecDestroy(&v);CHKERRQ(ierr); 171*c4762a1bSJed Brown ierr = DMDestroy(&da);CHKERRQ(ierr); 172*c4762a1bSJed Brown return 0; 173*c4762a1bSJed Brown } 174*c4762a1bSJed Brown 175*c4762a1bSJed Brown int main(int argc, char *argv[]) 176*c4762a1bSJed Brown { 177*c4762a1bSJed Brown PetscErrorCode ierr; 178*c4762a1bSJed Brown 179*c4762a1bSJed Brown ierr = PetscInitialize(&argc,&argv,0,help);if (ierr) return ierr; 180*c4762a1bSJed Brown ierr = test_3d("3d.vts");CHKERRQ(ierr); 181*c4762a1bSJed Brown ierr = test_2d("2d.vts");CHKERRQ(ierr); 182*c4762a1bSJed Brown ierr = test_2d_nocoord("2d_nocoord.vts");CHKERRQ(ierr); 183*c4762a1bSJed Brown ierr = test_3d_nocoord("3d_nocoord.vts");CHKERRQ(ierr); 184*c4762a1bSJed Brown ierr = PetscFinalize(); 185*c4762a1bSJed Brown return ierr; 186*c4762a1bSJed Brown } 187*c4762a1bSJed Brown 188*c4762a1bSJed Brown 189*c4762a1bSJed Brown /*TEST 190*c4762a1bSJed Brown 191*c4762a1bSJed Brown build: 192*c4762a1bSJed Brown requires: !complex 193*c4762a1bSJed Brown 194*c4762a1bSJed Brown test: 195*c4762a1bSJed Brown nsize: 2 196*c4762a1bSJed Brown 197*c4762a1bSJed Brown TEST*/ 198