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 /* 70 Write 2D DMDA vector with coordinates in VTK format 71 */ 72 PetscErrorCode test_2d(const char filename[],PetscInt dof,PetscBool namefields) 73 { 74 MPI_Comm comm = MPI_COMM_WORLD; 75 const PetscInt M=10,N=20,sw=1; 76 const PetscScalar Lx=1.0,Ly=1.0,Lz=1.0; 77 DM da; 78 Vec v; 79 PetscViewer view; 80 DMDALocalInfo info; 81 PetscScalar ***va; 82 PetscInt i,j,c; 83 PetscErrorCode ierr; 84 85 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); 86 ierr = DMSetFromOptions(da);CHKERRQ(ierr); 87 ierr = DMSetUp(da);CHKERRQ(ierr); 88 if (namefields) {ierr = NameFields(da,dof);CHKERRQ(ierr);} 89 ierr = DMDASetUniformCoordinates(da,0.0,Lx,0.0,Ly,0.0,Lz);CHKERRQ(ierr); 90 ierr = DMDAGetLocalInfo(da,&info);CHKERRQ(ierr); 91 ierr = DMCreateGlobalVector(da,&v);CHKERRQ(ierr); 92 ierr = DMDAVecGetArrayDOF(da,v,&va);CHKERRQ(ierr); 93 for (j=info.ys; j<info.ys+info.ym; j++) { 94 for (i=info.xs; i<info.xs+info.xm; i++) { 95 const PetscScalar x = (Lx*i)/M; 96 const PetscScalar y = (Ly*j)/N; 97 for (c=0; c<dof; ++c) { 98 va[j][i][c] = PetscPowScalarInt(x-0.5*Lx,2)+PetscPowScalarInt(y-0.5*Ly,2) + 10.0*c; 99 } 100 } 101 } 102 ierr = DMDAVecRestoreArrayDOF(da,v,&va);CHKERRQ(ierr); 103 ierr = PetscViewerVTKOpen(comm,filename,FILE_MODE_WRITE,&view);CHKERRQ(ierr); 104 ierr = VecView(v,view);CHKERRQ(ierr); 105 ierr = PetscViewerDestroy(&view);CHKERRQ(ierr); 106 ierr = VecDestroy(&v);CHKERRQ(ierr); 107 ierr = DMDestroy(&da);CHKERRQ(ierr); 108 return 0; 109 } 110 111 /* 112 Write a scalar and a vector field from two compatible 3d DMDAs 113 */ 114 PetscErrorCode test_3d_compat(const char filename[],PetscInt dof,PetscBool namefields) 115 { 116 MPI_Comm comm = MPI_COMM_WORLD; 117 const PetscInt M=10,N=15,P=30,sw=1; 118 const PetscScalar Lx=1.0,Ly=1.0,Lz=1.0; 119 DM da,daVector; 120 Vec v,vVector; 121 PetscViewer view; 122 DMDALocalInfo info; 123 PetscScalar ***va,****vVectora; 124 PetscInt i,j,k,c; 125 PetscErrorCode ierr; 126 127 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); 128 ierr = DMSetFromOptions(da);CHKERRQ(ierr); 129 ierr = DMSetUp(da);CHKERRQ(ierr); 130 if (namefields) {ierr = NameFields(da,1);CHKERRQ(ierr);} 131 132 ierr = DMDASetUniformCoordinates(da,0.0,Lx,0.0,Ly,0.0,Lz);CHKERRQ(ierr); 133 ierr = DMDAGetLocalInfo(da,&info);CHKERRQ(ierr); 134 ierr = DMDACreateCompatibleDMDA(da,dof,&daVector);CHKERRQ(ierr); 135 if (namefields) {ierr = NameFields(daVector,dof);CHKERRQ(ierr);} 136 ierr = DMCreateGlobalVector(da,&v);CHKERRQ(ierr); 137 ierr = DMCreateGlobalVector(daVector,&vVector);CHKERRQ(ierr); 138 ierr = DMDAVecGetArray(da,v,&va);CHKERRQ(ierr); 139 ierr = DMDAVecGetArrayDOF(daVector,vVector,&vVectora);CHKERRQ(ierr); 140 for (k=info.zs; k<info.zs+info.zm; k++) { 141 for (j=info.ys; j<info.ys+info.ym; j++) { 142 for (i=info.xs; i<info.xs+info.xm; i++) { 143 const PetscScalar x = (Lx*i)/M; 144 const PetscScalar y = (Ly*j)/N; 145 const PetscScalar z = (Lz*k)/P; 146 va[k][j][i] = PetscPowScalarInt(x-0.5*Lx,2)+PetscPowScalarInt(y-0.5*Ly,2)+PetscPowScalarInt(z-0.5*Lz,2); 147 for (c=0; c<dof; ++c) { 148 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; 149 } 150 } 151 } 152 } 153 ierr = DMDAVecRestoreArray(da,v,&va);CHKERRQ(ierr); 154 ierr = DMDAVecRestoreArrayDOF(da,v,&vVectora);CHKERRQ(ierr); 155 ierr = PetscViewerVTKOpen(comm,filename,FILE_MODE_WRITE,&view);CHKERRQ(ierr); 156 ierr = VecView(v,view);CHKERRQ(ierr); 157 ierr = VecView(vVector,view);CHKERRQ(ierr); 158 ierr = PetscViewerDestroy(&view);CHKERRQ(ierr); 159 ierr = VecDestroy(&v);CHKERRQ(ierr); 160 ierr = VecDestroy(&vVector);CHKERRQ(ierr); 161 ierr = DMDestroy(&da);CHKERRQ(ierr); 162 ierr = DMDestroy(&daVector);CHKERRQ(ierr); 163 return 0; 164 } 165 166 /* 167 Write a scalar and a vector field from two compatible 2d DMDAs 168 */ 169 PetscErrorCode test_2d_compat(const char filename[],PetscInt dof,PetscBool namefields) 170 { 171 MPI_Comm comm = MPI_COMM_WORLD; 172 const PetscInt M=10,N=20,sw=1; 173 const PetscScalar Lx=1.0,Ly=1.0,Lz=1.0; 174 DM da, daVector; 175 Vec v,vVector; 176 PetscViewer view; 177 DMDALocalInfo info; 178 PetscScalar **va,***vVectora; 179 PetscInt i,j,c; 180 PetscErrorCode ierr; 181 182 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); 183 ierr = DMSetFromOptions(da);CHKERRQ(ierr); 184 ierr = DMSetUp(da);CHKERRQ(ierr); 185 if (namefields) {ierr = NameFields(da,1);CHKERRQ(ierr);} 186 ierr = DMDASetUniformCoordinates(da,0.0,Lx,0.0,Ly,0.0,Lz);CHKERRQ(ierr); 187 ierr = DMDACreateCompatibleDMDA(da,dof,&daVector);CHKERRQ(ierr); 188 if (namefields) {ierr = NameFields(daVector,dof);CHKERRQ(ierr);} 189 ierr = DMDAGetLocalInfo(da,&info);CHKERRQ(ierr); 190 ierr = DMCreateGlobalVector(da,&v);CHKERRQ(ierr); 191 ierr = DMCreateGlobalVector(daVector,&vVector);CHKERRQ(ierr); 192 ierr = DMDAVecGetArray(da,v,&va);CHKERRQ(ierr); 193 ierr = DMDAVecGetArrayDOF(daVector,vVector,&vVectora);CHKERRQ(ierr); 194 for (j=info.ys; j<info.ys+info.ym; j++) { 195 for (i=info.xs; i<info.xs+info.xm; i++) { 196 const PetscScalar x = (Lx*i)/M; 197 const PetscScalar y = (Ly*j)/N; 198 va[j][i] = PetscPowScalarInt(x-0.5*Lx,2)+PetscPowScalarInt(y-0.5*Ly,2); 199 for (c=0; c<dof; ++c) { 200 vVectora[j][i][c] = PetscPowScalarInt(x-0.5*Lx,2)+PetscPowScalarInt(y-0.5*Ly,2) + 10.0*c; 201 } 202 } 203 } 204 ierr = DMDAVecRestoreArray(da,v,&va);CHKERRQ(ierr); 205 ierr = DMDAVecRestoreArrayDOF(daVector,vVector,&vVectora);CHKERRQ(ierr); 206 ierr = PetscViewerVTKOpen(comm,filename,FILE_MODE_WRITE,&view);CHKERRQ(ierr); 207 ierr = VecView(v,view);CHKERRQ(ierr); 208 ierr = VecView(vVector,view);CHKERRQ(ierr); 209 ierr = PetscViewerDestroy(&view);CHKERRQ(ierr); 210 ierr = VecDestroy(&v);CHKERRQ(ierr); 211 ierr = VecDestroy(&vVector);CHKERRQ(ierr); 212 ierr = DMDestroy(&da);CHKERRQ(ierr); 213 ierr = DMDestroy(&daVector);CHKERRQ(ierr); 214 return 0; 215 } 216 217 int main(int argc, char *argv[]) 218 { 219 PetscErrorCode ierr; 220 PetscInt dof; 221 PetscBool namefields; 222 223 ierr = PetscInitialize(&argc,&argv,0,help);if (ierr) return ierr; 224 dof = 2; 225 ierr = PetscOptionsGetInt(NULL,NULL,"-dof",&dof,NULL);CHKERRQ(ierr); 226 namefields = PETSC_FALSE; 227 ierr = PetscOptionsGetBool(NULL,NULL,"-namefields",&namefields,NULL);CHKERRQ(ierr); 228 ierr = test_3d("3d.vtr",dof,namefields);CHKERRQ(ierr); 229 ierr = test_2d("2d.vtr",dof,namefields);CHKERRQ(ierr); 230 ierr = test_3d_compat("3d_compat.vtr",dof,namefields);CHKERRQ(ierr); 231 ierr = test_2d_compat("2d_compat.vtr",dof,namefields);CHKERRQ(ierr); 232 ierr = test_3d("3d.vts",dof,namefields);CHKERRQ(ierr); 233 ierr = test_2d("2d.vts",dof,namefields);CHKERRQ(ierr); 234 ierr = test_3d_compat("3d_compat.vts",dof,namefields);CHKERRQ(ierr); 235 ierr = test_2d_compat("2d_compat.vts",dof,namefields);CHKERRQ(ierr); 236 ierr = PetscFinalize(); 237 return ierr; 238 } 239 240 /*TEST 241 242 build: 243 requires: !complex 244 245 test: 246 suffix: 1 247 nsize: 2 248 args: -dof 2 249 250 test: 251 suffix: 2 252 nsize: 2 253 args: -dof 2 254 255 test: 256 suffix: 3 257 nsize: 2 258 args: -dof 3 259 260 test: 261 suffix: 4 262 nsize: 1 263 args: -dof 2 -namefields 264 265 test: 266 suffix: 5 267 nsize: 2 268 args: -dof 4 -namefields 269 270 TEST*/ 271