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*9566063dSJacob Faibussowitsch PetscCall(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 */ 34*9566063dSJacob Faibussowitsch 1, /* stencil = 1 */NULL,NULL,NULL,&daf);PetscCall(ierr); 35*9566063dSJacob Faibussowitsch PetscCall(DMSetFromOptions(daf)); 36*9566063dSJacob Faibussowitsch PetscCall(DMSetUp(daf)); 37c4762a1bSJed Brown 38*9566063dSJacob Faibussowitsch PetscCall(DMCoarsen(daf,MPI_COMM_NULL,&dac)); 39c4762a1bSJed Brown 40*9566063dSJacob Faibussowitsch PetscCall(DMDASetUniformCoordinates(dac, -1.0,1.0, -1.0,1.0, -1.0,1.0)); 41*9566063dSJacob Faibussowitsch PetscCall(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*9566063dSJacob Faibussowitsch PetscCall(DMGetCoordinateDM(dac,&cdac)); 52*9566063dSJacob Faibussowitsch PetscCall(DMGetCoordinateDM(daf,&cdaf)); 53c4762a1bSJed Brown 54*9566063dSJacob Faibussowitsch PetscCall(DMGetCoordinates(dac,&coordsc)); 55*9566063dSJacob Faibussowitsch PetscCall(DMGetCoordinates(daf,&coordsf)); 56c4762a1bSJed Brown 57*9566063dSJacob Faibussowitsch PetscCall(DMCreateInjection(cdac,cdaf,&inject)); 58*9566063dSJacob Faibussowitsch PetscCall(MatScatterGetVecScatter(inject,&vscat)); 59*9566063dSJacob Faibussowitsch PetscCall(VecScatterBegin(vscat,coordsf,coordsc,INSERT_VALUES,SCATTER_FORWARD)); 60*9566063dSJacob Faibussowitsch PetscCall(VecScatterEnd(vscat ,coordsf,coordsc,INSERT_VALUES,SCATTER_FORWARD)); 61*9566063dSJacob Faibussowitsch PetscCall(MatDestroy(&inject)); 62c4762a1bSJed Brown 63*9566063dSJacob Faibussowitsch PetscCall(DMCreateInterpolation(cdac,cdaf,&interp,NULL)); 64*9566063dSJacob Faibussowitsch PetscCall(VecDuplicate(coordsf,&coordsf2)); 65*9566063dSJacob Faibussowitsch PetscCall(MatInterpolate(interp,coordsc,coordsf2)); 66*9566063dSJacob Faibussowitsch PetscCall(VecAXPY(coordsf2,-1.0,coordsf)); 67*9566063dSJacob Faibussowitsch PetscCall(VecNorm(coordsf2,NORM_MAX,&norm)); 68c4762a1bSJed Brown /* The fine coordinates are only reproduced in certain cases */ 69*9566063dSJacob Faibussowitsch if (!bx && !by && !bz && norm > PETSC_SQRT_MACHINE_EPSILON) PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Norm %g\n",(double)norm)); 70*9566063dSJacob Faibussowitsch PetscCall(VecDestroy(&coordsf2)); 71*9566063dSJacob Faibussowitsch PetscCall(MatDestroy(&interp)); 72c4762a1bSJed Brown } 73c4762a1bSJed Brown 74c4762a1bSJed Brown if (0) { 75*9566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(dac,&ac)); 76*9566063dSJacob Faibussowitsch PetscCall(VecZeroEntries(ac)); 77c4762a1bSJed Brown 78*9566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(daf,&af)); 79*9566063dSJacob Faibussowitsch PetscCall(VecZeroEntries(af)); 80c4762a1bSJed Brown 81*9566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIOpen(PETSC_COMM_WORLD, "dac_7.vtu", &vv)); 82*9566063dSJacob Faibussowitsch PetscCall(VecView(ac, vv)); 83*9566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&vv)); 84c4762a1bSJed Brown 85*9566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIOpen(PETSC_COMM_WORLD, "daf_7.vtu", &vv)); 86*9566063dSJacob Faibussowitsch PetscCall(VecView(af, vv)); 87*9566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&vv)); 88*9566063dSJacob Faibussowitsch PetscCall(VecDestroy(&ac)); 89*9566063dSJacob Faibussowitsch PetscCall(VecDestroy(&af)); 90c4762a1bSJed Brown } 91*9566063dSJacob Faibussowitsch PetscCall(DMDestroy(&dac)); 92*9566063dSJacob Faibussowitsch PetscCall(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*9566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc,&argv,0,help)); 101c4762a1bSJed Brown mx = 2; 102c4762a1bSJed Brown my = 2; 103c4762a1bSJed Brown mz = 2; 104*9566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL,NULL,"-mx", &mx, 0)); 105*9566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL,NULL,"-my", &my, 0)); 106*9566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL,NULL,"-mz", &mz, 0)); 107*9566063dSJacob Faibussowitsch PetscCall(test1_DAInjection3d(mx,my,mz)); 108*9566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 109b122ec5aSJacob 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