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