xref: /petsc/src/dm/impls/forest/forest.c (revision dd8e54a282f003ea2417b4268b52ab701d4c1fa1)
1db4d5e8cSToby Isaac #include <petsc-private/dmforestimpl.h>
2db4d5e8cSToby Isaac #include <petsc-private/dmimpl.h>
3db4d5e8cSToby Isaac #include <petscsf.h>                     /*I "petscsf.h" */
4db4d5e8cSToby Isaac 
5db4d5e8cSToby Isaac #undef __FUNCT__
6db4d5e8cSToby Isaac #define __FUNCT__ "DMClone_Forest"
7db4d5e8cSToby Isaac PETSC_EXTERN PetscErrorCode DMClone_Forest(DM dm, DM *newdm)
8db4d5e8cSToby Isaac {
9db4d5e8cSToby Isaac   DM_Forest        *forest = (DM_Forest *) dm->data;
10db4d5e8cSToby Isaac   const char       *type;
11db4d5e8cSToby Isaac   PetscErrorCode ierr;
12db4d5e8cSToby Isaac 
13db4d5e8cSToby Isaac   PetscFunctionBegin;
14db4d5e8cSToby Isaac   forest->refct++;
15db4d5e8cSToby Isaac   (*newdm)->data = forest;
16db4d5e8cSToby Isaac   ierr = PetscObjectGetType((PetscObject) dm, &type);CHKERRQ(ierr);
17db4d5e8cSToby Isaac   ierr = PetscObjectChangeTypeName((PetscObject) *newdm, type);CHKERRQ(ierr);
18db4d5e8cSToby Isaac   PetscFunctionReturn(0);
19db4d5e8cSToby Isaac }
20db4d5e8cSToby Isaac 
21db4d5e8cSToby Isaac #undef __FUNCT__
22db4d5e8cSToby Isaac #define __FUNCT__ "DMDestroy_Forest"
23db4d5e8cSToby Isaac PetscErrorCode DMDestroy_Forest(DM dm)
24db4d5e8cSToby Isaac {
25db4d5e8cSToby Isaac   DM_Forest     *forest = (DM_Forest*) dm->data;
26db4d5e8cSToby Isaac   PetscErrorCode ierr;
27db4d5e8cSToby Isaac 
28db4d5e8cSToby Isaac   PetscFunctionBegin;
29db4d5e8cSToby Isaac   if (--forest->refct > 0) PetscFunctionReturn(0);
30db4d5e8cSToby Isaac   ierr = PetscSFDestroy(&forest->cellSF);CHKERRQ(ierr);
31db4d5e8cSToby Isaac   if (forest->adaptCopyMode == PETSC_OWN_POINTER) {
32db4d5e8cSToby Isaac     ierr = PetscFree(forest->adaptMarkers);CHKERRQ(ierr);
33db4d5e8cSToby Isaac   }
34db4d5e8cSToby Isaac   if (forest->cellWeightsCopyMode == PETSC_OWN_POINTER) {
35db4d5e8cSToby Isaac     ierr = PetscFree(forest->cellWeights);CHKERRQ(ierr);
36db4d5e8cSToby Isaac   }
37db4d5e8cSToby Isaac   PetscFunctionReturn(0);
38db4d5e8cSToby Isaac }
39db4d5e8cSToby Isaac 
40db4d5e8cSToby Isaac #undef __FUNCT__
41*dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetTopology"
42*dd8e54a2SToby Isaac PetscErrorCode DMForestSetTopology(DM dm, DMForestTopology topology)
43db4d5e8cSToby Isaac {
44db4d5e8cSToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
45db4d5e8cSToby Isaac   PetscErrorCode ierr;
46db4d5e8cSToby Isaac 
47db4d5e8cSToby Isaac   PetscFunctionBegin;
48db4d5e8cSToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
49*dd8e54a2SToby Isaac   if (forest->setup) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the topology after setup");
50*dd8e54a2SToby Isaac   ierr = PetscFree(forest->topology);CHKERRQ(ierr);
51*dd8e54a2SToby Isaac   ierr = PetscStrallocpy((const char *)topology,(char **) &forest->topology);CHKERRQ(ierr);
52db4d5e8cSToby Isaac   PetscFunctionReturn(0);
53db4d5e8cSToby Isaac }
54db4d5e8cSToby Isaac 
55db4d5e8cSToby Isaac #undef __FUNCT__
56*dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetTopology"
57*dd8e54a2SToby Isaac PetscErrorCode DMForestGetTopology(DM dm, DMForestTopology *topology)
58*dd8e54a2SToby Isaac {
59*dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
60*dd8e54a2SToby Isaac 
61*dd8e54a2SToby Isaac   PetscFunctionBegin;
62*dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
63*dd8e54a2SToby Isaac   PetscValidPointer(topology,2);
64*dd8e54a2SToby Isaac   *topology = forest->topology;
65*dd8e54a2SToby Isaac   PetscFunctionReturn(0);
66*dd8e54a2SToby Isaac }
67*dd8e54a2SToby Isaac 
68*dd8e54a2SToby Isaac #undef __FUNCT__
69*dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetBaseDM"
70*dd8e54a2SToby Isaac PetscErrorCode DMForestSetBaseDM(DM dm, DM base)
71*dd8e54a2SToby Isaac {
72*dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
73*dd8e54a2SToby Isaac   PetscInt       dim, dimEmbed;
74*dd8e54a2SToby Isaac   PetscErrorCode ierr;
75*dd8e54a2SToby Isaac 
76*dd8e54a2SToby Isaac   PetscFunctionBegin;
77*dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
78*dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 2);
79*dd8e54a2SToby Isaac   if (forest->setup) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the base after setup");
80*dd8e54a2SToby Isaac   ierr = PetscObjectReference((PetscObject)base);CHKERRQ(ierr);
81*dd8e54a2SToby Isaac   ierr = DMDestroy(&forest->base);CHKERRQ(ierr);
82*dd8e54a2SToby Isaac   forest->base = base;
83*dd8e54a2SToby Isaac   ierr = DMGetDimension(base,&dim);CHKERRQ(ierr);
84*dd8e54a2SToby Isaac   ierr = DMSetDimension(dm,dim);CHKERRQ(ierr);
85*dd8e54a2SToby Isaac   ierr = DMGetCoordinateDim(base,&dimEmbed);CHKERRQ(ierr);
86*dd8e54a2SToby Isaac   ierr = DMSetCoordinateDim(dm,dimEmbed);CHKERRQ(ierr);
87*dd8e54a2SToby Isaac   PetscFunctionReturn(0);
88*dd8e54a2SToby Isaac }
89*dd8e54a2SToby Isaac 
90*dd8e54a2SToby Isaac #undef __FUNCT__
91*dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetBaseDM"
92*dd8e54a2SToby Isaac PetscErrorCode DMForestGetBaseDM(DM dm, DM *base)
93*dd8e54a2SToby Isaac {
94*dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
95*dd8e54a2SToby Isaac 
96*dd8e54a2SToby Isaac   PetscFunctionBegin;
97*dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
98*dd8e54a2SToby Isaac   PetscValidPointer(base, 2);
99*dd8e54a2SToby Isaac   *base = forest->base;
100*dd8e54a2SToby Isaac   PetscFunctionReturn(0);
101*dd8e54a2SToby Isaac }
102*dd8e54a2SToby Isaac 
103*dd8e54a2SToby Isaac #undef __FUNCT__
104*dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetCoarseForest"
105*dd8e54a2SToby Isaac PetscErrorCode DMForestSetCoarseForest(DM dm,DM coarse)
106*dd8e54a2SToby Isaac {
107*dd8e54a2SToby Isaac   DM_Forest        *forest = (DM_Forest *) dm->data;
108*dd8e54a2SToby Isaac   DM               base;
109*dd8e54a2SToby Isaac   PetscErrorCode   ierr;
110*dd8e54a2SToby Isaac 
111*dd8e54a2SToby Isaac   PetscFunctionBegin;
112*dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
113*dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 2);
114*dd8e54a2SToby Isaac   if (forest->setup) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the coarse forest after setup");
115*dd8e54a2SToby Isaac   ierr = PetscObjectReference((PetscObject)coarse);CHKERRQ(ierr);
116*dd8e54a2SToby Isaac   ierr = DMDestroy(&forest->coarse);CHKERRQ(ierr);
117*dd8e54a2SToby Isaac   ierr = DMForestGetBaseDM(coarse,&base);CHKERRQ(ierr);
118*dd8e54a2SToby Isaac   ierr = DMForestSetBaseDM(dm,base);CHKERRQ(ierr);
119*dd8e54a2SToby Isaac   forest->coarse = coarse;
120*dd8e54a2SToby Isaac   PetscFunctionReturn(0);
121*dd8e54a2SToby Isaac }
122*dd8e54a2SToby Isaac 
123*dd8e54a2SToby Isaac #undef __FUNCT__
124*dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetCoarseForest"
125*dd8e54a2SToby Isaac PetscErrorCode DMForestGetCoarseForest(DM dm, DM *coarse)
126*dd8e54a2SToby Isaac {
127*dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
128*dd8e54a2SToby Isaac 
129*dd8e54a2SToby Isaac   PetscFunctionBegin;
130*dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
131*dd8e54a2SToby Isaac   PetscValidPointer(coarse, 2);
132*dd8e54a2SToby Isaac   *coarse = forest->coarse;
133*dd8e54a2SToby Isaac   PetscFunctionReturn(0);
134*dd8e54a2SToby Isaac }
135*dd8e54a2SToby Isaac 
136*dd8e54a2SToby Isaac #undef __FUNCT__
137*dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetFineForest"
138*dd8e54a2SToby Isaac PetscErrorCode DMForestSetFineForest(DM dm,DM fine)
139*dd8e54a2SToby Isaac {
140*dd8e54a2SToby Isaac   DM_Forest        *forest = (DM_Forest *) dm->data;
141*dd8e54a2SToby Isaac   DM               base;
142*dd8e54a2SToby Isaac   PetscErrorCode   ierr;
143*dd8e54a2SToby Isaac 
144*dd8e54a2SToby Isaac   PetscFunctionBegin;
145*dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
146*dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 2);
147*dd8e54a2SToby Isaac   if (forest->setup) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the fine forest after setup");
148*dd8e54a2SToby Isaac   ierr = PetscObjectReference((PetscObject)fine);CHKERRQ(ierr);
149*dd8e54a2SToby Isaac   ierr = DMDestroy(&forest->fine);CHKERRQ(ierr);
150*dd8e54a2SToby Isaac   ierr = DMForestGetBaseDM(fine,&base);CHKERRQ(ierr);
151*dd8e54a2SToby Isaac   ierr = DMForestSetBaseDM(dm,base);CHKERRQ(ierr);
152*dd8e54a2SToby Isaac   forest->fine = fine;
153*dd8e54a2SToby Isaac   PetscFunctionReturn(0);
154*dd8e54a2SToby Isaac }
155*dd8e54a2SToby Isaac 
156*dd8e54a2SToby Isaac #undef __FUNCT__
157*dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetFineForest_Forest"
158*dd8e54a2SToby Isaac PetscErrorCode DMForestGetFineForest(DM dm, DM *fine)
159*dd8e54a2SToby Isaac {
160*dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
161*dd8e54a2SToby Isaac 
162*dd8e54a2SToby Isaac   PetscFunctionBegin;
163*dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
164*dd8e54a2SToby Isaac   PetscValidPointer(fine, 2);
165*dd8e54a2SToby Isaac   *fine = forest->fine;
166*dd8e54a2SToby Isaac   PetscFunctionReturn(0);
167*dd8e54a2SToby Isaac }
168*dd8e54a2SToby Isaac 
169*dd8e54a2SToby Isaac #undef __FUNCT__
170*dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetAdjacencyDimension"
171*dd8e54a2SToby Isaac PetscErrorCode DMForestSetAdjacencyDimension(DM dm, PetscInt adjDim)
172*dd8e54a2SToby Isaac {
173*dd8e54a2SToby Isaac   PetscInt        dim;
174*dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
175*dd8e54a2SToby Isaac   PetscErrorCode  ierr;
176*dd8e54a2SToby Isaac 
177*dd8e54a2SToby Isaac   PetscFunctionBegin;
178*dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
179*dd8e54a2SToby Isaac   if (forest->setup) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the adjacency dimension after setup");
180*dd8e54a2SToby Isaac   if (adjDim < 0) SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_OUTOFRANGE,"adjacency dim cannot be < 0: %d", adjDim);
181*dd8e54a2SToby Isaac   ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr);
182*dd8e54a2SToby Isaac   if (adjDim > dim) SETERRQ2(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_OUTOFRANGE,"adjacency dim cannot be > %d: %d", dim, adjDim);
183*dd8e54a2SToby Isaac   forest->adjDim = adjDim;
184*dd8e54a2SToby Isaac   PetscFunctionReturn(0);
185*dd8e54a2SToby Isaac }
186*dd8e54a2SToby Isaac 
187*dd8e54a2SToby Isaac #undef __FUNCT__
188*dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetAdjacencyCodimension"
189*dd8e54a2SToby Isaac PetscErrorCode DMForestSetAdjacencyCodimension(DM dm, PetscInt adjCodim)
190*dd8e54a2SToby Isaac {
191*dd8e54a2SToby Isaac   PetscInt        dim;
192*dd8e54a2SToby Isaac   PetscErrorCode  ierr;
193*dd8e54a2SToby Isaac 
194*dd8e54a2SToby Isaac   PetscFunctionBegin;
195*dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
196*dd8e54a2SToby Isaac   ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr);
197*dd8e54a2SToby Isaac   ierr = DMForestSetAdjacencyDimension(dm,dim-adjCodim);CHKERRQ(ierr);
198*dd8e54a2SToby Isaac   PetscFunctionReturn(0);
199*dd8e54a2SToby Isaac }
200*dd8e54a2SToby Isaac 
201*dd8e54a2SToby Isaac #undef __FUNCT__
202*dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetAdjacencyDimension"
203*dd8e54a2SToby Isaac PetscErrorCode DMForestGetAdjacencyDimension(DM dm, PetscInt *adjDim)
204*dd8e54a2SToby Isaac {
205*dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
206*dd8e54a2SToby Isaac 
207*dd8e54a2SToby Isaac   PetscFunctionBegin;
208*dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
209*dd8e54a2SToby Isaac   PetscValidIntPointer(adjDim,2);
210*dd8e54a2SToby Isaac   *adjDim = forest->adjDim;
211*dd8e54a2SToby Isaac   PetscFunctionReturn(0);
212*dd8e54a2SToby Isaac }
213*dd8e54a2SToby Isaac 
214*dd8e54a2SToby Isaac #undef __FUNCT__
215*dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetAdjacencyCodimension"
216*dd8e54a2SToby Isaac PetscErrorCode DMForestGetAdjacencyCodimension(DM dm, PetscInt *adjCodim)
217*dd8e54a2SToby Isaac {
218*dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
219*dd8e54a2SToby Isaac   PetscInt       dim;
220*dd8e54a2SToby Isaac   PetscErrorCode ierr;
221*dd8e54a2SToby Isaac 
222*dd8e54a2SToby Isaac   PetscFunctionBegin;
223*dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
224*dd8e54a2SToby Isaac   PetscValidIntPointer(adjCodim,2);
225*dd8e54a2SToby Isaac   ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr);
226*dd8e54a2SToby Isaac   *adjCodim = dim - forest->adjDim;
227*dd8e54a2SToby Isaac   PetscFunctionReturn(0);
228*dd8e54a2SToby Isaac }
229*dd8e54a2SToby Isaac 
230*dd8e54a2SToby Isaac #undef __FUNCT__
231*dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetParititionOverlap"
232*dd8e54a2SToby Isaac PetscErrorCode DMForestSetPartitionOverlap(DM dm, PetscInt overlap)
233*dd8e54a2SToby Isaac {
234*dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
235*dd8e54a2SToby Isaac 
236*dd8e54a2SToby Isaac   PetscFunctionBegin;
237*dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
238*dd8e54a2SToby Isaac   if (forest->setup) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the overlap after setup");
239*dd8e54a2SToby Isaac   if (overlap < 0) SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_OUTOFRANGE,"overlap cannot be < 0: %d", overlap);
240*dd8e54a2SToby Isaac   forest->overlap = overlap;
241*dd8e54a2SToby Isaac   PetscFunctionReturn(0);
242*dd8e54a2SToby Isaac }
243*dd8e54a2SToby Isaac 
244*dd8e54a2SToby Isaac #undef __FUNCT__
245*dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetPartitionOverlap"
246*dd8e54a2SToby Isaac PetscErrorCode DMForestGetPartitionOverlap (DM dm, PetscInt *overlap)
247*dd8e54a2SToby Isaac {
248*dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
249*dd8e54a2SToby Isaac 
250*dd8e54a2SToby Isaac   PetscFunctionBegin;
251*dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
252*dd8e54a2SToby Isaac   PetscValidIntPointer(overlap,2);
253*dd8e54a2SToby Isaac   *overlap = forest->overlap;
254*dd8e54a2SToby Isaac   PetscFunctionReturn(0);
255*dd8e54a2SToby Isaac }
256*dd8e54a2SToby Isaac 
257*dd8e54a2SToby Isaac #undef __FUNCT__
258*dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetMinimumRefinement"
259*dd8e54a2SToby Isaac PetscErrorCode DMForestSetMinimumRefinement (DM dm, PetscInt minRefinement)
260*dd8e54a2SToby Isaac {
261*dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
262*dd8e54a2SToby Isaac 
263*dd8e54a2SToby Isaac   PetscFunctionBegin;
264*dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
265*dd8e54a2SToby Isaac   if (forest->setup) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the minimum refinement after setup");
266*dd8e54a2SToby Isaac   forest->minRefinement = minRefinement;
267*dd8e54a2SToby Isaac   PetscFunctionReturn(0);
268*dd8e54a2SToby Isaac }
269*dd8e54a2SToby Isaac 
270*dd8e54a2SToby Isaac #undef __FUNCT__
271*dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetMinimumRefinement"
272*dd8e54a2SToby Isaac PetscErrorCode DMForestGetMinimumRefinement (DM dm, PetscInt *minRefinement)
273*dd8e54a2SToby Isaac {
274*dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
275*dd8e54a2SToby Isaac 
276*dd8e54a2SToby Isaac   PetscFunctionBegin;
277*dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
278*dd8e54a2SToby Isaac   PetscValidIntPointer(minRefinement,2);
279*dd8e54a2SToby Isaac   *minRefinement = forest->minRefinement;
280*dd8e54a2SToby Isaac   PetscFunctionReturn(0);
281*dd8e54a2SToby Isaac }
282*dd8e54a2SToby Isaac 
283*dd8e54a2SToby Isaac #undef __FUNCT__
284*dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetMinimumRefinement"
285*dd8e54a2SToby Isaac PetscErrorCode DMForestSetMinimumRefinement (DM dm, PetscInt minRefinement)
286*dd8e54a2SToby Isaac {
287*dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
288*dd8e54a2SToby Isaac 
289*dd8e54a2SToby Isaac   PetscFunctionBegin;
290*dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
291*dd8e54a2SToby Isaac   if (forest->setup) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the minimum refinement after setup");
292*dd8e54a2SToby Isaac   forest->minRefinement = minRefinement;
293*dd8e54a2SToby Isaac   PetscFunctionReturn(0);
294*dd8e54a2SToby Isaac }
295*dd8e54a2SToby Isaac 
296*dd8e54a2SToby Isaac #undef __FUNCT__
297*dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetMinimumRefinement"
298*dd8e54a2SToby Isaac PetscErrorCode DMForestGetMinimumRefinement (DM dm, PetscInt *minRefinement)
299*dd8e54a2SToby Isaac {
300*dd8e54a2SToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
301*dd8e54a2SToby Isaac 
302*dd8e54a2SToby Isaac   PetscFunctionBegin;
303*dd8e54a2SToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
304*dd8e54a2SToby Isaac   PetscValidIntPointer(minRefinement,2);
305*dd8e54a2SToby Isaac   *minRefinement = forest->minRefinement;
306*dd8e54a2SToby Isaac   PetscFunctionReturn(0);
307*dd8e54a2SToby Isaac }
308*dd8e54a2SToby Isaac #undef __FUNCT__
309db4d5e8cSToby Isaac #define __FUNCT__ "DMSetFromOptions_Forest"
310db4d5e8cSToby Isaac PetscErrorCode DMSetFromFromOptions_Forest(DM dm)
311db4d5e8cSToby Isaac {
312db4d5e8cSToby Isaac   DM_Forest        *forest = (DM_Forest *) dm->data;
313*dd8e54a2SToby Isaac   PetscBool        flg;
314*dd8e54a2SToby Isaac   DMForestTopology oldTopo;
315*dd8e54a2SToby Isaac   char             topology[256];
316*dd8e54a2SToby Isaac   PetscViewer       viewer;
317*dd8e54a2SToby Isaac   PetscViewerFormat format;
318*dd8e54a2SToby Isaac   PetscInt         adjDim, adjCodim, overlap, minRefinement;
319db4d5e8cSToby Isaac   PetscErrorCode   ierr;
320db4d5e8cSToby Isaac 
321db4d5e8cSToby Isaac   PetscFunctionBegin;
322db4d5e8cSToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
323db4d5e8cSToby Isaac   forest->setFromOptions = PETSC_TRUE;
324db4d5e8cSToby Isaac   ierr = PetscOptionsHead("DMForest Options");CHKERRQ(ierr);
325*dd8e54a2SToby Isaac   ierr = DMForestGetTopology(dm, &oldTopo);CHKERRQ(ierr);
326*dd8e54a2SToby Isaac   ierr = PetscOptionsString("-dm_forest_topology","the topology of the forest's base mesh","DMForestSetTopology",oldTopo,topology,256,&flg);CHKERRQ(ierr);
327db4d5e8cSToby Isaac   if (flg) {
328*dd8e54a2SToby Isaac     ierr = DMForestSetTopology(dm,(DMForestTopology)topology);CHKERRQ(ierr);
329*dd8e54a2SToby Isaac   }
330*dd8e54a2SToby Isaac   ierr = PetscOptionsViewer("-dm_forest_base_dm","load the base DM from a viewer specification","DMForestSetBaseDM",&viewer,&format,&flg);CHKERRQ(ierr);
331*dd8e54a2SToby Isaac   if (flg) {
332*dd8e54a2SToby Isaac     DM         base;
333*dd8e54a2SToby Isaac 
334*dd8e54a2SToby Isaac     ierr = DMCreate(PetscObjectComm((PetscObject)dm),&base);CHKERRQ(ierr);
335*dd8e54a2SToby Isaac     ierr = PetscViewerPushFormat(viewer,format);CHKERRQ(ierr);
336*dd8e54a2SToby Isaac     ierr = DMLoad(base,viewer);CHKERRQ(ierr);
337*dd8e54a2SToby Isaac     ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
338*dd8e54a2SToby Isaac     ierr = DMForestSetBaseDM(dm,base);CHKERRQ(ierr);
339*dd8e54a2SToby Isaac     ierr = DMDestroy(&base);CHKERRQ(ierr);
340*dd8e54a2SToby Isaac   }
341*dd8e54a2SToby Isaac   ierr = PetscOptionsViewer("-dm_forest_coarse_forest","load the coarse forest from a viewer specification","DMForestSetCoarseForest",&viewer,&format,&flg);CHKERRQ(ierr);
342*dd8e54a2SToby Isaac   if (flg) {
343*dd8e54a2SToby Isaac     DM         coarse;
344*dd8e54a2SToby Isaac 
345*dd8e54a2SToby Isaac     ierr = DMCreate(PetscObjectComm((PetscObject)dm),&coarse);CHKERRQ(ierr);
346*dd8e54a2SToby Isaac     ierr = PetscViewerPushFormat(viewer,format);CHKERRQ(ierr);
347*dd8e54a2SToby Isaac     ierr = DMLoad(coarse,viewer);CHKERRQ(ierr);
348*dd8e54a2SToby Isaac     ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
349*dd8e54a2SToby Isaac     ierr = DMForestSetCoarseForest(dm,coarse);CHKERRQ(ierr);
350*dd8e54a2SToby Isaac     ierr = DMDestroy(&coarse);CHKERRQ(ierr);
351*dd8e54a2SToby Isaac   }
352*dd8e54a2SToby Isaac   ierr = PetscOptionsViewer("-dm_forest_fine_forest","load the fine forest from a viewer specification","DMForestSetFineForest",&viewer,&format,&flg);CHKERRQ(ierr);
353*dd8e54a2SToby Isaac   if (flg) {
354*dd8e54a2SToby Isaac     DM         fine;
355*dd8e54a2SToby Isaac 
356*dd8e54a2SToby Isaac     ierr = DMCreate(PetscObjectComm((PetscObject)dm),&fine);CHKERRQ(ierr);
357*dd8e54a2SToby Isaac     ierr = PetscViewerPushFormat(viewer,format);CHKERRQ(ierr);
358*dd8e54a2SToby Isaac     ierr = DMLoad(fine,viewer);CHKERRQ(ierr);
359*dd8e54a2SToby Isaac     ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
360*dd8e54a2SToby Isaac     ierr = DMForestSetFineForest(dm,fine);CHKERRQ(ierr);
361*dd8e54a2SToby Isaac     ierr = DMDestroy(&fine);CHKERRQ(ierr);
362*dd8e54a2SToby Isaac   }
363*dd8e54a2SToby Isaac   ierr = DMForestGetAdjacencyDimension(dm,&adjDim);CHKERRQ(ierr);
364*dd8e54a2SToby Isaac   ierr = PetscOptionsInt("-dm_forest_adjacency_dimension","set the dimension of points that define adjacency in the forest","DMForestSetAdjacencyDimension",adjDim,&adjDim,&flg);CHKERRQ(ierr);
365*dd8e54a2SToby Isaac   if (flg) {
366*dd8e54a2SToby Isaac     ierr = DMForestSetAdjacencyDimension(dm,adjDim);CHKERRQ(ierr);
367*dd8e54a2SToby Isaac   }
368*dd8e54a2SToby Isaac   else {
369*dd8e54a2SToby Isaac     ierr = DMForestGetAdjacencyCodimension(dm,&adjCodim);CHKERRQ(ierr);
370*dd8e54a2SToby Isaac     ierr = PetscOptionsInt("-dm_forest_adjacency_codimension","set the codimension of points that define adjacency in the forest","DMForestSetAdjacencyCodimension",adjCodim,&adjCodim,&flg);CHKERRQ(ierr);
371*dd8e54a2SToby Isaac     if (flg) {
372*dd8e54a2SToby Isaac       ierr = DMForestSetAdjacencyCodimension(dm,adjCodim);CHKERRQ(ierr);
373*dd8e54a2SToby Isaac     }
374*dd8e54a2SToby Isaac   }
375*dd8e54a2SToby Isaac   ierr = DMForestGetPartitionOverlap(dm,&overlap);CHKERRQ(ierr);
376*dd8e54a2SToby Isaac   ierr = PetscOptionsInt("-dm_forest_partition_overlap","set the degree of partition overlap","DMForestSetPartitionOverlap",overlap,&overlap,&flg);CHKERRQ(ierr);
377*dd8e54a2SToby Isaac   if (flg) {
378*dd8e54a2SToby Isaac     ierr = DMForestSetPartitionOverlap(dm,overlap);CHKERRQ(ierr);
379*dd8e54a2SToby Isaac   }
380*dd8e54a2SToby Isaac   ierr = DMForestGetMinimumRefinement(dm,&minRefinement);CHKERRQ(ierr);
381*dd8e54a2SToby Isaac   ierr = PetscOptionsInt("-dm_forest_minimum_refinement","set the minimum level of refinement in the forest","DMForestSetMinimumRefinement",minRefinement,&minRefinement,&flg);CHKERRQ(ierr);
382*dd8e54a2SToby Isaac   if (flg) {
383*dd8e54a2SToby Isaac     ierr = DMForestSetMinimumRefinement(dm,minRefinement);CHKERRQ(ierr);
384db4d5e8cSToby Isaac   }
385db4d5e8cSToby Isaac   ierr = PetscOptionsTail();CHKERRQ(ierr);
386db4d5e8cSToby Isaac   PetscFunctionReturn(0);
387db4d5e8cSToby Isaac }
388db4d5e8cSToby Isaac 
389db4d5e8cSToby Isaac #undef __FUNCT__
390db4d5e8cSToby Isaac #define __FUNCT__ "DMCreate_Forest"
391db4d5e8cSToby Isaac PETSC_EXTERN PetscErrorCode DMCreate_Forest(DM dm)
392db4d5e8cSToby Isaac {
393db4d5e8cSToby Isaac   DM_Forest      *forest;
394db4d5e8cSToby Isaac   PetscErrorCode ierr;
395db4d5e8cSToby Isaac 
396db4d5e8cSToby Isaac   PetscFunctionBegin;
397db4d5e8cSToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
398db4d5e8cSToby Isaac   ierr                        = PetscNewLog(dm,&forest);CHKERRQ(ierr);
399db4d5e8cSToby Isaac   dm->dim                     = 0;
400db4d5e8cSToby Isaac   dm->data                    = forest;
401db4d5e8cSToby Isaac   forest->refct               = 1;
402db4d5e8cSToby Isaac   forest->data                = NULL;
403db4d5e8cSToby Isaac   forest->setup               = 0;
404*dd8e54a2SToby Isaac   forest->setFromOptions      = PETSC_FALSE;
405db4d5e8cSToby Isaac   forest->topology            = NULL;
406db4d5e8cSToby Isaac   forest->base                = NULL;
407db4d5e8cSToby Isaac   forest->coarse              = NULL;
408db4d5e8cSToby Isaac   forest->fine                = NULL;
409db4d5e8cSToby Isaac   forest->adjDim              = PETSC_DEFAULT;
410db4d5e8cSToby Isaac   forest->overlap             = PETSC_DEFAULT;
411db4d5e8cSToby Isaac   forest->minRefinement       = PETSC_DEFAULT;
412db4d5e8cSToby Isaac   forest->maxRefinement       = PETSC_DEFAULT;
413db4d5e8cSToby Isaac   forest->cStart              = 0;
414db4d5e8cSToby Isaac   forest->cEnd                = 0;
415db4d5e8cSToby Isaac   forest->cellSF              = 0;
416db4d5e8cSToby Isaac   forest->adaptMarkers        = NULL;
417db4d5e8cSToby Isaac   forest->adaptCopyMode       = PETSC_USE_POINTER;
418db4d5e8cSToby Isaac   forest->adaptStrategy       = DMFORESTADAPTALL;
419db4d5e8cSToby Isaac   forest->gradeFactor         = 2;
420db4d5e8cSToby Isaac   forest->cellWeights         = NULL;
421db4d5e8cSToby Isaac   forest->cellWeightsCopyMode = PETSC_USE_POINTER;
422db4d5e8cSToby Isaac   forest->weightsFactor       = 1.;
423db4d5e8cSToby Isaac   forest->weightCapacity      = 1.;
424db4d5e8cSToby Isaac   PetscFunctionReturn(0);
425db4d5e8cSToby Isaac }
426db4d5e8cSToby Isaac 
427