xref: /petsc/src/dm/impls/da/dacreate.c (revision 4271099b1b4426b8044a4dc70d0bcc9cd74eccb4)
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   ierr = PetscOptionsInt("-da_overlap_x","Decomposition overlap in x direction","DMDASetOverlap",dd->xol,&dd->xol,NULL);CHKERRQ(ierr);
407ddda789SPeter Brune   if (dd->dim > 1) {ierr = PetscOptionsInt("-da_overlap_y","Decomposition overlap in y direction","DMDASetOverlap",dd->yol,&dd->yol,NULL);CHKERRQ(ierr);}
417ddda789SPeter Brune   if (dd->dim > 2) {ierr = PetscOptionsInt("-da_overlap_z","Decomposition overlap in z direction","DMDASetOverlap",dd->zol,&dd->zol,NULL);CHKERRQ(ierr);}
423e7870d2SPeter Brune 
433e7870d2SPeter Brune   ierr = PetscOptionsInt("-da_local_subdomains","","DMDASetNumLocalSubdomains",dd->Nsub,&dd->Nsub,&flg);CHKERRQ(ierr);
443e7870d2SPeter Brune   if (flg) {ierr = DMDASetNumLocalSubDomains(da,dd->Nsub);CHKERRQ(ierr);}
453e7870d2SPeter Brune 
46aa219208SBarry Smith   /* Handle DMDA parallel distibution */
470298fd71SBarry Smith   ierr = PetscOptionsInt("-da_processors_x","Number of processors in x direction","DMDASetNumProcs",dd->m,&dd->m,NULL);CHKERRQ(ierr);
480298fd71SBarry Smith   if (dd->dim > 1) {ierr = PetscOptionsInt("-da_processors_y","Number of processors in y direction","DMDASetNumProcs",dd->n,&dd->n,NULL);CHKERRQ(ierr);}
490298fd71SBarry Smith   if (dd->dim > 2) {ierr = PetscOptionsInt("-da_processors_z","Number of processors in z direction","DMDASetNumProcs",dd->p,&dd->p,NULL);CHKERRQ(ierr);}
50aa219208SBarry Smith   /* Handle DMDA refinement */
510298fd71SBarry Smith   ierr = PetscOptionsInt("-da_refine_x","Refinement ratio in x direction","DMDASetRefinementFactor",dd->refine_x,&dd->refine_x,NULL);CHKERRQ(ierr);
520298fd71SBarry 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);}
530298fd71SBarry 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);}
5438fb6c91SJed Brown   dd->coarsen_x = dd->refine_x; dd->coarsen_y = dd->refine_y; dd->coarsen_z = dd->refine_z;
5547c6ae99SBarry Smith 
56397b6216SJed Brown   /* Get refinement factors, defaults taken from the coarse DMDA */
57397b6216SJed Brown   ierr = PetscMalloc3(maxnlevels,PetscInt,&refx,maxnlevels,PetscInt,&refy,maxnlevels,PetscInt,&refz);CHKERRQ(ierr);
58397b6216SJed Brown   ierr = DMDAGetRefinementFactor(da,&refx[0],&refy[0],&refz[0]);CHKERRQ(ierr);
59397b6216SJed Brown   for (i=1; i<maxnlevels; i++) {
60397b6216SJed Brown     refx[i] = refx[0];
61397b6216SJed Brown     refy[i] = refy[0];
62397b6216SJed Brown     refz[i] = refz[0];
63397b6216SJed Brown   }
64397b6216SJed Brown   n    = maxnlevels;
650298fd71SBarry Smith   ierr = PetscOptionsGetIntArray(((PetscObject)da)->prefix,"-da_refine_hierarchy_x",refx,&n,NULL);CHKERRQ(ierr);
66397b6216SJed Brown   if (da->levelup - da->leveldown >= 0) dd->refine_x = refx[da->levelup - da->leveldown];
67397b6216SJed Brown   if (da->levelup - da->leveldown >= 1) dd->coarsen_x = refx[da->levelup - da->leveldown - 1];
68397b6216SJed Brown   if (dd->dim > 1) {
69397b6216SJed Brown     n    = maxnlevels;
700298fd71SBarry Smith     ierr = PetscOptionsGetIntArray(((PetscObject)da)->prefix,"-da_refine_hierarchy_y",refy,&n,NULL);CHKERRQ(ierr);
71397b6216SJed Brown     if (da->levelup - da->leveldown >= 0) dd->refine_y = refy[da->levelup - da->leveldown];
72397b6216SJed Brown     if (da->levelup - da->leveldown >= 1) dd->coarsen_y = refy[da->levelup - da->leveldown - 1];
73397b6216SJed Brown   }
74397b6216SJed Brown   if (dd->dim > 2) {
75397b6216SJed Brown     n    = maxnlevels;
760298fd71SBarry Smith     ierr = PetscOptionsGetIntArray(((PetscObject)da)->prefix,"-da_refine_hierarchy_z",refz,&n,NULL);CHKERRQ(ierr);
77397b6216SJed Brown     if (da->levelup - da->leveldown >= 0) dd->refine_z = refz[da->levelup - da->leveldown];
78397b6216SJed Brown     if (da->levelup - da->leveldown >= 1) dd->coarsen_z = refz[da->levelup - da->leveldown - 1];
79397b6216SJed Brown   }
80397b6216SJed Brown 
810298fd71SBarry Smith   if (negativeMNP) {ierr = PetscOptionsInt("-da_refine","Uniformly refine DA one or more times","None",refine,&refine,NULL);CHKERRQ(ierr);}
82f9ba7244SBarry Smith   ierr = PetscOptionsTail();CHKERRQ(ierr);
83235683edSBarry Smith 
84e0f5d30fSBarry Smith   while (refine--) {
85e0f5d30fSBarry Smith     if (dd->bx == DMDA_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0) {
86e0f5d30fSBarry Smith       dd->M = dd->refine_x*dd->M;
87e0f5d30fSBarry Smith     } else {
88e0f5d30fSBarry Smith       dd->M = 1 + dd->refine_x*(dd->M - 1);
89e0f5d30fSBarry Smith     }
90e0f5d30fSBarry Smith     if (dd->by == DMDA_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0) {
91e0f5d30fSBarry Smith       dd->N = dd->refine_y*dd->N;
92e0f5d30fSBarry Smith     } else {
93e0f5d30fSBarry Smith       dd->N = 1 + dd->refine_y*(dd->N - 1);
94e0f5d30fSBarry Smith     }
95e0f5d30fSBarry Smith     if (dd->bz == DMDA_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0) {
96e0f5d30fSBarry Smith       dd->P = dd->refine_z*dd->P;
97e0f5d30fSBarry Smith     } else {
98e0f5d30fSBarry Smith       dd->P = 1 + dd->refine_z*(dd->P - 1);
99e0f5d30fSBarry Smith     }
100e0f5d30fSBarry Smith     da->levelup++;
10185fc4b34SJed Brown     if (da->levelup - da->leveldown >= 0) {
10285fc4b34SJed Brown       dd->refine_x = refx[da->levelup - da->leveldown];
10385fc4b34SJed Brown       dd->refine_y = refy[da->levelup - da->leveldown];
10485fc4b34SJed Brown       dd->refine_z = refz[da->levelup - da->leveldown];
10585fc4b34SJed Brown     }
10685fc4b34SJed Brown     if (da->levelup - da->leveldown >= 1) {
10785fc4b34SJed Brown       dd->coarsen_x = refx[da->levelup - da->leveldown - 1];
10885fc4b34SJed Brown       dd->coarsen_y = refy[da->levelup - da->leveldown - 1];
10985fc4b34SJed Brown       dd->coarsen_z = refz[da->levelup - da->leveldown - 1];
11085fc4b34SJed Brown     }
111e0f5d30fSBarry Smith   }
112397b6216SJed Brown   ierr = PetscFree3(refx,refy,refz);CHKERRQ(ierr);
11347c6ae99SBarry Smith   PetscFunctionReturn(0);
11447c6ae99SBarry Smith }
11547c6ae99SBarry Smith 
1167087cfbeSBarry Smith extern PetscErrorCode  DMCreateGlobalVector_DA(DM,Vec*);
1177087cfbeSBarry Smith extern PetscErrorCode  DMCreateLocalVector_DA(DM,Vec*);
1187087cfbeSBarry Smith extern PetscErrorCode  DMGlobalToLocalBegin_DA(DM,Vec,InsertMode,Vec);
1197087cfbeSBarry Smith extern PetscErrorCode  DMGlobalToLocalEnd_DA(DM,Vec,InsertMode,Vec);
1207087cfbeSBarry Smith extern PetscErrorCode  DMLocalToGlobalBegin_DA(DM,Vec,InsertMode,Vec);
1217087cfbeSBarry Smith extern PetscErrorCode  DMLocalToGlobalEnd_DA(DM,Vec,InsertMode,Vec);
122e727c939SJed Brown extern PetscErrorCode  DMCreateInterpolation_DA(DM,DM,Mat*,Vec*);
12319fd82e9SBarry Smith extern PetscErrorCode  DMCreateColoring_DA(DM,ISColoringType,MatType,ISColoring*);
12419fd82e9SBarry Smith extern PetscErrorCode  DMCreateMatrix_DA(DM,MatType,Mat*);
1256636e97aSMatthew G Knepley extern PetscErrorCode  DMCreateCoordinateDM_DA(DM,DM*);
1267087cfbeSBarry Smith extern PetscErrorCode  DMRefine_DA(DM,MPI_Comm,DM*);
1277087cfbeSBarry Smith extern PetscErrorCode  DMCoarsen_DA(DM,MPI_Comm,DM*);
1287087cfbeSBarry Smith extern PetscErrorCode  DMRefineHierarchy_DA(DM,PetscInt,DM[]);
1297087cfbeSBarry Smith extern PetscErrorCode  DMCoarsenHierarchy_DA(DM,PetscInt,DM[]);
130e727c939SJed Brown extern PetscErrorCode  DMCreateInjection_DA(DM,DM,VecScatter*);
131e727c939SJed Brown extern PetscErrorCode  DMCreateAggregates_DA(DM,DM,Mat*);
1327087cfbeSBarry Smith extern PetscErrorCode  DMView_DA(DM,PetscViewer);
1337087cfbeSBarry Smith extern PetscErrorCode  DMSetUp_DA(DM);
1347087cfbeSBarry Smith extern PetscErrorCode  DMDestroy_DA(DM);
135e30e807fSPeter Brune extern PetscErrorCode  DMCreateDomainDecomposition_DA(DM,PetscInt*,char***,IS**,IS**,DM**);
136e30e807fSPeter Brune extern PetscErrorCode  DMCreateDomainDecompositionScatters_DA(DM,PetscInt,DM*,VecScatter**,VecScatter**,VecScatter**);
1379a42bb27SBarry Smith 
138b859378eSBarry Smith #undef __FUNCT__
139b859378eSBarry Smith #define __FUNCT__ "DMLoad_DA"
140b859378eSBarry Smith PetscErrorCode DMLoad_DA(DM da,PetscViewer viewer)
141b859378eSBarry Smith {
142b859378eSBarry Smith   PetscErrorCode   ierr;
143bc2bf880SBarry Smith   PetscInt         dim,m,n,p,dof,swidth;
144b859378eSBarry Smith   DMDAStencilType  stencil;
145b859378eSBarry Smith   DMDABoundaryType bx,by,bz;
146bc2bf880SBarry Smith   PetscBool        coors;
147bc2bf880SBarry Smith   DM               dac;
148bc2bf880SBarry Smith   Vec              c;
149b859378eSBarry Smith 
150b859378eSBarry Smith   PetscFunctionBegin;
151b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&dim,1,PETSC_INT);CHKERRQ(ierr);
152b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&m,1,PETSC_INT);CHKERRQ(ierr);
153b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&n,1,PETSC_INT);CHKERRQ(ierr);
154b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&p,1,PETSC_INT);CHKERRQ(ierr);
155b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&dof,1,PETSC_INT);CHKERRQ(ierr);
156b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&swidth,1,PETSC_INT);CHKERRQ(ierr);
157b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&bx,1,PETSC_ENUM);CHKERRQ(ierr);
158b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&by,1,PETSC_ENUM);CHKERRQ(ierr);
159b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&bz,1,PETSC_ENUM);CHKERRQ(ierr);
160b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&stencil,1,PETSC_ENUM);CHKERRQ(ierr);
161b859378eSBarry Smith 
162bc2bf880SBarry Smith   ierr = DMDASetDim(da, dim);CHKERRQ(ierr);
163bc2bf880SBarry Smith   ierr = DMDASetSizes(da, m,n,p);CHKERRQ(ierr);
164b859378eSBarry Smith   ierr = DMDASetBoundaryType(da, bx, by, bz);CHKERRQ(ierr);
165b859378eSBarry Smith   ierr = DMDASetDof(da, dof);CHKERRQ(ierr);
166b859378eSBarry Smith   ierr = DMDASetStencilType(da, stencil);CHKERRQ(ierr);
167b859378eSBarry Smith   ierr = DMDASetStencilWidth(da, swidth);CHKERRQ(ierr);
168b859378eSBarry Smith   ierr = DMSetUp(da);CHKERRQ(ierr);
169bc2bf880SBarry Smith   ierr = PetscViewerBinaryRead(viewer,&coors,1,PETSC_ENUM);CHKERRQ(ierr);
170bc2bf880SBarry Smith   if (coors) {
1716636e97aSMatthew G Knepley     ierr = DMGetCoordinateDM(da,&dac);CHKERRQ(ierr);
172bc2bf880SBarry Smith     ierr = DMCreateGlobalVector(dac,&c);CHKERRQ(ierr);
173bc2bf880SBarry Smith     ierr = VecLoad(c,viewer);CHKERRQ(ierr);
1746636e97aSMatthew G Knepley     ierr = DMSetCoordinates(da,c);CHKERRQ(ierr);
175bc2bf880SBarry Smith     ierr = VecDestroy(&c);CHKERRQ(ierr);
176bc2bf880SBarry Smith   }
177b859378eSBarry Smith   PetscFunctionReturn(0);
178b859378eSBarry Smith }
179b859378eSBarry Smith 
1801c3fb106SBarry Smith #undef __FUNCT__
181d724dfffSBarry Smith #define __FUNCT__ "DMCreateSubDM_DA"
182d724dfffSBarry Smith PetscErrorCode DMCreateSubDM_DA(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm)
183d724dfffSBarry Smith {
184d724dfffSBarry Smith   PetscErrorCode ierr;
185d724dfffSBarry Smith   DM_DA          *da = (DM_DA*)dm->data;
186d724dfffSBarry Smith 
187d724dfffSBarry Smith   PetscFunctionBegin;
188d724dfffSBarry Smith   if (subdm) {
18938221697SMatthew G. Knepley     ierr = DMClone(dm, subdm);CHKERRQ(ierr);
19038221697SMatthew G. Knepley     ierr = DMDASetDof(*subdm, numFields);CHKERRQ(ierr);
191d724dfffSBarry Smith   }
192d724dfffSBarry Smith   if (is) {
193d724dfffSBarry Smith     PetscInt *indices, cnt = 0, dof = da->w, i, j;
19438221697SMatthew G. Knepley 
19538221697SMatthew G. Knepley     ierr = PetscMalloc(da->Nlocal*numFields/dof * sizeof(PetscInt), &indices);CHKERRQ(ierr);
19638221697SMatthew G. Knepley     for (i = da->base/dof; i < (da->base+da->Nlocal)/dof; ++i) {
19738221697SMatthew G. Knepley       for (j = 0; j < numFields; ++j) {
198d724dfffSBarry Smith         indices[cnt++] = dof*i + fields[j];
199d724dfffSBarry Smith       }
200d724dfffSBarry Smith     }
20138221697SMatthew G. Knepley     if (cnt != da->Nlocal*numFields/dof) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_PLIB, "Count %d does not equal expected value %d", cnt, da->Nlocal*numFields/dof);
20238221697SMatthew G. Knepley     ierr = ISCreateGeneral(PetscObjectComm((PetscObject) dm), cnt, indices, PETSC_OWN_POINTER, is);CHKERRQ(ierr);
203d724dfffSBarry Smith   }
204d724dfffSBarry Smith   PetscFunctionReturn(0);
205d724dfffSBarry Smith }
206d724dfffSBarry Smith 
207d724dfffSBarry Smith #undef __FUNCT__
20816621825SDmitry Karpeev #define __FUNCT__ "DMCreateFieldDecomposition_DA"
20916621825SDmitry Karpeev PetscErrorCode DMCreateFieldDecomposition_DA(DM dm, PetscInt *len,char ***namelist, IS **islist, DM **dmlist)
2101c3fb106SBarry Smith {
2111c3fb106SBarry Smith   PetscInt       i;
2121c3fb106SBarry Smith   PetscErrorCode ierr;
2131c3fb106SBarry Smith   DM_DA          *dd = (DM_DA*)dm->data;
2141c3fb106SBarry Smith   PetscInt       dof = dd->w;
2151c3fb106SBarry Smith 
2161c3fb106SBarry Smith   PetscFunctionBegin;
217731c8d9eSDmitry Karpeev   if (len) *len = dof;
2181c3fb106SBarry Smith   if (islist) {
2191c3fb106SBarry Smith     Vec      v;
2201c3fb106SBarry Smith     PetscInt rstart,n;
2211c3fb106SBarry Smith 
2221c3fb106SBarry Smith     ierr = DMGetGlobalVector(dm,&v);CHKERRQ(ierr);
2230298fd71SBarry Smith     ierr = VecGetOwnershipRange(v,&rstart,NULL);CHKERRQ(ierr);
2241c3fb106SBarry Smith     ierr = VecGetLocalSize(v,&n);CHKERRQ(ierr);
2251c3fb106SBarry Smith     ierr = DMRestoreGlobalVector(dm,&v);CHKERRQ(ierr);
2261c3fb106SBarry Smith     ierr = PetscMalloc(dof*sizeof(IS),islist);CHKERRQ(ierr);
2271c3fb106SBarry Smith     for (i=0; i<dof; i++) {
228ce94432eSBarry Smith       ierr = ISCreateStride(PetscObjectComm((PetscObject)dm),n/dof,rstart+i,dof,&(*islist)[i]);CHKERRQ(ierr);
2291c3fb106SBarry Smith     }
2301c3fb106SBarry Smith   }
2311c3fb106SBarry Smith   if (namelist) {
2321c3fb106SBarry Smith     ierr = PetscMalloc(dof*sizeof(const char*), namelist);CHKERRQ(ierr);
2331c3fb106SBarry Smith     if (dd->fieldname) {
2341c3fb106SBarry Smith       for (i=0; i<dof; i++) {
2351c3fb106SBarry Smith         ierr = PetscStrallocpy(dd->fieldname[i],&(*namelist)[i]);CHKERRQ(ierr);
2361c3fb106SBarry Smith       }
2371c3fb106SBarry Smith     } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Currently DMDA must have fieldnames");
2381c3fb106SBarry Smith   }
2391c3fb106SBarry Smith   if (dmlist) {
2401c3fb106SBarry Smith     DM da;
2411c3fb106SBarry Smith 
242ce94432eSBarry Smith     ierr = DMDACreate(PetscObjectComm((PetscObject)dm), &da);CHKERRQ(ierr);
2431c3fb106SBarry Smith     ierr = DMDASetDim(da, dd->dim);CHKERRQ(ierr);
2441c3fb106SBarry Smith     ierr = DMDASetSizes(da, dd->M, dd->N, dd->P);CHKERRQ(ierr);
2451c3fb106SBarry Smith     ierr = DMDASetNumProcs(da, dd->m, dd->n, dd->p);CHKERRQ(ierr);
2461c3fb106SBarry Smith     ierr = DMDASetBoundaryType(da, dd->bx, dd->by, dd->bz);CHKERRQ(ierr);
2471c3fb106SBarry Smith     ierr = DMDASetDof(da, 1);CHKERRQ(ierr);
2481c3fb106SBarry Smith     ierr = DMDASetStencilType(da, dd->stencil_type);CHKERRQ(ierr);
2491c3fb106SBarry Smith     ierr = DMDASetStencilWidth(da, dd->s);CHKERRQ(ierr);
2501c3fb106SBarry Smith     ierr = DMSetUp(da);CHKERRQ(ierr);
2511c3fb106SBarry Smith     ierr = PetscMalloc(dof*sizeof(DM),dmlist);CHKERRQ(ierr);
252c893992eSBarry Smith     for (i=0; i<dof-1; i++) {ierr = PetscObjectReference((PetscObject)da);CHKERRQ(ierr);}
2531c3fb106SBarry Smith     for (i=0; i<dof; i++) (*dmlist)[i] = da;
2541c3fb106SBarry Smith   }
2551c3fb106SBarry Smith   PetscFunctionReturn(0);
2561c3fb106SBarry Smith }
2571c3fb106SBarry Smith 
25838221697SMatthew G. Knepley #undef __FUNCT__
25938221697SMatthew G. Knepley #define __FUNCT__ "DMClone_DA"
26038221697SMatthew G. Knepley PetscErrorCode DMClone_DA(DM dm, DM *newdm)
26138221697SMatthew G. Knepley {
26238221697SMatthew G. Knepley   DM_DA         *da = (DM_DA *) dm->data;
26338221697SMatthew G. Knepley   PetscErrorCode ierr;
26438221697SMatthew G. Knepley 
26538221697SMatthew G. Knepley   PetscFunctionBegin;
266*4271099bSMatthew G. Knepley   ierr = DMSetType(*newdm, DMDA);CHKERRQ(ierr);
267*4271099bSMatthew G. Knepley   ierr = DMDASetDim(*newdm, da->dim);CHKERRQ(ierr);
268*4271099bSMatthew G. Knepley   ierr = DMDASetSizes(*newdm, da->M, da->N, da->P);CHKERRQ(ierr);
269*4271099bSMatthew G. Knepley   ierr = DMDASetNumProcs(*newdm, da->m, da->n, da->p);CHKERRQ(ierr);
270*4271099bSMatthew G. Knepley   ierr = DMDASetBoundaryType(*newdm, da->bx, da->by, da->bz);CHKERRQ(ierr);
271*4271099bSMatthew G. Knepley   ierr = DMDASetDof(*newdm, da->w);CHKERRQ(ierr);
272*4271099bSMatthew G. Knepley   ierr = DMDASetStencilType(*newdm, da->stencil_type);CHKERRQ(ierr);
273*4271099bSMatthew G. Knepley   ierr = DMDASetStencilWidth(*newdm, da->s);CHKERRQ(ierr);
274*4271099bSMatthew G. Knepley   ierr = DMDASetOwnershipRanges(*newdm, da->lx, da->ly, da->lz);CHKERRQ(ierr);
27538221697SMatthew G. Knepley   PetscFunctionReturn(0);
27638221697SMatthew G. Knepley }
27738221697SMatthew G. Knepley 
2783efe6655SBarry Smith /*MC
2793efe6655SBarry Smith    DMDA = "da" - A DM object that is used to manage data for a structured grid in 1, 2, or 3 dimensions.
2803efe6655SBarry Smith          In the global representation of the vector each process stores a non-overlapping rectangular (or slab in 3d) portion of the grid points.
2813efe6655SBarry Smith          In the local representation these rectangular regions (slabs) are extended in all directions by a stencil width.
2823efe6655SBarry Smith 
2833efe6655SBarry 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
2843efe6655SBarry Smith          vertex centered.
2853efe6655SBarry Smith 
2863efe6655SBarry Smith 
2873efe6655SBarry Smith   Level: intermediate
2883efe6655SBarry Smith 
2893efe6655SBarry Smith .seealso: DMType, DMCOMPOSITE, DMDACreate(), DMCreate(), DMSetType()
2903efe6655SBarry Smith M*/
2913efe6655SBarry Smith 
2921c3fb106SBarry Smith 
29347c6ae99SBarry Smith #undef __FUNCT__
294a4121054SBarry Smith #define __FUNCT__ "DMCreate_DA"
2958cc058d9SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_DA(DM da)
29647c6ae99SBarry Smith {
29747c6ae99SBarry Smith   PetscErrorCode ierr;
29847c6ae99SBarry Smith   DM_DA          *dd;
29947c6ae99SBarry Smith 
30047c6ae99SBarry Smith   PetscFunctionBegin;
301a4121054SBarry Smith   PetscValidPointer(da,1);
302a4121054SBarry Smith   ierr     = PetscNewLog(da,DM_DA,&dd);CHKERRQ(ierr);
303a4121054SBarry Smith   da->data = dd;
30447c6ae99SBarry Smith 
30547c6ae99SBarry Smith   dd->dim        = -1;
306aa219208SBarry Smith   dd->interptype = DMDA_Q1;
30747c6ae99SBarry Smith   dd->refine_x   = 2;
30847c6ae99SBarry Smith   dd->refine_y   = 2;
30947c6ae99SBarry Smith   dd->refine_z   = 2;
31081c108dcSJed Brown   dd->coarsen_x  = 2;
31181c108dcSJed Brown   dd->coarsen_y  = 2;
31281c108dcSJed Brown   dd->coarsen_z  = 2;
3130298fd71SBarry Smith   dd->fieldname  = NULL;
31447c6ae99SBarry Smith   dd->nlocal     = -1;
31547c6ae99SBarry Smith   dd->Nlocal     = -1;
31647c6ae99SBarry Smith   dd->M          = -1;
31747c6ae99SBarry Smith   dd->N          = -1;
31847c6ae99SBarry Smith   dd->P          = -1;
31947c6ae99SBarry Smith   dd->m          = -1;
32047c6ae99SBarry Smith   dd->n          = -1;
32147c6ae99SBarry Smith   dd->p          = -1;
32247c6ae99SBarry Smith   dd->w          = -1;
32347c6ae99SBarry Smith   dd->s          = -1;
3248865f1eaSKarl Rupp 
32547c6ae99SBarry Smith   dd->xs = -1; dd->xe = -1; dd->ys = -1; dd->ye = -1; dd->zs = -1; dd->ze = -1;
32647c6ae99SBarry Smith   dd->Xs = -1; dd->Xe = -1; dd->Ys = -1; dd->Ye = -1; dd->Zs = -1; dd->Ze = -1;
32747c6ae99SBarry Smith 
3283e7870d2SPeter Brune   dd->Nsub            = 1;
3297ddda789SPeter Brune   dd->xol             = 0;
3307ddda789SPeter Brune   dd->yol             = 0;
3317ddda789SPeter Brune   dd->zol             = 0;
332d886c4f4SPeter Brune   dd->xo              = 0;
333d886c4f4SPeter Brune   dd->yo              = 0;
334d886c4f4SPeter Brune   dd->zo              = 0;
335e30e807fSPeter Brune   dd->Mo              = -1;
336e30e807fSPeter Brune   dd->No              = -1;
337e30e807fSPeter Brune   dd->Po              = -1;
33888661749SPeter Brune 
3390298fd71SBarry Smith   dd->gtol         = NULL;
3400298fd71SBarry Smith   dd->ltog         = NULL;
3410298fd71SBarry Smith   dd->ltol         = NULL;
3420298fd71SBarry Smith   dd->ao           = NULL;
34347c6ae99SBarry Smith   dd->base         = -1;
3441321219cSEthan Coon   dd->bx           = DMDA_BOUNDARY_NONE;
3451321219cSEthan Coon   dd->by           = DMDA_BOUNDARY_NONE;
3461321219cSEthan Coon   dd->bz           = DMDA_BOUNDARY_NONE;
347aa219208SBarry Smith   dd->stencil_type = DMDA_STENCIL_BOX;
348aa219208SBarry Smith   dd->interptype   = DMDA_Q1;
3490298fd71SBarry Smith   dd->idx          = NULL;
35047c6ae99SBarry Smith   dd->Nl           = -1;
3510298fd71SBarry Smith   dd->lx           = NULL;
3520298fd71SBarry Smith   dd->ly           = NULL;
3530298fd71SBarry Smith   dd->lz           = NULL;
35447c6ae99SBarry Smith 
355454e267fSLisandro Dalcin   dd->elementtype = DMDA_ELEMENT_Q1;
356454e267fSLisandro Dalcin 
35719fd82e9SBarry Smith   ierr = PetscStrallocpy(VECSTANDARD,(char**)&da->vectype);CHKERRQ(ierr);
3588865f1eaSKarl Rupp 
359a4121054SBarry Smith   da->ops->globaltolocalbegin          = DMGlobalToLocalBegin_DA;
360a4121054SBarry Smith   da->ops->globaltolocalend            = DMGlobalToLocalEnd_DA;
361a4121054SBarry Smith   da->ops->localtoglobalbegin          = DMLocalToGlobalBegin_DA;
362a4121054SBarry Smith   da->ops->localtoglobalend            = DMLocalToGlobalEnd_DA;
363a4121054SBarry Smith   da->ops->createglobalvector          = DMCreateGlobalVector_DA;
364a4121054SBarry Smith   da->ops->createlocalvector           = DMCreateLocalVector_DA;
36525296bd5SBarry Smith   da->ops->createinterpolation         = DMCreateInterpolation_DA;
366e727c939SJed Brown   da->ops->getcoloring                 = DMCreateColoring_DA;
36725296bd5SBarry Smith   da->ops->creatematrix                = DMCreateMatrix_DA;
368a4121054SBarry Smith   da->ops->refine                      = DMRefine_DA;
369a4121054SBarry Smith   da->ops->coarsen                     = DMCoarsen_DA;
370a4121054SBarry Smith   da->ops->refinehierarchy             = DMRefineHierarchy_DA;
371a4121054SBarry Smith   da->ops->coarsenhierarchy            = DMCoarsenHierarchy_DA;
372e727c939SJed Brown   da->ops->getinjection                = DMCreateInjection_DA;
373e727c939SJed Brown   da->ops->getaggregates               = DMCreateAggregates_DA;
374a4121054SBarry Smith   da->ops->destroy                     = DMDestroy_DA;
375a4121054SBarry Smith   da->ops->view                        = 0;
376a4121054SBarry Smith   da->ops->setfromoptions              = DMSetFromOptions_DA;
377a4121054SBarry Smith   da->ops->setup                       = DMSetUp_DA;
37838221697SMatthew G. Knepley   da->ops->clone                       = DMClone_DA;
379b859378eSBarry Smith   da->ops->load                        = DMLoad_DA;
3806636e97aSMatthew G Knepley   da->ops->createcoordinatedm          = DMCreateCoordinateDM_DA;
381d724dfffSBarry Smith   da->ops->createsubdm                 = DMCreateSubDM_DA;
38216621825SDmitry Karpeev   da->ops->createfielddecomposition    = DMCreateFieldDecomposition_DA;
383e30e807fSPeter Brune   da->ops->createdomaindecomposition   = DMCreateDomainDecomposition_DA;
384e30e807fSPeter Brune   da->ops->createddscatters            = DMCreateDomainDecompositionScatters_DA;
385a4121054SBarry Smith   PetscFunctionReturn(0);
386a4121054SBarry Smith }
38747c6ae99SBarry Smith 
388a4121054SBarry Smith #undef __FUNCT__
389a4121054SBarry Smith #define __FUNCT__ "DMDACreate"
390a4121054SBarry Smith /*@
391a4121054SBarry Smith   DMDACreate - Creates a DMDA object.
392a4121054SBarry Smith 
393a4121054SBarry Smith   Collective on MPI_Comm
394a4121054SBarry Smith 
395a4121054SBarry Smith   Input Parameter:
396a4121054SBarry Smith . comm - The communicator for the DMDA object
397a4121054SBarry Smith 
398a4121054SBarry Smith   Output Parameter:
399a4121054SBarry Smith . da  - The DMDA object
400a4121054SBarry Smith 
401e0f5d30fSBarry Smith   Level: advanced
402e0f5d30fSBarry Smith 
403e0f5d30fSBarry Smith   Developers Note: Since there exists DMDACreate1/2/3d() should this routine even exist?
404a4121054SBarry Smith 
405a4121054SBarry Smith .keywords: DMDA, create
406e0f5d30fSBarry Smith .seealso:  DMDASetSizes(), DMDADuplicate(),  DMDACreate1d(), DMDACreate2d(), DMDACreate3d()
407a4121054SBarry Smith @*/
4087087cfbeSBarry Smith PetscErrorCode  DMDACreate(MPI_Comm comm, DM *da)
409a4121054SBarry Smith {
410a4121054SBarry Smith   PetscErrorCode ierr;
411a4121054SBarry Smith 
412a4121054SBarry Smith   PetscFunctionBegin;
413a4121054SBarry Smith   PetscValidPointer(da,2);
414a4121054SBarry Smith   ierr = DMCreate(comm,da);CHKERRQ(ierr);
415a4121054SBarry Smith   ierr = DMSetType(*da,DMDA);CHKERRQ(ierr);
41647c6ae99SBarry Smith   PetscFunctionReturn(0);
41747c6ae99SBarry Smith }
418b859378eSBarry Smith 
419b859378eSBarry Smith 
420