xref: /petsc/src/dm/impls/forest/forest.c (revision 26d9498a6f9f10e42780cedfbe76690d1ae7fbfa)
1fbbfd472SToby Isaac #include <petsc/private/dmforestimpl.h> /*I petscdmforest.h I*/
2fbbfd472SToby Isaac #include <petsc/private/dmimpl.h>       /*I petscdm.h */
3ef19d27cSToby Isaac #include <petscsf.h>
4db4d5e8cSToby Isaac 
527d4645fSToby Isaac PetscBool DMForestPackageInitialized = PETSC_FALSE;
627d4645fSToby Isaac 
727d4645fSToby Isaac typedef struct _DMForestTypeLink *DMForestTypeLink;
827d4645fSToby Isaac 
927d4645fSToby Isaac struct _DMForestTypeLink
1027d4645fSToby Isaac {
1127d4645fSToby Isaac   char *name;
1227d4645fSToby Isaac   DMForestTypeLink next;
1327d4645fSToby Isaac };
1427d4645fSToby Isaac 
1527d4645fSToby Isaac DMForestTypeLink DMForestTypeList;
1627d4645fSToby Isaac 
1727d4645fSToby Isaac #undef __FUNCT__
1827d4645fSToby Isaac #define __FUNCT__ "DMForestPackageFinalize"
1927d4645fSToby Isaac static PetscErrorCode DMForestPackageFinalize(void)
2027d4645fSToby Isaac {
2127d4645fSToby Isaac   DMForestTypeLink oldLink, link = DMForestTypeList;
2227d4645fSToby Isaac   PetscErrorCode ierr;
2327d4645fSToby Isaac 
2427d4645fSToby Isaac   PetscFunctionBegin;
2527d4645fSToby Isaac   while (link) {
2627d4645fSToby Isaac     oldLink = link;
2727d4645fSToby Isaac     ierr = PetscFree(oldLink->name);
2827d4645fSToby Isaac     link = oldLink->next;
2927d4645fSToby Isaac     ierr = PetscFree(oldLink);CHKERRQ(ierr);
3027d4645fSToby Isaac   }
3127d4645fSToby Isaac   PetscFunctionReturn(0);
3227d4645fSToby Isaac }
3327d4645fSToby Isaac 
3427d4645fSToby Isaac #undef __FUNCT__
3527d4645fSToby Isaac #define __FUNCT__ "DMForestPackageInitialize"
3627d4645fSToby Isaac static PetscErrorCode DMForestPackageInitialize(void)
3727d4645fSToby Isaac {
3827d4645fSToby Isaac   PetscErrorCode ierr;
3927d4645fSToby Isaac 
4027d4645fSToby Isaac   PetscFunctionBegin;
4127d4645fSToby Isaac   if (DMForestPackageInitialized) PetscFunctionReturn(0);
4227d4645fSToby Isaac   DMForestPackageInitialized = PETSC_TRUE;
4327d4645fSToby Isaac   ierr = DMForestRegisterType(DMFOREST);CHKERRQ(ierr);
4427d4645fSToby Isaac   ierr = PetscRegisterFinalize(DMForestPackageFinalize);CHKERRQ(ierr);
4527d4645fSToby Isaac   PetscFunctionReturn(0);
4627d4645fSToby Isaac }
4727d4645fSToby Isaac 
4827d4645fSToby Isaac #undef __FUNCT__
4927d4645fSToby Isaac #define __FUNCT__ "DMForestRegisterType"
5027d4645fSToby Isaac PetscErrorCode DMForestRegisterType(DMType name)
5127d4645fSToby Isaac {
5227d4645fSToby Isaac   DMForestTypeLink link;
5327d4645fSToby Isaac   PetscErrorCode ierr;
5427d4645fSToby Isaac 
5527d4645fSToby Isaac   PetscFunctionBegin;
5627d4645fSToby Isaac   ierr = DMForestPackageInitialize();CHKERRQ(ierr);
5727d4645fSToby Isaac   ierr = PetscNew(&link);CHKERRQ(ierr);
5827d4645fSToby Isaac   ierr = PetscStrallocpy(name,&link->name);CHKERRQ(ierr);
5927d4645fSToby Isaac   link->next = DMForestTypeList;
6027d4645fSToby Isaac   DMForestTypeList = link;
6127d4645fSToby Isaac   PetscFunctionReturn(0);
6227d4645fSToby Isaac }
6327d4645fSToby Isaac 
6427d4645fSToby Isaac #undef __FUNCT__
6527d4645fSToby Isaac #define __FUNCT__ "DMIsForest"
6627d4645fSToby Isaac PetscErrorCode DMIsForest(DM dm, PetscBool *isForest)
6727d4645fSToby Isaac {
6827d4645fSToby Isaac   DMForestTypeLink link = DMForestTypeList;
6927d4645fSToby Isaac   PetscErrorCode ierr;
7027d4645fSToby Isaac 
7127d4645fSToby Isaac   PetscFunctionBegin;
7227d4645fSToby Isaac   while (link) {
7327d4645fSToby Isaac     PetscBool sameType;
7427d4645fSToby Isaac     ierr = PetscObjectTypeCompare((PetscObject)dm,link->name,&sameType);CHKERRQ(ierr);
7527d4645fSToby Isaac     if (sameType) {
7627d4645fSToby Isaac       *isForest = PETSC_TRUE;
7727d4645fSToby Isaac       PetscFunctionReturn(0);
7827d4645fSToby Isaac     }
7927d4645fSToby Isaac     link = link->next;
8027d4645fSToby Isaac   }
8127d4645fSToby Isaac   *isForest = PETSC_FALSE;
8227d4645fSToby Isaac   PetscFunctionReturn(0);
8327d4645fSToby Isaac }
8427d4645fSToby Isaac 
85db4d5e8cSToby Isaac #undef __FUNCT__
86a0452a8eSToby Isaac #define __FUNCT__ "DMForestTemplate"
8720e8089bSToby Isaac PETSC_EXTERN PetscErrorCode DMForestTemplate(DM dm, MPI_Comm comm, DM *tdm)
88a0452a8eSToby Isaac {
89a0452a8eSToby Isaac   DM_Forest        *forest = (DM_Forest *) dm->data;
9020e8089bSToby Isaac   DMType           type;
91a0452a8eSToby Isaac   DM               base;
92a0452a8eSToby Isaac   DMForestTopology topology;
93a0452a8eSToby Isaac   PetscInt         dim, overlap, ref, factor;
94a0452a8eSToby Isaac   DMForestAdaptivityStrategy strat;
95795844e7SToby Isaac   PetscDS          ds;
96795844e7SToby Isaac   void             *ctx;
97a0452a8eSToby Isaac   PetscErrorCode   ierr;
98a0452a8eSToby Isaac 
99a0452a8eSToby Isaac   PetscFunctionBegin;
100a0452a8eSToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
10120e8089bSToby Isaac   ierr = DMCreate(PetscObjectComm((PetscObject)dm),tdm);CHKERRQ(ierr);
10220e8089bSToby Isaac   ierr = DMGetType(dm,&type);CHKERRQ(ierr);
10320e8089bSToby Isaac   ierr = DMSetType(*tdm,type);CHKERRQ(ierr);
104a0452a8eSToby Isaac   ierr = DMForestGetBaseDM(dm,&base);CHKERRQ(ierr);
10520e8089bSToby Isaac   ierr = DMForestSetBaseDM(*tdm,base);CHKERRQ(ierr);
106a0452a8eSToby Isaac   ierr = DMForestGetTopology(dm,&topology);CHKERRQ(ierr);
10720e8089bSToby Isaac   ierr = DMForestSetTopology(*tdm,topology);CHKERRQ(ierr);
108a0452a8eSToby Isaac   ierr = DMForestGetAdjacencyDimension(dm,&dim);CHKERRQ(ierr);
10920e8089bSToby Isaac   ierr = DMForestSetAdjacencyDimension(*tdm,dim);CHKERRQ(ierr);
110a0452a8eSToby Isaac   ierr = DMForestGetPartitionOverlap(dm,&overlap);CHKERRQ(ierr);
11120e8089bSToby Isaac   ierr = DMForestSetPartitionOverlap(*tdm,overlap);CHKERRQ(ierr);
112a0452a8eSToby Isaac   ierr = DMForestGetMinimumRefinement(dm,&ref);CHKERRQ(ierr);
11320e8089bSToby Isaac   ierr = DMForestSetMinimumRefinement(*tdm,ref);CHKERRQ(ierr);
114a0452a8eSToby Isaac   ierr = DMForestGetMaximumRefinement(dm,&ref);CHKERRQ(ierr);
11520e8089bSToby Isaac   ierr = DMForestSetMaximumRefinement(*tdm,ref);CHKERRQ(ierr);
116a0452a8eSToby Isaac   ierr = DMForestGetAdaptivityStrategy(dm,&strat);CHKERRQ(ierr);
11720e8089bSToby Isaac   ierr = DMForestSetAdaptivityStrategy(*tdm,strat);CHKERRQ(ierr);
118a0452a8eSToby Isaac   ierr = DMForestGetGradeFactor(dm,&factor);CHKERRQ(ierr);
11920e8089bSToby Isaac   ierr = DMForestSetGradeFactor(*tdm,factor);CHKERRQ(ierr);
120a0452a8eSToby Isaac   if (forest->ftemplate) {
12120e8089bSToby Isaac     ierr = (forest->ftemplate) (dm, *tdm);CHKERRQ(ierr);
122a0452a8eSToby Isaac   }
12320e8089bSToby Isaac   ierr = DMForestSetAdaptivityForest(*tdm,dm);CHKERRQ(ierr);
124795844e7SToby Isaac   ierr = DMGetDS(dm,&ds);CHKERRQ(ierr);
125795844e7SToby Isaac   ierr = DMSetDS(*tdm,ds);CHKERRQ(ierr);
126795844e7SToby Isaac   ierr = DMGetApplicationContext(dm,&ctx);CHKERRQ(ierr);
127795844e7SToby Isaac   ierr = DMSetApplicationContext(*tdm,&ctx);CHKERRQ(ierr);
128795844e7SToby Isaac   if (dm->maxCell) {
129795844e7SToby Isaac     const PetscReal *maxCell, *L;
130795844e7SToby Isaac     const DMBoundaryType *bd;
131795844e7SToby Isaac 
132795844e7SToby Isaac     ierr = DMGetPeriodicity(dm,&maxCell,&L,&bd);CHKERRQ(ierr);
133795844e7SToby Isaac     ierr = DMSetPeriodicity(*tdm,maxCell,L,bd);CHKERRQ(ierr);
134795844e7SToby Isaac   }
135a0452a8eSToby Isaac   PetscFunctionReturn(0);
136a0452a8eSToby Isaac }
137a0452a8eSToby Isaac 
13801d9d024SToby Isaac static PetscErrorCode DMInitialize_Forest(DM dm);
13901d9d024SToby Isaac 
140a0452a8eSToby Isaac #undef __FUNCT__
141db4d5e8cSToby Isaac #define __FUNCT__ "DMClone_Forest"
142db4d5e8cSToby Isaac PETSC_EXTERN PetscErrorCode DMClone_Forest(DM dm, DM *newdm)
143db4d5e8cSToby Isaac {
144db4d5e8cSToby Isaac   DM_Forest        *forest = (DM_Forest *) dm->data;
145db4d5e8cSToby Isaac   const char       *type;
146db4d5e8cSToby Isaac   PetscErrorCode ierr;
147db4d5e8cSToby Isaac 
148db4d5e8cSToby Isaac   PetscFunctionBegin;
149db4d5e8cSToby Isaac   forest->refct++;
150db4d5e8cSToby Isaac   (*newdm)->data = forest;
151db4d5e8cSToby Isaac   ierr = PetscObjectGetType((PetscObject) dm, &type);CHKERRQ(ierr);
152db4d5e8cSToby Isaac   ierr = PetscObjectChangeTypeName((PetscObject) *newdm, type);CHKERRQ(ierr);
15301d9d024SToby Isaac   ierr = DMInitialize_Forest(*newdm);CHKERRQ(ierr);
154db4d5e8cSToby Isaac   PetscFunctionReturn(0);
155db4d5e8cSToby Isaac }
156db4d5e8cSToby Isaac 
157db4d5e8cSToby Isaac #undef __FUNCT__
158db4d5e8cSToby Isaac #define __FUNCT__ "DMDestroy_Forest"
159d222f98bSToby Isaac static PetscErrorCode DMDestroy_Forest(DM dm)
160db4d5e8cSToby Isaac {
161db4d5e8cSToby Isaac   DM_Forest     *forest = (DM_Forest*) dm->data;
162db4d5e8cSToby Isaac   PetscErrorCode ierr;
163db4d5e8cSToby Isaac 
164db4d5e8cSToby Isaac   PetscFunctionBegin;
165db4d5e8cSToby Isaac   if (--forest->refct > 0) PetscFunctionReturn(0);
166d222f98bSToby Isaac   if (forest->destroy) {ierr = forest->destroy(dm);CHKERRQ(ierr);}
167db4d5e8cSToby Isaac   ierr = PetscSFDestroy(&forest->cellSF);CHKERRQ(ierr);
168ebdf65a2SToby Isaac   ierr = PetscFree(forest->adaptLabel);CHKERRQ(ierr);
1699a81d013SToby Isaac   ierr = PetscFree(forest->adaptStrategy);CHKERRQ(ierr);
17056ba9f64SToby Isaac   ierr = DMDestroy(&forest->base);CHKERRQ(ierr);
171ba936b91SToby Isaac   ierr = DMDestroy(&forest->adapt);CHKERRQ(ierr);
17230f902e7SToby Isaac   ierr = PetscFree(forest->topology);CHKERRQ(ierr);
17330f902e7SToby Isaac   ierr = PetscFree(forest);CHKERRQ(ierr);
174db4d5e8cSToby Isaac   PetscFunctionReturn(0);
175db4d5e8cSToby Isaac }
176db4d5e8cSToby Isaac 
177db4d5e8cSToby Isaac #undef __FUNCT__
178dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetTopology"
179dd8e54a2SToby Isaac PetscErrorCode DMForestSetTopology(DM dm, DMForestTopology topology)
180db4d5e8cSToby Isaac {
181db4d5e8cSToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
182db4d5e8cSToby Isaac   PetscErrorCode ierr;
183db4d5e8cSToby Isaac 
184db4d5e8cSToby Isaac   PetscFunctionBegin;
185db4d5e8cSToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
186ef51cf95SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the topology after setup");
187dd8e54a2SToby Isaac   ierr = PetscFree(forest->topology);CHKERRQ(ierr);
188dd8e54a2SToby Isaac   ierr = PetscStrallocpy((const char *)topology,(char **) &forest->topology);CHKERRQ(ierr);
189db4d5e8cSToby Isaac   PetscFunctionReturn(0);
190db4d5e8cSToby Isaac }
191db4d5e8cSToby Isaac 
192db4d5e8cSToby Isaac #undef __FUNCT__
193dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetTopology"
194dd8e54a2SToby Isaac PetscErrorCode DMForestGetTopology(DM dm, DMForestTopology *topology)
195dd8e54a2SToby Isaac {
196dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
197dd8e54a2SToby Isaac 
198dd8e54a2SToby Isaac   PetscFunctionBegin;
199dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
200dd8e54a2SToby Isaac   PetscValidPointer(topology,2);
201dd8e54a2SToby Isaac   *topology = forest->topology;
202dd8e54a2SToby Isaac   PetscFunctionReturn(0);
203dd8e54a2SToby Isaac }
204dd8e54a2SToby Isaac 
205dd8e54a2SToby Isaac #undef __FUNCT__
206dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetBaseDM"
207dd8e54a2SToby Isaac PetscErrorCode DMForestSetBaseDM(DM dm, DM base)
208dd8e54a2SToby Isaac {
209dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
210dd8e54a2SToby Isaac   PetscInt       dim, dimEmbed;
211dd8e54a2SToby Isaac   PetscErrorCode ierr;
212dd8e54a2SToby Isaac 
213dd8e54a2SToby Isaac   PetscFunctionBegin;
214dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
215ef51cf95SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the base after setup");
216dd8e54a2SToby Isaac   ierr = PetscObjectReference((PetscObject)base);CHKERRQ(ierr);
217dd8e54a2SToby Isaac   ierr = DMDestroy(&forest->base);CHKERRQ(ierr);
218dd8e54a2SToby Isaac   forest->base = base;
219a0452a8eSToby Isaac   if (base) {
220a0452a8eSToby Isaac     PetscValidHeaderSpecific(base, DM_CLASSID, 2);
221dd8e54a2SToby Isaac     ierr = DMGetDimension(base,&dim);CHKERRQ(ierr);
222dd8e54a2SToby Isaac     ierr = DMSetDimension(dm,dim);CHKERRQ(ierr);
223dd8e54a2SToby Isaac     ierr = DMGetCoordinateDim(base,&dimEmbed);CHKERRQ(ierr);
224dd8e54a2SToby Isaac     ierr = DMSetCoordinateDim(dm,dimEmbed);CHKERRQ(ierr);
225a0452a8eSToby Isaac   }
226dd8e54a2SToby Isaac   PetscFunctionReturn(0);
227dd8e54a2SToby Isaac }
228dd8e54a2SToby Isaac 
229dd8e54a2SToby Isaac #undef __FUNCT__
230dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetBaseDM"
231dd8e54a2SToby Isaac PetscErrorCode DMForestGetBaseDM(DM dm, DM *base)
232dd8e54a2SToby Isaac {
233dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
234dd8e54a2SToby Isaac 
235dd8e54a2SToby Isaac   PetscFunctionBegin;
236dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
237dd8e54a2SToby Isaac   PetscValidPointer(base, 2);
238dd8e54a2SToby Isaac   *base = forest->base;
239dd8e54a2SToby Isaac   PetscFunctionReturn(0);
240dd8e54a2SToby Isaac }
241dd8e54a2SToby Isaac 
242dd8e54a2SToby Isaac #undef __FUNCT__
243ba936b91SToby Isaac #define __FUNCT__ "DMForestSetAdaptivityForest"
244ba936b91SToby Isaac PetscErrorCode DMForestSetAdaptivityForest(DM dm,DM adapt)
245dd8e54a2SToby Isaac {
246ba936b91SToby Isaac   DM_Forest        *forest;
247dd8e54a2SToby Isaac   PetscErrorCode   ierr;
248dd8e54a2SToby Isaac 
249dd8e54a2SToby Isaac   PetscFunctionBegin;
250dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
251ba936b91SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 2);
252ba936b91SToby Isaac   forest = (DM_Forest *) dm->data;
253ba936b91SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the adaptation forest after setup");
254*26d9498aSToby Isaac   switch (forest->adaptPurpose) {
255*26d9498aSToby Isaac   case DM_FOREST_KEEP:
256ba936b91SToby Isaac     ierr = PetscObjectReference((PetscObject)adapt);CHKERRQ(ierr);
257ba936b91SToby Isaac     ierr = DMDestroy(&(forest->adapt));CHKERRQ(ierr);
258ba936b91SToby Isaac     forest->adapt = adapt;
259*26d9498aSToby Isaac     break;
260*26d9498aSToby Isaac   case DM_FOREST_REFINE:
261*26d9498aSToby Isaac     ierr = DMSetCoarseDM(dm,adapt);CHKERRQ(ierr);
262*26d9498aSToby Isaac     break;
263*26d9498aSToby Isaac   case DM_FOREST_COARSEN:
264*26d9498aSToby Isaac     ierr = DMSetFineDM(dm,adapt);CHKERRQ(ierr);
265*26d9498aSToby Isaac     break;
266*26d9498aSToby Isaac   default:
267*26d9498aSToby Isaac     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"invalid adaptivity purpose");
268*26d9498aSToby Isaac   }
269dd8e54a2SToby Isaac   PetscFunctionReturn(0);
270dd8e54a2SToby Isaac }
271dd8e54a2SToby Isaac 
272dd8e54a2SToby Isaac #undef __FUNCT__
273ba936b91SToby Isaac #define __FUNCT__ "DMForestGetAdaptivityForest"
274ba936b91SToby Isaac PetscErrorCode DMForestGetAdaptivityForest(DM dm, DM *adapt)
275dd8e54a2SToby Isaac {
276ba936b91SToby Isaac   DM_Forest        *forest;
277*26d9498aSToby Isaac   PetscErrorCode   ierr;
278dd8e54a2SToby Isaac 
279dd8e54a2SToby Isaac   PetscFunctionBegin;
280dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
281ba936b91SToby Isaac   forest = (DM_Forest *) dm->data;
282*26d9498aSToby Isaac   switch (forest->adaptPurpose) {
283*26d9498aSToby Isaac   case DM_FOREST_KEEP:
284ba936b91SToby Isaac     *adapt = forest->adapt;
285*26d9498aSToby Isaac     break;
286*26d9498aSToby Isaac   case DM_FOREST_REFINE:
287*26d9498aSToby Isaac     ierr = DMGetCoarseDM(dm,adapt);CHKERRQ(ierr);
288*26d9498aSToby Isaac     break;
289*26d9498aSToby Isaac   case DM_FOREST_COARSEN:
290*26d9498aSToby Isaac     ierr = DMGetFineDM(dm,adapt);CHKERRQ(ierr);
291*26d9498aSToby Isaac     break;
292*26d9498aSToby Isaac   default:
293*26d9498aSToby Isaac     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"invalid adaptivity purpose");
294*26d9498aSToby Isaac   }
295*26d9498aSToby Isaac   PetscFunctionReturn(0);
296*26d9498aSToby Isaac }
297*26d9498aSToby Isaac 
298*26d9498aSToby Isaac #undef __FUNCT__
299*26d9498aSToby Isaac #define __FUNCT__ "DMForestSetAdaptivityPurpose"
300*26d9498aSToby Isaac PetscErrorCode DMForestSetAdaptivityPurpose(DM dm, DMForestAdaptivityPurpose purpose)
301*26d9498aSToby Isaac {
302*26d9498aSToby Isaac   DM_Forest      *forest;
303*26d9498aSToby Isaac   PetscErrorCode ierr;
304*26d9498aSToby Isaac 
305*26d9498aSToby Isaac   PetscFunctionBegin;
306*26d9498aSToby Isaac   forest = (DM_Forest *) dm->data;
307*26d9498aSToby Isaac   if (purpose != forest->adaptPurpose) {
308*26d9498aSToby Isaac     DM adapt;
309*26d9498aSToby Isaac 
310*26d9498aSToby Isaac     ierr = DMForestGetAdaptivityForest(dm,&adapt);CHKERRQ(ierr);
311*26d9498aSToby Isaac     ierr = PetscObjectReference((PetscObject)adapt);CHKERRQ(ierr);
312*26d9498aSToby Isaac     ierr = DMForestSetAdaptivityForest(dm,NULL);CHKERRQ(ierr);
313*26d9498aSToby Isaac     forest->adaptPurpose = purpose;
314*26d9498aSToby Isaac     ierr = DMForestSetAdaptivityForest(dm,adapt);CHKERRQ(ierr);
315*26d9498aSToby Isaac     ierr = DMDestroy(&adapt);CHKERRQ(ierr);
316*26d9498aSToby Isaac   }
317dd8e54a2SToby Isaac   PetscFunctionReturn(0);
318dd8e54a2SToby Isaac }
319dd8e54a2SToby Isaac 
320dd8e54a2SToby Isaac #undef __FUNCT__
321dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetAdjacencyDimension"
322dd8e54a2SToby Isaac PetscErrorCode DMForestSetAdjacencyDimension(DM dm, PetscInt adjDim)
323dd8e54a2SToby Isaac {
324dd8e54a2SToby Isaac   PetscInt        dim;
325dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
326dd8e54a2SToby Isaac   PetscErrorCode  ierr;
327dd8e54a2SToby Isaac 
328dd8e54a2SToby Isaac   PetscFunctionBegin;
329dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
330ef51cf95SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the adjacency dimension after setup");
331dd8e54a2SToby Isaac   if (adjDim < 0) SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_OUTOFRANGE,"adjacency dim cannot be < 0: %d", adjDim);
332dd8e54a2SToby Isaac   ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr);
333dd8e54a2SToby Isaac   if (adjDim > dim) SETERRQ2(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_OUTOFRANGE,"adjacency dim cannot be > %d: %d", dim, adjDim);
334dd8e54a2SToby Isaac   forest->adjDim = adjDim;
335dd8e54a2SToby Isaac   PetscFunctionReturn(0);
336dd8e54a2SToby Isaac }
337dd8e54a2SToby Isaac 
338dd8e54a2SToby Isaac #undef __FUNCT__
339dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetAdjacencyCodimension"
340dd8e54a2SToby Isaac PetscErrorCode DMForestSetAdjacencyCodimension(DM dm, PetscInt adjCodim)
341dd8e54a2SToby Isaac {
342dd8e54a2SToby Isaac   PetscInt        dim;
343dd8e54a2SToby Isaac   PetscErrorCode  ierr;
344dd8e54a2SToby Isaac 
345dd8e54a2SToby Isaac   PetscFunctionBegin;
346dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
347dd8e54a2SToby Isaac   ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr);
348dd8e54a2SToby Isaac   ierr = DMForestSetAdjacencyDimension(dm,dim-adjCodim);CHKERRQ(ierr);
349dd8e54a2SToby Isaac   PetscFunctionReturn(0);
350dd8e54a2SToby Isaac }
351dd8e54a2SToby Isaac 
352dd8e54a2SToby Isaac #undef __FUNCT__
353dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetAdjacencyDimension"
354dd8e54a2SToby Isaac PetscErrorCode DMForestGetAdjacencyDimension(DM dm, PetscInt *adjDim)
355dd8e54a2SToby Isaac {
356dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
357dd8e54a2SToby Isaac 
358dd8e54a2SToby Isaac   PetscFunctionBegin;
359dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
360dd8e54a2SToby Isaac   PetscValidIntPointer(adjDim,2);
361dd8e54a2SToby Isaac   *adjDim = forest->adjDim;
362dd8e54a2SToby Isaac   PetscFunctionReturn(0);
363dd8e54a2SToby Isaac }
364dd8e54a2SToby Isaac 
365dd8e54a2SToby Isaac #undef __FUNCT__
366dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetAdjacencyCodimension"
367dd8e54a2SToby Isaac PetscErrorCode DMForestGetAdjacencyCodimension(DM dm, PetscInt *adjCodim)
368dd8e54a2SToby Isaac {
369dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
370dd8e54a2SToby Isaac   PetscInt       dim;
371dd8e54a2SToby Isaac   PetscErrorCode ierr;
372dd8e54a2SToby Isaac 
373dd8e54a2SToby Isaac   PetscFunctionBegin;
374dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
375dd8e54a2SToby Isaac   PetscValidIntPointer(adjCodim,2);
376dd8e54a2SToby Isaac   ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr);
377dd8e54a2SToby Isaac   *adjCodim = dim - forest->adjDim;
378dd8e54a2SToby Isaac   PetscFunctionReturn(0);
379dd8e54a2SToby Isaac }
380dd8e54a2SToby Isaac 
381dd8e54a2SToby Isaac #undef __FUNCT__
382ef51cf95SToby Isaac #define __FUNCT__ "DMForestSetPartitionOverlap"
383dd8e54a2SToby Isaac PetscErrorCode DMForestSetPartitionOverlap(DM dm, PetscInt overlap)
384dd8e54a2SToby Isaac {
385dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
386dd8e54a2SToby Isaac 
387dd8e54a2SToby Isaac   PetscFunctionBegin;
388dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
389ef51cf95SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the overlap after setup");
390dd8e54a2SToby Isaac   if (overlap < 0) SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_OUTOFRANGE,"overlap cannot be < 0: %d", overlap);
391dd8e54a2SToby Isaac   forest->overlap = overlap;
392dd8e54a2SToby Isaac   PetscFunctionReturn(0);
393dd8e54a2SToby Isaac }
394dd8e54a2SToby Isaac 
395dd8e54a2SToby Isaac #undef __FUNCT__
396dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetPartitionOverlap"
397dd8e54a2SToby Isaac PetscErrorCode DMForestGetPartitionOverlap(DM dm, PetscInt *overlap)
398dd8e54a2SToby Isaac {
399dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
400dd8e54a2SToby Isaac 
401dd8e54a2SToby Isaac   PetscFunctionBegin;
402dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
403dd8e54a2SToby Isaac   PetscValidIntPointer(overlap,2);
404dd8e54a2SToby Isaac   *overlap = forest->overlap;
405dd8e54a2SToby Isaac   PetscFunctionReturn(0);
406dd8e54a2SToby Isaac }
407dd8e54a2SToby Isaac 
408dd8e54a2SToby Isaac #undef __FUNCT__
409dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetMinimumRefinement"
410dd8e54a2SToby Isaac PetscErrorCode DMForestSetMinimumRefinement(DM dm, PetscInt minRefinement)
411dd8e54a2SToby Isaac {
412dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
413dd8e54a2SToby Isaac 
414dd8e54a2SToby Isaac   PetscFunctionBegin;
415dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
416ef51cf95SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the minimum refinement after setup");
417dd8e54a2SToby Isaac   forest->minRefinement = minRefinement;
418dd8e54a2SToby Isaac   PetscFunctionReturn(0);
419dd8e54a2SToby Isaac }
420dd8e54a2SToby Isaac 
421dd8e54a2SToby Isaac #undef __FUNCT__
422dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetMinimumRefinement"
423dd8e54a2SToby Isaac PetscErrorCode DMForestGetMinimumRefinement(DM dm, PetscInt *minRefinement)
424dd8e54a2SToby Isaac {
425dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
426dd8e54a2SToby Isaac 
427dd8e54a2SToby Isaac   PetscFunctionBegin;
428dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
429dd8e54a2SToby Isaac   PetscValidIntPointer(minRefinement,2);
430dd8e54a2SToby Isaac   *minRefinement = forest->minRefinement;
431dd8e54a2SToby Isaac   PetscFunctionReturn(0);
432dd8e54a2SToby Isaac }
433dd8e54a2SToby Isaac 
434dd8e54a2SToby Isaac #undef __FUNCT__
43556ba9f64SToby Isaac #define __FUNCT__ "DMForestSetInitialRefinement"
43656ba9f64SToby Isaac PetscErrorCode DMForestSetInitialRefinement(DM dm, PetscInt initRefinement)
43756ba9f64SToby Isaac {
43856ba9f64SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
43956ba9f64SToby Isaac 
44056ba9f64SToby Isaac   PetscFunctionBegin;
44156ba9f64SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
44256ba9f64SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the initial refinement after setup");
44356ba9f64SToby Isaac   forest->initRefinement = initRefinement;
44456ba9f64SToby Isaac   PetscFunctionReturn(0);
44556ba9f64SToby Isaac }
44656ba9f64SToby Isaac 
44756ba9f64SToby Isaac #undef __FUNCT__
44856ba9f64SToby Isaac #define __FUNCT__ "DMForestGetInitialRefinement"
44956ba9f64SToby Isaac PetscErrorCode DMForestGetInitialRefinement(DM dm, PetscInt *initRefinement)
45056ba9f64SToby Isaac {
45156ba9f64SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
45256ba9f64SToby Isaac 
45356ba9f64SToby Isaac   PetscFunctionBegin;
45456ba9f64SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
45556ba9f64SToby Isaac   PetscValidIntPointer(initRefinement,2);
45656ba9f64SToby Isaac   *initRefinement = forest->initRefinement;
45756ba9f64SToby Isaac   PetscFunctionReturn(0);
45856ba9f64SToby Isaac }
45956ba9f64SToby Isaac 
46056ba9f64SToby Isaac #undef __FUNCT__
461c7eeac06SToby Isaac #define __FUNCT__ "DMForestSetMaximumRefinement"
462c7eeac06SToby Isaac PetscErrorCode DMForestSetMaximumRefinement(DM dm, PetscInt maxRefinement)
463dd8e54a2SToby Isaac {
464dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
465dd8e54a2SToby Isaac 
466dd8e54a2SToby Isaac   PetscFunctionBegin;
467dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
468ef51cf95SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the maximum refinement after setup");
469c7eeac06SToby Isaac   forest->maxRefinement = maxRefinement;
470dd8e54a2SToby Isaac   PetscFunctionReturn(0);
471dd8e54a2SToby Isaac }
472dd8e54a2SToby Isaac 
473dd8e54a2SToby Isaac #undef __FUNCT__
474c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetMaximumRefinement"
475c7eeac06SToby Isaac PetscErrorCode DMForestGetMaximumRefinement(DM dm, PetscInt *maxRefinement)
476dd8e54a2SToby Isaac {
477dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
478dd8e54a2SToby Isaac 
479dd8e54a2SToby Isaac   PetscFunctionBegin;
480dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
481c7eeac06SToby Isaac   PetscValidIntPointer(maxRefinement,2);
482c7eeac06SToby Isaac   *maxRefinement = forest->maxRefinement;
483dd8e54a2SToby Isaac   PetscFunctionReturn(0);
484dd8e54a2SToby Isaac }
485c7eeac06SToby Isaac 
486c7eeac06SToby Isaac #undef __FUNCT__
487c7eeac06SToby Isaac #define __FUNCT__ "DMForestSetAdaptivityStrategy"
488c7eeac06SToby Isaac PetscErrorCode DMForestSetAdaptivityStrategy(DM dm, DMForestAdaptivityStrategy adaptStrategy)
489c7eeac06SToby Isaac {
490c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
491c7eeac06SToby Isaac   PetscErrorCode ierr;
492c7eeac06SToby Isaac 
493c7eeac06SToby Isaac   PetscFunctionBegin;
494c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
495c7eeac06SToby Isaac   ierr = PetscFree(forest->adaptStrategy);CHKERRQ(ierr);
496a73e2921SToby Isaac   ierr = PetscStrallocpy((const char *) adaptStrategy,(char **)&forest->adaptStrategy);CHKERRQ(ierr);
497c7eeac06SToby Isaac   PetscFunctionReturn(0);
498c7eeac06SToby Isaac }
499c7eeac06SToby Isaac 
500c7eeac06SToby Isaac #undef __FUNCT__
501c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetAdaptivityStrategy"
502c7eeac06SToby Isaac PetscErrorCode DMForestGetAdaptivityStrategy(DM dm, DMForestAdaptivityStrategy *adaptStrategy)
503c7eeac06SToby Isaac {
504c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
505c7eeac06SToby Isaac 
506c7eeac06SToby Isaac   PetscFunctionBegin;
507c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
508c7eeac06SToby Isaac   PetscValidPointer(adaptStrategy,2);
509c7eeac06SToby Isaac   *adaptStrategy = forest->adaptStrategy;
510c7eeac06SToby Isaac   PetscFunctionReturn(0);
511c7eeac06SToby Isaac }
512c7eeac06SToby Isaac 
513c7eeac06SToby Isaac #undef __FUNCT__
514c7eeac06SToby Isaac #define __FUNCT__ "DMForestSetGradeFactor"
515c7eeac06SToby Isaac PetscErrorCode DMForestSetGradeFactor(DM dm, PetscInt grade)
516c7eeac06SToby Isaac {
517c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
518c7eeac06SToby Isaac 
519c7eeac06SToby Isaac   PetscFunctionBegin;
520c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
521ef51cf95SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the grade factor after setup");
522c7eeac06SToby Isaac   forest->gradeFactor = grade;
523c7eeac06SToby Isaac   PetscFunctionReturn(0);
524c7eeac06SToby Isaac }
525c7eeac06SToby Isaac 
526c7eeac06SToby Isaac #undef __FUNCT__
527c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetGradeFactor"
528c7eeac06SToby Isaac PetscErrorCode DMForestGetGradeFactor(DM dm, PetscInt *grade)
529c7eeac06SToby Isaac {
530c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
531c7eeac06SToby Isaac 
532c7eeac06SToby Isaac   PetscFunctionBegin;
533c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
534c7eeac06SToby Isaac   PetscValidIntPointer(grade,2);
535c7eeac06SToby Isaac   *grade = forest->gradeFactor;
536c7eeac06SToby Isaac   PetscFunctionReturn(0);
537c7eeac06SToby Isaac }
538c7eeac06SToby Isaac 
539c7eeac06SToby Isaac #undef __FUNCT__
540ef51cf95SToby Isaac #define __FUNCT__ "DMForestSetCellWeightFactor"
541ef51cf95SToby Isaac PetscErrorCode DMForestSetCellWeightFactor(DM dm, PetscReal weightsFactor)
542c7eeac06SToby Isaac {
543c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
544c7eeac06SToby Isaac 
545c7eeac06SToby Isaac   PetscFunctionBegin;
546c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
547ef51cf95SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the weights factor after setup");
548c7eeac06SToby Isaac   forest->weightsFactor = weightsFactor;
549c7eeac06SToby Isaac   PetscFunctionReturn(0);
550c7eeac06SToby Isaac }
551c7eeac06SToby Isaac 
552c7eeac06SToby Isaac #undef __FUNCT__
553ef51cf95SToby Isaac #define __FUNCT__ "DMForestGetCellWeightFactor"
554ef51cf95SToby Isaac PetscErrorCode DMForestGetCellWeightFactor(DM dm, PetscReal *weightsFactor)
555c7eeac06SToby Isaac {
556c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
557c7eeac06SToby Isaac 
558c7eeac06SToby Isaac   PetscFunctionBegin;
559c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
560c7eeac06SToby Isaac   PetscValidRealPointer(weightsFactor,2);
561c7eeac06SToby Isaac   *weightsFactor = forest->weightsFactor;
562c7eeac06SToby Isaac   PetscFunctionReturn(0);
563c7eeac06SToby Isaac }
564c7eeac06SToby Isaac 
565c7eeac06SToby Isaac #undef __FUNCT__
566c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetCellChart"
567c7eeac06SToby Isaac PetscErrorCode DMForestGetCellChart(DM dm, PetscInt *cStart, PetscInt *cEnd)
568c7eeac06SToby Isaac {
569c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
570c7eeac06SToby Isaac   PetscErrorCode ierr;
571c7eeac06SToby Isaac 
572c7eeac06SToby Isaac   PetscFunctionBegin;
573c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
574c7eeac06SToby Isaac   PetscValidIntPointer(cStart,2);
575c7eeac06SToby Isaac   PetscValidIntPointer(cEnd,2);
576c7eeac06SToby Isaac   if (((forest->cStart == PETSC_DETERMINE) || (forest->cEnd == PETSC_DETERMINE)) && forest->createcellchart) {
577c7eeac06SToby Isaac     ierr = forest->createcellchart(dm,&forest->cStart,&forest->cEnd);CHKERRQ(ierr);
578c7eeac06SToby Isaac   }
579c7eeac06SToby Isaac   *cStart =  forest->cStart;
580c7eeac06SToby Isaac   *cEnd   =  forest->cEnd;
581c7eeac06SToby Isaac   PetscFunctionReturn(0);
582c7eeac06SToby Isaac }
583c7eeac06SToby Isaac 
584c7eeac06SToby Isaac #undef __FUNCT__
585c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetCellSF"
586c7eeac06SToby Isaac PetscErrorCode DMForestGetCellSF(DM dm, PetscSF *cellSF)
587c7eeac06SToby Isaac {
588c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
589c7eeac06SToby Isaac   PetscErrorCode ierr;
590c7eeac06SToby Isaac 
591c7eeac06SToby Isaac   PetscFunctionBegin;
592c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
593c7eeac06SToby Isaac   PetscValidPointer(cellSF,2);
594c7eeac06SToby Isaac   if ((!forest->cellSF) && forest->createcellsf) {
595c7eeac06SToby Isaac     ierr = forest->createcellsf(dm,&forest->cellSF);CHKERRQ(ierr);
596c7eeac06SToby Isaac   }
597c7eeac06SToby Isaac   *cellSF = forest->cellSF;
598c7eeac06SToby Isaac   PetscFunctionReturn(0);
599c7eeac06SToby Isaac }
600c7eeac06SToby Isaac 
601c7eeac06SToby Isaac #undef __FUNCT__
602ebdf65a2SToby Isaac #define __FUNCT__ "DMForestSetAdaptivityLabel"
603ebdf65a2SToby Isaac PetscErrorCode DMForestSetAdaptivityLabel(DM dm, const char * adaptLabel)
604c7eeac06SToby Isaac {
605c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
606c7eeac06SToby Isaac   PetscErrorCode ierr;
607c7eeac06SToby Isaac 
608c7eeac06SToby Isaac   PetscFunctionBegin;
609c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
610ebdf65a2SToby Isaac   ierr = PetscFree(forest->adaptLabel);CHKERRQ(ierr);
611ebdf65a2SToby Isaac   ierr = PetscStrallocpy(adaptLabel,&forest->adaptLabel);CHKERRQ(ierr);
612c7eeac06SToby Isaac   PetscFunctionReturn(0);
613c7eeac06SToby Isaac }
614c7eeac06SToby Isaac 
615c7eeac06SToby Isaac #undef __FUNCT__
616ebdf65a2SToby Isaac #define __FUNCT__ "DMForestGetAdaptivityLabel"
617ba936b91SToby Isaac PetscErrorCode DMForestGetAdaptivityLabel(DM dm, const char ** adaptLabel)
618c7eeac06SToby Isaac {
619c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
620c7eeac06SToby Isaac 
621c7eeac06SToby Isaac   PetscFunctionBegin;
622c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
623ba936b91SToby Isaac   *adaptLabel = forest->adaptLabel;
624c7eeac06SToby Isaac   PetscFunctionReturn(0);
625c7eeac06SToby Isaac }
626c7eeac06SToby Isaac 
627c7eeac06SToby Isaac #undef __FUNCT__
628c7eeac06SToby Isaac #define __FUNCT__ "DMForestSetCellWeights"
629c7eeac06SToby Isaac PetscErrorCode DMForestSetCellWeights(DM dm, PetscReal weights[], PetscCopyMode copyMode)
630c7eeac06SToby Isaac {
631c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
632c7eeac06SToby Isaac   PetscInt       cStart, cEnd;
633c7eeac06SToby Isaac   PetscErrorCode ierr;
634c7eeac06SToby Isaac 
635c7eeac06SToby Isaac   PetscFunctionBegin;
636c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
637c7eeac06SToby Isaac   ierr = DMForestGetCellChart(dm,&cStart,&cEnd);CHKERRQ(ierr);
638c7eeac06SToby Isaac   if (cEnd < cStart) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"cell chart [%d,%d) is not valid",cStart,cEnd);
639c7eeac06SToby Isaac   if (copyMode == PETSC_COPY_VALUES) {
640c7eeac06SToby Isaac     if (forest->cellWeightsCopyMode != PETSC_OWN_POINTER || forest->cellWeights == weights) {
641c7eeac06SToby Isaac       ierr = PetscMalloc1(cEnd-cStart,&forest->cellWeights);CHKERRQ(ierr);
642c7eeac06SToby Isaac     }
643c7eeac06SToby Isaac     ierr = PetscMemcpy(forest->cellWeights,weights,(cEnd-cStart)*sizeof(*weights));CHKERRQ(ierr);
644c7eeac06SToby Isaac     forest->cellWeightsCopyMode = PETSC_OWN_POINTER;
645c7eeac06SToby Isaac     PetscFunctionReturn(0);
646c7eeac06SToby Isaac   }
647c7eeac06SToby Isaac   if (forest->cellWeightsCopyMode == PETSC_OWN_POINTER) {
648c7eeac06SToby Isaac     ierr = PetscFree(forest->cellWeights);CHKERRQ(ierr);
649c7eeac06SToby Isaac   }
650c7eeac06SToby Isaac   forest->cellWeights  = weights;
651c7eeac06SToby Isaac   forest->cellWeightsCopyMode = copyMode;
652c7eeac06SToby Isaac   PetscFunctionReturn(0);
653c7eeac06SToby Isaac }
654c7eeac06SToby Isaac 
655c7eeac06SToby Isaac #undef __FUNCT__
656c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetCellWeights"
657c7eeac06SToby Isaac PetscErrorCode DMForestGetCellWeights(DM dm, PetscReal **weights)
658c7eeac06SToby Isaac {
659c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
660c7eeac06SToby Isaac 
661c7eeac06SToby Isaac   PetscFunctionBegin;
662c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
663c7eeac06SToby Isaac   PetscValidPointer(weights,2);
664c7eeac06SToby Isaac   *weights = forest->cellWeights;
665c7eeac06SToby Isaac   PetscFunctionReturn(0);
666c7eeac06SToby Isaac }
667c7eeac06SToby Isaac 
668c7eeac06SToby Isaac #undef __FUNCT__
669c7eeac06SToby Isaac #define __FUNCT__ "DMForestSetWeightCapacity"
670c7eeac06SToby Isaac PetscErrorCode DMForestSetWeightCapacity(DM dm, PetscReal capacity)
671c7eeac06SToby Isaac {
672c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
673c7eeac06SToby Isaac 
674c7eeac06SToby Isaac   PetscFunctionBegin;
675c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
676ef51cf95SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the weight capacity after setup");
677c7eeac06SToby Isaac   if (capacity < 0.) SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_OUTOFRANGE,"Cannot have negative weight capacity; %f",capacity);
678c7eeac06SToby Isaac   forest->weightCapacity = capacity;
679c7eeac06SToby Isaac   PetscFunctionReturn(0);
680c7eeac06SToby Isaac }
681c7eeac06SToby Isaac 
682c7eeac06SToby Isaac #undef __FUNCT__
683c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetWeightCapacity"
684c7eeac06SToby Isaac PetscErrorCode DMForestGetWeightCapacity(DM dm, PetscReal *capacity)
685c7eeac06SToby Isaac {
686c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
687c7eeac06SToby Isaac 
688c7eeac06SToby Isaac   PetscFunctionBegin;
689c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
690c7eeac06SToby Isaac   PetscValidRealPointer(capacity,2);
691c7eeac06SToby Isaac   *capacity = forest->weightCapacity;
692c7eeac06SToby Isaac   PetscFunctionReturn(0);
693c7eeac06SToby Isaac }
694c7eeac06SToby Isaac 
695dd8e54a2SToby Isaac #undef __FUNCT__
696db4d5e8cSToby Isaac #define __FUNCT__ "DMSetFromOptions_Forest"
6970709b2feSToby Isaac PETSC_EXTERN PetscErrorCode DMSetFromOptions_Forest(PetscOptionItems *PetscOptionsObject,DM dm)
698db4d5e8cSToby Isaac {
699db4d5e8cSToby Isaac   DM_Forest                  *forest = (DM_Forest *) dm->data;
70056ba9f64SToby Isaac   PetscBool                  flg, flg1, flg2, flg3, flg4;
701dd8e54a2SToby Isaac   DMForestTopology           oldTopo;
702c7eeac06SToby Isaac   char                       stringBuffer[256];
703dd8e54a2SToby Isaac   PetscViewer                viewer;
704dd8e54a2SToby Isaac   PetscViewerFormat          format;
70556ba9f64SToby Isaac   PetscInt                   adjDim, adjCodim, overlap, minRefinement, initRefinement, maxRefinement, grade;
706c7eeac06SToby Isaac   PetscReal                  weightsFactor;
707c7eeac06SToby Isaac   DMForestAdaptivityStrategy adaptStrategy;
708db4d5e8cSToby Isaac   PetscErrorCode             ierr;
709db4d5e8cSToby Isaac 
710db4d5e8cSToby Isaac   PetscFunctionBegin;
711db4d5e8cSToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
71258762b62SToby Isaac   forest->setfromoptionscalled = PETSC_TRUE;
713dd8e54a2SToby Isaac   ierr = DMForestGetTopology(dm, &oldTopo);CHKERRQ(ierr);
714a3eda1eaSToby Isaac   ierr = PetscOptionsHead(PetscOptionsObject,"DMForest Options");CHKERRQ(ierr);
71556ba9f64SToby Isaac   ierr = PetscOptionsString("-dm_forest_topology","the topology of the forest's base mesh","DMForestSetTopology",oldTopo,stringBuffer,256,&flg1);CHKERRQ(ierr);
71656ba9f64SToby Isaac   ierr = PetscOptionsViewer("-dm_forest_base_dm","load the base DM from a viewer specification","DMForestSetBaseDM",&viewer,&format,&flg2);CHKERRQ(ierr);
71756ba9f64SToby Isaac   ierr = PetscOptionsViewer("-dm_forest_coarse_forest","load the coarse forest from a viewer specification","DMForestSetCoarseForest",&viewer,&format,&flg3);CHKERRQ(ierr);
71856ba9f64SToby Isaac   ierr = PetscOptionsViewer("-dm_forest_fine_forest","load the fine forest from a viewer specification","DMForestSetFineForest",&viewer,&format,&flg4);CHKERRQ(ierr);
71956ba9f64SToby Isaac   if ((PetscInt) flg1 + (PetscInt) flg2 + (PetscInt) flg3 + (PetscInt) flg4 > 1) {
72056ba9f64SToby Isaac     SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_INCOMP,"Specify only one of -dm_forest_{topology,base_dm,coarse_forest,fine_forest}");
721dd8e54a2SToby Isaac   }
72256ba9f64SToby Isaac   if (flg1) {
72356ba9f64SToby Isaac     ierr = DMForestSetTopology(dm,(DMForestTopology)stringBuffer);CHKERRQ(ierr);
72456ba9f64SToby Isaac     ierr = DMForestSetBaseDM(dm,NULL);CHKERRQ(ierr);
72520e8089bSToby Isaac     ierr = DMForestSetAdaptivityForest(dm,NULL);CHKERRQ(ierr);
72656ba9f64SToby Isaac   }
72756ba9f64SToby Isaac   if (flg2) {
728dd8e54a2SToby Isaac     DM         base;
729dd8e54a2SToby Isaac 
730dd8e54a2SToby Isaac     ierr = DMCreate(PetscObjectComm((PetscObject)dm),&base);CHKERRQ(ierr);
731dd8e54a2SToby Isaac     ierr = PetscViewerPushFormat(viewer,format);CHKERRQ(ierr);
732dd8e54a2SToby Isaac     ierr = DMLoad(base,viewer);CHKERRQ(ierr);
733dd8e54a2SToby Isaac     ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
734dd8e54a2SToby Isaac     ierr = DMForestSetBaseDM(dm,base);CHKERRQ(ierr);
735dd8e54a2SToby Isaac     ierr = DMDestroy(&base);CHKERRQ(ierr);
73656ba9f64SToby Isaac     ierr = DMForestSetTopology(dm,NULL);CHKERRQ(ierr);
73720e8089bSToby Isaac     ierr = DMForestSetAdaptivityForest(dm,NULL);CHKERRQ(ierr);
738dd8e54a2SToby Isaac   }
73956ba9f64SToby Isaac   if (flg3) {
740dd8e54a2SToby Isaac     DM         coarse;
741dd8e54a2SToby Isaac 
742dd8e54a2SToby Isaac     ierr = DMCreate(PetscObjectComm((PetscObject)dm),&coarse);CHKERRQ(ierr);
743dd8e54a2SToby Isaac     ierr = PetscViewerPushFormat(viewer,format);CHKERRQ(ierr);
744dd8e54a2SToby Isaac     ierr = DMLoad(coarse,viewer);CHKERRQ(ierr);
745dd8e54a2SToby Isaac     ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
74620e8089bSToby Isaac     ierr = DMForestSetAdaptivityForest(dm,coarse);CHKERRQ(ierr);
747dd8e54a2SToby Isaac     ierr = DMDestroy(&coarse);CHKERRQ(ierr);
74856ba9f64SToby Isaac     ierr = DMForestSetTopology(dm,NULL);CHKERRQ(ierr);
74956ba9f64SToby Isaac     ierr = DMForestSetBaseDM(dm,NULL);CHKERRQ(ierr);
750dd8e54a2SToby Isaac   }
75156ba9f64SToby Isaac   if (flg4) {
752dd8e54a2SToby Isaac     DM         fine;
753dd8e54a2SToby Isaac 
754dd8e54a2SToby Isaac     ierr = DMCreate(PetscObjectComm((PetscObject)dm),&fine);CHKERRQ(ierr);
755dd8e54a2SToby Isaac     ierr = PetscViewerPushFormat(viewer,format);CHKERRQ(ierr);
756dd8e54a2SToby Isaac     ierr = DMLoad(fine,viewer);CHKERRQ(ierr);
757dd8e54a2SToby Isaac     ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
75820e8089bSToby Isaac     ierr = DMForestSetAdaptivityForest(dm,fine);CHKERRQ(ierr);
759dd8e54a2SToby Isaac     ierr = DMDestroy(&fine);CHKERRQ(ierr);
76056ba9f64SToby Isaac     ierr = DMForestSetTopology(dm,NULL);CHKERRQ(ierr);
76156ba9f64SToby Isaac     ierr = DMForestSetBaseDM(dm,NULL);CHKERRQ(ierr);
762dd8e54a2SToby Isaac   }
763dd8e54a2SToby Isaac   ierr = DMForestGetAdjacencyDimension(dm,&adjDim);CHKERRQ(ierr);
764dd8e54a2SToby Isaac   ierr = PetscOptionsInt("-dm_forest_adjacency_dimension","set the dimension of points that define adjacency in the forest","DMForestSetAdjacencyDimension",adjDim,&adjDim,&flg);CHKERRQ(ierr);
765dd8e54a2SToby Isaac   if (flg) {
766dd8e54a2SToby Isaac     ierr = DMForestSetAdjacencyDimension(dm,adjDim);CHKERRQ(ierr);
767dd8e54a2SToby Isaac   }
768dd8e54a2SToby Isaac   else {
769dd8e54a2SToby Isaac     ierr = DMForestGetAdjacencyCodimension(dm,&adjCodim);CHKERRQ(ierr);
770dd8e54a2SToby Isaac     ierr = PetscOptionsInt("-dm_forest_adjacency_codimension","set the codimension of points that define adjacency in the forest","DMForestSetAdjacencyCodimension",adjCodim,&adjCodim,&flg);CHKERRQ(ierr);
771dd8e54a2SToby Isaac     if (flg) {
772dd8e54a2SToby Isaac       ierr = DMForestSetAdjacencyCodimension(dm,adjCodim);CHKERRQ(ierr);
773dd8e54a2SToby Isaac     }
774dd8e54a2SToby Isaac   }
775dd8e54a2SToby Isaac   ierr = DMForestGetPartitionOverlap(dm,&overlap);CHKERRQ(ierr);
776dd8e54a2SToby Isaac   ierr = PetscOptionsInt("-dm_forest_partition_overlap","set the degree of partition overlap","DMForestSetPartitionOverlap",overlap,&overlap,&flg);CHKERRQ(ierr);
777dd8e54a2SToby Isaac   if (flg) {
778dd8e54a2SToby Isaac     ierr = DMForestSetPartitionOverlap(dm,overlap);CHKERRQ(ierr);
779dd8e54a2SToby Isaac   }
780a6121fbdSMatthew G. Knepley #if 0
781a6121fbdSMatthew G. Knepley   ierr = PetscOptionsInt("-dm_refine","equivalent to -dm_forest_set_minimum_refinement and -dm_forest_set_initial_refinement with the same value",NULL,minRefinement,&minRefinement,&flg);CHKERRQ(ierr);
782a6121fbdSMatthew G. Knepley   if (flg) {
783a6121fbdSMatthew G. Knepley     ierr = DMForestSetMinimumRefinement(dm,minRefinement);CHKERRQ(ierr);
784a6121fbdSMatthew G. Knepley     ierr = DMForestSetInitialRefinement(dm,minRefinement);CHKERRQ(ierr);
785a6121fbdSMatthew G. Knepley   }
786a6121fbdSMatthew G. Knepley   ierr = PetscOptionsInt("-dm_refine_hierarchy","equivalent to -dm_forest_set_minimum_refinement 0 and -dm_forest_set_initial_refinement",NULL,initRefinement,&initRefinement,&flg);CHKERRQ(ierr);
787a6121fbdSMatthew G. Knepley   if (flg) {
788a6121fbdSMatthew G. Knepley     ierr = DMForestSetMinimumRefinement(dm,0);CHKERRQ(ierr);
789a6121fbdSMatthew G. Knepley     ierr = DMForestSetInitialRefinement(dm,initRefinement);CHKERRQ(ierr);
790a6121fbdSMatthew G. Knepley   }
791a6121fbdSMatthew G. Knepley #endif
792dd8e54a2SToby Isaac   ierr = DMForestGetMinimumRefinement(dm,&minRefinement);CHKERRQ(ierr);
793dd8e54a2SToby Isaac   ierr = PetscOptionsInt("-dm_forest_minimum_refinement","set the minimum level of refinement in the forest","DMForestSetMinimumRefinement",minRefinement,&minRefinement,&flg);CHKERRQ(ierr);
794dd8e54a2SToby Isaac   if (flg) {
795dd8e54a2SToby Isaac     ierr = DMForestSetMinimumRefinement(dm,minRefinement);CHKERRQ(ierr);
796db4d5e8cSToby Isaac   }
79756ba9f64SToby Isaac   ierr = DMForestGetInitialRefinement(dm,&initRefinement);CHKERRQ(ierr);
79856ba9f64SToby Isaac   ierr = PetscOptionsInt("-dm_forest_initial_refinement","set the initial level of refinement in the forest","DMForestSetInitialRefinement",initRefinement,&initRefinement,&flg);CHKERRQ(ierr);
79956ba9f64SToby Isaac   if (flg) {
80056ba9f64SToby Isaac     ierr = DMForestSetInitialRefinement(dm,initRefinement);CHKERRQ(ierr);
80156ba9f64SToby Isaac   }
802c7eeac06SToby Isaac   ierr = DMForestGetMaximumRefinement(dm,&maxRefinement);CHKERRQ(ierr);
803c7eeac06SToby Isaac   ierr = PetscOptionsInt("-dm_forest_maximum_refinement","set the maximum level of refinement in the forest","DMForestSetMaximumRefinement",maxRefinement,&maxRefinement,&flg);CHKERRQ(ierr);
804c7eeac06SToby Isaac   if (flg) {
805c7eeac06SToby Isaac     ierr = DMForestSetMaximumRefinement(dm,maxRefinement);CHKERRQ(ierr);
806c7eeac06SToby Isaac   }
807c7eeac06SToby Isaac   ierr = DMForestGetAdaptivityStrategy(dm,&adaptStrategy);CHKERRQ(ierr);
808c7eeac06SToby Isaac   ierr = PetscOptionsString("-dm_forest_adaptivity_strategy","the forest's adaptivity-flag resolution strategy","DMForestSetAdaptivityStrategy",adaptStrategy,stringBuffer,256,&flg);CHKERRQ(ierr);
809c7eeac06SToby Isaac   if (flg) {
810c7eeac06SToby Isaac     ierr = DMForestSetAdaptivityStrategy(dm,(DMForestAdaptivityStrategy)stringBuffer);CHKERRQ(ierr);
811c7eeac06SToby Isaac   }
812c7eeac06SToby Isaac   ierr = DMForestGetGradeFactor(dm,&grade);CHKERRQ(ierr);
813c7eeac06SToby Isaac   ierr = PetscOptionsInt("-dm_forest_grade_factor","grade factor between neighboring cells","DMForestSetGradeFactor",grade,&grade,&flg);CHKERRQ(ierr);
814c7eeac06SToby Isaac   if (flg) {
815c7eeac06SToby Isaac     ierr = DMForestSetGradeFactor(dm,grade);CHKERRQ(ierr);
816c7eeac06SToby Isaac   }
817c7eeac06SToby Isaac   ierr = DMForestGetCellWeightFactor(dm,&weightsFactor);CHKERRQ(ierr);
818c7eeac06SToby Isaac   ierr = PetscOptionsReal("-dm_forest_cell_weight_factor","multiplying weight factor for cell refinement","DMForestSetCellWeightFactor",weightsFactor,&weightsFactor,&flg);CHKERRQ(ierr);
819c7eeac06SToby Isaac   if (flg) {
820c7eeac06SToby Isaac     ierr = DMForestSetCellWeightFactor(dm,weightsFactor);CHKERRQ(ierr);
821c7eeac06SToby Isaac   }
822db4d5e8cSToby Isaac   ierr = PetscOptionsTail();CHKERRQ(ierr);
823db4d5e8cSToby Isaac   PetscFunctionReturn(0);
824db4d5e8cSToby Isaac }
825db4d5e8cSToby Isaac 
826db4d5e8cSToby Isaac #undef __FUNCT__
827d8984e3bSMatthew G. Knepley #define __FUNCT__ "DMCreateSubDM_Forest"
828d8984e3bSMatthew G. Knepley PetscErrorCode DMCreateSubDM_Forest(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm)
829d8984e3bSMatthew G. Knepley {
830d8984e3bSMatthew G. Knepley   PetscErrorCode ierr;
831d8984e3bSMatthew G. Knepley 
832d8984e3bSMatthew G. Knepley   PetscFunctionBegin;
833d8984e3bSMatthew G. Knepley   if (subdm) {ierr = DMClone(dm, subdm);CHKERRQ(ierr);}
834d8984e3bSMatthew G. Knepley   ierr = DMCreateSubDM_Section_Private(dm, numFields, fields, is, subdm);CHKERRQ(ierr);
835d8984e3bSMatthew G. Knepley   PetscFunctionReturn(0);
836d8984e3bSMatthew G. Knepley }
837d8984e3bSMatthew G. Knepley 
838d8984e3bSMatthew G. Knepley #undef __FUNCT__
8395421bac9SToby Isaac #define __FUNCT__ "DMRefine_Forest"
8405421bac9SToby Isaac PetscErrorCode DMRefine_Forest(DM dm, MPI_Comm comm, DM *dmRefined)
8415421bac9SToby Isaac {
8425421bac9SToby Isaac   DMLabel        refine;
8435421bac9SToby Isaac   DM             fineDM;
8445421bac9SToby Isaac   PetscErrorCode ierr;
8455421bac9SToby Isaac 
8465421bac9SToby Isaac   PetscFunctionBegin;
8475421bac9SToby Isaac   ierr = DMGetFineDM(dm,&fineDM);CHKERRQ(ierr);
8485421bac9SToby Isaac   if (fineDM) {
8495421bac9SToby Isaac     ierr = PetscObjectReference((PetscObject)fineDM);CHKERRQ(ierr);
8505421bac9SToby Isaac     *dmRefined = fineDM;
8515421bac9SToby Isaac     PetscFunctionReturn(0);
8525421bac9SToby Isaac   }
8535421bac9SToby Isaac   ierr = DMForestTemplate(dm,comm,dmRefined);CHKERRQ(ierr);
8545421bac9SToby Isaac   ierr = DMGetLabel(dm,"refine",&refine);CHKERRQ(ierr);
8555421bac9SToby Isaac   if (!refine) {
8565421bac9SToby Isaac     ierr = DMCreateLabel(dm,"refine");CHKERRQ(ierr);
8575421bac9SToby Isaac     ierr = DMGetLabel(dm,"refine",&refine);CHKERRQ(ierr);
8585421bac9SToby Isaac     ierr = DMLabelSetDefaultValue(refine,DM_FOREST_REFINE);CHKERRQ(ierr);
8595421bac9SToby Isaac   }
8605421bac9SToby Isaac   ierr = DMForestSetAdaptivityLabel(*dmRefined,"refine");CHKERRQ(ierr);
8615421bac9SToby Isaac   PetscFunctionReturn(0);
8625421bac9SToby Isaac }
8635421bac9SToby Isaac 
8645421bac9SToby Isaac #undef __FUNCT__
8655421bac9SToby Isaac #define __FUNCT__ "DMCoarsen_Forest"
8665421bac9SToby Isaac PetscErrorCode DMCoarsen_Forest(DM dm, MPI_Comm comm, DM *dmCoarsened)
8675421bac9SToby Isaac {
8685421bac9SToby Isaac   DMLabel        coarsen;
8695421bac9SToby Isaac   DM             coarseDM;
8705421bac9SToby Isaac   PetscErrorCode ierr;
8715421bac9SToby Isaac 
8725421bac9SToby Isaac   PetscFunctionBegin;
8735421bac9SToby Isaac   ierr = DMGetCoarseDM(dm,&coarseDM);CHKERRQ(ierr);
8745421bac9SToby Isaac   if (coarseDM) {
8755421bac9SToby Isaac     ierr = PetscObjectReference((PetscObject)coarseDM);CHKERRQ(ierr);
8765421bac9SToby Isaac     *dmCoarsened = coarseDM;
8775421bac9SToby Isaac     PetscFunctionReturn(0);
8785421bac9SToby Isaac   }
8795421bac9SToby Isaac   ierr = DMForestTemplate(dm,comm,dmCoarsened);CHKERRQ(ierr);
8805421bac9SToby Isaac   ierr = DMGetLabel(dm,"coarsen",&coarsen);CHKERRQ(ierr);
8815421bac9SToby Isaac   if (!coarsen) {
8825421bac9SToby Isaac     ierr = DMCreateLabel(dm,"coarsen");CHKERRQ(ierr);
8835421bac9SToby Isaac     ierr = DMGetLabel(dm,"coarsen",&coarsen);CHKERRQ(ierr);
8845421bac9SToby Isaac     ierr = DMLabelSetDefaultValue(coarsen,DM_FOREST_COARSEN);CHKERRQ(ierr);
8855421bac9SToby Isaac   }
8865421bac9SToby Isaac   ierr = DMForestSetAdaptivityLabel(*dmCoarsened,"coarsen");CHKERRQ(ierr);
8875421bac9SToby Isaac   PetscFunctionReturn(0);
8885421bac9SToby Isaac }
8895421bac9SToby Isaac 
8905421bac9SToby Isaac #undef __FUNCT__
891d222f98bSToby Isaac #define __FUNCT__ "DMInitialize_Forest"
892d222f98bSToby Isaac static PetscErrorCode DMInitialize_Forest(DM dm)
893d222f98bSToby Isaac {
894d222f98bSToby Isaac   PetscErrorCode ierr;
895d222f98bSToby Isaac 
896d222f98bSToby Isaac   PetscFunctionBegin;
897d222f98bSToby Isaac   ierr = PetscMemzero(dm->ops,sizeof(*(dm->ops)));CHKERRQ(ierr);
898d222f98bSToby Isaac 
899d222f98bSToby Isaac   dm->ops->clone          = DMClone_Forest;
900d222f98bSToby Isaac   dm->ops->setfromoptions = DMSetFromOptions_Forest;
901d222f98bSToby Isaac   dm->ops->destroy        = DMDestroy_Forest;
902d8984e3bSMatthew G. Knepley   dm->ops->createsubdm    = DMCreateSubDM_Forest;
9035421bac9SToby Isaac   dm->ops->refine         = DMRefine_Forest;
9045421bac9SToby Isaac   dm->ops->coarsen        = DMCoarsen_Forest;
905d222f98bSToby Isaac   PetscFunctionReturn(0);
906d222f98bSToby Isaac }
907d222f98bSToby Isaac 
908d222f98bSToby Isaac #undef __FUNCT__
909db4d5e8cSToby Isaac #define __FUNCT__ "DMCreate_Forest"
910db4d5e8cSToby Isaac PETSC_EXTERN PetscErrorCode DMCreate_Forest(DM dm)
911db4d5e8cSToby Isaac {
912db4d5e8cSToby Isaac   DM_Forest      *forest;
913db4d5e8cSToby Isaac   PetscErrorCode ierr;
914db4d5e8cSToby Isaac 
915db4d5e8cSToby Isaac   PetscFunctionBegin;
916db4d5e8cSToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
917db4d5e8cSToby Isaac   ierr                        = PetscNewLog(dm,&forest);CHKERRQ(ierr);
918db4d5e8cSToby Isaac   dm->dim                     = 0;
919db4d5e8cSToby Isaac   dm->data                    = forest;
920db4d5e8cSToby Isaac   forest->refct               = 1;
921db4d5e8cSToby Isaac   forest->data                = NULL;
92258762b62SToby Isaac   forest->setfromoptionscalled      = PETSC_FALSE;
923db4d5e8cSToby Isaac   forest->topology            = NULL;
924db4d5e8cSToby Isaac   forest->base                = NULL;
925db4d5e8cSToby Isaac   forest->adjDim              = PETSC_DEFAULT;
926db4d5e8cSToby Isaac   forest->overlap             = PETSC_DEFAULT;
927db4d5e8cSToby Isaac   forest->minRefinement       = PETSC_DEFAULT;
928db4d5e8cSToby Isaac   forest->maxRefinement       = PETSC_DEFAULT;
92956ba9f64SToby Isaac   forest->initRefinement      = PETSC_DEFAULT;
930c7eeac06SToby Isaac   forest->cStart              = PETSC_DETERMINE;
931c7eeac06SToby Isaac   forest->cEnd                = PETSC_DETERMINE;
932db4d5e8cSToby Isaac   forest->cellSF              = 0;
933ebdf65a2SToby Isaac   forest->adaptLabel          = NULL;
934db4d5e8cSToby Isaac   forest->gradeFactor         = 2;
935db4d5e8cSToby Isaac   forest->cellWeights         = NULL;
936db4d5e8cSToby Isaac   forest->cellWeightsCopyMode = PETSC_USE_POINTER;
937db4d5e8cSToby Isaac   forest->weightsFactor       = 1.;
938db4d5e8cSToby Isaac   forest->weightCapacity      = 1.;
939a73e2921SToby Isaac   ierr = DMForestSetAdaptivityStrategy(dm,DMFORESTADAPTALL);CHKERRQ(ierr);
940d222f98bSToby Isaac   ierr = DMInitialize_Forest(dm);CHKERRQ(ierr);
941db4d5e8cSToby Isaac   PetscFunctionReturn(0);
942db4d5e8cSToby Isaac }
943db4d5e8cSToby Isaac 
944