1ef19d27cSToby Isaac #include <petsc-private/dmforestimpl.h> /*I petscdmforest.h I*/ 2ef19d27cSToby Isaac #include <petsc-private/dmimpl.h> /*I petscdm.h */ 3ef19d27cSToby Isaac #include <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" 23d222f98bSToby Isaac static 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); 30d222f98bSToby Isaac if (forest->destroy) {ierr = forest->destroy(dm);CHKERRQ(ierr);} 31db4d5e8cSToby Isaac ierr = PetscSFDestroy(&forest->cellSF);CHKERRQ(ierr); 32db4d5e8cSToby Isaac if (forest->adaptCopyMode == PETSC_OWN_POINTER) { 33db4d5e8cSToby Isaac ierr = PetscFree(forest->adaptMarkers);CHKERRQ(ierr); 34db4d5e8cSToby Isaac } 35db4d5e8cSToby Isaac if (forest->cellWeightsCopyMode == PETSC_OWN_POINTER) { 36db4d5e8cSToby Isaac ierr = PetscFree(forest->cellWeights);CHKERRQ(ierr); 37db4d5e8cSToby Isaac } 38db4d5e8cSToby Isaac PetscFunctionReturn(0); 39db4d5e8cSToby Isaac } 40db4d5e8cSToby Isaac 41db4d5e8cSToby Isaac #undef __FUNCT__ 42dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetTopology" 43dd8e54a2SToby Isaac PetscErrorCode DMForestSetTopology(DM dm, DMForestTopology topology) 44db4d5e8cSToby Isaac { 45db4d5e8cSToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 46db4d5e8cSToby Isaac PetscErrorCode ierr; 47db4d5e8cSToby Isaac 48db4d5e8cSToby Isaac PetscFunctionBegin; 49db4d5e8cSToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 50*ef51cf95SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the topology after setup"); 51dd8e54a2SToby Isaac ierr = PetscFree(forest->topology);CHKERRQ(ierr); 52dd8e54a2SToby Isaac ierr = PetscStrallocpy((const char *)topology,(char **) &forest->topology);CHKERRQ(ierr); 53db4d5e8cSToby Isaac PetscFunctionReturn(0); 54db4d5e8cSToby Isaac } 55db4d5e8cSToby Isaac 56db4d5e8cSToby Isaac #undef __FUNCT__ 57dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetTopology" 58dd8e54a2SToby Isaac PetscErrorCode DMForestGetTopology(DM dm, DMForestTopology *topology) 59dd8e54a2SToby Isaac { 60dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 61dd8e54a2SToby Isaac 62dd8e54a2SToby Isaac PetscFunctionBegin; 63dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 64dd8e54a2SToby Isaac PetscValidPointer(topology,2); 65dd8e54a2SToby Isaac *topology = forest->topology; 66dd8e54a2SToby Isaac PetscFunctionReturn(0); 67dd8e54a2SToby Isaac } 68dd8e54a2SToby Isaac 69dd8e54a2SToby Isaac #undef __FUNCT__ 70dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetBaseDM" 71dd8e54a2SToby Isaac PetscErrorCode DMForestSetBaseDM(DM dm, DM base) 72dd8e54a2SToby Isaac { 73dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 74dd8e54a2SToby Isaac PetscInt dim, dimEmbed; 75dd8e54a2SToby Isaac PetscErrorCode ierr; 76dd8e54a2SToby Isaac 77dd8e54a2SToby Isaac PetscFunctionBegin; 78dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 79dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 2); 80*ef51cf95SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the base after setup"); 81dd8e54a2SToby Isaac ierr = PetscObjectReference((PetscObject)base);CHKERRQ(ierr); 82dd8e54a2SToby Isaac ierr = DMDestroy(&forest->base);CHKERRQ(ierr); 83dd8e54a2SToby Isaac forest->base = base; 84dd8e54a2SToby Isaac ierr = DMGetDimension(base,&dim);CHKERRQ(ierr); 85dd8e54a2SToby Isaac ierr = DMSetDimension(dm,dim);CHKERRQ(ierr); 86dd8e54a2SToby Isaac ierr = DMGetCoordinateDim(base,&dimEmbed);CHKERRQ(ierr); 87dd8e54a2SToby Isaac ierr = DMSetCoordinateDim(dm,dimEmbed);CHKERRQ(ierr); 88dd8e54a2SToby Isaac PetscFunctionReturn(0); 89dd8e54a2SToby Isaac } 90dd8e54a2SToby Isaac 91dd8e54a2SToby Isaac #undef __FUNCT__ 92dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetBaseDM" 93dd8e54a2SToby Isaac PetscErrorCode DMForestGetBaseDM(DM dm, DM *base) 94dd8e54a2SToby Isaac { 95dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 96dd8e54a2SToby Isaac 97dd8e54a2SToby Isaac PetscFunctionBegin; 98dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 99dd8e54a2SToby Isaac PetscValidPointer(base, 2); 100dd8e54a2SToby Isaac *base = forest->base; 101dd8e54a2SToby Isaac PetscFunctionReturn(0); 102dd8e54a2SToby Isaac } 103dd8e54a2SToby Isaac 104dd8e54a2SToby Isaac #undef __FUNCT__ 105dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetCoarseForest" 106dd8e54a2SToby Isaac PetscErrorCode DMForestSetCoarseForest(DM dm,DM coarse) 107dd8e54a2SToby Isaac { 108dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 109dd8e54a2SToby Isaac DM base; 110d222f98bSToby Isaac DMForestTopology topology; 111dd8e54a2SToby Isaac PetscErrorCode ierr; 112dd8e54a2SToby Isaac 113dd8e54a2SToby Isaac PetscFunctionBegin; 114dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 115dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 2); 116*ef51cf95SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the coarse forest after setup"); 117*ef51cf95SToby Isaac if (!coarse->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot set a coarse forest that is not set up"); 118dd8e54a2SToby Isaac ierr = PetscObjectReference((PetscObject)coarse);CHKERRQ(ierr); 119dd8e54a2SToby Isaac ierr = DMDestroy(&forest->coarse);CHKERRQ(ierr); 120dd8e54a2SToby Isaac ierr = DMForestGetBaseDM(coarse,&base);CHKERRQ(ierr); 121dd8e54a2SToby Isaac ierr = DMForestSetBaseDM(dm,base);CHKERRQ(ierr); 122d222f98bSToby Isaac ierr = DMForestGetTopology(coarse,&topology);CHKERRQ(ierr); 123d222f98bSToby Isaac ierr = DMForestSetTopology(dm,topology);CHKERRQ(ierr); 124dd8e54a2SToby Isaac forest->coarse = coarse; 125dd8e54a2SToby Isaac PetscFunctionReturn(0); 126dd8e54a2SToby Isaac } 127dd8e54a2SToby Isaac 128dd8e54a2SToby Isaac #undef __FUNCT__ 129dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetCoarseForest" 130dd8e54a2SToby Isaac PetscErrorCode DMForestGetCoarseForest(DM dm, DM *coarse) 131dd8e54a2SToby Isaac { 132dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 133dd8e54a2SToby Isaac 134dd8e54a2SToby Isaac PetscFunctionBegin; 135dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 136dd8e54a2SToby Isaac PetscValidPointer(coarse, 2); 137dd8e54a2SToby Isaac *coarse = forest->coarse; 138dd8e54a2SToby Isaac PetscFunctionReturn(0); 139dd8e54a2SToby Isaac } 140dd8e54a2SToby Isaac 141dd8e54a2SToby Isaac #undef __FUNCT__ 142dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetFineForest" 143dd8e54a2SToby Isaac PetscErrorCode DMForestSetFineForest(DM dm,DM fine) 144dd8e54a2SToby Isaac { 145dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 146dd8e54a2SToby Isaac DM base; 147d222f98bSToby Isaac DMForestTopology topology; 148dd8e54a2SToby Isaac PetscErrorCode ierr; 149dd8e54a2SToby Isaac 150dd8e54a2SToby Isaac PetscFunctionBegin; 151dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 152dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 2); 153*ef51cf95SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the fine forest after setup"); 154*ef51cf95SToby Isaac if (!fine->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot set a fine forest that is not set up"); 155dd8e54a2SToby Isaac ierr = PetscObjectReference((PetscObject)fine);CHKERRQ(ierr); 156dd8e54a2SToby Isaac ierr = DMDestroy(&forest->fine);CHKERRQ(ierr); 157dd8e54a2SToby Isaac ierr = DMForestGetBaseDM(fine,&base);CHKERRQ(ierr); 158dd8e54a2SToby Isaac ierr = DMForestSetBaseDM(dm,base);CHKERRQ(ierr); 159d222f98bSToby Isaac ierr = DMForestGetTopology(fine,&topology);CHKERRQ(ierr); 160d222f98bSToby Isaac ierr = DMForestSetTopology(dm,topology);CHKERRQ(ierr); 161dd8e54a2SToby Isaac forest->fine = fine; 162dd8e54a2SToby Isaac PetscFunctionReturn(0); 163dd8e54a2SToby Isaac } 164dd8e54a2SToby Isaac 165dd8e54a2SToby Isaac #undef __FUNCT__ 166*ef51cf95SToby Isaac #define __FUNCT__ "DMForestGetFineForest" 167dd8e54a2SToby Isaac PetscErrorCode DMForestGetFineForest(DM dm, DM *fine) 168dd8e54a2SToby Isaac { 169dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 170dd8e54a2SToby Isaac 171dd8e54a2SToby Isaac PetscFunctionBegin; 172dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 173dd8e54a2SToby Isaac PetscValidPointer(fine, 2); 174dd8e54a2SToby Isaac *fine = forest->fine; 175dd8e54a2SToby Isaac PetscFunctionReturn(0); 176dd8e54a2SToby Isaac } 177dd8e54a2SToby Isaac 178dd8e54a2SToby Isaac #undef __FUNCT__ 179dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetAdjacencyDimension" 180dd8e54a2SToby Isaac PetscErrorCode DMForestSetAdjacencyDimension(DM dm, PetscInt adjDim) 181dd8e54a2SToby Isaac { 182dd8e54a2SToby Isaac PetscInt dim; 183dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 184dd8e54a2SToby Isaac PetscErrorCode ierr; 185dd8e54a2SToby Isaac 186dd8e54a2SToby Isaac PetscFunctionBegin; 187dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 188*ef51cf95SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the adjacency dimension after setup"); 189dd8e54a2SToby Isaac if (adjDim < 0) SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_OUTOFRANGE,"adjacency dim cannot be < 0: %d", adjDim); 190dd8e54a2SToby Isaac ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr); 191dd8e54a2SToby Isaac if (adjDim > dim) SETERRQ2(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_OUTOFRANGE,"adjacency dim cannot be > %d: %d", dim, adjDim); 192dd8e54a2SToby Isaac forest->adjDim = adjDim; 193dd8e54a2SToby Isaac PetscFunctionReturn(0); 194dd8e54a2SToby Isaac } 195dd8e54a2SToby Isaac 196dd8e54a2SToby Isaac #undef __FUNCT__ 197dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetAdjacencyCodimension" 198dd8e54a2SToby Isaac PetscErrorCode DMForestSetAdjacencyCodimension(DM dm, PetscInt adjCodim) 199dd8e54a2SToby Isaac { 200dd8e54a2SToby Isaac PetscInt dim; 201dd8e54a2SToby Isaac PetscErrorCode ierr; 202dd8e54a2SToby Isaac 203dd8e54a2SToby Isaac PetscFunctionBegin; 204dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 205dd8e54a2SToby Isaac ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr); 206dd8e54a2SToby Isaac ierr = DMForestSetAdjacencyDimension(dm,dim-adjCodim);CHKERRQ(ierr); 207dd8e54a2SToby Isaac PetscFunctionReturn(0); 208dd8e54a2SToby Isaac } 209dd8e54a2SToby Isaac 210dd8e54a2SToby Isaac #undef __FUNCT__ 211dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetAdjacencyDimension" 212dd8e54a2SToby Isaac PetscErrorCode DMForestGetAdjacencyDimension(DM dm, PetscInt *adjDim) 213dd8e54a2SToby Isaac { 214dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 215dd8e54a2SToby Isaac 216dd8e54a2SToby Isaac PetscFunctionBegin; 217dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 218dd8e54a2SToby Isaac PetscValidIntPointer(adjDim,2); 219dd8e54a2SToby Isaac *adjDim = forest->adjDim; 220dd8e54a2SToby Isaac PetscFunctionReturn(0); 221dd8e54a2SToby Isaac } 222dd8e54a2SToby Isaac 223dd8e54a2SToby Isaac #undef __FUNCT__ 224dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetAdjacencyCodimension" 225dd8e54a2SToby Isaac PetscErrorCode DMForestGetAdjacencyCodimension(DM dm, PetscInt *adjCodim) 226dd8e54a2SToby Isaac { 227dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 228dd8e54a2SToby Isaac PetscInt dim; 229dd8e54a2SToby Isaac PetscErrorCode ierr; 230dd8e54a2SToby Isaac 231dd8e54a2SToby Isaac PetscFunctionBegin; 232dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 233dd8e54a2SToby Isaac PetscValidIntPointer(adjCodim,2); 234dd8e54a2SToby Isaac ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr); 235dd8e54a2SToby Isaac *adjCodim = dim - forest->adjDim; 236dd8e54a2SToby Isaac PetscFunctionReturn(0); 237dd8e54a2SToby Isaac } 238dd8e54a2SToby Isaac 239dd8e54a2SToby Isaac #undef __FUNCT__ 240*ef51cf95SToby Isaac #define __FUNCT__ "DMForestSetPartitionOverlap" 241dd8e54a2SToby Isaac PetscErrorCode DMForestSetPartitionOverlap(DM dm, PetscInt overlap) 242dd8e54a2SToby Isaac { 243dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 244dd8e54a2SToby Isaac 245dd8e54a2SToby Isaac PetscFunctionBegin; 246dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 247*ef51cf95SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the overlap after setup"); 248dd8e54a2SToby Isaac if (overlap < 0) SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_OUTOFRANGE,"overlap cannot be < 0: %d", overlap); 249dd8e54a2SToby Isaac forest->overlap = overlap; 250dd8e54a2SToby Isaac PetscFunctionReturn(0); 251dd8e54a2SToby Isaac } 252dd8e54a2SToby Isaac 253dd8e54a2SToby Isaac #undef __FUNCT__ 254dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetPartitionOverlap" 255dd8e54a2SToby Isaac PetscErrorCode DMForestGetPartitionOverlap(DM dm, PetscInt *overlap) 256dd8e54a2SToby Isaac { 257dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 258dd8e54a2SToby Isaac 259dd8e54a2SToby Isaac PetscFunctionBegin; 260dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 261dd8e54a2SToby Isaac PetscValidIntPointer(overlap,2); 262dd8e54a2SToby Isaac *overlap = forest->overlap; 263dd8e54a2SToby Isaac PetscFunctionReturn(0); 264dd8e54a2SToby Isaac } 265dd8e54a2SToby Isaac 266dd8e54a2SToby Isaac #undef __FUNCT__ 267dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetMinimumRefinement" 268dd8e54a2SToby Isaac PetscErrorCode DMForestSetMinimumRefinement(DM dm, PetscInt minRefinement) 269dd8e54a2SToby Isaac { 270dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 271dd8e54a2SToby Isaac 272dd8e54a2SToby Isaac PetscFunctionBegin; 273dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 274*ef51cf95SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the minimum refinement after setup"); 275dd8e54a2SToby Isaac forest->minRefinement = minRefinement; 276dd8e54a2SToby Isaac PetscFunctionReturn(0); 277dd8e54a2SToby Isaac } 278dd8e54a2SToby Isaac 279dd8e54a2SToby Isaac #undef __FUNCT__ 280dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetMinimumRefinement" 281dd8e54a2SToby Isaac PetscErrorCode DMForestGetMinimumRefinement(DM dm, PetscInt *minRefinement) 282dd8e54a2SToby Isaac { 283dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 284dd8e54a2SToby Isaac 285dd8e54a2SToby Isaac PetscFunctionBegin; 286dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 287dd8e54a2SToby Isaac PetscValidIntPointer(minRefinement,2); 288dd8e54a2SToby Isaac *minRefinement = forest->minRefinement; 289dd8e54a2SToby Isaac PetscFunctionReturn(0); 290dd8e54a2SToby Isaac } 291dd8e54a2SToby Isaac 292dd8e54a2SToby Isaac #undef __FUNCT__ 293c7eeac06SToby Isaac #define __FUNCT__ "DMForestSetMaximumRefinement" 294c7eeac06SToby Isaac PetscErrorCode DMForestSetMaximumRefinement(DM dm, PetscInt maxRefinement) 295dd8e54a2SToby Isaac { 296dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 297dd8e54a2SToby Isaac 298dd8e54a2SToby Isaac PetscFunctionBegin; 299dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 300*ef51cf95SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the maximum refinement after setup"); 301c7eeac06SToby Isaac forest->maxRefinement = maxRefinement; 302dd8e54a2SToby Isaac PetscFunctionReturn(0); 303dd8e54a2SToby Isaac } 304dd8e54a2SToby Isaac 305dd8e54a2SToby Isaac #undef __FUNCT__ 306c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetMaximumRefinement" 307c7eeac06SToby Isaac PetscErrorCode DMForestGetMaximumRefinement(DM dm, PetscInt *maxRefinement) 308dd8e54a2SToby Isaac { 309dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 310dd8e54a2SToby Isaac 311dd8e54a2SToby Isaac PetscFunctionBegin; 312dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 313c7eeac06SToby Isaac PetscValidIntPointer(maxRefinement,2); 314c7eeac06SToby Isaac *maxRefinement = forest->maxRefinement; 315dd8e54a2SToby Isaac PetscFunctionReturn(0); 316dd8e54a2SToby Isaac } 317c7eeac06SToby Isaac 318c7eeac06SToby Isaac #undef __FUNCT__ 319c7eeac06SToby Isaac #define __FUNCT__ "DMForestSetAdaptivityStrategy" 320c7eeac06SToby Isaac PetscErrorCode DMForestSetAdaptivityStrategy(DM dm, DMForestAdaptivityStrategy adaptStrategy) 321c7eeac06SToby Isaac { 322c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 323c7eeac06SToby Isaac PetscErrorCode ierr; 324c7eeac06SToby Isaac 325c7eeac06SToby Isaac PetscFunctionBegin; 326c7eeac06SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 327c7eeac06SToby Isaac ierr = PetscFree(forest->adaptStrategy);CHKERRQ(ierr); 328c7eeac06SToby Isaac ierr = PetscStrallocpy((const char *)adaptStrategy,(char **)adaptStrategy);CHKERRQ(ierr); 329c7eeac06SToby Isaac PetscFunctionReturn(0); 330c7eeac06SToby Isaac } 331c7eeac06SToby Isaac 332c7eeac06SToby Isaac #undef __FUNCT__ 333c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetAdaptivityStrategy" 334c7eeac06SToby Isaac PetscErrorCode DMForestGetAdaptivityStrategy(DM dm, DMForestAdaptivityStrategy *adaptStrategy) 335c7eeac06SToby Isaac { 336c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 337c7eeac06SToby Isaac 338c7eeac06SToby Isaac PetscFunctionBegin; 339c7eeac06SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 340c7eeac06SToby Isaac PetscValidPointer(adaptStrategy,2); 341c7eeac06SToby Isaac *adaptStrategy = forest->adaptStrategy; 342c7eeac06SToby Isaac PetscFunctionReturn(0); 343c7eeac06SToby Isaac } 344c7eeac06SToby Isaac 345c7eeac06SToby Isaac #undef __FUNCT__ 346c7eeac06SToby Isaac #define __FUNCT__ "DMForestSetGradeFactor" 347c7eeac06SToby Isaac PetscErrorCode DMForestSetGradeFactor(DM dm, PetscInt grade) 348c7eeac06SToby Isaac { 349c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 350c7eeac06SToby Isaac 351c7eeac06SToby Isaac PetscFunctionBegin; 352c7eeac06SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 353*ef51cf95SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the grade factor after setup"); 354c7eeac06SToby Isaac forest->gradeFactor = grade; 355c7eeac06SToby Isaac PetscFunctionReturn(0); 356c7eeac06SToby Isaac } 357c7eeac06SToby Isaac 358c7eeac06SToby Isaac #undef __FUNCT__ 359c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetGradeFactor" 360c7eeac06SToby Isaac PetscErrorCode DMForestGetGradeFactor(DM dm, PetscInt *grade) 361c7eeac06SToby Isaac { 362c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 363c7eeac06SToby Isaac 364c7eeac06SToby Isaac PetscFunctionBegin; 365c7eeac06SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 366c7eeac06SToby Isaac PetscValidIntPointer(grade,2); 367c7eeac06SToby Isaac *grade = forest->gradeFactor; 368c7eeac06SToby Isaac PetscFunctionReturn(0); 369c7eeac06SToby Isaac } 370c7eeac06SToby Isaac 371c7eeac06SToby Isaac #undef __FUNCT__ 372*ef51cf95SToby Isaac #define __FUNCT__ "DMForestSetCellWeightFactor" 373*ef51cf95SToby Isaac PetscErrorCode DMForestSetCellWeightFactor(DM dm, PetscReal weightsFactor) 374c7eeac06SToby Isaac { 375c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 376c7eeac06SToby Isaac 377c7eeac06SToby Isaac PetscFunctionBegin; 378c7eeac06SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 379*ef51cf95SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the weights factor after setup"); 380c7eeac06SToby Isaac forest->weightsFactor = weightsFactor; 381c7eeac06SToby Isaac PetscFunctionReturn(0); 382c7eeac06SToby Isaac } 383c7eeac06SToby Isaac 384c7eeac06SToby Isaac #undef __FUNCT__ 385*ef51cf95SToby Isaac #define __FUNCT__ "DMForestGetCellWeightFactor" 386*ef51cf95SToby Isaac PetscErrorCode DMForestGetCellWeightFactor(DM dm, PetscReal *weightsFactor) 387c7eeac06SToby Isaac { 388c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 389c7eeac06SToby Isaac 390c7eeac06SToby Isaac PetscFunctionBegin; 391c7eeac06SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 392c7eeac06SToby Isaac PetscValidRealPointer(weightsFactor,2); 393c7eeac06SToby Isaac *weightsFactor = forest->weightsFactor; 394c7eeac06SToby Isaac PetscFunctionReturn(0); 395c7eeac06SToby Isaac } 396c7eeac06SToby Isaac 397c7eeac06SToby Isaac #undef __FUNCT__ 398c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetCellChart" 399c7eeac06SToby Isaac PetscErrorCode DMForestGetCellChart(DM dm, PetscInt *cStart, PetscInt *cEnd) 400c7eeac06SToby Isaac { 401c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 402c7eeac06SToby Isaac PetscErrorCode ierr; 403c7eeac06SToby Isaac 404c7eeac06SToby Isaac PetscFunctionBegin; 405c7eeac06SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 406c7eeac06SToby Isaac PetscValidIntPointer(cStart,2); 407c7eeac06SToby Isaac PetscValidIntPointer(cEnd,2); 408c7eeac06SToby Isaac if (((forest->cStart == PETSC_DETERMINE) || (forest->cEnd == PETSC_DETERMINE)) && forest->createcellchart) { 409c7eeac06SToby Isaac ierr = forest->createcellchart(dm,&forest->cStart,&forest->cEnd);CHKERRQ(ierr); 410c7eeac06SToby Isaac } 411c7eeac06SToby Isaac *cStart = forest->cStart; 412c7eeac06SToby Isaac *cEnd = forest->cEnd; 413c7eeac06SToby Isaac PetscFunctionReturn(0); 414c7eeac06SToby Isaac } 415c7eeac06SToby Isaac 416c7eeac06SToby Isaac #undef __FUNCT__ 417c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetCellSF" 418c7eeac06SToby Isaac PetscErrorCode DMForestGetCellSF(DM dm, PetscSF *cellSF) 419c7eeac06SToby Isaac { 420c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 421c7eeac06SToby Isaac PetscErrorCode ierr; 422c7eeac06SToby Isaac 423c7eeac06SToby Isaac PetscFunctionBegin; 424c7eeac06SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 425c7eeac06SToby Isaac PetscValidPointer(cellSF,2); 426c7eeac06SToby Isaac if ((!forest->cellSF) && forest->createcellsf) { 427c7eeac06SToby Isaac ierr = forest->createcellsf(dm,&forest->cellSF);CHKERRQ(ierr); 428c7eeac06SToby Isaac } 429c7eeac06SToby Isaac *cellSF = forest->cellSF; 430c7eeac06SToby Isaac PetscFunctionReturn(0); 431c7eeac06SToby Isaac } 432c7eeac06SToby Isaac 433c7eeac06SToby Isaac #undef __FUNCT__ 434c7eeac06SToby Isaac #define __FUNCT__ "DMForestSetAdaptivityMarkers" 435c7eeac06SToby Isaac PetscErrorCode DMForestSetAdaptivityMarkers(DM dm, PetscInt markers[], PetscCopyMode copyMode) 436c7eeac06SToby Isaac { 437c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 438c7eeac06SToby Isaac PetscInt cStart, cEnd; 439c7eeac06SToby Isaac PetscErrorCode ierr; 440c7eeac06SToby Isaac 441c7eeac06SToby Isaac PetscFunctionBegin; 442c7eeac06SToby Isaac PetscValidHeaderSpecific(dm,DM_CLASSID,1); 443c7eeac06SToby Isaac ierr = DMForestGetCellChart(dm,&cStart,&cEnd);CHKERRQ(ierr); 444c7eeac06SToby Isaac if (cEnd < cStart) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"cell chart [%d,%d) is not valid",cStart,cEnd); 445c7eeac06SToby Isaac if (copyMode == PETSC_COPY_VALUES) { 446c7eeac06SToby Isaac if (forest->adaptCopyMode != PETSC_OWN_POINTER || forest->adaptMarkers == markers) { 447c7eeac06SToby Isaac ierr = PetscMalloc1(cEnd-cStart,&forest->adaptMarkers);CHKERRQ(ierr); 448c7eeac06SToby Isaac } 449c7eeac06SToby Isaac ierr = PetscMemcpy(forest->adaptMarkers,markers,(cEnd-cStart)*sizeof(*markers));CHKERRQ(ierr); 450c7eeac06SToby Isaac forest->adaptCopyMode = PETSC_OWN_POINTER; 451c7eeac06SToby Isaac PetscFunctionReturn(0); 452c7eeac06SToby Isaac } 453c7eeac06SToby Isaac if (forest->adaptCopyMode == PETSC_OWN_POINTER) { 454c7eeac06SToby Isaac ierr = PetscFree(forest->adaptMarkers);CHKERRQ(ierr); 455c7eeac06SToby Isaac } 456c7eeac06SToby Isaac forest->adaptMarkers = markers; 457c7eeac06SToby Isaac forest->adaptCopyMode = copyMode; 458c7eeac06SToby Isaac PetscFunctionReturn(0); 459c7eeac06SToby Isaac } 460c7eeac06SToby Isaac 461c7eeac06SToby Isaac #undef __FUNCT__ 462c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetAdaptivityMarkers" 463c7eeac06SToby Isaac PetscErrorCode DMForestGetAdaptivityMarkers(DM dm, PetscInt **markers) 464c7eeac06SToby Isaac { 465c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 466c7eeac06SToby Isaac 467c7eeac06SToby Isaac PetscFunctionBegin; 468c7eeac06SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 469c7eeac06SToby Isaac PetscValidPointer(markers,2); 470c7eeac06SToby Isaac *markers = forest->adaptMarkers; 471c7eeac06SToby Isaac PetscFunctionReturn(0); 472c7eeac06SToby Isaac } 473c7eeac06SToby Isaac 474c7eeac06SToby Isaac #undef __FUNCT__ 475c7eeac06SToby Isaac #define __FUNCT__ "DMForestSetCellWeights" 476c7eeac06SToby Isaac PetscErrorCode DMForestSetCellWeights(DM dm, PetscReal weights[], PetscCopyMode copyMode) 477c7eeac06SToby Isaac { 478c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 479c7eeac06SToby Isaac PetscInt cStart, cEnd; 480c7eeac06SToby Isaac PetscErrorCode ierr; 481c7eeac06SToby Isaac 482c7eeac06SToby Isaac PetscFunctionBegin; 483c7eeac06SToby Isaac PetscValidHeaderSpecific(dm,DM_CLASSID,1); 484c7eeac06SToby Isaac ierr = DMForestGetCellChart(dm,&cStart,&cEnd);CHKERRQ(ierr); 485c7eeac06SToby Isaac if (cEnd < cStart) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"cell chart [%d,%d) is not valid",cStart,cEnd); 486c7eeac06SToby Isaac if (copyMode == PETSC_COPY_VALUES) { 487c7eeac06SToby Isaac if (forest->cellWeightsCopyMode != PETSC_OWN_POINTER || forest->cellWeights == weights) { 488c7eeac06SToby Isaac ierr = PetscMalloc1(cEnd-cStart,&forest->cellWeights);CHKERRQ(ierr); 489c7eeac06SToby Isaac } 490c7eeac06SToby Isaac ierr = PetscMemcpy(forest->cellWeights,weights,(cEnd-cStart)*sizeof(*weights));CHKERRQ(ierr); 491c7eeac06SToby Isaac forest->cellWeightsCopyMode = PETSC_OWN_POINTER; 492c7eeac06SToby Isaac PetscFunctionReturn(0); 493c7eeac06SToby Isaac } 494c7eeac06SToby Isaac if (forest->cellWeightsCopyMode == PETSC_OWN_POINTER) { 495c7eeac06SToby Isaac ierr = PetscFree(forest->cellWeights);CHKERRQ(ierr); 496c7eeac06SToby Isaac } 497c7eeac06SToby Isaac forest->cellWeights = weights; 498c7eeac06SToby Isaac forest->cellWeightsCopyMode = copyMode; 499c7eeac06SToby Isaac PetscFunctionReturn(0); 500c7eeac06SToby Isaac } 501c7eeac06SToby Isaac 502c7eeac06SToby Isaac #undef __FUNCT__ 503c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetCellWeights" 504c7eeac06SToby Isaac PetscErrorCode DMForestGetCellWeights(DM dm, PetscReal **weights) 505c7eeac06SToby Isaac { 506c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 507c7eeac06SToby Isaac 508c7eeac06SToby Isaac PetscFunctionBegin; 509c7eeac06SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 510c7eeac06SToby Isaac PetscValidPointer(weights,2); 511c7eeac06SToby Isaac *weights = forest->cellWeights; 512c7eeac06SToby Isaac PetscFunctionReturn(0); 513c7eeac06SToby Isaac } 514c7eeac06SToby Isaac 515c7eeac06SToby Isaac #undef __FUNCT__ 516c7eeac06SToby Isaac #define __FUNCT__ "DMForestSetWeightCapacity" 517c7eeac06SToby Isaac PetscErrorCode DMForestSetWeightCapacity(DM dm, PetscReal capacity) 518c7eeac06SToby Isaac { 519c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 520c7eeac06SToby Isaac 521c7eeac06SToby Isaac PetscFunctionBegin; 522c7eeac06SToby Isaac PetscValidHeaderSpecific(dm,DM_CLASSID,1); 523*ef51cf95SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the weight capacity after setup"); 524c7eeac06SToby Isaac if (capacity < 0.) SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_OUTOFRANGE,"Cannot have negative weight capacity; %f",capacity); 525c7eeac06SToby Isaac forest->weightCapacity = capacity; 526c7eeac06SToby Isaac PetscFunctionReturn(0); 527c7eeac06SToby Isaac } 528c7eeac06SToby Isaac 529c7eeac06SToby Isaac #undef __FUNCT__ 530c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetWeightCapacity" 531c7eeac06SToby Isaac PetscErrorCode DMForestGetWeightCapacity(DM dm, PetscReal *capacity) 532c7eeac06SToby Isaac { 533c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 534c7eeac06SToby Isaac 535c7eeac06SToby Isaac PetscFunctionBegin; 536c7eeac06SToby Isaac PetscValidHeaderSpecific(dm,DM_CLASSID,1); 537c7eeac06SToby Isaac PetscValidRealPointer(capacity,2); 538c7eeac06SToby Isaac *capacity = forest->weightCapacity; 539c7eeac06SToby Isaac PetscFunctionReturn(0); 540c7eeac06SToby Isaac } 541c7eeac06SToby Isaac 542dd8e54a2SToby Isaac #undef __FUNCT__ 543db4d5e8cSToby Isaac #define __FUNCT__ "DMSetFromOptions_Forest" 544d222f98bSToby Isaac PETSC_EXTERN PetscErrorCode DMSetFromOptions_Forest(DM dm) 545db4d5e8cSToby Isaac { 546db4d5e8cSToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 547dd8e54a2SToby Isaac PetscBool flg; 548dd8e54a2SToby Isaac DMForestTopology oldTopo; 549c7eeac06SToby Isaac char stringBuffer[256]; 550dd8e54a2SToby Isaac PetscViewer viewer; 551dd8e54a2SToby Isaac PetscViewerFormat format; 552c7eeac06SToby Isaac PetscInt adjDim, adjCodim, overlap, minRefinement, maxRefinement, grade; 553c7eeac06SToby Isaac PetscReal weightsFactor; 554c7eeac06SToby Isaac DMForestAdaptivityStrategy adaptStrategy; 555db4d5e8cSToby Isaac PetscErrorCode ierr; 556db4d5e8cSToby Isaac 557db4d5e8cSToby Isaac PetscFunctionBegin; 558db4d5e8cSToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 559db4d5e8cSToby Isaac forest->setFromOptions = PETSC_TRUE; 560db4d5e8cSToby Isaac ierr = PetscOptionsHead("DMForest Options");CHKERRQ(ierr); 561dd8e54a2SToby Isaac ierr = DMForestGetTopology(dm, &oldTopo);CHKERRQ(ierr); 562c7eeac06SToby Isaac ierr = PetscOptionsString("-dm_forest_topology","the topology of the forest's base mesh","DMForestSetTopology",oldTopo,stringBuffer,256,&flg);CHKERRQ(ierr); 563db4d5e8cSToby Isaac if (flg) { 564c7eeac06SToby Isaac ierr = DMForestSetTopology(dm,(DMForestTopology)stringBuffer);CHKERRQ(ierr); 565dd8e54a2SToby Isaac } 566dd8e54a2SToby Isaac ierr = PetscOptionsViewer("-dm_forest_base_dm","load the base DM from a viewer specification","DMForestSetBaseDM",&viewer,&format,&flg);CHKERRQ(ierr); 567dd8e54a2SToby Isaac if (flg) { 568dd8e54a2SToby Isaac DM base; 569dd8e54a2SToby Isaac 570dd8e54a2SToby Isaac ierr = DMCreate(PetscObjectComm((PetscObject)dm),&base);CHKERRQ(ierr); 571dd8e54a2SToby Isaac ierr = PetscViewerPushFormat(viewer,format);CHKERRQ(ierr); 572dd8e54a2SToby Isaac ierr = DMLoad(base,viewer);CHKERRQ(ierr); 573dd8e54a2SToby Isaac ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 574dd8e54a2SToby Isaac ierr = DMForestSetBaseDM(dm,base);CHKERRQ(ierr); 575dd8e54a2SToby Isaac ierr = DMDestroy(&base);CHKERRQ(ierr); 576dd8e54a2SToby Isaac } 577dd8e54a2SToby Isaac ierr = PetscOptionsViewer("-dm_forest_coarse_forest","load the coarse forest from a viewer specification","DMForestSetCoarseForest",&viewer,&format,&flg);CHKERRQ(ierr); 578dd8e54a2SToby Isaac if (flg) { 579dd8e54a2SToby Isaac DM coarse; 580dd8e54a2SToby Isaac 581dd8e54a2SToby Isaac ierr = DMCreate(PetscObjectComm((PetscObject)dm),&coarse);CHKERRQ(ierr); 582dd8e54a2SToby Isaac ierr = PetscViewerPushFormat(viewer,format);CHKERRQ(ierr); 583dd8e54a2SToby Isaac ierr = DMLoad(coarse,viewer);CHKERRQ(ierr); 584dd8e54a2SToby Isaac ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 585dd8e54a2SToby Isaac ierr = DMForestSetCoarseForest(dm,coarse);CHKERRQ(ierr); 586dd8e54a2SToby Isaac ierr = DMDestroy(&coarse);CHKERRQ(ierr); 587dd8e54a2SToby Isaac } 588dd8e54a2SToby Isaac ierr = PetscOptionsViewer("-dm_forest_fine_forest","load the fine forest from a viewer specification","DMForestSetFineForest",&viewer,&format,&flg);CHKERRQ(ierr); 589dd8e54a2SToby Isaac if (flg) { 590dd8e54a2SToby Isaac DM fine; 591dd8e54a2SToby Isaac 592dd8e54a2SToby Isaac ierr = DMCreate(PetscObjectComm((PetscObject)dm),&fine);CHKERRQ(ierr); 593dd8e54a2SToby Isaac ierr = PetscViewerPushFormat(viewer,format);CHKERRQ(ierr); 594dd8e54a2SToby Isaac ierr = DMLoad(fine,viewer);CHKERRQ(ierr); 595dd8e54a2SToby Isaac ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 596dd8e54a2SToby Isaac ierr = DMForestSetFineForest(dm,fine);CHKERRQ(ierr); 597dd8e54a2SToby Isaac ierr = DMDestroy(&fine);CHKERRQ(ierr); 598dd8e54a2SToby Isaac } 599dd8e54a2SToby Isaac ierr = DMForestGetAdjacencyDimension(dm,&adjDim);CHKERRQ(ierr); 600dd8e54a2SToby Isaac ierr = PetscOptionsInt("-dm_forest_adjacency_dimension","set the dimension of points that define adjacency in the forest","DMForestSetAdjacencyDimension",adjDim,&adjDim,&flg);CHKERRQ(ierr); 601dd8e54a2SToby Isaac if (flg) { 602dd8e54a2SToby Isaac ierr = DMForestSetAdjacencyDimension(dm,adjDim);CHKERRQ(ierr); 603dd8e54a2SToby Isaac } 604dd8e54a2SToby Isaac else { 605dd8e54a2SToby Isaac ierr = DMForestGetAdjacencyCodimension(dm,&adjCodim);CHKERRQ(ierr); 606dd8e54a2SToby Isaac ierr = PetscOptionsInt("-dm_forest_adjacency_codimension","set the codimension of points that define adjacency in the forest","DMForestSetAdjacencyCodimension",adjCodim,&adjCodim,&flg);CHKERRQ(ierr); 607dd8e54a2SToby Isaac if (flg) { 608dd8e54a2SToby Isaac ierr = DMForestSetAdjacencyCodimension(dm,adjCodim);CHKERRQ(ierr); 609dd8e54a2SToby Isaac } 610dd8e54a2SToby Isaac } 611dd8e54a2SToby Isaac ierr = DMForestGetPartitionOverlap(dm,&overlap);CHKERRQ(ierr); 612dd8e54a2SToby Isaac ierr = PetscOptionsInt("-dm_forest_partition_overlap","set the degree of partition overlap","DMForestSetPartitionOverlap",overlap,&overlap,&flg);CHKERRQ(ierr); 613dd8e54a2SToby Isaac if (flg) { 614dd8e54a2SToby Isaac ierr = DMForestSetPartitionOverlap(dm,overlap);CHKERRQ(ierr); 615dd8e54a2SToby Isaac } 616dd8e54a2SToby Isaac ierr = DMForestGetMinimumRefinement(dm,&minRefinement);CHKERRQ(ierr); 617dd8e54a2SToby Isaac ierr = PetscOptionsInt("-dm_forest_minimum_refinement","set the minimum level of refinement in the forest","DMForestSetMinimumRefinement",minRefinement,&minRefinement,&flg);CHKERRQ(ierr); 618dd8e54a2SToby Isaac if (flg) { 619dd8e54a2SToby Isaac ierr = DMForestSetMinimumRefinement(dm,minRefinement);CHKERRQ(ierr); 620db4d5e8cSToby Isaac } 621c7eeac06SToby Isaac ierr = DMForestGetMaximumRefinement(dm,&maxRefinement);CHKERRQ(ierr); 622c7eeac06SToby Isaac ierr = PetscOptionsInt("-dm_forest_maximum_refinement","set the maximum level of refinement in the forest","DMForestSetMaximumRefinement",maxRefinement,&maxRefinement,&flg);CHKERRQ(ierr); 623c7eeac06SToby Isaac if (flg) { 624c7eeac06SToby Isaac ierr = DMForestSetMaximumRefinement(dm,maxRefinement);CHKERRQ(ierr); 625c7eeac06SToby Isaac } 626c7eeac06SToby Isaac ierr = DMForestGetAdaptivityStrategy(dm,&adaptStrategy);CHKERRQ(ierr); 627c7eeac06SToby Isaac ierr = PetscOptionsString("-dm_forest_adaptivity_strategy","the forest's adaptivity-flag resolution strategy","DMForestSetAdaptivityStrategy",adaptStrategy,stringBuffer,256,&flg);CHKERRQ(ierr); 628c7eeac06SToby Isaac if (flg) { 629c7eeac06SToby Isaac ierr = DMForestSetAdaptivityStrategy(dm,(DMForestAdaptivityStrategy)stringBuffer);CHKERRQ(ierr); 630c7eeac06SToby Isaac } 631c7eeac06SToby Isaac ierr = DMForestGetGradeFactor(dm,&grade);CHKERRQ(ierr); 632c7eeac06SToby Isaac ierr = PetscOptionsInt("-dm_forest_grade_factor","grade factor between neighboring cells","DMForestSetGradeFactor",grade,&grade,&flg);CHKERRQ(ierr); 633c7eeac06SToby Isaac if (flg) { 634c7eeac06SToby Isaac ierr = DMForestSetGradeFactor(dm,grade);CHKERRQ(ierr); 635c7eeac06SToby Isaac } 636c7eeac06SToby Isaac ierr = DMForestGetCellWeightFactor(dm,&weightsFactor);CHKERRQ(ierr); 637c7eeac06SToby Isaac ierr = PetscOptionsReal("-dm_forest_cell_weight_factor","multiplying weight factor for cell refinement","DMForestSetCellWeightFactor",weightsFactor,&weightsFactor,&flg);CHKERRQ(ierr); 638c7eeac06SToby Isaac if (flg) { 639c7eeac06SToby Isaac ierr = DMForestSetCellWeightFactor(dm,weightsFactor);CHKERRQ(ierr); 640c7eeac06SToby Isaac } 641db4d5e8cSToby Isaac ierr = PetscOptionsTail();CHKERRQ(ierr); 642db4d5e8cSToby Isaac PetscFunctionReturn(0); 643db4d5e8cSToby Isaac } 644db4d5e8cSToby Isaac 645db4d5e8cSToby Isaac #undef __FUNCT__ 646d222f98bSToby Isaac #define __FUNCT__ "DMInitialize_Forest" 647d222f98bSToby Isaac static PetscErrorCode DMInitialize_Forest(DM dm) 648d222f98bSToby Isaac { 649d222f98bSToby Isaac PetscErrorCode ierr; 650d222f98bSToby Isaac 651d222f98bSToby Isaac PetscFunctionBegin; 652d222f98bSToby Isaac ierr = PetscMemzero(dm->ops,sizeof(*(dm->ops)));CHKERRQ(ierr); 653d222f98bSToby Isaac 654d222f98bSToby Isaac dm->ops->clone = DMClone_Forest; 655d222f98bSToby Isaac dm->ops->setfromoptions = DMSetFromOptions_Forest; 656d222f98bSToby Isaac dm->ops->destroy = DMDestroy_Forest; 657d222f98bSToby Isaac PetscFunctionReturn(0); 658d222f98bSToby Isaac } 659d222f98bSToby Isaac 660d222f98bSToby Isaac #undef __FUNCT__ 661db4d5e8cSToby Isaac #define __FUNCT__ "DMCreate_Forest" 662db4d5e8cSToby Isaac PETSC_EXTERN PetscErrorCode DMCreate_Forest(DM dm) 663db4d5e8cSToby Isaac { 664db4d5e8cSToby Isaac DM_Forest *forest; 665db4d5e8cSToby Isaac PetscErrorCode ierr; 666db4d5e8cSToby Isaac 667db4d5e8cSToby Isaac PetscFunctionBegin; 668db4d5e8cSToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 669db4d5e8cSToby Isaac ierr = PetscNewLog(dm,&forest);CHKERRQ(ierr); 670db4d5e8cSToby Isaac dm->dim = 0; 671db4d5e8cSToby Isaac dm->data = forest; 672db4d5e8cSToby Isaac forest->refct = 1; 673db4d5e8cSToby Isaac forest->data = NULL; 674dd8e54a2SToby Isaac forest->setFromOptions = PETSC_FALSE; 675db4d5e8cSToby Isaac forest->topology = NULL; 676db4d5e8cSToby Isaac forest->base = NULL; 677db4d5e8cSToby Isaac forest->coarse = NULL; 678db4d5e8cSToby Isaac forest->fine = NULL; 679db4d5e8cSToby Isaac forest->adjDim = PETSC_DEFAULT; 680db4d5e8cSToby Isaac forest->overlap = PETSC_DEFAULT; 681db4d5e8cSToby Isaac forest->minRefinement = PETSC_DEFAULT; 682db4d5e8cSToby Isaac forest->maxRefinement = PETSC_DEFAULT; 683c7eeac06SToby Isaac forest->cStart = PETSC_DETERMINE; 684c7eeac06SToby Isaac forest->cEnd = PETSC_DETERMINE; 685db4d5e8cSToby Isaac forest->cellSF = 0; 686db4d5e8cSToby Isaac forest->adaptMarkers = NULL; 687db4d5e8cSToby Isaac forest->adaptCopyMode = PETSC_USE_POINTER; 688db4d5e8cSToby Isaac forest->adaptStrategy = DMFORESTADAPTALL; 689db4d5e8cSToby Isaac forest->gradeFactor = 2; 690db4d5e8cSToby Isaac forest->cellWeights = NULL; 691db4d5e8cSToby Isaac forest->cellWeightsCopyMode = PETSC_USE_POINTER; 692db4d5e8cSToby Isaac forest->weightsFactor = 1.; 693db4d5e8cSToby Isaac forest->weightCapacity = 1.; 694d222f98bSToby Isaac ierr = DMInitialize_Forest(dm);CHKERRQ(ierr); 695db4d5e8cSToby Isaac PetscFunctionReturn(0); 696db4d5e8cSToby Isaac } 697db4d5e8cSToby Isaac 698