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