Actual source code: ex21.c

petsc-3.7.7 2017-09-25
Report Typos and Errors
  1: static const char help[] = "Test DMCreateInjection() for mapping coordinates in 3D";

  3: #include <petscvec.h>
  4: #include <petscmat.h>
  5: #include <petscdm.h>
  6: #include <petscdmda.h>

 10: PetscErrorCode test1_DAInjection3d(PetscInt mx, PetscInt my, PetscInt mz)
 11: {
 12:   PetscErrorCode   ierr;
 13:   DM               dac,daf;
 14:   PetscViewer      vv;
 15:   Vec              ac,af;
 16:   PetscInt         periodicity;
 17:   DMBoundaryType   bx,by,bz;

 20:   bx = DM_BOUNDARY_NONE;
 21:   by = DM_BOUNDARY_NONE;
 22:   bz = DM_BOUNDARY_NONE;

 24:   periodicity = 0;

 26:   PetscOptionsGetInt(NULL,NULL,"-periodic", &periodicity, NULL);
 27:   if (periodicity==1) {
 28:     bx = DM_BOUNDARY_PERIODIC;
 29:   } else if (periodicity==2) {
 30:     by = DM_BOUNDARY_PERIODIC;
 31:   } else if (periodicity==3) {
 32:     bz = DM_BOUNDARY_PERIODIC;
 33:   }

 35:   DMDACreate3d(PETSC_COMM_WORLD, bx,by,bz, DMDA_STENCIL_BOX,
 36:                       mx+1, my+1,mz+1,
 37:                       PETSC_DECIDE, PETSC_DECIDE,PETSC_DECIDE,
 38:                       1, /* 1 dof */
 39:                       1, /* stencil = 1 */
 40:                       NULL,NULL,NULL,
 41:                       &daf);

 43:   DMSetFromOptions(daf);

 45:   DMCoarsen(daf,MPI_COMM_NULL,&dac);

 47:   DMDASetUniformCoordinates(dac, -1.0,1.0, -1.0,1.0, -1.0,1.0);
 48:   DMDASetUniformCoordinates(daf, -1.0,1.0, -1.0,1.0, -1.0,1.0);

 50:   {
 51:     DM         cdaf,cdac;
 52:     Vec        coordsc,coordsf,coordsf2;
 53:     Mat        inject;
 54:     VecScatter vscat;
 55:     Mat        interp;
 56:     PetscReal  norm;

 58:     DMGetCoordinateDM(dac,&cdac);
 59:     DMGetCoordinateDM(daf,&cdaf);

 61:     DMGetCoordinates(dac,&coordsc);
 62:     DMGetCoordinates(daf,&coordsf);

 64:     DMCreateInjection(cdac,cdaf,&inject);
 65:     MatScatterGetVecScatter(inject,&vscat);
 66:     VecScatterBegin(vscat,coordsf,coordsc,INSERT_VALUES,SCATTER_FORWARD);
 67:     VecScatterEnd(vscat  ,coordsf,coordsc,INSERT_VALUES,SCATTER_FORWARD);
 68:     MatDestroy(&inject);

 70:     DMCreateInterpolation(cdac,cdaf,&interp,NULL);
 71:     VecDuplicate(coordsf,&coordsf2);
 72:     MatInterpolate(interp,coordsc,coordsf2);
 73:     VecAXPY(coordsf2,-1.0,coordsf);
 74:     VecNorm(coordsf2,NORM_MAX,&norm);
 75:     /* The fine coordinates are only reproduced in certain cases */
 76:     if (!bx && !by && !bz && norm > PETSC_SQRT_MACHINE_EPSILON) {PetscPrintf(PETSC_COMM_WORLD,"Norm %g\n",(double)norm);}
 77:     VecDestroy(&coordsf2);
 78:     MatDestroy(&interp);
 79:   }

 81:   if (0) {
 82:     DMCreateGlobalVector(dac,&ac);
 83:     VecZeroEntries(ac);

 85:     DMCreateGlobalVector(daf,&af);
 86:     VecZeroEntries(af);

 88:     PetscViewerASCIIOpen(PETSC_COMM_WORLD, "dac_7.vtk", &vv);
 89:     PetscViewerPushFormat(vv, PETSC_VIEWER_ASCII_VTK);
 90:     DMView(dac, vv);
 91:     VecView(ac, vv);
 92:     PetscViewerPopFormat(vv);
 93:     PetscViewerDestroy(&vv);

 95:     PetscViewerASCIIOpen(PETSC_COMM_WORLD, "daf_7.vtk", &vv);
 96:     PetscViewerPushFormat(vv, PETSC_VIEWER_ASCII_VTK);
 97:     DMView(daf, vv);
 98:     VecView(af, vv);
 99:     PetscViewerPopFormat(vv);
100:     PetscViewerDestroy(&vv);
101:     VecDestroy(&ac);
102:     VecDestroy(&af);
103:   }
104:   DMDestroy(&dac);
105:   DMDestroy(&daf);
106:   return(0);
107: }

111: int main(int argc,char **argv)
112: {
114:   PetscInt       mx,my,mz;

116:   PetscInitialize(&argc,&argv,0,help);
117:   mx   = 2;
118:   my   = 2;
119:   mz   = 2;
120:   PetscOptionsGetInt(NULL,NULL,"-mx", &mx, 0);
121:   PetscOptionsGetInt(NULL,NULL,"-my", &my, 0);
122:   PetscOptionsGetInt(NULL,NULL,"-mz", &mz, 0);

124:   test1_DAInjection3d(mx,my,mz);

126:   PetscFinalize();
127:   return 0;
128: }