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