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