1 static char help[] = "Tests DMGetCompatibility() with a 3D DMDA.\n\n"; 2 3 #include <petscdm.h> 4 #include <petscdmda.h> 5 #include <petscdmstag.h> 6 7 int main(int argc,char **argv) { 8 PetscInt M = 3,N = 5,P=3,s=1,w=2,i,m = PETSC_DECIDE,n = PETSC_DECIDE,p = PETSC_DECIDE; 9 PetscErrorCode ierr; 10 PetscInt *lx = NULL,*ly = NULL,*lz = NULL; 11 PetscBool test_order = PETSC_FALSE; 12 DM da; 13 DMBoundaryType bx = DM_BOUNDARY_NONE,by = DM_BOUNDARY_NONE,bz = DM_BOUNDARY_NONE; 14 DMDAStencilType stencil_type = DMDA_STENCIL_BOX; 15 PetscBool flg = PETSC_FALSE,distribute = PETSC_FALSE; 16 17 ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr; 18 19 /* Read options */ 20 ierr = PetscOptionsGetInt(NULL,NULL,"-NX",&M,NULL);CHKERRQ(ierr); 21 ierr = PetscOptionsGetInt(NULL,NULL,"-NY",&N,NULL);CHKERRQ(ierr); 22 ierr = PetscOptionsGetInt(NULL,NULL,"-NZ",&P,NULL);CHKERRQ(ierr); 23 ierr = PetscOptionsGetInt(NULL,NULL,"-m",&m,NULL);CHKERRQ(ierr); 24 ierr = PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL);CHKERRQ(ierr); 25 ierr = PetscOptionsGetInt(NULL,NULL,"-p",&p,NULL);CHKERRQ(ierr); 26 ierr = PetscOptionsGetInt(NULL,NULL,"-s",&s,NULL);CHKERRQ(ierr); 27 ierr = PetscOptionsGetInt(NULL,NULL,"-w",&w,NULL);CHKERRQ(ierr); 28 flg = PETSC_FALSE; 29 ierr = PetscOptionsGetBool(NULL,NULL,"-star",&flg,NULL);CHKERRQ(ierr); 30 if (flg) stencil_type = DMDA_STENCIL_STAR; 31 flg = PETSC_FALSE; 32 ierr = PetscOptionsGetBool(NULL,NULL,"-box",&flg,NULL);CHKERRQ(ierr); 33 if (flg) stencil_type = DMDA_STENCIL_BOX; 34 35 flg = PETSC_FALSE; 36 ierr = PetscOptionsGetBool(NULL,NULL,"-xperiodic",&flg,NULL);CHKERRQ(ierr); 37 if (flg) bx = DM_BOUNDARY_PERIODIC; 38 flg = PETSC_FALSE; 39 ierr = PetscOptionsGetBool(NULL,NULL,"-xghosted",&flg,NULL);CHKERRQ(ierr); 40 if (flg) bx = DM_BOUNDARY_GHOSTED; 41 flg = PETSC_FALSE; 42 ierr = PetscOptionsGetBool(NULL,NULL,"-xnonghosted",&flg,NULL);CHKERRQ(ierr); 43 44 flg = PETSC_FALSE; 45 ierr = PetscOptionsGetBool(NULL,NULL,"-yperiodic",&flg,NULL);CHKERRQ(ierr); 46 if (flg) by = DM_BOUNDARY_PERIODIC; 47 flg = PETSC_FALSE; 48 ierr = PetscOptionsGetBool(NULL,NULL,"-yghosted",&flg,NULL);CHKERRQ(ierr); 49 if (flg) by = DM_BOUNDARY_GHOSTED; 50 flg = PETSC_FALSE; 51 ierr = PetscOptionsGetBool(NULL,NULL,"-ynonghosted",&flg,NULL);CHKERRQ(ierr); 52 53 flg = PETSC_FALSE; 54 ierr = PetscOptionsGetBool(NULL,NULL,"-zperiodic",&flg,NULL);CHKERRQ(ierr); 55 if (flg) bz = DM_BOUNDARY_PERIODIC; 56 flg = PETSC_FALSE; 57 ierr = PetscOptionsGetBool(NULL,NULL,"-zghosted",&flg,NULL);CHKERRQ(ierr); 58 if (flg) bz = DM_BOUNDARY_GHOSTED; 59 flg = PETSC_FALSE; 60 ierr = PetscOptionsGetBool(NULL,NULL,"-znonghosted",&flg,NULL);CHKERRQ(ierr); 61 62 ierr = PetscOptionsGetBool(NULL,NULL,"-testorder",&test_order,NULL);CHKERRQ(ierr); 63 64 flg = PETSC_FALSE; 65 ierr = PetscOptionsGetBool(NULL,NULL,"-distribute",&distribute,NULL);CHKERRQ(ierr); 66 if (distribute) { 67 if (m == PETSC_DECIDE) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_USER_INPUT,"Must set -m option with -distribute option"); 68 ierr = PetscMalloc1(m,&lx);CHKERRQ(ierr); 69 for (i=0; i<m-1; i++) lx[i] = 4; 70 lx[m-1] = M - 4*(m-1); 71 if (n == PETSC_DECIDE) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_USER_INPUT,"Must set -n option with -distribute option"); 72 ierr = PetscMalloc1(n,&ly);CHKERRQ(ierr); 73 for (i=0; i<n-1; i++) ly[i] = 2; 74 ly[n-1] = N - 2*(n-1); 75 if (p == PETSC_DECIDE) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_USER_INPUT,"Must set -p option with -distribute option"); 76 ierr = PetscMalloc1(p,&lz);CHKERRQ(ierr); 77 for (i=0; i<p-1; i++) lz[i] = 2; 78 lz[p-1] = P - 2*(p-1); 79 } 80 81 ierr = DMDACreate3d(PETSC_COMM_WORLD,bx,by,bz,stencil_type,M,N,P,m,n,p,w,s,lx,ly,lz,&da);CHKERRQ(ierr); 82 ierr = DMSetFromOptions(da);CHKERRQ(ierr); 83 ierr = DMSetUp(da);CHKERRQ(ierr); 84 85 /* Check self-compatibility */ 86 { 87 PetscBool compatible,set; 88 ierr = DMGetCompatibility(da,da,&compatible,&set);CHKERRQ(ierr); 89 if (!set || !compatible) { 90 ierr = PetscPrintf(PetscObjectComm((PetscObject)da),"Error: DM not compatible with itself\n");CHKERRQ(ierr); 91 } 92 } 93 94 /* Check compatibility with the same DM on a dup'd communicator */ 95 { 96 DM da2; 97 PetscBool compatible,set; 98 MPI_Comm comm2; 99 ierr = MPI_Comm_dup(PETSC_COMM_WORLD,&comm2);CHKERRMPI(ierr); 100 ierr = DMDACreate3d(comm2,bx,by,bz,stencil_type,M,N,P,m,n,p,w,s,lx,ly,lz,&da2);CHKERRQ(ierr); 101 ierr = DMSetFromOptions(da2);CHKERRQ(ierr); 102 ierr = DMSetUp(da2);CHKERRQ(ierr); 103 ierr = DMGetCompatibility(da,da2,&compatible,&set);CHKERRQ(ierr); 104 if (!set || !compatible) { 105 ierr = PetscPrintf(PetscObjectComm((PetscObject)da),"Error: DM not compatible with DMDA on dup'd comm\n");CHKERRQ(ierr); 106 } 107 ierr = DMDestroy(&da2);CHKERRQ(ierr); 108 ierr = MPI_Comm_free(&comm2);CHKERRMPI(ierr); 109 } 110 111 /* Check compatibility with a derived DMDA */ 112 { 113 DM da2; 114 PetscBool compatible,set; 115 ierr = DMDACreateCompatibleDMDA(da,w*2,&da2);CHKERRQ(ierr); 116 ierr = DMGetCompatibility(da,da2,&compatible,&set);CHKERRQ(ierr); 117 if (!set || !compatible) { 118 ierr = PetscPrintf(PetscObjectComm((PetscObject)da),"Error: DM not compatible with DMDA created with DMDACreateCompatibleDMDA()\n");CHKERRQ(ierr); 119 } 120 ierr = DMDestroy(&da2);CHKERRQ(ierr); 121 } 122 123 /* Confirm incompatibility with different stencil width */ 124 { 125 DM da2; 126 PetscBool compatible,set; 127 ierr = DMDACreate3d(PETSC_COMM_WORLD,bx,by,bz,stencil_type,M,N,P,m,n,p,w,0,lx,ly,lz,&da2);CHKERRQ(ierr); 128 ierr = DMSetUp(da2);CHKERRQ(ierr); 129 ierr = DMGetCompatibility(da,da2,&compatible,&set);CHKERRQ(ierr); 130 if (!set || compatible) { 131 ierr = PetscPrintf(PetscObjectComm((PetscObject)da),"Error: DM not determined incompatible with known-incompatible DMDA (different stencil width)\n");CHKERRQ(ierr); 132 } 133 ierr = DMDestroy(&da2);CHKERRQ(ierr); 134 } 135 136 /* Confirm incompatibility with different boundary types */ 137 { 138 DM da2; 139 PetscBool compatible,set; 140 DMBoundaryType bz2; 141 bz2 = bz == DM_BOUNDARY_NONE ? DM_BOUNDARY_GHOSTED : DM_BOUNDARY_NONE; 142 ierr = DMDACreate3d(PETSC_COMM_WORLD,bx,by,bz2,stencil_type,M,N,P,m,n,p,w,s,lx,ly,lz,&da2);CHKERRQ(ierr); 143 ierr = DMSetUp(da2);CHKERRQ(ierr); 144 ierr = DMGetCompatibility(da,da2,&compatible,&set);CHKERRQ(ierr); 145 if (!set || compatible) { 146 ierr = PetscPrintf(PetscObjectComm((PetscObject)da),"Error: DM not determined incompatible with known-incompatible DMDA (different boundary type)\n");CHKERRQ(ierr); 147 } 148 ierr = DMDestroy(&da2);CHKERRQ(ierr); 149 } 150 151 if (!distribute) { 152 /* Confirm incompatibility with different global sizes */ 153 { 154 DM da2; 155 PetscBool compatible,set; 156 ierr = DMDACreate3d(PETSC_COMM_WORLD,bx,by,bz,stencil_type,M,N,P*2,m,n,p,w,s,lx,ly,lz,&da2);CHKERRQ(ierr); 157 ierr = DMSetUp(da2);CHKERRQ(ierr); 158 ierr = DMGetCompatibility(da,da2,&compatible,&set);CHKERRQ(ierr); 159 if (!set || compatible) { 160 ierr = PetscPrintf(PetscObjectComm((PetscObject)da),"Error: DM not determined incompatible with known-incompatible DMDA (different global sizes)\n");CHKERRQ(ierr); 161 } 162 ierr = DMDestroy(&da2);CHKERRQ(ierr); 163 } 164 } 165 166 if (distribute && p > 1) { 167 /* Confirm incompatibility with different local size */ 168 { 169 DM da2; 170 PetscBool compatible,set; 171 PetscMPIInt rank; 172 PetscInt *lz2; 173 ierr = PetscMalloc1(p,&lz2);CHKERRQ(ierr); 174 for (i=0; i<p-1; i++) lz2[i] = 1; /* One point per rank instead of 2 */ 175 lz2[p-1] = P - (p-1); 176 ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr); 177 ierr = DMDACreate3d(PETSC_COMM_WORLD,bx,by,bz,stencil_type,M,N,P,m,n,p,w,s,lx,ly,lz2,&da2);CHKERRQ(ierr); 178 ierr = DMSetUp(da2);CHKERRQ(ierr); 179 ierr = DMGetCompatibility(da,da2,&compatible,&set);CHKERRQ(ierr); 180 if (!set || compatible) { 181 ierr = PetscPrintf(PetscObjectComm((PetscObject)da),"Error: DM not determined incompatible with known-incompatible DMDA (different local sizes) \n");CHKERRQ(ierr); 182 } 183 ierr = DMDestroy(&da2);CHKERRQ(ierr); 184 ierr = PetscFree(lz2);CHKERRQ(ierr); 185 } 186 } 187 188 /* Check compatibility with a DM of different type (DMStag) */ 189 { 190 DM dm2; 191 PetscBool compatible,set; 192 ierr = DMStagCreate3d(PETSC_COMM_WORLD,bx,by,bz,M,N,P,m,n,p,1,1,1,1,DMSTAG_STENCIL_STAR,w,lx,ly,lz,&dm2);CHKERRQ(ierr); 193 ierr = DMSetUp(dm2);CHKERRQ(ierr); 194 ierr = DMGetCompatibility(da,dm2,&compatible,&set);CHKERRQ(ierr); 195 /* Don't interpret the result, but note that one can run with -info */ 196 ierr = DMDestroy(&dm2);CHKERRQ(ierr); 197 } 198 199 /* Free memory */ 200 ierr = PetscFree(lx);CHKERRQ(ierr); 201 ierr = PetscFree(ly);CHKERRQ(ierr); 202 ierr = PetscFree(lz);CHKERRQ(ierr); 203 ierr = DMDestroy(&da);CHKERRQ(ierr); 204 ierr = PetscFinalize(); 205 return ierr; 206 } 207 208 /*TEST 209 210 test: 211 suffix: 1 212 213 test: 214 suffix: 2 215 nsize: 3 216 args: distribute -m 1 -n 1 -p 3 -NZ 20 217 218 TEST*/ 219