xref: /petsc/src/dm/tests/ex21.c (revision c4762a1b19cd2af06abeed90e8f9d34fb975dd94)
1*c4762a1bSJed Brown static const char help[] = "Test DMCreateInjection() for mapping coordinates in 3D";
2*c4762a1bSJed Brown 
3*c4762a1bSJed Brown #include <petscvec.h>
4*c4762a1bSJed Brown #include <petscmat.h>
5*c4762a1bSJed Brown #include <petscdm.h>
6*c4762a1bSJed Brown #include <petscdmda.h>
7*c4762a1bSJed Brown 
8*c4762a1bSJed Brown PetscErrorCode test1_DAInjection3d(PetscInt mx, PetscInt my, PetscInt mz)
9*c4762a1bSJed Brown {
10*c4762a1bSJed Brown   PetscErrorCode   ierr;
11*c4762a1bSJed Brown   DM               dac,daf;
12*c4762a1bSJed Brown   PetscViewer      vv;
13*c4762a1bSJed Brown   Vec              ac,af;
14*c4762a1bSJed Brown   PetscInt         periodicity;
15*c4762a1bSJed Brown   DMBoundaryType   bx,by,bz;
16*c4762a1bSJed Brown 
17*c4762a1bSJed Brown   PetscFunctionBeginUser;
18*c4762a1bSJed Brown   bx = DM_BOUNDARY_NONE;
19*c4762a1bSJed Brown   by = DM_BOUNDARY_NONE;
20*c4762a1bSJed Brown   bz = DM_BOUNDARY_NONE;
21*c4762a1bSJed Brown 
22*c4762a1bSJed Brown   periodicity = 0;
23*c4762a1bSJed Brown 
24*c4762a1bSJed Brown   ierr = PetscOptionsGetInt(NULL,NULL,"-periodic", &periodicity, NULL);CHKERRQ(ierr);
25*c4762a1bSJed Brown   if (periodicity==1) {
26*c4762a1bSJed Brown     bx = DM_BOUNDARY_PERIODIC;
27*c4762a1bSJed Brown   } else if (periodicity==2) {
28*c4762a1bSJed Brown     by = DM_BOUNDARY_PERIODIC;
29*c4762a1bSJed Brown   } else if (periodicity==3) {
30*c4762a1bSJed Brown     bz = DM_BOUNDARY_PERIODIC;
31*c4762a1bSJed Brown   }
32*c4762a1bSJed Brown 
33*c4762a1bSJed Brown   ierr = DMDACreate3d(PETSC_COMM_WORLD, bx,by,bz, DMDA_STENCIL_BOX,mx+1, my+1,mz+1,PETSC_DECIDE, PETSC_DECIDE,PETSC_DECIDE,1, /* 1 dof */
34*c4762a1bSJed Brown                       1, /* stencil = 1 */NULL,NULL,NULL,&daf);CHKERRQ(ierr);
35*c4762a1bSJed Brown   ierr = DMSetFromOptions(daf);CHKERRQ(ierr);
36*c4762a1bSJed Brown   ierr = DMSetUp(daf);CHKERRQ(ierr);
37*c4762a1bSJed Brown 
38*c4762a1bSJed Brown   ierr = DMCoarsen(daf,MPI_COMM_NULL,&dac);CHKERRQ(ierr);
39*c4762a1bSJed Brown 
40*c4762a1bSJed Brown   ierr = DMDASetUniformCoordinates(dac, -1.0,1.0, -1.0,1.0, -1.0,1.0);CHKERRQ(ierr);
41*c4762a1bSJed Brown   ierr = DMDASetUniformCoordinates(daf, -1.0,1.0, -1.0,1.0, -1.0,1.0);CHKERRQ(ierr);
42*c4762a1bSJed Brown 
43*c4762a1bSJed Brown   {
44*c4762a1bSJed Brown     DM         cdaf,cdac;
45*c4762a1bSJed Brown     Vec        coordsc,coordsf,coordsf2;
46*c4762a1bSJed Brown     Mat        inject;
47*c4762a1bSJed Brown     VecScatter vscat;
48*c4762a1bSJed Brown     Mat        interp;
49*c4762a1bSJed Brown     PetscReal  norm;
50*c4762a1bSJed Brown 
51*c4762a1bSJed Brown     ierr = DMGetCoordinateDM(dac,&cdac);CHKERRQ(ierr);
52*c4762a1bSJed Brown     ierr = DMGetCoordinateDM(daf,&cdaf);CHKERRQ(ierr);
53*c4762a1bSJed Brown 
54*c4762a1bSJed Brown     ierr = DMGetCoordinates(dac,&coordsc);CHKERRQ(ierr);
55*c4762a1bSJed Brown     ierr = DMGetCoordinates(daf,&coordsf);CHKERRQ(ierr);
56*c4762a1bSJed Brown 
57*c4762a1bSJed Brown     ierr = DMCreateInjection(cdac,cdaf,&inject);CHKERRQ(ierr);
58*c4762a1bSJed Brown     ierr = MatScatterGetVecScatter(inject,&vscat);CHKERRQ(ierr);
59*c4762a1bSJed Brown     ierr = VecScatterBegin(vscat,coordsf,coordsc,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
60*c4762a1bSJed Brown     ierr = VecScatterEnd(vscat  ,coordsf,coordsc,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
61*c4762a1bSJed Brown     ierr = MatDestroy(&inject);CHKERRQ(ierr);
62*c4762a1bSJed Brown 
63*c4762a1bSJed Brown     ierr = DMCreateInterpolation(cdac,cdaf,&interp,NULL);CHKERRQ(ierr);
64*c4762a1bSJed Brown     ierr = VecDuplicate(coordsf,&coordsf2);CHKERRQ(ierr);
65*c4762a1bSJed Brown     ierr = MatInterpolate(interp,coordsc,coordsf2);CHKERRQ(ierr);
66*c4762a1bSJed Brown     ierr = VecAXPY(coordsf2,-1.0,coordsf);CHKERRQ(ierr);
67*c4762a1bSJed Brown     ierr = VecNorm(coordsf2,NORM_MAX,&norm);CHKERRQ(ierr);
68*c4762a1bSJed Brown     /* The fine coordinates are only reproduced in certain cases */
69*c4762a1bSJed Brown     if (!bx && !by && !bz && norm > PETSC_SQRT_MACHINE_EPSILON) {ierr = PetscPrintf(PETSC_COMM_WORLD,"Norm %g\n",(double)norm);CHKERRQ(ierr);}
70*c4762a1bSJed Brown     ierr = VecDestroy(&coordsf2);CHKERRQ(ierr);
71*c4762a1bSJed Brown     ierr = MatDestroy(&interp);CHKERRQ(ierr);
72*c4762a1bSJed Brown   }
73*c4762a1bSJed Brown 
74*c4762a1bSJed Brown   if (0) {
75*c4762a1bSJed Brown     ierr = DMCreateGlobalVector(dac,&ac);CHKERRQ(ierr);
76*c4762a1bSJed Brown     ierr = VecZeroEntries(ac);CHKERRQ(ierr);
77*c4762a1bSJed Brown 
78*c4762a1bSJed Brown     ierr = DMCreateGlobalVector(daf,&af);CHKERRQ(ierr);
79*c4762a1bSJed Brown     ierr = VecZeroEntries(af);CHKERRQ(ierr);
80*c4762a1bSJed Brown 
81*c4762a1bSJed Brown     ierr = PetscViewerASCIIOpen(PETSC_COMM_WORLD, "dac_7.vtk", &vv);CHKERRQ(ierr);
82*c4762a1bSJed Brown     ierr = PetscViewerPushFormat(vv, PETSC_VIEWER_ASCII_VTK);CHKERRQ(ierr);
83*c4762a1bSJed Brown     ierr = DMView(dac, vv);CHKERRQ(ierr);
84*c4762a1bSJed Brown     ierr = VecView(ac, vv);CHKERRQ(ierr);
85*c4762a1bSJed Brown     ierr = PetscViewerPopFormat(vv);CHKERRQ(ierr);
86*c4762a1bSJed Brown     ierr = PetscViewerDestroy(&vv);CHKERRQ(ierr);
87*c4762a1bSJed Brown 
88*c4762a1bSJed Brown     ierr = PetscViewerASCIIOpen(PETSC_COMM_WORLD, "daf_7.vtk", &vv);CHKERRQ(ierr);
89*c4762a1bSJed Brown     ierr = PetscViewerPushFormat(vv, PETSC_VIEWER_ASCII_VTK);CHKERRQ(ierr);
90*c4762a1bSJed Brown     ierr = DMView(daf, vv);CHKERRQ(ierr);
91*c4762a1bSJed Brown     ierr = VecView(af, vv);CHKERRQ(ierr);
92*c4762a1bSJed Brown     ierr = PetscViewerPopFormat(vv);CHKERRQ(ierr);
93*c4762a1bSJed Brown     ierr = PetscViewerDestroy(&vv);CHKERRQ(ierr);
94*c4762a1bSJed Brown     ierr = VecDestroy(&ac);CHKERRQ(ierr);
95*c4762a1bSJed Brown     ierr = VecDestroy(&af);CHKERRQ(ierr);
96*c4762a1bSJed Brown   }
97*c4762a1bSJed Brown   ierr = DMDestroy(&dac);CHKERRQ(ierr);
98*c4762a1bSJed Brown   ierr = DMDestroy(&daf);CHKERRQ(ierr);
99*c4762a1bSJed Brown   PetscFunctionReturn(0);
100*c4762a1bSJed Brown }
101*c4762a1bSJed Brown 
102*c4762a1bSJed Brown int main(int argc,char **argv)
103*c4762a1bSJed Brown {
104*c4762a1bSJed Brown   PetscErrorCode ierr;
105*c4762a1bSJed Brown   PetscInt       mx,my,mz;
106*c4762a1bSJed Brown 
107*c4762a1bSJed Brown   ierr = PetscInitialize(&argc,&argv,0,help);if (ierr) return ierr;
108*c4762a1bSJed Brown   mx   = 2;
109*c4762a1bSJed Brown   my   = 2;
110*c4762a1bSJed Brown   mz   = 2;
111*c4762a1bSJed Brown   ierr = PetscOptionsGetInt(NULL,NULL,"-mx", &mx, 0);CHKERRQ(ierr);
112*c4762a1bSJed Brown   ierr = PetscOptionsGetInt(NULL,NULL,"-my", &my, 0);CHKERRQ(ierr);
113*c4762a1bSJed Brown   ierr = PetscOptionsGetInt(NULL,NULL,"-mz", &mz, 0);CHKERRQ(ierr);
114*c4762a1bSJed Brown   ierr = test1_DAInjection3d(mx,my,mz);CHKERRQ(ierr);
115*c4762a1bSJed Brown   ierr = PetscFinalize();
116*c4762a1bSJed Brown   return ierr;
117*c4762a1bSJed Brown }
118*c4762a1bSJed Brown 
119*c4762a1bSJed Brown 
120*c4762a1bSJed Brown /*TEST
121*c4762a1bSJed Brown 
122*c4762a1bSJed Brown       test:
123*c4762a1bSJed Brown          nsize: 5
124*c4762a1bSJed Brown          args: -mx 30 -my 30 -mz 30 -periodic 0 -da_processors_x 5
125*c4762a1bSJed Brown 
126*c4762a1bSJed Brown       test:
127*c4762a1bSJed Brown          suffix: 2
128*c4762a1bSJed Brown          nsize: 5
129*c4762a1bSJed Brown          args: -mx 29 -my 30 -mz 30 -periodic 1 -da_processors_x 5
130*c4762a1bSJed Brown 
131*c4762a1bSJed Brown       test:
132*c4762a1bSJed Brown          suffix: 3
133*c4762a1bSJed Brown          nsize: 5
134*c4762a1bSJed Brown          args: -mx 30 -my 29 -mz 30 -periodic 2 -da_processors_x 5
135*c4762a1bSJed Brown 
136*c4762a1bSJed Brown       test:
137*c4762a1bSJed Brown          suffix: 4
138*c4762a1bSJed Brown          nsize: 5
139*c4762a1bSJed Brown          args: -mx 30 -my 30 -mz 29 -periodic 3 -da_processors_x 5
140*c4762a1bSJed Brown 
141*c4762a1bSJed Brown       test:
142*c4762a1bSJed Brown          suffix: 5
143*c4762a1bSJed Brown          nsize: 5
144*c4762a1bSJed Brown          args: -mx 30 -my 30 -mz 30 -periodic 0 -da_processors_y 5
145*c4762a1bSJed Brown 
146*c4762a1bSJed Brown       test:
147*c4762a1bSJed Brown          suffix: 6
148*c4762a1bSJed Brown          nsize: 5
149*c4762a1bSJed Brown          args: -mx 29 -my 30 -mz 30 -periodic 1 -da_processors_y 5
150*c4762a1bSJed Brown 
151*c4762a1bSJed Brown       test:
152*c4762a1bSJed Brown          suffix: 7
153*c4762a1bSJed Brown          nsize: 5
154*c4762a1bSJed Brown          args: -mx 30 -my 29 -mz 30 -periodic 2 -da_processors_y 5
155*c4762a1bSJed Brown 
156*c4762a1bSJed Brown       test:
157*c4762a1bSJed Brown          suffix: 8
158*c4762a1bSJed Brown          nsize: 5
159*c4762a1bSJed Brown          args: -mx 30 -my 30 -mz 29 -periodic 3 -da_processors_y 5
160*c4762a1bSJed Brown 
161*c4762a1bSJed Brown       test:
162*c4762a1bSJed Brown          suffix: 9
163*c4762a1bSJed Brown          nsize: 5
164*c4762a1bSJed Brown          args: -mx 30 -my 30 -mz 30 -periodic 0 -da_processors_z 5
165*c4762a1bSJed Brown 
166*c4762a1bSJed Brown       test:
167*c4762a1bSJed Brown          suffix: 10
168*c4762a1bSJed Brown          nsize: 5
169*c4762a1bSJed Brown          args: -mx 29 -my 30 -mz 30 -periodic 1 -da_processors_z 5
170*c4762a1bSJed Brown 
171*c4762a1bSJed Brown       test:
172*c4762a1bSJed Brown          suffix: 11
173*c4762a1bSJed Brown          nsize: 5
174*c4762a1bSJed Brown          args: -mx 30 -my 29 -mz 30 -periodic 2 -da_processors_z 5
175*c4762a1bSJed Brown 
176*c4762a1bSJed Brown       test:
177*c4762a1bSJed Brown          suffix: 12
178*c4762a1bSJed Brown          nsize: 5
179*c4762a1bSJed Brown          args: -mx 30 -my 30 -mz 29 -periodic 3 -da_processors_z 5
180*c4762a1bSJed Brown 
181*c4762a1bSJed Brown       test:
182*c4762a1bSJed Brown          suffix: 13
183*c4762a1bSJed Brown          nsize: 5
184*c4762a1bSJed Brown          args: -mx 30 -my 30 -mz 30 -periodic 0
185*c4762a1bSJed Brown 
186*c4762a1bSJed Brown       test:
187*c4762a1bSJed Brown          suffix: 14
188*c4762a1bSJed Brown          nsize: 5
189*c4762a1bSJed Brown          args: -mx 29 -my 30 -mz 30 -periodic 1
190*c4762a1bSJed Brown 
191*c4762a1bSJed Brown       test:
192*c4762a1bSJed Brown          suffix: 15
193*c4762a1bSJed Brown          nsize: 5
194*c4762a1bSJed Brown          args: -mx 30 -my 29 -mz 30 -periodic 2
195*c4762a1bSJed Brown 
196*c4762a1bSJed Brown       test:
197*c4762a1bSJed Brown          suffix: 16
198*c4762a1bSJed Brown          nsize: 5
199*c4762a1bSJed Brown          args: -mx 30 -my 30 -mz 29 -periodic 3
200*c4762a1bSJed Brown 
201*c4762a1bSJed Brown TEST*/
202