xref: /petsc/src/dm/impls/forest/forest.c (revision ebdf65a2df4c8be519c368e734af36cda1918049)
1fbbfd472SToby Isaac #include <petsc/private/dmforestimpl.h> /*I petscdmforest.h I*/
2fbbfd472SToby Isaac #include <petsc/private/dmimpl.h>       /*I petscdm.h */
3ef19d27cSToby Isaac #include <petscsf.h>
4db4d5e8cSToby Isaac 
527d4645fSToby Isaac PetscBool DMForestPackageInitialized = PETSC_FALSE;
627d4645fSToby Isaac 
727d4645fSToby Isaac typedef struct _DMForestTypeLink *DMForestTypeLink;
827d4645fSToby Isaac 
927d4645fSToby Isaac struct _DMForestTypeLink
1027d4645fSToby Isaac {
1127d4645fSToby Isaac   char *name;
1227d4645fSToby Isaac   DMForestTypeLink next;
1327d4645fSToby Isaac };
1427d4645fSToby Isaac 
1527d4645fSToby Isaac DMForestTypeLink DMForestTypeList;
1627d4645fSToby Isaac 
1727d4645fSToby Isaac #undef __FUNCT__
1827d4645fSToby Isaac #define __FUNCT__ "DMForestPackageFinalize"
1927d4645fSToby Isaac static PetscErrorCode DMForestPackageFinalize(void)
2027d4645fSToby Isaac {
2127d4645fSToby Isaac   DMForestTypeLink oldLink, link = DMForestTypeList;
2227d4645fSToby Isaac   PetscErrorCode ierr;
2327d4645fSToby Isaac 
2427d4645fSToby Isaac   PetscFunctionBegin;
2527d4645fSToby Isaac   while (link) {
2627d4645fSToby Isaac     oldLink = link;
2727d4645fSToby Isaac     ierr = PetscFree(oldLink->name);
2827d4645fSToby Isaac     link = oldLink->next;
2927d4645fSToby Isaac     ierr = PetscFree(oldLink);CHKERRQ(ierr);
3027d4645fSToby Isaac   }
3127d4645fSToby Isaac   PetscFunctionReturn(0);
3227d4645fSToby Isaac }
3327d4645fSToby Isaac 
3427d4645fSToby Isaac #undef __FUNCT__
3527d4645fSToby Isaac #define __FUNCT__ "DMForestPackageInitialize"
3627d4645fSToby Isaac static PetscErrorCode DMForestPackageInitialize(void)
3727d4645fSToby Isaac {
3827d4645fSToby Isaac   PetscErrorCode ierr;
3927d4645fSToby Isaac 
4027d4645fSToby Isaac   PetscFunctionBegin;
4127d4645fSToby Isaac   if (DMForestPackageInitialized) PetscFunctionReturn(0);
4227d4645fSToby Isaac   DMForestPackageInitialized = PETSC_TRUE;
4327d4645fSToby Isaac   ierr = DMForestRegisterType(DMFOREST);CHKERRQ(ierr);
4427d4645fSToby Isaac   ierr = PetscRegisterFinalize(DMForestPackageFinalize);CHKERRQ(ierr);
4527d4645fSToby Isaac   PetscFunctionReturn(0);
4627d4645fSToby Isaac }
4727d4645fSToby Isaac 
4827d4645fSToby Isaac #undef __FUNCT__
4927d4645fSToby Isaac #define __FUNCT__ "DMForestRegisterType"
5027d4645fSToby Isaac PetscErrorCode DMForestRegisterType(DMType name)
5127d4645fSToby Isaac {
5227d4645fSToby Isaac   DMForestTypeLink link;
5327d4645fSToby Isaac   PetscErrorCode ierr;
5427d4645fSToby Isaac 
5527d4645fSToby Isaac   PetscFunctionBegin;
5627d4645fSToby Isaac   ierr = DMForestPackageInitialize();CHKERRQ(ierr);
5727d4645fSToby Isaac   ierr = PetscNew(&link);CHKERRQ(ierr);
5827d4645fSToby Isaac   ierr = PetscStrallocpy(name,&link->name);CHKERRQ(ierr);
5927d4645fSToby Isaac   link->next = DMForestTypeList;
6027d4645fSToby Isaac   DMForestTypeList = link;
6127d4645fSToby Isaac   PetscFunctionReturn(0);
6227d4645fSToby Isaac }
6327d4645fSToby Isaac 
6427d4645fSToby Isaac #undef __FUNCT__
6527d4645fSToby Isaac #define __FUNCT__ "DMIsForest"
6627d4645fSToby Isaac PetscErrorCode DMIsForest(DM dm, PetscBool *isForest)
6727d4645fSToby Isaac {
6827d4645fSToby Isaac   DMForestTypeLink link = DMForestTypeList;
6927d4645fSToby Isaac   PetscErrorCode ierr;
7027d4645fSToby Isaac 
7127d4645fSToby Isaac   PetscFunctionBegin;
7227d4645fSToby Isaac   while (link) {
7327d4645fSToby Isaac     PetscBool sameType;
7427d4645fSToby Isaac     ierr = PetscObjectTypeCompare((PetscObject)dm,link->name,&sameType);CHKERRQ(ierr);
7527d4645fSToby Isaac     if (sameType) {
7627d4645fSToby Isaac       *isForest = PETSC_TRUE;
7727d4645fSToby Isaac       PetscFunctionReturn(0);
7827d4645fSToby Isaac     }
7927d4645fSToby Isaac     link = link->next;
8027d4645fSToby Isaac   }
8127d4645fSToby Isaac   *isForest = PETSC_FALSE;
8227d4645fSToby Isaac   PetscFunctionReturn(0);
8327d4645fSToby Isaac }
8427d4645fSToby Isaac 
85db4d5e8cSToby Isaac #undef __FUNCT__
86a0452a8eSToby Isaac #define __FUNCT__ "DMForestTemplate"
87a0452a8eSToby Isaac PETSC_EXTERN PetscErrorCode DMForestTemplate(DM dm, DM tdm)
88a0452a8eSToby Isaac {
89a0452a8eSToby Isaac   DM_Forest        *forest = (DM_Forest *) dm->data;
90a0452a8eSToby Isaac   DM               base;
91a0452a8eSToby Isaac   DMForestTopology topology;
92a0452a8eSToby Isaac   PetscInt         dim, overlap, ref, factor;
93a0452a8eSToby Isaac   DMForestAdaptivityStrategy strat;
94a0452a8eSToby Isaac   PetscErrorCode   ierr;
95a0452a8eSToby Isaac 
96a0452a8eSToby Isaac   PetscFunctionBegin;
97a0452a8eSToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
98a0452a8eSToby Isaac   PetscValidHeaderSpecific(tdm, DM_CLASSID, 2);
99a0452a8eSToby Isaac   ierr = DMForestGetBaseDM(dm,&base);CHKERRQ(ierr);
100a0452a8eSToby Isaac   ierr = DMForestSetBaseDM(tdm,base);CHKERRQ(ierr);
101a0452a8eSToby Isaac   ierr = DMForestGetTopology(dm,&topology);CHKERRQ(ierr);
102a0452a8eSToby Isaac   ierr = DMForestSetTopology(tdm,topology);CHKERRQ(ierr);
103a0452a8eSToby Isaac   ierr = DMForestGetAdjacencyDimension(dm,&dim);CHKERRQ(ierr);
104a0452a8eSToby Isaac   ierr = DMForestSetAdjacencyDimension(tdm,dim);CHKERRQ(ierr);
105a0452a8eSToby Isaac   ierr = DMForestGetPartitionOverlap(dm,&overlap);CHKERRQ(ierr);
106a0452a8eSToby Isaac   ierr = DMForestSetPartitionOverlap(tdm,overlap);CHKERRQ(ierr);
107a0452a8eSToby Isaac   ierr = DMForestGetMinimumRefinement(dm,&ref);CHKERRQ(ierr);
108a0452a8eSToby Isaac   ierr = DMForestSetMinimumRefinement(tdm,ref);CHKERRQ(ierr);
109a0452a8eSToby Isaac   ierr = DMForestGetMaximumRefinement(dm,&ref);CHKERRQ(ierr);
110a0452a8eSToby Isaac   ierr = DMForestSetMaximumRefinement(tdm,ref);CHKERRQ(ierr);
111a0452a8eSToby Isaac   ierr = DMForestGetAdaptivityStrategy(dm,&strat);CHKERRQ(ierr);
112a0452a8eSToby Isaac   ierr = DMForestSetAdaptivityStrategy(tdm,strat);CHKERRQ(ierr);
113a0452a8eSToby Isaac   ierr = DMForestGetGradeFactor(dm,&factor);CHKERRQ(ierr);
114a0452a8eSToby Isaac   ierr = DMForestSetGradeFactor(tdm,factor);CHKERRQ(ierr);
115a0452a8eSToby Isaac   if (forest->ftemplate) {
116a0452a8eSToby Isaac     ierr = (forest->ftemplate) (dm, tdm);CHKERRQ(ierr);
117a0452a8eSToby Isaac   }
118a0452a8eSToby Isaac   PetscFunctionReturn(0);
119a0452a8eSToby Isaac }
120a0452a8eSToby Isaac 
12101d9d024SToby Isaac static PetscErrorCode DMInitialize_Forest(DM dm);
12201d9d024SToby Isaac 
123a0452a8eSToby Isaac #undef __FUNCT__
124db4d5e8cSToby Isaac #define __FUNCT__ "DMClone_Forest"
125db4d5e8cSToby Isaac PETSC_EXTERN PetscErrorCode DMClone_Forest(DM dm, DM *newdm)
126db4d5e8cSToby Isaac {
127db4d5e8cSToby Isaac   DM_Forest        *forest = (DM_Forest *) dm->data;
128db4d5e8cSToby Isaac   const char       *type;
129db4d5e8cSToby Isaac   PetscErrorCode ierr;
130db4d5e8cSToby Isaac 
131db4d5e8cSToby Isaac   PetscFunctionBegin;
132db4d5e8cSToby Isaac   forest->refct++;
133db4d5e8cSToby Isaac   (*newdm)->data = forest;
134db4d5e8cSToby Isaac   ierr = PetscObjectGetType((PetscObject) dm, &type);CHKERRQ(ierr);
135db4d5e8cSToby Isaac   ierr = PetscObjectChangeTypeName((PetscObject) *newdm, type);CHKERRQ(ierr);
13601d9d024SToby Isaac   ierr = DMInitialize_Forest(*newdm);CHKERRQ(ierr);
137db4d5e8cSToby Isaac   PetscFunctionReturn(0);
138db4d5e8cSToby Isaac }
139db4d5e8cSToby Isaac 
140db4d5e8cSToby Isaac #undef __FUNCT__
141db4d5e8cSToby Isaac #define __FUNCT__ "DMDestroy_Forest"
142d222f98bSToby Isaac static PetscErrorCode DMDestroy_Forest(DM dm)
143db4d5e8cSToby Isaac {
144db4d5e8cSToby Isaac   DM_Forest     *forest = (DM_Forest*) dm->data;
145db4d5e8cSToby Isaac   PetscErrorCode ierr;
146db4d5e8cSToby Isaac 
147db4d5e8cSToby Isaac   PetscFunctionBegin;
148db4d5e8cSToby Isaac   if (--forest->refct > 0) PetscFunctionReturn(0);
149d222f98bSToby Isaac   if (forest->destroy) {ierr = forest->destroy(dm);CHKERRQ(ierr);}
150db4d5e8cSToby Isaac   ierr = PetscSFDestroy(&forest->cellSF);CHKERRQ(ierr);
151*ebdf65a2SToby Isaac   ierr = PetscFree(forest->adaptLabel);CHKERRQ(ierr);
1529a81d013SToby Isaac   ierr = PetscFree(forest->adaptStrategy);CHKERRQ(ierr);
15356ba9f64SToby Isaac   ierr = DMDestroy(&forest->base);CHKERRQ(ierr);
15430f902e7SToby Isaac   ierr = PetscFree(forest->topology);CHKERRQ(ierr);
15530f902e7SToby Isaac   ierr = PetscFree(forest);CHKERRQ(ierr);
156db4d5e8cSToby Isaac   PetscFunctionReturn(0);
157db4d5e8cSToby Isaac }
158db4d5e8cSToby Isaac 
159db4d5e8cSToby Isaac #undef __FUNCT__
160dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetTopology"
161dd8e54a2SToby Isaac PetscErrorCode DMForestSetTopology(DM dm, DMForestTopology topology)
162db4d5e8cSToby Isaac {
163db4d5e8cSToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
164db4d5e8cSToby Isaac   PetscErrorCode ierr;
165db4d5e8cSToby Isaac 
166db4d5e8cSToby Isaac   PetscFunctionBegin;
167db4d5e8cSToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
168ef51cf95SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the topology after setup");
169dd8e54a2SToby Isaac   ierr = PetscFree(forest->topology);CHKERRQ(ierr);
170dd8e54a2SToby Isaac   ierr = PetscStrallocpy((const char *)topology,(char **) &forest->topology);CHKERRQ(ierr);
171db4d5e8cSToby Isaac   PetscFunctionReturn(0);
172db4d5e8cSToby Isaac }
173db4d5e8cSToby Isaac 
174db4d5e8cSToby Isaac #undef __FUNCT__
175dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetTopology"
176dd8e54a2SToby Isaac PetscErrorCode DMForestGetTopology(DM dm, DMForestTopology *topology)
177dd8e54a2SToby Isaac {
178dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
179dd8e54a2SToby Isaac 
180dd8e54a2SToby Isaac   PetscFunctionBegin;
181dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
182dd8e54a2SToby Isaac   PetscValidPointer(topology,2);
183dd8e54a2SToby Isaac   *topology = forest->topology;
184dd8e54a2SToby Isaac   PetscFunctionReturn(0);
185dd8e54a2SToby Isaac }
186dd8e54a2SToby Isaac 
187dd8e54a2SToby Isaac #undef __FUNCT__
188dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetBaseDM"
189dd8e54a2SToby Isaac PetscErrorCode DMForestSetBaseDM(DM dm, DM base)
190dd8e54a2SToby Isaac {
191dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
192dd8e54a2SToby Isaac   PetscInt       dim, dimEmbed;
193dd8e54a2SToby Isaac   PetscErrorCode ierr;
194dd8e54a2SToby Isaac 
195dd8e54a2SToby Isaac   PetscFunctionBegin;
196dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
197ef51cf95SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the base after setup");
198dd8e54a2SToby Isaac   ierr = PetscObjectReference((PetscObject)base);CHKERRQ(ierr);
199dd8e54a2SToby Isaac   ierr = DMDestroy(&forest->base);CHKERRQ(ierr);
200dd8e54a2SToby Isaac   forest->base = base;
201a0452a8eSToby Isaac   if (base) {
202a0452a8eSToby Isaac     PetscValidHeaderSpecific(base, DM_CLASSID, 2);
203dd8e54a2SToby Isaac     ierr = DMGetDimension(base,&dim);CHKERRQ(ierr);
204dd8e54a2SToby Isaac     ierr = DMSetDimension(dm,dim);CHKERRQ(ierr);
205dd8e54a2SToby Isaac     ierr = DMGetCoordinateDim(base,&dimEmbed);CHKERRQ(ierr);
206dd8e54a2SToby Isaac     ierr = DMSetCoordinateDim(dm,dimEmbed);CHKERRQ(ierr);
207a0452a8eSToby Isaac   }
208dd8e54a2SToby Isaac   PetscFunctionReturn(0);
209dd8e54a2SToby Isaac }
210dd8e54a2SToby Isaac 
211dd8e54a2SToby Isaac #undef __FUNCT__
212dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetBaseDM"
213dd8e54a2SToby Isaac PetscErrorCode DMForestGetBaseDM(DM dm, DM *base)
214dd8e54a2SToby Isaac {
215dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
216dd8e54a2SToby Isaac 
217dd8e54a2SToby Isaac   PetscFunctionBegin;
218dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
219dd8e54a2SToby Isaac   PetscValidPointer(base, 2);
220dd8e54a2SToby Isaac   *base = forest->base;
221dd8e54a2SToby Isaac   PetscFunctionReturn(0);
222dd8e54a2SToby Isaac }
223dd8e54a2SToby Isaac 
224dd8e54a2SToby Isaac #undef __FUNCT__
225dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetCoarseForest"
226dd8e54a2SToby Isaac PetscErrorCode DMForestSetCoarseForest(DM dm,DM coarse)
227dd8e54a2SToby Isaac {
228dd8e54a2SToby Isaac   PetscErrorCode   ierr;
229dd8e54a2SToby Isaac 
230dd8e54a2SToby Isaac   PetscFunctionBegin;
231dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
232ef51cf95SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the coarse forest after setup");
23356ba9f64SToby Isaac   ierr = DMSetCoarseDM(dm,coarse);CHKERRQ(ierr);
234a0452a8eSToby Isaac   if (coarse) {
235a0452a8eSToby Isaac     PetscValidHeaderSpecific(coarse, DM_CLASSID, 2);
236a0452a8eSToby Isaac     ierr = DMForestTemplate(coarse,dm);CHKERRQ(ierr);
237a0452a8eSToby Isaac   }
238dd8e54a2SToby Isaac   PetscFunctionReturn(0);
239dd8e54a2SToby Isaac }
240dd8e54a2SToby Isaac 
241dd8e54a2SToby Isaac #undef __FUNCT__
242dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetCoarseForest"
243dd8e54a2SToby Isaac PetscErrorCode DMForestGetCoarseForest(DM dm, DM *coarse)
244dd8e54a2SToby Isaac {
24556ba9f64SToby Isaac   PetscErrorCode ierr;
246dd8e54a2SToby Isaac 
247dd8e54a2SToby Isaac   PetscFunctionBegin;
24856ba9f64SToby Isaac   ierr = DMGetCoarseDM(dm,coarse);CHKERRQ(ierr);
249dd8e54a2SToby Isaac   PetscFunctionReturn(0);
250dd8e54a2SToby Isaac }
251dd8e54a2SToby Isaac 
252dd8e54a2SToby Isaac #undef __FUNCT__
253dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetFineForest"
254dd8e54a2SToby Isaac PetscErrorCode DMForestSetFineForest(DM dm,DM fine)
255dd8e54a2SToby Isaac {
256dd8e54a2SToby Isaac   PetscErrorCode   ierr;
257dd8e54a2SToby Isaac 
258dd8e54a2SToby Isaac   PetscFunctionBegin;
259dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
260ef51cf95SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the fine forest after setup");
26188bdff64SToby Isaac   ierr = DMSetFineDM(dm,fine);CHKERRQ(ierr);
262a0452a8eSToby Isaac   if (fine) {
263a0452a8eSToby Isaac     PetscValidHeaderSpecific(fine, DM_CLASSID, 2);
264a0452a8eSToby Isaac     ierr = DMForestTemplate(fine,dm);CHKERRQ(ierr);
265a0452a8eSToby Isaac   }
266dd8e54a2SToby Isaac   PetscFunctionReturn(0);
267dd8e54a2SToby Isaac }
268dd8e54a2SToby Isaac 
269dd8e54a2SToby Isaac #undef __FUNCT__
270ef51cf95SToby Isaac #define __FUNCT__ "DMForestGetFineForest"
271dd8e54a2SToby Isaac PetscErrorCode DMForestGetFineForest(DM dm, DM *fine)
272dd8e54a2SToby Isaac {
27388bdff64SToby Isaac   PetscErrorCode ierr;
274dd8e54a2SToby Isaac 
275dd8e54a2SToby Isaac   PetscFunctionBegin;
27688bdff64SToby Isaac   ierr = DMGetFineDM(dm,fine);CHKERRQ(ierr);
277dd8e54a2SToby Isaac   PetscFunctionReturn(0);
278dd8e54a2SToby Isaac }
279dd8e54a2SToby Isaac 
280dd8e54a2SToby Isaac #undef __FUNCT__
281dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetAdjacencyDimension"
282dd8e54a2SToby Isaac PetscErrorCode DMForestSetAdjacencyDimension(DM dm, PetscInt adjDim)
283dd8e54a2SToby Isaac {
284dd8e54a2SToby Isaac   PetscInt        dim;
285dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
286dd8e54a2SToby Isaac   PetscErrorCode  ierr;
287dd8e54a2SToby Isaac 
288dd8e54a2SToby Isaac   PetscFunctionBegin;
289dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
290ef51cf95SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the adjacency dimension after setup");
291dd8e54a2SToby Isaac   if (adjDim < 0) SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_OUTOFRANGE,"adjacency dim cannot be < 0: %d", adjDim);
292dd8e54a2SToby Isaac   ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr);
293dd8e54a2SToby Isaac   if (adjDim > dim) SETERRQ2(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_OUTOFRANGE,"adjacency dim cannot be > %d: %d", dim, adjDim);
294dd8e54a2SToby Isaac   forest->adjDim = adjDim;
295dd8e54a2SToby Isaac   PetscFunctionReturn(0);
296dd8e54a2SToby Isaac }
297dd8e54a2SToby Isaac 
298dd8e54a2SToby Isaac #undef __FUNCT__
299dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetAdjacencyCodimension"
300dd8e54a2SToby Isaac PetscErrorCode DMForestSetAdjacencyCodimension(DM dm, PetscInt adjCodim)
301dd8e54a2SToby Isaac {
302dd8e54a2SToby Isaac   PetscInt        dim;
303dd8e54a2SToby Isaac   PetscErrorCode  ierr;
304dd8e54a2SToby Isaac 
305dd8e54a2SToby Isaac   PetscFunctionBegin;
306dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
307dd8e54a2SToby Isaac   ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr);
308dd8e54a2SToby Isaac   ierr = DMForestSetAdjacencyDimension(dm,dim-adjCodim);CHKERRQ(ierr);
309dd8e54a2SToby Isaac   PetscFunctionReturn(0);
310dd8e54a2SToby Isaac }
311dd8e54a2SToby Isaac 
312dd8e54a2SToby Isaac #undef __FUNCT__
313dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetAdjacencyDimension"
314dd8e54a2SToby Isaac PetscErrorCode DMForestGetAdjacencyDimension(DM dm, PetscInt *adjDim)
315dd8e54a2SToby Isaac {
316dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
317dd8e54a2SToby Isaac 
318dd8e54a2SToby Isaac   PetscFunctionBegin;
319dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
320dd8e54a2SToby Isaac   PetscValidIntPointer(adjDim,2);
321dd8e54a2SToby Isaac   *adjDim = forest->adjDim;
322dd8e54a2SToby Isaac   PetscFunctionReturn(0);
323dd8e54a2SToby Isaac }
324dd8e54a2SToby Isaac 
325dd8e54a2SToby Isaac #undef __FUNCT__
326dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetAdjacencyCodimension"
327dd8e54a2SToby Isaac PetscErrorCode DMForestGetAdjacencyCodimension(DM dm, PetscInt *adjCodim)
328dd8e54a2SToby Isaac {
329dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
330dd8e54a2SToby Isaac   PetscInt       dim;
331dd8e54a2SToby Isaac   PetscErrorCode ierr;
332dd8e54a2SToby Isaac 
333dd8e54a2SToby Isaac   PetscFunctionBegin;
334dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
335dd8e54a2SToby Isaac   PetscValidIntPointer(adjCodim,2);
336dd8e54a2SToby Isaac   ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr);
337dd8e54a2SToby Isaac   *adjCodim = dim - forest->adjDim;
338dd8e54a2SToby Isaac   PetscFunctionReturn(0);
339dd8e54a2SToby Isaac }
340dd8e54a2SToby Isaac 
341dd8e54a2SToby Isaac #undef __FUNCT__
342ef51cf95SToby Isaac #define __FUNCT__ "DMForestSetPartitionOverlap"
343dd8e54a2SToby Isaac PetscErrorCode DMForestSetPartitionOverlap(DM dm, PetscInt overlap)
344dd8e54a2SToby Isaac {
345dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
346dd8e54a2SToby Isaac 
347dd8e54a2SToby Isaac   PetscFunctionBegin;
348dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
349ef51cf95SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the overlap after setup");
350dd8e54a2SToby Isaac   if (overlap < 0) SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_OUTOFRANGE,"overlap cannot be < 0: %d", overlap);
351dd8e54a2SToby Isaac   forest->overlap = overlap;
352dd8e54a2SToby Isaac   PetscFunctionReturn(0);
353dd8e54a2SToby Isaac }
354dd8e54a2SToby Isaac 
355dd8e54a2SToby Isaac #undef __FUNCT__
356dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetPartitionOverlap"
357dd8e54a2SToby Isaac PetscErrorCode DMForestGetPartitionOverlap(DM dm, PetscInt *overlap)
358dd8e54a2SToby Isaac {
359dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
360dd8e54a2SToby Isaac 
361dd8e54a2SToby Isaac   PetscFunctionBegin;
362dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
363dd8e54a2SToby Isaac   PetscValidIntPointer(overlap,2);
364dd8e54a2SToby Isaac   *overlap = forest->overlap;
365dd8e54a2SToby Isaac   PetscFunctionReturn(0);
366dd8e54a2SToby Isaac }
367dd8e54a2SToby Isaac 
368dd8e54a2SToby Isaac #undef __FUNCT__
369dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetMinimumRefinement"
370dd8e54a2SToby Isaac PetscErrorCode DMForestSetMinimumRefinement(DM dm, PetscInt minRefinement)
371dd8e54a2SToby Isaac {
372dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
373dd8e54a2SToby Isaac 
374dd8e54a2SToby Isaac   PetscFunctionBegin;
375dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
376ef51cf95SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the minimum refinement after setup");
377dd8e54a2SToby Isaac   forest->minRefinement = minRefinement;
378dd8e54a2SToby Isaac   PetscFunctionReturn(0);
379dd8e54a2SToby Isaac }
380dd8e54a2SToby Isaac 
381dd8e54a2SToby Isaac #undef __FUNCT__
382dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetMinimumRefinement"
383dd8e54a2SToby Isaac PetscErrorCode DMForestGetMinimumRefinement(DM dm, PetscInt *minRefinement)
384dd8e54a2SToby Isaac {
385dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
386dd8e54a2SToby Isaac 
387dd8e54a2SToby Isaac   PetscFunctionBegin;
388dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
389dd8e54a2SToby Isaac   PetscValidIntPointer(minRefinement,2);
390dd8e54a2SToby Isaac   *minRefinement = forest->minRefinement;
391dd8e54a2SToby Isaac   PetscFunctionReturn(0);
392dd8e54a2SToby Isaac }
393dd8e54a2SToby Isaac 
394dd8e54a2SToby Isaac #undef __FUNCT__
39556ba9f64SToby Isaac #define __FUNCT__ "DMForestSetInitialRefinement"
39656ba9f64SToby Isaac PetscErrorCode DMForestSetInitialRefinement(DM dm, PetscInt initRefinement)
39756ba9f64SToby Isaac {
39856ba9f64SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
39956ba9f64SToby Isaac 
40056ba9f64SToby Isaac   PetscFunctionBegin;
40156ba9f64SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
40256ba9f64SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the initial refinement after setup");
40356ba9f64SToby Isaac   forest->initRefinement = initRefinement;
40456ba9f64SToby Isaac   PetscFunctionReturn(0);
40556ba9f64SToby Isaac }
40656ba9f64SToby Isaac 
40756ba9f64SToby Isaac #undef __FUNCT__
40856ba9f64SToby Isaac #define __FUNCT__ "DMForestGetInitialRefinement"
40956ba9f64SToby Isaac PetscErrorCode DMForestGetInitialRefinement(DM dm, PetscInt *initRefinement)
41056ba9f64SToby Isaac {
41156ba9f64SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
41256ba9f64SToby Isaac 
41356ba9f64SToby Isaac   PetscFunctionBegin;
41456ba9f64SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
41556ba9f64SToby Isaac   PetscValidIntPointer(initRefinement,2);
41656ba9f64SToby Isaac   *initRefinement = forest->initRefinement;
41756ba9f64SToby Isaac   PetscFunctionReturn(0);
41856ba9f64SToby Isaac }
41956ba9f64SToby Isaac 
42056ba9f64SToby Isaac #undef __FUNCT__
421c7eeac06SToby Isaac #define __FUNCT__ "DMForestSetMaximumRefinement"
422c7eeac06SToby Isaac PetscErrorCode DMForestSetMaximumRefinement(DM dm, PetscInt maxRefinement)
423dd8e54a2SToby Isaac {
424dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
425dd8e54a2SToby Isaac 
426dd8e54a2SToby Isaac   PetscFunctionBegin;
427dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
428ef51cf95SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the maximum refinement after setup");
429c7eeac06SToby Isaac   forest->maxRefinement = maxRefinement;
430dd8e54a2SToby Isaac   PetscFunctionReturn(0);
431dd8e54a2SToby Isaac }
432dd8e54a2SToby Isaac 
433dd8e54a2SToby Isaac #undef __FUNCT__
434c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetMaximumRefinement"
435c7eeac06SToby Isaac PetscErrorCode DMForestGetMaximumRefinement(DM dm, PetscInt *maxRefinement)
436dd8e54a2SToby Isaac {
437dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
438dd8e54a2SToby Isaac 
439dd8e54a2SToby Isaac   PetscFunctionBegin;
440dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
441c7eeac06SToby Isaac   PetscValidIntPointer(maxRefinement,2);
442c7eeac06SToby Isaac   *maxRefinement = forest->maxRefinement;
443dd8e54a2SToby Isaac   PetscFunctionReturn(0);
444dd8e54a2SToby Isaac }
445c7eeac06SToby Isaac 
446c7eeac06SToby Isaac #undef __FUNCT__
447c7eeac06SToby Isaac #define __FUNCT__ "DMForestSetAdaptivityStrategy"
448c7eeac06SToby Isaac PetscErrorCode DMForestSetAdaptivityStrategy(DM dm, DMForestAdaptivityStrategy adaptStrategy)
449c7eeac06SToby Isaac {
450c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
451c7eeac06SToby Isaac   PetscErrorCode ierr;
452c7eeac06SToby Isaac 
453c7eeac06SToby Isaac   PetscFunctionBegin;
454c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
455c7eeac06SToby Isaac   ierr = PetscFree(forest->adaptStrategy);CHKERRQ(ierr);
456a73e2921SToby Isaac   ierr = PetscStrallocpy((const char *) adaptStrategy,(char **)&forest->adaptStrategy);CHKERRQ(ierr);
457c7eeac06SToby Isaac   PetscFunctionReturn(0);
458c7eeac06SToby Isaac }
459c7eeac06SToby Isaac 
460c7eeac06SToby Isaac #undef __FUNCT__
461c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetAdaptivityStrategy"
462c7eeac06SToby Isaac PetscErrorCode DMForestGetAdaptivityStrategy(DM dm, DMForestAdaptivityStrategy *adaptStrategy)
463c7eeac06SToby Isaac {
464c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
465c7eeac06SToby Isaac 
466c7eeac06SToby Isaac   PetscFunctionBegin;
467c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
468c7eeac06SToby Isaac   PetscValidPointer(adaptStrategy,2);
469c7eeac06SToby Isaac   *adaptStrategy = forest->adaptStrategy;
470c7eeac06SToby Isaac   PetscFunctionReturn(0);
471c7eeac06SToby Isaac }
472c7eeac06SToby Isaac 
473c7eeac06SToby Isaac #undef __FUNCT__
474c7eeac06SToby Isaac #define __FUNCT__ "DMForestSetGradeFactor"
475c7eeac06SToby Isaac PetscErrorCode DMForestSetGradeFactor(DM dm, PetscInt grade)
476c7eeac06SToby Isaac {
477c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
478c7eeac06SToby Isaac 
479c7eeac06SToby Isaac   PetscFunctionBegin;
480c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
481ef51cf95SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the grade factor after setup");
482c7eeac06SToby Isaac   forest->gradeFactor = grade;
483c7eeac06SToby Isaac   PetscFunctionReturn(0);
484c7eeac06SToby Isaac }
485c7eeac06SToby Isaac 
486c7eeac06SToby Isaac #undef __FUNCT__
487c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetGradeFactor"
488c7eeac06SToby Isaac PetscErrorCode DMForestGetGradeFactor(DM dm, PetscInt *grade)
489c7eeac06SToby Isaac {
490c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
491c7eeac06SToby Isaac 
492c7eeac06SToby Isaac   PetscFunctionBegin;
493c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
494c7eeac06SToby Isaac   PetscValidIntPointer(grade,2);
495c7eeac06SToby Isaac   *grade = forest->gradeFactor;
496c7eeac06SToby Isaac   PetscFunctionReturn(0);
497c7eeac06SToby Isaac }
498c7eeac06SToby Isaac 
499c7eeac06SToby Isaac #undef __FUNCT__
500ef51cf95SToby Isaac #define __FUNCT__ "DMForestSetCellWeightFactor"
501ef51cf95SToby Isaac PetscErrorCode DMForestSetCellWeightFactor(DM dm, PetscReal weightsFactor)
502c7eeac06SToby Isaac {
503c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
504c7eeac06SToby Isaac 
505c7eeac06SToby Isaac   PetscFunctionBegin;
506c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
507ef51cf95SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the weights factor after setup");
508c7eeac06SToby Isaac   forest->weightsFactor = weightsFactor;
509c7eeac06SToby Isaac   PetscFunctionReturn(0);
510c7eeac06SToby Isaac }
511c7eeac06SToby Isaac 
512c7eeac06SToby Isaac #undef __FUNCT__
513ef51cf95SToby Isaac #define __FUNCT__ "DMForestGetCellWeightFactor"
514ef51cf95SToby Isaac PetscErrorCode DMForestGetCellWeightFactor(DM dm, PetscReal *weightsFactor)
515c7eeac06SToby Isaac {
516c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
517c7eeac06SToby Isaac 
518c7eeac06SToby Isaac   PetscFunctionBegin;
519c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
520c7eeac06SToby Isaac   PetscValidRealPointer(weightsFactor,2);
521c7eeac06SToby Isaac   *weightsFactor = forest->weightsFactor;
522c7eeac06SToby Isaac   PetscFunctionReturn(0);
523c7eeac06SToby Isaac }
524c7eeac06SToby Isaac 
525c7eeac06SToby Isaac #undef __FUNCT__
526c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetCellChart"
527c7eeac06SToby Isaac PetscErrorCode DMForestGetCellChart(DM dm, PetscInt *cStart, PetscInt *cEnd)
528c7eeac06SToby Isaac {
529c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
530c7eeac06SToby Isaac   PetscErrorCode ierr;
531c7eeac06SToby Isaac 
532c7eeac06SToby Isaac   PetscFunctionBegin;
533c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
534c7eeac06SToby Isaac   PetscValidIntPointer(cStart,2);
535c7eeac06SToby Isaac   PetscValidIntPointer(cEnd,2);
536c7eeac06SToby Isaac   if (((forest->cStart == PETSC_DETERMINE) || (forest->cEnd == PETSC_DETERMINE)) && forest->createcellchart) {
537c7eeac06SToby Isaac     ierr = forest->createcellchart(dm,&forest->cStart,&forest->cEnd);CHKERRQ(ierr);
538c7eeac06SToby Isaac   }
539c7eeac06SToby Isaac   *cStart =  forest->cStart;
540c7eeac06SToby Isaac   *cEnd   =  forest->cEnd;
541c7eeac06SToby Isaac   PetscFunctionReturn(0);
542c7eeac06SToby Isaac }
543c7eeac06SToby Isaac 
544c7eeac06SToby Isaac #undef __FUNCT__
545c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetCellSF"
546c7eeac06SToby Isaac PetscErrorCode DMForestGetCellSF(DM dm, PetscSF *cellSF)
547c7eeac06SToby Isaac {
548c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
549c7eeac06SToby Isaac   PetscErrorCode ierr;
550c7eeac06SToby Isaac 
551c7eeac06SToby Isaac   PetscFunctionBegin;
552c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
553c7eeac06SToby Isaac   PetscValidPointer(cellSF,2);
554c7eeac06SToby Isaac   if ((!forest->cellSF) && forest->createcellsf) {
555c7eeac06SToby Isaac     ierr = forest->createcellsf(dm,&forest->cellSF);CHKERRQ(ierr);
556c7eeac06SToby Isaac   }
557c7eeac06SToby Isaac   *cellSF = forest->cellSF;
558c7eeac06SToby Isaac   PetscFunctionReturn(0);
559c7eeac06SToby Isaac }
560c7eeac06SToby Isaac 
561c7eeac06SToby Isaac #undef __FUNCT__
562*ebdf65a2SToby Isaac #define __FUNCT__ "DMForestSetAdaptivityLabel"
563*ebdf65a2SToby Isaac PetscErrorCode DMForestSetAdaptivityLabel(DM dm, const char * adaptLabel)
564c7eeac06SToby Isaac {
565c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
566c7eeac06SToby Isaac   PetscErrorCode ierr;
567c7eeac06SToby Isaac 
568c7eeac06SToby Isaac   PetscFunctionBegin;
569c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
570*ebdf65a2SToby Isaac   ierr = PetscFree(forest->adaptLabel);CHKERRQ(ierr);
571*ebdf65a2SToby Isaac   ierr = PetscStrallocpy(adaptLabel,&forest->adaptLabel);CHKERRQ(ierr);
572c7eeac06SToby Isaac   PetscFunctionReturn(0);
573c7eeac06SToby Isaac }
574c7eeac06SToby Isaac 
575c7eeac06SToby Isaac #undef __FUNCT__
576*ebdf65a2SToby Isaac #define __FUNCT__ "DMForestGetAdaptivityLabel"
577*ebdf65a2SToby Isaac PetscErrorCode DMForestGetAdaptivityLabel(DM dm, DMLabel *label)
578c7eeac06SToby Isaac {
579c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
580*ebdf65a2SToby Isaac   PetscErrorCode ierr;
581c7eeac06SToby Isaac 
582c7eeac06SToby Isaac   PetscFunctionBegin;
583c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
584*ebdf65a2SToby Isaac   if (forest->adaptLabel) {
585*ebdf65a2SToby Isaac     ierr = DMGetLabel(dm,forest->adaptLabel,label);CHKERRQ(ierr);
586*ebdf65a2SToby Isaac   }
587*ebdf65a2SToby Isaac   else {
588*ebdf65a2SToby Isaac     *label = NULL;
589*ebdf65a2SToby Isaac   }
590c7eeac06SToby Isaac   PetscFunctionReturn(0);
591c7eeac06SToby Isaac }
592c7eeac06SToby Isaac 
593c7eeac06SToby Isaac #undef __FUNCT__
594c7eeac06SToby Isaac #define __FUNCT__ "DMForestSetCellWeights"
595c7eeac06SToby Isaac PetscErrorCode DMForestSetCellWeights(DM dm, PetscReal weights[], PetscCopyMode copyMode)
596c7eeac06SToby Isaac {
597c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
598c7eeac06SToby Isaac   PetscInt       cStart, cEnd;
599c7eeac06SToby Isaac   PetscErrorCode ierr;
600c7eeac06SToby Isaac 
601c7eeac06SToby Isaac   PetscFunctionBegin;
602c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
603c7eeac06SToby Isaac   ierr = DMForestGetCellChart(dm,&cStart,&cEnd);CHKERRQ(ierr);
604c7eeac06SToby Isaac   if (cEnd < cStart) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"cell chart [%d,%d) is not valid",cStart,cEnd);
605c7eeac06SToby Isaac   if (copyMode == PETSC_COPY_VALUES) {
606c7eeac06SToby Isaac     if (forest->cellWeightsCopyMode != PETSC_OWN_POINTER || forest->cellWeights == weights) {
607c7eeac06SToby Isaac       ierr = PetscMalloc1(cEnd-cStart,&forest->cellWeights);CHKERRQ(ierr);
608c7eeac06SToby Isaac     }
609c7eeac06SToby Isaac     ierr = PetscMemcpy(forest->cellWeights,weights,(cEnd-cStart)*sizeof(*weights));CHKERRQ(ierr);
610c7eeac06SToby Isaac     forest->cellWeightsCopyMode = PETSC_OWN_POINTER;
611c7eeac06SToby Isaac     PetscFunctionReturn(0);
612c7eeac06SToby Isaac   }
613c7eeac06SToby Isaac   if (forest->cellWeightsCopyMode == PETSC_OWN_POINTER) {
614c7eeac06SToby Isaac     ierr = PetscFree(forest->cellWeights);CHKERRQ(ierr);
615c7eeac06SToby Isaac   }
616c7eeac06SToby Isaac   forest->cellWeights  = weights;
617c7eeac06SToby Isaac   forest->cellWeightsCopyMode = copyMode;
618c7eeac06SToby Isaac   PetscFunctionReturn(0);
619c7eeac06SToby Isaac }
620c7eeac06SToby Isaac 
621c7eeac06SToby Isaac #undef __FUNCT__
622c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetCellWeights"
623c7eeac06SToby Isaac PetscErrorCode DMForestGetCellWeights(DM dm, PetscReal **weights)
624c7eeac06SToby Isaac {
625c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
626c7eeac06SToby Isaac 
627c7eeac06SToby Isaac   PetscFunctionBegin;
628c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
629c7eeac06SToby Isaac   PetscValidPointer(weights,2);
630c7eeac06SToby Isaac   *weights = forest->cellWeights;
631c7eeac06SToby Isaac   PetscFunctionReturn(0);
632c7eeac06SToby Isaac }
633c7eeac06SToby Isaac 
634c7eeac06SToby Isaac #undef __FUNCT__
635c7eeac06SToby Isaac #define __FUNCT__ "DMForestSetWeightCapacity"
636c7eeac06SToby Isaac PetscErrorCode DMForestSetWeightCapacity(DM dm, PetscReal capacity)
637c7eeac06SToby Isaac {
638c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
639c7eeac06SToby Isaac 
640c7eeac06SToby Isaac   PetscFunctionBegin;
641c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
642ef51cf95SToby Isaac   if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the weight capacity after setup");
643c7eeac06SToby Isaac   if (capacity < 0.) SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_OUTOFRANGE,"Cannot have negative weight capacity; %f",capacity);
644c7eeac06SToby Isaac   forest->weightCapacity = capacity;
645c7eeac06SToby Isaac   PetscFunctionReturn(0);
646c7eeac06SToby Isaac }
647c7eeac06SToby Isaac 
648c7eeac06SToby Isaac #undef __FUNCT__
649c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetWeightCapacity"
650c7eeac06SToby Isaac PetscErrorCode DMForestGetWeightCapacity(DM dm, PetscReal *capacity)
651c7eeac06SToby Isaac {
652c7eeac06SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
653c7eeac06SToby Isaac 
654c7eeac06SToby Isaac   PetscFunctionBegin;
655c7eeac06SToby Isaac   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
656c7eeac06SToby Isaac   PetscValidRealPointer(capacity,2);
657c7eeac06SToby Isaac   *capacity = forest->weightCapacity;
658c7eeac06SToby Isaac   PetscFunctionReturn(0);
659c7eeac06SToby Isaac }
660c7eeac06SToby Isaac 
661dd8e54a2SToby Isaac #undef __FUNCT__
662db4d5e8cSToby Isaac #define __FUNCT__ "DMSetFromOptions_Forest"
6630709b2feSToby Isaac PETSC_EXTERN PetscErrorCode DMSetFromOptions_Forest(PetscOptionItems *PetscOptionsObject,DM dm)
664db4d5e8cSToby Isaac {
665db4d5e8cSToby Isaac   DM_Forest                  *forest = (DM_Forest *) dm->data;
66656ba9f64SToby Isaac   PetscBool                  flg, flg1, flg2, flg3, flg4;
667dd8e54a2SToby Isaac   DMForestTopology           oldTopo;
668c7eeac06SToby Isaac   char                       stringBuffer[256];
669dd8e54a2SToby Isaac   PetscViewer                viewer;
670dd8e54a2SToby Isaac   PetscViewerFormat          format;
67156ba9f64SToby Isaac   PetscInt                   adjDim, adjCodim, overlap, minRefinement, initRefinement, maxRefinement, grade;
672c7eeac06SToby Isaac   PetscReal                  weightsFactor;
673c7eeac06SToby Isaac   DMForestAdaptivityStrategy adaptStrategy;
674db4d5e8cSToby Isaac   PetscErrorCode             ierr;
675db4d5e8cSToby Isaac 
676db4d5e8cSToby Isaac   PetscFunctionBegin;
677db4d5e8cSToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
678db4d5e8cSToby Isaac   forest->setFromOptions = PETSC_TRUE;
679dd8e54a2SToby Isaac   ierr = DMForestGetTopology(dm, &oldTopo);CHKERRQ(ierr);
680a3eda1eaSToby Isaac   ierr = PetscOptionsHead(PetscOptionsObject,"DMForest Options");CHKERRQ(ierr);
68156ba9f64SToby Isaac   ierr = PetscOptionsString("-dm_forest_topology","the topology of the forest's base mesh","DMForestSetTopology",oldTopo,stringBuffer,256,&flg1);CHKERRQ(ierr);
68256ba9f64SToby Isaac   ierr = PetscOptionsViewer("-dm_forest_base_dm","load the base DM from a viewer specification","DMForestSetBaseDM",&viewer,&format,&flg2);CHKERRQ(ierr);
68356ba9f64SToby Isaac   ierr = PetscOptionsViewer("-dm_forest_coarse_forest","load the coarse forest from a viewer specification","DMForestSetCoarseForest",&viewer,&format,&flg3);CHKERRQ(ierr);
68456ba9f64SToby Isaac   ierr = PetscOptionsViewer("-dm_forest_fine_forest","load the fine forest from a viewer specification","DMForestSetFineForest",&viewer,&format,&flg4);CHKERRQ(ierr);
68556ba9f64SToby Isaac   if ((PetscInt) flg1 + (PetscInt) flg2 + (PetscInt) flg3 + (PetscInt) flg4 > 1) {
68656ba9f64SToby Isaac     SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_INCOMP,"Specify only one of -dm_forest_{topology,base_dm,coarse_forest,fine_forest}");
687dd8e54a2SToby Isaac   }
68856ba9f64SToby Isaac   if (flg1) {
68956ba9f64SToby Isaac     ierr = DMForestSetTopology(dm,(DMForestTopology)stringBuffer);CHKERRQ(ierr);
69056ba9f64SToby Isaac     ierr = DMForestSetBaseDM(dm,NULL);CHKERRQ(ierr);
69156ba9f64SToby Isaac     ierr = DMForestSetCoarseForest(dm,NULL);CHKERRQ(ierr);
69256ba9f64SToby Isaac     ierr = DMForestSetFineForest(dm,NULL);CHKERRQ(ierr);
69356ba9f64SToby Isaac   }
69456ba9f64SToby Isaac   if (flg2) {
695dd8e54a2SToby Isaac     DM         base;
696dd8e54a2SToby Isaac 
697dd8e54a2SToby Isaac     ierr = DMCreate(PetscObjectComm((PetscObject)dm),&base);CHKERRQ(ierr);
698dd8e54a2SToby Isaac     ierr = PetscViewerPushFormat(viewer,format);CHKERRQ(ierr);
699dd8e54a2SToby Isaac     ierr = DMLoad(base,viewer);CHKERRQ(ierr);
700dd8e54a2SToby Isaac     ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
701dd8e54a2SToby Isaac     ierr = DMForestSetBaseDM(dm,base);CHKERRQ(ierr);
702dd8e54a2SToby Isaac     ierr = DMDestroy(&base);CHKERRQ(ierr);
70356ba9f64SToby Isaac     ierr = DMForestSetTopology(dm,NULL);CHKERRQ(ierr);
70456ba9f64SToby Isaac     ierr = DMForestSetCoarseForest(dm,NULL);CHKERRQ(ierr);
70556ba9f64SToby Isaac     ierr = DMForestSetFineForest(dm,NULL);CHKERRQ(ierr);
706dd8e54a2SToby Isaac   }
70756ba9f64SToby Isaac   if (flg3) {
708dd8e54a2SToby Isaac     DM         coarse;
709dd8e54a2SToby Isaac 
710dd8e54a2SToby Isaac     ierr = DMCreate(PetscObjectComm((PetscObject)dm),&coarse);CHKERRQ(ierr);
711dd8e54a2SToby Isaac     ierr = PetscViewerPushFormat(viewer,format);CHKERRQ(ierr);
712dd8e54a2SToby Isaac     ierr = DMLoad(coarse,viewer);CHKERRQ(ierr);
713dd8e54a2SToby Isaac     ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
714dd8e54a2SToby Isaac     ierr = DMForestSetCoarseForest(dm,coarse);CHKERRQ(ierr);
715dd8e54a2SToby Isaac     ierr = DMDestroy(&coarse);CHKERRQ(ierr);
71656ba9f64SToby Isaac     ierr = DMForestSetTopology(dm,NULL);CHKERRQ(ierr);
71756ba9f64SToby Isaac     ierr = DMForestSetBaseDM(dm,NULL);CHKERRQ(ierr);
71856ba9f64SToby Isaac     ierr = DMForestSetFineForest(dm,NULL);CHKERRQ(ierr);
719dd8e54a2SToby Isaac   }
72056ba9f64SToby Isaac   if (flg4) {
721dd8e54a2SToby Isaac     DM         fine;
722dd8e54a2SToby Isaac 
723dd8e54a2SToby Isaac     ierr = DMCreate(PetscObjectComm((PetscObject)dm),&fine);CHKERRQ(ierr);
724dd8e54a2SToby Isaac     ierr = PetscViewerPushFormat(viewer,format);CHKERRQ(ierr);
725dd8e54a2SToby Isaac     ierr = DMLoad(fine,viewer);CHKERRQ(ierr);
726dd8e54a2SToby Isaac     ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
727dd8e54a2SToby Isaac     ierr = DMForestSetFineForest(dm,fine);CHKERRQ(ierr);
728dd8e54a2SToby Isaac     ierr = DMDestroy(&fine);CHKERRQ(ierr);
72956ba9f64SToby Isaac     ierr = DMForestSetTopology(dm,NULL);CHKERRQ(ierr);
73056ba9f64SToby Isaac     ierr = DMForestSetBaseDM(dm,NULL);CHKERRQ(ierr);
73156ba9f64SToby Isaac     ierr = DMForestSetCoarseForest(dm,NULL);CHKERRQ(ierr);
732dd8e54a2SToby Isaac   }
733dd8e54a2SToby Isaac   ierr = DMForestGetAdjacencyDimension(dm,&adjDim);CHKERRQ(ierr);
734dd8e54a2SToby Isaac   ierr = PetscOptionsInt("-dm_forest_adjacency_dimension","set the dimension of points that define adjacency in the forest","DMForestSetAdjacencyDimension",adjDim,&adjDim,&flg);CHKERRQ(ierr);
735dd8e54a2SToby Isaac   if (flg) {
736dd8e54a2SToby Isaac     ierr = DMForestSetAdjacencyDimension(dm,adjDim);CHKERRQ(ierr);
737dd8e54a2SToby Isaac   }
738dd8e54a2SToby Isaac   else {
739dd8e54a2SToby Isaac     ierr = DMForestGetAdjacencyCodimension(dm,&adjCodim);CHKERRQ(ierr);
740dd8e54a2SToby Isaac     ierr = PetscOptionsInt("-dm_forest_adjacency_codimension","set the codimension of points that define adjacency in the forest","DMForestSetAdjacencyCodimension",adjCodim,&adjCodim,&flg);CHKERRQ(ierr);
741dd8e54a2SToby Isaac     if (flg) {
742dd8e54a2SToby Isaac       ierr = DMForestSetAdjacencyCodimension(dm,adjCodim);CHKERRQ(ierr);
743dd8e54a2SToby Isaac     }
744dd8e54a2SToby Isaac   }
745dd8e54a2SToby Isaac   ierr = DMForestGetPartitionOverlap(dm,&overlap);CHKERRQ(ierr);
746dd8e54a2SToby Isaac   ierr = PetscOptionsInt("-dm_forest_partition_overlap","set the degree of partition overlap","DMForestSetPartitionOverlap",overlap,&overlap,&flg);CHKERRQ(ierr);
747dd8e54a2SToby Isaac   if (flg) {
748dd8e54a2SToby Isaac     ierr = DMForestSetPartitionOverlap(dm,overlap);CHKERRQ(ierr);
749dd8e54a2SToby Isaac   }
750a6121fbdSMatthew G. Knepley #if 0
751a6121fbdSMatthew 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);
752a6121fbdSMatthew G. Knepley   if (flg) {
753a6121fbdSMatthew G. Knepley     ierr = DMForestSetMinimumRefinement(dm,minRefinement);CHKERRQ(ierr);
754a6121fbdSMatthew G. Knepley     ierr = DMForestSetInitialRefinement(dm,minRefinement);CHKERRQ(ierr);
755a6121fbdSMatthew G. Knepley   }
756a6121fbdSMatthew 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);
757a6121fbdSMatthew G. Knepley   if (flg) {
758a6121fbdSMatthew G. Knepley     ierr = DMForestSetMinimumRefinement(dm,0);CHKERRQ(ierr);
759a6121fbdSMatthew G. Knepley     ierr = DMForestSetInitialRefinement(dm,initRefinement);CHKERRQ(ierr);
760a6121fbdSMatthew G. Knepley   }
761a6121fbdSMatthew G. Knepley #endif
762dd8e54a2SToby Isaac   ierr = DMForestGetMinimumRefinement(dm,&minRefinement);CHKERRQ(ierr);
763dd8e54a2SToby Isaac   ierr = PetscOptionsInt("-dm_forest_minimum_refinement","set the minimum level of refinement in the forest","DMForestSetMinimumRefinement",minRefinement,&minRefinement,&flg);CHKERRQ(ierr);
764dd8e54a2SToby Isaac   if (flg) {
765dd8e54a2SToby Isaac     ierr = DMForestSetMinimumRefinement(dm,minRefinement);CHKERRQ(ierr);
766db4d5e8cSToby Isaac   }
76756ba9f64SToby Isaac   ierr = DMForestGetInitialRefinement(dm,&initRefinement);CHKERRQ(ierr);
76856ba9f64SToby Isaac   ierr = PetscOptionsInt("-dm_forest_initial_refinement","set the initial level of refinement in the forest","DMForestSetInitialRefinement",initRefinement,&initRefinement,&flg);CHKERRQ(ierr);
76956ba9f64SToby Isaac   if (flg) {
77056ba9f64SToby Isaac     ierr = DMForestSetInitialRefinement(dm,initRefinement);CHKERRQ(ierr);
77156ba9f64SToby Isaac   }
772c7eeac06SToby Isaac   ierr = DMForestGetMaximumRefinement(dm,&maxRefinement);CHKERRQ(ierr);
773c7eeac06SToby Isaac   ierr = PetscOptionsInt("-dm_forest_maximum_refinement","set the maximum level of refinement in the forest","DMForestSetMaximumRefinement",maxRefinement,&maxRefinement,&flg);CHKERRQ(ierr);
774c7eeac06SToby Isaac   if (flg) {
775c7eeac06SToby Isaac     ierr = DMForestSetMaximumRefinement(dm,maxRefinement);CHKERRQ(ierr);
776c7eeac06SToby Isaac   }
777c7eeac06SToby Isaac   ierr = DMForestGetAdaptivityStrategy(dm,&adaptStrategy);CHKERRQ(ierr);
778c7eeac06SToby Isaac   ierr = PetscOptionsString("-dm_forest_adaptivity_strategy","the forest's adaptivity-flag resolution strategy","DMForestSetAdaptivityStrategy",adaptStrategy,stringBuffer,256,&flg);CHKERRQ(ierr);
779c7eeac06SToby Isaac   if (flg) {
780c7eeac06SToby Isaac     ierr = DMForestSetAdaptivityStrategy(dm,(DMForestAdaptivityStrategy)stringBuffer);CHKERRQ(ierr);
781c7eeac06SToby Isaac   }
782c7eeac06SToby Isaac   ierr = DMForestGetGradeFactor(dm,&grade);CHKERRQ(ierr);
783c7eeac06SToby Isaac   ierr = PetscOptionsInt("-dm_forest_grade_factor","grade factor between neighboring cells","DMForestSetGradeFactor",grade,&grade,&flg);CHKERRQ(ierr);
784c7eeac06SToby Isaac   if (flg) {
785c7eeac06SToby Isaac     ierr = DMForestSetGradeFactor(dm,grade);CHKERRQ(ierr);
786c7eeac06SToby Isaac   }
787c7eeac06SToby Isaac   ierr = DMForestGetCellWeightFactor(dm,&weightsFactor);CHKERRQ(ierr);
788c7eeac06SToby Isaac   ierr = PetscOptionsReal("-dm_forest_cell_weight_factor","multiplying weight factor for cell refinement","DMForestSetCellWeightFactor",weightsFactor,&weightsFactor,&flg);CHKERRQ(ierr);
789c7eeac06SToby Isaac   if (flg) {
790c7eeac06SToby Isaac     ierr = DMForestSetCellWeightFactor(dm,weightsFactor);CHKERRQ(ierr);
791c7eeac06SToby Isaac   }
792db4d5e8cSToby Isaac   ierr = PetscOptionsTail();CHKERRQ(ierr);
793db4d5e8cSToby Isaac   PetscFunctionReturn(0);
794db4d5e8cSToby Isaac }
795db4d5e8cSToby Isaac 
796db4d5e8cSToby Isaac #undef __FUNCT__
797d8984e3bSMatthew G. Knepley #define __FUNCT__ "DMCreateSubDM_Forest"
798d8984e3bSMatthew G. Knepley PetscErrorCode DMCreateSubDM_Forest(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm)
799d8984e3bSMatthew G. Knepley {
800d8984e3bSMatthew G. Knepley   PetscErrorCode ierr;
801d8984e3bSMatthew G. Knepley 
802d8984e3bSMatthew G. Knepley   PetscFunctionBegin;
803d8984e3bSMatthew G. Knepley   if (subdm) {ierr = DMClone(dm, subdm);CHKERRQ(ierr);}
804d8984e3bSMatthew G. Knepley   ierr = DMCreateSubDM_Section_Private(dm, numFields, fields, is, subdm);CHKERRQ(ierr);
805d8984e3bSMatthew G. Knepley   PetscFunctionReturn(0);
806d8984e3bSMatthew G. Knepley }
807d8984e3bSMatthew G. Knepley 
808d8984e3bSMatthew G. Knepley #undef __FUNCT__
809d222f98bSToby Isaac #define __FUNCT__ "DMInitialize_Forest"
810d222f98bSToby Isaac static PetscErrorCode DMInitialize_Forest(DM dm)
811d222f98bSToby Isaac {
812d222f98bSToby Isaac   PetscErrorCode ierr;
813d222f98bSToby Isaac 
814d222f98bSToby Isaac   PetscFunctionBegin;
815d222f98bSToby Isaac   ierr = PetscMemzero(dm->ops,sizeof(*(dm->ops)));CHKERRQ(ierr);
816d222f98bSToby Isaac 
817d222f98bSToby Isaac   dm->ops->clone          = DMClone_Forest;
818d222f98bSToby Isaac   dm->ops->setfromoptions = DMSetFromOptions_Forest;
819d222f98bSToby Isaac   dm->ops->destroy        = DMDestroy_Forest;
820d8984e3bSMatthew G. Knepley   dm->ops->createsubdm    = DMCreateSubDM_Forest;
821d222f98bSToby Isaac   PetscFunctionReturn(0);
822d222f98bSToby Isaac }
823d222f98bSToby Isaac 
824d222f98bSToby Isaac #undef __FUNCT__
825db4d5e8cSToby Isaac #define __FUNCT__ "DMCreate_Forest"
826db4d5e8cSToby Isaac PETSC_EXTERN PetscErrorCode DMCreate_Forest(DM dm)
827db4d5e8cSToby Isaac {
828db4d5e8cSToby Isaac   DM_Forest      *forest;
829db4d5e8cSToby Isaac   PetscErrorCode ierr;
830db4d5e8cSToby Isaac 
831db4d5e8cSToby Isaac   PetscFunctionBegin;
832db4d5e8cSToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
833db4d5e8cSToby Isaac   ierr                        = PetscNewLog(dm,&forest);CHKERRQ(ierr);
834db4d5e8cSToby Isaac   dm->dim                     = 0;
835db4d5e8cSToby Isaac   dm->data                    = forest;
836db4d5e8cSToby Isaac   forest->refct               = 1;
837db4d5e8cSToby Isaac   forest->data                = NULL;
838dd8e54a2SToby Isaac   forest->setFromOptions      = PETSC_FALSE;
839db4d5e8cSToby Isaac   forest->topology            = NULL;
840db4d5e8cSToby Isaac   forest->base                = NULL;
841db4d5e8cSToby Isaac   forest->adjDim              = PETSC_DEFAULT;
842db4d5e8cSToby Isaac   forest->overlap             = PETSC_DEFAULT;
843db4d5e8cSToby Isaac   forest->minRefinement       = PETSC_DEFAULT;
844db4d5e8cSToby Isaac   forest->maxRefinement       = PETSC_DEFAULT;
84556ba9f64SToby Isaac   forest->initRefinement      = PETSC_DEFAULT;
846c7eeac06SToby Isaac   forest->cStart              = PETSC_DETERMINE;
847c7eeac06SToby Isaac   forest->cEnd                = PETSC_DETERMINE;
848db4d5e8cSToby Isaac   forest->cellSF              = 0;
849*ebdf65a2SToby Isaac   forest->adaptLabel          = NULL;
850db4d5e8cSToby Isaac   forest->gradeFactor         = 2;
851db4d5e8cSToby Isaac   forest->cellWeights         = NULL;
852db4d5e8cSToby Isaac   forest->cellWeightsCopyMode = PETSC_USE_POINTER;
853db4d5e8cSToby Isaac   forest->weightsFactor       = 1.;
854db4d5e8cSToby Isaac   forest->weightCapacity      = 1.;
855a73e2921SToby Isaac   ierr = DMForestSetAdaptivityStrategy(dm,DMFORESTADAPTALL);CHKERRQ(ierr);
856d222f98bSToby Isaac   ierr = DMInitialize_Forest(dm);CHKERRQ(ierr);
857db4d5e8cSToby Isaac   PetscFunctionReturn(0);
858db4d5e8cSToby Isaac }
859db4d5e8cSToby Isaac 
860