xref: /petsc/src/dm/impls/da/dacreate.c (revision 8cc058d9cd56c1ccb3be12a47760ddfc446aaffc)
17d0a6c19SBarry Smith 
24035e84dSBarry Smith #include <petsc-private/dmdaimpl.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;
117ddda789SPeter Brune   PetscBool      negativeMNP = PETSC_FALSE,bM = PETSC_FALSE,bN = PETSC_FALSE, bP = PETSC_FALSE,flg;
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);
330298fd71SBarry Smith   if (bM) {ierr = PetscOptionsInt("-da_grid_x","Number of grid points in x direction","DMDASetSizes",dd->M,&dd->M,NULL);CHKERRQ(ierr);}
340298fd71SBarry Smith   if (bN) {ierr = PetscOptionsInt("-da_grid_y","Number of grid points in y direction","DMDASetSizes",dd->N,&dd->N,NULL);CHKERRQ(ierr);}
350298fd71SBarry Smith   if (bP) {ierr = PetscOptionsInt("-da_grid_z","Number of grid points in z direction","DMDASetSizes",dd->P,&dd->P,NULL);CHKERRQ(ierr);}
367ddda789SPeter Brune 
377ddda789SPeter Brune   ierr = PetscOptionsInt("-da_overlap","Decomposition overlap in all directions","DMDASetOverlap",dd->xol,&dd->xol,&flg);CHKERRQ(ierr);
387ddda789SPeter Brune   if (flg) {ierr = DMDASetOverlap(da,dd->xol,dd->xol,dd->xol);CHKERRQ(ierr);}
397ddda789SPeter Brune 
407ddda789SPeter Brune   ierr = PetscOptionsInt("-da_overlap_x","Decomposition overlap in x direction","DMDASetOverlap",dd->xol,&dd->xol,NULL);CHKERRQ(ierr);
417ddda789SPeter Brune   if (dd->dim > 1) {ierr = PetscOptionsInt("-da_overlap_y","Decomposition overlap in y direction","DMDASetOverlap",dd->yol,&dd->yol,NULL);CHKERRQ(ierr);}
427ddda789SPeter Brune   if (dd->dim > 2) {ierr = PetscOptionsInt("-da_overlap_z","Decomposition overlap in z direction","DMDASetOverlap",dd->zol,&dd->zol,NULL);CHKERRQ(ierr);}
43aa219208SBarry Smith   /* Handle DMDA parallel distibution */
440298fd71SBarry Smith   ierr = PetscOptionsInt("-da_processors_x","Number of processors in x direction","DMDASetNumProcs",dd->m,&dd->m,NULL);CHKERRQ(ierr);
450298fd71SBarry Smith   if (dd->dim > 1) {ierr = PetscOptionsInt("-da_processors_y","Number of processors in y direction","DMDASetNumProcs",dd->n,&dd->n,NULL);CHKERRQ(ierr);}
460298fd71SBarry Smith   if (dd->dim > 2) {ierr = PetscOptionsInt("-da_processors_z","Number of processors in z direction","DMDASetNumProcs",dd->p,&dd->p,NULL);CHKERRQ(ierr);}
47aa219208SBarry Smith   /* Handle DMDA refinement */
480298fd71SBarry Smith   ierr = PetscOptionsInt("-da_refine_x","Refinement ratio in x direction","DMDASetRefinementFactor",dd->refine_x,&dd->refine_x,NULL);CHKERRQ(ierr);
490298fd71SBarry Smith   if (dd->dim > 1) {ierr = PetscOptionsInt("-da_refine_y","Refinement ratio in y direction","DMDASetRefinementFactor",dd->refine_y,&dd->refine_y,NULL);CHKERRQ(ierr);}
500298fd71SBarry Smith   if (dd->dim > 2) {ierr = PetscOptionsInt("-da_refine_z","Refinement ratio in z direction","DMDASetRefinementFactor",dd->refine_z,&dd->refine_z,NULL);CHKERRQ(ierr);}
5138fb6c91SJed Brown   dd->coarsen_x = dd->refine_x; dd->coarsen_y = dd->refine_y; dd->coarsen_z = dd->refine_z;
5247c6ae99SBarry Smith 
53397b6216SJed Brown   /* Get refinement factors, defaults taken from the coarse DMDA */
54397b6216SJed Brown   ierr = PetscMalloc3(maxnlevels,PetscInt,&refx,maxnlevels,PetscInt,&refy,maxnlevels,PetscInt,&refz);CHKERRQ(ierr);
55397b6216SJed Brown   ierr = DMDAGetRefinementFactor(da,&refx[0],&refy[0],&refz[0]);CHKERRQ(ierr);
56397b6216SJed Brown   for (i=1; i<maxnlevels; i++) {
57397b6216SJed Brown     refx[i] = refx[0];
58397b6216SJed Brown     refy[i] = refy[0];
59397b6216SJed Brown     refz[i] = refz[0];
60397b6216SJed Brown   }
61397b6216SJed Brown   n    = maxnlevels;
620298fd71SBarry Smith   ierr = PetscOptionsGetIntArray(((PetscObject)da)->prefix,"-da_refine_hierarchy_x",refx,&n,NULL);CHKERRQ(ierr);
63397b6216SJed Brown   if (da->levelup - da->leveldown >= 0) dd->refine_x = refx[da->levelup - da->leveldown];
64397b6216SJed Brown   if (da->levelup - da->leveldown >= 1) dd->coarsen_x = refx[da->levelup - da->leveldown - 1];
65397b6216SJed Brown   if (dd->dim > 1) {
66397b6216SJed Brown     n    = maxnlevels;
670298fd71SBarry Smith     ierr = PetscOptionsGetIntArray(((PetscObject)da)->prefix,"-da_refine_hierarchy_y",refy,&n,NULL);CHKERRQ(ierr);
68397b6216SJed Brown     if (da->levelup - da->leveldown >= 0) dd->refine_y = refy[da->levelup - da->leveldown];
69397b6216SJed Brown     if (da->levelup - da->leveldown >= 1) dd->coarsen_y = refy[da->levelup - da->leveldown - 1];
70397b6216SJed Brown   }
71397b6216SJed Brown   if (dd->dim > 2) {
72397b6216SJed Brown     n    = maxnlevels;
730298fd71SBarry Smith     ierr = PetscOptionsGetIntArray(((PetscObject)da)->prefix,"-da_refine_hierarchy_z",refz,&n,NULL);CHKERRQ(ierr);
74397b6216SJed Brown     if (da->levelup - da->leveldown >= 0) dd->refine_z = refz[da->levelup - da->leveldown];
75397b6216SJed Brown     if (da->levelup - da->leveldown >= 1) dd->coarsen_z = refz[da->levelup - da->leveldown - 1];
76397b6216SJed Brown   }
77397b6216SJed Brown 
780298fd71SBarry Smith   if (negativeMNP) {ierr = PetscOptionsInt("-da_refine","Uniformly refine DA one or more times","None",refine,&refine,NULL);CHKERRQ(ierr);}
79f9ba7244SBarry Smith   ierr = PetscOptionsTail();CHKERRQ(ierr);
80235683edSBarry Smith 
81e0f5d30fSBarry Smith   while (refine--) {
82e0f5d30fSBarry Smith     if (dd->bx == DMDA_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0) {
83e0f5d30fSBarry Smith       dd->M = dd->refine_x*dd->M;
84e0f5d30fSBarry Smith     } else {
85e0f5d30fSBarry Smith       dd->M = 1 + dd->refine_x*(dd->M - 1);
86e0f5d30fSBarry Smith     }
87e0f5d30fSBarry Smith     if (dd->by == DMDA_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0) {
88e0f5d30fSBarry Smith       dd->N = dd->refine_y*dd->N;
89e0f5d30fSBarry Smith     } else {
90e0f5d30fSBarry Smith       dd->N = 1 + dd->refine_y*(dd->N - 1);
91e0f5d30fSBarry Smith     }
92e0f5d30fSBarry Smith     if (dd->bz == DMDA_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0) {
93e0f5d30fSBarry Smith       dd->P = dd->refine_z*dd->P;
94e0f5d30fSBarry Smith     } else {
95e0f5d30fSBarry Smith       dd->P = 1 + dd->refine_z*(dd->P - 1);
96e0f5d30fSBarry Smith     }
97e0f5d30fSBarry Smith     da->levelup++;
9885fc4b34SJed Brown     if (da->levelup - da->leveldown >= 0) {
9985fc4b34SJed Brown       dd->refine_x = refx[da->levelup - da->leveldown];
10085fc4b34SJed Brown       dd->refine_y = refy[da->levelup - da->leveldown];
10185fc4b34SJed Brown       dd->refine_z = refz[da->levelup - da->leveldown];
10285fc4b34SJed Brown     }
10385fc4b34SJed Brown     if (da->levelup - da->leveldown >= 1) {
10485fc4b34SJed Brown       dd->coarsen_x = refx[da->levelup - da->leveldown - 1];
10585fc4b34SJed Brown       dd->coarsen_y = refy[da->levelup - da->leveldown - 1];
10685fc4b34SJed Brown       dd->coarsen_z = refz[da->levelup - da->leveldown - 1];
10785fc4b34SJed Brown     }
108e0f5d30fSBarry Smith   }
109397b6216SJed Brown   ierr = PetscFree3(refx,refy,refz);CHKERRQ(ierr);
11047c6ae99SBarry Smith   PetscFunctionReturn(0);
11147c6ae99SBarry Smith }
11247c6ae99SBarry Smith 
1137087cfbeSBarry Smith extern PetscErrorCode  DMCreateGlobalVector_DA(DM,Vec*);
1147087cfbeSBarry Smith extern PetscErrorCode  DMCreateLocalVector_DA(DM,Vec*);
1157087cfbeSBarry Smith extern PetscErrorCode  DMGlobalToLocalBegin_DA(DM,Vec,InsertMode,Vec);
1167087cfbeSBarry Smith extern PetscErrorCode  DMGlobalToLocalEnd_DA(DM,Vec,InsertMode,Vec);
1177087cfbeSBarry Smith extern PetscErrorCode  DMLocalToGlobalBegin_DA(DM,Vec,InsertMode,Vec);
1187087cfbeSBarry Smith extern PetscErrorCode  DMLocalToGlobalEnd_DA(DM,Vec,InsertMode,Vec);
119e727c939SJed Brown extern PetscErrorCode  DMCreateInterpolation_DA(DM,DM,Mat*,Vec*);
12019fd82e9SBarry Smith extern PetscErrorCode  DMCreateColoring_DA(DM,ISColoringType,MatType,ISColoring*);
12119fd82e9SBarry Smith extern PetscErrorCode  DMCreateMatrix_DA(DM,MatType,Mat*);
1226636e97aSMatthew G Knepley extern PetscErrorCode  DMCreateCoordinateDM_DA(DM,DM*);
1237087cfbeSBarry Smith extern PetscErrorCode  DMRefine_DA(DM,MPI_Comm,DM*);
1247087cfbeSBarry Smith extern PetscErrorCode  DMCoarsen_DA(DM,MPI_Comm,DM*);
1257087cfbeSBarry Smith extern PetscErrorCode  DMRefineHierarchy_DA(DM,PetscInt,DM[]);
1267087cfbeSBarry Smith extern PetscErrorCode  DMCoarsenHierarchy_DA(DM,PetscInt,DM[]);
127e727c939SJed Brown extern PetscErrorCode  DMCreateInjection_DA(DM,DM,VecScatter*);
128e727c939SJed Brown extern PetscErrorCode  DMCreateAggregates_DA(DM,DM,Mat*);
1297087cfbeSBarry Smith extern PetscErrorCode  DMView_DA(DM,PetscViewer);
1307087cfbeSBarry Smith extern PetscErrorCode  DMSetUp_DA(DM);
1317087cfbeSBarry Smith extern PetscErrorCode  DMDestroy_DA(DM);
132e30e807fSPeter Brune extern PetscErrorCode  DMCreateDomainDecomposition_DA(DM,PetscInt*,char***,IS**,IS**,DM**);
133e30e807fSPeter Brune extern PetscErrorCode  DMCreateDomainDecompositionScatters_DA(DM,PetscInt,DM*,VecScatter**,VecScatter**,VecScatter**);
1349a42bb27SBarry Smith 
135b859378eSBarry Smith #undef __FUNCT__
136b859378eSBarry Smith #define __FUNCT__ "DMLoad_DA"
137b859378eSBarry Smith PetscErrorCode DMLoad_DA(DM da,PetscViewer viewer)
138b859378eSBarry Smith {
139b859378eSBarry Smith   PetscErrorCode   ierr;
140bc2bf880SBarry Smith   PetscInt         dim,m,n,p,dof,swidth;
141b859378eSBarry Smith   DMDAStencilType  stencil;
142b859378eSBarry Smith   DMDABoundaryType bx,by,bz;
143bc2bf880SBarry Smith   PetscBool        coors;
144bc2bf880SBarry Smith   DM               dac;
145bc2bf880SBarry Smith   Vec              c;
146b859378eSBarry Smith 
147b859378eSBarry Smith   PetscFunctionBegin;
148b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&dim,1,PETSC_INT);CHKERRQ(ierr);
149b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&m,1,PETSC_INT);CHKERRQ(ierr);
150b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&n,1,PETSC_INT);CHKERRQ(ierr);
151b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&p,1,PETSC_INT);CHKERRQ(ierr);
152b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&dof,1,PETSC_INT);CHKERRQ(ierr);
153b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&swidth,1,PETSC_INT);CHKERRQ(ierr);
154b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&bx,1,PETSC_ENUM);CHKERRQ(ierr);
155b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&by,1,PETSC_ENUM);CHKERRQ(ierr);
156b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&bz,1,PETSC_ENUM);CHKERRQ(ierr);
157b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&stencil,1,PETSC_ENUM);CHKERRQ(ierr);
158b859378eSBarry Smith 
159bc2bf880SBarry Smith   ierr = DMDASetDim(da, dim);CHKERRQ(ierr);
160bc2bf880SBarry Smith   ierr = DMDASetSizes(da, m,n,p);CHKERRQ(ierr);
161b859378eSBarry Smith   ierr = DMDASetBoundaryType(da, bx, by, bz);CHKERRQ(ierr);
162b859378eSBarry Smith   ierr = DMDASetDof(da, dof);CHKERRQ(ierr);
163b859378eSBarry Smith   ierr = DMDASetStencilType(da, stencil);CHKERRQ(ierr);
164b859378eSBarry Smith   ierr = DMDASetStencilWidth(da, swidth);CHKERRQ(ierr);
165b859378eSBarry Smith   ierr = DMSetUp(da);CHKERRQ(ierr);
166bc2bf880SBarry Smith   ierr = PetscViewerBinaryRead(viewer,&coors,1,PETSC_ENUM);CHKERRQ(ierr);
167bc2bf880SBarry Smith   if (coors) {
1686636e97aSMatthew G Knepley     ierr = DMGetCoordinateDM(da,&dac);CHKERRQ(ierr);
169bc2bf880SBarry Smith     ierr = DMCreateGlobalVector(dac,&c);CHKERRQ(ierr);
170bc2bf880SBarry Smith     ierr = VecLoad(c,viewer);CHKERRQ(ierr);
1716636e97aSMatthew G Knepley     ierr = DMSetCoordinates(da,c);CHKERRQ(ierr);
172bc2bf880SBarry Smith     ierr = VecDestroy(&c);CHKERRQ(ierr);
173bc2bf880SBarry Smith   }
174b859378eSBarry Smith   PetscFunctionReturn(0);
175b859378eSBarry Smith }
176b859378eSBarry Smith 
1771c3fb106SBarry Smith #undef __FUNCT__
178d724dfffSBarry Smith #define __FUNCT__ "DMCreateSubDM_DA"
179d724dfffSBarry Smith PetscErrorCode DMCreateSubDM_DA(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm)
180d724dfffSBarry Smith {
181d724dfffSBarry Smith   PetscErrorCode ierr;
182d724dfffSBarry Smith   DM_DA          *da = (DM_DA*)dm->data;
183d724dfffSBarry Smith 
184d724dfffSBarry Smith   PetscFunctionBegin;
185ce94432eSBarry Smith   if (da->dim != 2) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Support only implemented for 2d");
186d724dfffSBarry Smith   if (subdm) {
187ce94432eSBarry Smith     ierr = DMDACreate2d(PetscObjectComm((PetscObject)dm),da->bx,da->by,da->stencil_type,da->M,da->N,da->m,da->n,numFields,da->s,da->lx,da->ly,subdm);CHKERRQ(ierr);
188d724dfffSBarry Smith   }
189d724dfffSBarry Smith   if (is) {
190d724dfffSBarry Smith     PetscInt *indices,cnt = 0, dof = da->w,i,j;
191d724dfffSBarry Smith     ierr = PetscMalloc(sizeof(PetscInt)*da->Nlocal*numFields/dof,&indices);CHKERRQ(ierr);
192d724dfffSBarry Smith     for (i=da->base/dof; i<(da->base+da->Nlocal)/dof; i++) {
193d724dfffSBarry Smith       for (j=0; j<numFields; j++) {
194d724dfffSBarry Smith         indices[cnt++] = dof*i + fields[j];
195d724dfffSBarry Smith       }
196d724dfffSBarry Smith     }
197d724dfffSBarry Smith     if (cnt != da->Nlocal*numFields/dof) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Count does not equal expected value");
198ce94432eSBarry Smith     ierr = ISCreateGeneral(PetscObjectComm((PetscObject)dm),da->Nlocal*numFields/dof,indices,PETSC_OWN_POINTER,is);CHKERRQ(ierr);
199d724dfffSBarry Smith   }
200d724dfffSBarry Smith   PetscFunctionReturn(0);
201d724dfffSBarry Smith }
202d724dfffSBarry Smith 
203d724dfffSBarry Smith #undef __FUNCT__
20416621825SDmitry Karpeev #define __FUNCT__ "DMCreateFieldDecomposition_DA"
20516621825SDmitry Karpeev PetscErrorCode DMCreateFieldDecomposition_DA(DM dm, PetscInt *len,char ***namelist, IS **islist, DM **dmlist)
2061c3fb106SBarry Smith {
2071c3fb106SBarry Smith   PetscInt       i;
2081c3fb106SBarry Smith   PetscErrorCode ierr;
2091c3fb106SBarry Smith   DM_DA          *dd = (DM_DA*)dm->data;
2101c3fb106SBarry Smith   PetscInt       dof = dd->w;
2111c3fb106SBarry Smith 
2121c3fb106SBarry Smith   PetscFunctionBegin;
213731c8d9eSDmitry Karpeev   if (len) *len = dof;
2141c3fb106SBarry Smith   if (islist) {
2151c3fb106SBarry Smith     Vec      v;
2161c3fb106SBarry Smith     PetscInt rstart,n;
2171c3fb106SBarry Smith 
2181c3fb106SBarry Smith     ierr = DMGetGlobalVector(dm,&v);CHKERRQ(ierr);
2190298fd71SBarry Smith     ierr = VecGetOwnershipRange(v,&rstart,NULL);CHKERRQ(ierr);
2201c3fb106SBarry Smith     ierr = VecGetLocalSize(v,&n);CHKERRQ(ierr);
2211c3fb106SBarry Smith     ierr = DMRestoreGlobalVector(dm,&v);CHKERRQ(ierr);
2221c3fb106SBarry Smith     ierr = PetscMalloc(dof*sizeof(IS),islist);CHKERRQ(ierr);
2231c3fb106SBarry Smith     for (i=0; i<dof; i++) {
224ce94432eSBarry Smith       ierr = ISCreateStride(PetscObjectComm((PetscObject)dm),n/dof,rstart+i,dof,&(*islist)[i]);CHKERRQ(ierr);
2251c3fb106SBarry Smith     }
2261c3fb106SBarry Smith   }
2271c3fb106SBarry Smith   if (namelist) {
2281c3fb106SBarry Smith     ierr = PetscMalloc(dof*sizeof(const char*), namelist);CHKERRQ(ierr);
2291c3fb106SBarry Smith     if (dd->fieldname) {
2301c3fb106SBarry Smith       for (i=0; i<dof; i++) {
2311c3fb106SBarry Smith         ierr = PetscStrallocpy(dd->fieldname[i],&(*namelist)[i]);CHKERRQ(ierr);
2321c3fb106SBarry Smith       }
2331c3fb106SBarry Smith     } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Currently DMDA must have fieldnames");
2341c3fb106SBarry Smith   }
2351c3fb106SBarry Smith   if (dmlist) {
2361c3fb106SBarry Smith     DM da;
2371c3fb106SBarry Smith 
238ce94432eSBarry Smith     ierr = DMDACreate(PetscObjectComm((PetscObject)dm), &da);CHKERRQ(ierr);
2391c3fb106SBarry Smith     ierr = DMDASetDim(da, dd->dim);CHKERRQ(ierr);
2401c3fb106SBarry Smith     ierr = DMDASetSizes(da, dd->M, dd->N, dd->P);CHKERRQ(ierr);
2411c3fb106SBarry Smith     ierr = DMDASetNumProcs(da, dd->m, dd->n, dd->p);CHKERRQ(ierr);
2421c3fb106SBarry Smith     ierr = DMDASetBoundaryType(da, dd->bx, dd->by, dd->bz);CHKERRQ(ierr);
2431c3fb106SBarry Smith     ierr = DMDASetDof(da, 1);CHKERRQ(ierr);
2441c3fb106SBarry Smith     ierr = DMDASetStencilType(da, dd->stencil_type);CHKERRQ(ierr);
2451c3fb106SBarry Smith     ierr = DMDASetStencilWidth(da, dd->s);CHKERRQ(ierr);
2461c3fb106SBarry Smith     ierr = DMSetUp(da);CHKERRQ(ierr);
2471c3fb106SBarry Smith     ierr = PetscMalloc(dof*sizeof(DM),dmlist);CHKERRQ(ierr);
248c893992eSBarry Smith     for (i=0; i<dof-1; i++) {ierr = PetscObjectReference((PetscObject)da);CHKERRQ(ierr);}
2491c3fb106SBarry Smith     for (i=0; i<dof; i++) (*dmlist)[i] = da;
2501c3fb106SBarry Smith   }
2511c3fb106SBarry Smith   PetscFunctionReturn(0);
2521c3fb106SBarry Smith }
2531c3fb106SBarry Smith 
2543efe6655SBarry Smith /*MC
2553efe6655SBarry Smith    DMDA = "da" - A DM object that is used to manage data for a structured grid in 1, 2, or 3 dimensions.
2563efe6655SBarry Smith          In the global representation of the vector each process stores a non-overlapping rectangular (or slab in 3d) portion of the grid points.
2573efe6655SBarry Smith          In the local representation these rectangular regions (slabs) are extended in all directions by a stencil width.
2583efe6655SBarry Smith 
2593efe6655SBarry 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
2603efe6655SBarry Smith          vertex centered.
2613efe6655SBarry Smith 
2623efe6655SBarry Smith 
2633efe6655SBarry Smith   Level: intermediate
2643efe6655SBarry Smith 
2653efe6655SBarry Smith .seealso: DMType, DMCOMPOSITE, DMDACreate(), DMCreate(), DMSetType()
2663efe6655SBarry Smith M*/
2673efe6655SBarry Smith 
2681c3fb106SBarry Smith 
26947c6ae99SBarry Smith #undef __FUNCT__
270a4121054SBarry Smith #define __FUNCT__ "DMCreate_DA"
271*8cc058d9SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_DA(DM da)
27247c6ae99SBarry Smith {
27347c6ae99SBarry Smith   PetscErrorCode ierr;
27447c6ae99SBarry Smith   DM_DA          *dd;
27547c6ae99SBarry Smith 
27647c6ae99SBarry Smith   PetscFunctionBegin;
277a4121054SBarry Smith   PetscValidPointer(da,1);
278a4121054SBarry Smith   ierr     = PetscNewLog(da,DM_DA,&dd);CHKERRQ(ierr);
279a4121054SBarry Smith   da->data = dd;
28047c6ae99SBarry Smith 
28147c6ae99SBarry Smith   dd->dim        = -1;
282aa219208SBarry Smith   dd->interptype = DMDA_Q1;
28347c6ae99SBarry Smith   dd->refine_x   = 2;
28447c6ae99SBarry Smith   dd->refine_y   = 2;
28547c6ae99SBarry Smith   dd->refine_z   = 2;
28681c108dcSJed Brown   dd->coarsen_x  = 2;
28781c108dcSJed Brown   dd->coarsen_y  = 2;
28881c108dcSJed Brown   dd->coarsen_z  = 2;
2890298fd71SBarry Smith   dd->fieldname  = NULL;
29047c6ae99SBarry Smith   dd->nlocal     = -1;
29147c6ae99SBarry Smith   dd->Nlocal     = -1;
29247c6ae99SBarry Smith   dd->M          = -1;
29347c6ae99SBarry Smith   dd->N          = -1;
29447c6ae99SBarry Smith   dd->P          = -1;
29547c6ae99SBarry Smith   dd->m          = -1;
29647c6ae99SBarry Smith   dd->n          = -1;
29747c6ae99SBarry Smith   dd->p          = -1;
29847c6ae99SBarry Smith   dd->w          = -1;
29947c6ae99SBarry Smith   dd->s          = -1;
3008865f1eaSKarl Rupp 
30147c6ae99SBarry Smith   dd->xs = -1; dd->xe = -1; dd->ys = -1; dd->ye = -1; dd->zs = -1; dd->ze = -1;
30247c6ae99SBarry Smith   dd->Xs = -1; dd->Xe = -1; dd->Ys = -1; dd->Ye = -1; dd->Zs = -1; dd->Ze = -1;
30347c6ae99SBarry Smith 
3047ddda789SPeter Brune   dd->xol             = 0;
3057ddda789SPeter Brune   dd->yol             = 0;
3067ddda789SPeter Brune   dd->zol             = 0;
307d886c4f4SPeter Brune   dd->xo              = 0;
308d886c4f4SPeter Brune   dd->yo              = 0;
309d886c4f4SPeter Brune   dd->zo              = 0;
310e30e807fSPeter Brune   dd->Mo              = -1;
311e30e807fSPeter Brune   dd->No              = -1;
312e30e807fSPeter Brune   dd->Po              = -1;
31388661749SPeter Brune 
3140298fd71SBarry Smith   dd->gtol         = NULL;
3150298fd71SBarry Smith   dd->ltog         = NULL;
3160298fd71SBarry Smith   dd->ltol         = NULL;
3170298fd71SBarry Smith   dd->ao           = NULL;
31847c6ae99SBarry Smith   dd->base         = -1;
3191321219cSEthan Coon   dd->bx           = DMDA_BOUNDARY_NONE;
3201321219cSEthan Coon   dd->by           = DMDA_BOUNDARY_NONE;
3211321219cSEthan Coon   dd->bz           = DMDA_BOUNDARY_NONE;
322aa219208SBarry Smith   dd->stencil_type = DMDA_STENCIL_BOX;
323aa219208SBarry Smith   dd->interptype   = DMDA_Q1;
3240298fd71SBarry Smith   dd->idx          = NULL;
32547c6ae99SBarry Smith   dd->Nl           = -1;
3260298fd71SBarry Smith   dd->lx           = NULL;
3270298fd71SBarry Smith   dd->ly           = NULL;
3280298fd71SBarry Smith   dd->lz           = NULL;
32947c6ae99SBarry Smith 
330454e267fSLisandro Dalcin   dd->elementtype = DMDA_ELEMENT_Q1;
331454e267fSLisandro Dalcin 
33219fd82e9SBarry Smith   ierr = PetscStrallocpy(VECSTANDARD,(char**)&da->vectype);CHKERRQ(ierr);
3338865f1eaSKarl Rupp 
334a4121054SBarry Smith   da->ops->globaltolocalbegin          = DMGlobalToLocalBegin_DA;
335a4121054SBarry Smith   da->ops->globaltolocalend            = DMGlobalToLocalEnd_DA;
336a4121054SBarry Smith   da->ops->localtoglobalbegin          = DMLocalToGlobalBegin_DA;
337a4121054SBarry Smith   da->ops->localtoglobalend            = DMLocalToGlobalEnd_DA;
338a4121054SBarry Smith   da->ops->createglobalvector          = DMCreateGlobalVector_DA;
339a4121054SBarry Smith   da->ops->createlocalvector           = DMCreateLocalVector_DA;
34025296bd5SBarry Smith   da->ops->createinterpolation         = DMCreateInterpolation_DA;
341e727c939SJed Brown   da->ops->getcoloring                 = DMCreateColoring_DA;
34225296bd5SBarry Smith   da->ops->creatematrix                = DMCreateMatrix_DA;
343a4121054SBarry Smith   da->ops->refine                      = DMRefine_DA;
344a4121054SBarry Smith   da->ops->coarsen                     = DMCoarsen_DA;
345a4121054SBarry Smith   da->ops->refinehierarchy             = DMRefineHierarchy_DA;
346a4121054SBarry Smith   da->ops->coarsenhierarchy            = DMCoarsenHierarchy_DA;
347e727c939SJed Brown   da->ops->getinjection                = DMCreateInjection_DA;
348e727c939SJed Brown   da->ops->getaggregates               = DMCreateAggregates_DA;
349a4121054SBarry Smith   da->ops->destroy                     = DMDestroy_DA;
350a4121054SBarry Smith   da->ops->view                        = 0;
351a4121054SBarry Smith   da->ops->setfromoptions              = DMSetFromOptions_DA;
352a4121054SBarry Smith   da->ops->setup                       = DMSetUp_DA;
353b859378eSBarry Smith   da->ops->load                        = DMLoad_DA;
3546636e97aSMatthew G Knepley   da->ops->createcoordinatedm          = DMCreateCoordinateDM_DA;
355d724dfffSBarry Smith   da->ops->createsubdm                 = DMCreateSubDM_DA;
35616621825SDmitry Karpeev   da->ops->createfielddecomposition    = DMCreateFieldDecomposition_DA;
357e30e807fSPeter Brune   da->ops->createdomaindecomposition   = DMCreateDomainDecomposition_DA;
358e30e807fSPeter Brune   da->ops->createddscatters            = DMCreateDomainDecompositionScatters_DA;
359a4121054SBarry Smith   PetscFunctionReturn(0);
360a4121054SBarry Smith }
36147c6ae99SBarry Smith 
362a4121054SBarry Smith #undef __FUNCT__
363a4121054SBarry Smith #define __FUNCT__ "DMDACreate"
364a4121054SBarry Smith /*@
365a4121054SBarry Smith   DMDACreate - Creates a DMDA object.
366a4121054SBarry Smith 
367a4121054SBarry Smith   Collective on MPI_Comm
368a4121054SBarry Smith 
369a4121054SBarry Smith   Input Parameter:
370a4121054SBarry Smith . comm - The communicator for the DMDA object
371a4121054SBarry Smith 
372a4121054SBarry Smith   Output Parameter:
373a4121054SBarry Smith . da  - The DMDA object
374a4121054SBarry Smith 
375e0f5d30fSBarry Smith   Level: advanced
376e0f5d30fSBarry Smith 
377e0f5d30fSBarry Smith   Developers Note: Since there exists DMDACreate1/2/3d() should this routine even exist?
378a4121054SBarry Smith 
379a4121054SBarry Smith .keywords: DMDA, create
380e0f5d30fSBarry Smith .seealso:  DMDASetSizes(), DMDADuplicate(),  DMDACreate1d(), DMDACreate2d(), DMDACreate3d()
381a4121054SBarry Smith @*/
3827087cfbeSBarry Smith PetscErrorCode  DMDACreate(MPI_Comm comm, DM *da)
383a4121054SBarry Smith {
384a4121054SBarry Smith   PetscErrorCode ierr;
385a4121054SBarry Smith 
386a4121054SBarry Smith   PetscFunctionBegin;
387a4121054SBarry Smith   PetscValidPointer(da,2);
388a4121054SBarry Smith   ierr = DMCreate(comm,da);CHKERRQ(ierr);
389a4121054SBarry Smith   ierr = DMSetType(*da,DMDA);CHKERRQ(ierr);
39047c6ae99SBarry Smith   PetscFunctionReturn(0);
39147c6ae99SBarry Smith }
392b859378eSBarry Smith 
393b859378eSBarry Smith 
394