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 DM dac,daf; 11c4762a1bSJed Brown PetscViewer vv; 12c4762a1bSJed Brown Vec ac,af; 13c4762a1bSJed Brown PetscInt periodicity; 14c4762a1bSJed Brown DMBoundaryType bx,by,bz; 15c4762a1bSJed Brown 16c4762a1bSJed Brown PetscFunctionBeginUser; 17c4762a1bSJed Brown bx = DM_BOUNDARY_NONE; 18c4762a1bSJed Brown by = DM_BOUNDARY_NONE; 19c4762a1bSJed Brown bz = DM_BOUNDARY_NONE; 20c4762a1bSJed Brown 21c4762a1bSJed Brown periodicity = 0; 22c4762a1bSJed Brown 239566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL,NULL,"-periodic", &periodicity, NULL)); 24c4762a1bSJed Brown if (periodicity==1) { 25c4762a1bSJed Brown bx = DM_BOUNDARY_PERIODIC; 26c4762a1bSJed Brown } else if (periodicity==2) { 27c4762a1bSJed Brown by = DM_BOUNDARY_PERIODIC; 28c4762a1bSJed Brown } else if (periodicity==3) { 29c4762a1bSJed Brown bz = DM_BOUNDARY_PERIODIC; 30c4762a1bSJed Brown } 31c4762a1bSJed Brown 32d0609cedSBarry Smith PetscCall(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 */ 33d0609cedSBarry Smith 1, /* stencil = 1 */NULL,NULL,NULL,&daf)); 349566063dSJacob Faibussowitsch PetscCall(DMSetFromOptions(daf)); 359566063dSJacob Faibussowitsch PetscCall(DMSetUp(daf)); 36c4762a1bSJed Brown 379566063dSJacob Faibussowitsch PetscCall(DMCoarsen(daf,MPI_COMM_NULL,&dac)); 38c4762a1bSJed Brown 399566063dSJacob Faibussowitsch PetscCall(DMDASetUniformCoordinates(dac, -1.0,1.0, -1.0,1.0, -1.0,1.0)); 409566063dSJacob Faibussowitsch PetscCall(DMDASetUniformCoordinates(daf, -1.0,1.0, -1.0,1.0, -1.0,1.0)); 41c4762a1bSJed Brown 42c4762a1bSJed Brown { 43c4762a1bSJed Brown DM cdaf,cdac; 44c4762a1bSJed Brown Vec coordsc,coordsf,coordsf2; 45c4762a1bSJed Brown Mat inject; 46c4762a1bSJed Brown VecScatter vscat; 47c4762a1bSJed Brown Mat interp; 48c4762a1bSJed Brown PetscReal norm; 49c4762a1bSJed Brown 509566063dSJacob Faibussowitsch PetscCall(DMGetCoordinateDM(dac,&cdac)); 519566063dSJacob Faibussowitsch PetscCall(DMGetCoordinateDM(daf,&cdaf)); 52c4762a1bSJed Brown 539566063dSJacob Faibussowitsch PetscCall(DMGetCoordinates(dac,&coordsc)); 549566063dSJacob Faibussowitsch PetscCall(DMGetCoordinates(daf,&coordsf)); 55c4762a1bSJed Brown 569566063dSJacob Faibussowitsch PetscCall(DMCreateInjection(cdac,cdaf,&inject)); 579566063dSJacob Faibussowitsch PetscCall(MatScatterGetVecScatter(inject,&vscat)); 589566063dSJacob Faibussowitsch PetscCall(VecScatterBegin(vscat,coordsf,coordsc,INSERT_VALUES,SCATTER_FORWARD)); 599566063dSJacob Faibussowitsch PetscCall(VecScatterEnd(vscat ,coordsf,coordsc,INSERT_VALUES,SCATTER_FORWARD)); 609566063dSJacob Faibussowitsch PetscCall(MatDestroy(&inject)); 61c4762a1bSJed Brown 629566063dSJacob Faibussowitsch PetscCall(DMCreateInterpolation(cdac,cdaf,&interp,NULL)); 639566063dSJacob Faibussowitsch PetscCall(VecDuplicate(coordsf,&coordsf2)); 649566063dSJacob Faibussowitsch PetscCall(MatInterpolate(interp,coordsc,coordsf2)); 659566063dSJacob Faibussowitsch PetscCall(VecAXPY(coordsf2,-1.0,coordsf)); 669566063dSJacob Faibussowitsch PetscCall(VecNorm(coordsf2,NORM_MAX,&norm)); 67c4762a1bSJed Brown /* The fine coordinates are only reproduced in certain cases */ 689566063dSJacob Faibussowitsch if (!bx && !by && !bz && norm > PETSC_SQRT_MACHINE_EPSILON) PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Norm %g\n",(double)norm)); 699566063dSJacob Faibussowitsch PetscCall(VecDestroy(&coordsf2)); 709566063dSJacob Faibussowitsch PetscCall(MatDestroy(&interp)); 71c4762a1bSJed Brown } 72c4762a1bSJed Brown 73c4762a1bSJed Brown if (0) { 749566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(dac,&ac)); 759566063dSJacob Faibussowitsch PetscCall(VecZeroEntries(ac)); 76c4762a1bSJed Brown 779566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(daf,&af)); 789566063dSJacob Faibussowitsch PetscCall(VecZeroEntries(af)); 79c4762a1bSJed Brown 809566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIOpen(PETSC_COMM_WORLD, "dac_7.vtu", &vv)); 819566063dSJacob Faibussowitsch PetscCall(VecView(ac, vv)); 829566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&vv)); 83c4762a1bSJed Brown 849566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIOpen(PETSC_COMM_WORLD, "daf_7.vtu", &vv)); 859566063dSJacob Faibussowitsch PetscCall(VecView(af, vv)); 869566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&vv)); 879566063dSJacob Faibussowitsch PetscCall(VecDestroy(&ac)); 889566063dSJacob Faibussowitsch PetscCall(VecDestroy(&af)); 89c4762a1bSJed Brown } 909566063dSJacob Faibussowitsch PetscCall(DMDestroy(&dac)); 919566063dSJacob Faibussowitsch PetscCall(DMDestroy(&daf)); 92c4762a1bSJed Brown PetscFunctionReturn(0); 93c4762a1bSJed Brown } 94c4762a1bSJed Brown 95c4762a1bSJed Brown int main(int argc,char **argv) 96c4762a1bSJed Brown { 97c4762a1bSJed Brown PetscInt mx,my,mz; 98c4762a1bSJed Brown 99*327415f7SBarry Smith PetscFunctionBeginUser; 1009566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc,&argv,0,help)); 101c4762a1bSJed Brown mx = 2; 102c4762a1bSJed Brown my = 2; 103c4762a1bSJed Brown mz = 2; 1049566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL,NULL,"-mx", &mx, 0)); 1059566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL,NULL,"-my", &my, 0)); 1069566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL,NULL,"-mz", &mz, 0)); 1079566063dSJacob Faibussowitsch PetscCall(test1_DAInjection3d(mx,my,mz)); 1089566063dSJacob 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