xref: /petsc/src/dm/impls/da/dacreate.c (revision d724dfffc20f5834ebb4b97bb1e8ef89c8c2f0ed)
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);
126e30e807fSPeter Brune extern PetscErrorCode  DMCreateDomainDecomposition_DA(DM,PetscInt*,char ***,IS**,IS**,DM**);
127e30e807fSPeter 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__
172*d724dfffSBarry Smith #define __FUNCT__ "DMCreateSubDM_DA"
173*d724dfffSBarry Smith PetscErrorCode DMCreateSubDM_DA(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm)
174*d724dfffSBarry Smith {
175*d724dfffSBarry Smith   PetscErrorCode ierr;
176*d724dfffSBarry Smith   DM_DA          *da = (DM_DA*)dm->data;
177*d724dfffSBarry Smith 
178*d724dfffSBarry Smith   PetscFunctionBegin;
179*d724dfffSBarry Smith   if (da->dim != 2) SETERRQ(((PetscObject)dm)->comm,PETSC_ERR_SUP,"Support only implemented for 2d");
180*d724dfffSBarry Smith   if (subdm) {
181*d724dfffSBarry Smith     ierr = DMDACreate2d(((PetscObject)dm)->comm,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);
182*d724dfffSBarry Smith   }
183*d724dfffSBarry Smith   if (is) {
184*d724dfffSBarry Smith     PetscInt *indices,cnt = 0, dof = da->w,i,j;
185*d724dfffSBarry Smith     ierr = PetscMalloc(sizeof(PetscInt)*da->Nlocal*numFields/dof,&indices);CHKERRQ(ierr);
186*d724dfffSBarry Smith     for (i=da->base/dof; i<(da->base+da->Nlocal)/dof; i++) {
187*d724dfffSBarry Smith       for (j=0; j<numFields; j++) {
188*d724dfffSBarry Smith         indices[cnt++] = dof*i + fields[j];
189*d724dfffSBarry Smith       }
190*d724dfffSBarry Smith     }
191*d724dfffSBarry Smith     if (cnt != da->Nlocal*numFields/dof) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Count does not equal expected value");
192*d724dfffSBarry Smith     ierr = ISCreateGeneral(((PetscObject)dm)->comm,da->Nlocal*numFields/dof,indices,PETSC_OWN_POINTER,is);CHKERRQ(ierr);
193*d724dfffSBarry Smith   }
194*d724dfffSBarry Smith   PetscFunctionReturn(0);
195*d724dfffSBarry Smith }
196*d724dfffSBarry Smith 
197*d724dfffSBarry Smith #undef __FUNCT__
19816621825SDmitry Karpeev #define __FUNCT__ "DMCreateFieldDecomposition_DA"
19916621825SDmitry Karpeev PetscErrorCode DMCreateFieldDecomposition_DA(DM dm, PetscInt *len,char ***namelist, IS **islist, DM** dmlist)
2001c3fb106SBarry Smith {
2011c3fb106SBarry Smith   PetscInt       i;
2021c3fb106SBarry Smith   PetscErrorCode ierr;
2031c3fb106SBarry Smith   DM_DA          *dd = (DM_DA*)dm->data;
2041c3fb106SBarry Smith   PetscInt       dof = dd->w;
2051c3fb106SBarry Smith 
2061c3fb106SBarry Smith   PetscFunctionBegin;
207731c8d9eSDmitry Karpeev   if (len) *len = dof;
2081c3fb106SBarry Smith   if (islist) {
2091c3fb106SBarry Smith     Vec      v;
2101c3fb106SBarry Smith     PetscInt rstart,n;
2111c3fb106SBarry Smith 
2121c3fb106SBarry Smith     ierr = DMGetGlobalVector(dm,&v);CHKERRQ(ierr);
2131c3fb106SBarry Smith     ierr = VecGetOwnershipRange(v,&rstart,PETSC_NULL);CHKERRQ(ierr);
2141c3fb106SBarry Smith     ierr = VecGetLocalSize(v,&n);CHKERRQ(ierr);
2151c3fb106SBarry Smith     ierr = DMRestoreGlobalVector(dm,&v);CHKERRQ(ierr);
2161c3fb106SBarry Smith     ierr = PetscMalloc(dof*sizeof(IS),islist);CHKERRQ(ierr);
2171c3fb106SBarry Smith     for (i=0; i<dof; i++) {
2181c3fb106SBarry Smith       ierr = ISCreateStride(((PetscObject)dm)->comm,n/dof,rstart+i,dof,&(*islist)[i]);CHKERRQ(ierr);
2191c3fb106SBarry Smith     }
2201c3fb106SBarry Smith   }
2211c3fb106SBarry Smith   if (namelist) {
2221c3fb106SBarry Smith     ierr = PetscMalloc(dof*sizeof(const char *), namelist);CHKERRQ(ierr);
2231c3fb106SBarry Smith     if (dd->fieldname) {
2241c3fb106SBarry Smith       for (i=0; i<dof; i++) {
2251c3fb106SBarry Smith         ierr = PetscStrallocpy(dd->fieldname[i],&(*namelist)[i]);CHKERRQ(ierr);
2261c3fb106SBarry Smith       }
2271c3fb106SBarry Smith     } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Currently DMDA must have fieldnames");
2281c3fb106SBarry Smith   }
2291c3fb106SBarry Smith   if (dmlist) {
2301c3fb106SBarry Smith     DM da;
2311c3fb106SBarry Smith 
2321c3fb106SBarry Smith     ierr = DMDACreate(((PetscObject)dm)->comm, &da);CHKERRQ(ierr);
2331c3fb106SBarry Smith     ierr = DMDASetDim(da, dd->dim);CHKERRQ(ierr);
2341c3fb106SBarry Smith     ierr = DMDASetSizes(da, dd->M, dd->N, dd->P);CHKERRQ(ierr);
2351c3fb106SBarry Smith     ierr = DMDASetNumProcs(da, dd->m, dd->n, dd->p);CHKERRQ(ierr);
2361c3fb106SBarry Smith     ierr = DMDASetBoundaryType(da, dd->bx, dd->by, dd->bz);CHKERRQ(ierr);
2371c3fb106SBarry Smith     ierr = DMDASetDof(da, 1);CHKERRQ(ierr);
2381c3fb106SBarry Smith     ierr = DMDASetStencilType(da, dd->stencil_type);CHKERRQ(ierr);
2391c3fb106SBarry Smith     ierr = DMDASetStencilWidth(da, dd->s);CHKERRQ(ierr);
2401c3fb106SBarry Smith     ierr = DMSetUp(da);CHKERRQ(ierr);
2411c3fb106SBarry Smith     ierr = PetscMalloc(dof*sizeof(DM),dmlist);CHKERRQ(ierr);
242c893992eSBarry Smith     for (i=0; i<dof-1; i++) {ierr = PetscObjectReference((PetscObject)da);CHKERRQ(ierr);}
2431c3fb106SBarry Smith     for (i=0; i<dof; i++) (*dmlist)[i] = da;
2441c3fb106SBarry Smith   }
2451c3fb106SBarry Smith 
2461c3fb106SBarry Smith   PetscFunctionReturn(0);
2471c3fb106SBarry Smith }
2481c3fb106SBarry Smith 
2493efe6655SBarry Smith /*MC
2503efe6655SBarry Smith    DMDA = "da" - A DM object that is used to manage data for a structured grid in 1, 2, or 3 dimensions.
2513efe6655SBarry Smith          In the global representation of the vector each process stores a non-overlapping rectangular (or slab in 3d) portion of the grid points.
2523efe6655SBarry Smith          In the local representation these rectangular regions (slabs) are extended in all directions by a stencil width.
2533efe6655SBarry Smith 
2543efe6655SBarry 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
2553efe6655SBarry Smith          vertex centered.
2563efe6655SBarry Smith 
2573efe6655SBarry Smith 
2583efe6655SBarry Smith   Level: intermediate
2593efe6655SBarry Smith 
2603efe6655SBarry Smith .seealso: DMType, DMCOMPOSITE, DMDACreate(), DMCreate(), DMSetType()
2613efe6655SBarry Smith M*/
2623efe6655SBarry Smith 
2631c3fb106SBarry Smith 
264a4121054SBarry Smith EXTERN_C_BEGIN
26547c6ae99SBarry Smith #undef __FUNCT__
266a4121054SBarry Smith #define __FUNCT__ "DMCreate_DA"
2677087cfbeSBarry Smith PetscErrorCode  DMCreate_DA(DM da)
26847c6ae99SBarry Smith {
26947c6ae99SBarry Smith   PetscErrorCode ierr;
27047c6ae99SBarry Smith   DM_DA          *dd;
27147c6ae99SBarry Smith 
27247c6ae99SBarry Smith   PetscFunctionBegin;
273a4121054SBarry Smith   PetscValidPointer(da,1);
274a4121054SBarry Smith   ierr = PetscNewLog(da,DM_DA,&dd);CHKERRQ(ierr);
275a4121054SBarry Smith   da->data = dd;
27647c6ae99SBarry Smith 
27747c6ae99SBarry Smith   dd->dim        = -1;
278aa219208SBarry Smith   dd->interptype = DMDA_Q1;
27947c6ae99SBarry Smith   dd->refine_x   = 2;
28047c6ae99SBarry Smith   dd->refine_y   = 2;
28147c6ae99SBarry Smith   dd->refine_z   = 2;
28281c108dcSJed Brown   dd->coarsen_x  = 2;
28381c108dcSJed Brown   dd->coarsen_y  = 2;
28481c108dcSJed Brown   dd->coarsen_z  = 2;
28547c6ae99SBarry Smith   dd->fieldname  = PETSC_NULL;
28647c6ae99SBarry Smith   dd->nlocal     = -1;
28747c6ae99SBarry Smith   dd->Nlocal     = -1;
28847c6ae99SBarry Smith   dd->M          = -1;
28947c6ae99SBarry Smith   dd->N          = -1;
29047c6ae99SBarry Smith   dd->P          = -1;
29147c6ae99SBarry Smith   dd->m          = -1;
29247c6ae99SBarry Smith   dd->n          = -1;
29347c6ae99SBarry Smith   dd->p          = -1;
29447c6ae99SBarry Smith   dd->w          = -1;
29547c6ae99SBarry Smith   dd->s          = -1;
29647c6ae99SBarry Smith   dd->xs = -1; dd->xe = -1; dd->ys = -1; dd->ye = -1; dd->zs = -1; dd->ze = -1;
29747c6ae99SBarry Smith   dd->Xs = -1; dd->Xe = -1; dd->Ys = -1; dd->Ye = -1; dd->Zs = -1; dd->Ze = -1;
29847c6ae99SBarry Smith 
29988661749SPeter Brune   dd->overlap      = 0;
300d886c4f4SPeter Brune   dd->xo           = 0;
301d886c4f4SPeter Brune   dd->yo           = 0;
302d886c4f4SPeter Brune   dd->zo           = 0;
303e30e807fSPeter Brune   dd->Mo           = -1;
304e30e807fSPeter Brune   dd->No           = -1;
305e30e807fSPeter Brune   dd->Po           = -1;
30688661749SPeter Brune 
30747c6ae99SBarry Smith   dd->gtol         = PETSC_NULL;
30847c6ae99SBarry Smith   dd->ltog         = PETSC_NULL;
30947c6ae99SBarry Smith   dd->ltol         = PETSC_NULL;
31047c6ae99SBarry Smith   dd->ao           = PETSC_NULL;
31147c6ae99SBarry Smith   dd->base         = -1;
3121321219cSEthan Coon   dd->bx         = DMDA_BOUNDARY_NONE;
3131321219cSEthan Coon   dd->by         = DMDA_BOUNDARY_NONE;
3141321219cSEthan Coon   dd->bz         = DMDA_BOUNDARY_NONE;
315aa219208SBarry Smith   dd->stencil_type = DMDA_STENCIL_BOX;
316aa219208SBarry Smith   dd->interptype   = DMDA_Q1;
31747c6ae99SBarry Smith   dd->idx          = PETSC_NULL;
31847c6ae99SBarry Smith   dd->Nl           = -1;
31947c6ae99SBarry Smith   dd->lx           = PETSC_NULL;
32047c6ae99SBarry Smith   dd->ly           = PETSC_NULL;
32147c6ae99SBarry Smith   dd->lz           = PETSC_NULL;
32247c6ae99SBarry Smith 
323454e267fSLisandro Dalcin   dd->elementtype  = DMDA_ELEMENT_Q1;
324454e267fSLisandro Dalcin 
32519fd82e9SBarry Smith   ierr = PetscStrallocpy(VECSTANDARD,(char**)&da->vectype);CHKERRQ(ierr);
326a4121054SBarry Smith   da->ops->globaltolocalbegin  = DMGlobalToLocalBegin_DA;
327a4121054SBarry Smith   da->ops->globaltolocalend    = DMGlobalToLocalEnd_DA;
328a4121054SBarry Smith   da->ops->localtoglobalbegin  = DMLocalToGlobalBegin_DA;
329a4121054SBarry Smith   da->ops->localtoglobalend    = DMLocalToGlobalEnd_DA;
330a4121054SBarry Smith   da->ops->createglobalvector  = DMCreateGlobalVector_DA;
331a4121054SBarry Smith   da->ops->createlocalvector   = DMCreateLocalVector_DA;
33225296bd5SBarry Smith   da->ops->createinterpolation = DMCreateInterpolation_DA;
333e727c939SJed Brown   da->ops->getcoloring         = DMCreateColoring_DA;
33425296bd5SBarry Smith   da->ops->creatematrix        = DMCreateMatrix_DA;
335a4121054SBarry Smith   da->ops->refine              = DMRefine_DA;
336a4121054SBarry Smith   da->ops->coarsen             = DMCoarsen_DA;
337a4121054SBarry Smith   da->ops->refinehierarchy     = DMRefineHierarchy_DA;
338a4121054SBarry Smith   da->ops->coarsenhierarchy    = DMCoarsenHierarchy_DA;
339e727c939SJed Brown   da->ops->getinjection        = DMCreateInjection_DA;
340e727c939SJed Brown   da->ops->getaggregates       = DMCreateAggregates_DA;
341a4121054SBarry Smith   da->ops->destroy             = DMDestroy_DA;
342a4121054SBarry Smith   da->ops->view                = 0;
343a4121054SBarry Smith   da->ops->setfromoptions      = DMSetFromOptions_DA;
344a4121054SBarry Smith   da->ops->setup               = DMSetUp_DA;
345b859378eSBarry Smith   da->ops->load                = DMLoad_DA;
3466636e97aSMatthew G Knepley   da->ops->createcoordinatedm  = DMCreateCoordinateDM_DA;
347*d724dfffSBarry Smith   da->ops->createsubdm         = DMCreateSubDM_DA;
34816621825SDmitry Karpeev   da->ops->createfielddecomposition = DMCreateFieldDecomposition_DA;
349e30e807fSPeter Brune   da->ops->createdomaindecomposition = DMCreateDomainDecomposition_DA;
350e30e807fSPeter Brune   da->ops->createddscatters = DMCreateDomainDecompositionScatters_DA;
351a4121054SBarry Smith   PetscFunctionReturn(0);
352a4121054SBarry Smith }
353a4121054SBarry Smith EXTERN_C_END
35447c6ae99SBarry Smith 
355a4121054SBarry Smith #undef __FUNCT__
356a4121054SBarry Smith #define __FUNCT__ "DMDACreate"
357a4121054SBarry Smith /*@
358a4121054SBarry Smith   DMDACreate - Creates a DMDA object.
359a4121054SBarry Smith 
360a4121054SBarry Smith   Collective on MPI_Comm
361a4121054SBarry Smith 
362a4121054SBarry Smith   Input Parameter:
363a4121054SBarry Smith . comm - The communicator for the DMDA object
364a4121054SBarry Smith 
365a4121054SBarry Smith   Output Parameter:
366a4121054SBarry Smith . da  - The DMDA object
367a4121054SBarry Smith 
368e0f5d30fSBarry Smith   Level: advanced
369e0f5d30fSBarry Smith 
370e0f5d30fSBarry Smith   Developers Note: Since there exists DMDACreate1/2/3d() should this routine even exist?
371a4121054SBarry Smith 
372a4121054SBarry Smith .keywords: DMDA, create
373e0f5d30fSBarry Smith .seealso:  DMDASetSizes(), DMDADuplicate(),  DMDACreate1d(), DMDACreate2d(), DMDACreate3d()
374a4121054SBarry Smith @*/
3757087cfbeSBarry Smith PetscErrorCode  DMDACreate(MPI_Comm comm, DM *da)
376a4121054SBarry Smith {
377a4121054SBarry Smith   PetscErrorCode ierr;
378a4121054SBarry Smith 
379a4121054SBarry Smith   PetscFunctionBegin;
380a4121054SBarry Smith   PetscValidPointer(da,2);
381a4121054SBarry Smith   ierr = DMCreate(comm,da);CHKERRQ(ierr);
382a4121054SBarry Smith   ierr = DMSetType(*da,DMDA);CHKERRQ(ierr);
38347c6ae99SBarry Smith   PetscFunctionReturn(0);
38447c6ae99SBarry Smith }
385b859378eSBarry Smith 
386b859378eSBarry Smith 
387