xref: /petsc/src/dm/impls/da/dacreate.c (revision 65db9045f9e35ff14c6d05fb92ad299b1bd0d785)
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);
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);}
360298fd71SBarry Smith   ierr = PetscOptionsInt("-da_overlap","Overlap between local grids","DMDASetOverlap",dd->overlap,&dd->overlap,NULL);CHKERRQ(ierr);
37*65db9045SDmitry Karpeev     /* Whether to use DMCreateDomainDecomposition() to define subdomains (e.g., for ASM). */
38*65db9045SDmitry Karpeev     ierr = PetscOptionsBool("-da_use_domain_decomposition", "Use DMCreateDomainDecomposition","DMDASetUseDomainDecomposition",dd->decompositiondm,&dd->decompositiondm,PETSC_NULL);CHKERRQ(ierr);
39aa219208SBarry Smith   /* Handle DMDA parallel distibution */
400298fd71SBarry Smith   ierr = PetscOptionsInt("-da_processors_x","Number of processors in x direction","DMDASetNumProcs",dd->m,&dd->m,NULL);CHKERRQ(ierr);
410298fd71SBarry Smith   if (dd->dim > 1) {ierr = PetscOptionsInt("-da_processors_y","Number of processors in y direction","DMDASetNumProcs",dd->n,&dd->n,NULL);CHKERRQ(ierr);}
420298fd71SBarry Smith   if (dd->dim > 2) {ierr = PetscOptionsInt("-da_processors_z","Number of processors in z direction","DMDASetNumProcs",dd->p,&dd->p,NULL);CHKERRQ(ierr);}
43aa219208SBarry Smith   /* Handle DMDA refinement */
440298fd71SBarry Smith   ierr = PetscOptionsInt("-da_refine_x","Refinement ratio in x direction","DMDASetRefinementFactor",dd->refine_x,&dd->refine_x,NULL);CHKERRQ(ierr);
450298fd71SBarry 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);}
460298fd71SBarry 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);}
4738fb6c91SJed Brown   dd->coarsen_x = dd->refine_x; dd->coarsen_y = dd->refine_y; dd->coarsen_z = dd->refine_z;
4847c6ae99SBarry Smith 
49397b6216SJed Brown   /* Get refinement factors, defaults taken from the coarse DMDA */
50397b6216SJed Brown   ierr = PetscMalloc3(maxnlevels,PetscInt,&refx,maxnlevels,PetscInt,&refy,maxnlevels,PetscInt,&refz);CHKERRQ(ierr);
51397b6216SJed Brown   ierr = DMDAGetRefinementFactor(da,&refx[0],&refy[0],&refz[0]);CHKERRQ(ierr);
52397b6216SJed Brown   for (i=1; i<maxnlevels; i++) {
53397b6216SJed Brown     refx[i] = refx[0];
54397b6216SJed Brown     refy[i] = refy[0];
55397b6216SJed Brown     refz[i] = refz[0];
56397b6216SJed Brown   }
57397b6216SJed Brown   n    = maxnlevels;
580298fd71SBarry Smith   ierr = PetscOptionsGetIntArray(((PetscObject)da)->prefix,"-da_refine_hierarchy_x",refx,&n,NULL);CHKERRQ(ierr);
59397b6216SJed Brown   if (da->levelup - da->leveldown >= 0) dd->refine_x = refx[da->levelup - da->leveldown];
60397b6216SJed Brown   if (da->levelup - da->leveldown >= 1) dd->coarsen_x = refx[da->levelup - da->leveldown - 1];
61397b6216SJed Brown   if (dd->dim > 1) {
62397b6216SJed Brown     n    = maxnlevels;
630298fd71SBarry Smith     ierr = PetscOptionsGetIntArray(((PetscObject)da)->prefix,"-da_refine_hierarchy_y",refy,&n,NULL);CHKERRQ(ierr);
64397b6216SJed Brown     if (da->levelup - da->leveldown >= 0) dd->refine_y = refy[da->levelup - da->leveldown];
65397b6216SJed Brown     if (da->levelup - da->leveldown >= 1) dd->coarsen_y = refy[da->levelup - da->leveldown - 1];
66397b6216SJed Brown   }
67397b6216SJed Brown   if (dd->dim > 2) {
68397b6216SJed Brown     n    = maxnlevels;
690298fd71SBarry Smith     ierr = PetscOptionsGetIntArray(((PetscObject)da)->prefix,"-da_refine_hierarchy_z",refz,&n,NULL);CHKERRQ(ierr);
70397b6216SJed Brown     if (da->levelup - da->leveldown >= 0) dd->refine_z = refz[da->levelup - da->leveldown];
71397b6216SJed Brown     if (da->levelup - da->leveldown >= 1) dd->coarsen_z = refz[da->levelup - da->leveldown - 1];
72397b6216SJed Brown   }
73397b6216SJed Brown 
740298fd71SBarry Smith   if (negativeMNP) {ierr = PetscOptionsInt("-da_refine","Uniformly refine DA one or more times","None",refine,&refine,NULL);CHKERRQ(ierr);}
75f9ba7244SBarry Smith   ierr = PetscOptionsTail();CHKERRQ(ierr);
76235683edSBarry Smith 
77e0f5d30fSBarry Smith   while (refine--) {
78e0f5d30fSBarry Smith     if (dd->bx == DMDA_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0) {
79e0f5d30fSBarry Smith       dd->M = dd->refine_x*dd->M;
80e0f5d30fSBarry Smith     } else {
81e0f5d30fSBarry Smith       dd->M = 1 + dd->refine_x*(dd->M - 1);
82e0f5d30fSBarry Smith     }
83e0f5d30fSBarry Smith     if (dd->by == DMDA_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0) {
84e0f5d30fSBarry Smith       dd->N = dd->refine_y*dd->N;
85e0f5d30fSBarry Smith     } else {
86e0f5d30fSBarry Smith       dd->N = 1 + dd->refine_y*(dd->N - 1);
87e0f5d30fSBarry Smith     }
88e0f5d30fSBarry Smith     if (dd->bz == DMDA_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0) {
89e0f5d30fSBarry Smith       dd->P = dd->refine_z*dd->P;
90e0f5d30fSBarry Smith     } else {
91e0f5d30fSBarry Smith       dd->P = 1 + dd->refine_z*(dd->P - 1);
92e0f5d30fSBarry Smith     }
93e0f5d30fSBarry Smith     da->levelup++;
9485fc4b34SJed Brown     if (da->levelup - da->leveldown >= 0) {
9585fc4b34SJed Brown       dd->refine_x = refx[da->levelup - da->leveldown];
9685fc4b34SJed Brown       dd->refine_y = refy[da->levelup - da->leveldown];
9785fc4b34SJed Brown       dd->refine_z = refz[da->levelup - da->leveldown];
9885fc4b34SJed Brown     }
9985fc4b34SJed Brown     if (da->levelup - da->leveldown >= 1) {
10085fc4b34SJed Brown       dd->coarsen_x = refx[da->levelup - da->leveldown - 1];
10185fc4b34SJed Brown       dd->coarsen_y = refy[da->levelup - da->leveldown - 1];
10285fc4b34SJed Brown       dd->coarsen_z = refz[da->levelup - da->leveldown - 1];
10385fc4b34SJed Brown     }
104e0f5d30fSBarry Smith   }
105397b6216SJed Brown   ierr = PetscFree3(refx,refy,refz);CHKERRQ(ierr);
10647c6ae99SBarry Smith   PetscFunctionReturn(0);
10747c6ae99SBarry Smith }
10847c6ae99SBarry Smith 
1097087cfbeSBarry Smith extern PetscErrorCode  DMCreateGlobalVector_DA(DM,Vec*);
1107087cfbeSBarry Smith extern PetscErrorCode  DMCreateLocalVector_DA(DM,Vec*);
1117087cfbeSBarry Smith extern PetscErrorCode  DMGlobalToLocalBegin_DA(DM,Vec,InsertMode,Vec);
1127087cfbeSBarry Smith extern PetscErrorCode  DMGlobalToLocalEnd_DA(DM,Vec,InsertMode,Vec);
1137087cfbeSBarry Smith extern PetscErrorCode  DMLocalToGlobalBegin_DA(DM,Vec,InsertMode,Vec);
1147087cfbeSBarry Smith extern PetscErrorCode  DMLocalToGlobalEnd_DA(DM,Vec,InsertMode,Vec);
115e727c939SJed Brown extern PetscErrorCode  DMCreateInterpolation_DA(DM,DM,Mat*,Vec*);
11619fd82e9SBarry Smith extern PetscErrorCode  DMCreateColoring_DA(DM,ISColoringType,MatType,ISColoring*);
11719fd82e9SBarry Smith extern PetscErrorCode  DMCreateMatrix_DA(DM,MatType,Mat*);
1186636e97aSMatthew G Knepley extern PetscErrorCode  DMCreateCoordinateDM_DA(DM,DM*);
1197087cfbeSBarry Smith extern PetscErrorCode  DMRefine_DA(DM,MPI_Comm,DM*);
1207087cfbeSBarry Smith extern PetscErrorCode  DMCoarsen_DA(DM,MPI_Comm,DM*);
1217087cfbeSBarry Smith extern PetscErrorCode  DMRefineHierarchy_DA(DM,PetscInt,DM[]);
1227087cfbeSBarry Smith extern PetscErrorCode  DMCoarsenHierarchy_DA(DM,PetscInt,DM[]);
123e727c939SJed Brown extern PetscErrorCode  DMCreateInjection_DA(DM,DM,VecScatter*);
124e727c939SJed Brown extern PetscErrorCode  DMCreateAggregates_DA(DM,DM,Mat*);
1257087cfbeSBarry Smith extern PetscErrorCode  DMView_DA(DM,PetscViewer);
1267087cfbeSBarry Smith extern PetscErrorCode  DMSetUp_DA(DM);
1277087cfbeSBarry Smith extern PetscErrorCode  DMDestroy_DA(DM);
128e30e807fSPeter Brune extern PetscErrorCode  DMCreateDomainDecomposition_DA(DM,PetscInt*,char***,IS**,IS**,DM**);
129e30e807fSPeter Brune extern PetscErrorCode  DMCreateDomainDecompositionScatters_DA(DM,PetscInt,DM*,VecScatter**,VecScatter**,VecScatter**);
1309a42bb27SBarry Smith 
131b859378eSBarry Smith #undef __FUNCT__
132b859378eSBarry Smith #define __FUNCT__ "DMLoad_DA"
133b859378eSBarry Smith PetscErrorCode DMLoad_DA(DM da,PetscViewer viewer)
134b859378eSBarry Smith {
135b859378eSBarry Smith   PetscErrorCode   ierr;
136bc2bf880SBarry Smith   PetscInt         dim,m,n,p,dof,swidth;
137b859378eSBarry Smith   DMDAStencilType  stencil;
138b859378eSBarry Smith   DMDABoundaryType bx,by,bz;
139bc2bf880SBarry Smith   PetscBool        coors;
140bc2bf880SBarry Smith   DM               dac;
141bc2bf880SBarry Smith   Vec              c;
142b859378eSBarry Smith 
143b859378eSBarry Smith   PetscFunctionBegin;
144b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&dim,1,PETSC_INT);CHKERRQ(ierr);
145b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&m,1,PETSC_INT);CHKERRQ(ierr);
146b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&n,1,PETSC_INT);CHKERRQ(ierr);
147b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&p,1,PETSC_INT);CHKERRQ(ierr);
148b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&dof,1,PETSC_INT);CHKERRQ(ierr);
149b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&swidth,1,PETSC_INT);CHKERRQ(ierr);
150b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&bx,1,PETSC_ENUM);CHKERRQ(ierr);
151b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&by,1,PETSC_ENUM);CHKERRQ(ierr);
152b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&bz,1,PETSC_ENUM);CHKERRQ(ierr);
153b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&stencil,1,PETSC_ENUM);CHKERRQ(ierr);
154b859378eSBarry Smith 
155bc2bf880SBarry Smith   ierr = DMDASetDim(da, dim);CHKERRQ(ierr);
156bc2bf880SBarry Smith   ierr = DMDASetSizes(da, m,n,p);CHKERRQ(ierr);
157b859378eSBarry Smith   ierr = DMDASetBoundaryType(da, bx, by, bz);CHKERRQ(ierr);
158b859378eSBarry Smith   ierr = DMDASetDof(da, dof);CHKERRQ(ierr);
159b859378eSBarry Smith   ierr = DMDASetStencilType(da, stencil);CHKERRQ(ierr);
160b859378eSBarry Smith   ierr = DMDASetStencilWidth(da, swidth);CHKERRQ(ierr);
161b859378eSBarry Smith   ierr = DMSetUp(da);CHKERRQ(ierr);
162bc2bf880SBarry Smith   ierr = PetscViewerBinaryRead(viewer,&coors,1,PETSC_ENUM);CHKERRQ(ierr);
163bc2bf880SBarry Smith   if (coors) {
1646636e97aSMatthew G Knepley     ierr = DMGetCoordinateDM(da,&dac);CHKERRQ(ierr);
165bc2bf880SBarry Smith     ierr = DMCreateGlobalVector(dac,&c);CHKERRQ(ierr);
166bc2bf880SBarry Smith     ierr = VecLoad(c,viewer);CHKERRQ(ierr);
1676636e97aSMatthew G Knepley     ierr = DMSetCoordinates(da,c);CHKERRQ(ierr);
168bc2bf880SBarry Smith     ierr = VecDestroy(&c);CHKERRQ(ierr);
169bc2bf880SBarry Smith   }
170b859378eSBarry Smith   PetscFunctionReturn(0);
171b859378eSBarry Smith }
172b859378eSBarry Smith 
1731c3fb106SBarry Smith #undef __FUNCT__
174d724dfffSBarry Smith #define __FUNCT__ "DMCreateSubDM_DA"
175d724dfffSBarry Smith PetscErrorCode DMCreateSubDM_DA(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm)
176d724dfffSBarry Smith {
177d724dfffSBarry Smith   PetscErrorCode ierr;
178d724dfffSBarry Smith   DM_DA          *da = (DM_DA*)dm->data;
179d724dfffSBarry Smith 
180d724dfffSBarry Smith   PetscFunctionBegin;
181d724dfffSBarry Smith   if (da->dim != 2) SETERRQ(((PetscObject)dm)->comm,PETSC_ERR_SUP,"Support only implemented for 2d");
182d724dfffSBarry Smith   if (subdm) {
183d724dfffSBarry 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);
184d724dfffSBarry Smith   }
185d724dfffSBarry Smith   if (is) {
186d724dfffSBarry Smith     PetscInt *indices,cnt = 0, dof = da->w,i,j;
187d724dfffSBarry Smith     ierr = PetscMalloc(sizeof(PetscInt)*da->Nlocal*numFields/dof,&indices);CHKERRQ(ierr);
188d724dfffSBarry Smith     for (i=da->base/dof; i<(da->base+da->Nlocal)/dof; i++) {
189d724dfffSBarry Smith       for (j=0; j<numFields; j++) {
190d724dfffSBarry Smith         indices[cnt++] = dof*i + fields[j];
191d724dfffSBarry Smith       }
192d724dfffSBarry Smith     }
193d724dfffSBarry Smith     if (cnt != da->Nlocal*numFields/dof) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Count does not equal expected value");
194d724dfffSBarry Smith     ierr = ISCreateGeneral(((PetscObject)dm)->comm,da->Nlocal*numFields/dof,indices,PETSC_OWN_POINTER,is);CHKERRQ(ierr);
195d724dfffSBarry Smith   }
196d724dfffSBarry Smith   PetscFunctionReturn(0);
197d724dfffSBarry Smith }
198d724dfffSBarry Smith 
199d724dfffSBarry Smith #undef __FUNCT__
20016621825SDmitry Karpeev #define __FUNCT__ "DMCreateFieldDecomposition_DA"
20116621825SDmitry Karpeev PetscErrorCode DMCreateFieldDecomposition_DA(DM dm, PetscInt *len,char ***namelist, IS **islist, DM **dmlist)
2021c3fb106SBarry Smith {
2031c3fb106SBarry Smith   PetscInt       i;
2041c3fb106SBarry Smith   PetscErrorCode ierr;
2051c3fb106SBarry Smith   DM_DA          *dd = (DM_DA*)dm->data;
2061c3fb106SBarry Smith   PetscInt       dof = dd->w;
2071c3fb106SBarry Smith 
2081c3fb106SBarry Smith   PetscFunctionBegin;
209731c8d9eSDmitry Karpeev   if (len) *len = dof;
2101c3fb106SBarry Smith   if (islist) {
2111c3fb106SBarry Smith     Vec      v;
2121c3fb106SBarry Smith     PetscInt rstart,n;
2131c3fb106SBarry Smith 
2141c3fb106SBarry Smith     ierr = DMGetGlobalVector(dm,&v);CHKERRQ(ierr);
2150298fd71SBarry Smith     ierr = VecGetOwnershipRange(v,&rstart,NULL);CHKERRQ(ierr);
2161c3fb106SBarry Smith     ierr = VecGetLocalSize(v,&n);CHKERRQ(ierr);
2171c3fb106SBarry Smith     ierr = DMRestoreGlobalVector(dm,&v);CHKERRQ(ierr);
2181c3fb106SBarry Smith     ierr = PetscMalloc(dof*sizeof(IS),islist);CHKERRQ(ierr);
2191c3fb106SBarry Smith     for (i=0; i<dof; i++) {
2201c3fb106SBarry Smith       ierr = ISCreateStride(((PetscObject)dm)->comm,n/dof,rstart+i,dof,&(*islist)[i]);CHKERRQ(ierr);
2211c3fb106SBarry Smith     }
2221c3fb106SBarry Smith   }
2231c3fb106SBarry Smith   if (namelist) {
2241c3fb106SBarry Smith     ierr = PetscMalloc(dof*sizeof(const char*), namelist);CHKERRQ(ierr);
2251c3fb106SBarry Smith     if (dd->fieldname) {
2261c3fb106SBarry Smith       for (i=0; i<dof; i++) {
2271c3fb106SBarry Smith         ierr = PetscStrallocpy(dd->fieldname[i],&(*namelist)[i]);CHKERRQ(ierr);
2281c3fb106SBarry Smith       }
2291c3fb106SBarry Smith     } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Currently DMDA must have fieldnames");
2301c3fb106SBarry Smith   }
2311c3fb106SBarry Smith   if (dmlist) {
2321c3fb106SBarry Smith     DM da;
2331c3fb106SBarry Smith 
2341c3fb106SBarry Smith     ierr = DMDACreate(((PetscObject)dm)->comm, &da);CHKERRQ(ierr);
2351c3fb106SBarry Smith     ierr = DMDASetDim(da, dd->dim);CHKERRQ(ierr);
2361c3fb106SBarry Smith     ierr = DMDASetSizes(da, dd->M, dd->N, dd->P);CHKERRQ(ierr);
2371c3fb106SBarry Smith     ierr = DMDASetNumProcs(da, dd->m, dd->n, dd->p);CHKERRQ(ierr);
2381c3fb106SBarry Smith     ierr = DMDASetBoundaryType(da, dd->bx, dd->by, dd->bz);CHKERRQ(ierr);
2391c3fb106SBarry Smith     ierr = DMDASetDof(da, 1);CHKERRQ(ierr);
2401c3fb106SBarry Smith     ierr = DMDASetStencilType(da, dd->stencil_type);CHKERRQ(ierr);
2411c3fb106SBarry Smith     ierr = DMDASetStencilWidth(da, dd->s);CHKERRQ(ierr);
2421c3fb106SBarry Smith     ierr = DMSetUp(da);CHKERRQ(ierr);
2431c3fb106SBarry Smith     ierr = PetscMalloc(dof*sizeof(DM),dmlist);CHKERRQ(ierr);
244c893992eSBarry Smith     for (i=0; i<dof-1; i++) {ierr = PetscObjectReference((PetscObject)da);CHKERRQ(ierr);}
2451c3fb106SBarry Smith     for (i=0; i<dof; i++) (*dmlist)[i] = da;
2461c3fb106SBarry Smith   }
2471c3fb106SBarry Smith   PetscFunctionReturn(0);
2481c3fb106SBarry Smith }
2491c3fb106SBarry Smith 
2503efe6655SBarry Smith /*MC
2513efe6655SBarry Smith    DMDA = "da" - A DM object that is used to manage data for a structured grid in 1, 2, or 3 dimensions.
2523efe6655SBarry Smith          In the global representation of the vector each process stores a non-overlapping rectangular (or slab in 3d) portion of the grid points.
2533efe6655SBarry Smith          In the local representation these rectangular regions (slabs) are extended in all directions by a stencil width.
2543efe6655SBarry Smith 
2553efe6655SBarry 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
2563efe6655SBarry Smith          vertex centered.
2573efe6655SBarry Smith 
2583efe6655SBarry Smith 
2593efe6655SBarry Smith   Level: intermediate
2603efe6655SBarry Smith 
2613efe6655SBarry Smith .seealso: DMType, DMCOMPOSITE, DMDACreate(), DMCreate(), DMSetType()
2623efe6655SBarry Smith M*/
2633efe6655SBarry Smith 
2641c3fb106SBarry Smith 
265a4121054SBarry Smith EXTERN_C_BEGIN
26647c6ae99SBarry Smith #undef __FUNCT__
267a4121054SBarry Smith #define __FUNCT__ "DMCreate_DA"
2687087cfbeSBarry Smith PetscErrorCode  DMCreate_DA(DM da)
26947c6ae99SBarry Smith {
27047c6ae99SBarry Smith   PetscErrorCode ierr;
27147c6ae99SBarry Smith   DM_DA          *dd;
27247c6ae99SBarry Smith 
27347c6ae99SBarry Smith   PetscFunctionBegin;
274a4121054SBarry Smith   PetscValidPointer(da,1);
275a4121054SBarry Smith   ierr     = PetscNewLog(da,DM_DA,&dd);CHKERRQ(ierr);
276a4121054SBarry Smith   da->data = dd;
27747c6ae99SBarry Smith 
27847c6ae99SBarry Smith   dd->dim        = -1;
279aa219208SBarry Smith   dd->interptype = DMDA_Q1;
28047c6ae99SBarry Smith   dd->refine_x   = 2;
28147c6ae99SBarry Smith   dd->refine_y   = 2;
28247c6ae99SBarry Smith   dd->refine_z   = 2;
28381c108dcSJed Brown   dd->coarsen_x  = 2;
28481c108dcSJed Brown   dd->coarsen_y  = 2;
28581c108dcSJed Brown   dd->coarsen_z  = 2;
2860298fd71SBarry Smith   dd->fieldname  = NULL;
28747c6ae99SBarry Smith   dd->nlocal     = -1;
28847c6ae99SBarry Smith   dd->Nlocal     = -1;
28947c6ae99SBarry Smith   dd->M          = -1;
29047c6ae99SBarry Smith   dd->N          = -1;
29147c6ae99SBarry Smith   dd->P          = -1;
29247c6ae99SBarry Smith   dd->m          = -1;
29347c6ae99SBarry Smith   dd->n          = -1;
29447c6ae99SBarry Smith   dd->p          = -1;
29547c6ae99SBarry Smith   dd->w          = -1;
29647c6ae99SBarry Smith   dd->s          = -1;
2978865f1eaSKarl Rupp 
29847c6ae99SBarry Smith   dd->xs = -1; dd->xe = -1; dd->ys = -1; dd->ye = -1; dd->zs = -1; dd->ze = -1;
29947c6ae99SBarry Smith   dd->Xs = -1; dd->Xe = -1; dd->Ys = -1; dd->Ye = -1; dd->Zs = -1; dd->Ze = -1;
30047c6ae99SBarry Smith 
3010a696f66SPeter Brune   dd->decompositiondm = PETSC_FALSE;
30288661749SPeter Brune   dd->overlap         = 0;
303d886c4f4SPeter Brune   dd->xo              = 0;
304d886c4f4SPeter Brune   dd->yo              = 0;
305d886c4f4SPeter Brune   dd->zo              = 0;
306e30e807fSPeter Brune   dd->Mo              = -1;
307e30e807fSPeter Brune   dd->No              = -1;
308e30e807fSPeter Brune   dd->Po              = -1;
30988661749SPeter Brune 
3100298fd71SBarry Smith   dd->gtol         = NULL;
3110298fd71SBarry Smith   dd->ltog         = NULL;
3120298fd71SBarry Smith   dd->ltol         = NULL;
3130298fd71SBarry Smith   dd->ao           = NULL;
31447c6ae99SBarry Smith   dd->base         = -1;
3151321219cSEthan Coon   dd->bx           = DMDA_BOUNDARY_NONE;
3161321219cSEthan Coon   dd->by           = DMDA_BOUNDARY_NONE;
3171321219cSEthan Coon   dd->bz           = DMDA_BOUNDARY_NONE;
318aa219208SBarry Smith   dd->stencil_type = DMDA_STENCIL_BOX;
319aa219208SBarry Smith   dd->interptype   = DMDA_Q1;
3200298fd71SBarry Smith   dd->idx          = NULL;
32147c6ae99SBarry Smith   dd->Nl           = -1;
3220298fd71SBarry Smith   dd->lx           = NULL;
3230298fd71SBarry Smith   dd->ly           = NULL;
3240298fd71SBarry Smith   dd->lz           = NULL;
32547c6ae99SBarry Smith 
326454e267fSLisandro Dalcin   dd->elementtype = DMDA_ELEMENT_Q1;
327454e267fSLisandro Dalcin 
32819fd82e9SBarry Smith   ierr = PetscStrallocpy(VECSTANDARD,(char**)&da->vectype);CHKERRQ(ierr);
3298865f1eaSKarl Rupp 
330a4121054SBarry Smith   da->ops->globaltolocalbegin          = DMGlobalToLocalBegin_DA;
331a4121054SBarry Smith   da->ops->globaltolocalend            = DMGlobalToLocalEnd_DA;
332a4121054SBarry Smith   da->ops->localtoglobalbegin          = DMLocalToGlobalBegin_DA;
333a4121054SBarry Smith   da->ops->localtoglobalend            = DMLocalToGlobalEnd_DA;
334a4121054SBarry Smith   da->ops->createglobalvector          = DMCreateGlobalVector_DA;
335a4121054SBarry Smith   da->ops->createlocalvector           = DMCreateLocalVector_DA;
33625296bd5SBarry Smith   da->ops->createinterpolation         = DMCreateInterpolation_DA;
337e727c939SJed Brown   da->ops->getcoloring                 = DMCreateColoring_DA;
33825296bd5SBarry Smith   da->ops->creatematrix                = DMCreateMatrix_DA;
339a4121054SBarry Smith   da->ops->refine                      = DMRefine_DA;
340a4121054SBarry Smith   da->ops->coarsen                     = DMCoarsen_DA;
341a4121054SBarry Smith   da->ops->refinehierarchy             = DMRefineHierarchy_DA;
342a4121054SBarry Smith   da->ops->coarsenhierarchy            = DMCoarsenHierarchy_DA;
343e727c939SJed Brown   da->ops->getinjection                = DMCreateInjection_DA;
344e727c939SJed Brown   da->ops->getaggregates               = DMCreateAggregates_DA;
345a4121054SBarry Smith   da->ops->destroy                     = DMDestroy_DA;
346a4121054SBarry Smith   da->ops->view                        = 0;
347a4121054SBarry Smith   da->ops->setfromoptions              = DMSetFromOptions_DA;
348a4121054SBarry Smith   da->ops->setup                       = DMSetUp_DA;
349b859378eSBarry Smith   da->ops->load                        = DMLoad_DA;
3506636e97aSMatthew G Knepley   da->ops->createcoordinatedm          = DMCreateCoordinateDM_DA;
351d724dfffSBarry Smith   da->ops->createsubdm                 = DMCreateSubDM_DA;
35216621825SDmitry Karpeev   da->ops->createfielddecomposition    = DMCreateFieldDecomposition_DA;
353e30e807fSPeter Brune   da->ops->createdomaindecomposition   = DMCreateDomainDecomposition_DA;
354e30e807fSPeter Brune   da->ops->createddscatters            = DMCreateDomainDecompositionScatters_DA;
355a4121054SBarry Smith   PetscFunctionReturn(0);
356a4121054SBarry Smith }
357a4121054SBarry Smith EXTERN_C_END
35847c6ae99SBarry Smith 
359a4121054SBarry Smith #undef __FUNCT__
360a4121054SBarry Smith #define __FUNCT__ "DMDACreate"
361a4121054SBarry Smith /*@
362a4121054SBarry Smith   DMDACreate - Creates a DMDA object.
363a4121054SBarry Smith 
364a4121054SBarry Smith   Collective on MPI_Comm
365a4121054SBarry Smith 
366a4121054SBarry Smith   Input Parameter:
367a4121054SBarry Smith . comm - The communicator for the DMDA object
368a4121054SBarry Smith 
369a4121054SBarry Smith   Output Parameter:
370a4121054SBarry Smith . da  - The DMDA object
371a4121054SBarry Smith 
372e0f5d30fSBarry Smith   Level: advanced
373e0f5d30fSBarry Smith 
374e0f5d30fSBarry Smith   Developers Note: Since there exists DMDACreate1/2/3d() should this routine even exist?
375a4121054SBarry Smith 
376a4121054SBarry Smith .keywords: DMDA, create
377e0f5d30fSBarry Smith .seealso:  DMDASetSizes(), DMDADuplicate(),  DMDACreate1d(), DMDACreate2d(), DMDACreate3d()
378a4121054SBarry Smith @*/
3797087cfbeSBarry Smith PetscErrorCode  DMDACreate(MPI_Comm comm, DM *da)
380a4121054SBarry Smith {
381a4121054SBarry Smith   PetscErrorCode ierr;
382a4121054SBarry Smith 
383a4121054SBarry Smith   PetscFunctionBegin;
384a4121054SBarry Smith   PetscValidPointer(da,2);
385a4121054SBarry Smith   ierr = DMCreate(comm,da);CHKERRQ(ierr);
386a4121054SBarry Smith   ierr = DMSetType(*da,DMDA);CHKERRQ(ierr);
38747c6ae99SBarry Smith   PetscFunctionReturn(0);
38847c6ae99SBarry Smith }
389b859378eSBarry Smith 
390b859378eSBarry Smith 
391