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
test1_DAInjection3d(PetscInt mx,PetscInt my,PetscInt mz)8d71ae5a4SJacob Faibussowitsch PetscErrorCode test1_DAInjection3d(PetscInt mx, PetscInt my, PetscInt mz)
9d71ae5a4SJacob Faibussowitsch {
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));
923ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
93c4762a1bSJed Brown }
94c4762a1bSJed Brown
main(int argc,char ** argv)95d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv)
96d71ae5a4SJacob Faibussowitsch {
97c4762a1bSJed Brown PetscInt mx, my, mz;
98c4762a1bSJed Brown
99327415f7SBarry 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
117*3886731fSPierre Jolivet output_file: output/empty.out
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
123*3886731fSPierre Jolivet output_file: output/empty.out
124c4762a1bSJed Brown
125c4762a1bSJed Brown test:
126c4762a1bSJed Brown suffix: 3
127c4762a1bSJed Brown nsize: 5
128c4762a1bSJed Brown args: -mx 30 -my 29 -mz 30 -periodic 2 -da_processors_x 5
129*3886731fSPierre Jolivet output_file: output/empty.out
130c4762a1bSJed Brown
131c4762a1bSJed Brown test:
132c4762a1bSJed Brown suffix: 4
133c4762a1bSJed Brown nsize: 5
134c4762a1bSJed Brown args: -mx 30 -my 30 -mz 29 -periodic 3 -da_processors_x 5
135*3886731fSPierre Jolivet output_file: output/empty.out
136c4762a1bSJed Brown
137c4762a1bSJed Brown test:
138c4762a1bSJed Brown suffix: 5
139c4762a1bSJed Brown nsize: 5
140c4762a1bSJed Brown args: -mx 30 -my 30 -mz 30 -periodic 0 -da_processors_y 5
141*3886731fSPierre Jolivet output_file: output/empty.out
142c4762a1bSJed Brown
143c4762a1bSJed Brown test:
144c4762a1bSJed Brown suffix: 6
145c4762a1bSJed Brown nsize: 5
146c4762a1bSJed Brown args: -mx 29 -my 30 -mz 30 -periodic 1 -da_processors_y 5
147*3886731fSPierre Jolivet output_file: output/empty.out
148c4762a1bSJed Brown
149c4762a1bSJed Brown test:
150c4762a1bSJed Brown suffix: 7
151c4762a1bSJed Brown nsize: 5
152c4762a1bSJed Brown args: -mx 30 -my 29 -mz 30 -periodic 2 -da_processors_y 5
153*3886731fSPierre Jolivet output_file: output/empty.out
154c4762a1bSJed Brown
155c4762a1bSJed Brown test:
156c4762a1bSJed Brown suffix: 8
157c4762a1bSJed Brown nsize: 5
158c4762a1bSJed Brown args: -mx 30 -my 30 -mz 29 -periodic 3 -da_processors_y 5
159*3886731fSPierre Jolivet output_file: output/empty.out
160c4762a1bSJed Brown
161c4762a1bSJed Brown test:
162c4762a1bSJed Brown suffix: 9
163c4762a1bSJed Brown nsize: 5
164c4762a1bSJed Brown args: -mx 30 -my 30 -mz 30 -periodic 0 -da_processors_z 5
165*3886731fSPierre Jolivet output_file: output/empty.out
166c4762a1bSJed Brown
167c4762a1bSJed Brown test:
168c4762a1bSJed Brown suffix: 10
169c4762a1bSJed Brown nsize: 5
170c4762a1bSJed Brown args: -mx 29 -my 30 -mz 30 -periodic 1 -da_processors_z 5
171*3886731fSPierre Jolivet output_file: output/empty.out
172c4762a1bSJed Brown
173c4762a1bSJed Brown test:
174c4762a1bSJed Brown suffix: 11
175c4762a1bSJed Brown nsize: 5
176c4762a1bSJed Brown args: -mx 30 -my 29 -mz 30 -periodic 2 -da_processors_z 5
177*3886731fSPierre Jolivet output_file: output/empty.out
178c4762a1bSJed Brown
179c4762a1bSJed Brown test:
180c4762a1bSJed Brown suffix: 12
181c4762a1bSJed Brown nsize: 5
182c4762a1bSJed Brown args: -mx 30 -my 30 -mz 29 -periodic 3 -da_processors_z 5
183*3886731fSPierre Jolivet output_file: output/empty.out
184c4762a1bSJed Brown
185c4762a1bSJed Brown test:
186c4762a1bSJed Brown suffix: 13
187c4762a1bSJed Brown nsize: 5
188c4762a1bSJed Brown args: -mx 30 -my 30 -mz 30 -periodic 0
189*3886731fSPierre Jolivet output_file: output/empty.out
190c4762a1bSJed Brown
191c4762a1bSJed Brown test:
192c4762a1bSJed Brown suffix: 14
193c4762a1bSJed Brown nsize: 5
194c4762a1bSJed Brown args: -mx 29 -my 30 -mz 30 -periodic 1
195*3886731fSPierre Jolivet output_file: output/empty.out
196c4762a1bSJed Brown
197c4762a1bSJed Brown test:
198c4762a1bSJed Brown suffix: 15
199c4762a1bSJed Brown nsize: 5
200c4762a1bSJed Brown args: -mx 30 -my 29 -mz 30 -periodic 2
201*3886731fSPierre Jolivet output_file: output/empty.out
202c4762a1bSJed Brown
203c4762a1bSJed Brown test:
204c4762a1bSJed Brown suffix: 16
205c4762a1bSJed Brown nsize: 5
206c4762a1bSJed Brown args: -mx 30 -my 30 -mz 29 -periodic 3
207*3886731fSPierre Jolivet output_file: output/empty.out
208c4762a1bSJed Brown
209c4762a1bSJed Brown TEST*/
210