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