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 24*5f80ce2aSJacob 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); 35*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMSetFromOptions(daf)); 36*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMSetUp(daf)); 37c4762a1bSJed Brown 38*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMCoarsen(daf,MPI_COMM_NULL,&dac)); 39c4762a1bSJed Brown 40*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMDASetUniformCoordinates(dac, -1.0,1.0, -1.0,1.0, -1.0,1.0)); 41*5f80ce2aSJacob 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 51*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetCoordinateDM(dac,&cdac)); 52*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetCoordinateDM(daf,&cdaf)); 53c4762a1bSJed Brown 54*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetCoordinates(dac,&coordsc)); 55*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetCoordinates(daf,&coordsf)); 56c4762a1bSJed Brown 57*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMCreateInjection(cdac,cdaf,&inject)); 58*5f80ce2aSJacob Faibussowitsch CHKERRQ(MatScatterGetVecScatter(inject,&vscat)); 59*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecScatterBegin(vscat,coordsf,coordsc,INSERT_VALUES,SCATTER_FORWARD)); 60*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecScatterEnd(vscat ,coordsf,coordsc,INSERT_VALUES,SCATTER_FORWARD)); 61*5f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&inject)); 62c4762a1bSJed Brown 63*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMCreateInterpolation(cdac,cdaf,&interp,NULL)); 64*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecDuplicate(coordsf,&coordsf2)); 65*5f80ce2aSJacob Faibussowitsch CHKERRQ(MatInterpolate(interp,coordsc,coordsf2)); 66*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecAXPY(coordsf2,-1.0,coordsf)); 67*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecNorm(coordsf2,NORM_MAX,&norm)); 68c4762a1bSJed Brown /* The fine coordinates are only reproduced in certain cases */ 69*5f80ce2aSJacob Faibussowitsch if (!bx && !by && !bz && norm > PETSC_SQRT_MACHINE_EPSILON) CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Norm %g\n",(double)norm)); 70*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&coordsf2)); 71*5f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&interp)); 72c4762a1bSJed Brown } 73c4762a1bSJed Brown 74c4762a1bSJed Brown if (0) { 75*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMCreateGlobalVector(dac,&ac)); 76*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecZeroEntries(ac)); 77c4762a1bSJed Brown 78*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMCreateGlobalVector(daf,&af)); 79*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecZeroEntries(af)); 80c4762a1bSJed Brown 81*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIOpen(PETSC_COMM_WORLD, "dac_7.vtu", &vv)); 82*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecView(ac, vv)); 83*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerDestroy(&vv)); 84c4762a1bSJed Brown 85*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIOpen(PETSC_COMM_WORLD, "daf_7.vtu", &vv)); 86*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecView(af, vv)); 87*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerDestroy(&vv)); 88*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&ac)); 89*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&af)); 90c4762a1bSJed Brown } 91*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMDestroy(&dac)); 92*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMDestroy(&daf)); 93c4762a1bSJed Brown PetscFunctionReturn(0); 94c4762a1bSJed Brown } 95c4762a1bSJed Brown 96c4762a1bSJed Brown int main(int argc,char **argv) 97c4762a1bSJed Brown { 98c4762a1bSJed Brown PetscErrorCode ierr; 99c4762a1bSJed Brown PetscInt mx,my,mz; 100c4762a1bSJed Brown 101c4762a1bSJed Brown ierr = PetscInitialize(&argc,&argv,0,help);if (ierr) return ierr; 102c4762a1bSJed Brown mx = 2; 103c4762a1bSJed Brown my = 2; 104c4762a1bSJed Brown mz = 2; 105*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-mx", &mx, 0)); 106*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-my", &my, 0)); 107*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-mz", &mz, 0)); 108*5f80ce2aSJacob Faibussowitsch CHKERRQ(test1_DAInjection3d(mx,my,mz)); 109c4762a1bSJed Brown ierr = PetscFinalize(); 110c4762a1bSJed Brown return ierr; 111c4762a1bSJed Brown } 112c4762a1bSJed Brown 113c4762a1bSJed Brown /*TEST 114c4762a1bSJed Brown 115c4762a1bSJed Brown test: 116c4762a1bSJed Brown nsize: 5 117c4762a1bSJed Brown args: -mx 30 -my 30 -mz 30 -periodic 0 -da_processors_x 5 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 123c4762a1bSJed Brown 124c4762a1bSJed Brown test: 125c4762a1bSJed Brown suffix: 3 126c4762a1bSJed Brown nsize: 5 127c4762a1bSJed Brown args: -mx 30 -my 29 -mz 30 -periodic 2 -da_processors_x 5 128c4762a1bSJed Brown 129c4762a1bSJed Brown test: 130c4762a1bSJed Brown suffix: 4 131c4762a1bSJed Brown nsize: 5 132c4762a1bSJed Brown args: -mx 30 -my 30 -mz 29 -periodic 3 -da_processors_x 5 133c4762a1bSJed Brown 134c4762a1bSJed Brown test: 135c4762a1bSJed Brown suffix: 5 136c4762a1bSJed Brown nsize: 5 137c4762a1bSJed Brown args: -mx 30 -my 30 -mz 30 -periodic 0 -da_processors_y 5 138c4762a1bSJed Brown 139c4762a1bSJed Brown test: 140c4762a1bSJed Brown suffix: 6 141c4762a1bSJed Brown nsize: 5 142c4762a1bSJed Brown args: -mx 29 -my 30 -mz 30 -periodic 1 -da_processors_y 5 143c4762a1bSJed Brown 144c4762a1bSJed Brown test: 145c4762a1bSJed Brown suffix: 7 146c4762a1bSJed Brown nsize: 5 147c4762a1bSJed Brown args: -mx 30 -my 29 -mz 30 -periodic 2 -da_processors_y 5 148c4762a1bSJed Brown 149c4762a1bSJed Brown test: 150c4762a1bSJed Brown suffix: 8 151c4762a1bSJed Brown nsize: 5 152c4762a1bSJed Brown args: -mx 30 -my 30 -mz 29 -periodic 3 -da_processors_y 5 153c4762a1bSJed Brown 154c4762a1bSJed Brown test: 155c4762a1bSJed Brown suffix: 9 156c4762a1bSJed Brown nsize: 5 157c4762a1bSJed Brown args: -mx 30 -my 30 -mz 30 -periodic 0 -da_processors_z 5 158c4762a1bSJed Brown 159c4762a1bSJed Brown test: 160c4762a1bSJed Brown suffix: 10 161c4762a1bSJed Brown nsize: 5 162c4762a1bSJed Brown args: -mx 29 -my 30 -mz 30 -periodic 1 -da_processors_z 5 163c4762a1bSJed Brown 164c4762a1bSJed Brown test: 165c4762a1bSJed Brown suffix: 11 166c4762a1bSJed Brown nsize: 5 167c4762a1bSJed Brown args: -mx 30 -my 29 -mz 30 -periodic 2 -da_processors_z 5 168c4762a1bSJed Brown 169c4762a1bSJed Brown test: 170c4762a1bSJed Brown suffix: 12 171c4762a1bSJed Brown nsize: 5 172c4762a1bSJed Brown args: -mx 30 -my 30 -mz 29 -periodic 3 -da_processors_z 5 173c4762a1bSJed Brown 174c4762a1bSJed Brown test: 175c4762a1bSJed Brown suffix: 13 176c4762a1bSJed Brown nsize: 5 177c4762a1bSJed Brown args: -mx 30 -my 30 -mz 30 -periodic 0 178c4762a1bSJed Brown 179c4762a1bSJed Brown test: 180c4762a1bSJed Brown suffix: 14 181c4762a1bSJed Brown nsize: 5 182c4762a1bSJed Brown args: -mx 29 -my 30 -mz 30 -periodic 1 183c4762a1bSJed Brown 184c4762a1bSJed Brown test: 185c4762a1bSJed Brown suffix: 15 186c4762a1bSJed Brown nsize: 5 187c4762a1bSJed Brown args: -mx 30 -my 29 -mz 30 -periodic 2 188c4762a1bSJed Brown 189c4762a1bSJed Brown test: 190c4762a1bSJed Brown suffix: 16 191c4762a1bSJed Brown nsize: 5 192c4762a1bSJed Brown args: -mx 30 -my 30 -mz 29 -periodic 3 193c4762a1bSJed Brown 194c4762a1bSJed Brown TEST*/ 195