xref: /petsc/src/dm/tests/ex21.c (revision 327415f76d85372a4417cf1aaa14db707d4d6c04)
1c4762a1bSJed Brown static const char help[] = "Test DMCreateInjection() for mapping coordinates in 3D";
2c4762a1bSJed Brown 
3c4762a1bSJed Brown #include <petscvec.h>
4c4762a1bSJed Brown #include <petscmat.h>
5c4762a1bSJed Brown #include <petscdm.h>
6c4762a1bSJed Brown #include <petscdmda.h>
7c4762a1bSJed Brown 
8c4762a1bSJed Brown PetscErrorCode test1_DAInjection3d(PetscInt mx, PetscInt my, PetscInt mz)
9c4762a1bSJed Brown {
10c4762a1bSJed Brown   DM               dac,daf;
11c4762a1bSJed Brown   PetscViewer      vv;
12c4762a1bSJed Brown   Vec              ac,af;
13c4762a1bSJed Brown   PetscInt         periodicity;
14c4762a1bSJed Brown   DMBoundaryType   bx,by,bz;
15c4762a1bSJed Brown 
16c4762a1bSJed Brown   PetscFunctionBeginUser;
17c4762a1bSJed Brown   bx = DM_BOUNDARY_NONE;
18c4762a1bSJed Brown   by = DM_BOUNDARY_NONE;
19c4762a1bSJed Brown   bz = DM_BOUNDARY_NONE;
20c4762a1bSJed Brown 
21c4762a1bSJed Brown   periodicity = 0;
22c4762a1bSJed Brown 
239566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetInt(NULL,NULL,"-periodic", &periodicity, NULL));
24c4762a1bSJed Brown   if (periodicity==1) {
25c4762a1bSJed Brown     bx = DM_BOUNDARY_PERIODIC;
26c4762a1bSJed Brown   } else if (periodicity==2) {
27c4762a1bSJed Brown     by = DM_BOUNDARY_PERIODIC;
28c4762a1bSJed Brown   } else if (periodicity==3) {
29c4762a1bSJed Brown     bz = DM_BOUNDARY_PERIODIC;
30c4762a1bSJed Brown   }
31c4762a1bSJed Brown 
32d0609cedSBarry Smith   PetscCall(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 */
33d0609cedSBarry Smith                          1, /* stencil = 1 */NULL,NULL,NULL,&daf));
349566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(daf));
359566063dSJacob Faibussowitsch   PetscCall(DMSetUp(daf));
36c4762a1bSJed Brown 
379566063dSJacob Faibussowitsch   PetscCall(DMCoarsen(daf,MPI_COMM_NULL,&dac));
38c4762a1bSJed Brown 
399566063dSJacob Faibussowitsch   PetscCall(DMDASetUniformCoordinates(dac, -1.0,1.0, -1.0,1.0, -1.0,1.0));
409566063dSJacob Faibussowitsch   PetscCall(DMDASetUniformCoordinates(daf, -1.0,1.0, -1.0,1.0, -1.0,1.0));
41c4762a1bSJed Brown 
42c4762a1bSJed Brown   {
43c4762a1bSJed Brown     DM         cdaf,cdac;
44c4762a1bSJed Brown     Vec        coordsc,coordsf,coordsf2;
45c4762a1bSJed Brown     Mat        inject;
46c4762a1bSJed Brown     VecScatter vscat;
47c4762a1bSJed Brown     Mat        interp;
48c4762a1bSJed Brown     PetscReal  norm;
49c4762a1bSJed Brown 
509566063dSJacob Faibussowitsch     PetscCall(DMGetCoordinateDM(dac,&cdac));
519566063dSJacob Faibussowitsch     PetscCall(DMGetCoordinateDM(daf,&cdaf));
52c4762a1bSJed Brown 
539566063dSJacob Faibussowitsch     PetscCall(DMGetCoordinates(dac,&coordsc));
549566063dSJacob Faibussowitsch     PetscCall(DMGetCoordinates(daf,&coordsf));
55c4762a1bSJed Brown 
569566063dSJacob Faibussowitsch     PetscCall(DMCreateInjection(cdac,cdaf,&inject));
579566063dSJacob Faibussowitsch     PetscCall(MatScatterGetVecScatter(inject,&vscat));
589566063dSJacob Faibussowitsch     PetscCall(VecScatterBegin(vscat,coordsf,coordsc,INSERT_VALUES,SCATTER_FORWARD));
599566063dSJacob Faibussowitsch     PetscCall(VecScatterEnd(vscat  ,coordsf,coordsc,INSERT_VALUES,SCATTER_FORWARD));
609566063dSJacob Faibussowitsch     PetscCall(MatDestroy(&inject));
61c4762a1bSJed Brown 
629566063dSJacob Faibussowitsch     PetscCall(DMCreateInterpolation(cdac,cdaf,&interp,NULL));
639566063dSJacob Faibussowitsch     PetscCall(VecDuplicate(coordsf,&coordsf2));
649566063dSJacob Faibussowitsch     PetscCall(MatInterpolate(interp,coordsc,coordsf2));
659566063dSJacob Faibussowitsch     PetscCall(VecAXPY(coordsf2,-1.0,coordsf));
669566063dSJacob Faibussowitsch     PetscCall(VecNorm(coordsf2,NORM_MAX,&norm));
67c4762a1bSJed Brown     /* The fine coordinates are only reproduced in certain cases */
689566063dSJacob Faibussowitsch     if (!bx && !by && !bz && norm > PETSC_SQRT_MACHINE_EPSILON) PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Norm %g\n",(double)norm));
699566063dSJacob Faibussowitsch     PetscCall(VecDestroy(&coordsf2));
709566063dSJacob Faibussowitsch     PetscCall(MatDestroy(&interp));
71c4762a1bSJed Brown   }
72c4762a1bSJed Brown 
73c4762a1bSJed Brown   if (0) {
749566063dSJacob Faibussowitsch     PetscCall(DMCreateGlobalVector(dac,&ac));
759566063dSJacob Faibussowitsch     PetscCall(VecZeroEntries(ac));
76c4762a1bSJed Brown 
779566063dSJacob Faibussowitsch     PetscCall(DMCreateGlobalVector(daf,&af));
789566063dSJacob Faibussowitsch     PetscCall(VecZeroEntries(af));
79c4762a1bSJed Brown 
809566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIOpen(PETSC_COMM_WORLD, "dac_7.vtu", &vv));
819566063dSJacob Faibussowitsch     PetscCall(VecView(ac, vv));
829566063dSJacob Faibussowitsch     PetscCall(PetscViewerDestroy(&vv));
83c4762a1bSJed Brown 
849566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIOpen(PETSC_COMM_WORLD, "daf_7.vtu", &vv));
859566063dSJacob Faibussowitsch     PetscCall(VecView(af, vv));
869566063dSJacob Faibussowitsch     PetscCall(PetscViewerDestroy(&vv));
879566063dSJacob Faibussowitsch     PetscCall(VecDestroy(&ac));
889566063dSJacob Faibussowitsch     PetscCall(VecDestroy(&af));
89c4762a1bSJed Brown   }
909566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&dac));
919566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&daf));
92c4762a1bSJed Brown   PetscFunctionReturn(0);
93c4762a1bSJed Brown }
94c4762a1bSJed Brown 
95c4762a1bSJed Brown int main(int argc,char **argv)
96c4762a1bSJed Brown {
97c4762a1bSJed Brown   PetscInt       mx,my,mz;
98c4762a1bSJed Brown 
99*327415f7SBarry Smith   PetscFunctionBeginUser;
1009566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc,&argv,0,help));
101c4762a1bSJed Brown   mx   = 2;
102c4762a1bSJed Brown   my   = 2;
103c4762a1bSJed Brown   mz   = 2;
1049566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetInt(NULL,NULL,"-mx", &mx, 0));
1059566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetInt(NULL,NULL,"-my", &my, 0));
1069566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetInt(NULL,NULL,"-mz", &mz, 0));
1079566063dSJacob Faibussowitsch   PetscCall(test1_DAInjection3d(mx,my,mz));
1089566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
109b122ec5aSJacob Faibussowitsch   return 0;
110c4762a1bSJed Brown }
111c4762a1bSJed Brown 
112c4762a1bSJed Brown /*TEST
113c4762a1bSJed Brown 
114c4762a1bSJed Brown       test:
115c4762a1bSJed Brown          nsize: 5
116c4762a1bSJed Brown          args: -mx 30 -my 30 -mz 30 -periodic 0 -da_processors_x 5
117c4762a1bSJed Brown 
118c4762a1bSJed Brown       test:
119c4762a1bSJed Brown          suffix: 2
120c4762a1bSJed Brown          nsize: 5
121c4762a1bSJed Brown          args: -mx 29 -my 30 -mz 30 -periodic 1 -da_processors_x 5
122c4762a1bSJed Brown 
123c4762a1bSJed Brown       test:
124c4762a1bSJed Brown          suffix: 3
125c4762a1bSJed Brown          nsize: 5
126c4762a1bSJed Brown          args: -mx 30 -my 29 -mz 30 -periodic 2 -da_processors_x 5
127c4762a1bSJed Brown 
128c4762a1bSJed Brown       test:
129c4762a1bSJed Brown          suffix: 4
130c4762a1bSJed Brown          nsize: 5
131c4762a1bSJed Brown          args: -mx 30 -my 30 -mz 29 -periodic 3 -da_processors_x 5
132c4762a1bSJed Brown 
133c4762a1bSJed Brown       test:
134c4762a1bSJed Brown          suffix: 5
135c4762a1bSJed Brown          nsize: 5
136c4762a1bSJed Brown          args: -mx 30 -my 30 -mz 30 -periodic 0 -da_processors_y 5
137c4762a1bSJed Brown 
138c4762a1bSJed Brown       test:
139c4762a1bSJed Brown          suffix: 6
140c4762a1bSJed Brown          nsize: 5
141c4762a1bSJed Brown          args: -mx 29 -my 30 -mz 30 -periodic 1 -da_processors_y 5
142c4762a1bSJed Brown 
143c4762a1bSJed Brown       test:
144c4762a1bSJed Brown          suffix: 7
145c4762a1bSJed Brown          nsize: 5
146c4762a1bSJed Brown          args: -mx 30 -my 29 -mz 30 -periodic 2 -da_processors_y 5
147c4762a1bSJed Brown 
148c4762a1bSJed Brown       test:
149c4762a1bSJed Brown          suffix: 8
150c4762a1bSJed Brown          nsize: 5
151c4762a1bSJed Brown          args: -mx 30 -my 30 -mz 29 -periodic 3 -da_processors_y 5
152c4762a1bSJed Brown 
153c4762a1bSJed Brown       test:
154c4762a1bSJed Brown          suffix: 9
155c4762a1bSJed Brown          nsize: 5
156c4762a1bSJed Brown          args: -mx 30 -my 30 -mz 30 -periodic 0 -da_processors_z 5
157c4762a1bSJed Brown 
158c4762a1bSJed Brown       test:
159c4762a1bSJed Brown          suffix: 10
160c4762a1bSJed Brown          nsize: 5
161c4762a1bSJed Brown          args: -mx 29 -my 30 -mz 30 -periodic 1 -da_processors_z 5
162c4762a1bSJed Brown 
163c4762a1bSJed Brown       test:
164c4762a1bSJed Brown          suffix: 11
165c4762a1bSJed Brown          nsize: 5
166c4762a1bSJed Brown          args: -mx 30 -my 29 -mz 30 -periodic 2 -da_processors_z 5
167c4762a1bSJed Brown 
168c4762a1bSJed Brown       test:
169c4762a1bSJed Brown          suffix: 12
170c4762a1bSJed Brown          nsize: 5
171c4762a1bSJed Brown          args: -mx 30 -my 30 -mz 29 -periodic 3 -da_processors_z 5
172c4762a1bSJed Brown 
173c4762a1bSJed Brown       test:
174c4762a1bSJed Brown          suffix: 13
175c4762a1bSJed Brown          nsize: 5
176c4762a1bSJed Brown          args: -mx 30 -my 30 -mz 30 -periodic 0
177c4762a1bSJed Brown 
178c4762a1bSJed Brown       test:
179c4762a1bSJed Brown          suffix: 14
180c4762a1bSJed Brown          nsize: 5
181c4762a1bSJed Brown          args: -mx 29 -my 30 -mz 30 -periodic 1
182c4762a1bSJed Brown 
183c4762a1bSJed Brown       test:
184c4762a1bSJed Brown          suffix: 15
185c4762a1bSJed Brown          nsize: 5
186c4762a1bSJed Brown          args: -mx 30 -my 29 -mz 30 -periodic 2
187c4762a1bSJed Brown 
188c4762a1bSJed Brown       test:
189c4762a1bSJed Brown          suffix: 16
190c4762a1bSJed Brown          nsize: 5
191c4762a1bSJed Brown          args: -mx 30 -my 30 -mz 29 -periodic 3
192c4762a1bSJed Brown 
193c4762a1bSJed Brown TEST*/
194