Actual source code: ex21.c
petsc-3.4.2 2013-07-02
1: static const char help[] = "Test DMCreateInjection() for mapping coordinates in 3D";
3: #include <petscvec.h>
4: #include <petscmat.h>
5: #include <petscdmda.h>
9: PetscErrorCode test1_DAInjection3d(PetscInt mx, PetscInt my, PetscInt mz)
10: {
11: PetscErrorCode ierr;
12: DM dac,daf;
13: PetscViewer vv;
14: Vec ac,af;
15: PetscInt periodicity;
16: DMDABoundaryType bx,by,bz;
19: bx = DMDA_BOUNDARY_NONE;
20: by = DMDA_BOUNDARY_NONE;
21: bz = DMDA_BOUNDARY_NONE;
23: periodicity = 0;
25: PetscOptionsGetInt(NULL,"-periodic", &periodicity, NULL);
26: if (periodicity==1) {
27: bx = DMDA_BOUNDARY_PERIODIC;
28: } else if (periodicity==2) {
29: by = DMDA_BOUNDARY_PERIODIC;
30: } else if (periodicity==3) {
31: bz = DMDA_BOUNDARY_PERIODIC;
32: }
34: DMDACreate3d(PETSC_COMM_WORLD, bx,by,bz, DMDA_STENCIL_BOX,
35: mx+1, my+1,mz+1,
36: PETSC_DECIDE, PETSC_DECIDE,PETSC_DECIDE,
37: 1, /* 1 dof */
38: 1, /* stencil = 1 */
39: NULL,NULL,NULL,
40: &daf);
42: DMSetFromOptions(daf);
44: DMCoarsen(daf,MPI_COMM_NULL,&dac);
46: DMDASetUniformCoordinates(dac, -1.0,1.0, -1.0,1.0, -1.0,1.0);
47: DMDASetUniformCoordinates(daf, -1.0,1.0, -1.0,1.0, -1.0,1.0);
49: {
50: DM cdaf,cdac;
51: Vec coordsc,coordsf,coordsf2;
52: VecScatter inject;
53: Mat interp;
54: PetscReal norm;
56: DMGetCoordinateDM(dac,&cdac);
57: DMGetCoordinateDM(daf,&cdaf);
59: DMGetCoordinates(dac,&coordsc);
60: DMGetCoordinates(daf,&coordsf);
62: DMCreateInjection(cdac,cdaf,&inject);
64: VecScatterBegin(inject,coordsf,coordsc,INSERT_VALUES,SCATTER_FORWARD);
65: VecScatterEnd(inject ,coordsf,coordsc,INSERT_VALUES,SCATTER_FORWARD);
66: VecScatterDestroy(&inject);
68: DMCreateInterpolation(cdac,cdaf,&interp,NULL);
69: VecDuplicate(coordsf,&coordsf2);
70: MatInterpolate(interp,coordsc,coordsf2);
71: VecAXPY(coordsf2,-1.0,coordsf);
72: VecNorm(coordsf2,NORM_MAX,&norm);
73: /* The fine coordinates are only reproduced in certain cases */
74: if (!bx && !by && !bz && norm > 1.e-10) {PetscPrintf(PETSC_COMM_WORLD,"Norm %G\n",norm);}
75: VecDestroy(&coordsf2);
76: MatDestroy(&interp);
77: }
79: if (0) {
80: DMCreateGlobalVector(dac,&ac);
81: VecZeroEntries(ac);
83: DMCreateGlobalVector(daf,&af);
84: VecZeroEntries(af);
86: PetscViewerASCIIOpen(PETSC_COMM_WORLD, "dac_7.vtk", &vv);
87: PetscViewerSetFormat(vv, PETSC_VIEWER_ASCII_VTK);
88: DMView(dac, vv);
89: VecView(ac, vv);
90: PetscViewerDestroy(&vv);
92: PetscViewerASCIIOpen(PETSC_COMM_WORLD, "daf_7.vtk", &vv);
93: PetscViewerSetFormat(vv, PETSC_VIEWER_ASCII_VTK);
94: DMView(daf, vv);
95: VecView(af, vv);
96: PetscViewerDestroy(&vv);
97: VecDestroy(&ac);
98: VecDestroy(&af);
99: }
100: DMDestroy(&dac);
101: DMDestroy(&daf);
102: return(0);
103: }
107: int main(int argc,char **argv)
108: {
110: PetscInt mx,my,mz;
112: PetscInitialize(&argc,&argv,0,help);
113: mx = 2;
114: my = 2;
115: mz = 2;
116: PetscOptionsGetInt(NULL,"-mx", &mx, 0);
117: PetscOptionsGetInt(NULL,"-my", &my, 0);
118: PetscOptionsGetInt(NULL,"-mz", &mz, 0);
120: test1_DAInjection3d(mx,my,mz);
122: PetscFinalize();
123: return 0;
124: }