xref: /petsc/src/dm/impls/da/dacreate.c (revision 030f984af8d8bb4c203755d35bded3c05b3d83ce)
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,2);
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   if (dim > 1) {ierr = PetscOptionsBoundedInt("-da_grid_y","Number of grid points in y direction","DMDASetSizes",dd->N,&dd->N,NULL,1);CHKERRQ(ierr);}
21   if (dim > 2) {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