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