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