xref: /petsc/src/dm/impls/da/dacreate.c (revision e30e807f52449ee56cb8e6e4bd3267d3371e2f11)
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);
126*e30e807fSPeter Brune extern PetscErrorCode  DMCreateDomainDecomposition_DA(DM,PetscInt*,char ***,IS**,IS**,DM**);
127*e30e807fSPeter Brune extern PetscErrorCode  DMCreateDomainDecompositionScatters_DA(DM,PetscInt,DM*,VecScatter **,VecScatter**,VecScatter**);
1289a42bb27SBarry Smith 
129b859378eSBarry Smith #undef __FUNCT__
130b859378eSBarry Smith #define __FUNCT__ "DMLoad_DA"
131b859378eSBarry Smith PetscErrorCode DMLoad_DA(DM da,PetscViewer viewer)
132b859378eSBarry Smith {
133b859378eSBarry Smith   PetscErrorCode   ierr;
134bc2bf880SBarry Smith   PetscInt         dim,m,n,p,dof,swidth;
135b859378eSBarry Smith   DMDAStencilType  stencil;
136b859378eSBarry Smith   DMDABoundaryType bx,by,bz;
137bc2bf880SBarry Smith   PetscBool        coors;
138bc2bf880SBarry Smith   DM               dac;
139bc2bf880SBarry Smith   Vec              c;
140b859378eSBarry Smith 
141b859378eSBarry Smith   PetscFunctionBegin;
142b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&dim,1,PETSC_INT);CHKERRQ(ierr);
143b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&m,1,PETSC_INT);CHKERRQ(ierr);
144b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&n,1,PETSC_INT);CHKERRQ(ierr);
145b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&p,1,PETSC_INT);CHKERRQ(ierr);
146b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&dof,1,PETSC_INT);CHKERRQ(ierr);
147b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&swidth,1,PETSC_INT);CHKERRQ(ierr);
148b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&bx,1,PETSC_ENUM);CHKERRQ(ierr);
149b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&by,1,PETSC_ENUM);CHKERRQ(ierr);
150b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&bz,1,PETSC_ENUM);CHKERRQ(ierr);
151b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&stencil,1,PETSC_ENUM);CHKERRQ(ierr);
152b859378eSBarry Smith 
153bc2bf880SBarry Smith   ierr = DMDASetDim(da, dim);CHKERRQ(ierr);
154bc2bf880SBarry Smith   ierr = DMDASetSizes(da, m,n,p);CHKERRQ(ierr);
155b859378eSBarry Smith   ierr = DMDASetBoundaryType(da, bx, by, bz);CHKERRQ(ierr);
156b859378eSBarry Smith   ierr = DMDASetDof(da, dof);CHKERRQ(ierr);
157b859378eSBarry Smith   ierr = DMDASetStencilType(da, stencil);CHKERRQ(ierr);
158b859378eSBarry Smith   ierr = DMDASetStencilWidth(da, swidth);CHKERRQ(ierr);
159b859378eSBarry Smith   ierr = DMSetUp(da);CHKERRQ(ierr);
160bc2bf880SBarry Smith   ierr = PetscViewerBinaryRead(viewer,&coors,1,PETSC_ENUM);CHKERRQ(ierr);
161bc2bf880SBarry Smith   if (coors) {
1626636e97aSMatthew G Knepley     ierr = DMGetCoordinateDM(da,&dac);CHKERRQ(ierr);
163bc2bf880SBarry Smith     ierr = DMCreateGlobalVector(dac,&c);CHKERRQ(ierr);
164bc2bf880SBarry Smith     ierr = VecLoad(c,viewer);CHKERRQ(ierr);
1656636e97aSMatthew G Knepley     ierr = DMSetCoordinates(da,c);CHKERRQ(ierr);
166bc2bf880SBarry Smith     ierr = VecDestroy(&c);CHKERRQ(ierr);
167bc2bf880SBarry Smith   }
168b859378eSBarry Smith   PetscFunctionReturn(0);
169b859378eSBarry Smith }
170b859378eSBarry Smith 
1711c3fb106SBarry Smith #undef __FUNCT__
17216621825SDmitry Karpeev #define __FUNCT__ "DMCreateFieldDecomposition_DA"
17316621825SDmitry Karpeev PetscErrorCode DMCreateFieldDecomposition_DA(DM dm, PetscInt *len,char ***namelist, IS **islist, DM** dmlist)
1741c3fb106SBarry Smith {
1751c3fb106SBarry Smith   PetscInt       i;
1761c3fb106SBarry Smith   PetscErrorCode ierr;
1771c3fb106SBarry Smith   DM_DA          *dd = (DM_DA*)dm->data;
1781c3fb106SBarry Smith   PetscInt       dof = dd->w;
1791c3fb106SBarry Smith 
1801c3fb106SBarry Smith   PetscFunctionBegin;
181731c8d9eSDmitry Karpeev   if (len) *len = dof;
1821c3fb106SBarry Smith   if (islist) {
1831c3fb106SBarry Smith     Vec      v;
1841c3fb106SBarry Smith     PetscInt rstart,n;
1851c3fb106SBarry Smith 
1861c3fb106SBarry Smith     ierr = DMGetGlobalVector(dm,&v);CHKERRQ(ierr);
1871c3fb106SBarry Smith     ierr = VecGetOwnershipRange(v,&rstart,PETSC_NULL);CHKERRQ(ierr);
1881c3fb106SBarry Smith     ierr = VecGetLocalSize(v,&n);CHKERRQ(ierr);
1891c3fb106SBarry Smith     ierr = DMRestoreGlobalVector(dm,&v);CHKERRQ(ierr);
1901c3fb106SBarry Smith     ierr = PetscMalloc(dof*sizeof(IS),islist);CHKERRQ(ierr);
1911c3fb106SBarry Smith     for (i=0; i<dof; i++) {
1921c3fb106SBarry Smith       ierr = ISCreateStride(((PetscObject)dm)->comm,n/dof,rstart+i,dof,&(*islist)[i]);CHKERRQ(ierr);
1931c3fb106SBarry Smith     }
1941c3fb106SBarry Smith   }
1951c3fb106SBarry Smith   if (namelist) {
1961c3fb106SBarry Smith     ierr = PetscMalloc(dof*sizeof(const char *), namelist);CHKERRQ(ierr);
1971c3fb106SBarry Smith     if (dd->fieldname) {
1981c3fb106SBarry Smith       for (i=0; i<dof; i++) {
1991c3fb106SBarry Smith         ierr = PetscStrallocpy(dd->fieldname[i],&(*namelist)[i]);CHKERRQ(ierr);
2001c3fb106SBarry Smith       }
2011c3fb106SBarry Smith     } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Currently DMDA must have fieldnames");
2021c3fb106SBarry Smith   }
2031c3fb106SBarry Smith   if (dmlist) {
2041c3fb106SBarry Smith     DM da;
2051c3fb106SBarry Smith 
2061c3fb106SBarry Smith     ierr = DMDACreate(((PetscObject)dm)->comm, &da);CHKERRQ(ierr);
2071c3fb106SBarry Smith     ierr = DMDASetDim(da, dd->dim);CHKERRQ(ierr);
2081c3fb106SBarry Smith     ierr = DMDASetSizes(da, dd->M, dd->N, dd->P);CHKERRQ(ierr);
2091c3fb106SBarry Smith     ierr = DMDASetNumProcs(da, dd->m, dd->n, dd->p);CHKERRQ(ierr);
2101c3fb106SBarry Smith     ierr = DMDASetBoundaryType(da, dd->bx, dd->by, dd->bz);CHKERRQ(ierr);
2111c3fb106SBarry Smith     ierr = DMDASetDof(da, 1);CHKERRQ(ierr);
2121c3fb106SBarry Smith     ierr = DMDASetStencilType(da, dd->stencil_type);CHKERRQ(ierr);
2131c3fb106SBarry Smith     ierr = DMDASetStencilWidth(da, dd->s);CHKERRQ(ierr);
2141c3fb106SBarry Smith     ierr = DMSetUp(da);CHKERRQ(ierr);
2151c3fb106SBarry Smith     ierr = PetscMalloc(dof*sizeof(DM),dmlist);CHKERRQ(ierr);
216c893992eSBarry Smith     for (i=0; i<dof-1; i++) {ierr = PetscObjectReference((PetscObject)da);CHKERRQ(ierr);}
2171c3fb106SBarry Smith     for (i=0; i<dof; i++) (*dmlist)[i] = da;
2181c3fb106SBarry Smith   }
2191c3fb106SBarry Smith 
2201c3fb106SBarry Smith   PetscFunctionReturn(0);
2211c3fb106SBarry Smith }
2221c3fb106SBarry Smith 
2233efe6655SBarry Smith /*MC
2243efe6655SBarry Smith    DMDA = "da" - A DM object that is used to manage data for a structured grid in 1, 2, or 3 dimensions.
2253efe6655SBarry Smith          In the global representation of the vector each process stores a non-overlapping rectangular (or slab in 3d) portion of the grid points.
2263efe6655SBarry Smith          In the local representation these rectangular regions (slabs) are extended in all directions by a stencil width.
2273efe6655SBarry Smith 
2283efe6655SBarry 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
2293efe6655SBarry Smith          vertex centered.
2303efe6655SBarry Smith 
2313efe6655SBarry Smith 
2323efe6655SBarry Smith   Level: intermediate
2333efe6655SBarry Smith 
2343efe6655SBarry Smith .seealso: DMType, DMCOMPOSITE, DMDACreate(), DMCreate(), DMSetType()
2353efe6655SBarry Smith M*/
2363efe6655SBarry Smith 
2371c3fb106SBarry Smith 
238a4121054SBarry Smith EXTERN_C_BEGIN
23947c6ae99SBarry Smith #undef __FUNCT__
240a4121054SBarry Smith #define __FUNCT__ "DMCreate_DA"
2417087cfbeSBarry Smith PetscErrorCode  DMCreate_DA(DM da)
24247c6ae99SBarry Smith {
24347c6ae99SBarry Smith   PetscErrorCode ierr;
24447c6ae99SBarry Smith   DM_DA          *dd;
24547c6ae99SBarry Smith 
24647c6ae99SBarry Smith   PetscFunctionBegin;
247a4121054SBarry Smith   PetscValidPointer(da,1);
248a4121054SBarry Smith   ierr = PetscNewLog(da,DM_DA,&dd);CHKERRQ(ierr);
249a4121054SBarry Smith   da->data = dd;
25047c6ae99SBarry Smith 
25147c6ae99SBarry Smith   dd->dim        = -1;
252aa219208SBarry Smith   dd->interptype = DMDA_Q1;
25347c6ae99SBarry Smith   dd->refine_x   = 2;
25447c6ae99SBarry Smith   dd->refine_y   = 2;
25547c6ae99SBarry Smith   dd->refine_z   = 2;
25681c108dcSJed Brown   dd->coarsen_x  = 2;
25781c108dcSJed Brown   dd->coarsen_y  = 2;
25881c108dcSJed Brown   dd->coarsen_z  = 2;
25947c6ae99SBarry Smith   dd->fieldname  = PETSC_NULL;
26047c6ae99SBarry Smith   dd->nlocal     = -1;
26147c6ae99SBarry Smith   dd->Nlocal     = -1;
26247c6ae99SBarry Smith   dd->M          = -1;
26347c6ae99SBarry Smith   dd->N          = -1;
26447c6ae99SBarry Smith   dd->P          = -1;
26547c6ae99SBarry Smith   dd->m          = -1;
26647c6ae99SBarry Smith   dd->n          = -1;
26747c6ae99SBarry Smith   dd->p          = -1;
26847c6ae99SBarry Smith   dd->w          = -1;
26947c6ae99SBarry Smith   dd->s          = -1;
27047c6ae99SBarry Smith   dd->xs = -1; dd->xe = -1; dd->ys = -1; dd->ye = -1; dd->zs = -1; dd->ze = -1;
27147c6ae99SBarry Smith   dd->Xs = -1; dd->Xe = -1; dd->Ys = -1; dd->Ye = -1; dd->Zs = -1; dd->Ze = -1;
27247c6ae99SBarry Smith 
27388661749SPeter Brune   dd->overlap      = 0;
274d886c4f4SPeter Brune   dd->xo           = 0;
275d886c4f4SPeter Brune   dd->yo           = 0;
276d886c4f4SPeter Brune   dd->zo           = 0;
277*e30e807fSPeter Brune   dd->Mo           = -1;
278*e30e807fSPeter Brune   dd->No           = -1;
279*e30e807fSPeter Brune   dd->Po           = -1;
28088661749SPeter Brune 
28147c6ae99SBarry Smith   dd->gtol         = PETSC_NULL;
28247c6ae99SBarry Smith   dd->ltog         = PETSC_NULL;
28347c6ae99SBarry Smith   dd->ltol         = PETSC_NULL;
28447c6ae99SBarry Smith   dd->ao           = PETSC_NULL;
28547c6ae99SBarry Smith   dd->base         = -1;
2861321219cSEthan Coon   dd->bx         = DMDA_BOUNDARY_NONE;
2871321219cSEthan Coon   dd->by         = DMDA_BOUNDARY_NONE;
2881321219cSEthan Coon   dd->bz         = DMDA_BOUNDARY_NONE;
289aa219208SBarry Smith   dd->stencil_type = DMDA_STENCIL_BOX;
290aa219208SBarry Smith   dd->interptype   = DMDA_Q1;
29147c6ae99SBarry Smith   dd->idx          = PETSC_NULL;
29247c6ae99SBarry Smith   dd->Nl           = -1;
29347c6ae99SBarry Smith   dd->lx           = PETSC_NULL;
29447c6ae99SBarry Smith   dd->ly           = PETSC_NULL;
29547c6ae99SBarry Smith   dd->lz           = PETSC_NULL;
29647c6ae99SBarry Smith 
297454e267fSLisandro Dalcin   dd->elementtype  = DMDA_ELEMENT_Q1;
298454e267fSLisandro Dalcin 
29919fd82e9SBarry Smith   ierr = PetscStrallocpy(VECSTANDARD,(char**)&da->vectype);CHKERRQ(ierr);
300a4121054SBarry Smith   da->ops->globaltolocalbegin  = DMGlobalToLocalBegin_DA;
301a4121054SBarry Smith   da->ops->globaltolocalend    = DMGlobalToLocalEnd_DA;
302a4121054SBarry Smith   da->ops->localtoglobalbegin  = DMLocalToGlobalBegin_DA;
303a4121054SBarry Smith   da->ops->localtoglobalend    = DMLocalToGlobalEnd_DA;
304a4121054SBarry Smith   da->ops->createglobalvector  = DMCreateGlobalVector_DA;
305a4121054SBarry Smith   da->ops->createlocalvector   = DMCreateLocalVector_DA;
30625296bd5SBarry Smith   da->ops->createinterpolation = DMCreateInterpolation_DA;
307e727c939SJed Brown   da->ops->getcoloring         = DMCreateColoring_DA;
30825296bd5SBarry Smith   da->ops->creatematrix        = DMCreateMatrix_DA;
309a4121054SBarry Smith   da->ops->refine              = DMRefine_DA;
310a4121054SBarry Smith   da->ops->coarsen             = DMCoarsen_DA;
311a4121054SBarry Smith   da->ops->refinehierarchy     = DMRefineHierarchy_DA;
312a4121054SBarry Smith   da->ops->coarsenhierarchy    = DMCoarsenHierarchy_DA;
313e727c939SJed Brown   da->ops->getinjection        = DMCreateInjection_DA;
314e727c939SJed Brown   da->ops->getaggregates       = DMCreateAggregates_DA;
315a4121054SBarry Smith   da->ops->destroy             = DMDestroy_DA;
316a4121054SBarry Smith   da->ops->view                = 0;
317a4121054SBarry Smith   da->ops->setfromoptions      = DMSetFromOptions_DA;
318a4121054SBarry Smith   da->ops->setup               = DMSetUp_DA;
319b859378eSBarry Smith   da->ops->load                = DMLoad_DA;
3206636e97aSMatthew G Knepley   da->ops->createcoordinatedm  = DMCreateCoordinateDM_DA;
32116621825SDmitry Karpeev   da->ops->createfielddecomposition = DMCreateFieldDecomposition_DA;
322*e30e807fSPeter Brune   da->ops->createdomaindecomposition = DMCreateDomainDecomposition_DA;
323*e30e807fSPeter Brune   da->ops->createddscatters = DMCreateDomainDecompositionScatters_DA;
324a4121054SBarry Smith   PetscFunctionReturn(0);
325a4121054SBarry Smith }
326a4121054SBarry Smith EXTERN_C_END
32747c6ae99SBarry Smith 
328a4121054SBarry Smith #undef __FUNCT__
329a4121054SBarry Smith #define __FUNCT__ "DMDACreate"
330a4121054SBarry Smith /*@
331a4121054SBarry Smith   DMDACreate - Creates a DMDA object.
332a4121054SBarry Smith 
333a4121054SBarry Smith   Collective on MPI_Comm
334a4121054SBarry Smith 
335a4121054SBarry Smith   Input Parameter:
336a4121054SBarry Smith . comm - The communicator for the DMDA object
337a4121054SBarry Smith 
338a4121054SBarry Smith   Output Parameter:
339a4121054SBarry Smith . da  - The DMDA object
340a4121054SBarry Smith 
341e0f5d30fSBarry Smith   Level: advanced
342e0f5d30fSBarry Smith 
343e0f5d30fSBarry Smith   Developers Note: Since there exists DMDACreate1/2/3d() should this routine even exist?
344a4121054SBarry Smith 
345a4121054SBarry Smith .keywords: DMDA, create
346e0f5d30fSBarry Smith .seealso:  DMDASetSizes(), DMDADuplicate(),  DMDACreate1d(), DMDACreate2d(), DMDACreate3d()
347a4121054SBarry Smith @*/
3487087cfbeSBarry Smith PetscErrorCode  DMDACreate(MPI_Comm comm, DM *da)
349a4121054SBarry Smith {
350a4121054SBarry Smith   PetscErrorCode ierr;
351a4121054SBarry Smith 
352a4121054SBarry Smith   PetscFunctionBegin;
353a4121054SBarry Smith   PetscValidPointer(da,2);
354a4121054SBarry Smith   ierr = DMCreate(comm,da);CHKERRQ(ierr);
355a4121054SBarry Smith   ierr = DMSetType(*da,DMDA);CHKERRQ(ierr);
35647c6ae99SBarry Smith   PetscFunctionReturn(0);
35747c6ae99SBarry Smith }
358b859378eSBarry Smith 
359b859378eSBarry Smith 
360