xref: /petsc/src/dm/impls/da/dacreate.c (revision d886c4f4307575d4e45cf348c0d185d5b833ebc6)
17d0a6c19SBarry Smith 
2b45d2f2cSJed Brown #include <petsc-private/daimpl.h>    /*I   "petscdmda.h"   I*/
347c6ae99SBarry Smith 
447c6ae99SBarry Smith #undef __FUNCT__
59a42bb27SBarry Smith #define __FUNCT__ "DMSetFromOptions_DA"
67087cfbeSBarry Smith PetscErrorCode  DMSetFromOptions_DA(DM da)
747c6ae99SBarry Smith {
847c6ae99SBarry Smith   PetscErrorCode ierr;
947c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
10397b6216SJed Brown   PetscInt       refine = 0,maxnlevels = 100,*refx,*refy,*refz,n,i;
11235683edSBarry Smith   PetscBool      negativeMNP = PETSC_FALSE,bM = PETSC_FALSE,bN = PETSC_FALSE, bP = PETSC_FALSE;
1247c6ae99SBarry Smith 
1347c6ae99SBarry Smith   PetscFunctionBegin;
1447c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
1547c6ae99SBarry Smith 
1647c6ae99SBarry Smith   if (dd->M < 0) {
17235683edSBarry Smith     dd->M       = -dd->M;
18235683edSBarry Smith     bM          = PETSC_TRUE;
19e0f5d30fSBarry Smith     negativeMNP = PETSC_TRUE;
2047c6ae99SBarry Smith   }
2147c6ae99SBarry Smith   if (dd->dim > 1 && dd->N < 0) {
22235683edSBarry Smith     dd->N       = -dd->N;
23235683edSBarry Smith     bN          = PETSC_TRUE;
24e0f5d30fSBarry Smith     negativeMNP = PETSC_TRUE;
2547c6ae99SBarry Smith   }
2647c6ae99SBarry Smith   if (dd->dim > 2 && dd->P < 0) {
27235683edSBarry Smith     dd->P       = -dd->P;
28235683edSBarry Smith     bP          = PETSC_TRUE;
29e0f5d30fSBarry Smith     negativeMNP = PETSC_TRUE;
3047c6ae99SBarry Smith   }
31235683edSBarry Smith 
32f9ba7244SBarry Smith   ierr = PetscOptionsHead("DMDA Options");CHKERRQ(ierr);
33235683edSBarry Smith     if (bM) {ierr = PetscOptionsInt("-da_grid_x","Number of grid points in x direction","DMDASetSizes",dd->M,&dd->M,PETSC_NULL);CHKERRQ(ierr);}
34235683edSBarry Smith     if (bN) {ierr = PetscOptionsInt("-da_grid_y","Number of grid points in y direction","DMDASetSizes",dd->N,&dd->N,PETSC_NULL);CHKERRQ(ierr);}
35235683edSBarry Smith     if (bP) {ierr = PetscOptionsInt("-da_grid_z","Number of grid points in z direction","DMDASetSizes",dd->P,&dd->P,PETSC_NULL);CHKERRQ(ierr);}
3688661749SPeter Brune     ierr = PetscOptionsInt("-da_overlap","Overlap between local grids","DMDASetOverlap",dd->overlap,&dd->overlap,PETSC_NULL);CHKERRQ(ierr);
37aa219208SBarry Smith     /* Handle DMDA parallel distibution */
38aa219208SBarry Smith     ierr = PetscOptionsInt("-da_processors_x","Number of processors in x direction","DMDASetNumProcs",dd->m,&dd->m,PETSC_NULL);CHKERRQ(ierr);
39aa219208SBarry Smith     if (dd->dim > 1) {ierr = PetscOptionsInt("-da_processors_y","Number of processors in y direction","DMDASetNumProcs",dd->n,&dd->n,PETSC_NULL);CHKERRQ(ierr);}
40aa219208SBarry Smith     if (dd->dim > 2) {ierr = PetscOptionsInt("-da_processors_z","Number of processors in z direction","DMDASetNumProcs",dd->p,&dd->p,PETSC_NULL);CHKERRQ(ierr);}
41aa219208SBarry Smith     /* Handle DMDA refinement */
42aa219208SBarry Smith     ierr = PetscOptionsInt("-da_refine_x","Refinement ratio in x direction","DMDASetRefinementFactor",dd->refine_x,&dd->refine_x,PETSC_NULL);CHKERRQ(ierr);
43aa219208SBarry Smith     if (dd->dim > 1) {ierr = PetscOptionsInt("-da_refine_y","Refinement ratio in y direction","DMDASetRefinementFactor",dd->refine_y,&dd->refine_y,PETSC_NULL);CHKERRQ(ierr);}
44aa219208SBarry Smith     if (dd->dim > 2) {ierr = PetscOptionsInt("-da_refine_z","Refinement ratio in z direction","DMDASetRefinementFactor",dd->refine_z,&dd->refine_z,PETSC_NULL);CHKERRQ(ierr);}
4538fb6c91SJed Brown     dd->coarsen_x = dd->refine_x; dd->coarsen_y = dd->refine_y; dd->coarsen_z = dd->refine_z;
4647c6ae99SBarry Smith 
47397b6216SJed Brown     /* Get refinement factors, defaults taken from the coarse DMDA */
48397b6216SJed Brown     ierr = PetscMalloc3(maxnlevels,PetscInt,&refx,maxnlevels,PetscInt,&refy,maxnlevels,PetscInt,&refz);CHKERRQ(ierr);
49397b6216SJed Brown     ierr = DMDAGetRefinementFactor(da,&refx[0],&refy[0],&refz[0]);CHKERRQ(ierr);
50397b6216SJed Brown     for (i=1; i<maxnlevels; i++) {
51397b6216SJed Brown       refx[i] = refx[0];
52397b6216SJed Brown       refy[i] = refy[0];
53397b6216SJed Brown       refz[i] = refz[0];
54397b6216SJed Brown     }
55397b6216SJed Brown     n = maxnlevels;
56397b6216SJed Brown     ierr = PetscOptionsGetIntArray(((PetscObject)da)->prefix,"-da_refine_hierarchy_x",refx,&n,PETSC_NULL);CHKERRQ(ierr);
57397b6216SJed Brown     if (da->levelup - da->leveldown >= 0) dd->refine_x = refx[da->levelup - da->leveldown];
58397b6216SJed Brown     if (da->levelup - da->leveldown >= 1) dd->coarsen_x = refx[da->levelup - da->leveldown - 1];
59397b6216SJed Brown     if (dd->dim > 1) {
60397b6216SJed Brown       n = maxnlevels;
61397b6216SJed Brown       ierr = PetscOptionsGetIntArray(((PetscObject)da)->prefix,"-da_refine_hierarchy_y",refy,&n,PETSC_NULL);CHKERRQ(ierr);
62397b6216SJed Brown       if (da->levelup - da->leveldown >= 0) dd->refine_y = refy[da->levelup - da->leveldown];
63397b6216SJed Brown       if (da->levelup - da->leveldown >= 1) dd->coarsen_y = refy[da->levelup - da->leveldown - 1];
64397b6216SJed Brown     }
65397b6216SJed Brown     if (dd->dim > 2) {
66397b6216SJed Brown       n = maxnlevels;
67397b6216SJed Brown       ierr = PetscOptionsGetIntArray(((PetscObject)da)->prefix,"-da_refine_hierarchy_z",refz,&n,PETSC_NULL);CHKERRQ(ierr);
68397b6216SJed Brown       if (da->levelup - da->leveldown >= 0) dd->refine_z = refz[da->levelup - da->leveldown];
69397b6216SJed Brown       if (da->levelup - da->leveldown >= 1) dd->coarsen_z = refz[da->levelup - da->leveldown - 1];
70397b6216SJed Brown     }
71397b6216SJed Brown 
72235683edSBarry Smith     if (negativeMNP) {ierr = PetscOptionsInt("-da_refine","Uniformly refine DA one or more times","None",refine,&refine,PETSC_NULL);CHKERRQ(ierr);}
73f9ba7244SBarry Smith   ierr = PetscOptionsTail();CHKERRQ(ierr);
74235683edSBarry Smith 
75e0f5d30fSBarry Smith   while (refine--) {
76e0f5d30fSBarry Smith     if (dd->bx == DMDA_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0){
77e0f5d30fSBarry Smith       dd->M = dd->refine_x*dd->M;
78e0f5d30fSBarry Smith     } else {
79e0f5d30fSBarry Smith       dd->M = 1 + dd->refine_x*(dd->M - 1);
80e0f5d30fSBarry Smith     }
81e0f5d30fSBarry Smith     if (dd->by == DMDA_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0){
82e0f5d30fSBarry Smith       dd->N = dd->refine_y*dd->N;
83e0f5d30fSBarry Smith     } else {
84e0f5d30fSBarry Smith       dd->N = 1 + dd->refine_y*(dd->N - 1);
85e0f5d30fSBarry Smith     }
86e0f5d30fSBarry Smith     if (dd->bz == DMDA_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0){
87e0f5d30fSBarry Smith       dd->P = dd->refine_z*dd->P;
88e0f5d30fSBarry Smith     } else {
89e0f5d30fSBarry Smith       dd->P = 1 + dd->refine_z*(dd->P - 1);
90e0f5d30fSBarry Smith     }
91e0f5d30fSBarry Smith     da->levelup++;
9285fc4b34SJed Brown     if (da->levelup - da->leveldown >= 0) {
9385fc4b34SJed Brown       dd->refine_x = refx[da->levelup - da->leveldown];
9485fc4b34SJed Brown       dd->refine_y = refy[da->levelup - da->leveldown];
9585fc4b34SJed Brown       dd->refine_z = refz[da->levelup - da->leveldown];
9685fc4b34SJed Brown     }
9785fc4b34SJed Brown     if (da->levelup - da->leveldown >= 1) {
9885fc4b34SJed Brown       dd->coarsen_x = refx[da->levelup - da->leveldown - 1];
9985fc4b34SJed Brown       dd->coarsen_y = refy[da->levelup - da->leveldown - 1];
10085fc4b34SJed Brown       dd->coarsen_z = refz[da->levelup - da->leveldown - 1];
10185fc4b34SJed Brown     }
102e0f5d30fSBarry Smith   }
103397b6216SJed Brown   ierr = PetscFree3(refx,refy,refz);CHKERRQ(ierr);
10447c6ae99SBarry Smith   PetscFunctionReturn(0);
10547c6ae99SBarry Smith }
10647c6ae99SBarry Smith 
1077087cfbeSBarry Smith extern PetscErrorCode  DMCreateGlobalVector_DA(DM,Vec*);
1087087cfbeSBarry Smith extern PetscErrorCode  DMCreateLocalVector_DA(DM,Vec*);
1097087cfbeSBarry Smith extern PetscErrorCode  DMGlobalToLocalBegin_DA(DM,Vec,InsertMode,Vec);
1107087cfbeSBarry Smith extern PetscErrorCode  DMGlobalToLocalEnd_DA(DM,Vec,InsertMode,Vec);
1117087cfbeSBarry Smith extern PetscErrorCode  DMLocalToGlobalBegin_DA(DM,Vec,InsertMode,Vec);
1127087cfbeSBarry Smith extern PetscErrorCode  DMLocalToGlobalEnd_DA(DM,Vec,InsertMode,Vec);
113e727c939SJed Brown extern PetscErrorCode  DMCreateInterpolation_DA(DM,DM,Mat*,Vec*);
11419fd82e9SBarry Smith extern PetscErrorCode  DMCreateColoring_DA(DM,ISColoringType,MatType,ISColoring*);
11519fd82e9SBarry Smith extern PetscErrorCode  DMCreateMatrix_DA(DM,MatType,Mat*);
1166636e97aSMatthew G Knepley extern PetscErrorCode  DMCreateCoordinateDM_DA(DM,DM*);
1177087cfbeSBarry Smith extern PetscErrorCode  DMRefine_DA(DM,MPI_Comm,DM*);
1187087cfbeSBarry Smith extern PetscErrorCode  DMCoarsen_DA(DM,MPI_Comm,DM*);
1197087cfbeSBarry Smith extern PetscErrorCode  DMRefineHierarchy_DA(DM,PetscInt,DM[]);
1207087cfbeSBarry Smith extern PetscErrorCode  DMCoarsenHierarchy_DA(DM,PetscInt,DM[]);
121e727c939SJed Brown extern PetscErrorCode  DMCreateInjection_DA(DM,DM,VecScatter*);
122e727c939SJed Brown extern PetscErrorCode  DMCreateAggregates_DA(DM,DM,Mat*);
1237087cfbeSBarry Smith extern PetscErrorCode  DMView_DA(DM,PetscViewer);
1247087cfbeSBarry Smith extern PetscErrorCode  DMSetUp_DA(DM);
1257087cfbeSBarry Smith extern PetscErrorCode  DMDestroy_DA(DM);
1269a42bb27SBarry Smith 
127b859378eSBarry Smith #undef __FUNCT__
128b859378eSBarry Smith #define __FUNCT__ "DMLoad_DA"
129b859378eSBarry Smith PetscErrorCode DMLoad_DA(DM da,PetscViewer viewer)
130b859378eSBarry Smith {
131b859378eSBarry Smith   PetscErrorCode   ierr;
132bc2bf880SBarry Smith   PetscInt         dim,m,n,p,dof,swidth;
133b859378eSBarry Smith   DMDAStencilType  stencil;
134b859378eSBarry Smith   DMDABoundaryType bx,by,bz;
135bc2bf880SBarry Smith   PetscBool        coors;
136bc2bf880SBarry Smith   DM               dac;
137bc2bf880SBarry Smith   Vec              c;
138b859378eSBarry Smith 
139b859378eSBarry Smith   PetscFunctionBegin;
140b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&dim,1,PETSC_INT);CHKERRQ(ierr);
141b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&m,1,PETSC_INT);CHKERRQ(ierr);
142b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&n,1,PETSC_INT);CHKERRQ(ierr);
143b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&p,1,PETSC_INT);CHKERRQ(ierr);
144b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&dof,1,PETSC_INT);CHKERRQ(ierr);
145b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&swidth,1,PETSC_INT);CHKERRQ(ierr);
146b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&bx,1,PETSC_ENUM);CHKERRQ(ierr);
147b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&by,1,PETSC_ENUM);CHKERRQ(ierr);
148b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&bz,1,PETSC_ENUM);CHKERRQ(ierr);
149b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&stencil,1,PETSC_ENUM);CHKERRQ(ierr);
150b859378eSBarry Smith 
151bc2bf880SBarry Smith   ierr = DMDASetDim(da, dim);CHKERRQ(ierr);
152bc2bf880SBarry Smith   ierr = DMDASetSizes(da, m,n,p);CHKERRQ(ierr);
153b859378eSBarry Smith   ierr = DMDASetBoundaryType(da, bx, by, bz);CHKERRQ(ierr);
154b859378eSBarry Smith   ierr = DMDASetDof(da, dof);CHKERRQ(ierr);
155b859378eSBarry Smith   ierr = DMDASetStencilType(da, stencil);CHKERRQ(ierr);
156b859378eSBarry Smith   ierr = DMDASetStencilWidth(da, swidth);CHKERRQ(ierr);
157b859378eSBarry Smith   ierr = DMSetUp(da);CHKERRQ(ierr);
158bc2bf880SBarry Smith   ierr = PetscViewerBinaryRead(viewer,&coors,1,PETSC_ENUM);CHKERRQ(ierr);
159bc2bf880SBarry Smith   if (coors) {
1606636e97aSMatthew G Knepley     ierr = DMGetCoordinateDM(da,&dac);CHKERRQ(ierr);
161bc2bf880SBarry Smith     ierr = DMCreateGlobalVector(dac,&c);CHKERRQ(ierr);
162bc2bf880SBarry Smith     ierr = VecLoad(c,viewer);CHKERRQ(ierr);
1636636e97aSMatthew G Knepley     ierr = DMSetCoordinates(da,c);CHKERRQ(ierr);
164bc2bf880SBarry Smith     ierr = VecDestroy(&c);CHKERRQ(ierr);
165bc2bf880SBarry Smith   }
166b859378eSBarry Smith   PetscFunctionReturn(0);
167b859378eSBarry Smith }
168b859378eSBarry Smith 
1691c3fb106SBarry Smith #undef __FUNCT__
17016621825SDmitry Karpeev #define __FUNCT__ "DMCreateFieldDecomposition_DA"
17116621825SDmitry Karpeev PetscErrorCode DMCreateFieldDecomposition_DA(DM dm, PetscInt *len,char ***namelist, IS **islist, DM** dmlist)
1721c3fb106SBarry Smith {
1731c3fb106SBarry Smith   PetscInt       i;
1741c3fb106SBarry Smith   PetscErrorCode ierr;
1751c3fb106SBarry Smith   DM_DA          *dd = (DM_DA*)dm->data;
1761c3fb106SBarry Smith   PetscInt       dof = dd->w;
1771c3fb106SBarry Smith 
1781c3fb106SBarry Smith   PetscFunctionBegin;
179731c8d9eSDmitry Karpeev   if (len) *len = dof;
1801c3fb106SBarry Smith   if (islist) {
1811c3fb106SBarry Smith     Vec      v;
1821c3fb106SBarry Smith     PetscInt rstart,n;
1831c3fb106SBarry Smith 
1841c3fb106SBarry Smith     ierr = DMGetGlobalVector(dm,&v);CHKERRQ(ierr);
1851c3fb106SBarry Smith     ierr = VecGetOwnershipRange(v,&rstart,PETSC_NULL);CHKERRQ(ierr);
1861c3fb106SBarry Smith     ierr = VecGetLocalSize(v,&n);CHKERRQ(ierr);
1871c3fb106SBarry Smith     ierr = DMRestoreGlobalVector(dm,&v);CHKERRQ(ierr);
1881c3fb106SBarry Smith     ierr = PetscMalloc(dof*sizeof(IS),islist);CHKERRQ(ierr);
1891c3fb106SBarry Smith     for (i=0; i<dof; i++) {
1901c3fb106SBarry Smith       ierr = ISCreateStride(((PetscObject)dm)->comm,n/dof,rstart+i,dof,&(*islist)[i]);CHKERRQ(ierr);
1911c3fb106SBarry Smith     }
1921c3fb106SBarry Smith   }
1931c3fb106SBarry Smith   if (namelist) {
1941c3fb106SBarry Smith     ierr = PetscMalloc(dof*sizeof(const char *), namelist);CHKERRQ(ierr);
1951c3fb106SBarry Smith     if (dd->fieldname) {
1961c3fb106SBarry Smith       for (i=0; i<dof; i++) {
1971c3fb106SBarry Smith         ierr = PetscStrallocpy(dd->fieldname[i],&(*namelist)[i]);CHKERRQ(ierr);
1981c3fb106SBarry Smith       }
1991c3fb106SBarry Smith     } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Currently DMDA must have fieldnames");
2001c3fb106SBarry Smith   }
2011c3fb106SBarry Smith   if (dmlist) {
2021c3fb106SBarry Smith     DM da;
2031c3fb106SBarry Smith 
2041c3fb106SBarry Smith     ierr = DMDACreate(((PetscObject)dm)->comm, &da);CHKERRQ(ierr);
2051c3fb106SBarry Smith     ierr = DMDASetDim(da, dd->dim);CHKERRQ(ierr);
2061c3fb106SBarry Smith     ierr = DMDASetSizes(da, dd->M, dd->N, dd->P);CHKERRQ(ierr);
2071c3fb106SBarry Smith     ierr = DMDASetNumProcs(da, dd->m, dd->n, dd->p);CHKERRQ(ierr);
2081c3fb106SBarry Smith     ierr = DMDASetBoundaryType(da, dd->bx, dd->by, dd->bz);CHKERRQ(ierr);
2091c3fb106SBarry Smith     ierr = DMDASetDof(da, 1);CHKERRQ(ierr);
2101c3fb106SBarry Smith     ierr = DMDASetStencilType(da, dd->stencil_type);CHKERRQ(ierr);
2111c3fb106SBarry Smith     ierr = DMDASetStencilWidth(da, dd->s);CHKERRQ(ierr);
2121c3fb106SBarry Smith     ierr = DMSetUp(da);CHKERRQ(ierr);
2131c3fb106SBarry Smith     ierr = PetscMalloc(dof*sizeof(DM),dmlist);CHKERRQ(ierr);
214c893992eSBarry Smith     for (i=0; i<dof-1; i++) {ierr = PetscObjectReference((PetscObject)da);CHKERRQ(ierr);}
2151c3fb106SBarry Smith     for (i=0; i<dof; i++) (*dmlist)[i] = da;
2161c3fb106SBarry Smith   }
2171c3fb106SBarry Smith 
2181c3fb106SBarry Smith   PetscFunctionReturn(0);
2191c3fb106SBarry Smith }
2201c3fb106SBarry Smith 
2213efe6655SBarry Smith /*MC
2223efe6655SBarry Smith    DMDA = "da" - A DM object that is used to manage data for a structured grid in 1, 2, or 3 dimensions.
2233efe6655SBarry Smith          In the global representation of the vector each process stores a non-overlapping rectangular (or slab in 3d) portion of the grid points.
2243efe6655SBarry Smith          In the local representation these rectangular regions (slabs) are extended in all directions by a stencil width.
2253efe6655SBarry Smith 
2263efe6655SBarry Smith          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
2273efe6655SBarry Smith          vertex centered.
2283efe6655SBarry Smith 
2293efe6655SBarry Smith 
2303efe6655SBarry Smith   Level: intermediate
2313efe6655SBarry Smith 
2323efe6655SBarry Smith .seealso: DMType, DMCOMPOSITE, DMDACreate(), DMCreate(), DMSetType()
2333efe6655SBarry Smith M*/
2343efe6655SBarry Smith 
2351c3fb106SBarry Smith 
236a4121054SBarry Smith EXTERN_C_BEGIN
23747c6ae99SBarry Smith #undef __FUNCT__
238a4121054SBarry Smith #define __FUNCT__ "DMCreate_DA"
2397087cfbeSBarry Smith PetscErrorCode  DMCreate_DA(DM da)
24047c6ae99SBarry Smith {
24147c6ae99SBarry Smith   PetscErrorCode ierr;
24247c6ae99SBarry Smith   DM_DA          *dd;
24347c6ae99SBarry Smith 
24447c6ae99SBarry Smith   PetscFunctionBegin;
245a4121054SBarry Smith   PetscValidPointer(da,1);
246a4121054SBarry Smith   ierr = PetscNewLog(da,DM_DA,&dd);CHKERRQ(ierr);
247a4121054SBarry Smith   da->data = dd;
24847c6ae99SBarry Smith 
24947c6ae99SBarry Smith   dd->dim        = -1;
250aa219208SBarry Smith   dd->interptype = DMDA_Q1;
25147c6ae99SBarry Smith   dd->refine_x   = 2;
25247c6ae99SBarry Smith   dd->refine_y   = 2;
25347c6ae99SBarry Smith   dd->refine_z   = 2;
25481c108dcSJed Brown   dd->coarsen_x  = 2;
25581c108dcSJed Brown   dd->coarsen_y  = 2;
25681c108dcSJed Brown   dd->coarsen_z  = 2;
25747c6ae99SBarry Smith   dd->fieldname  = PETSC_NULL;
25847c6ae99SBarry Smith   dd->nlocal     = -1;
25947c6ae99SBarry Smith   dd->Nlocal     = -1;
26047c6ae99SBarry Smith   dd->M          = -1;
26147c6ae99SBarry Smith   dd->N          = -1;
26247c6ae99SBarry Smith   dd->P          = -1;
26347c6ae99SBarry Smith   dd->m          = -1;
26447c6ae99SBarry Smith   dd->n          = -1;
26547c6ae99SBarry Smith   dd->p          = -1;
26647c6ae99SBarry Smith   dd->w          = -1;
26747c6ae99SBarry Smith   dd->s          = -1;
26847c6ae99SBarry Smith   dd->xs = -1; dd->xe = -1; dd->ys = -1; dd->ye = -1; dd->zs = -1; dd->ze = -1;
26947c6ae99SBarry Smith   dd->Xs = -1; dd->Xe = -1; dd->Ys = -1; dd->Ye = -1; dd->Zs = -1; dd->Ze = -1;
27047c6ae99SBarry Smith 
27188661749SPeter Brune   dd->overlap      = 0;
272*d886c4f4SPeter Brune   dd->xo           = 0;
273*d886c4f4SPeter Brune   dd->yo           = 0;
274*d886c4f4SPeter Brune   dd->zo           = 0;
27588661749SPeter Brune 
27647c6ae99SBarry Smith   dd->gtol         = PETSC_NULL;
27747c6ae99SBarry Smith   dd->ltog         = PETSC_NULL;
27847c6ae99SBarry Smith   dd->ltol         = PETSC_NULL;
27947c6ae99SBarry Smith   dd->ao           = PETSC_NULL;
28047c6ae99SBarry Smith   dd->base         = -1;
2811321219cSEthan Coon   dd->bx         = DMDA_BOUNDARY_NONE;
2821321219cSEthan Coon   dd->by         = DMDA_BOUNDARY_NONE;
2831321219cSEthan Coon   dd->bz         = DMDA_BOUNDARY_NONE;
284aa219208SBarry Smith   dd->stencil_type = DMDA_STENCIL_BOX;
285aa219208SBarry Smith   dd->interptype   = DMDA_Q1;
28647c6ae99SBarry Smith   dd->idx          = PETSC_NULL;
28747c6ae99SBarry Smith   dd->Nl           = -1;
28847c6ae99SBarry Smith   dd->lx           = PETSC_NULL;
28947c6ae99SBarry Smith   dd->ly           = PETSC_NULL;
29047c6ae99SBarry Smith   dd->lz           = PETSC_NULL;
29147c6ae99SBarry Smith 
292454e267fSLisandro Dalcin   dd->elementtype  = DMDA_ELEMENT_Q1;
293454e267fSLisandro Dalcin 
29419fd82e9SBarry Smith   ierr = PetscStrallocpy(VECSTANDARD,(char**)&da->vectype);CHKERRQ(ierr);
295a4121054SBarry Smith   da->ops->globaltolocalbegin  = DMGlobalToLocalBegin_DA;
296a4121054SBarry Smith   da->ops->globaltolocalend    = DMGlobalToLocalEnd_DA;
297a4121054SBarry Smith   da->ops->localtoglobalbegin  = DMLocalToGlobalBegin_DA;
298a4121054SBarry Smith   da->ops->localtoglobalend    = DMLocalToGlobalEnd_DA;
299a4121054SBarry Smith   da->ops->createglobalvector  = DMCreateGlobalVector_DA;
300a4121054SBarry Smith   da->ops->createlocalvector   = DMCreateLocalVector_DA;
30125296bd5SBarry Smith   da->ops->createinterpolation = DMCreateInterpolation_DA;
302e727c939SJed Brown   da->ops->getcoloring         = DMCreateColoring_DA;
30325296bd5SBarry Smith   da->ops->creatematrix        = DMCreateMatrix_DA;
304a4121054SBarry Smith   da->ops->refine              = DMRefine_DA;
305a4121054SBarry Smith   da->ops->coarsen             = DMCoarsen_DA;
306a4121054SBarry Smith   da->ops->refinehierarchy     = DMRefineHierarchy_DA;
307a4121054SBarry Smith   da->ops->coarsenhierarchy    = DMCoarsenHierarchy_DA;
308e727c939SJed Brown   da->ops->getinjection        = DMCreateInjection_DA;
309e727c939SJed Brown   da->ops->getaggregates       = DMCreateAggregates_DA;
310a4121054SBarry Smith   da->ops->destroy             = DMDestroy_DA;
311a4121054SBarry Smith   da->ops->view                = 0;
312a4121054SBarry Smith   da->ops->setfromoptions      = DMSetFromOptions_DA;
313a4121054SBarry Smith   da->ops->setup               = DMSetUp_DA;
314b859378eSBarry Smith   da->ops->load                = DMLoad_DA;
3156636e97aSMatthew G Knepley   da->ops->createcoordinatedm  = DMCreateCoordinateDM_DA;
31616621825SDmitry Karpeev   da->ops->createfielddecomposition = DMCreateFieldDecomposition_DA;
317a4121054SBarry Smith   PetscFunctionReturn(0);
318a4121054SBarry Smith }
319a4121054SBarry Smith EXTERN_C_END
32047c6ae99SBarry Smith 
321a4121054SBarry Smith #undef __FUNCT__
322a4121054SBarry Smith #define __FUNCT__ "DMDACreate"
323a4121054SBarry Smith /*@
324a4121054SBarry Smith   DMDACreate - Creates a DMDA object.
325a4121054SBarry Smith 
326a4121054SBarry Smith   Collective on MPI_Comm
327a4121054SBarry Smith 
328a4121054SBarry Smith   Input Parameter:
329a4121054SBarry Smith . comm - The communicator for the DMDA object
330a4121054SBarry Smith 
331a4121054SBarry Smith   Output Parameter:
332a4121054SBarry Smith . da  - The DMDA object
333a4121054SBarry Smith 
334e0f5d30fSBarry Smith   Level: advanced
335e0f5d30fSBarry Smith 
336e0f5d30fSBarry Smith   Developers Note: Since there exists DMDACreate1/2/3d() should this routine even exist?
337a4121054SBarry Smith 
338a4121054SBarry Smith .keywords: DMDA, create
339e0f5d30fSBarry Smith .seealso:  DMDASetSizes(), DMDADuplicate(),  DMDACreate1d(), DMDACreate2d(), DMDACreate3d()
340a4121054SBarry Smith @*/
3417087cfbeSBarry Smith PetscErrorCode  DMDACreate(MPI_Comm comm, DM *da)
342a4121054SBarry Smith {
343a4121054SBarry Smith   PetscErrorCode ierr;
344a4121054SBarry Smith 
345a4121054SBarry Smith   PetscFunctionBegin;
346a4121054SBarry Smith   PetscValidPointer(da,2);
347a4121054SBarry Smith   ierr = DMCreate(comm,da);CHKERRQ(ierr);
348a4121054SBarry Smith   ierr = DMSetType(*da,DMDA);CHKERRQ(ierr);
34947c6ae99SBarry Smith   PetscFunctionReturn(0);
35047c6ae99SBarry Smith }
351b859378eSBarry Smith 
352b859378eSBarry Smith 
353