1 2 #include <petsc/private/dmdaimpl.h> /*I "petscdmda.h" I*/ 3 4 PetscErrorCode DMSetFromOptions_DA(PetscOptionItems *PetscOptionsObject,DM da) 5 { 6 PetscErrorCode ierr; 7 DM_DA *dd = (DM_DA*)da->data; 8 PetscInt refine = 0,dim = da->dim,maxnlevels = 100,refx[100],refy[100],refz[100],n,i; 9 PetscBool flg; 10 11 PetscFunctionBegin; 12 PetscValidHeaderSpecific(da,DM_CLASSID,1); 13 14 if (dd->M < 0) SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_ARG_OUTOFRANGE,"Dimension must be non-negative, call DMSetFromOptions() if you want to change the value at runtime"); 15 if (dd->N < 0) SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_ARG_OUTOFRANGE,"Dimension must be non-negative, call DMSetFromOptions() if you want to change the value at runtime"); 16 if (dd->P < 0) SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_ARG_OUTOFRANGE,"Dimension must be non-negative, call DMSetFromOptions() if you want to change the value at runtime"); 17 18 ierr = PetscOptionsHead(PetscOptionsObject,"DMDA Options");CHKERRQ(ierr); 19 ierr = PetscOptionsBoundedInt("-da_grid_x","Number of grid points in x direction","DMDASetSizes",dd->M,&dd->M,NULL,1);CHKERRQ(ierr); 20 ierr = PetscOptionsBoundedInt("-da_grid_y","Number of grid points in y direction","DMDASetSizes",dd->N,&dd->N,NULL,1);CHKERRQ(ierr); 21 ierr = PetscOptionsBoundedInt("-da_grid_z","Number of grid points in z direction","DMDASetSizes",dd->P,&dd->P,NULL,1);CHKERRQ(ierr); 22 23 ierr = PetscOptionsBoundedInt("-da_overlap","Decomposition overlap in all directions","DMDASetOverlap",dd->xol,&dd->xol,&flg,0);CHKERRQ(ierr); 24 if (flg) {ierr = DMDASetOverlap(da,dd->xol,dd->xol,dd->xol);CHKERRQ(ierr);} 25 ierr = PetscOptionsBoundedInt("-da_overlap_x","Decomposition overlap in x direction","DMDASetOverlap",dd->xol,&dd->xol,NULL,0);CHKERRQ(ierr); 26 if (dim > 1) {ierr = PetscOptionsBoundedInt("-da_overlap_y","Decomposition overlap in y direction","DMDASetOverlap",dd->yol,&dd->yol,NULL,0);CHKERRQ(ierr);} 27 if (dim > 2) {ierr = PetscOptionsBoundedInt("-da_overlap_z","Decomposition overlap in z direction","DMDASetOverlap",dd->zol,&dd->zol,NULL,0);CHKERRQ(ierr);} 28 29 ierr = PetscOptionsBoundedInt("-da_local_subdomains","","DMDASetNumLocalSubdomains",dd->Nsub,&dd->Nsub,&flg,PETSC_DECIDE);CHKERRQ(ierr); 30 if (flg) {ierr = DMDASetNumLocalSubDomains(da,dd->Nsub);CHKERRQ(ierr);} 31 32 /* Handle DMDA parallel distribution */ 33 ierr = PetscOptionsBoundedInt("-da_processors_x","Number of processors in x direction","DMDASetNumProcs",dd->m,&dd->m,NULL,PETSC_DECIDE);CHKERRQ(ierr); 34 if (dim > 1) {ierr = PetscOptionsBoundedInt("-da_processors_y","Number of processors in y direction","DMDASetNumProcs",dd->n,&dd->n,NULL,PETSC_DECIDE);CHKERRQ(ierr);} 35 if (dim > 2) {ierr = PetscOptionsBoundedInt("-da_processors_z","Number of processors in z direction","DMDASetNumProcs",dd->p,&dd->p,NULL,PETSC_DECIDE);CHKERRQ(ierr);} 36 /* Handle DMDA refinement */ 37 ierr = PetscOptionsBoundedInt("-da_refine_x","Refinement ratio in x direction","DMDASetRefinementFactor",dd->refine_x,&dd->refine_x,NULL,1);CHKERRQ(ierr); 38 if (dim > 1) {ierr = PetscOptionsBoundedInt("-da_refine_y","Refinement ratio in y direction","DMDASetRefinementFactor",dd->refine_y,&dd->refine_y,NULL,1);CHKERRQ(ierr);} 39 if (dim > 2) {ierr = PetscOptionsBoundedInt("-da_refine_z","Refinement ratio in z direction","DMDASetRefinementFactor",dd->refine_z,&dd->refine_z,NULL,1);CHKERRQ(ierr);} 40 dd->coarsen_x = dd->refine_x; dd->coarsen_y = dd->refine_y; dd->coarsen_z = dd->refine_z; 41 42 /* Get refinement factors, defaults taken from the coarse DMDA */ 43 ierr = DMDAGetRefinementFactor(da,&refx[0],&refy[0],&refz[0]);CHKERRQ(ierr); 44 for (i=1; i<maxnlevels; i++) { 45 refx[i] = refx[0]; 46 refy[i] = refy[0]; 47 refz[i] = refz[0]; 48 } 49 n = maxnlevels; 50 ierr = PetscOptionsIntArray("-da_refine_hierarchy_x","Refinement factor for each level","None",refx,&n,&flg);CHKERRQ(ierr); 51 if (flg) { 52 dd->refine_x = refx[0]; 53 dd->refine_x_hier_n = n; 54 ierr = PetscMalloc1(n,&dd->refine_x_hier);CHKERRQ(ierr); 55 ierr = PetscArraycpy(dd->refine_x_hier,refx,n);CHKERRQ(ierr); 56 } 57 if (dim > 1) { 58 n = maxnlevels; 59 ierr = PetscOptionsIntArray("-da_refine_hierarchy_y","Refinement factor for each level","None",refy,&n,&flg);CHKERRQ(ierr); 60 if (flg) { 61 dd->refine_y = refy[0]; 62 dd->refine_y_hier_n = n; 63 ierr = PetscMalloc1(n,&dd->refine_y_hier);CHKERRQ(ierr); 64 ierr = PetscArraycpy(dd->refine_y_hier,refy,n);CHKERRQ(ierr); 65 } 66 } 67 if (dim > 2) { 68 n = maxnlevels; 69 ierr = PetscOptionsIntArray("-da_refine_hierarchy_z","Refinement factor for each level","None",refz,&n,&flg);CHKERRQ(ierr); 70 if (flg) { 71 dd->refine_z = refz[0]; 72 dd->refine_z_hier_n = n; 73 ierr = PetscMalloc1(n,&dd->refine_z_hier);CHKERRQ(ierr); 74 ierr = PetscArraycpy(dd->refine_z_hier,refz,n);CHKERRQ(ierr); 75 } 76 } 77 78 ierr = PetscOptionsBoundedInt("-da_refine","Uniformly refine DA one or more times","None",refine,&refine,NULL,0);CHKERRQ(ierr); 79 ierr = PetscOptionsTail();CHKERRQ(ierr); 80 81 while (refine--) { 82 if (dd->bx == DM_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0) { 83 dd->M = dd->refine_x*dd->M; 84 } else { 85 dd->M = 1 + dd->refine_x*(dd->M - 1); 86 } 87 if (dd->by == DM_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0) { 88 dd->N = dd->refine_y*dd->N; 89 } else { 90 dd->N = 1 + dd->refine_y*(dd->N - 1); 91 } 92 if (dd->bz == DM_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0) { 93 dd->P = dd->refine_z*dd->P; 94 } else { 95 dd->P = 1 + dd->refine_z*(dd->P - 1); 96 } 97 da->levelup++; 98 if (da->levelup - da->leveldown >= 0) { 99 dd->refine_x = refx[da->levelup - da->leveldown]; 100 dd->refine_y = refy[da->levelup - da->leveldown]; 101 dd->refine_z = refz[da->levelup - da->leveldown]; 102 } 103 if (da->levelup - da->leveldown >= 1) { 104 dd->coarsen_x = refx[da->levelup - da->leveldown - 1]; 105 dd->coarsen_y = refy[da->levelup - da->leveldown - 1]; 106 dd->coarsen_z = refz[da->levelup - da->leveldown - 1]; 107 } 108 } 109 PetscFunctionReturn(0); 110 } 111 112 extern PetscErrorCode DMCreateGlobalVector_DA(DM,Vec*); 113 extern PetscErrorCode DMCreateLocalVector_DA(DM,Vec*); 114 extern PetscErrorCode DMGlobalToLocalBegin_DA(DM,Vec,InsertMode,Vec); 115 extern PetscErrorCode DMGlobalToLocalEnd_DA(DM,Vec,InsertMode,Vec); 116 extern PetscErrorCode DMLocalToGlobalBegin_DA(DM,Vec,InsertMode,Vec); 117 extern PetscErrorCode DMLocalToGlobalEnd_DA(DM,Vec,InsertMode,Vec); 118 extern PetscErrorCode DMLocalToLocalBegin_DA(DM,Vec,InsertMode,Vec); 119 extern PetscErrorCode DMLocalToLocalEnd_DA(DM,Vec,InsertMode,Vec); 120 extern PetscErrorCode DMCreateInterpolation_DA(DM,DM,Mat*,Vec*); 121 extern PetscErrorCode DMCreateColoring_DA(DM,ISColoringType,ISColoring*); 122 extern PetscErrorCode DMCreateMatrix_DA(DM,Mat*); 123 extern PetscErrorCode DMCreateCoordinateDM_DA(DM,DM*); 124 extern PetscErrorCode DMRefine_DA(DM,MPI_Comm,DM*); 125 extern PetscErrorCode DMCoarsen_DA(DM,MPI_Comm,DM*); 126 extern PetscErrorCode DMRefineHierarchy_DA(DM,PetscInt,DM[]); 127 extern PetscErrorCode DMCoarsenHierarchy_DA(DM,PetscInt,DM[]); 128 extern PetscErrorCode DMCreateInjection_DA(DM,DM,Mat*); 129 extern PetscErrorCode DMView_DA(DM,PetscViewer); 130 extern PetscErrorCode DMSetUp_DA(DM); 131 extern PetscErrorCode DMDestroy_DA(DM); 132 extern PetscErrorCode DMCreateDomainDecomposition_DA(DM,PetscInt*,char***,IS**,IS**,DM**); 133 extern PetscErrorCode DMCreateDomainDecompositionScatters_DA(DM,PetscInt,DM*,VecScatter**,VecScatter**,VecScatter**); 134 PETSC_INTERN PetscErrorCode DMGetCompatibility_DA(DM,DM,PetscBool*,PetscBool*); 135 136 PetscErrorCode DMLoad_DA(DM da,PetscViewer viewer) 137 { 138 PetscErrorCode ierr; 139 PetscInt dim,m,n,p,dof,swidth; 140 DMDAStencilType stencil; 141 DMBoundaryType bx,by,bz; 142 PetscBool coors; 143 DM dac; 144 Vec c; 145 146 PetscFunctionBegin; 147 ierr = PetscViewerBinaryRead(viewer,&dim,1,NULL,PETSC_INT);CHKERRQ(ierr); 148 ierr = PetscViewerBinaryRead(viewer,&m,1,NULL,PETSC_INT);CHKERRQ(ierr); 149 ierr = PetscViewerBinaryRead(viewer,&n,1,NULL,PETSC_INT);CHKERRQ(ierr); 150 ierr = PetscViewerBinaryRead(viewer,&p,1,NULL,PETSC_INT);CHKERRQ(ierr); 151 ierr = PetscViewerBinaryRead(viewer,&dof,1,NULL,PETSC_INT);CHKERRQ(ierr); 152 ierr = PetscViewerBinaryRead(viewer,&swidth,1,NULL,PETSC_INT);CHKERRQ(ierr); 153 ierr = PetscViewerBinaryRead(viewer,&bx,1,NULL,PETSC_ENUM);CHKERRQ(ierr); 154 ierr = PetscViewerBinaryRead(viewer,&by,1,NULL,PETSC_ENUM);CHKERRQ(ierr); 155 ierr = PetscViewerBinaryRead(viewer,&bz,1,NULL,PETSC_ENUM);CHKERRQ(ierr); 156 ierr = PetscViewerBinaryRead(viewer,&stencil,1,NULL,PETSC_ENUM);CHKERRQ(ierr); 157 158 ierr = DMSetDimension(da, dim);CHKERRQ(ierr); 159 ierr = DMDASetSizes(da, m,n,p);CHKERRQ(ierr); 160 ierr = DMDASetBoundaryType(da, bx, by, bz);CHKERRQ(ierr); 161 ierr = DMDASetDof(da, dof);CHKERRQ(ierr); 162 ierr = DMDASetStencilType(da, stencil);CHKERRQ(ierr); 163 ierr = DMDASetStencilWidth(da, swidth);CHKERRQ(ierr); 164 ierr = DMSetUp(da);CHKERRQ(ierr); 165 ierr = PetscViewerBinaryRead(viewer,&coors,1,NULL,PETSC_ENUM);CHKERRQ(ierr); 166 if (coors) { 167 ierr = DMGetCoordinateDM(da,&dac);CHKERRQ(ierr); 168 ierr = DMCreateGlobalVector(dac,&c);CHKERRQ(ierr); 169 ierr = VecLoad(c,viewer);CHKERRQ(ierr); 170 ierr = DMSetCoordinates(da,c);CHKERRQ(ierr); 171 ierr = VecDestroy(&c);CHKERRQ(ierr); 172 } 173 PetscFunctionReturn(0); 174 } 175 176 PetscErrorCode DMCreateSubDM_DA(DM dm, PetscInt numFields, const PetscInt fields[], IS *is, DM *subdm) 177 { 178 DM_DA *da = (DM_DA*) dm->data; 179 PetscErrorCode ierr; 180 181 PetscFunctionBegin; 182 if (subdm) { 183 PetscSF sf; 184 Vec coords; 185 void *ctx; 186 /* Cannot use DMClone since the dof stuff is mixed in. Ugh 187 ierr = DMClone(dm, subdm);CHKERRQ(ierr); */ 188 ierr = DMCreate(PetscObjectComm((PetscObject)dm), subdm);CHKERRQ(ierr); 189 ierr = DMGetPointSF(dm, &sf);CHKERRQ(ierr); 190 ierr = DMSetPointSF(*subdm, sf);CHKERRQ(ierr); 191 ierr = DMGetApplicationContext(dm, &ctx);CHKERRQ(ierr); 192 ierr = DMSetApplicationContext(*subdm, ctx);CHKERRQ(ierr); 193 ierr = DMGetCoordinatesLocal(dm, &coords);CHKERRQ(ierr); 194 if (coords) { 195 ierr = DMSetCoordinatesLocal(*subdm, coords);CHKERRQ(ierr); 196 } else { 197 ierr = DMGetCoordinates(dm, &coords);CHKERRQ(ierr); 198 if (coords) {ierr = DMSetCoordinates(*subdm, coords);CHKERRQ(ierr);} 199 } 200 201 ierr = DMSetType(*subdm, DMDA);CHKERRQ(ierr); 202 ierr = DMSetDimension(*subdm, dm->dim);CHKERRQ(ierr); 203 ierr = DMDASetSizes(*subdm, da->M, da->N, da->P);CHKERRQ(ierr); 204 ierr = DMDASetNumProcs(*subdm, da->m, da->n, da->p);CHKERRQ(ierr); 205 ierr = DMDASetBoundaryType(*subdm, da->bx, da->by, da->bz);CHKERRQ(ierr); 206 ierr = DMDASetDof(*subdm, numFields);CHKERRQ(ierr); 207 ierr = DMDASetStencilType(*subdm, da->stencil_type);CHKERRQ(ierr); 208 ierr = DMDASetStencilWidth(*subdm, da->s);CHKERRQ(ierr); 209 ierr = DMDASetOwnershipRanges(*subdm, da->lx, da->ly, da->lz);CHKERRQ(ierr); 210 } 211 if (is) { 212 PetscInt *indices, cnt = 0, dof = da->w, i, j; 213 214 ierr = PetscMalloc1(da->Nlocal*numFields/dof, &indices);CHKERRQ(ierr); 215 for (i = da->base/dof; i < (da->base+da->Nlocal)/dof; ++i) { 216 for (j = 0; j < numFields; ++j) { 217 indices[cnt++] = dof*i + fields[j]; 218 } 219 } 220 if (cnt != da->Nlocal*numFields/dof) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_PLIB, "Count %D does not equal expected value %D", cnt, da->Nlocal*numFields/dof); 221 ierr = ISCreateGeneral(PetscObjectComm((PetscObject) dm), cnt, indices, PETSC_OWN_POINTER, is);CHKERRQ(ierr); 222 } 223 PetscFunctionReturn(0); 224 } 225 226 PetscErrorCode DMCreateFieldDecomposition_DA(DM dm, PetscInt *len,char ***namelist, IS **islist, DM **dmlist) 227 { 228 PetscInt i; 229 PetscErrorCode ierr; 230 DM_DA *dd = (DM_DA*)dm->data; 231 PetscInt dof = dd->w; 232 233 PetscFunctionBegin; 234 if (len) *len = dof; 235 if (islist) { 236 Vec v; 237 PetscInt rstart,n; 238 239 ierr = DMGetGlobalVector(dm,&v);CHKERRQ(ierr); 240 ierr = VecGetOwnershipRange(v,&rstart,NULL);CHKERRQ(ierr); 241 ierr = VecGetLocalSize(v,&n);CHKERRQ(ierr); 242 ierr = DMRestoreGlobalVector(dm,&v);CHKERRQ(ierr); 243 ierr = PetscMalloc1(dof,islist);CHKERRQ(ierr); 244 for (i=0; i<dof; i++) { 245 ierr = ISCreateStride(PetscObjectComm((PetscObject)dm),n/dof,rstart+i,dof,&(*islist)[i]);CHKERRQ(ierr); 246 } 247 } 248 if (namelist) { 249 ierr = PetscMalloc1(dof, namelist);CHKERRQ(ierr); 250 if (dd->fieldname) { 251 for (i=0; i<dof; i++) { 252 ierr = PetscStrallocpy(dd->fieldname[i],&(*namelist)[i]);CHKERRQ(ierr); 253 } 254 } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Currently DMDA must have fieldnames"); 255 } 256 if (dmlist) { 257 DM da; 258 259 ierr = DMDACreate(PetscObjectComm((PetscObject)dm), &da);CHKERRQ(ierr); 260 ierr = DMSetDimension(da, dm->dim);CHKERRQ(ierr); 261 ierr = DMDASetSizes(da, dd->M, dd->N, dd->P);CHKERRQ(ierr); 262 ierr = DMDASetNumProcs(da, dd->m, dd->n, dd->p);CHKERRQ(ierr); 263 ierr = DMDASetBoundaryType(da, dd->bx, dd->by, dd->bz);CHKERRQ(ierr); 264 ierr = DMDASetDof(da, 1);CHKERRQ(ierr); 265 ierr = DMDASetStencilType(da, dd->stencil_type);CHKERRQ(ierr); 266 ierr = DMDASetStencilWidth(da, dd->s);CHKERRQ(ierr); 267 ierr = DMSetUp(da);CHKERRQ(ierr); 268 ierr = PetscMalloc1(dof,dmlist);CHKERRQ(ierr); 269 for (i=0; i<dof-1; i++) {ierr = PetscObjectReference((PetscObject)da);CHKERRQ(ierr);} 270 for (i=0; i<dof; i++) (*dmlist)[i] = da; 271 } 272 PetscFunctionReturn(0); 273 } 274 275 PetscErrorCode DMClone_DA(DM dm, DM *newdm) 276 { 277 DM_DA *da = (DM_DA *) dm->data; 278 PetscErrorCode ierr; 279 280 PetscFunctionBegin; 281 ierr = DMSetType(*newdm, DMDA);CHKERRQ(ierr); 282 ierr = DMSetDimension(*newdm, dm->dim);CHKERRQ(ierr); 283 ierr = DMDASetSizes(*newdm, da->M, da->N, da->P);CHKERRQ(ierr); 284 ierr = DMDASetNumProcs(*newdm, da->m, da->n, da->p);CHKERRQ(ierr); 285 ierr = DMDASetBoundaryType(*newdm, da->bx, da->by, da->bz);CHKERRQ(ierr); 286 ierr = DMDASetDof(*newdm, da->w);CHKERRQ(ierr); 287 ierr = DMDASetStencilType(*newdm, da->stencil_type);CHKERRQ(ierr); 288 ierr = DMDASetStencilWidth(*newdm, da->s);CHKERRQ(ierr); 289 ierr = DMDASetOwnershipRanges(*newdm, da->lx, da->ly, da->lz);CHKERRQ(ierr); 290 ierr = DMSetUp(*newdm);CHKERRQ(ierr); 291 PetscFunctionReturn(0); 292 } 293 294 static PetscErrorCode DMHasCreateInjection_DA(DM dm, PetscBool *flg) 295 { 296 DM_DA *da = (DM_DA *)dm->data; 297 298 PetscFunctionBegin; 299 PetscValidHeaderSpecific(dm,DM_CLASSID,1); 300 PetscValidBoolPointer(flg,2); 301 *flg = da->interptype == DMDA_Q1 ? PETSC_TRUE : PETSC_FALSE; 302 PetscFunctionReturn(0); 303 } 304 305 static PetscErrorCode DMGetDimPoints_DA(DM dm, PetscInt dim, PetscInt *pStart, PetscInt *pEnd) 306 { 307 PetscErrorCode ierr; 308 309 PetscFunctionBegin; 310 ierr = DMDAGetDepthStratum(dm, dim, pStart, pEnd);CHKERRQ(ierr); 311 PetscFunctionReturn(0); 312 } 313 314 static PetscErrorCode DMGetNeighbors_DA(DM dm, PetscInt *nranks, const PetscMPIInt *ranks[]) 315 { 316 PetscErrorCode ierr; 317 PetscInt dim; 318 DMDAStencilType st; 319 320 PetscFunctionBegin; 321 ierr = DMDAGetNeighbors(dm,ranks);CHKERRQ(ierr); 322 ierr = DMDAGetInfo(dm,&dim,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&st);CHKERRQ(ierr); 323 324 switch (dim) { 325 case 1: 326 *nranks = 3; 327 /* if (st == DMDA_STENCIL_STAR) { *nranks = 3; } */ 328 break; 329 case 2: 330 *nranks = 9; 331 /* if (st == DMDA_STENCIL_STAR) { *nranks = 5; } */ 332 break; 333 case 3: 334 *nranks = 27; 335 /* if (st == DMDA_STENCIL_STAR) { *nranks = 7; } */ 336 break; 337 default: 338 break; 339 } 340 PetscFunctionReturn(0); 341 } 342 343 /*MC 344 DMDA = "da" - A DM object that is used to manage data for a structured grid in 1, 2, or 3 dimensions. 345 In the global representation of the vector each process stores a non-overlapping rectangular (or slab in 3d) portion of the grid points. 346 In the local representation these rectangular regions (slabs) are extended in all directions by a stencil width. 347 348 The vectors can be thought of as either cell centered or vertex centered on the mesh. But some variables cannot be cell centered and others 349 vertex centered; see the documentation for DMSTAG, a similar DM implementation which supports these staggered grids. 350 351 Level: intermediate 352 353 .seealso: DMType, DMCOMPOSITE, DMSTAG, DMDACreate(), DMCreate(), DMSetType() 354 M*/ 355 356 extern PetscErrorCode DMLocatePoints_DA_Regular(DM,Vec,DMPointLocationType,PetscSF); 357 PETSC_INTERN PetscErrorCode DMSetUpGLVisViewer_DMDA(PetscObject,PetscViewer); 358 359 PETSC_EXTERN PetscErrorCode DMCreate_DA(DM da) 360 { 361 PetscErrorCode ierr; 362 DM_DA *dd; 363 364 PetscFunctionBegin; 365 PetscValidPointer(da,1); 366 ierr = PetscNewLog(da,&dd);CHKERRQ(ierr); 367 da->data = dd; 368 369 da->dim = -1; 370 dd->interptype = DMDA_Q1; 371 dd->refine_x = 2; 372 dd->refine_y = 2; 373 dd->refine_z = 2; 374 dd->coarsen_x = 2; 375 dd->coarsen_y = 2; 376 dd->coarsen_z = 2; 377 dd->fieldname = NULL; 378 dd->nlocal = -1; 379 dd->Nlocal = -1; 380 dd->M = -1; 381 dd->N = -1; 382 dd->P = -1; 383 dd->m = -1; 384 dd->n = -1; 385 dd->p = -1; 386 dd->w = -1; 387 dd->s = -1; 388 389 dd->xs = -1; dd->xe = -1; dd->ys = -1; dd->ye = -1; dd->zs = -1; dd->ze = -1; 390 dd->Xs = -1; dd->Xe = -1; dd->Ys = -1; dd->Ye = -1; dd->Zs = -1; dd->Ze = -1; 391 392 dd->Nsub = 1; 393 dd->xol = 0; 394 dd->yol = 0; 395 dd->zol = 0; 396 dd->xo = 0; 397 dd->yo = 0; 398 dd->zo = 0; 399 dd->Mo = -1; 400 dd->No = -1; 401 dd->Po = -1; 402 403 dd->gtol = NULL; 404 dd->ltol = NULL; 405 dd->ao = NULL; 406 PetscStrallocpy(AOBASIC,(char**)&dd->aotype); 407 dd->base = -1; 408 dd->bx = DM_BOUNDARY_NONE; 409 dd->by = DM_BOUNDARY_NONE; 410 dd->bz = DM_BOUNDARY_NONE; 411 dd->stencil_type = DMDA_STENCIL_BOX; 412 dd->interptype = DMDA_Q1; 413 dd->lx = NULL; 414 dd->ly = NULL; 415 dd->lz = NULL; 416 417 dd->elementtype = DMDA_ELEMENT_Q1; 418 419 da->ops->globaltolocalbegin = DMGlobalToLocalBegin_DA; 420 da->ops->globaltolocalend = DMGlobalToLocalEnd_DA; 421 da->ops->localtoglobalbegin = DMLocalToGlobalBegin_DA; 422 da->ops->localtoglobalend = DMLocalToGlobalEnd_DA; 423 da->ops->localtolocalbegin = DMLocalToLocalBegin_DA; 424 da->ops->localtolocalend = DMLocalToLocalEnd_DA; 425 da->ops->createglobalvector = DMCreateGlobalVector_DA; 426 da->ops->createlocalvector = DMCreateLocalVector_DA; 427 da->ops->createinterpolation = DMCreateInterpolation_DA; 428 da->ops->getcoloring = DMCreateColoring_DA; 429 da->ops->creatematrix = DMCreateMatrix_DA; 430 da->ops->refine = DMRefine_DA; 431 da->ops->coarsen = DMCoarsen_DA; 432 da->ops->refinehierarchy = DMRefineHierarchy_DA; 433 da->ops->coarsenhierarchy = DMCoarsenHierarchy_DA; 434 da->ops->createinjection = DMCreateInjection_DA; 435 da->ops->hascreateinjection = DMHasCreateInjection_DA; 436 da->ops->destroy = DMDestroy_DA; 437 da->ops->view = NULL; 438 da->ops->setfromoptions = DMSetFromOptions_DA; 439 da->ops->setup = DMSetUp_DA; 440 da->ops->clone = DMClone_DA; 441 da->ops->load = DMLoad_DA; 442 da->ops->createcoordinatedm = DMCreateCoordinateDM_DA; 443 da->ops->createsubdm = DMCreateSubDM_DA; 444 da->ops->createfielddecomposition = DMCreateFieldDecomposition_DA; 445 da->ops->createdomaindecomposition = DMCreateDomainDecomposition_DA; 446 da->ops->createddscatters = DMCreateDomainDecompositionScatters_DA; 447 da->ops->getdimpoints = DMGetDimPoints_DA; 448 da->ops->getneighbors = DMGetNeighbors_DA; 449 da->ops->locatepoints = DMLocatePoints_DA_Regular; 450 da->ops->getcompatibility = DMGetCompatibility_DA; 451 ierr = PetscObjectComposeFunction((PetscObject)da,"DMSetUpGLVisViewer_C",DMSetUpGLVisViewer_DMDA);CHKERRQ(ierr); 452 PetscFunctionReturn(0); 453 } 454 455 /*@ 456 DMDACreate - Creates a DMDA object. 457 458 Collective 459 460 Input Parameter: 461 . comm - The communicator for the DMDA object 462 463 Output Parameter: 464 . da - The DMDA object 465 466 Level: advanced 467 468 Developers Note: 469 Since there exists DMDACreate1/2/3d() should this routine even exist? 470 471 .seealso: DMDASetSizes(), DMClone(), DMDACreate1d(), DMDACreate2d(), DMDACreate3d() 472 @*/ 473 PetscErrorCode DMDACreate(MPI_Comm comm, DM *da) 474 { 475 PetscErrorCode ierr; 476 477 PetscFunctionBegin; 478 PetscValidPointer(da,2); 479 ierr = DMCreate(comm,da);CHKERRQ(ierr); 480 ierr = DMSetType(*da,DMDA);CHKERRQ(ierr); 481 PetscFunctionReturn(0); 482 } 483