xref: /petsc/src/dm/tests/ex47.c (revision c4762a1b19cd2af06abeed90e8f9d34fb975dd94)
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