xref: /petsc/src/dm/impls/forest/forest.c (revision 2a133e43c4aed5738fa34a227dfc0818bf51868e)
19be51f97SToby Isaac #include <petsc/private/dmforestimpl.h> /*I "petscdmforest.h" I*/
29be51f97SToby Isaac #include <petsc/private/dmimpl.h>       /*I "petscdm.h" I*/
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;
27f416af30SBarry Smith     ierr    = PetscFree(oldLink->name);CHKERRQ(ierr);
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;
43f885a11aSToby Isaac 
4427d4645fSToby Isaac   ierr = DMForestRegisterType(DMFOREST);CHKERRQ(ierr);
4527d4645fSToby Isaac   ierr = PetscRegisterFinalize(DMForestPackageFinalize);CHKERRQ(ierr);
4627d4645fSToby Isaac   PetscFunctionReturn(0);
4727d4645fSToby Isaac }
4827d4645fSToby Isaac 
4927d4645fSToby Isaac #undef __FUNCT__
5027d4645fSToby Isaac #define __FUNCT__ "DMForestRegisterType"
519be51f97SToby Isaac /*@C
529be51f97SToby Isaac   DMForestRegisterType - Registers a DMType as a subtype of DMFOREST (so that DMIsForest() will be correct)
539be51f97SToby Isaac 
549be51f97SToby Isaac   Not Collective
559be51f97SToby Isaac 
569be51f97SToby Isaac   Input parameter:
579be51f97SToby Isaac . name - the name of the type
589be51f97SToby Isaac 
599be51f97SToby Isaac   Level: advanced
609be51f97SToby Isaac 
619be51f97SToby Isaac .seealso: DMFOREST, DMIsForest()
629be51f97SToby Isaac @*/
6327d4645fSToby Isaac PetscErrorCode DMForestRegisterType(DMType name)
6427d4645fSToby Isaac {
6527d4645fSToby Isaac   DMForestTypeLink link;
6627d4645fSToby Isaac   PetscErrorCode   ierr;
6727d4645fSToby Isaac 
6827d4645fSToby Isaac   PetscFunctionBegin;
6927d4645fSToby Isaac   ierr             = DMForestPackageInitialize();CHKERRQ(ierr);
7027d4645fSToby Isaac   ierr             = PetscNew(&link);CHKERRQ(ierr);
7127d4645fSToby Isaac   ierr             = PetscStrallocpy(name,&link->name);CHKERRQ(ierr);
7227d4645fSToby Isaac   link->next       = DMForestTypeList;
7327d4645fSToby Isaac   DMForestTypeList = link;
7427d4645fSToby Isaac   PetscFunctionReturn(0);
7527d4645fSToby Isaac }
7627d4645fSToby Isaac 
7727d4645fSToby Isaac #undef __FUNCT__
7827d4645fSToby Isaac #define __FUNCT__ "DMIsForest"
799be51f97SToby Isaac /*@
809be51f97SToby Isaac   DMIsForest - Check whether a DM uses the DMFOREST interface for hierarchically-refined meshes
819be51f97SToby Isaac 
829be51f97SToby Isaac   Not Collective
839be51f97SToby Isaac 
849be51f97SToby Isaac   Input parameter:
859be51f97SToby Isaac . dm - the DM object
869be51f97SToby Isaac 
879be51f97SToby Isaac   Output parameter:
889be51f97SToby Isaac . isForest - whether dm is a subtype of DMFOREST
899be51f97SToby Isaac 
909be51f97SToby Isaac   Level: intermediate
919be51f97SToby Isaac 
929be51f97SToby Isaac .seealso: DMFOREST, DMForestRegisterType()
939be51f97SToby Isaac @*/
9427d4645fSToby Isaac PetscErrorCode DMIsForest(DM dm, PetscBool *isForest)
9527d4645fSToby Isaac {
9627d4645fSToby Isaac   DMForestTypeLink link = DMForestTypeList;
9727d4645fSToby Isaac   PetscErrorCode   ierr;
9827d4645fSToby Isaac 
9927d4645fSToby Isaac   PetscFunctionBegin;
10027d4645fSToby Isaac   while (link) {
10127d4645fSToby Isaac     PetscBool sameType;
10227d4645fSToby Isaac     ierr = PetscObjectTypeCompare((PetscObject)dm,link->name,&sameType);CHKERRQ(ierr);
10327d4645fSToby Isaac     if (sameType) {
10427d4645fSToby Isaac       *isForest = PETSC_TRUE;
10527d4645fSToby Isaac       PetscFunctionReturn(0);
10627d4645fSToby Isaac     }
10727d4645fSToby Isaac     link = link->next;
10827d4645fSToby Isaac   }
10927d4645fSToby Isaac   *isForest = PETSC_FALSE;
11027d4645fSToby Isaac   PetscFunctionReturn(0);
11127d4645fSToby Isaac }
11227d4645fSToby Isaac 
113db4d5e8cSToby Isaac #undef __FUNCT__
114a0452a8eSToby Isaac #define __FUNCT__ "DMForestTemplate"
1159be51f97SToby Isaac /*@
1169be51f97SToby Isaac   DMForestTemplate - Create a new DM that will be adapted from a source DM.  The new DM reproduces the configuration
1179be51f97SToby Isaac   of the source, but is not yet setup, so that the user can then define only the ways that the new DM should differ
1189be51f97SToby Isaac   (by, e.g., refinement or repartitioning).  The source DM is also set as the adaptivity source DM of the new DM (see
1199be51f97SToby Isaac   DMForestSetAdaptivityForest()).
1209be51f97SToby Isaac 
1219be51f97SToby Isaac   Collective on dm
1229be51f97SToby Isaac 
1239be51f97SToby Isaac   Input Parameters:
1249be51f97SToby Isaac + dm - the source DM object
1259be51f97SToby Isaac - comm - the communicator for the new DM (this communicator is currently ignored, but is present so that DMForestTemplate() can be used within DMCoarsen())
1269be51f97SToby Isaac 
1279be51f97SToby Isaac   Output Parameter:
1289be51f97SToby Isaac . tdm - the new DM object
1299be51f97SToby Isaac 
1309be51f97SToby Isaac   Level: intermediate
1319be51f97SToby Isaac 
1329be51f97SToby Isaac .seealso: DMForestSetAdaptivityForest()
1339be51f97SToby Isaac @*/
1349be51f97SToby Isaac PetscErrorCode DMForestTemplate(DM dm, MPI_Comm comm, DM *tdm)
135a0452a8eSToby Isaac {
136a0452a8eSToby Isaac   DM_Forest                  *forest = (DM_Forest*) dm->data;
13720e8089bSToby Isaac   DMType                     type;
138a0452a8eSToby Isaac   DM                         base;
139a0452a8eSToby Isaac   DMForestTopology           topology;
140a0452a8eSToby Isaac   PetscInt                   dim, overlap, ref, factor;
141a0452a8eSToby Isaac   DMForestAdaptivityStrategy strat;
142795844e7SToby Isaac   PetscDS                    ds;
143795844e7SToby Isaac   void                       *ctx;
14449fc9a2fSToby Isaac   PetscErrorCode             (*map)(DM, PetscInt, PetscInt, const PetscReal[], PetscReal[], void*);
1453e58adeeSToby Isaac   void                       *mapCtx;
146a0452a8eSToby Isaac   PetscErrorCode             ierr;
147a0452a8eSToby Isaac 
148a0452a8eSToby Isaac   PetscFunctionBegin;
149a0452a8eSToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
15020e8089bSToby Isaac   ierr = DMCreate(PetscObjectComm((PetscObject)dm),tdm);CHKERRQ(ierr);
15120e8089bSToby Isaac   ierr = DMGetType(dm,&type);CHKERRQ(ierr);
15220e8089bSToby Isaac   ierr = DMSetType(*tdm,type);CHKERRQ(ierr);
153a0452a8eSToby Isaac   ierr = DMForestGetBaseDM(dm,&base);CHKERRQ(ierr);
15420e8089bSToby Isaac   ierr = DMForestSetBaseDM(*tdm,base);CHKERRQ(ierr);
155a0452a8eSToby Isaac   ierr = DMForestGetTopology(dm,&topology);CHKERRQ(ierr);
15620e8089bSToby Isaac   ierr = DMForestSetTopology(*tdm,topology);CHKERRQ(ierr);
157a0452a8eSToby Isaac   ierr = DMForestGetAdjacencyDimension(dm,&dim);CHKERRQ(ierr);
15820e8089bSToby Isaac   ierr = DMForestSetAdjacencyDimension(*tdm,dim);CHKERRQ(ierr);
159a0452a8eSToby Isaac   ierr = DMForestGetPartitionOverlap(dm,&overlap);CHKERRQ(ierr);
16020e8089bSToby Isaac   ierr = DMForestSetPartitionOverlap(*tdm,overlap);CHKERRQ(ierr);
161a0452a8eSToby Isaac   ierr = DMForestGetMinimumRefinement(dm,&ref);CHKERRQ(ierr);
16220e8089bSToby Isaac   ierr = DMForestSetMinimumRefinement(*tdm,ref);CHKERRQ(ierr);
163a0452a8eSToby Isaac   ierr = DMForestGetMaximumRefinement(dm,&ref);CHKERRQ(ierr);
16420e8089bSToby Isaac   ierr = DMForestSetMaximumRefinement(*tdm,ref);CHKERRQ(ierr);
165a0452a8eSToby Isaac   ierr = DMForestGetAdaptivityStrategy(dm,&strat);CHKERRQ(ierr);
16620e8089bSToby Isaac   ierr = DMForestSetAdaptivityStrategy(*tdm,strat);CHKERRQ(ierr);
167a0452a8eSToby Isaac   ierr = DMForestGetGradeFactor(dm,&factor);CHKERRQ(ierr);
16820e8089bSToby Isaac   ierr = DMForestSetGradeFactor(*tdm,factor);CHKERRQ(ierr);
1693e58adeeSToby Isaac   ierr = DMForestGetBaseCoordinateMapping(dm,&map,&mapCtx);CHKERRQ(ierr);
1705e8c540aSToby Isaac   ierr = DMForestSetBaseCoordinateMapping(*tdm,map,mapCtx);CHKERRQ(ierr);
171a0452a8eSToby Isaac   if (forest->ftemplate) {
17220e8089bSToby Isaac     ierr = (forest->ftemplate)(dm, *tdm);CHKERRQ(ierr);
173a0452a8eSToby Isaac   }
17420e8089bSToby Isaac   ierr = DMForestSetAdaptivityForest(*tdm,dm);CHKERRQ(ierr);
175795844e7SToby Isaac   ierr = DMGetDS(dm,&ds);CHKERRQ(ierr);
176795844e7SToby Isaac   ierr = DMSetDS(*tdm,ds);CHKERRQ(ierr);
177795844e7SToby Isaac   ierr = DMGetApplicationContext(dm,&ctx);CHKERRQ(ierr);
178795844e7SToby Isaac   ierr = DMSetApplicationContext(*tdm,&ctx);CHKERRQ(ierr);
179795844e7SToby Isaac   if (dm->maxCell) {
180795844e7SToby Isaac     const PetscReal      *maxCell, *L;
181795844e7SToby Isaac     const DMBoundaryType *bd;
182795844e7SToby Isaac 
183795844e7SToby Isaac     ierr = DMGetPeriodicity(dm,&maxCell,&L,&bd);CHKERRQ(ierr);
184795844e7SToby Isaac     ierr = DMSetPeriodicity(*tdm,maxCell,L,bd);CHKERRQ(ierr);
185795844e7SToby Isaac   }
186bff67a9bSToby Isaac   ierr = DMCopyBoundary(dm,*tdm);CHKERRQ(ierr);
187a0452a8eSToby Isaac   PetscFunctionReturn(0);
188a0452a8eSToby Isaac }
189a0452a8eSToby Isaac 
19001d9d024SToby Isaac static PetscErrorCode DMInitialize_Forest(DM dm);
19101d9d024SToby Isaac 
192a0452a8eSToby Isaac #undef __FUNCT__
193db4d5e8cSToby Isaac #define __FUNCT__ "DMClone_Forest"
194db4d5e8cSToby Isaac PETSC_EXTERN PetscErrorCode DMClone_Forest(DM dm, DM *newdm)
195db4d5e8cSToby Isaac {
196db4d5e8cSToby Isaac   DM_Forest      *forest = (DM_Forest*) dm->data;
197db4d5e8cSToby Isaac   const char     *type;
198db4d5e8cSToby Isaac   PetscErrorCode ierr;
199db4d5e8cSToby Isaac 
200db4d5e8cSToby Isaac   PetscFunctionBegin;
201db4d5e8cSToby Isaac   forest->refct++;
202db4d5e8cSToby Isaac   (*newdm)->data = forest;
203db4d5e8cSToby Isaac   ierr           = PetscObjectGetType((PetscObject) dm, &type);CHKERRQ(ierr);
204db4d5e8cSToby Isaac   ierr           = PetscObjectChangeTypeName((PetscObject) *newdm, type);CHKERRQ(ierr);
20501d9d024SToby Isaac   ierr           = DMInitialize_Forest(*newdm);CHKERRQ(ierr);
206db4d5e8cSToby Isaac   PetscFunctionReturn(0);
207db4d5e8cSToby Isaac }
208db4d5e8cSToby Isaac 
209db4d5e8cSToby Isaac #undef __FUNCT__
210db4d5e8cSToby Isaac #define __FUNCT__ "DMDestroy_Forest"
211d222f98bSToby Isaac static PetscErrorCode DMDestroy_Forest(DM dm)
212db4d5e8cSToby Isaac {
213db4d5e8cSToby Isaac   DM_Forest      *forest = (DM_Forest*) dm->data;
214db4d5e8cSToby Isaac   PetscErrorCode ierr;
215db4d5e8cSToby Isaac 
216db4d5e8cSToby Isaac   PetscFunctionBegin;
217db4d5e8cSToby Isaac   if (--forest->refct > 0) PetscFunctionReturn(0);
218d222f98bSToby Isaac   if (forest->destroy) {ierr = forest->destroy(dm);CHKERRQ(ierr);}
219db4d5e8cSToby Isaac   ierr = PetscSFDestroy(&forest->cellSF);CHKERRQ(ierr);
2200f17b9e3SToby Isaac   ierr = PetscSFDestroy(&forest->preCoarseToFine);CHKERRQ(ierr);
2210f17b9e3SToby Isaac   ierr = PetscSFDestroy(&forest->coarseToPreFine);CHKERRQ(ierr);
222ebdf65a2SToby Isaac   ierr = PetscFree(forest->adaptLabel);CHKERRQ(ierr);
2239a81d013SToby Isaac   ierr = PetscFree(forest->adaptStrategy);CHKERRQ(ierr);
22456ba9f64SToby Isaac   ierr = DMDestroy(&forest->base);CHKERRQ(ierr);
225ba936b91SToby Isaac   ierr = DMDestroy(&forest->adapt);CHKERRQ(ierr);
22630f902e7SToby Isaac   ierr = PetscFree(forest->topology);CHKERRQ(ierr);
22730f902e7SToby Isaac   ierr = PetscFree(forest);CHKERRQ(ierr);
228db4d5e8cSToby Isaac   PetscFunctionReturn(0);
229db4d5e8cSToby Isaac }
230db4d5e8cSToby Isaac 
231db4d5e8cSToby Isaac #undef __FUNCT__
232dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetTopology"
2339be51f97SToby Isaac /*@C
2349be51f97SToby Isaac   DMForestSetTopology - Set the topology of a DMForest during the pre-setup phase.  The topology is a string (e.g.
2359be51f97SToby Isaac   "cube", "shell") and can be interpreted by subtypes of DMFOREST) to construct the base DM of a forest durint
2369be51f97SToby Isaac   DMSetUp().
2379be51f97SToby Isaac 
2389be51f97SToby Isaac   Logically collective on dm
2399be51f97SToby Isaac 
2409be51f97SToby Isaac   Input parameters:
2419be51f97SToby Isaac + dm - the forest
2429be51f97SToby Isaac - topology - the topology of the forest
2439be51f97SToby Isaac 
2449be51f97SToby Isaac   Level: intermediate
2459be51f97SToby Isaac 
2469be51f97SToby Isaac .seealso(): DMForestGetTopology(), DMForestSetBaseDM()
2479be51f97SToby Isaac @*/
248dd8e54a2SToby Isaac PetscErrorCode DMForestSetTopology(DM dm, DMForestTopology topology)
249db4d5e8cSToby Isaac {
250db4d5e8cSToby Isaac   DM_Forest      *forest = (DM_Forest*) dm->data;
251db4d5e8cSToby Isaac   PetscErrorCode ierr;
252db4d5e8cSToby Isaac 
253db4d5e8cSToby Isaac   PetscFunctionBegin;
254db4d5e8cSToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
255ef51cf95SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the topology after setup");
256dd8e54a2SToby Isaac   ierr = PetscFree(forest->topology);CHKERRQ(ierr);
257dd8e54a2SToby Isaac   ierr = PetscStrallocpy((const char*)topology,(char**) &forest->topology);CHKERRQ(ierr);
258db4d5e8cSToby Isaac   PetscFunctionReturn(0);
259db4d5e8cSToby Isaac }
260db4d5e8cSToby Isaac 
261db4d5e8cSToby Isaac #undef __FUNCT__
262dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetTopology"
2639be51f97SToby Isaac /*@C
2649be51f97SToby Isaac   DMForestGetTopology - Get a string describing the topology of a DMForest.
2659be51f97SToby Isaac 
2669be51f97SToby Isaac   Not collective
2679be51f97SToby Isaac 
2689be51f97SToby Isaac   Input parameter:
2699be51f97SToby Isaac . dm - the forest
2709be51f97SToby Isaac 
2719be51f97SToby Isaac   Output parameter:
2729be51f97SToby Isaac . topology - the topology of the forest (e.g., 'cube', 'shell')
2739be51f97SToby Isaac 
2749be51f97SToby Isaac   Level: intermediate
2759be51f97SToby Isaac 
2769be51f97SToby Isaac .seealso: DMForestSetTopology()
2779be51f97SToby Isaac @*/
278dd8e54a2SToby Isaac PetscErrorCode DMForestGetTopology(DM dm, DMForestTopology *topology)
279dd8e54a2SToby Isaac {
280dd8e54a2SToby Isaac   DM_Forest *forest = (DM_Forest*) dm->data;
281dd8e54a2SToby Isaac 
282dd8e54a2SToby Isaac   PetscFunctionBegin;
283dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
284dd8e54a2SToby Isaac   PetscValidPointer(topology,2);
285dd8e54a2SToby Isaac   *topology = forest->topology;
286dd8e54a2SToby Isaac   PetscFunctionReturn(0);
287dd8e54a2SToby Isaac }
288dd8e54a2SToby Isaac 
289dd8e54a2SToby Isaac #undef __FUNCT__
290dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetBaseDM"
2919be51f97SToby Isaac /*@
2929be51f97SToby Isaac   DMForestSetBaseDM - During the pre-setup phase, set the DM that defines the base mesh of a DMForest forest.  The
2939be51f97SToby Isaac   forest will be hierarchically refined from the base, and all refinements/coarsenings of the forest will share its
2949be51f97SToby Isaac   base.  In general, two forest must share a bse to be comparable, to do things like construct interpolators.
2959be51f97SToby Isaac 
2969be51f97SToby Isaac   Logically collective on dm
2979be51f97SToby Isaac 
2989be51f97SToby Isaac   Input Parameters:
2999be51f97SToby Isaac + dm - the forest
3009be51f97SToby Isaac - base - the base DM of the forest
3019be51f97SToby Isaac 
3029be51f97SToby Isaac   Level: intermediate
3039be51f97SToby Isaac 
3049be51f97SToby Isaac .seealso(): DMForestGetBaseDM()
3059be51f97SToby Isaac @*/
306dd8e54a2SToby Isaac PetscErrorCode DMForestSetBaseDM(DM dm, DM base)
307dd8e54a2SToby Isaac {
308dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest*) dm->data;
309dd8e54a2SToby Isaac   PetscInt       dim, dimEmbed;
310dd8e54a2SToby Isaac   PetscErrorCode ierr;
311dd8e54a2SToby Isaac 
312dd8e54a2SToby Isaac   PetscFunctionBegin;
313dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
314ef51cf95SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the base after setup");
315dd8e54a2SToby Isaac   ierr         = PetscObjectReference((PetscObject)base);CHKERRQ(ierr);
316dd8e54a2SToby Isaac   ierr         = DMDestroy(&forest->base);CHKERRQ(ierr);
317dd8e54a2SToby Isaac   forest->base = base;
318a0452a8eSToby Isaac   if (base) {
319a0452a8eSToby Isaac     PetscValidHeaderSpecific(base, DM_CLASSID, 2);
320dd8e54a2SToby Isaac     ierr = DMGetDimension(base,&dim);CHKERRQ(ierr);
321dd8e54a2SToby Isaac     ierr = DMSetDimension(dm,dim);CHKERRQ(ierr);
322dd8e54a2SToby Isaac     ierr = DMGetCoordinateDim(base,&dimEmbed);CHKERRQ(ierr);
323dd8e54a2SToby Isaac     ierr = DMSetCoordinateDim(dm,dimEmbed);CHKERRQ(ierr);
324a0452a8eSToby Isaac   }
325dd8e54a2SToby Isaac   PetscFunctionReturn(0);
326dd8e54a2SToby Isaac }
327dd8e54a2SToby Isaac 
328dd8e54a2SToby Isaac #undef __FUNCT__
329dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetBaseDM"
3309be51f97SToby Isaac /*@
3319be51f97SToby Isaac   DMForestGetBaseDM - Get the base DM of a DMForest forest.  The forest will be hierarchically refined from the base,
3329be51f97SToby Isaac   and all refinements/coarsenings of the forest will share its base.  In general, two forest must share a bse to be
3339be51f97SToby Isaac   comparable, to do things like construct interpolators.
3349be51f97SToby Isaac 
3359be51f97SToby Isaac   Not collective
3369be51f97SToby Isaac 
3379be51f97SToby Isaac   Input Parameter:
3389be51f97SToby Isaac . dm - the forest
3399be51f97SToby Isaac 
3409be51f97SToby Isaac   Output Parameter:
3419be51f97SToby Isaac . base - the base DM of the forest
3429be51f97SToby Isaac 
3439be51f97SToby Isaac   Level: intermediate
3449be51f97SToby Isaac 
3459be51f97SToby Isaac .seealso(); DMForestSetBaseDM()
3469be51f97SToby Isaac @*/
347dd8e54a2SToby Isaac PetscErrorCode DMForestGetBaseDM(DM dm, DM *base)
348dd8e54a2SToby Isaac {
349dd8e54a2SToby Isaac   DM_Forest *forest = (DM_Forest*) dm->data;
350dd8e54a2SToby Isaac 
351dd8e54a2SToby Isaac   PetscFunctionBegin;
352dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
353dd8e54a2SToby Isaac   PetscValidPointer(base, 2);
354dd8e54a2SToby Isaac   *base = forest->base;
355dd8e54a2SToby Isaac   PetscFunctionReturn(0);
356dd8e54a2SToby Isaac }
357dd8e54a2SToby Isaac 
358dd8e54a2SToby Isaac #undef __FUNCT__
359cf38a08cSToby Isaac #define __FUNCT__ "DMForestSetBaseCoordinateMapping"
36099478f86SToby Isaac PetscErrorCode DMForestSetBaseCoordinateMapping(DM dm, PetscErrorCode (*func)(DM,PetscInt,PetscInt,const PetscReal [],PetscReal [],void*),void *ctx)
361cf38a08cSToby Isaac {
362cf38a08cSToby Isaac   DM_Forest *forest = (DM_Forest*) dm->data;
363cf38a08cSToby Isaac 
364cf38a08cSToby Isaac   PetscFunctionBegin;
365cf38a08cSToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
366cf38a08cSToby Isaac   forest->mapcoordinates    = func;
367cf38a08cSToby Isaac   forest->mapcoordinatesctx = ctx;
368cf38a08cSToby Isaac   PetscFunctionReturn(0);
369cf38a08cSToby Isaac }
370cf38a08cSToby Isaac 
371cf38a08cSToby Isaac #undef __FUNCT__
372cf38a08cSToby Isaac #define __FUNCT__ "DMForestGetBaseCoordinateMapping"
37399478f86SToby Isaac PetscErrorCode DMForestGetBaseCoordinateMapping(DM dm, PetscErrorCode (**func) (DM,PetscInt,PetscInt,const PetscReal [],PetscReal [],void*),void *ctx)
374cf38a08cSToby Isaac {
375cf38a08cSToby Isaac   DM_Forest *forest = (DM_Forest*) dm->data;
376cf38a08cSToby Isaac 
377cf38a08cSToby Isaac   PetscFunctionBegin;
378cf38a08cSToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
379cf38a08cSToby Isaac   if (func) *func = forest->mapcoordinates;
380cf38a08cSToby Isaac   if (ctx) *((void**) ctx) = forest->mapcoordinatesctx;
381cf38a08cSToby Isaac   PetscFunctionReturn(0);
382cf38a08cSToby Isaac }
383cf38a08cSToby Isaac 
384cf38a08cSToby Isaac #undef __FUNCT__
385ba936b91SToby Isaac #define __FUNCT__ "DMForestSetAdaptivityForest"
3869be51f97SToby Isaac /*@
3879be51f97SToby Isaac   DMForestSetAdaptivityForest - During the pre-setup phase, set the forest from which the current forest will be
3889be51f97SToby Isaac   adapted (e.g., the current forest will be refined/coarsened/repartitioned from it) im DMSetUp().  Usually not needed
3899be51f97SToby Isaac   by users directly: DMForestTemplate() constructs a new forest to be adapted from an old forest and calls this
3909be51f97SToby Isaac   routine.
3919be51f97SToby Isaac 
392dffe73a3SToby Isaac   Note that this can be called after setup with adapt = NULL, which will clear all internal data related to the
393dffe73a3SToby Isaac   adaptivity forest from dm.  This way, repeatedly adapting does not leave stale DM objects in memory.
394dffe73a3SToby Isaac 
3959be51f97SToby Isaac   Logically collective on dm
3969be51f97SToby Isaac 
3979be51f97SToby Isaac   Input Parameter:
3989be51f97SToby Isaac + dm - the new forest, which will be constructed from adapt
3999be51f97SToby Isaac - adapt - the old forest
4009be51f97SToby Isaac 
4019be51f97SToby Isaac   Level: intermediate
4029be51f97SToby Isaac 
4039be51f97SToby Isaac .seealso: DMForestGetAdaptivityForest(), DMForestSetAdaptivityPurpose()
4049be51f97SToby Isaac @*/
405ba936b91SToby Isaac PetscErrorCode DMForestSetAdaptivityForest(DM dm,DM adapt)
406dd8e54a2SToby Isaac {
407dffe73a3SToby Isaac   DM_Forest      *forest, *adaptForest, *oldAdaptForest;
408dffe73a3SToby Isaac   DM             oldAdapt;
409dd8e54a2SToby Isaac   PetscErrorCode ierr;
410dd8e54a2SToby Isaac 
411dd8e54a2SToby Isaac   PetscFunctionBegin;
412dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
413ba936b91SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 2);
414ba936b91SToby Isaac   forest   = (DM_Forest*) dm->data;
415dffe73a3SToby Isaac   ierr     = DMForestGetAdaptivityForest(dm,&oldAdapt);CHKERRQ(ierr);
416dffe73a3SToby Isaac   if (adapt != NULL && dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the adaptation forest after setup");
417dffe73a3SToby Isaac   adaptForest    = (DM_Forest*) adapt ? adapt->data : NULL;
418dffe73a3SToby Isaac   oldAdaptForest = (DM_Forest*) oldAdapt ? oldAdapt->data : NULL;
419dffe73a3SToby Isaac   if (adaptForest != oldAdaptForest) {
420dffe73a3SToby Isaac     ierr = PetscSFDestroy(&forest->preCoarseToFine);CHKERRQ(ierr);
421dffe73a3SToby Isaac     ierr = PetscSFDestroy(&forest->coarseToPreFine);CHKERRQ(ierr);
422dffe73a3SToby Isaac     if (forest->clearadaptivityforest) {ierr = (forest->clearadaptivityforest)(dm);CHKERRQ(ierr);}
423dffe73a3SToby Isaac   }
42426d9498aSToby Isaac   switch (forest->adaptPurpose) {
42526d9498aSToby Isaac   case DM_FOREST_KEEP:
426ba936b91SToby Isaac     ierr          = PetscObjectReference((PetscObject)adapt);CHKERRQ(ierr);
427ba936b91SToby Isaac     ierr          = DMDestroy(&(forest->adapt));CHKERRQ(ierr);
428ba936b91SToby Isaac     forest->adapt = adapt;
42926d9498aSToby Isaac     break;
43026d9498aSToby Isaac   case DM_FOREST_REFINE:
43126d9498aSToby Isaac     ierr = DMSetCoarseDM(dm,adapt);CHKERRQ(ierr);
43226d9498aSToby Isaac     break;
43326d9498aSToby Isaac   case DM_FOREST_COARSEN:
43426d9498aSToby Isaac     ierr = DMSetFineDM(dm,adapt);CHKERRQ(ierr);
43526d9498aSToby Isaac     break;
43626d9498aSToby Isaac   default:
43726d9498aSToby Isaac     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"invalid adaptivity purpose");
43826d9498aSToby Isaac   }
439dd8e54a2SToby Isaac   PetscFunctionReturn(0);
440dd8e54a2SToby Isaac }
441dd8e54a2SToby Isaac 
442dd8e54a2SToby Isaac #undef __FUNCT__
443ba936b91SToby Isaac #define __FUNCT__ "DMForestGetAdaptivityForest"
4449be51f97SToby Isaac /*@
4459be51f97SToby Isaac   DMForestGetAdaptivityForest - Get the forest from which the current forest is adapted.
4469be51f97SToby Isaac 
4479be51f97SToby Isaac   Not collective
4489be51f97SToby Isaac 
4499be51f97SToby Isaac   Input Parameter:
4509be51f97SToby Isaac . dm - the forest
4519be51f97SToby Isaac 
4529be51f97SToby Isaac   Output Parameter:
4539be51f97SToby Isaac . adapt - the forest from which dm is/was adapted
4549be51f97SToby Isaac 
4559be51f97SToby Isaac   Level: intermediate
4569be51f97SToby Isaac 
4579be51f97SToby Isaac .seealso: DMForestSetAdaptivityForest(), DMForestSetAdaptivityPurpose()
4589be51f97SToby Isaac @*/
459ba936b91SToby Isaac PetscErrorCode DMForestGetAdaptivityForest(DM dm, DM *adapt)
460dd8e54a2SToby Isaac {
461ba936b91SToby Isaac   DM_Forest      *forest;
46226d9498aSToby Isaac   PetscErrorCode ierr;
463dd8e54a2SToby Isaac 
464dd8e54a2SToby Isaac   PetscFunctionBegin;
465dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
466ba936b91SToby Isaac   forest = (DM_Forest*) dm->data;
46726d9498aSToby Isaac   switch (forest->adaptPurpose) {
46826d9498aSToby Isaac   case DM_FOREST_KEEP:
469ba936b91SToby Isaac     *adapt = forest->adapt;
47026d9498aSToby Isaac     break;
47126d9498aSToby Isaac   case DM_FOREST_REFINE:
47226d9498aSToby Isaac     ierr = DMGetCoarseDM(dm,adapt);CHKERRQ(ierr);
47326d9498aSToby Isaac     break;
47426d9498aSToby Isaac   case DM_FOREST_COARSEN:
47526d9498aSToby Isaac     ierr = DMGetFineDM(dm,adapt);CHKERRQ(ierr);
47626d9498aSToby Isaac     break;
47726d9498aSToby Isaac   default:
47826d9498aSToby Isaac     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"invalid adaptivity purpose");
47926d9498aSToby Isaac   }
48026d9498aSToby Isaac   PetscFunctionReturn(0);
48126d9498aSToby Isaac }
48226d9498aSToby Isaac 
48326d9498aSToby Isaac #undef __FUNCT__
48426d9498aSToby Isaac #define __FUNCT__ "DMForestSetAdaptivityPurpose"
4859be51f97SToby Isaac /*@
4869be51f97SToby Isaac   DMForestSetAdaptivityPurpose - During the pre-setup phase, set whether the current DM is being adapted from its
4879be51f97SToby Isaac   source (set with DMForestSetAdaptivityForest()) for the purpose of refinement (DM_FOREST_REFINE), coarsening
4889be51f97SToby Isaac   (DM_FOREST_COARSEN), or undefined (DM_FOREST_NONE).  This only matters for the purposes of reference counting:
4899be51f97SToby Isaac   during DMDestroy(), cyclic references can be found between DMs only if the cyclic reference is due to a fine/coarse
4909be51f97SToby Isaac   relationship (see DMSetFineDM()/DMSetCoarseDM()).  If the purpose is not refinement or coarsening, and the user does
4919be51f97SToby Isaac   not maintain a reference to the post-adaptation forest (i.e., the one created by DMForestTemplate()), then this can
4929be51f97SToby Isaac   cause a memory leak.  This method is used by subtypes of DMForest when automatically constructing mesh hierarchies.
4939be51f97SToby Isaac 
4949be51f97SToby Isaac   Logically collective on dm
4959be51f97SToby Isaac 
4969be51f97SToby Isaac   Input Parameters:
4979be51f97SToby Isaac + dm - the forest
4989be51f97SToby Isaac - purpose - the adaptivity purpose (DM_FOREST_NONE/DM_FOREST_REFINE/DM_FOREST_COARSEN)
4999be51f97SToby Isaac 
5009be51f97SToby Isaac   Level: advanced
5019be51f97SToby Isaac 
5029be51f97SToby Isaac .seealso: DMForestTemplate(), DMForestSetAdaptivityForest(), DMForestGetAdaptivityForest()
5039be51f97SToby Isaac @*/
50426d9498aSToby Isaac PetscErrorCode DMForestSetAdaptivityPurpose(DM dm, DMForestAdaptivityPurpose purpose)
50526d9498aSToby Isaac {
50626d9498aSToby Isaac   DM_Forest      *forest;
50726d9498aSToby Isaac   PetscErrorCode ierr;
50826d9498aSToby Isaac 
50926d9498aSToby Isaac   PetscFunctionBegin;
51026d9498aSToby Isaac   forest = (DM_Forest*) dm->data;
5119be51f97SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the adaptation forest after setup");
51226d9498aSToby Isaac   if (purpose != forest->adaptPurpose) {
51326d9498aSToby Isaac     DM adapt;
51426d9498aSToby Isaac 
51526d9498aSToby Isaac     ierr = DMForestGetAdaptivityForest(dm,&adapt);CHKERRQ(ierr);
51626d9498aSToby Isaac     ierr = PetscObjectReference((PetscObject)adapt);CHKERRQ(ierr);
51726d9498aSToby Isaac     ierr = DMForestSetAdaptivityForest(dm,NULL);CHKERRQ(ierr);
518f885a11aSToby Isaac 
51926d9498aSToby Isaac     forest->adaptPurpose = purpose;
520f885a11aSToby Isaac 
52126d9498aSToby Isaac     ierr = DMForestSetAdaptivityForest(dm,adapt);CHKERRQ(ierr);
52226d9498aSToby Isaac     ierr = DMDestroy(&adapt);CHKERRQ(ierr);
52326d9498aSToby Isaac   }
524dd8e54a2SToby Isaac   PetscFunctionReturn(0);
525dd8e54a2SToby Isaac }
526dd8e54a2SToby Isaac 
527dd8e54a2SToby Isaac #undef __FUNCT__
52856c0450aSToby Isaac #define __FUNCT__ "DMForestGetAdaptivityPurpose"
52956c0450aSToby Isaac /*@
53056c0450aSToby Isaac   DMForestGetAdaptivityPurpose - Get whether the current DM is being adapted from its source (set with
53156c0450aSToby Isaac   DMForestSetAdaptivityForest()) for the purpose of refinement (DM_FOREST_REFINE), coarsening (DM_FOREST_COARSEN), or
53256c0450aSToby Isaac   undefined (DM_FOREST_NONE).  This only matters for the purposes of reference counting: during DMDestroy(), cyclic
53356c0450aSToby Isaac   references can be found between DMs only if the cyclic reference is due to a fine/coarse relationship (see
53456c0450aSToby Isaac   DMSetFineDM()/DMSetCoarseDM()).  If the purpose is not refinement or coarsening, and the user does not maintain a
53556c0450aSToby Isaac   reference to the post-adaptation forest (i.e., the one created by DMForestTemplate()), then this can cause a memory
53656c0450aSToby Isaac   leak.  This method is used by subtypes of DMForest when automatically constructing mesh hierarchies.
53756c0450aSToby Isaac 
53856c0450aSToby Isaac   Not collective
53956c0450aSToby Isaac 
54056c0450aSToby Isaac   Input Parameter:
54156c0450aSToby Isaac . dm - the forest
54256c0450aSToby Isaac 
54356c0450aSToby Isaac   Output Parameter:
54456c0450aSToby Isaac . purpose - the adaptivity purpose (DM_FOREST_NONE/DM_FOREST_REFINE/DM_FOREST_COARSEN)
54556c0450aSToby Isaac 
54656c0450aSToby Isaac   Level: advanced
54756c0450aSToby Isaac 
54856c0450aSToby Isaac .seealso: DMForestTemplate(), DMForestSetAdaptivityForest(), DMForestGetAdaptivityForest()
54956c0450aSToby Isaac @*/
55056c0450aSToby Isaac PetscErrorCode DMForestGetAdaptivityPurpose(DM dm, DMForestAdaptivityPurpose *purpose)
55156c0450aSToby Isaac {
55256c0450aSToby Isaac   DM_Forest *forest;
55356c0450aSToby Isaac 
55456c0450aSToby Isaac   PetscFunctionBegin;
55556c0450aSToby Isaac   forest   = (DM_Forest*) dm->data;
55656c0450aSToby Isaac   *purpose = forest->adaptPurpose;
55756c0450aSToby Isaac   PetscFunctionReturn(0);
55856c0450aSToby Isaac }
55956c0450aSToby Isaac 
56056c0450aSToby Isaac #undef __FUNCT__
561dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetAdjacencyDimension"
5629be51f97SToby Isaac /*@
5639be51f97SToby Isaac   DMForestSetAdjacencyDimension - During the pre-setup phase, set the dimension of interface points that determine
5649be51f97SToby Isaac   cell adjacency (for the purposes of partitioning and overlap).
5659be51f97SToby Isaac 
5669be51f97SToby Isaac   Logically collective on dm
5679be51f97SToby Isaac 
5689be51f97SToby Isaac   Input Parameters:
5699be51f97SToby Isaac + dm - the forest
5709be51f97SToby Isaac - adjDim - default 0 (i.e., vertices determine adjacency)
5719be51f97SToby Isaac 
5729be51f97SToby Isaac   Level: intermediate
5739be51f97SToby Isaac 
5749be51f97SToby Isaac .seealso: DMForestGetAdjacencyDimension(), DMForestSetAdjacencyCodimension(), DMForestSetPartitionOverlap()
5759be51f97SToby Isaac @*/
576dd8e54a2SToby Isaac PetscErrorCode DMForestSetAdjacencyDimension(DM dm, PetscInt adjDim)
577dd8e54a2SToby Isaac {
578dd8e54a2SToby Isaac   PetscInt       dim;
579dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest*) dm->data;
580dd8e54a2SToby Isaac   PetscErrorCode ierr;
581dd8e54a2SToby Isaac 
582dd8e54a2SToby Isaac   PetscFunctionBegin;
583dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
584ef51cf95SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the adjacency dimension after setup");
585dd8e54a2SToby Isaac   if (adjDim < 0) SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_OUTOFRANGE,"adjacency dim cannot be < 0: %d", adjDim);
586dd8e54a2SToby Isaac   ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr);
587dd8e54a2SToby Isaac   if (adjDim > dim) SETERRQ2(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_OUTOFRANGE,"adjacency dim cannot be > %d: %d", dim, adjDim);
588dd8e54a2SToby Isaac   forest->adjDim = adjDim;
589dd8e54a2SToby Isaac   PetscFunctionReturn(0);
590dd8e54a2SToby Isaac }
591dd8e54a2SToby Isaac 
592dd8e54a2SToby Isaac #undef __FUNCT__
593dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetAdjacencyCodimension"
5949be51f97SToby Isaac /*@
5959be51f97SToby Isaac   DMForestSetAdjacencyCodimension - Like DMForestSetAdjacencyDimension(), but specified as a co-dimension (so that,
5969be51f97SToby Isaac   e.g., adjacency based on facets can be specified by codimension 1 in all cases)
5979be51f97SToby Isaac 
5989be51f97SToby Isaac   Logically collective on dm
5999be51f97SToby Isaac 
6009be51f97SToby Isaac   Input Parameters:
6019be51f97SToby Isaac + dm - the forest
6029be51f97SToby Isaac - adjCodim - default isthe dimension of the forest (see DMGetDimension()), since this is the codimension of vertices
6039be51f97SToby Isaac 
6049be51f97SToby Isaac   Level: intermediate
6059be51f97SToby Isaac 
6069be51f97SToby Isaac .seealso: DMForestGetAdjacencyCodimension(), DMForestSetAdjacencyDimension()
6079be51f97SToby Isaac @*/
608dd8e54a2SToby Isaac PetscErrorCode DMForestSetAdjacencyCodimension(DM dm, PetscInt adjCodim)
609dd8e54a2SToby Isaac {
610dd8e54a2SToby Isaac   PetscInt       dim;
611dd8e54a2SToby Isaac   PetscErrorCode ierr;
612dd8e54a2SToby Isaac 
613dd8e54a2SToby Isaac   PetscFunctionBegin;
614dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
615dd8e54a2SToby Isaac   ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr);
616dd8e54a2SToby Isaac   ierr = DMForestSetAdjacencyDimension(dm,dim-adjCodim);CHKERRQ(ierr);
617dd8e54a2SToby Isaac   PetscFunctionReturn(0);
618dd8e54a2SToby Isaac }
619dd8e54a2SToby Isaac 
620dd8e54a2SToby Isaac #undef __FUNCT__
621dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetAdjacencyDimension"
6229be51f97SToby Isaac /*@
6239be51f97SToby Isaac   DMForestGetAdjacencyDimension - Get the dimension of interface points that determine cell adjacency (for the
6249be51f97SToby Isaac   purposes of partitioning and overlap).
6259be51f97SToby Isaac 
6269be51f97SToby Isaac   Not collective
6279be51f97SToby Isaac 
6289be51f97SToby Isaac   Input Parameter:
6299be51f97SToby Isaac . dm - the forest
6309be51f97SToby Isaac 
6319be51f97SToby Isaac   Output Parameter:
6329be51f97SToby Isaac . adjDim - default 0 (i.e., vertices determine adjacency)
6339be51f97SToby Isaac 
6349be51f97SToby Isaac   Level: intermediate
6359be51f97SToby Isaac 
6369be51f97SToby Isaac .seealso: DMForestSetAdjacencyDimension(), DMForestGetAdjacencyCodimension(), DMForestSetPartitionOverlap()
6379be51f97SToby Isaac @*/
638dd8e54a2SToby Isaac PetscErrorCode DMForestGetAdjacencyDimension(DM dm, PetscInt *adjDim)
639dd8e54a2SToby Isaac {
640dd8e54a2SToby Isaac   DM_Forest *forest = (DM_Forest*) dm->data;
641dd8e54a2SToby Isaac 
642dd8e54a2SToby Isaac   PetscFunctionBegin;
643dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
644dd8e54a2SToby Isaac   PetscValidIntPointer(adjDim,2);
645dd8e54a2SToby Isaac   *adjDim = forest->adjDim;
646dd8e54a2SToby Isaac   PetscFunctionReturn(0);
647dd8e54a2SToby Isaac }
648dd8e54a2SToby Isaac 
649dd8e54a2SToby Isaac #undef __FUNCT__
650dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetAdjacencyCodimension"
6519be51f97SToby Isaac /*@
6529be51f97SToby Isaac   DMForestGetAdjacencyCodimension - Like DMForestGetAdjacencyDimension(), but specified as a co-dimension (so that,
6539be51f97SToby Isaac   e.g., adjacency based on facets can be specified by codimension 1 in all cases)
6549be51f97SToby Isaac 
6559be51f97SToby Isaac   Not collective
6569be51f97SToby Isaac 
6579be51f97SToby Isaac   Input Parameter:
6589be51f97SToby Isaac . dm - the forest
6599be51f97SToby Isaac 
6609be51f97SToby Isaac   Output Parameter:
6619be51f97SToby Isaac . adjCodim - default isthe dimension of the forest (see DMGetDimension()), since this is the codimension of vertices
6629be51f97SToby Isaac 
6639be51f97SToby Isaac   Level: intermediate
6649be51f97SToby Isaac 
6659be51f97SToby Isaac .seealso: DMForestSetAdjacencyCodimension(), DMForestGetAdjacencyDimension()
6669be51f97SToby Isaac @*/
667dd8e54a2SToby Isaac PetscErrorCode DMForestGetAdjacencyCodimension(DM dm, PetscInt *adjCodim)
668dd8e54a2SToby Isaac {
669dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest*) dm->data;
670dd8e54a2SToby Isaac   PetscInt       dim;
671dd8e54a2SToby Isaac   PetscErrorCode ierr;
672dd8e54a2SToby Isaac 
673dd8e54a2SToby Isaac   PetscFunctionBegin;
674dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
675dd8e54a2SToby Isaac   PetscValidIntPointer(adjCodim,2);
676dd8e54a2SToby Isaac   ierr      = DMGetDimension(dm,&dim);CHKERRQ(ierr);
677dd8e54a2SToby Isaac   *adjCodim = dim - forest->adjDim;
678dd8e54a2SToby Isaac   PetscFunctionReturn(0);
679dd8e54a2SToby Isaac }
680dd8e54a2SToby Isaac 
681dd8e54a2SToby Isaac #undef __FUNCT__
682ef51cf95SToby Isaac #define __FUNCT__ "DMForestSetPartitionOverlap"
6839be51f97SToby Isaac /*@
6849be51f97SToby Isaac   DMForestSetPartitionOverlap - During the pre-setup phase, set the amount of cell-overlap present in parallel
6859be51f97SToby Isaac   partitions of a forest, with values > 0 indicating subdomains that are expanded by that many iterations of adding
6869be51f97SToby Isaac   adjacent cells
6879be51f97SToby Isaac 
6889be51f97SToby Isaac   Logically collective on dm
6899be51f97SToby Isaac 
6909be51f97SToby Isaac   Input Parameters:
6919be51f97SToby Isaac + dm - the forest
6929be51f97SToby Isaac - overlap - default 0
6939be51f97SToby Isaac 
6949be51f97SToby Isaac   Level: intermediate
6959be51f97SToby Isaac 
6969be51f97SToby Isaac .seealso: DMForestGetPartitionOverlap(), DMForestSetAdjacencyDimension(), DMForestSetAdjacencyCodimension()
6979be51f97SToby Isaac @*/
698dd8e54a2SToby Isaac PetscErrorCode DMForestSetPartitionOverlap(DM dm, PetscInt overlap)
699dd8e54a2SToby Isaac {
700dd8e54a2SToby Isaac   DM_Forest *forest = (DM_Forest*) dm->data;
701dd8e54a2SToby Isaac 
702dd8e54a2SToby Isaac   PetscFunctionBegin;
703dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
704ef51cf95SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the overlap after setup");
705dd8e54a2SToby Isaac   if (overlap < 0) SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_OUTOFRANGE,"overlap cannot be < 0: %d", overlap);
706dd8e54a2SToby Isaac   forest->overlap = overlap;
707dd8e54a2SToby Isaac   PetscFunctionReturn(0);
708dd8e54a2SToby Isaac }
709dd8e54a2SToby Isaac 
710dd8e54a2SToby Isaac #undef __FUNCT__
711dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetPartitionOverlap"
7129be51f97SToby Isaac /*@
7139be51f97SToby Isaac   DMForestGetPartitionOverlap - Get the amount of cell-overlap present in parallel partitions of a forest, with values
7149be51f97SToby Isaac   > 0 indicating subdomains that are expanded by that many iterations of adding adjacent cells
7159be51f97SToby Isaac 
7169be51f97SToby Isaac   Not collective
7179be51f97SToby Isaac 
7189be51f97SToby Isaac   Input Parameter:
7199be51f97SToby Isaac . dm - the forest
7209be51f97SToby Isaac 
7219be51f97SToby Isaac   Output Parameter:
7229be51f97SToby Isaac . overlap - default 0
7239be51f97SToby Isaac 
7249be51f97SToby Isaac   Level: intermediate
7259be51f97SToby Isaac 
7269be51f97SToby Isaac .seealso: DMForestGetPartitionOverlap(), DMForestSetAdjacencyDimension(), DMForestSetAdjacencyCodimension()
7279be51f97SToby Isaac @*/
728dd8e54a2SToby Isaac PetscErrorCode DMForestGetPartitionOverlap(DM dm, PetscInt *overlap)
729dd8e54a2SToby Isaac {
730dd8e54a2SToby Isaac   DM_Forest *forest = (DM_Forest*) dm->data;
731dd8e54a2SToby Isaac 
732dd8e54a2SToby Isaac   PetscFunctionBegin;
733dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
734dd8e54a2SToby Isaac   PetscValidIntPointer(overlap,2);
735dd8e54a2SToby Isaac   *overlap = forest->overlap;
736dd8e54a2SToby Isaac   PetscFunctionReturn(0);
737dd8e54a2SToby Isaac }
738dd8e54a2SToby Isaac 
739dd8e54a2SToby Isaac #undef __FUNCT__
740dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetMinimumRefinement"
7419be51f97SToby Isaac /*@
7429be51f97SToby Isaac   DMForestSetMinimumRefinement - During the pre-setup phase, set the minimum level of refinement (relative to the base
7439be51f97SToby Isaac   DM, see DMForestGetBaseDM()) allowed in the forest.  If the forest is being created by coarsening a previous forest
7449be51f97SToby Isaac   (see DMForestGetAdaptivityForest()) this limits the amount of coarsening.
7459be51f97SToby Isaac 
7469be51f97SToby Isaac   Logically collective on dm
7479be51f97SToby Isaac 
7489be51f97SToby Isaac   Input Parameters:
7499be51f97SToby Isaac + dm - the forest
7509be51f97SToby Isaac - minRefinement - default PETSC_DEFAULT (interpreted by the subtype of DMForest)
7519be51f97SToby Isaac 
7529be51f97SToby Isaac   Level: intermediate
7539be51f97SToby Isaac 
7549be51f97SToby Isaac .seealso: DMForestGetMinimumRefinement(), DMForestSetMaximumRefinement(), DMForestSetInitialRefinement(), DMForestGetBaseDM(), DMForestGetAdaptivityForest()
7559be51f97SToby Isaac @*/
756dd8e54a2SToby Isaac PetscErrorCode DMForestSetMinimumRefinement(DM dm, PetscInt minRefinement)
757dd8e54a2SToby Isaac {
758dd8e54a2SToby Isaac   DM_Forest *forest = (DM_Forest*) dm->data;
759dd8e54a2SToby Isaac 
760dd8e54a2SToby Isaac   PetscFunctionBegin;
761dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
762ef51cf95SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the minimum refinement after setup");
763dd8e54a2SToby Isaac   forest->minRefinement = minRefinement;
764dd8e54a2SToby Isaac   PetscFunctionReturn(0);
765dd8e54a2SToby Isaac }
766dd8e54a2SToby Isaac 
767dd8e54a2SToby Isaac #undef __FUNCT__
768dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetMinimumRefinement"
7699be51f97SToby Isaac /*@
7709be51f97SToby Isaac   DMForestGetMinimumRefinement - Get the minimum level of refinement (relative to the base DM, see
7719be51f97SToby Isaac   DMForestGetBaseDM()) allowed in the forest.  If the forest is being created by coarsening a previous forest (see
7729be51f97SToby Isaac   DMForestGetAdaptivityForest()), this limits the amount of coarsening.
7739be51f97SToby Isaac 
7749be51f97SToby Isaac   Not collective
7759be51f97SToby Isaac 
7769be51f97SToby Isaac   Input Parameter:
7779be51f97SToby Isaac . dm - the forest
7789be51f97SToby Isaac 
7799be51f97SToby Isaac   Output Parameter:
7809be51f97SToby Isaac . minRefinement - default PETSC_DEFAULT (interpreted by the subtype of DMForest)
7819be51f97SToby Isaac 
7829be51f97SToby Isaac   Level: intermediate
7839be51f97SToby Isaac 
7849be51f97SToby Isaac .seealso: DMForestSetMinimumRefinement(), DMForestGetMaximumRefinement(), DMForestGetInitialRefinement(), DMForestGetBaseDM(), DMForestGetAdaptivityForest()
7859be51f97SToby Isaac @*/
786dd8e54a2SToby Isaac PetscErrorCode DMForestGetMinimumRefinement(DM dm, PetscInt *minRefinement)
787dd8e54a2SToby Isaac {
788dd8e54a2SToby Isaac   DM_Forest *forest = (DM_Forest*) dm->data;
789dd8e54a2SToby Isaac 
790dd8e54a2SToby Isaac   PetscFunctionBegin;
791dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
792dd8e54a2SToby Isaac   PetscValidIntPointer(minRefinement,2);
793dd8e54a2SToby Isaac   *minRefinement = forest->minRefinement;
794dd8e54a2SToby Isaac   PetscFunctionReturn(0);
795dd8e54a2SToby Isaac }
796dd8e54a2SToby Isaac 
797dd8e54a2SToby Isaac #undef __FUNCT__
79856ba9f64SToby Isaac #define __FUNCT__ "DMForestSetInitialRefinement"
7999be51f97SToby Isaac /*@
8009be51f97SToby Isaac   DMForestSetInitialRefinement - During the pre-setup phase, set the initial level of refinement (relative to the base
8019be51f97SToby Isaac   DM, see DMForestGetBaseDM()) allowed in the forest.
8029be51f97SToby Isaac 
8039be51f97SToby Isaac   Logically collective on dm
8049be51f97SToby Isaac 
8059be51f97SToby Isaac   Input Parameters:
8069be51f97SToby Isaac + dm - the forest
8079be51f97SToby Isaac - initefinement - default PETSC_DEFAULT (interpreted by the subtype of DMForest)
8089be51f97SToby Isaac 
8099be51f97SToby Isaac   Level: intermediate
8109be51f97SToby Isaac 
8119be51f97SToby Isaac .seealso: DMForestSetMinimumRefinement(), DMForestSetMaximumRefinement(), DMForestGetBaseDM()
8129be51f97SToby Isaac @*/
81356ba9f64SToby Isaac PetscErrorCode DMForestSetInitialRefinement(DM dm, PetscInt initRefinement)
81456ba9f64SToby Isaac {
81556ba9f64SToby Isaac   DM_Forest *forest = (DM_Forest*) dm->data;
81656ba9f64SToby Isaac 
81756ba9f64SToby Isaac   PetscFunctionBegin;
81856ba9f64SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
81956ba9f64SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the initial refinement after setup");
82056ba9f64SToby Isaac   forest->initRefinement = initRefinement;
82156ba9f64SToby Isaac   PetscFunctionReturn(0);
82256ba9f64SToby Isaac }
82356ba9f64SToby Isaac 
82456ba9f64SToby Isaac #undef __FUNCT__
82556ba9f64SToby Isaac #define __FUNCT__ "DMForestGetInitialRefinement"
8269be51f97SToby Isaac /*@
8279be51f97SToby Isaac   DMForestGetInitialRefinement - Get the initial level of refinement (relative to the base DM, see
8289be51f97SToby Isaac   DMForestGetBaseDM()) allowed in the forest.
8299be51f97SToby Isaac 
8309be51f97SToby Isaac   Not collective
8319be51f97SToby Isaac 
8329be51f97SToby Isaac   Input Parameter:
8339be51f97SToby Isaac . dm - the forest
8349be51f97SToby Isaac 
8359be51f97SToby Isaac   Output Paramater:
8369be51f97SToby Isaac . initefinement - default PETSC_DEFAULT (interpreted by the subtype of DMForest)
8379be51f97SToby Isaac 
8389be51f97SToby Isaac   Level: intermediate
8399be51f97SToby Isaac 
8409be51f97SToby Isaac .seealso: DMForestSetMinimumRefinement(), DMForestSetMaximumRefinement(), DMForestGetBaseDM()
8419be51f97SToby Isaac @*/
84256ba9f64SToby Isaac PetscErrorCode DMForestGetInitialRefinement(DM dm, PetscInt *initRefinement)
84356ba9f64SToby Isaac {
84456ba9f64SToby Isaac   DM_Forest *forest = (DM_Forest*) dm->data;
84556ba9f64SToby Isaac 
84656ba9f64SToby Isaac   PetscFunctionBegin;
84756ba9f64SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
84856ba9f64SToby Isaac   PetscValidIntPointer(initRefinement,2);
84956ba9f64SToby Isaac   *initRefinement = forest->initRefinement;
85056ba9f64SToby Isaac   PetscFunctionReturn(0);
85156ba9f64SToby Isaac }
85256ba9f64SToby Isaac 
85356ba9f64SToby Isaac #undef __FUNCT__
854c7eeac06SToby Isaac #define __FUNCT__ "DMForestSetMaximumRefinement"
8559be51f97SToby Isaac /*@
8569be51f97SToby Isaac   DMForestSetMaximumRefinement - During the pre-setup phase, set the maximum level of refinement (relative to the base
8579be51f97SToby Isaac   DM, see DMForestGetBaseDM()) allowed in the forest.  If the forest is being created by refining a previous forest
8589be51f97SToby Isaac   (see DMForestGetAdaptivityForest()), this limits the amount of refinement.
8599be51f97SToby Isaac 
8609be51f97SToby Isaac   Logically collective on dm
8619be51f97SToby Isaac 
8629be51f97SToby Isaac   Input Parameters:
8639be51f97SToby Isaac + dm - the forest
8649be51f97SToby Isaac - maxRefinement - default PETSC_DEFAULT (interpreted by the subtype of DMForest)
8659be51f97SToby Isaac 
8669be51f97SToby Isaac   Level: intermediate
8679be51f97SToby Isaac 
8689be51f97SToby Isaac .seealso: DMForestGetMinimumRefinement(), DMForestSetMaximumRefinement(), DMForestSetInitialRefinement(), DMForestGetBaseDM(), DMForestGetAdaptivityDM()
8699be51f97SToby Isaac @*/
870c7eeac06SToby Isaac PetscErrorCode DMForestSetMaximumRefinement(DM dm, PetscInt maxRefinement)
871dd8e54a2SToby Isaac {
872dd8e54a2SToby Isaac   DM_Forest *forest = (DM_Forest*) dm->data;
873dd8e54a2SToby Isaac 
874dd8e54a2SToby Isaac   PetscFunctionBegin;
875dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
876ef51cf95SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the maximum refinement after setup");
877c7eeac06SToby Isaac   forest->maxRefinement = maxRefinement;
878dd8e54a2SToby Isaac   PetscFunctionReturn(0);
879dd8e54a2SToby Isaac }
880dd8e54a2SToby Isaac 
881dd8e54a2SToby Isaac #undef __FUNCT__
882c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetMaximumRefinement"
8839be51f97SToby Isaac /*@
8849be51f97SToby Isaac   DMForestGetMaximumRefinement - Get the maximum level of refinement (relative to the base DM, see
8859be51f97SToby Isaac   DMForestGetBaseDM()) allowed in the forest.  If the forest is being created by refining a previous forest (see
8869be51f97SToby Isaac   DMForestGetAdaptivityForest()), this limits the amount of refinement.
8879be51f97SToby Isaac 
8889be51f97SToby Isaac   Not collective
8899be51f97SToby Isaac 
8909be51f97SToby Isaac   Input Parameter:
8919be51f97SToby Isaac . dm - the forest
8929be51f97SToby Isaac 
8939be51f97SToby Isaac   Output Parameter:
8949be51f97SToby Isaac . maxRefinement - default PETSC_DEFAULT (interpreted by the subtype of DMForest)
8959be51f97SToby Isaac 
8969be51f97SToby Isaac   Level: intermediate
8979be51f97SToby Isaac 
8989be51f97SToby Isaac .seealso: DMForestSetMaximumRefinement(), DMForestGetMinimumRefinement(), DMForestGetInitialRefinement(), DMForestGetBaseDM(), DMForestGetAdaptivityForest()
8999be51f97SToby Isaac @*/
900c7eeac06SToby Isaac PetscErrorCode DMForestGetMaximumRefinement(DM dm, PetscInt *maxRefinement)
901dd8e54a2SToby Isaac {
902dd8e54a2SToby Isaac   DM_Forest *forest = (DM_Forest*) dm->data;
903dd8e54a2SToby Isaac 
904dd8e54a2SToby Isaac   PetscFunctionBegin;
905dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
906c7eeac06SToby Isaac   PetscValidIntPointer(maxRefinement,2);
907c7eeac06SToby Isaac   *maxRefinement = forest->maxRefinement;
908dd8e54a2SToby Isaac   PetscFunctionReturn(0);
909dd8e54a2SToby Isaac }
910c7eeac06SToby Isaac 
911c7eeac06SToby Isaac #undef __FUNCT__
912c7eeac06SToby Isaac #define __FUNCT__ "DMForestSetAdaptivityStrategy"
9139be51f97SToby Isaac /*@C
9149be51f97SToby Isaac   DMForestSetAdaptivityStrategy - During the pre-setup phase, set the strategy for combining adaptivity labels from multiple processes.
9159be51f97SToby Isaac   Subtypes of DMForest may define their own strategies.  Two default strategies are DMFORESTADAPTALL, which indicates that all processes must agree
9169be51f97SToby Isaac   for a refinement/coarsening flag to be valid, and DMFORESTADAPTANY, which indicates that only one process needs to
9179be51f97SToby Isaac   specify refinement/coarsening.
9189be51f97SToby Isaac 
9199be51f97SToby Isaac   Logically collective on dm
9209be51f97SToby Isaac 
9219be51f97SToby Isaac   Input Parameters:
9229be51f97SToby Isaac + dm - the forest
9239be51f97SToby Isaac - adaptStrategy - default DMFORESTADAPTALL
9249be51f97SToby Isaac 
9259be51f97SToby Isaac   Level: advanced
9269be51f97SToby Isaac 
9279be51f97SToby Isaac .seealso: DMForestGetAdaptivityStrategy()
9289be51f97SToby Isaac @*/
929c7eeac06SToby Isaac PetscErrorCode DMForestSetAdaptivityStrategy(DM dm, DMForestAdaptivityStrategy adaptStrategy)
930c7eeac06SToby Isaac {
931c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest*) dm->data;
932c7eeac06SToby Isaac   PetscErrorCode ierr;
933c7eeac06SToby Isaac 
934c7eeac06SToby Isaac   PetscFunctionBegin;
935c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
936c7eeac06SToby Isaac   ierr = PetscFree(forest->adaptStrategy);CHKERRQ(ierr);
937a73e2921SToby Isaac   ierr = PetscStrallocpy((const char*) adaptStrategy,(char**)&forest->adaptStrategy);CHKERRQ(ierr);
938c7eeac06SToby Isaac   PetscFunctionReturn(0);
939c7eeac06SToby Isaac }
940c7eeac06SToby Isaac 
941c7eeac06SToby Isaac #undef __FUNCT__
942c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetAdaptivityStrategy"
9439be51f97SToby Isaac /*@C
9449be51f97SToby Isaac   DMForestSetAdaptivityStrategy - Get the strategy for combining adaptivity labels from multiple processes.  Subtypes
9459be51f97SToby Isaac   of DMForest may define their own strategies.  Two default strategies are DMFORESTADAPTALL, which indicates that all
9469be51f97SToby Isaac   processes must agree for a refinement/coarsening flag to be valid, and DMFORESTADAPTANY, which indicates that only
9479be51f97SToby Isaac   one process needs to specify refinement/coarsening.
9489be51f97SToby Isaac 
9499be51f97SToby Isaac   Not collective
9509be51f97SToby Isaac 
9519be51f97SToby Isaac   Input Parameter:
9529be51f97SToby Isaac . dm - the forest
9539be51f97SToby Isaac 
9549be51f97SToby Isaac   Output Parameter:
9559be51f97SToby Isaac . adaptStrategy - the adaptivity strategy (default DMFORESTADAPTALL)
9569be51f97SToby Isaac 
9579be51f97SToby Isaac   Level: advanced
9589be51f97SToby Isaac 
9599be51f97SToby Isaac .seealso: DMForestSetAdaptivityStrategy()
9609be51f97SToby Isaac @*/
961c7eeac06SToby Isaac PetscErrorCode DMForestGetAdaptivityStrategy(DM dm, DMForestAdaptivityStrategy *adaptStrategy)
962c7eeac06SToby Isaac {
963c7eeac06SToby Isaac   DM_Forest *forest = (DM_Forest*) dm->data;
964c7eeac06SToby Isaac 
965c7eeac06SToby Isaac   PetscFunctionBegin;
966c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
967c7eeac06SToby Isaac   PetscValidPointer(adaptStrategy,2);
968c7eeac06SToby Isaac   *adaptStrategy = forest->adaptStrategy;
969c7eeac06SToby Isaac   PetscFunctionReturn(0);
970c7eeac06SToby Isaac }
971c7eeac06SToby Isaac 
972c7eeac06SToby Isaac #undef __FUNCT__
973*2a133e43SToby Isaac #define __FUNCT__ "DMForestGetAdaptivitySuccess"
974*2a133e43SToby Isaac /*@
975*2a133e43SToby Isaac   DMForestGetAdaptivitySuccess - Return whether the requested adaptation (refinement, coarsening, repartitioning,
976*2a133e43SToby Isaac   etc.) was successful.  PETSC_FALSE indicates that the post-adaptation forest is the same as the pre-adpatation
977*2a133e43SToby Isaac   forest.  A requested adaptation may have been unsuccessful if, for example, the requested refinement would have
978*2a133e43SToby Isaac   exceeded the maximum refinement level.
979*2a133e43SToby Isaac 
980*2a133e43SToby Isaac   Collective on dm
981*2a133e43SToby Isaac 
982*2a133e43SToby Isaac   Input Parameter:
983*2a133e43SToby Isaac 
984*2a133e43SToby Isaac . dm - the post-adaptation forest
985*2a133e43SToby Isaac 
986*2a133e43SToby Isaac   Output Parameter:
987*2a133e43SToby Isaac 
988*2a133e43SToby Isaac . success - PETSC_TRUE if the post-adaptation forest is different from the pre-adaptation forest.
989*2a133e43SToby Isaac 
990*2a133e43SToby Isaac   Level: intermediate
991*2a133e43SToby Isaac 
992*2a133e43SToby Isaac .see
993*2a133e43SToby Isaac @*/
994*2a133e43SToby Isaac PetscErrorCode DMForestGetAdaptivitySuccess(DM dm, PetscBool *success)
995*2a133e43SToby Isaac {
996*2a133e43SToby Isaac   DM_Forest      *forest;
997*2a133e43SToby Isaac   PetscErrorCode ierr;
998*2a133e43SToby Isaac 
999*2a133e43SToby Isaac   PetscFunctionBegin;
1000*2a133e43SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1001*2a133e43SToby Isaac   if (!dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"DMSetUp() has not been called yet.");
1002*2a133e43SToby Isaac   forest = (DM_Forest *) dm->data;
1003*2a133e43SToby Isaac   ierr = (forest->getadaptivitysuccess)(dm,success);CHKERRQ(ierr);
1004*2a133e43SToby Isaac   PetscFunctionReturn(0);
1005*2a133e43SToby Isaac }
1006*2a133e43SToby Isaac 
1007*2a133e43SToby Isaac #undef __FUNCT__
1008bf9b5d84SToby Isaac #define __FUNCT__ "DMForestSetComputeAdaptivitySF"
1009bf9b5d84SToby Isaac /*@
1010bf9b5d84SToby Isaac   DMForestSetComputeAdaptivitySF - During the pre-setup phase, set whether transfer PetscSFs should be computed
1011bf9b5d84SToby Isaac   relating the cells of the pre-adaptation forest to the post-adaptiation forest.  After DMSetUp() is called, these transfer PetscSFs can be accessed with DMForestGetAdaptivitySF().
1012bf9b5d84SToby Isaac 
1013bf9b5d84SToby Isaac   Logically collective on dm
1014bf9b5d84SToby Isaac 
1015bf9b5d84SToby Isaac   Input Parameters:
1016bf9b5d84SToby Isaac + dm - the post-adaptation forest
1017bf9b5d84SToby Isaac - computeSF - default PETSC_TRUE
1018bf9b5d84SToby Isaac 
1019bf9b5d84SToby Isaac   Level: advanced
1020bf9b5d84SToby Isaac 
1021bf9b5d84SToby Isaac .seealso: DMForestGetComputeAdaptivitySF(), DMForestGetAdaptivitySF()
1022bf9b5d84SToby Isaac @*/
1023bf9b5d84SToby Isaac PetscErrorCode DMForestSetComputeAdaptivitySF(DM dm, PetscBool computeSF)
1024bf9b5d84SToby Isaac {
1025bf9b5d84SToby Isaac   DM_Forest *forest;
1026bf9b5d84SToby Isaac 
1027bf9b5d84SToby Isaac   PetscFunctionBegin;
1028bf9b5d84SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1029bf9b5d84SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot compute adaptivity PetscSFs after setup is called");
1030bf9b5d84SToby Isaac   forest                 = (DM_Forest*) dm->data;
1031bf9b5d84SToby Isaac   forest->computeAdaptSF = computeSF;
1032bf9b5d84SToby Isaac   PetscFunctionReturn(0);
1033bf9b5d84SToby Isaac }
1034bf9b5d84SToby Isaac 
1035bf9b5d84SToby Isaac #undef __FUNCT__
103680b27e07SToby Isaac #define __FUNCT__ "DMForestTransferVec"
10370eb7e1eaSToby Isaac PetscErrorCode DMForestTransferVec(DM dmIn, Vec vecIn, DM dmOut, Vec vecOut, PetscBool useBCs, PetscReal time)
103880b27e07SToby Isaac {
103980b27e07SToby Isaac   DM_Forest      *forest;
104080b27e07SToby Isaac   PetscErrorCode ierr;
104180b27e07SToby Isaac 
104280b27e07SToby Isaac   PetscFunctionBegin;
104380b27e07SToby Isaac   PetscValidHeaderSpecific(dmIn   ,DM_CLASSID  ,1);
104480b27e07SToby Isaac   PetscValidHeaderSpecific(vecIn  ,VEC_CLASSID ,2);
104580b27e07SToby Isaac   PetscValidHeaderSpecific(dmOut  ,DM_CLASSID  ,3);
104680b27e07SToby Isaac   PetscValidHeaderSpecific(vecOut ,VEC_CLASSID ,4);
104780b27e07SToby Isaac   forest = (DM_Forest *) dmIn->data;
104880b27e07SToby Isaac   if (!forest->transfervec) SETERRQ(PetscObjectComm((PetscObject)dmIn),PETSC_ERR_SUP,"DMForestTransferVec() not implemented");
10490eb7e1eaSToby Isaac   ierr = (forest->transfervec)(dmIn,vecIn,dmOut,vecOut,useBCs,time);CHKERRQ(ierr);
105080b27e07SToby Isaac   PetscFunctionReturn(0);
105180b27e07SToby Isaac }
105280b27e07SToby Isaac 
105380b27e07SToby Isaac #undef __FUNCT__
1054bf9b5d84SToby Isaac #define __FUNCT__ "DMForestGetComputeAdaptivitySF"
1055bf9b5d84SToby Isaac /*@
1056bf9b5d84SToby Isaac   DMForestGetComputeAdaptivitySF - Get whether transfer PetscSFs should be computed relating the cells of the
1057bf9b5d84SToby Isaac   pre-adaptation forest to the post-adaptiation forest.  After DMSetUp() is called, these transfer PetscSFs can be
1058bf9b5d84SToby Isaac   accessed with DMForestGetAdaptivitySF().
1059bf9b5d84SToby Isaac 
1060bf9b5d84SToby Isaac   Not collective
1061bf9b5d84SToby Isaac 
1062bf9b5d84SToby Isaac   Input Parameter:
1063bf9b5d84SToby Isaac . dm - the post-adaptation forest
1064bf9b5d84SToby Isaac 
1065bf9b5d84SToby Isaac   Output Parameter:
1066bf9b5d84SToby Isaac . computeSF - default PETSC_TRUE
1067bf9b5d84SToby Isaac 
1068bf9b5d84SToby Isaac   Level: advanced
1069bf9b5d84SToby Isaac 
1070bf9b5d84SToby Isaac .seealso: DMForestSetComputeAdaptivitySF(), DMForestGetAdaptivitySF()
1071bf9b5d84SToby Isaac @*/
1072bf9b5d84SToby Isaac PetscErrorCode DMForestGetComputeAdaptivitySF(DM dm, PetscBool *computeSF)
1073bf9b5d84SToby Isaac {
1074bf9b5d84SToby Isaac   DM_Forest *forest;
1075bf9b5d84SToby Isaac 
1076bf9b5d84SToby Isaac   PetscFunctionBegin;
1077bf9b5d84SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1078bf9b5d84SToby Isaac   forest     = (DM_Forest*) dm->data;
1079bf9b5d84SToby Isaac   *computeSF = forest->computeAdaptSF;
1080bf9b5d84SToby Isaac   PetscFunctionReturn(0);
1081bf9b5d84SToby Isaac }
1082bf9b5d84SToby Isaac 
1083bf9b5d84SToby Isaac #undef __FUNCT__
1084bf9b5d84SToby Isaac #define __FUNCT__ "DMForestGetAdaptivitySF"
1085bf9b5d84SToby Isaac /*@
1086bf9b5d84SToby Isaac   DMForestGetAdaptivitySF - Get PetscSFs that relate the pre-adaptation forest to the post-adaptation forest.
1087bf9b5d84SToby Isaac   Adaptation can be any combination of refinement, coarsening, repartition, and change of overlap, so there may be
1088bf9b5d84SToby Isaac   some cells of the pre-adaptation that are parents of post-adaptation cells, and vice versa.  Therefore there are two
1089bf9b5d84SToby Isaac   PetscSFs: one that relates pre-adaptation coarse cells to post-adaptation fine cells, and one that relates
1090bf9b5d84SToby Isaac   pre-adaptation fine cells to post-adaptation coarse cells.
1091bf9b5d84SToby Isaac 
1092bf9b5d84SToby Isaac   Not collective
1093bf9b5d84SToby Isaac 
1094bf9b5d84SToby Isaac   Input Parameter:
1095bf9b5d84SToby Isaac   dm - the post-adaptation forest
1096bf9b5d84SToby Isaac 
1097bf9b5d84SToby Isaac   Output Parameter:
10980f17b9e3SToby Isaac   preCoarseToFine - pre-adaptation coarse cells to post-adaptation fine cells: BCast goes from pre- to post-
10990f17b9e3SToby Isaac   coarseToPreFine - post-adaptation coarse cells to pre-adaptation fine cells: BCast goes from post- to pre-
1100bf9b5d84SToby Isaac 
1101bf9b5d84SToby Isaac   Level: advanced
1102bf9b5d84SToby Isaac 
1103bf9b5d84SToby Isaac .seealso: DMForestGetComputeAdaptivitySF(), DMForestSetComputeAdaptivitySF()
1104bf9b5d84SToby Isaac @*/
11050f17b9e3SToby Isaac PetscErrorCode DMForestGetAdaptivitySF(DM dm, PetscSF *preCoarseToFine, PetscSF *coarseToPreFine)
1106bf9b5d84SToby Isaac {
1107bf9b5d84SToby Isaac   DM_Forest      *forest;
1108bf9b5d84SToby Isaac   PetscErrorCode ierr;
1109bf9b5d84SToby Isaac 
1110bf9b5d84SToby Isaac   PetscFunctionBegin;
1111bf9b5d84SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1112bf9b5d84SToby Isaac   ierr   = DMSetUp(dm);CHKERRQ(ierr);
1113bf9b5d84SToby Isaac   forest = (DM_Forest*) dm->data;
1114f885a11aSToby Isaac   if (preCoarseToFine) *preCoarseToFine = forest->preCoarseToFine;
1115f885a11aSToby Isaac   if (coarseToPreFine) *coarseToPreFine = forest->coarseToPreFine;
1116bf9b5d84SToby Isaac   PetscFunctionReturn(0);
1117bf9b5d84SToby Isaac }
1118bf9b5d84SToby Isaac 
1119bf9b5d84SToby Isaac #undef __FUNCT__
1120c7eeac06SToby Isaac #define __FUNCT__ "DMForestSetGradeFactor"
11219be51f97SToby Isaac /*@
11229be51f97SToby Isaac   DMForestSetGradeFactor - During the pre-setup phase, set the desired amount of grading in the mesh, e.g. give 2 to
11239be51f97SToby Isaac   indicate that the diameter of neighboring cells should differ by at most a factor of 2.  Subtypes of DMForest may
11249be51f97SToby Isaac   only support one particular choice of grading factor.
11259be51f97SToby Isaac 
11269be51f97SToby Isaac   Logically collective on dm
11279be51f97SToby Isaac 
11289be51f97SToby Isaac   Input Parameters:
11299be51f97SToby Isaac + dm - the forest
11309be51f97SToby Isaac - grade - the grading factor
11319be51f97SToby Isaac 
11329be51f97SToby Isaac   Level: advanced
11339be51f97SToby Isaac 
11349be51f97SToby Isaac .seealso: DMForestGetGradeFactor()
11359be51f97SToby Isaac @*/
1136c7eeac06SToby Isaac PetscErrorCode DMForestSetGradeFactor(DM dm, PetscInt grade)
1137c7eeac06SToby Isaac {
1138c7eeac06SToby Isaac   DM_Forest *forest = (DM_Forest*) dm->data;
1139c7eeac06SToby Isaac 
1140c7eeac06SToby Isaac   PetscFunctionBegin;
1141c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1142ef51cf95SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the grade factor after setup");
1143c7eeac06SToby Isaac   forest->gradeFactor = grade;
1144c7eeac06SToby Isaac   PetscFunctionReturn(0);
1145c7eeac06SToby Isaac }
1146c7eeac06SToby Isaac 
1147c7eeac06SToby Isaac #undef __FUNCT__
1148c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetGradeFactor"
11499be51f97SToby Isaac /*@
11509be51f97SToby Isaac   DMForestGetGradeFactor - Get the desired amount of grading in the mesh, e.g. give 2 to indicate that the diameter of
11519be51f97SToby Isaac   neighboring cells should differ by at most a factor of 2.  Subtypes of DMForest may only support one particular
11529be51f97SToby Isaac   choice of grading factor.
11539be51f97SToby Isaac 
11549be51f97SToby Isaac   Not collective
11559be51f97SToby Isaac 
11569be51f97SToby Isaac   Input Parameter:
11579be51f97SToby Isaac . dm - the forest
11589be51f97SToby Isaac 
11599be51f97SToby Isaac   Output Parameter:
11609be51f97SToby Isaac . grade - the grading factor
11619be51f97SToby Isaac 
11629be51f97SToby Isaac   Level: advanced
11639be51f97SToby Isaac 
11649be51f97SToby Isaac .seealso: DMForestSetGradeFactor()
11659be51f97SToby Isaac @*/
1166c7eeac06SToby Isaac PetscErrorCode DMForestGetGradeFactor(DM dm, PetscInt *grade)
1167c7eeac06SToby Isaac {
1168c7eeac06SToby Isaac   DM_Forest *forest = (DM_Forest*) dm->data;
1169c7eeac06SToby Isaac 
1170c7eeac06SToby Isaac   PetscFunctionBegin;
1171c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1172c7eeac06SToby Isaac   PetscValidIntPointer(grade,2);
1173c7eeac06SToby Isaac   *grade = forest->gradeFactor;
1174c7eeac06SToby Isaac   PetscFunctionReturn(0);
1175c7eeac06SToby Isaac }
1176c7eeac06SToby Isaac 
1177c7eeac06SToby Isaac #undef __FUNCT__
1178ef51cf95SToby Isaac #define __FUNCT__ "DMForestSetCellWeightFactor"
11799be51f97SToby Isaac /*@
11809be51f97SToby Isaac   DMForestSetCellWeightFactor - During the pre-setup phase, set the factor by which the level of refinement changes
11819be51f97SToby Isaac   the cell weight (see DMForestSetCellWeights()) when calculating partitions.  The final weight of a cell will be
11829be51f97SToby Isaac   (cellWeight) * (weightFactor^refinementLevel).  A factor of 1 indicates that the weight of a cell does not depend on
11839be51f97SToby Isaac   its level; a factor of 2, for example, might be appropriate for sub-cycling time-stepping methods, when the
11849be51f97SToby Isaac   computation associated with a cell is multiplied by a factor of 2 for each additional level of refinement.
11859be51f97SToby Isaac 
11869be51f97SToby Isaac   Logically collective on dm
11879be51f97SToby Isaac 
11889be51f97SToby Isaac   Input Parameters:
11899be51f97SToby Isaac + dm - the forest
11909be51f97SToby Isaac - weightsFactors - default 1.
11919be51f97SToby Isaac 
11929be51f97SToby Isaac   Level: advanced
11939be51f97SToby Isaac 
11949be51f97SToby Isaac .seealso: DMForestGetCellWeightFactor(), DMForestSetCellWeights()
11959be51f97SToby Isaac @*/
1196ef51cf95SToby Isaac PetscErrorCode DMForestSetCellWeightFactor(DM dm, PetscReal weightsFactor)
1197c7eeac06SToby Isaac {
1198c7eeac06SToby Isaac   DM_Forest *forest = (DM_Forest*) dm->data;
1199c7eeac06SToby Isaac 
1200c7eeac06SToby Isaac   PetscFunctionBegin;
1201c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1202ef51cf95SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the weights factor after setup");
1203c7eeac06SToby Isaac   forest->weightsFactor = weightsFactor;
1204c7eeac06SToby Isaac   PetscFunctionReturn(0);
1205c7eeac06SToby Isaac }
1206c7eeac06SToby Isaac 
1207c7eeac06SToby Isaac #undef __FUNCT__
1208ef51cf95SToby Isaac #define __FUNCT__ "DMForestGetCellWeightFactor"
12099be51f97SToby Isaac /*@
12109be51f97SToby Isaac   DMForestGetCellWeightFactor - Get the factor by which the level of refinement changes the cell weight (see
12119be51f97SToby Isaac   DMForestSetCellWeights()) when calculating partitions.  The final weight of a cell will be (cellWeight) *
12129be51f97SToby Isaac   (weightFactor^refinementLevel).  A factor of 1 indicates that the weight of a cell does not depend on its level; a
12139be51f97SToby Isaac   factor of 2, for example, might be appropriate for sub-cycling time-stepping methods, when the computation
12149be51f97SToby Isaac   associated with a cell is multiplied by a factor of 2 for each additional level of refinement.
12159be51f97SToby Isaac 
12169be51f97SToby Isaac   Not collective
12179be51f97SToby Isaac 
12189be51f97SToby Isaac   Input Parameter:
12199be51f97SToby Isaac . dm - the forest
12209be51f97SToby Isaac 
12219be51f97SToby Isaac   Output Parameter:
12229be51f97SToby Isaac . weightsFactors - default 1.
12239be51f97SToby Isaac 
12249be51f97SToby Isaac   Level: advanced
12259be51f97SToby Isaac 
12269be51f97SToby Isaac .seealso: DMForestSetCellWeightFactor(), DMForestSetCellWeights()
12279be51f97SToby Isaac @*/
1228ef51cf95SToby Isaac PetscErrorCode DMForestGetCellWeightFactor(DM dm, PetscReal *weightsFactor)
1229c7eeac06SToby Isaac {
1230c7eeac06SToby Isaac   DM_Forest *forest = (DM_Forest*) dm->data;
1231c7eeac06SToby Isaac 
1232c7eeac06SToby Isaac   PetscFunctionBegin;
1233c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1234c7eeac06SToby Isaac   PetscValidRealPointer(weightsFactor,2);
1235c7eeac06SToby Isaac   *weightsFactor = forest->weightsFactor;
1236c7eeac06SToby Isaac   PetscFunctionReturn(0);
1237c7eeac06SToby Isaac }
1238c7eeac06SToby Isaac 
1239c7eeac06SToby Isaac #undef __FUNCT__
1240c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetCellChart"
12419be51f97SToby Isaac /*@
12429be51f97SToby Isaac   DMForestGetCellChart - After the setup phase, get the local half-open interval of the chart of cells on this process
12439be51f97SToby Isaac 
12449be51f97SToby Isaac   Not collective
12459be51f97SToby Isaac 
12469be51f97SToby Isaac   Input Parameter:
12479be51f97SToby Isaac . dm - the forest
12489be51f97SToby Isaac 
12499be51f97SToby Isaac   Output Parameters:
12509be51f97SToby Isaac + cStart - the first cell on this process
12519be51f97SToby Isaac - cEnd - one after the final cell on this process
12529be51f97SToby Isaac 
12531a244344SSatish Balay   Level: intermediate
12549be51f97SToby Isaac 
12559be51f97SToby Isaac .seealso: DMForestGetCellSF()
12569be51f97SToby Isaac @*/
1257c7eeac06SToby Isaac PetscErrorCode DMForestGetCellChart(DM dm, PetscInt *cStart, PetscInt *cEnd)
1258c7eeac06SToby Isaac {
1259c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest*) dm->data;
1260c7eeac06SToby Isaac   PetscErrorCode ierr;
1261c7eeac06SToby Isaac 
1262c7eeac06SToby Isaac   PetscFunctionBegin;
1263c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1264c7eeac06SToby Isaac   PetscValidIntPointer(cStart,2);
1265c7eeac06SToby Isaac   PetscValidIntPointer(cEnd,2);
1266c7eeac06SToby Isaac   if (((forest->cStart == PETSC_DETERMINE) || (forest->cEnd == PETSC_DETERMINE)) && forest->createcellchart) {
1267c7eeac06SToby Isaac     ierr = forest->createcellchart(dm,&forest->cStart,&forest->cEnd);CHKERRQ(ierr);
1268c7eeac06SToby Isaac   }
1269c7eeac06SToby Isaac   *cStart =  forest->cStart;
1270c7eeac06SToby Isaac   *cEnd   =  forest->cEnd;
1271c7eeac06SToby Isaac   PetscFunctionReturn(0);
1272c7eeac06SToby Isaac }
1273c7eeac06SToby Isaac 
1274c7eeac06SToby Isaac #undef __FUNCT__
1275c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetCellSF"
12769be51f97SToby Isaac /*@
12779be51f97SToby Isaac   DMForestGetCellSF - After the setup phase, get the PetscSF for overlapping cells between processes
12789be51f97SToby Isaac 
12799be51f97SToby Isaac   Not collective
12809be51f97SToby Isaac 
12819be51f97SToby Isaac   Input Parameter:
12829be51f97SToby Isaac . dm - the forest
12839be51f97SToby Isaac 
12849be51f97SToby Isaac   Output Parameter:
12859be51f97SToby Isaac . cellSF - the PetscSF
12869be51f97SToby Isaac 
12871a244344SSatish Balay   Level: intermediate
12889be51f97SToby Isaac 
12899be51f97SToby Isaac .seealso: DMForestGetCellChart()
12909be51f97SToby Isaac @*/
1291c7eeac06SToby Isaac PetscErrorCode DMForestGetCellSF(DM dm, PetscSF *cellSF)
1292c7eeac06SToby Isaac {
1293c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest*) dm->data;
1294c7eeac06SToby Isaac   PetscErrorCode ierr;
1295c7eeac06SToby Isaac 
1296c7eeac06SToby Isaac   PetscFunctionBegin;
1297c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1298c7eeac06SToby Isaac   PetscValidPointer(cellSF,2);
1299c7eeac06SToby Isaac   if ((!forest->cellSF) && forest->createcellsf) {
1300c7eeac06SToby Isaac     ierr = forest->createcellsf(dm,&forest->cellSF);CHKERRQ(ierr);
1301c7eeac06SToby Isaac   }
1302c7eeac06SToby Isaac   *cellSF = forest->cellSF;
1303c7eeac06SToby Isaac   PetscFunctionReturn(0);
1304c7eeac06SToby Isaac }
1305c7eeac06SToby Isaac 
1306c7eeac06SToby Isaac #undef __FUNCT__
1307ebdf65a2SToby Isaac #define __FUNCT__ "DMForestSetAdaptivityLabel"
13089be51f97SToby Isaac /*@C
13099be51f97SToby Isaac   DMForestSetAdaptivityLabel - During the pre-setup phase, set the label of the pre-adaptation forest (see
13109be51f97SToby Isaac   DMForestGetAdaptivityForest()) that holds the adaptation flags (refinement, coarsening, or some combination).  The
13119be51f97SToby Isaac   interpretation of the label values is up to the subtype of DMForest, but DM_FOREST_KEEP, DM_FOREST_REFINE, and
13129be51f97SToby Isaac   DM_FOREST_COARSEN have been reserved as choices that should be accepted by all subtypes.
13139be51f97SToby Isaac 
13149be51f97SToby Isaac   Logically collective on dm
13159be51f97SToby Isaac 
13169be51f97SToby Isaac   Input Parameters:
13179be51f97SToby Isaac - dm - the forest
13189be51f97SToby Isaac + adaptLabel - the name of the label in the pre-adaptation forest
13199be51f97SToby Isaac 
13209be51f97SToby Isaac   Level: intermediate
13219be51f97SToby Isaac 
13229be51f97SToby Isaac .seealso DMForestGetAdaptivityLabel()
13239be51f97SToby Isaac @*/
1324ebdf65a2SToby Isaac PetscErrorCode DMForestSetAdaptivityLabel(DM dm, const char * adaptLabel)
1325c7eeac06SToby Isaac {
1326c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest*) dm->data;
1327c7eeac06SToby Isaac   PetscErrorCode ierr;
1328c7eeac06SToby Isaac 
1329c7eeac06SToby Isaac   PetscFunctionBegin;
1330c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1331ebdf65a2SToby Isaac   ierr = PetscFree(forest->adaptLabel);CHKERRQ(ierr);
1332ebdf65a2SToby Isaac   ierr = PetscStrallocpy(adaptLabel,&forest->adaptLabel);CHKERRQ(ierr);
1333c7eeac06SToby Isaac   PetscFunctionReturn(0);
1334c7eeac06SToby Isaac }
1335c7eeac06SToby Isaac 
1336c7eeac06SToby Isaac #undef __FUNCT__
1337ebdf65a2SToby Isaac #define __FUNCT__ "DMForestGetAdaptivityLabel"
13389be51f97SToby Isaac /*@C
13399be51f97SToby Isaac   DMForestGetAdaptivityLabel - Get the label of the pre-adaptation forest (see DMForestGetAdaptivityForest()) that
13409be51f97SToby Isaac   holds the adaptation flags (refinement, coarsening, or some combination).  The interpretation of the label values is
13419be51f97SToby Isaac   up to the subtype of DMForest, but DM_FOREST_KEEP, DM_FOREST_REFINE, and DM_FOREST_COARSEN have been reserved as
13429be51f97SToby Isaac   choices that should be accepted by all subtypes.
13439be51f97SToby Isaac 
13449be51f97SToby Isaac   Not collective
13459be51f97SToby Isaac 
13469be51f97SToby Isaac   Input Parameter:
13479be51f97SToby Isaac . dm - the forest
13489be51f97SToby Isaac 
13499be51f97SToby Isaac   Output Parameter:
13509be51f97SToby Isaac . adaptLabel - the name of the label in the pre-adaptation forest
13519be51f97SToby Isaac 
13529be51f97SToby Isaac   Level: intermediate
13539be51f97SToby Isaac 
13549be51f97SToby Isaac .seealso DMForestSetAdaptivityLabel()
13559be51f97SToby Isaac @*/
1356ba936b91SToby Isaac PetscErrorCode DMForestGetAdaptivityLabel(DM dm, const char ** adaptLabel)
1357c7eeac06SToby Isaac {
1358c7eeac06SToby Isaac   DM_Forest *forest = (DM_Forest*) dm->data;
1359c7eeac06SToby Isaac 
1360c7eeac06SToby Isaac   PetscFunctionBegin;
1361c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1362ba936b91SToby Isaac   *adaptLabel = forest->adaptLabel;
1363c7eeac06SToby Isaac   PetscFunctionReturn(0);
1364c7eeac06SToby Isaac }
1365c7eeac06SToby Isaac 
1366c7eeac06SToby Isaac #undef __FUNCT__
1367c7eeac06SToby Isaac #define __FUNCT__ "DMForestSetCellWeights"
13689be51f97SToby Isaac /*@
13699be51f97SToby Isaac   DMForestSetCellWeights - Set the weights assigned to each of the cells (see DMForestGetCellChart()) of the current
13709be51f97SToby Isaac   process: weights are used to determine parallel partitioning.  Partitions will be created so that each process's
13719be51f97SToby Isaac   ratio of weight to capacity (see DMForestSetWeightCapacity()) is roughly equal. If NULL, each cell receives a weight
13729be51f97SToby Isaac   of 1.
13739be51f97SToby Isaac 
13749be51f97SToby Isaac   Logically collective on dm
13759be51f97SToby Isaac 
13769be51f97SToby Isaac   Input Parameters:
13779be51f97SToby Isaac + dm - the forest
13789be51f97SToby Isaac . weights - the array of weights for all cells, or NULL to indicate each cell has weight 1.
13799be51f97SToby Isaac - copyMode - how weights should reference weights
13809be51f97SToby Isaac 
13819be51f97SToby Isaac   Level: advanced
13829be51f97SToby Isaac 
13839be51f97SToby Isaac .seealso: DMForestGetCellWeights(), DMForestSetWeightCapacity()
13849be51f97SToby Isaac @*/
1385c7eeac06SToby Isaac PetscErrorCode DMForestSetCellWeights(DM dm, PetscReal weights[], PetscCopyMode copyMode)
1386c7eeac06SToby Isaac {
1387c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest*) dm->data;
1388c7eeac06SToby Isaac   PetscInt       cStart, cEnd;
1389c7eeac06SToby Isaac   PetscErrorCode ierr;
1390c7eeac06SToby Isaac 
1391c7eeac06SToby Isaac   PetscFunctionBegin;
1392c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1393c7eeac06SToby Isaac   ierr = DMForestGetCellChart(dm,&cStart,&cEnd);CHKERRQ(ierr);
1394c7eeac06SToby Isaac   if (cEnd < cStart) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"cell chart [%d,%d) is not valid",cStart,cEnd);
1395c7eeac06SToby Isaac   if (copyMode == PETSC_COPY_VALUES) {
1396c7eeac06SToby Isaac     if (forest->cellWeightsCopyMode != PETSC_OWN_POINTER || forest->cellWeights == weights) {
1397c7eeac06SToby Isaac       ierr = PetscMalloc1(cEnd-cStart,&forest->cellWeights);CHKERRQ(ierr);
1398c7eeac06SToby Isaac     }
1399c7eeac06SToby Isaac     ierr                        = PetscMemcpy(forest->cellWeights,weights,(cEnd-cStart)*sizeof(*weights));CHKERRQ(ierr);
1400c7eeac06SToby Isaac     forest->cellWeightsCopyMode = PETSC_OWN_POINTER;
1401c7eeac06SToby Isaac     PetscFunctionReturn(0);
1402c7eeac06SToby Isaac   }
1403c7eeac06SToby Isaac   if (forest->cellWeightsCopyMode == PETSC_OWN_POINTER) {
1404c7eeac06SToby Isaac     ierr = PetscFree(forest->cellWeights);CHKERRQ(ierr);
1405c7eeac06SToby Isaac   }
1406c7eeac06SToby Isaac   forest->cellWeights         = weights;
1407c7eeac06SToby Isaac   forest->cellWeightsCopyMode = copyMode;
1408c7eeac06SToby Isaac   PetscFunctionReturn(0);
1409c7eeac06SToby Isaac }
1410c7eeac06SToby Isaac 
1411c7eeac06SToby Isaac #undef __FUNCT__
1412c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetCellWeights"
14139be51f97SToby Isaac /*@
14149be51f97SToby Isaac   DMForestGetCellWeights - Get the weights assigned to each of the cells (see DMForestGetCellChart()) of the current
14159be51f97SToby Isaac   process: weights are used to determine parallel partitioning.  Partitions will be created so that each process's
14169be51f97SToby Isaac   ratio of weight to capacity (see DMForestSetWeightCapacity()) is roughly equal. If NULL, each cell receives a weight
14179be51f97SToby Isaac   of 1.
14189be51f97SToby Isaac 
14199be51f97SToby Isaac   Not collective
14209be51f97SToby Isaac 
14219be51f97SToby Isaac   Input Parameter:
14229be51f97SToby Isaac . dm - the forest
14239be51f97SToby Isaac 
14249be51f97SToby Isaac   Output Parameter:
14259be51f97SToby Isaac . weights - the array of weights for all cells, or NULL to indicate each cell has weight 1.
14269be51f97SToby Isaac 
14279be51f97SToby Isaac   Level: advanced
14289be51f97SToby Isaac 
14299be51f97SToby Isaac .seealso: DMForestSetCellWeights(), DMForestSetWeightCapacity()
14309be51f97SToby Isaac @*/
1431c7eeac06SToby Isaac PetscErrorCode DMForestGetCellWeights(DM dm, PetscReal **weights)
1432c7eeac06SToby Isaac {
1433c7eeac06SToby Isaac   DM_Forest *forest = (DM_Forest*) dm->data;
1434c7eeac06SToby Isaac 
1435c7eeac06SToby Isaac   PetscFunctionBegin;
1436c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1437c7eeac06SToby Isaac   PetscValidPointer(weights,2);
1438c7eeac06SToby Isaac   *weights = forest->cellWeights;
1439c7eeac06SToby Isaac   PetscFunctionReturn(0);
1440c7eeac06SToby Isaac }
1441c7eeac06SToby Isaac 
1442c7eeac06SToby Isaac #undef __FUNCT__
1443c7eeac06SToby Isaac #define __FUNCT__ "DMForestSetWeightCapacity"
14449be51f97SToby Isaac /*@
14459be51f97SToby Isaac   DMForestSetWeightCapacity - During the pre-setup phase, set the capacity of the current process when repartitioning
14469be51f97SToby Isaac   a pre-adaptation forest (see DMForestGetAdaptivityForest()).  After partitioning, the ratio of the weight of each
14479be51f97SToby Isaac   process's cells to the process's capacity will be roughly equal for all processes.  A capacity of 0 indicates that
14489be51f97SToby Isaac   the current process should not have any cells after repartitioning.
14499be51f97SToby Isaac 
14509be51f97SToby Isaac   Logically Collective on dm
14519be51f97SToby Isaac 
14529be51f97SToby Isaac   Input parameters:
14539be51f97SToby Isaac + dm - the forest
14549be51f97SToby Isaac - capacity - this process's capacity
14559be51f97SToby Isaac 
14569be51f97SToby Isaac   Level: advanced
14579be51f97SToby Isaac 
14589be51f97SToby Isaac .seealso DMForestGetWeightCapacity(), DMForestSetCellWeights(), DMForestSetCellWeightFactor()
14599be51f97SToby Isaac @*/
1460c7eeac06SToby Isaac PetscErrorCode DMForestSetWeightCapacity(DM dm, PetscReal capacity)
1461c7eeac06SToby Isaac {
1462c7eeac06SToby Isaac   DM_Forest *forest = (DM_Forest*) dm->data;
1463c7eeac06SToby Isaac 
1464c7eeac06SToby Isaac   PetscFunctionBegin;
1465c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1466ef51cf95SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the weight capacity after setup");
1467c7eeac06SToby Isaac   if (capacity < 0.) SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_OUTOFRANGE,"Cannot have negative weight capacity; %f",capacity);
1468c7eeac06SToby Isaac   forest->weightCapacity = capacity;
1469c7eeac06SToby Isaac   PetscFunctionReturn(0);
1470c7eeac06SToby Isaac }
1471c7eeac06SToby Isaac 
1472c7eeac06SToby Isaac #undef __FUNCT__
1473c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetWeightCapacity"
14749be51f97SToby Isaac /*@
14759be51f97SToby Isaac   DMForestGetWeightCapacity - Set the capacity of the current process when repartitioning a pre-adaptation forest (see
14769be51f97SToby Isaac   DMForestGetAdaptivityForest()).  After partitioning, the ratio of the weight of each process's cells to the
14779be51f97SToby Isaac   process's capacity will be roughly equal for all processes.  A capacity of 0 indicates that the current process
14789be51f97SToby Isaac   should not have any cells after repartitioning.
14799be51f97SToby Isaac 
14809be51f97SToby Isaac   Not collective
14819be51f97SToby Isaac 
14829be51f97SToby Isaac   Input parameter:
14839be51f97SToby Isaac . dm - the forest
14849be51f97SToby Isaac 
14859be51f97SToby Isaac   Output parameter:
14869be51f97SToby Isaac . capacity - this process's capacity
14879be51f97SToby Isaac 
14889be51f97SToby Isaac   Level: advanced
14899be51f97SToby Isaac 
14909be51f97SToby Isaac .seealso DMForestSetWeightCapacity(), DMForestSetCellWeights(), DMForestSetCellWeightFactor()
14919be51f97SToby Isaac @*/
1492c7eeac06SToby Isaac PetscErrorCode DMForestGetWeightCapacity(DM dm, PetscReal *capacity)
1493c7eeac06SToby Isaac {
1494c7eeac06SToby Isaac   DM_Forest *forest = (DM_Forest*) dm->data;
1495c7eeac06SToby Isaac 
1496c7eeac06SToby Isaac   PetscFunctionBegin;
1497c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1498c7eeac06SToby Isaac   PetscValidRealPointer(capacity,2);
1499c7eeac06SToby Isaac   *capacity = forest->weightCapacity;
1500c7eeac06SToby Isaac   PetscFunctionReturn(0);
1501c7eeac06SToby Isaac }
1502c7eeac06SToby Isaac 
1503dd8e54a2SToby Isaac #undef __FUNCT__
1504db4d5e8cSToby Isaac #define __FUNCT__ "DMSetFromOptions_Forest"
15050709b2feSToby Isaac PETSC_EXTERN PetscErrorCode DMSetFromOptions_Forest(PetscOptionItems *PetscOptionsObject,DM dm)
1506db4d5e8cSToby Isaac {
1507db4d5e8cSToby Isaac   DM_Forest                  *forest = (DM_Forest*) dm->data;
150856ba9f64SToby Isaac   PetscBool                  flg, flg1, flg2, flg3, flg4;
1509dd8e54a2SToby Isaac   DMForestTopology           oldTopo;
1510c7eeac06SToby Isaac   char                       stringBuffer[256];
1511dd8e54a2SToby Isaac   PetscViewer                viewer;
1512dd8e54a2SToby Isaac   PetscViewerFormat          format;
151356ba9f64SToby Isaac   PetscInt                   adjDim, adjCodim, overlap, minRefinement, initRefinement, maxRefinement, grade;
1514c7eeac06SToby Isaac   PetscReal                  weightsFactor;
1515c7eeac06SToby Isaac   DMForestAdaptivityStrategy adaptStrategy;
1516db4d5e8cSToby Isaac   PetscErrorCode             ierr;
1517db4d5e8cSToby Isaac 
1518db4d5e8cSToby Isaac   PetscFunctionBegin;
1519db4d5e8cSToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
152058762b62SToby Isaac   forest->setfromoptionscalled = PETSC_TRUE;
1521dd8e54a2SToby Isaac   ierr                         = DMForestGetTopology(dm, &oldTopo);CHKERRQ(ierr);
1522a3eda1eaSToby Isaac   ierr                         = PetscOptionsHead(PetscOptionsObject,"DMForest Options");CHKERRQ(ierr);
152356ba9f64SToby Isaac   ierr                         = PetscOptionsString("-dm_forest_topology","the topology of the forest's base mesh","DMForestSetTopology",oldTopo,stringBuffer,256,&flg1);CHKERRQ(ierr);
152456ba9f64SToby Isaac   ierr                         = PetscOptionsViewer("-dm_forest_base_dm","load the base DM from a viewer specification","DMForestSetBaseDM",&viewer,&format,&flg2);CHKERRQ(ierr);
152556ba9f64SToby Isaac   ierr                         = PetscOptionsViewer("-dm_forest_coarse_forest","load the coarse forest from a viewer specification","DMForestSetCoarseForest",&viewer,&format,&flg3);CHKERRQ(ierr);
152656ba9f64SToby Isaac   ierr                         = PetscOptionsViewer("-dm_forest_fine_forest","load the fine forest from a viewer specification","DMForestSetFineForest",&viewer,&format,&flg4);CHKERRQ(ierr);
1527f885a11aSToby Isaac   if ((PetscInt) flg1 + (PetscInt) flg2 + (PetscInt) flg3 + (PetscInt) flg4 > 1) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_INCOMP,"Specify only one of -dm_forest_{topology,base_dm,coarse_forest,fine_forest}");
152856ba9f64SToby Isaac   if (flg1) {
152956ba9f64SToby Isaac     ierr = DMForestSetTopology(dm,(DMForestTopology)stringBuffer);CHKERRQ(ierr);
153056ba9f64SToby Isaac     ierr = DMForestSetBaseDM(dm,NULL);CHKERRQ(ierr);
153120e8089bSToby Isaac     ierr = DMForestSetAdaptivityForest(dm,NULL);CHKERRQ(ierr);
153256ba9f64SToby Isaac   }
153356ba9f64SToby Isaac   if (flg2) {
1534dd8e54a2SToby Isaac     DM base;
1535dd8e54a2SToby Isaac 
1536dd8e54a2SToby Isaac     ierr = DMCreate(PetscObjectComm((PetscObject)dm),&base);CHKERRQ(ierr);
1537dd8e54a2SToby Isaac     ierr = PetscViewerPushFormat(viewer,format);CHKERRQ(ierr);
1538dd8e54a2SToby Isaac     ierr = DMLoad(base,viewer);CHKERRQ(ierr);
1539dd8e54a2SToby Isaac     ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
1540dd8e54a2SToby Isaac     ierr = DMForestSetBaseDM(dm,base);CHKERRQ(ierr);
1541dd8e54a2SToby Isaac     ierr = DMDestroy(&base);CHKERRQ(ierr);
154256ba9f64SToby Isaac     ierr = DMForestSetTopology(dm,NULL);CHKERRQ(ierr);
154320e8089bSToby Isaac     ierr = DMForestSetAdaptivityForest(dm,NULL);CHKERRQ(ierr);
1544dd8e54a2SToby Isaac   }
154556ba9f64SToby Isaac   if (flg3) {
1546dd8e54a2SToby Isaac     DM coarse;
1547dd8e54a2SToby Isaac 
1548dd8e54a2SToby Isaac     ierr = DMCreate(PetscObjectComm((PetscObject)dm),&coarse);CHKERRQ(ierr);
1549dd8e54a2SToby Isaac     ierr = PetscViewerPushFormat(viewer,format);CHKERRQ(ierr);
1550dd8e54a2SToby Isaac     ierr = DMLoad(coarse,viewer);CHKERRQ(ierr);
1551dd8e54a2SToby Isaac     ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
155220e8089bSToby Isaac     ierr = DMForestSetAdaptivityForest(dm,coarse);CHKERRQ(ierr);
1553dd8e54a2SToby Isaac     ierr = DMDestroy(&coarse);CHKERRQ(ierr);
155456ba9f64SToby Isaac     ierr = DMForestSetTopology(dm,NULL);CHKERRQ(ierr);
155556ba9f64SToby Isaac     ierr = DMForestSetBaseDM(dm,NULL);CHKERRQ(ierr);
1556dd8e54a2SToby Isaac   }
155756ba9f64SToby Isaac   if (flg4) {
1558dd8e54a2SToby Isaac     DM fine;
1559dd8e54a2SToby Isaac 
1560dd8e54a2SToby Isaac     ierr = DMCreate(PetscObjectComm((PetscObject)dm),&fine);CHKERRQ(ierr);
1561dd8e54a2SToby Isaac     ierr = PetscViewerPushFormat(viewer,format);CHKERRQ(ierr);
1562dd8e54a2SToby Isaac     ierr = DMLoad(fine,viewer);CHKERRQ(ierr);
1563dd8e54a2SToby Isaac     ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
156420e8089bSToby Isaac     ierr = DMForestSetAdaptivityForest(dm,fine);CHKERRQ(ierr);
1565dd8e54a2SToby Isaac     ierr = DMDestroy(&fine);CHKERRQ(ierr);
156656ba9f64SToby Isaac     ierr = DMForestSetTopology(dm,NULL);CHKERRQ(ierr);
156756ba9f64SToby Isaac     ierr = DMForestSetBaseDM(dm,NULL);CHKERRQ(ierr);
1568dd8e54a2SToby Isaac   }
1569dd8e54a2SToby Isaac   ierr = DMForestGetAdjacencyDimension(dm,&adjDim);CHKERRQ(ierr);
1570dd8e54a2SToby Isaac   ierr = PetscOptionsInt("-dm_forest_adjacency_dimension","set the dimension of points that define adjacency in the forest","DMForestSetAdjacencyDimension",adjDim,&adjDim,&flg);CHKERRQ(ierr);
1571dd8e54a2SToby Isaac   if (flg) {
1572dd8e54a2SToby Isaac     ierr = DMForestSetAdjacencyDimension(dm,adjDim);CHKERRQ(ierr);
1573f885a11aSToby Isaac   } else {
1574dd8e54a2SToby Isaac     ierr = DMForestGetAdjacencyCodimension(dm,&adjCodim);CHKERRQ(ierr);
1575dd8e54a2SToby Isaac     ierr = PetscOptionsInt("-dm_forest_adjacency_codimension","set the codimension of points that define adjacency in the forest","DMForestSetAdjacencyCodimension",adjCodim,&adjCodim,&flg);CHKERRQ(ierr);
1576dd8e54a2SToby Isaac     if (flg) {
1577dd8e54a2SToby Isaac       ierr = DMForestSetAdjacencyCodimension(dm,adjCodim);CHKERRQ(ierr);
1578dd8e54a2SToby Isaac     }
1579dd8e54a2SToby Isaac   }
1580dd8e54a2SToby Isaac   ierr = DMForestGetPartitionOverlap(dm,&overlap);CHKERRQ(ierr);
1581dd8e54a2SToby Isaac   ierr = PetscOptionsInt("-dm_forest_partition_overlap","set the degree of partition overlap","DMForestSetPartitionOverlap",overlap,&overlap,&flg);CHKERRQ(ierr);
1582dd8e54a2SToby Isaac   if (flg) {
1583dd8e54a2SToby Isaac     ierr = DMForestSetPartitionOverlap(dm,overlap);CHKERRQ(ierr);
1584dd8e54a2SToby Isaac   }
1585a6121fbdSMatthew G. Knepley #if 0
1586a6121fbdSMatthew 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);
1587a6121fbdSMatthew G. Knepley   if (flg) {
1588a6121fbdSMatthew G. Knepley     ierr = DMForestSetMinimumRefinement(dm,minRefinement);CHKERRQ(ierr);
1589a6121fbdSMatthew G. Knepley     ierr = DMForestSetInitialRefinement(dm,minRefinement);CHKERRQ(ierr);
1590a6121fbdSMatthew G. Knepley   }
1591a6121fbdSMatthew 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);
1592a6121fbdSMatthew G. Knepley   if (flg) {
1593a6121fbdSMatthew G. Knepley     ierr = DMForestSetMinimumRefinement(dm,0);CHKERRQ(ierr);
1594a6121fbdSMatthew G. Knepley     ierr = DMForestSetInitialRefinement(dm,initRefinement);CHKERRQ(ierr);
1595a6121fbdSMatthew G. Knepley   }
1596a6121fbdSMatthew G. Knepley #endif
1597dd8e54a2SToby Isaac   ierr = DMForestGetMinimumRefinement(dm,&minRefinement);CHKERRQ(ierr);
1598dd8e54a2SToby Isaac   ierr = PetscOptionsInt("-dm_forest_minimum_refinement","set the minimum level of refinement in the forest","DMForestSetMinimumRefinement",minRefinement,&minRefinement,&flg);CHKERRQ(ierr);
1599dd8e54a2SToby Isaac   if (flg) {
1600dd8e54a2SToby Isaac     ierr = DMForestSetMinimumRefinement(dm,minRefinement);CHKERRQ(ierr);
1601db4d5e8cSToby Isaac   }
160256ba9f64SToby Isaac   ierr = DMForestGetInitialRefinement(dm,&initRefinement);CHKERRQ(ierr);
160356ba9f64SToby Isaac   ierr = PetscOptionsInt("-dm_forest_initial_refinement","set the initial level of refinement in the forest","DMForestSetInitialRefinement",initRefinement,&initRefinement,&flg);CHKERRQ(ierr);
160456ba9f64SToby Isaac   if (flg) {
160556ba9f64SToby Isaac     ierr = DMForestSetInitialRefinement(dm,initRefinement);CHKERRQ(ierr);
160656ba9f64SToby Isaac   }
1607c7eeac06SToby Isaac   ierr = DMForestGetMaximumRefinement(dm,&maxRefinement);CHKERRQ(ierr);
1608c7eeac06SToby Isaac   ierr = PetscOptionsInt("-dm_forest_maximum_refinement","set the maximum level of refinement in the forest","DMForestSetMaximumRefinement",maxRefinement,&maxRefinement,&flg);CHKERRQ(ierr);
1609c7eeac06SToby Isaac   if (flg) {
1610c7eeac06SToby Isaac     ierr = DMForestSetMaximumRefinement(dm,maxRefinement);CHKERRQ(ierr);
1611c7eeac06SToby Isaac   }
1612c7eeac06SToby Isaac   ierr = DMForestGetAdaptivityStrategy(dm,&adaptStrategy);CHKERRQ(ierr);
1613c7eeac06SToby Isaac   ierr = PetscOptionsString("-dm_forest_adaptivity_strategy","the forest's adaptivity-flag resolution strategy","DMForestSetAdaptivityStrategy",adaptStrategy,stringBuffer,256,&flg);CHKERRQ(ierr);
1614c7eeac06SToby Isaac   if (flg) {
1615c7eeac06SToby Isaac     ierr = DMForestSetAdaptivityStrategy(dm,(DMForestAdaptivityStrategy)stringBuffer);CHKERRQ(ierr);
1616c7eeac06SToby Isaac   }
1617c7eeac06SToby Isaac   ierr = DMForestGetGradeFactor(dm,&grade);CHKERRQ(ierr);
1618c7eeac06SToby Isaac   ierr = PetscOptionsInt("-dm_forest_grade_factor","grade factor between neighboring cells","DMForestSetGradeFactor",grade,&grade,&flg);CHKERRQ(ierr);
1619c7eeac06SToby Isaac   if (flg) {
1620c7eeac06SToby Isaac     ierr = DMForestSetGradeFactor(dm,grade);CHKERRQ(ierr);
1621c7eeac06SToby Isaac   }
1622c7eeac06SToby Isaac   ierr = DMForestGetCellWeightFactor(dm,&weightsFactor);CHKERRQ(ierr);
1623c7eeac06SToby Isaac   ierr = PetscOptionsReal("-dm_forest_cell_weight_factor","multiplying weight factor for cell refinement","DMForestSetCellWeightFactor",weightsFactor,&weightsFactor,&flg);CHKERRQ(ierr);
1624c7eeac06SToby Isaac   if (flg) {
1625c7eeac06SToby Isaac     ierr = DMForestSetCellWeightFactor(dm,weightsFactor);CHKERRQ(ierr);
1626c7eeac06SToby Isaac   }
1627db4d5e8cSToby Isaac   ierr = PetscOptionsTail();CHKERRQ(ierr);
1628db4d5e8cSToby Isaac   PetscFunctionReturn(0);
1629db4d5e8cSToby Isaac }
1630db4d5e8cSToby Isaac 
1631db4d5e8cSToby Isaac #undef __FUNCT__
1632d8984e3bSMatthew G. Knepley #define __FUNCT__ "DMCreateSubDM_Forest"
1633d8984e3bSMatthew G. Knepley PetscErrorCode DMCreateSubDM_Forest(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm)
1634d8984e3bSMatthew G. Knepley {
1635d8984e3bSMatthew G. Knepley   PetscErrorCode ierr;
1636d8984e3bSMatthew G. Knepley 
1637d8984e3bSMatthew G. Knepley   PetscFunctionBegin;
1638d8984e3bSMatthew G. Knepley   if (subdm) {ierr = DMClone(dm, subdm);CHKERRQ(ierr);}
1639d8984e3bSMatthew G. Knepley   ierr = DMCreateSubDM_Section_Private(dm, numFields, fields, is, subdm);CHKERRQ(ierr);
1640d8984e3bSMatthew G. Knepley   PetscFunctionReturn(0);
1641d8984e3bSMatthew G. Knepley }
1642d8984e3bSMatthew G. Knepley 
1643d8984e3bSMatthew G. Knepley #undef __FUNCT__
16445421bac9SToby Isaac #define __FUNCT__ "DMRefine_Forest"
16455421bac9SToby Isaac PetscErrorCode DMRefine_Forest(DM dm, MPI_Comm comm, DM *dmRefined)
16465421bac9SToby Isaac {
16475421bac9SToby Isaac   DMLabel        refine;
16485421bac9SToby Isaac   DM             fineDM;
16495421bac9SToby Isaac   PetscErrorCode ierr;
16505421bac9SToby Isaac 
16515421bac9SToby Isaac   PetscFunctionBegin;
16525421bac9SToby Isaac   ierr = DMGetFineDM(dm,&fineDM);CHKERRQ(ierr);
16535421bac9SToby Isaac   if (fineDM) {
16545421bac9SToby Isaac     ierr       = PetscObjectReference((PetscObject)fineDM);CHKERRQ(ierr);
16555421bac9SToby Isaac     *dmRefined = fineDM;
16565421bac9SToby Isaac     PetscFunctionReturn(0);
16575421bac9SToby Isaac   }
16585421bac9SToby Isaac   ierr = DMForestTemplate(dm,comm,dmRefined);CHKERRQ(ierr);
16595421bac9SToby Isaac   ierr = DMGetLabel(dm,"refine",&refine);CHKERRQ(ierr);
16605421bac9SToby Isaac   if (!refine) {
16615421bac9SToby Isaac     ierr = DMCreateLabel(dm,"refine");CHKERRQ(ierr);
16625421bac9SToby Isaac     ierr = DMGetLabel(dm,"refine",&refine);CHKERRQ(ierr);
16635421bac9SToby Isaac     ierr = DMLabelSetDefaultValue(refine,DM_FOREST_REFINE);CHKERRQ(ierr);
16645421bac9SToby Isaac   }
16655421bac9SToby Isaac   ierr = DMForestSetAdaptivityLabel(*dmRefined,"refine");CHKERRQ(ierr);
16665421bac9SToby Isaac   PetscFunctionReturn(0);
16675421bac9SToby Isaac }
16685421bac9SToby Isaac 
16695421bac9SToby Isaac #undef __FUNCT__
16705421bac9SToby Isaac #define __FUNCT__ "DMCoarsen_Forest"
16715421bac9SToby Isaac PetscErrorCode DMCoarsen_Forest(DM dm, MPI_Comm comm, DM *dmCoarsened)
16725421bac9SToby Isaac {
16735421bac9SToby Isaac   DMLabel        coarsen;
16745421bac9SToby Isaac   DM             coarseDM;
16755421bac9SToby Isaac   PetscErrorCode ierr;
16765421bac9SToby Isaac 
16775421bac9SToby Isaac   PetscFunctionBegin;
16784098eed7SToby Isaac   {
16794098eed7SToby Isaac     PetscMPIInt mpiComparison;
16804098eed7SToby Isaac     MPI_Comm    dmcomm = PetscObjectComm((PetscObject)dm);
16814098eed7SToby Isaac 
16824098eed7SToby Isaac     ierr = MPI_Comm_compare(comm, dmcomm, &mpiComparison);CHKERRQ(ierr);
1683f885a11aSToby Isaac     if (mpiComparison != MPI_IDENT && mpiComparison != MPI_CONGRUENT) SETERRQ(dmcomm,PETSC_ERR_SUP,"No support for different communicators yet");
16844098eed7SToby Isaac   }
16855421bac9SToby Isaac   ierr = DMGetCoarseDM(dm,&coarseDM);CHKERRQ(ierr);
16865421bac9SToby Isaac   if (coarseDM) {
16875421bac9SToby Isaac     ierr         = PetscObjectReference((PetscObject)coarseDM);CHKERRQ(ierr);
16885421bac9SToby Isaac     *dmCoarsened = coarseDM;
16895421bac9SToby Isaac     PetscFunctionReturn(0);
16905421bac9SToby Isaac   }
16915421bac9SToby Isaac   ierr = DMForestTemplate(dm,comm,dmCoarsened);CHKERRQ(ierr);
16924098eed7SToby Isaac   ierr = DMForestSetAdaptivityPurpose(coarseDM,DM_FOREST_COARSEN);CHKERRQ(ierr);
16935421bac9SToby Isaac   ierr = DMGetLabel(dm,"coarsen",&coarsen);CHKERRQ(ierr);
16945421bac9SToby Isaac   if (!coarsen) {
16955421bac9SToby Isaac     ierr = DMCreateLabel(dm,"coarsen");CHKERRQ(ierr);
16965421bac9SToby Isaac     ierr = DMGetLabel(dm,"coarsen",&coarsen);CHKERRQ(ierr);
16975421bac9SToby Isaac     ierr = DMLabelSetDefaultValue(coarsen,DM_FOREST_COARSEN);CHKERRQ(ierr);
16985421bac9SToby Isaac   }
16995421bac9SToby Isaac   ierr = DMForestSetAdaptivityLabel(*dmCoarsened,"coarsen");CHKERRQ(ierr);
17005421bac9SToby Isaac   PetscFunctionReturn(0);
17015421bac9SToby Isaac }
17025421bac9SToby Isaac 
17035421bac9SToby Isaac #undef __FUNCT__
1704d222f98bSToby Isaac #define __FUNCT__ "DMInitialize_Forest"
1705d222f98bSToby Isaac static PetscErrorCode DMInitialize_Forest(DM dm)
1706d222f98bSToby Isaac {
1707d222f98bSToby Isaac   PetscErrorCode ierr;
1708d222f98bSToby Isaac 
1709d222f98bSToby Isaac   PetscFunctionBegin;
1710d222f98bSToby Isaac   ierr = PetscMemzero(dm->ops,sizeof(*(dm->ops)));CHKERRQ(ierr);
1711d222f98bSToby Isaac 
1712d222f98bSToby Isaac   dm->ops->clone          = DMClone_Forest;
1713d222f98bSToby Isaac   dm->ops->setfromoptions = DMSetFromOptions_Forest;
1714d222f98bSToby Isaac   dm->ops->destroy        = DMDestroy_Forest;
1715d8984e3bSMatthew G. Knepley   dm->ops->createsubdm    = DMCreateSubDM_Forest;
17165421bac9SToby Isaac   dm->ops->refine         = DMRefine_Forest;
17175421bac9SToby Isaac   dm->ops->coarsen        = DMCoarsen_Forest;
1718d222f98bSToby Isaac   PetscFunctionReturn(0);
1719d222f98bSToby Isaac }
1720d222f98bSToby Isaac 
17219be51f97SToby Isaac /*MC
17229be51f97SToby Isaac   DMFOREST = "forest" - A DM object that encapsulates a hierarchically refined mesh.  Forests usually have a base DM (see DMForestGetBaseDM()), from which it is refined.  The refinement and partitioning of forests is considered immutable after DMSetUp() is called.  To adapt a mesh, one should call DMForestTemplate() to create a new mesh that will default to being identical to it, specify how that mesh should differ, and then calling DMSetUp() on the new mesh.
17239be51f97SToby Isaac 
17249be51f97SToby Isaac   To specify that a mesh should be refined or coarsened from the previous mesh, a label should be defined on the previous mesh whose values indicate which cells should be refined (DM_FOREST_REFINE) or coarsened (DM_FOREST_COARSEN) and how (subtypes are free to allow additional values for things like anisotropic refinement).  The name of the label should be given to the *new* mesh with DMForestSetAdaptivityLabel().
17259be51f97SToby Isaac 
17269be51f97SToby Isaac   Level: advanced
17279be51f97SToby Isaac 
17289be51f97SToby Isaac .seealso: DMType, DMCreate(), DMSetType(), DMForestGetBaseDM(), DMForestSetBaseDM(), DMForestTemplate(), DMForestSetAdaptivityLabel()
17299be51f97SToby Isaac M*/
17309be51f97SToby Isaac 
1731d222f98bSToby Isaac #undef __FUNCT__
1732db4d5e8cSToby Isaac #define __FUNCT__ "DMCreate_Forest"
1733db4d5e8cSToby Isaac PETSC_EXTERN PetscErrorCode DMCreate_Forest(DM dm)
1734db4d5e8cSToby Isaac {
1735db4d5e8cSToby Isaac   DM_Forest      *forest;
1736db4d5e8cSToby Isaac   PetscErrorCode ierr;
1737db4d5e8cSToby Isaac 
1738db4d5e8cSToby Isaac   PetscFunctionBegin;
1739db4d5e8cSToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1740db4d5e8cSToby Isaac   ierr                         = PetscNewLog(dm,&forest);CHKERRQ(ierr);
1741db4d5e8cSToby Isaac   dm->dim                      = 0;
1742db4d5e8cSToby Isaac   dm->data                     = forest;
1743db4d5e8cSToby Isaac   forest->refct                = 1;
1744db4d5e8cSToby Isaac   forest->data                 = NULL;
174558762b62SToby Isaac   forest->setfromoptionscalled = PETSC_FALSE;
1746db4d5e8cSToby Isaac   forest->topology             = NULL;
1747db4d5e8cSToby Isaac   forest->base                 = NULL;
1748db4d5e8cSToby Isaac   forest->adjDim               = PETSC_DEFAULT;
1749db4d5e8cSToby Isaac   forest->overlap              = PETSC_DEFAULT;
1750db4d5e8cSToby Isaac   forest->minRefinement        = PETSC_DEFAULT;
1751db4d5e8cSToby Isaac   forest->maxRefinement        = PETSC_DEFAULT;
175256ba9f64SToby Isaac   forest->initRefinement       = PETSC_DEFAULT;
1753c7eeac06SToby Isaac   forest->cStart               = PETSC_DETERMINE;
1754c7eeac06SToby Isaac   forest->cEnd                 = PETSC_DETERMINE;
1755db4d5e8cSToby Isaac   forest->cellSF               = 0;
1756ebdf65a2SToby Isaac   forest->adaptLabel           = NULL;
1757db4d5e8cSToby Isaac   forest->gradeFactor          = 2;
1758db4d5e8cSToby Isaac   forest->cellWeights          = NULL;
1759db4d5e8cSToby Isaac   forest->cellWeightsCopyMode  = PETSC_USE_POINTER;
1760db4d5e8cSToby Isaac   forest->weightsFactor        = 1.;
1761db4d5e8cSToby Isaac   forest->weightCapacity       = 1.;
1762a73e2921SToby Isaac   ierr                         = DMForestSetAdaptivityStrategy(dm,DMFORESTADAPTALL);CHKERRQ(ierr);
1763d222f98bSToby Isaac   ierr                         = DMInitialize_Forest(dm);CHKERRQ(ierr);
1764db4d5e8cSToby Isaac   PetscFunctionReturn(0);
1765db4d5e8cSToby Isaac }
1766db4d5e8cSToby Isaac 
1767