1 static char help[] = "Test VTK structured (.vts) and rectilinear (.vtr) viewer support with multi-dof DMDAs.\n\ 2 Supply the -namefields flag to test with field names.\n\n"; 3 4 #include <petscdm.h> 5 #include <petscdmda.h> 6 7 /* Helper function to name DMDA fields */ 8 PetscErrorCode NameFields(DM da,PetscInt dof) 9 { 10 PetscErrorCode ierr; 11 PetscInt c; 12 13 PetscFunctionBeginUser; 14 for (c=0; c<dof; ++c) { 15 char fieldname[256]; 16 ierr = PetscSNPrintf(fieldname,sizeof(fieldname),"field_%D",c);CHKERRQ(ierr); 17 ierr = DMDASetFieldName(da,c,fieldname);CHKERRQ(ierr); 18 } 19 PetscFunctionReturn(0); 20 } 21 22 /* 23 Write 3D DMDA vector with coordinates in VTK format 24 */ 25 PetscErrorCode test_3d(const char filename[],PetscInt dof,PetscBool namefields) 26 { 27 MPI_Comm comm = MPI_COMM_WORLD; 28 const PetscInt M=10,N=15,P=30,sw=1; 29 const PetscScalar Lx=1.0,Ly=1.0,Lz=1.0; 30 DM da; 31 Vec v; 32 PetscViewer view; 33 DMDALocalInfo info; 34 PetscScalar ****va; 35 PetscInt i,j,k,c; 36 PetscErrorCode ierr; 37 38 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); 39 ierr = DMSetFromOptions(da);CHKERRQ(ierr); 40 ierr = DMSetUp(da);CHKERRQ(ierr); 41 if (namefields) {ierr = NameFields(da,dof);CHKERRQ(ierr);} 42 43 ierr = DMDASetUniformCoordinates(da,0.0,Lx,0.0,Ly,0.0,Lz);CHKERRQ(ierr); 44 ierr = DMDAGetLocalInfo(da,&info);CHKERRQ(ierr); 45 ierr = DMCreateGlobalVector(da,&v);CHKERRQ(ierr); 46 ierr = DMDAVecGetArrayDOF(da,v,&va);CHKERRQ(ierr); 47 for (k=info.zs; k<info.zs+info.zm; k++) { 48 for (j=info.ys; j<info.ys+info.ym; j++) { 49 for (i=info.xs; i<info.xs+info.xm; i++) { 50 const PetscScalar x = (Lx*i)/M; 51 const PetscScalar y = (Ly*j)/N; 52 const PetscScalar z = (Lz*k)/P; 53 for (c=0; c<dof; ++ c) { 54 va[k][j][i][c] = PetscPowScalarInt(x-0.5*Lx,2)+PetscPowScalarInt(y-0.5*Ly,2)+PetscPowScalarInt(z-0.5*Lz,2) + 10.0*c; 55 } 56 } 57 } 58 } 59 ierr = DMDAVecRestoreArrayDOF(da,v,&va);CHKERRQ(ierr); 60 ierr = PetscViewerVTKOpen(comm,filename,FILE_MODE_WRITE,&view);CHKERRQ(ierr); 61 ierr = VecView(v,view);CHKERRQ(ierr); 62 ierr = PetscViewerDestroy(&view);CHKERRQ(ierr); 63 ierr = VecDestroy(&v);CHKERRQ(ierr); 64 ierr = DMDestroy(&da);CHKERRQ(ierr); 65 return 0; 66 } 67 68 /* 69 Write 2D DMDA vector with coordinates in VTK format 70 */ 71 PetscErrorCode test_2d(const char filename[],PetscInt dof,PetscBool namefields) 72 { 73 MPI_Comm comm = MPI_COMM_WORLD; 74 const PetscInt M=10,N=20,sw=1; 75 const PetscScalar Lx=1.0,Ly=1.0,Lz=1.0; 76 DM da; 77 Vec v; 78 PetscViewer view; 79 DMDALocalInfo info; 80 PetscScalar ***va; 81 PetscInt i,j,c; 82 PetscErrorCode ierr; 83 84 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); 85 ierr = DMSetFromOptions(da);CHKERRQ(ierr); 86 ierr = DMSetUp(da);CHKERRQ(ierr); 87 if (namefields) {ierr = NameFields(da,dof);CHKERRQ(ierr);} 88 ierr = DMDASetUniformCoordinates(da,0.0,Lx,0.0,Ly,0.0,Lz);CHKERRQ(ierr); 89 ierr = DMDAGetLocalInfo(da,&info);CHKERRQ(ierr); 90 ierr = DMCreateGlobalVector(da,&v);CHKERRQ(ierr); 91 ierr = DMDAVecGetArrayDOF(da,v,&va);CHKERRQ(ierr); 92 for (j=info.ys; j<info.ys+info.ym; j++) { 93 for (i=info.xs; i<info.xs+info.xm; i++) { 94 const PetscScalar x = (Lx*i)/M; 95 const PetscScalar y = (Ly*j)/N; 96 for (c=0; c<dof; ++c) { 97 va[j][i][c] = PetscPowScalarInt(x-0.5*Lx,2)+PetscPowScalarInt(y-0.5*Ly,2) + 10.0*c; 98 } 99 } 100 } 101 ierr = DMDAVecRestoreArrayDOF(da,v,&va);CHKERRQ(ierr); 102 ierr = PetscViewerVTKOpen(comm,filename,FILE_MODE_WRITE,&view);CHKERRQ(ierr); 103 ierr = VecView(v,view);CHKERRQ(ierr); 104 ierr = PetscViewerDestroy(&view);CHKERRQ(ierr); 105 ierr = VecDestroy(&v);CHKERRQ(ierr); 106 ierr = DMDestroy(&da);CHKERRQ(ierr); 107 return 0; 108 } 109 110 /* 111 Write a scalar and a vector field from two compatible 3d DMDAs 112 */ 113 PetscErrorCode test_3d_compat(const char filename[],PetscInt dof,PetscBool namefields) 114 { 115 MPI_Comm comm = MPI_COMM_WORLD; 116 const PetscInt M=10,N=15,P=30,sw=1; 117 const PetscScalar Lx=1.0,Ly=1.0,Lz=1.0; 118 DM da,daVector; 119 Vec v,vVector; 120 PetscViewer view; 121 DMDALocalInfo info; 122 PetscScalar ***va,****vVectora; 123 PetscInt i,j,k,c; 124 PetscErrorCode ierr; 125 126 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:*/1,sw,NULL,NULL,NULL,&da);CHKERRQ(ierr); 127 ierr = DMSetFromOptions(da);CHKERRQ(ierr); 128 ierr = DMSetUp(da);CHKERRQ(ierr); 129 if (namefields) {ierr = NameFields(da,1);CHKERRQ(ierr);} 130 131 ierr = DMDASetUniformCoordinates(da,0.0,Lx,0.0,Ly,0.0,Lz);CHKERRQ(ierr); 132 ierr = DMDAGetLocalInfo(da,&info);CHKERRQ(ierr); 133 ierr = DMDACreateCompatibleDMDA(da,dof,&daVector);CHKERRQ(ierr); 134 if (namefields) {ierr = NameFields(daVector,dof);CHKERRQ(ierr);} 135 ierr = DMCreateGlobalVector(da,&v);CHKERRQ(ierr); 136 ierr = DMCreateGlobalVector(daVector,&vVector);CHKERRQ(ierr); 137 ierr = DMDAVecGetArray(da,v,&va);CHKERRQ(ierr); 138 ierr = DMDAVecGetArrayDOF(daVector,vVector,&vVectora);CHKERRQ(ierr); 139 for (k=info.zs; k<info.zs+info.zm; k++) { 140 for (j=info.ys; j<info.ys+info.ym; j++) { 141 for (i=info.xs; i<info.xs+info.xm; i++) { 142 const PetscScalar x = (Lx*i)/M; 143 const PetscScalar y = (Ly*j)/N; 144 const PetscScalar z = (Lz*k)/P; 145 va[k][j][i] = PetscPowScalarInt(x-0.5*Lx,2)+PetscPowScalarInt(y-0.5*Ly,2)+PetscPowScalarInt(z-0.5*Lz,2); 146 for (c=0; c<dof; ++c) { 147 vVectora[k][j][i][c] = PetscPowScalarInt(x-0.5*Lx,2)+PetscPowScalarInt(y-0.5*Ly,2)+PetscPowScalarInt(z-0.5*Lz,2) + 10.0*c; 148 } 149 } 150 } 151 } 152 ierr = DMDAVecRestoreArray(da,v,&va);CHKERRQ(ierr); 153 ierr = DMDAVecRestoreArrayDOF(da,v,&vVectora);CHKERRQ(ierr); 154 ierr = PetscViewerVTKOpen(comm,filename,FILE_MODE_WRITE,&view);CHKERRQ(ierr); 155 ierr = VecView(v,view);CHKERRQ(ierr); 156 ierr = VecView(vVector,view);CHKERRQ(ierr); 157 ierr = PetscViewerDestroy(&view);CHKERRQ(ierr); 158 ierr = VecDestroy(&v);CHKERRQ(ierr); 159 ierr = VecDestroy(&vVector);CHKERRQ(ierr); 160 ierr = DMDestroy(&da);CHKERRQ(ierr); 161 ierr = DMDestroy(&daVector);CHKERRQ(ierr); 162 return 0; 163 } 164 165 /* 166 Write a scalar and a vector field from two compatible 2d DMDAs 167 */ 168 PetscErrorCode test_2d_compat(const char filename[],PetscInt dof,PetscBool namefields) 169 { 170 MPI_Comm comm = MPI_COMM_WORLD; 171 const PetscInt M=10,N=20,sw=1; 172 const PetscScalar Lx=1.0,Ly=1.0,Lz=1.0; 173 DM da, daVector; 174 Vec v,vVector; 175 PetscViewer view; 176 DMDALocalInfo info; 177 PetscScalar **va,***vVectora; 178 PetscInt i,j,c; 179 PetscErrorCode ierr; 180 181 ierr = DMDACreate2d(comm,DM_BOUNDARY_NONE,DM_BOUNDARY_NONE,DMDA_STENCIL_STAR, M,N,PETSC_DECIDE,PETSC_DECIDE,/* dof:*/ 1,sw,NULL,NULL,&da);CHKERRQ(ierr); 182 ierr = DMSetFromOptions(da);CHKERRQ(ierr); 183 ierr = DMSetUp(da);CHKERRQ(ierr); 184 if (namefields) {ierr = NameFields(da,1);CHKERRQ(ierr);} 185 ierr = DMDASetUniformCoordinates(da,0.0,Lx,0.0,Ly,0.0,Lz);CHKERRQ(ierr); 186 ierr = DMDACreateCompatibleDMDA(da,dof,&daVector);CHKERRQ(ierr); 187 if (namefields) {ierr = NameFields(daVector,dof);CHKERRQ(ierr);} 188 ierr = DMDAGetLocalInfo(da,&info);CHKERRQ(ierr); 189 ierr = DMCreateGlobalVector(da,&v);CHKERRQ(ierr); 190 ierr = DMCreateGlobalVector(daVector,&vVector);CHKERRQ(ierr); 191 ierr = DMDAVecGetArray(da,v,&va);CHKERRQ(ierr); 192 ierr = DMDAVecGetArrayDOF(daVector,vVector,&vVectora);CHKERRQ(ierr); 193 for (j=info.ys; j<info.ys+info.ym; j++) { 194 for (i=info.xs; i<info.xs+info.xm; i++) { 195 const PetscScalar x = (Lx*i)/M; 196 const PetscScalar y = (Ly*j)/N; 197 va[j][i] = PetscPowScalarInt(x-0.5*Lx,2)+PetscPowScalarInt(y-0.5*Ly,2); 198 for (c=0; c<dof; ++c) { 199 vVectora[j][i][c] = PetscPowScalarInt(x-0.5*Lx,2)+PetscPowScalarInt(y-0.5*Ly,2) + 10.0*c; 200 } 201 } 202 } 203 ierr = DMDAVecRestoreArray(da,v,&va);CHKERRQ(ierr); 204 ierr = DMDAVecRestoreArrayDOF(daVector,vVector,&vVectora);CHKERRQ(ierr); 205 ierr = PetscViewerVTKOpen(comm,filename,FILE_MODE_WRITE,&view);CHKERRQ(ierr); 206 ierr = VecView(v,view);CHKERRQ(ierr); 207 ierr = VecView(vVector,view);CHKERRQ(ierr); 208 ierr = PetscViewerDestroy(&view);CHKERRQ(ierr); 209 ierr = VecDestroy(&v);CHKERRQ(ierr); 210 ierr = VecDestroy(&vVector);CHKERRQ(ierr); 211 ierr = DMDestroy(&da);CHKERRQ(ierr); 212 ierr = DMDestroy(&daVector);CHKERRQ(ierr); 213 return 0; 214 } 215 216 int main(int argc, char *argv[]) 217 { 218 PetscErrorCode ierr; 219 PetscInt dof; 220 PetscBool namefields; 221 222 ierr = PetscInitialize(&argc,&argv,0,help);if (ierr) return ierr; 223 dof = 2; 224 ierr = PetscOptionsGetInt(NULL,NULL,"-dof",&dof,NULL);CHKERRQ(ierr); 225 namefields = PETSC_FALSE; 226 ierr = PetscOptionsGetBool(NULL,NULL,"-namefields",&namefields,NULL);CHKERRQ(ierr); 227 ierr = test_3d("3d.vtr",dof,namefields);CHKERRQ(ierr); 228 ierr = test_2d("2d.vtr",dof,namefields);CHKERRQ(ierr); 229 ierr = test_3d_compat("3d_compat.vtr",dof,namefields);CHKERRQ(ierr); 230 ierr = test_2d_compat("2d_compat.vtr",dof,namefields);CHKERRQ(ierr); 231 ierr = test_3d("3d.vts",dof,namefields);CHKERRQ(ierr); 232 ierr = test_2d("2d.vts",dof,namefields);CHKERRQ(ierr); 233 ierr = test_3d_compat("3d_compat.vts",dof,namefields);CHKERRQ(ierr); 234 ierr = test_2d_compat("2d_compat.vts",dof,namefields);CHKERRQ(ierr); 235 ierr = PetscFinalize(); 236 return ierr; 237 } 238 239 /*TEST 240 241 build: 242 requires: !complex 243 244 test: 245 suffix: 1 246 nsize: 2 247 args: -dof 2 248 249 test: 250 suffix: 2 251 nsize: 2 252 args: -dof 2 253 254 test: 255 suffix: 3 256 nsize: 2 257 args: -dof 3 258 259 test: 260 suffix: 4 261 nsize: 1 262 args: -dof 2 -namefields 263 264 test: 265 suffix: 5 266 nsize: 2 267 args: -dof 4 -namefields 268 269 TEST*/ 270