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 8c4762a1bSJed Brown PetscErrorCode test1_DAInjection3d(PetscInt mx, PetscInt my, PetscInt mz) 9c4762a1bSJed Brown { 10c4762a1bSJed Brown PetscErrorCode ierr; 11c4762a1bSJed Brown DM dac,daf; 12c4762a1bSJed Brown PetscViewer vv; 13c4762a1bSJed Brown Vec ac,af; 14c4762a1bSJed Brown PetscInt periodicity; 15c4762a1bSJed Brown DMBoundaryType bx,by,bz; 16c4762a1bSJed Brown 17c4762a1bSJed Brown PetscFunctionBeginUser; 18c4762a1bSJed Brown bx = DM_BOUNDARY_NONE; 19c4762a1bSJed Brown by = DM_BOUNDARY_NONE; 20c4762a1bSJed Brown bz = DM_BOUNDARY_NONE; 21c4762a1bSJed Brown 22c4762a1bSJed Brown periodicity = 0; 23c4762a1bSJed Brown 245f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-periodic", &periodicity, NULL)); 25c4762a1bSJed Brown if (periodicity==1) { 26c4762a1bSJed Brown bx = DM_BOUNDARY_PERIODIC; 27c4762a1bSJed Brown } else if (periodicity==2) { 28c4762a1bSJed Brown by = DM_BOUNDARY_PERIODIC; 29c4762a1bSJed Brown } else if (periodicity==3) { 30c4762a1bSJed Brown bz = DM_BOUNDARY_PERIODIC; 31c4762a1bSJed Brown } 32c4762a1bSJed Brown 33c4762a1bSJed 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 */ 34c4762a1bSJed Brown 1, /* stencil = 1 */NULL,NULL,NULL,&daf);CHKERRQ(ierr); 355f80ce2aSJacob Faibussowitsch CHKERRQ(DMSetFromOptions(daf)); 365f80ce2aSJacob Faibussowitsch CHKERRQ(DMSetUp(daf)); 37c4762a1bSJed Brown 385f80ce2aSJacob Faibussowitsch CHKERRQ(DMCoarsen(daf,MPI_COMM_NULL,&dac)); 39c4762a1bSJed Brown 405f80ce2aSJacob Faibussowitsch CHKERRQ(DMDASetUniformCoordinates(dac, -1.0,1.0, -1.0,1.0, -1.0,1.0)); 415f80ce2aSJacob Faibussowitsch CHKERRQ(DMDASetUniformCoordinates(daf, -1.0,1.0, -1.0,1.0, -1.0,1.0)); 42c4762a1bSJed Brown 43c4762a1bSJed Brown { 44c4762a1bSJed Brown DM cdaf,cdac; 45c4762a1bSJed Brown Vec coordsc,coordsf,coordsf2; 46c4762a1bSJed Brown Mat inject; 47c4762a1bSJed Brown VecScatter vscat; 48c4762a1bSJed Brown Mat interp; 49c4762a1bSJed Brown PetscReal norm; 50c4762a1bSJed Brown 515f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetCoordinateDM(dac,&cdac)); 525f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetCoordinateDM(daf,&cdaf)); 53c4762a1bSJed Brown 545f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetCoordinates(dac,&coordsc)); 555f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetCoordinates(daf,&coordsf)); 56c4762a1bSJed Brown 575f80ce2aSJacob Faibussowitsch CHKERRQ(DMCreateInjection(cdac,cdaf,&inject)); 585f80ce2aSJacob Faibussowitsch CHKERRQ(MatScatterGetVecScatter(inject,&vscat)); 595f80ce2aSJacob Faibussowitsch CHKERRQ(VecScatterBegin(vscat,coordsf,coordsc,INSERT_VALUES,SCATTER_FORWARD)); 605f80ce2aSJacob Faibussowitsch CHKERRQ(VecScatterEnd(vscat ,coordsf,coordsc,INSERT_VALUES,SCATTER_FORWARD)); 615f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&inject)); 62c4762a1bSJed Brown 635f80ce2aSJacob Faibussowitsch CHKERRQ(DMCreateInterpolation(cdac,cdaf,&interp,NULL)); 645f80ce2aSJacob Faibussowitsch CHKERRQ(VecDuplicate(coordsf,&coordsf2)); 655f80ce2aSJacob Faibussowitsch CHKERRQ(MatInterpolate(interp,coordsc,coordsf2)); 665f80ce2aSJacob Faibussowitsch CHKERRQ(VecAXPY(coordsf2,-1.0,coordsf)); 675f80ce2aSJacob Faibussowitsch CHKERRQ(VecNorm(coordsf2,NORM_MAX,&norm)); 68c4762a1bSJed Brown /* The fine coordinates are only reproduced in certain cases */ 695f80ce2aSJacob Faibussowitsch if (!bx && !by && !bz && norm > PETSC_SQRT_MACHINE_EPSILON) CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Norm %g\n",(double)norm)); 705f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&coordsf2)); 715f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&interp)); 72c4762a1bSJed Brown } 73c4762a1bSJed Brown 74c4762a1bSJed Brown if (0) { 755f80ce2aSJacob Faibussowitsch CHKERRQ(DMCreateGlobalVector(dac,&ac)); 765f80ce2aSJacob Faibussowitsch CHKERRQ(VecZeroEntries(ac)); 77c4762a1bSJed Brown 785f80ce2aSJacob Faibussowitsch CHKERRQ(DMCreateGlobalVector(daf,&af)); 795f80ce2aSJacob Faibussowitsch CHKERRQ(VecZeroEntries(af)); 80c4762a1bSJed Brown 815f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIOpen(PETSC_COMM_WORLD, "dac_7.vtu", &vv)); 825f80ce2aSJacob Faibussowitsch CHKERRQ(VecView(ac, vv)); 835f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerDestroy(&vv)); 84c4762a1bSJed Brown 855f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIOpen(PETSC_COMM_WORLD, "daf_7.vtu", &vv)); 865f80ce2aSJacob Faibussowitsch CHKERRQ(VecView(af, vv)); 875f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerDestroy(&vv)); 885f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&ac)); 895f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&af)); 90c4762a1bSJed Brown } 915f80ce2aSJacob Faibussowitsch CHKERRQ(DMDestroy(&dac)); 925f80ce2aSJacob Faibussowitsch CHKERRQ(DMDestroy(&daf)); 93c4762a1bSJed Brown PetscFunctionReturn(0); 94c4762a1bSJed Brown } 95c4762a1bSJed Brown 96c4762a1bSJed Brown int main(int argc,char **argv) 97c4762a1bSJed Brown { 98c4762a1bSJed Brown PetscInt mx,my,mz; 99c4762a1bSJed Brown 100*b122ec5aSJacob Faibussowitsch CHKERRQ(PetscInitialize(&argc,&argv,0,help)); 101c4762a1bSJed Brown mx = 2; 102c4762a1bSJed Brown my = 2; 103c4762a1bSJed Brown mz = 2; 1045f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-mx", &mx, 0)); 1055f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-my", &my, 0)); 1065f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-mz", &mz, 0)); 1075f80ce2aSJacob Faibussowitsch CHKERRQ(test1_DAInjection3d(mx,my,mz)); 108*b122ec5aSJacob Faibussowitsch CHKERRQ(PetscFinalize()); 109*b122ec5aSJacob 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 117c4762a1bSJed Brown 118c4762a1bSJed Brown test: 119c4762a1bSJed Brown suffix: 2 120c4762a1bSJed Brown nsize: 5 121c4762a1bSJed Brown args: -mx 29 -my 30 -mz 30 -periodic 1 -da_processors_x 5 122c4762a1bSJed Brown 123c4762a1bSJed Brown test: 124c4762a1bSJed Brown suffix: 3 125c4762a1bSJed Brown nsize: 5 126c4762a1bSJed Brown args: -mx 30 -my 29 -mz 30 -periodic 2 -da_processors_x 5 127c4762a1bSJed Brown 128c4762a1bSJed Brown test: 129c4762a1bSJed Brown suffix: 4 130c4762a1bSJed Brown nsize: 5 131c4762a1bSJed Brown args: -mx 30 -my 30 -mz 29 -periodic 3 -da_processors_x 5 132c4762a1bSJed Brown 133c4762a1bSJed Brown test: 134c4762a1bSJed Brown suffix: 5 135c4762a1bSJed Brown nsize: 5 136c4762a1bSJed Brown args: -mx 30 -my 30 -mz 30 -periodic 0 -da_processors_y 5 137c4762a1bSJed Brown 138c4762a1bSJed Brown test: 139c4762a1bSJed Brown suffix: 6 140c4762a1bSJed Brown nsize: 5 141c4762a1bSJed Brown args: -mx 29 -my 30 -mz 30 -periodic 1 -da_processors_y 5 142c4762a1bSJed Brown 143c4762a1bSJed Brown test: 144c4762a1bSJed Brown suffix: 7 145c4762a1bSJed Brown nsize: 5 146c4762a1bSJed Brown args: -mx 30 -my 29 -mz 30 -periodic 2 -da_processors_y 5 147c4762a1bSJed Brown 148c4762a1bSJed Brown test: 149c4762a1bSJed Brown suffix: 8 150c4762a1bSJed Brown nsize: 5 151c4762a1bSJed Brown args: -mx 30 -my 30 -mz 29 -periodic 3 -da_processors_y 5 152c4762a1bSJed Brown 153c4762a1bSJed Brown test: 154c4762a1bSJed Brown suffix: 9 155c4762a1bSJed Brown nsize: 5 156c4762a1bSJed Brown args: -mx 30 -my 30 -mz 30 -periodic 0 -da_processors_z 5 157c4762a1bSJed Brown 158c4762a1bSJed Brown test: 159c4762a1bSJed Brown suffix: 10 160c4762a1bSJed Brown nsize: 5 161c4762a1bSJed Brown args: -mx 29 -my 30 -mz 30 -periodic 1 -da_processors_z 5 162c4762a1bSJed Brown 163c4762a1bSJed Brown test: 164c4762a1bSJed Brown suffix: 11 165c4762a1bSJed Brown nsize: 5 166c4762a1bSJed Brown args: -mx 30 -my 29 -mz 30 -periodic 2 -da_processors_z 5 167c4762a1bSJed Brown 168c4762a1bSJed Brown test: 169c4762a1bSJed Brown suffix: 12 170c4762a1bSJed Brown nsize: 5 171c4762a1bSJed Brown args: -mx 30 -my 30 -mz 29 -periodic 3 -da_processors_z 5 172c4762a1bSJed Brown 173c4762a1bSJed Brown test: 174c4762a1bSJed Brown suffix: 13 175c4762a1bSJed Brown nsize: 5 176c4762a1bSJed Brown args: -mx 30 -my 30 -mz 30 -periodic 0 177c4762a1bSJed Brown 178c4762a1bSJed Brown test: 179c4762a1bSJed Brown suffix: 14 180c4762a1bSJed Brown nsize: 5 181c4762a1bSJed Brown args: -mx 29 -my 30 -mz 30 -periodic 1 182c4762a1bSJed Brown 183c4762a1bSJed Brown test: 184c4762a1bSJed Brown suffix: 15 185c4762a1bSJed Brown nsize: 5 186c4762a1bSJed Brown args: -mx 30 -my 29 -mz 30 -periodic 2 187c4762a1bSJed Brown 188c4762a1bSJed Brown test: 189c4762a1bSJed Brown suffix: 16 190c4762a1bSJed Brown nsize: 5 191c4762a1bSJed Brown args: -mx 30 -my 30 -mz 29 -periodic 3 192c4762a1bSJed Brown 193c4762a1bSJed Brown TEST*/ 194