xref: /petsc/src/dm/impls/forest/forest.c (revision db4d5e8c51cc1a9363b94dc789b938cd2f8b8c62)
1*db4d5e8cSToby Isaac #include <petsc-private/dmforestimpl.h>
2*db4d5e8cSToby Isaac #include <petsc-private/dmimpl.h>
3*db4d5e8cSToby Isaac #include <petscsf.h>                     /*I "petscsf.h" */
4*db4d5e8cSToby Isaac 
5*db4d5e8cSToby Isaac #undef __FUNCT__
6*db4d5e8cSToby Isaac #define __FUNCT__ "DMClone_Forest"
7*db4d5e8cSToby Isaac PETSC_EXTERN PetscErrorCode DMClone_Forest(DM dm, DM *newdm)
8*db4d5e8cSToby Isaac {
9*db4d5e8cSToby Isaac   DM_Forest        *forest = (DM_Forest *) dm->data;
10*db4d5e8cSToby Isaac   const char       *type;
11*db4d5e8cSToby Isaac   PetscErrorCode ierr;
12*db4d5e8cSToby Isaac 
13*db4d5e8cSToby Isaac   PetscFunctionBegin;
14*db4d5e8cSToby Isaac   forest->refct++;
15*db4d5e8cSToby Isaac   (*newdm)->data = forest;
16*db4d5e8cSToby Isaac   ierr = PetscObjectGetType((PetscObject) dm, &type);CHKERRQ(ierr);
17*db4d5e8cSToby Isaac   ierr = PetscObjectChangeTypeName((PetscObject) *newdm, type);CHKERRQ(ierr);
18*db4d5e8cSToby Isaac   ierr = DMInitialize_Forest(*newdm);CHKERRQ(ierr);
19*db4d5e8cSToby Isaac   PetscFunctionReturn(0);
20*db4d5e8cSToby Isaac }
21*db4d5e8cSToby Isaac 
22*db4d5e8cSToby Isaac #undef __FUNCT__
23*db4d5e8cSToby Isaac #define __FUNCT__ "DMDestroy_Forest"
24*db4d5e8cSToby Isaac PetscErrorCode DMDestroy_Forest(DM dm)
25*db4d5e8cSToby Isaac {
26*db4d5e8cSToby Isaac   DM_Forest     *forest = (DM_Forest*) dm->data;
27*db4d5e8cSToby Isaac   PetscErrorCode ierr;
28*db4d5e8cSToby Isaac 
29*db4d5e8cSToby Isaac   PetscFunctionBegin;
30*db4d5e8cSToby Isaac   if (--forest->refct > 0) PetscFunctionReturn(0);
31*db4d5e8cSToby Isaac   ierr = PetscSFDestroy(&forest->cellSF);CHKERRQ(ierr);
32*db4d5e8cSToby Isaac   if (forest->adaptCopyMode == PETSC_OWN_POINTER) {
33*db4d5e8cSToby Isaac     ierr = PetscFree(forest->adaptMarkers);CHKERRQ(ierr);
34*db4d5e8cSToby Isaac   }
35*db4d5e8cSToby Isaac   if (forest->cellWeightsCopyMode == PETSC_OWN_POINTER) {
36*db4d5e8cSToby Isaac     ierr = PetscFree(forest->cellWeights);CHKERRQ(ierr);
37*db4d5e8cSToby Isaac   }
38*db4d5e8cSToby Isaac   PetscFunctionReturn(0);
39*db4d5e8cSToby Isaac }
40*db4d5e8cSToby Isaac 
41*db4d5e8cSToby Isaac 
42*db4d5e8cSToby Isaac #undef __FUNCT__
43*db4d5e8cSToby Isaac #define __FUNCT__ "DMForestSetType"
44*db4d5e8cSToby Isaac PetscErrorCode DMForestSetType(DM dm, DMForestType type)
45*db4d5e8cSToby Isaac {
46*db4d5e8cSToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
47*db4d5e8cSToby Isaac   PetscBool      isSame;
48*db4d5e8cSToby Isaac   PetscErrorCode ierr;
49*db4d5e8cSToby Isaac 
50*db4d5e8cSToby Isaac   PetscFunctionBegin;
51*db4d5e8cSToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
52*db4d5e8cSToby Isaac   if (!type && !forest->type) {
53*db4d5e8cSToby Isaac     isSame = PETSC_TRUE;
54*db4d5e8cSToby Isaac   }
55*db4d5e8cSToby Isaac   else if (!type || !forest->type) {
56*db4d5e8cSToby Isaac     isSame = PETSC_FALSE;
57*db4d5e8cSToby Isaac   }
58*db4d5e8cSToby Isaac   else {
59*db4d5e8cSToby Isaac     ierr = PetscStrcmp((char*)(forest->type),(char*)type,&isSame);CHKERRQ(ierr);
60*db4d5e8cSToby Isaac   }
61*db4d5e8cSToby Isaac   if (!isSame) {
62*db4d5e8cSToby Isaac     ierr = DMForestReset(dm);CHKERRQ(ierr);
63*db4d5e8cSToby Isaac   }
64*db4d5e8cSToby Isaac   PetscFunctionReturn(0);
65*db4d5e8cSToby Isaac }
66*db4d5e8cSToby Isaac 
67*db4d5e8cSToby Isaac #undef __FUNCT__
68*db4d5e8cSToby Isaac #define __FUNCT__ "DMSetFromOptions_Forest"
69*db4d5e8cSToby Isaac PetscErrorCode DMSetFromFromOptions_Forest(DM dm)
70*db4d5e8cSToby Isaac {
71*db4d5e8cSToby Isaac   DM_Forest      *forest = (DM_Forest *) dm->data;
72*db4d5e8cSToby Isaac   PetscErrorCode ierr;
73*db4d5e8cSToby Isaac 
74*db4d5e8cSToby Isaac   PetscFunctionBegin;
75*db4d5e8cSToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
76*db4d5e8cSToby Isaac   forest->setFromOptions = PETSC_TRUE;
77*db4d5e8cSToby Isaac   ierr = PetscOptionsHead("DMForest Options");CHKERRQ(ierr);
78*db4d5e8cSToby Isaac   ierr = PetscOptionsFList("-dm_forest_type","DMForest type","DMForestSetType",DMForestList,(char*)(forest->type ? forest->type : DMFORESTP4EST),forest->type,256,&flg);CHKERRQ(ierr);
79*db4d5e8cSToby Isaac   if (flg) {
80*db4d5e8cSToby Isaac     ierr = DMForestSetType(dm,forest->type);CHKERRQ(ierr);
81*db4d5e8cSToby Isaac   }
82*db4d5e8cSToby Isaac   ierr = PetscOptionsTail();CHKERRQ(ierr);
83*db4d5e8cSToby Isaac   PetscFunctionReturn(0);
84*db4d5e8cSToby Isaac }
85*db4d5e8cSToby Isaac 
86*db4d5e8cSToby Isaac #undef __FUNCT__
87*db4d5e8cSToby Isaac #define __FUNCT__ "DMInitialize_Forest"
88*db4d5e8cSToby Isaac PetscErrorCode DMInitialize_Forest(DM dm)
89*db4d5e8cSToby Isaac {
90*db4d5e8cSToby Isaac   PetscErrorCode ierr;
91*db4d5e8cSToby Isaac 
92*db4d5e8cSToby Isaac   PetscFunctionBegin;
93*db4d5e8cSToby Isaac   ierr                    = PetscMemzero(dm->ops, sizeof (*(dm->ops)));CHKERRQ(ierr);
94*db4d5e8cSToby Isaac   dm->ops->setfromoptions = DMSetFromOptions_Forest;
95*db4d5e8cSToby Isaac   dm->ops->destroy        = DMDestroy_Forest;
96*db4d5e8cSToby Isaac   PetscFunctionReturn(0);
97*db4d5e8cSToby Isaac }
98*db4d5e8cSToby Isaac 
99*db4d5e8cSToby Isaac #undef __FUNCT__
100*db4d5e8cSToby Isaac #define __FUNCT__ "DMCreate_Forest"
101*db4d5e8cSToby Isaac PETSC_EXTERN PetscErrorCode DMCreate_Forest(DM dm)
102*db4d5e8cSToby Isaac {
103*db4d5e8cSToby Isaac   DM_Forest      *forest;
104*db4d5e8cSToby Isaac   PetscErrorCode ierr;
105*db4d5e8cSToby Isaac 
106*db4d5e8cSToby Isaac   PetscFunctionBegin;
107*db4d5e8cSToby Isaac   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
108*db4d5e8cSToby Isaac   ierr                        = PetscNewLog(dm,&forest);CHKERRQ(ierr);
109*db4d5e8cSToby Isaac   dm->dim                     = 0;
110*db4d5e8cSToby Isaac   dm->data                    = forest;
111*db4d5e8cSToby Isaac   forest->refct               = 1;
112*db4d5e8cSToby Isaac   forest->data                = NULL;
113*db4d5e8cSToby Isaac   forest->setup               = 0;
114*db4d5e8cSToby Isaac   forest->type                = NULL;
115*db4d5e8cSToby Isaac   forest->topology            = NULL;
116*db4d5e8cSToby Isaac   forest->base                = NULL;
117*db4d5e8cSToby Isaac   forest->coarse              = NULL;
118*db4d5e8cSToby Isaac   forest->fine                = NULL;
119*db4d5e8cSToby Isaac   forest->adjDim              = PETSC_DEFAULT;
120*db4d5e8cSToby Isaac   forest->overlap             = PETSC_DEFAULT;
121*db4d5e8cSToby Isaac   forest->minRefinement       = PETSC_DEFAULT;
122*db4d5e8cSToby Isaac   forest->maxRefinement       = PETSC_DEFAULT;
123*db4d5e8cSToby Isaac   forest->cStart              = 0;
124*db4d5e8cSToby Isaac   forest->cEnd                = 0;
125*db4d5e8cSToby Isaac   forest->cellSF              = 0;
126*db4d5e8cSToby Isaac   forest->adaptMarkers        = NULL;
127*db4d5e8cSToby Isaac   forest->adaptCopyMode       = PETSC_USE_POINTER;
128*db4d5e8cSToby Isaac   forest->adaptStrategy       = DMFORESTADAPTALL;
129*db4d5e8cSToby Isaac   forest->gradeFactor         = 2;
130*db4d5e8cSToby Isaac   forest->cellWeights         = NULL;
131*db4d5e8cSToby Isaac   forest->cellWeightsCopyMode = PETSC_USE_POINTER;
132*db4d5e8cSToby Isaac   forest->weightsFactor       = 1.;
133*db4d5e8cSToby Isaac   forest->weightCapacity      = 1.;
134*db4d5e8cSToby Isaac   ierr = DMInitialize_Forest(dm);CHKERRQ(ierr);
135*db4d5e8cSToby Isaac   PetscFunctionReturn(0);
136*db4d5e8cSToby Isaac }
137*db4d5e8cSToby Isaac 
138