1fbbfd472SToby Isaac #include <petsc/private/dmforestimpl.h> /*I petscdmforest.h I*/ 2fbbfd472SToby Isaac #include <petsc/private/dmimpl.h> /*I petscdm.h */ 3ef19d27cSToby Isaac #include <petscsf.h> 4db4d5e8cSToby Isaac 527d4645fSToby Isaac PetscBool DMForestPackageInitialized = PETSC_FALSE; 627d4645fSToby Isaac 727d4645fSToby Isaac typedef struct _DMForestTypeLink *DMForestTypeLink; 827d4645fSToby Isaac 927d4645fSToby Isaac struct _DMForestTypeLink 1027d4645fSToby Isaac { 1127d4645fSToby Isaac char *name; 1227d4645fSToby Isaac DMForestTypeLink next; 1327d4645fSToby Isaac }; 1427d4645fSToby Isaac 1527d4645fSToby Isaac DMForestTypeLink DMForestTypeList; 1627d4645fSToby Isaac 1727d4645fSToby Isaac #undef __FUNCT__ 1827d4645fSToby Isaac #define __FUNCT__ "DMForestPackageFinalize" 1927d4645fSToby Isaac static PetscErrorCode DMForestPackageFinalize(void) 2027d4645fSToby Isaac { 2127d4645fSToby Isaac DMForestTypeLink oldLink, link = DMForestTypeList; 2227d4645fSToby Isaac PetscErrorCode ierr; 2327d4645fSToby Isaac 2427d4645fSToby Isaac PetscFunctionBegin; 2527d4645fSToby Isaac while (link) { 2627d4645fSToby Isaac oldLink = link; 2727d4645fSToby Isaac ierr = PetscFree(oldLink->name); 2827d4645fSToby Isaac link = oldLink->next; 2927d4645fSToby Isaac ierr = PetscFree(oldLink);CHKERRQ(ierr); 3027d4645fSToby Isaac } 3127d4645fSToby Isaac PetscFunctionReturn(0); 3227d4645fSToby Isaac } 3327d4645fSToby Isaac 3427d4645fSToby Isaac #undef __FUNCT__ 3527d4645fSToby Isaac #define __FUNCT__ "DMForestPackageInitialize" 3627d4645fSToby Isaac static PetscErrorCode DMForestPackageInitialize(void) 3727d4645fSToby Isaac { 3827d4645fSToby Isaac PetscErrorCode ierr; 3927d4645fSToby Isaac 4027d4645fSToby Isaac PetscFunctionBegin; 4127d4645fSToby Isaac if (DMForestPackageInitialized) PetscFunctionReturn(0); 4227d4645fSToby Isaac DMForestPackageInitialized = PETSC_TRUE; 4327d4645fSToby Isaac ierr = DMForestRegisterType(DMFOREST);CHKERRQ(ierr); 4427d4645fSToby Isaac ierr = PetscRegisterFinalize(DMForestPackageFinalize);CHKERRQ(ierr); 4527d4645fSToby Isaac PetscFunctionReturn(0); 4627d4645fSToby Isaac } 4727d4645fSToby Isaac 4827d4645fSToby Isaac #undef __FUNCT__ 4927d4645fSToby Isaac #define __FUNCT__ "DMForestRegisterType" 5027d4645fSToby Isaac PetscErrorCode DMForestRegisterType(DMType name) 5127d4645fSToby Isaac { 5227d4645fSToby Isaac DMForestTypeLink link; 5327d4645fSToby Isaac PetscErrorCode ierr; 5427d4645fSToby Isaac 5527d4645fSToby Isaac PetscFunctionBegin; 5627d4645fSToby Isaac ierr = DMForestPackageInitialize();CHKERRQ(ierr); 5727d4645fSToby Isaac ierr = PetscNew(&link);CHKERRQ(ierr); 5827d4645fSToby Isaac ierr = PetscStrallocpy(name,&link->name);CHKERRQ(ierr); 5927d4645fSToby Isaac link->next = DMForestTypeList; 6027d4645fSToby Isaac DMForestTypeList = link; 6127d4645fSToby Isaac PetscFunctionReturn(0); 6227d4645fSToby Isaac } 6327d4645fSToby Isaac 6427d4645fSToby Isaac #undef __FUNCT__ 6527d4645fSToby Isaac #define __FUNCT__ "DMIsForest" 6627d4645fSToby Isaac PetscErrorCode DMIsForest(DM dm, PetscBool *isForest) 6727d4645fSToby Isaac { 6827d4645fSToby Isaac DMForestTypeLink link = DMForestTypeList; 6927d4645fSToby Isaac PetscErrorCode ierr; 7027d4645fSToby Isaac 7127d4645fSToby Isaac PetscFunctionBegin; 7227d4645fSToby Isaac while (link) { 7327d4645fSToby Isaac PetscBool sameType; 7427d4645fSToby Isaac ierr = PetscObjectTypeCompare((PetscObject)dm,link->name,&sameType);CHKERRQ(ierr); 7527d4645fSToby Isaac if (sameType) { 7627d4645fSToby Isaac *isForest = PETSC_TRUE; 7727d4645fSToby Isaac PetscFunctionReturn(0); 7827d4645fSToby Isaac } 7927d4645fSToby Isaac link = link->next; 8027d4645fSToby Isaac } 8127d4645fSToby Isaac *isForest = PETSC_FALSE; 8227d4645fSToby Isaac PetscFunctionReturn(0); 8327d4645fSToby Isaac } 8427d4645fSToby Isaac 85db4d5e8cSToby Isaac #undef __FUNCT__ 86a0452a8eSToby Isaac #define __FUNCT__ "DMForestTemplate" 8720e8089bSToby Isaac PETSC_EXTERN PetscErrorCode DMForestTemplate(DM dm, MPI_Comm comm, DM *tdm) 88a0452a8eSToby Isaac { 89a0452a8eSToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 9020e8089bSToby Isaac DMType type; 91a0452a8eSToby Isaac DM base; 92a0452a8eSToby Isaac DMForestTopology topology; 93a0452a8eSToby Isaac PetscInt dim, overlap, ref, factor; 94a0452a8eSToby Isaac DMForestAdaptivityStrategy strat; 95795844e7SToby Isaac PetscDS ds; 96795844e7SToby Isaac void *ctx; 97a0452a8eSToby Isaac PetscErrorCode ierr; 98a0452a8eSToby Isaac 99a0452a8eSToby Isaac PetscFunctionBegin; 100a0452a8eSToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 10120e8089bSToby Isaac ierr = DMCreate(PetscObjectComm((PetscObject)dm),tdm);CHKERRQ(ierr); 10220e8089bSToby Isaac ierr = DMGetType(dm,&type);CHKERRQ(ierr); 10320e8089bSToby Isaac ierr = DMSetType(*tdm,type);CHKERRQ(ierr); 104a0452a8eSToby Isaac ierr = DMForestGetBaseDM(dm,&base);CHKERRQ(ierr); 10520e8089bSToby Isaac ierr = DMForestSetBaseDM(*tdm,base);CHKERRQ(ierr); 106a0452a8eSToby Isaac ierr = DMForestGetTopology(dm,&topology);CHKERRQ(ierr); 10720e8089bSToby Isaac ierr = DMForestSetTopology(*tdm,topology);CHKERRQ(ierr); 108a0452a8eSToby Isaac ierr = DMForestGetAdjacencyDimension(dm,&dim);CHKERRQ(ierr); 10920e8089bSToby Isaac ierr = DMForestSetAdjacencyDimension(*tdm,dim);CHKERRQ(ierr); 110a0452a8eSToby Isaac ierr = DMForestGetPartitionOverlap(dm,&overlap);CHKERRQ(ierr); 11120e8089bSToby Isaac ierr = DMForestSetPartitionOverlap(*tdm,overlap);CHKERRQ(ierr); 112a0452a8eSToby Isaac ierr = DMForestGetMinimumRefinement(dm,&ref);CHKERRQ(ierr); 11320e8089bSToby Isaac ierr = DMForestSetMinimumRefinement(*tdm,ref);CHKERRQ(ierr); 114a0452a8eSToby Isaac ierr = DMForestGetMaximumRefinement(dm,&ref);CHKERRQ(ierr); 11520e8089bSToby Isaac ierr = DMForestSetMaximumRefinement(*tdm,ref);CHKERRQ(ierr); 116a0452a8eSToby Isaac ierr = DMForestGetAdaptivityStrategy(dm,&strat);CHKERRQ(ierr); 11720e8089bSToby Isaac ierr = DMForestSetAdaptivityStrategy(*tdm,strat);CHKERRQ(ierr); 118a0452a8eSToby Isaac ierr = DMForestGetGradeFactor(dm,&factor);CHKERRQ(ierr); 11920e8089bSToby Isaac ierr = DMForestSetGradeFactor(*tdm,factor);CHKERRQ(ierr); 120a0452a8eSToby Isaac if (forest->ftemplate) { 12120e8089bSToby Isaac ierr = (forest->ftemplate) (dm, *tdm);CHKERRQ(ierr); 122a0452a8eSToby Isaac } 12320e8089bSToby Isaac ierr = DMForestSetAdaptivityForest(*tdm,dm);CHKERRQ(ierr); 124795844e7SToby Isaac ierr = DMGetDS(dm,&ds);CHKERRQ(ierr); 125795844e7SToby Isaac ierr = DMSetDS(*tdm,ds);CHKERRQ(ierr); 126795844e7SToby Isaac ierr = DMGetApplicationContext(dm,&ctx);CHKERRQ(ierr); 127795844e7SToby Isaac ierr = DMSetApplicationContext(*tdm,&ctx);CHKERRQ(ierr); 128795844e7SToby Isaac if (dm->maxCell) { 129795844e7SToby Isaac const PetscReal *maxCell, *L; 130795844e7SToby Isaac const DMBoundaryType *bd; 131795844e7SToby Isaac 132795844e7SToby Isaac ierr = DMGetPeriodicity(dm,&maxCell,&L,&bd);CHKERRQ(ierr); 133795844e7SToby Isaac ierr = DMSetPeriodicity(*tdm,maxCell,L,bd);CHKERRQ(ierr); 134795844e7SToby Isaac } 135a0452a8eSToby Isaac PetscFunctionReturn(0); 136a0452a8eSToby Isaac } 137a0452a8eSToby Isaac 13801d9d024SToby Isaac static PetscErrorCode DMInitialize_Forest(DM dm); 13901d9d024SToby Isaac 140a0452a8eSToby Isaac #undef __FUNCT__ 141db4d5e8cSToby Isaac #define __FUNCT__ "DMClone_Forest" 142db4d5e8cSToby Isaac PETSC_EXTERN PetscErrorCode DMClone_Forest(DM dm, DM *newdm) 143db4d5e8cSToby Isaac { 144db4d5e8cSToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 145db4d5e8cSToby Isaac const char *type; 146db4d5e8cSToby Isaac PetscErrorCode ierr; 147db4d5e8cSToby Isaac 148db4d5e8cSToby Isaac PetscFunctionBegin; 149db4d5e8cSToby Isaac forest->refct++; 150db4d5e8cSToby Isaac (*newdm)->data = forest; 151db4d5e8cSToby Isaac ierr = PetscObjectGetType((PetscObject) dm, &type);CHKERRQ(ierr); 152db4d5e8cSToby Isaac ierr = PetscObjectChangeTypeName((PetscObject) *newdm, type);CHKERRQ(ierr); 15301d9d024SToby Isaac ierr = DMInitialize_Forest(*newdm);CHKERRQ(ierr); 154db4d5e8cSToby Isaac PetscFunctionReturn(0); 155db4d5e8cSToby Isaac } 156db4d5e8cSToby Isaac 157db4d5e8cSToby Isaac #undef __FUNCT__ 158db4d5e8cSToby Isaac #define __FUNCT__ "DMDestroy_Forest" 159d222f98bSToby Isaac static PetscErrorCode DMDestroy_Forest(DM dm) 160db4d5e8cSToby Isaac { 161db4d5e8cSToby Isaac DM_Forest *forest = (DM_Forest*) dm->data; 162db4d5e8cSToby Isaac PetscErrorCode ierr; 163db4d5e8cSToby Isaac 164db4d5e8cSToby Isaac PetscFunctionBegin; 165db4d5e8cSToby Isaac if (--forest->refct > 0) PetscFunctionReturn(0); 166d222f98bSToby Isaac if (forest->destroy) {ierr = forest->destroy(dm);CHKERRQ(ierr);} 167db4d5e8cSToby Isaac ierr = PetscSFDestroy(&forest->cellSF);CHKERRQ(ierr); 168ebdf65a2SToby Isaac ierr = PetscFree(forest->adaptLabel);CHKERRQ(ierr); 1699a81d013SToby Isaac ierr = PetscFree(forest->adaptStrategy);CHKERRQ(ierr); 17056ba9f64SToby Isaac ierr = DMDestroy(&forest->base);CHKERRQ(ierr); 171ba936b91SToby Isaac ierr = DMDestroy(&forest->adapt);CHKERRQ(ierr); 17230f902e7SToby Isaac ierr = PetscFree(forest->topology);CHKERRQ(ierr); 17330f902e7SToby Isaac ierr = PetscFree(forest);CHKERRQ(ierr); 174db4d5e8cSToby Isaac PetscFunctionReturn(0); 175db4d5e8cSToby Isaac } 176db4d5e8cSToby Isaac 177db4d5e8cSToby Isaac #undef __FUNCT__ 178dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetTopology" 179dd8e54a2SToby Isaac PetscErrorCode DMForestSetTopology(DM dm, DMForestTopology topology) 180db4d5e8cSToby Isaac { 181db4d5e8cSToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 182db4d5e8cSToby Isaac PetscErrorCode ierr; 183db4d5e8cSToby Isaac 184db4d5e8cSToby Isaac PetscFunctionBegin; 185db4d5e8cSToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 186ef51cf95SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the topology after setup"); 187dd8e54a2SToby Isaac ierr = PetscFree(forest->topology);CHKERRQ(ierr); 188dd8e54a2SToby Isaac ierr = PetscStrallocpy((const char *)topology,(char **) &forest->topology);CHKERRQ(ierr); 189db4d5e8cSToby Isaac PetscFunctionReturn(0); 190db4d5e8cSToby Isaac } 191db4d5e8cSToby Isaac 192db4d5e8cSToby Isaac #undef __FUNCT__ 193dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetTopology" 194dd8e54a2SToby Isaac PetscErrorCode DMForestGetTopology(DM dm, DMForestTopology *topology) 195dd8e54a2SToby Isaac { 196dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 197dd8e54a2SToby Isaac 198dd8e54a2SToby Isaac PetscFunctionBegin; 199dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 200dd8e54a2SToby Isaac PetscValidPointer(topology,2); 201dd8e54a2SToby Isaac *topology = forest->topology; 202dd8e54a2SToby Isaac PetscFunctionReturn(0); 203dd8e54a2SToby Isaac } 204dd8e54a2SToby Isaac 205dd8e54a2SToby Isaac #undef __FUNCT__ 206dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetBaseDM" 207dd8e54a2SToby Isaac PetscErrorCode DMForestSetBaseDM(DM dm, DM base) 208dd8e54a2SToby Isaac { 209dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 210dd8e54a2SToby Isaac PetscInt dim, dimEmbed; 211dd8e54a2SToby Isaac PetscErrorCode ierr; 212dd8e54a2SToby Isaac 213dd8e54a2SToby Isaac PetscFunctionBegin; 214dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 215ef51cf95SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the base after setup"); 216dd8e54a2SToby Isaac ierr = PetscObjectReference((PetscObject)base);CHKERRQ(ierr); 217dd8e54a2SToby Isaac ierr = DMDestroy(&forest->base);CHKERRQ(ierr); 218dd8e54a2SToby Isaac forest->base = base; 219a0452a8eSToby Isaac if (base) { 220a0452a8eSToby Isaac PetscValidHeaderSpecific(base, DM_CLASSID, 2); 221dd8e54a2SToby Isaac ierr = DMGetDimension(base,&dim);CHKERRQ(ierr); 222dd8e54a2SToby Isaac ierr = DMSetDimension(dm,dim);CHKERRQ(ierr); 223dd8e54a2SToby Isaac ierr = DMGetCoordinateDim(base,&dimEmbed);CHKERRQ(ierr); 224dd8e54a2SToby Isaac ierr = DMSetCoordinateDim(dm,dimEmbed);CHKERRQ(ierr); 225a0452a8eSToby Isaac } 226dd8e54a2SToby Isaac PetscFunctionReturn(0); 227dd8e54a2SToby Isaac } 228dd8e54a2SToby Isaac 229dd8e54a2SToby Isaac #undef __FUNCT__ 230dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetBaseDM" 231dd8e54a2SToby Isaac PetscErrorCode DMForestGetBaseDM(DM dm, DM *base) 232dd8e54a2SToby Isaac { 233dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 234dd8e54a2SToby Isaac 235dd8e54a2SToby Isaac PetscFunctionBegin; 236dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 237dd8e54a2SToby Isaac PetscValidPointer(base, 2); 238dd8e54a2SToby Isaac *base = forest->base; 239dd8e54a2SToby Isaac PetscFunctionReturn(0); 240dd8e54a2SToby Isaac } 241dd8e54a2SToby Isaac 242dd8e54a2SToby Isaac #undef __FUNCT__ 243ba936b91SToby Isaac #define __FUNCT__ "DMForestSetAdaptivityForest" 244ba936b91SToby Isaac PetscErrorCode DMForestSetAdaptivityForest(DM dm,DM adapt) 245dd8e54a2SToby Isaac { 246ba936b91SToby Isaac DM_Forest *forest; 247dd8e54a2SToby Isaac PetscErrorCode ierr; 248dd8e54a2SToby Isaac 249dd8e54a2SToby Isaac PetscFunctionBegin; 250dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 251ba936b91SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 2); 252ba936b91SToby Isaac forest = (DM_Forest *) dm->data; 253ba936b91SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the adaptation forest after setup"); 254*26d9498aSToby Isaac switch (forest->adaptPurpose) { 255*26d9498aSToby Isaac case DM_FOREST_KEEP: 256ba936b91SToby Isaac ierr = PetscObjectReference((PetscObject)adapt);CHKERRQ(ierr); 257ba936b91SToby Isaac ierr = DMDestroy(&(forest->adapt));CHKERRQ(ierr); 258ba936b91SToby Isaac forest->adapt = adapt; 259*26d9498aSToby Isaac break; 260*26d9498aSToby Isaac case DM_FOREST_REFINE: 261*26d9498aSToby Isaac ierr = DMSetCoarseDM(dm,adapt);CHKERRQ(ierr); 262*26d9498aSToby Isaac break; 263*26d9498aSToby Isaac case DM_FOREST_COARSEN: 264*26d9498aSToby Isaac ierr = DMSetFineDM(dm,adapt);CHKERRQ(ierr); 265*26d9498aSToby Isaac break; 266*26d9498aSToby Isaac default: 267*26d9498aSToby Isaac SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"invalid adaptivity purpose"); 268*26d9498aSToby Isaac } 269dd8e54a2SToby Isaac PetscFunctionReturn(0); 270dd8e54a2SToby Isaac } 271dd8e54a2SToby Isaac 272dd8e54a2SToby Isaac #undef __FUNCT__ 273ba936b91SToby Isaac #define __FUNCT__ "DMForestGetAdaptivityForest" 274ba936b91SToby Isaac PetscErrorCode DMForestGetAdaptivityForest(DM dm, DM *adapt) 275dd8e54a2SToby Isaac { 276ba936b91SToby Isaac DM_Forest *forest; 277*26d9498aSToby Isaac PetscErrorCode ierr; 278dd8e54a2SToby Isaac 279dd8e54a2SToby Isaac PetscFunctionBegin; 280dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 281ba936b91SToby Isaac forest = (DM_Forest *) dm->data; 282*26d9498aSToby Isaac switch (forest->adaptPurpose) { 283*26d9498aSToby Isaac case DM_FOREST_KEEP: 284ba936b91SToby Isaac *adapt = forest->adapt; 285*26d9498aSToby Isaac break; 286*26d9498aSToby Isaac case DM_FOREST_REFINE: 287*26d9498aSToby Isaac ierr = DMGetCoarseDM(dm,adapt);CHKERRQ(ierr); 288*26d9498aSToby Isaac break; 289*26d9498aSToby Isaac case DM_FOREST_COARSEN: 290*26d9498aSToby Isaac ierr = DMGetFineDM(dm,adapt);CHKERRQ(ierr); 291*26d9498aSToby Isaac break; 292*26d9498aSToby Isaac default: 293*26d9498aSToby Isaac SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"invalid adaptivity purpose"); 294*26d9498aSToby Isaac } 295*26d9498aSToby Isaac PetscFunctionReturn(0); 296*26d9498aSToby Isaac } 297*26d9498aSToby Isaac 298*26d9498aSToby Isaac #undef __FUNCT__ 299*26d9498aSToby Isaac #define __FUNCT__ "DMForestSetAdaptivityPurpose" 300*26d9498aSToby Isaac PetscErrorCode DMForestSetAdaptivityPurpose(DM dm, DMForestAdaptivityPurpose purpose) 301*26d9498aSToby Isaac { 302*26d9498aSToby Isaac DM_Forest *forest; 303*26d9498aSToby Isaac PetscErrorCode ierr; 304*26d9498aSToby Isaac 305*26d9498aSToby Isaac PetscFunctionBegin; 306*26d9498aSToby Isaac forest = (DM_Forest *) dm->data; 307*26d9498aSToby Isaac if (purpose != forest->adaptPurpose) { 308*26d9498aSToby Isaac DM adapt; 309*26d9498aSToby Isaac 310*26d9498aSToby Isaac ierr = DMForestGetAdaptivityForest(dm,&adapt);CHKERRQ(ierr); 311*26d9498aSToby Isaac ierr = PetscObjectReference((PetscObject)adapt);CHKERRQ(ierr); 312*26d9498aSToby Isaac ierr = DMForestSetAdaptivityForest(dm,NULL);CHKERRQ(ierr); 313*26d9498aSToby Isaac forest->adaptPurpose = purpose; 314*26d9498aSToby Isaac ierr = DMForestSetAdaptivityForest(dm,adapt);CHKERRQ(ierr); 315*26d9498aSToby Isaac ierr = DMDestroy(&adapt);CHKERRQ(ierr); 316*26d9498aSToby Isaac } 317dd8e54a2SToby Isaac PetscFunctionReturn(0); 318dd8e54a2SToby Isaac } 319dd8e54a2SToby Isaac 320dd8e54a2SToby Isaac #undef __FUNCT__ 321dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetAdjacencyDimension" 322dd8e54a2SToby Isaac PetscErrorCode DMForestSetAdjacencyDimension(DM dm, PetscInt adjDim) 323dd8e54a2SToby Isaac { 324dd8e54a2SToby Isaac PetscInt dim; 325dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 326dd8e54a2SToby Isaac PetscErrorCode ierr; 327dd8e54a2SToby Isaac 328dd8e54a2SToby Isaac PetscFunctionBegin; 329dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 330ef51cf95SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the adjacency dimension after setup"); 331dd8e54a2SToby Isaac if (adjDim < 0) SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_OUTOFRANGE,"adjacency dim cannot be < 0: %d", adjDim); 332dd8e54a2SToby Isaac ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr); 333dd8e54a2SToby Isaac if (adjDim > dim) SETERRQ2(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_OUTOFRANGE,"adjacency dim cannot be > %d: %d", dim, adjDim); 334dd8e54a2SToby Isaac forest->adjDim = adjDim; 335dd8e54a2SToby Isaac PetscFunctionReturn(0); 336dd8e54a2SToby Isaac } 337dd8e54a2SToby Isaac 338dd8e54a2SToby Isaac #undef __FUNCT__ 339dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetAdjacencyCodimension" 340dd8e54a2SToby Isaac PetscErrorCode DMForestSetAdjacencyCodimension(DM dm, PetscInt adjCodim) 341dd8e54a2SToby Isaac { 342dd8e54a2SToby Isaac PetscInt dim; 343dd8e54a2SToby Isaac PetscErrorCode ierr; 344dd8e54a2SToby Isaac 345dd8e54a2SToby Isaac PetscFunctionBegin; 346dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 347dd8e54a2SToby Isaac ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr); 348dd8e54a2SToby Isaac ierr = DMForestSetAdjacencyDimension(dm,dim-adjCodim);CHKERRQ(ierr); 349dd8e54a2SToby Isaac PetscFunctionReturn(0); 350dd8e54a2SToby Isaac } 351dd8e54a2SToby Isaac 352dd8e54a2SToby Isaac #undef __FUNCT__ 353dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetAdjacencyDimension" 354dd8e54a2SToby Isaac PetscErrorCode DMForestGetAdjacencyDimension(DM dm, PetscInt *adjDim) 355dd8e54a2SToby Isaac { 356dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 357dd8e54a2SToby Isaac 358dd8e54a2SToby Isaac PetscFunctionBegin; 359dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 360dd8e54a2SToby Isaac PetscValidIntPointer(adjDim,2); 361dd8e54a2SToby Isaac *adjDim = forest->adjDim; 362dd8e54a2SToby Isaac PetscFunctionReturn(0); 363dd8e54a2SToby Isaac } 364dd8e54a2SToby Isaac 365dd8e54a2SToby Isaac #undef __FUNCT__ 366dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetAdjacencyCodimension" 367dd8e54a2SToby Isaac PetscErrorCode DMForestGetAdjacencyCodimension(DM dm, PetscInt *adjCodim) 368dd8e54a2SToby Isaac { 369dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 370dd8e54a2SToby Isaac PetscInt dim; 371dd8e54a2SToby Isaac PetscErrorCode ierr; 372dd8e54a2SToby Isaac 373dd8e54a2SToby Isaac PetscFunctionBegin; 374dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 375dd8e54a2SToby Isaac PetscValidIntPointer(adjCodim,2); 376dd8e54a2SToby Isaac ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr); 377dd8e54a2SToby Isaac *adjCodim = dim - forest->adjDim; 378dd8e54a2SToby Isaac PetscFunctionReturn(0); 379dd8e54a2SToby Isaac } 380dd8e54a2SToby Isaac 381dd8e54a2SToby Isaac #undef __FUNCT__ 382ef51cf95SToby Isaac #define __FUNCT__ "DMForestSetPartitionOverlap" 383dd8e54a2SToby Isaac PetscErrorCode DMForestSetPartitionOverlap(DM dm, PetscInt overlap) 384dd8e54a2SToby Isaac { 385dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 386dd8e54a2SToby Isaac 387dd8e54a2SToby Isaac PetscFunctionBegin; 388dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 389ef51cf95SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the overlap after setup"); 390dd8e54a2SToby Isaac if (overlap < 0) SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_OUTOFRANGE,"overlap cannot be < 0: %d", overlap); 391dd8e54a2SToby Isaac forest->overlap = overlap; 392dd8e54a2SToby Isaac PetscFunctionReturn(0); 393dd8e54a2SToby Isaac } 394dd8e54a2SToby Isaac 395dd8e54a2SToby Isaac #undef __FUNCT__ 396dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetPartitionOverlap" 397dd8e54a2SToby Isaac PetscErrorCode DMForestGetPartitionOverlap(DM dm, PetscInt *overlap) 398dd8e54a2SToby Isaac { 399dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 400dd8e54a2SToby Isaac 401dd8e54a2SToby Isaac PetscFunctionBegin; 402dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 403dd8e54a2SToby Isaac PetscValidIntPointer(overlap,2); 404dd8e54a2SToby Isaac *overlap = forest->overlap; 405dd8e54a2SToby Isaac PetscFunctionReturn(0); 406dd8e54a2SToby Isaac } 407dd8e54a2SToby Isaac 408dd8e54a2SToby Isaac #undef __FUNCT__ 409dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetMinimumRefinement" 410dd8e54a2SToby Isaac PetscErrorCode DMForestSetMinimumRefinement(DM dm, PetscInt minRefinement) 411dd8e54a2SToby Isaac { 412dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 413dd8e54a2SToby Isaac 414dd8e54a2SToby Isaac PetscFunctionBegin; 415dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 416ef51cf95SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the minimum refinement after setup"); 417dd8e54a2SToby Isaac forest->minRefinement = minRefinement; 418dd8e54a2SToby Isaac PetscFunctionReturn(0); 419dd8e54a2SToby Isaac } 420dd8e54a2SToby Isaac 421dd8e54a2SToby Isaac #undef __FUNCT__ 422dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetMinimumRefinement" 423dd8e54a2SToby Isaac PetscErrorCode DMForestGetMinimumRefinement(DM dm, PetscInt *minRefinement) 424dd8e54a2SToby Isaac { 425dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 426dd8e54a2SToby Isaac 427dd8e54a2SToby Isaac PetscFunctionBegin; 428dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 429dd8e54a2SToby Isaac PetscValidIntPointer(minRefinement,2); 430dd8e54a2SToby Isaac *minRefinement = forest->minRefinement; 431dd8e54a2SToby Isaac PetscFunctionReturn(0); 432dd8e54a2SToby Isaac } 433dd8e54a2SToby Isaac 434dd8e54a2SToby Isaac #undef __FUNCT__ 43556ba9f64SToby Isaac #define __FUNCT__ "DMForestSetInitialRefinement" 43656ba9f64SToby Isaac PetscErrorCode DMForestSetInitialRefinement(DM dm, PetscInt initRefinement) 43756ba9f64SToby Isaac { 43856ba9f64SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 43956ba9f64SToby Isaac 44056ba9f64SToby Isaac PetscFunctionBegin; 44156ba9f64SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 44256ba9f64SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the initial refinement after setup"); 44356ba9f64SToby Isaac forest->initRefinement = initRefinement; 44456ba9f64SToby Isaac PetscFunctionReturn(0); 44556ba9f64SToby Isaac } 44656ba9f64SToby Isaac 44756ba9f64SToby Isaac #undef __FUNCT__ 44856ba9f64SToby Isaac #define __FUNCT__ "DMForestGetInitialRefinement" 44956ba9f64SToby Isaac PetscErrorCode DMForestGetInitialRefinement(DM dm, PetscInt *initRefinement) 45056ba9f64SToby Isaac { 45156ba9f64SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 45256ba9f64SToby Isaac 45356ba9f64SToby Isaac PetscFunctionBegin; 45456ba9f64SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 45556ba9f64SToby Isaac PetscValidIntPointer(initRefinement,2); 45656ba9f64SToby Isaac *initRefinement = forest->initRefinement; 45756ba9f64SToby Isaac PetscFunctionReturn(0); 45856ba9f64SToby Isaac } 45956ba9f64SToby Isaac 46056ba9f64SToby Isaac #undef __FUNCT__ 461c7eeac06SToby Isaac #define __FUNCT__ "DMForestSetMaximumRefinement" 462c7eeac06SToby Isaac PetscErrorCode DMForestSetMaximumRefinement(DM dm, PetscInt maxRefinement) 463dd8e54a2SToby Isaac { 464dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 465dd8e54a2SToby Isaac 466dd8e54a2SToby Isaac PetscFunctionBegin; 467dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 468ef51cf95SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the maximum refinement after setup"); 469c7eeac06SToby Isaac forest->maxRefinement = maxRefinement; 470dd8e54a2SToby Isaac PetscFunctionReturn(0); 471dd8e54a2SToby Isaac } 472dd8e54a2SToby Isaac 473dd8e54a2SToby Isaac #undef __FUNCT__ 474c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetMaximumRefinement" 475c7eeac06SToby Isaac PetscErrorCode DMForestGetMaximumRefinement(DM dm, PetscInt *maxRefinement) 476dd8e54a2SToby Isaac { 477dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 478dd8e54a2SToby Isaac 479dd8e54a2SToby Isaac PetscFunctionBegin; 480dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 481c7eeac06SToby Isaac PetscValidIntPointer(maxRefinement,2); 482c7eeac06SToby Isaac *maxRefinement = forest->maxRefinement; 483dd8e54a2SToby Isaac PetscFunctionReturn(0); 484dd8e54a2SToby Isaac } 485c7eeac06SToby Isaac 486c7eeac06SToby Isaac #undef __FUNCT__ 487c7eeac06SToby Isaac #define __FUNCT__ "DMForestSetAdaptivityStrategy" 488c7eeac06SToby Isaac PetscErrorCode DMForestSetAdaptivityStrategy(DM dm, DMForestAdaptivityStrategy adaptStrategy) 489c7eeac06SToby Isaac { 490c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 491c7eeac06SToby Isaac PetscErrorCode ierr; 492c7eeac06SToby Isaac 493c7eeac06SToby Isaac PetscFunctionBegin; 494c7eeac06SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 495c7eeac06SToby Isaac ierr = PetscFree(forest->adaptStrategy);CHKERRQ(ierr); 496a73e2921SToby Isaac ierr = PetscStrallocpy((const char *) adaptStrategy,(char **)&forest->adaptStrategy);CHKERRQ(ierr); 497c7eeac06SToby Isaac PetscFunctionReturn(0); 498c7eeac06SToby Isaac } 499c7eeac06SToby Isaac 500c7eeac06SToby Isaac #undef __FUNCT__ 501c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetAdaptivityStrategy" 502c7eeac06SToby Isaac PetscErrorCode DMForestGetAdaptivityStrategy(DM dm, DMForestAdaptivityStrategy *adaptStrategy) 503c7eeac06SToby Isaac { 504c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 505c7eeac06SToby Isaac 506c7eeac06SToby Isaac PetscFunctionBegin; 507c7eeac06SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 508c7eeac06SToby Isaac PetscValidPointer(adaptStrategy,2); 509c7eeac06SToby Isaac *adaptStrategy = forest->adaptStrategy; 510c7eeac06SToby Isaac PetscFunctionReturn(0); 511c7eeac06SToby Isaac } 512c7eeac06SToby Isaac 513c7eeac06SToby Isaac #undef __FUNCT__ 514c7eeac06SToby Isaac #define __FUNCT__ "DMForestSetGradeFactor" 515c7eeac06SToby Isaac PetscErrorCode DMForestSetGradeFactor(DM dm, PetscInt grade) 516c7eeac06SToby Isaac { 517c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 518c7eeac06SToby Isaac 519c7eeac06SToby Isaac PetscFunctionBegin; 520c7eeac06SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 521ef51cf95SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the grade factor after setup"); 522c7eeac06SToby Isaac forest->gradeFactor = grade; 523c7eeac06SToby Isaac PetscFunctionReturn(0); 524c7eeac06SToby Isaac } 525c7eeac06SToby Isaac 526c7eeac06SToby Isaac #undef __FUNCT__ 527c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetGradeFactor" 528c7eeac06SToby Isaac PetscErrorCode DMForestGetGradeFactor(DM dm, PetscInt *grade) 529c7eeac06SToby Isaac { 530c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 531c7eeac06SToby Isaac 532c7eeac06SToby Isaac PetscFunctionBegin; 533c7eeac06SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 534c7eeac06SToby Isaac PetscValidIntPointer(grade,2); 535c7eeac06SToby Isaac *grade = forest->gradeFactor; 536c7eeac06SToby Isaac PetscFunctionReturn(0); 537c7eeac06SToby Isaac } 538c7eeac06SToby Isaac 539c7eeac06SToby Isaac #undef __FUNCT__ 540ef51cf95SToby Isaac #define __FUNCT__ "DMForestSetCellWeightFactor" 541ef51cf95SToby Isaac PetscErrorCode DMForestSetCellWeightFactor(DM dm, PetscReal weightsFactor) 542c7eeac06SToby Isaac { 543c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 544c7eeac06SToby Isaac 545c7eeac06SToby Isaac PetscFunctionBegin; 546c7eeac06SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 547ef51cf95SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the weights factor after setup"); 548c7eeac06SToby Isaac forest->weightsFactor = weightsFactor; 549c7eeac06SToby Isaac PetscFunctionReturn(0); 550c7eeac06SToby Isaac } 551c7eeac06SToby Isaac 552c7eeac06SToby Isaac #undef __FUNCT__ 553ef51cf95SToby Isaac #define __FUNCT__ "DMForestGetCellWeightFactor" 554ef51cf95SToby Isaac PetscErrorCode DMForestGetCellWeightFactor(DM dm, PetscReal *weightsFactor) 555c7eeac06SToby Isaac { 556c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 557c7eeac06SToby Isaac 558c7eeac06SToby Isaac PetscFunctionBegin; 559c7eeac06SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 560c7eeac06SToby Isaac PetscValidRealPointer(weightsFactor,2); 561c7eeac06SToby Isaac *weightsFactor = forest->weightsFactor; 562c7eeac06SToby Isaac PetscFunctionReturn(0); 563c7eeac06SToby Isaac } 564c7eeac06SToby Isaac 565c7eeac06SToby Isaac #undef __FUNCT__ 566c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetCellChart" 567c7eeac06SToby Isaac PetscErrorCode DMForestGetCellChart(DM dm, PetscInt *cStart, PetscInt *cEnd) 568c7eeac06SToby Isaac { 569c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 570c7eeac06SToby Isaac PetscErrorCode ierr; 571c7eeac06SToby Isaac 572c7eeac06SToby Isaac PetscFunctionBegin; 573c7eeac06SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 574c7eeac06SToby Isaac PetscValidIntPointer(cStart,2); 575c7eeac06SToby Isaac PetscValidIntPointer(cEnd,2); 576c7eeac06SToby Isaac if (((forest->cStart == PETSC_DETERMINE) || (forest->cEnd == PETSC_DETERMINE)) && forest->createcellchart) { 577c7eeac06SToby Isaac ierr = forest->createcellchart(dm,&forest->cStart,&forest->cEnd);CHKERRQ(ierr); 578c7eeac06SToby Isaac } 579c7eeac06SToby Isaac *cStart = forest->cStart; 580c7eeac06SToby Isaac *cEnd = forest->cEnd; 581c7eeac06SToby Isaac PetscFunctionReturn(0); 582c7eeac06SToby Isaac } 583c7eeac06SToby Isaac 584c7eeac06SToby Isaac #undef __FUNCT__ 585c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetCellSF" 586c7eeac06SToby Isaac PetscErrorCode DMForestGetCellSF(DM dm, PetscSF *cellSF) 587c7eeac06SToby Isaac { 588c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 589c7eeac06SToby Isaac PetscErrorCode ierr; 590c7eeac06SToby Isaac 591c7eeac06SToby Isaac PetscFunctionBegin; 592c7eeac06SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 593c7eeac06SToby Isaac PetscValidPointer(cellSF,2); 594c7eeac06SToby Isaac if ((!forest->cellSF) && forest->createcellsf) { 595c7eeac06SToby Isaac ierr = forest->createcellsf(dm,&forest->cellSF);CHKERRQ(ierr); 596c7eeac06SToby Isaac } 597c7eeac06SToby Isaac *cellSF = forest->cellSF; 598c7eeac06SToby Isaac PetscFunctionReturn(0); 599c7eeac06SToby Isaac } 600c7eeac06SToby Isaac 601c7eeac06SToby Isaac #undef __FUNCT__ 602ebdf65a2SToby Isaac #define __FUNCT__ "DMForestSetAdaptivityLabel" 603ebdf65a2SToby Isaac PetscErrorCode DMForestSetAdaptivityLabel(DM dm, const char * adaptLabel) 604c7eeac06SToby Isaac { 605c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 606c7eeac06SToby Isaac PetscErrorCode ierr; 607c7eeac06SToby Isaac 608c7eeac06SToby Isaac PetscFunctionBegin; 609c7eeac06SToby Isaac PetscValidHeaderSpecific(dm,DM_CLASSID,1); 610ebdf65a2SToby Isaac ierr = PetscFree(forest->adaptLabel);CHKERRQ(ierr); 611ebdf65a2SToby Isaac ierr = PetscStrallocpy(adaptLabel,&forest->adaptLabel);CHKERRQ(ierr); 612c7eeac06SToby Isaac PetscFunctionReturn(0); 613c7eeac06SToby Isaac } 614c7eeac06SToby Isaac 615c7eeac06SToby Isaac #undef __FUNCT__ 616ebdf65a2SToby Isaac #define __FUNCT__ "DMForestGetAdaptivityLabel" 617ba936b91SToby Isaac PetscErrorCode DMForestGetAdaptivityLabel(DM dm, const char ** adaptLabel) 618c7eeac06SToby Isaac { 619c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 620c7eeac06SToby Isaac 621c7eeac06SToby Isaac PetscFunctionBegin; 622c7eeac06SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 623ba936b91SToby Isaac *adaptLabel = forest->adaptLabel; 624c7eeac06SToby Isaac PetscFunctionReturn(0); 625c7eeac06SToby Isaac } 626c7eeac06SToby Isaac 627c7eeac06SToby Isaac #undef __FUNCT__ 628c7eeac06SToby Isaac #define __FUNCT__ "DMForestSetCellWeights" 629c7eeac06SToby Isaac PetscErrorCode DMForestSetCellWeights(DM dm, PetscReal weights[], PetscCopyMode copyMode) 630c7eeac06SToby Isaac { 631c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 632c7eeac06SToby Isaac PetscInt cStart, cEnd; 633c7eeac06SToby Isaac PetscErrorCode ierr; 634c7eeac06SToby Isaac 635c7eeac06SToby Isaac PetscFunctionBegin; 636c7eeac06SToby Isaac PetscValidHeaderSpecific(dm,DM_CLASSID,1); 637c7eeac06SToby Isaac ierr = DMForestGetCellChart(dm,&cStart,&cEnd);CHKERRQ(ierr); 638c7eeac06SToby Isaac if (cEnd < cStart) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"cell chart [%d,%d) is not valid",cStart,cEnd); 639c7eeac06SToby Isaac if (copyMode == PETSC_COPY_VALUES) { 640c7eeac06SToby Isaac if (forest->cellWeightsCopyMode != PETSC_OWN_POINTER || forest->cellWeights == weights) { 641c7eeac06SToby Isaac ierr = PetscMalloc1(cEnd-cStart,&forest->cellWeights);CHKERRQ(ierr); 642c7eeac06SToby Isaac } 643c7eeac06SToby Isaac ierr = PetscMemcpy(forest->cellWeights,weights,(cEnd-cStart)*sizeof(*weights));CHKERRQ(ierr); 644c7eeac06SToby Isaac forest->cellWeightsCopyMode = PETSC_OWN_POINTER; 645c7eeac06SToby Isaac PetscFunctionReturn(0); 646c7eeac06SToby Isaac } 647c7eeac06SToby Isaac if (forest->cellWeightsCopyMode == PETSC_OWN_POINTER) { 648c7eeac06SToby Isaac ierr = PetscFree(forest->cellWeights);CHKERRQ(ierr); 649c7eeac06SToby Isaac } 650c7eeac06SToby Isaac forest->cellWeights = weights; 651c7eeac06SToby Isaac forest->cellWeightsCopyMode = copyMode; 652c7eeac06SToby Isaac PetscFunctionReturn(0); 653c7eeac06SToby Isaac } 654c7eeac06SToby Isaac 655c7eeac06SToby Isaac #undef __FUNCT__ 656c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetCellWeights" 657c7eeac06SToby Isaac PetscErrorCode DMForestGetCellWeights(DM dm, PetscReal **weights) 658c7eeac06SToby Isaac { 659c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 660c7eeac06SToby Isaac 661c7eeac06SToby Isaac PetscFunctionBegin; 662c7eeac06SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 663c7eeac06SToby Isaac PetscValidPointer(weights,2); 664c7eeac06SToby Isaac *weights = forest->cellWeights; 665c7eeac06SToby Isaac PetscFunctionReturn(0); 666c7eeac06SToby Isaac } 667c7eeac06SToby Isaac 668c7eeac06SToby Isaac #undef __FUNCT__ 669c7eeac06SToby Isaac #define __FUNCT__ "DMForestSetWeightCapacity" 670c7eeac06SToby Isaac PetscErrorCode DMForestSetWeightCapacity(DM dm, PetscReal capacity) 671c7eeac06SToby Isaac { 672c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 673c7eeac06SToby Isaac 674c7eeac06SToby Isaac PetscFunctionBegin; 675c7eeac06SToby Isaac PetscValidHeaderSpecific(dm,DM_CLASSID,1); 676ef51cf95SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the weight capacity after setup"); 677c7eeac06SToby Isaac if (capacity < 0.) SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_OUTOFRANGE,"Cannot have negative weight capacity; %f",capacity); 678c7eeac06SToby Isaac forest->weightCapacity = capacity; 679c7eeac06SToby Isaac PetscFunctionReturn(0); 680c7eeac06SToby Isaac } 681c7eeac06SToby Isaac 682c7eeac06SToby Isaac #undef __FUNCT__ 683c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetWeightCapacity" 684c7eeac06SToby Isaac PetscErrorCode DMForestGetWeightCapacity(DM dm, PetscReal *capacity) 685c7eeac06SToby Isaac { 686c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 687c7eeac06SToby Isaac 688c7eeac06SToby Isaac PetscFunctionBegin; 689c7eeac06SToby Isaac PetscValidHeaderSpecific(dm,DM_CLASSID,1); 690c7eeac06SToby Isaac PetscValidRealPointer(capacity,2); 691c7eeac06SToby Isaac *capacity = forest->weightCapacity; 692c7eeac06SToby Isaac PetscFunctionReturn(0); 693c7eeac06SToby Isaac } 694c7eeac06SToby Isaac 695dd8e54a2SToby Isaac #undef __FUNCT__ 696db4d5e8cSToby Isaac #define __FUNCT__ "DMSetFromOptions_Forest" 6970709b2feSToby Isaac PETSC_EXTERN PetscErrorCode DMSetFromOptions_Forest(PetscOptionItems *PetscOptionsObject,DM dm) 698db4d5e8cSToby Isaac { 699db4d5e8cSToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 70056ba9f64SToby Isaac PetscBool flg, flg1, flg2, flg3, flg4; 701dd8e54a2SToby Isaac DMForestTopology oldTopo; 702c7eeac06SToby Isaac char stringBuffer[256]; 703dd8e54a2SToby Isaac PetscViewer viewer; 704dd8e54a2SToby Isaac PetscViewerFormat format; 70556ba9f64SToby Isaac PetscInt adjDim, adjCodim, overlap, minRefinement, initRefinement, maxRefinement, grade; 706c7eeac06SToby Isaac PetscReal weightsFactor; 707c7eeac06SToby Isaac DMForestAdaptivityStrategy adaptStrategy; 708db4d5e8cSToby Isaac PetscErrorCode ierr; 709db4d5e8cSToby Isaac 710db4d5e8cSToby Isaac PetscFunctionBegin; 711db4d5e8cSToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 71258762b62SToby Isaac forest->setfromoptionscalled = PETSC_TRUE; 713dd8e54a2SToby Isaac ierr = DMForestGetTopology(dm, &oldTopo);CHKERRQ(ierr); 714a3eda1eaSToby Isaac ierr = PetscOptionsHead(PetscOptionsObject,"DMForest Options");CHKERRQ(ierr); 71556ba9f64SToby Isaac ierr = PetscOptionsString("-dm_forest_topology","the topology of the forest's base mesh","DMForestSetTopology",oldTopo,stringBuffer,256,&flg1);CHKERRQ(ierr); 71656ba9f64SToby Isaac ierr = PetscOptionsViewer("-dm_forest_base_dm","load the base DM from a viewer specification","DMForestSetBaseDM",&viewer,&format,&flg2);CHKERRQ(ierr); 71756ba9f64SToby Isaac ierr = PetscOptionsViewer("-dm_forest_coarse_forest","load the coarse forest from a viewer specification","DMForestSetCoarseForest",&viewer,&format,&flg3);CHKERRQ(ierr); 71856ba9f64SToby Isaac ierr = PetscOptionsViewer("-dm_forest_fine_forest","load the fine forest from a viewer specification","DMForestSetFineForest",&viewer,&format,&flg4);CHKERRQ(ierr); 71956ba9f64SToby Isaac if ((PetscInt) flg1 + (PetscInt) flg2 + (PetscInt) flg3 + (PetscInt) flg4 > 1) { 72056ba9f64SToby Isaac SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_INCOMP,"Specify only one of -dm_forest_{topology,base_dm,coarse_forest,fine_forest}"); 721dd8e54a2SToby Isaac } 72256ba9f64SToby Isaac if (flg1) { 72356ba9f64SToby Isaac ierr = DMForestSetTopology(dm,(DMForestTopology)stringBuffer);CHKERRQ(ierr); 72456ba9f64SToby Isaac ierr = DMForestSetBaseDM(dm,NULL);CHKERRQ(ierr); 72520e8089bSToby Isaac ierr = DMForestSetAdaptivityForest(dm,NULL);CHKERRQ(ierr); 72656ba9f64SToby Isaac } 72756ba9f64SToby Isaac if (flg2) { 728dd8e54a2SToby Isaac DM base; 729dd8e54a2SToby Isaac 730dd8e54a2SToby Isaac ierr = DMCreate(PetscObjectComm((PetscObject)dm),&base);CHKERRQ(ierr); 731dd8e54a2SToby Isaac ierr = PetscViewerPushFormat(viewer,format);CHKERRQ(ierr); 732dd8e54a2SToby Isaac ierr = DMLoad(base,viewer);CHKERRQ(ierr); 733dd8e54a2SToby Isaac ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 734dd8e54a2SToby Isaac ierr = DMForestSetBaseDM(dm,base);CHKERRQ(ierr); 735dd8e54a2SToby Isaac ierr = DMDestroy(&base);CHKERRQ(ierr); 73656ba9f64SToby Isaac ierr = DMForestSetTopology(dm,NULL);CHKERRQ(ierr); 73720e8089bSToby Isaac ierr = DMForestSetAdaptivityForest(dm,NULL);CHKERRQ(ierr); 738dd8e54a2SToby Isaac } 73956ba9f64SToby Isaac if (flg3) { 740dd8e54a2SToby Isaac DM coarse; 741dd8e54a2SToby Isaac 742dd8e54a2SToby Isaac ierr = DMCreate(PetscObjectComm((PetscObject)dm),&coarse);CHKERRQ(ierr); 743dd8e54a2SToby Isaac ierr = PetscViewerPushFormat(viewer,format);CHKERRQ(ierr); 744dd8e54a2SToby Isaac ierr = DMLoad(coarse,viewer);CHKERRQ(ierr); 745dd8e54a2SToby Isaac ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 74620e8089bSToby Isaac ierr = DMForestSetAdaptivityForest(dm,coarse);CHKERRQ(ierr); 747dd8e54a2SToby Isaac ierr = DMDestroy(&coarse);CHKERRQ(ierr); 74856ba9f64SToby Isaac ierr = DMForestSetTopology(dm,NULL);CHKERRQ(ierr); 74956ba9f64SToby Isaac ierr = DMForestSetBaseDM(dm,NULL);CHKERRQ(ierr); 750dd8e54a2SToby Isaac } 75156ba9f64SToby Isaac if (flg4) { 752dd8e54a2SToby Isaac DM fine; 753dd8e54a2SToby Isaac 754dd8e54a2SToby Isaac ierr = DMCreate(PetscObjectComm((PetscObject)dm),&fine);CHKERRQ(ierr); 755dd8e54a2SToby Isaac ierr = PetscViewerPushFormat(viewer,format);CHKERRQ(ierr); 756dd8e54a2SToby Isaac ierr = DMLoad(fine,viewer);CHKERRQ(ierr); 757dd8e54a2SToby Isaac ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 75820e8089bSToby Isaac ierr = DMForestSetAdaptivityForest(dm,fine);CHKERRQ(ierr); 759dd8e54a2SToby Isaac ierr = DMDestroy(&fine);CHKERRQ(ierr); 76056ba9f64SToby Isaac ierr = DMForestSetTopology(dm,NULL);CHKERRQ(ierr); 76156ba9f64SToby Isaac ierr = DMForestSetBaseDM(dm,NULL);CHKERRQ(ierr); 762dd8e54a2SToby Isaac } 763dd8e54a2SToby Isaac ierr = DMForestGetAdjacencyDimension(dm,&adjDim);CHKERRQ(ierr); 764dd8e54a2SToby Isaac ierr = PetscOptionsInt("-dm_forest_adjacency_dimension","set the dimension of points that define adjacency in the forest","DMForestSetAdjacencyDimension",adjDim,&adjDim,&flg);CHKERRQ(ierr); 765dd8e54a2SToby Isaac if (flg) { 766dd8e54a2SToby Isaac ierr = DMForestSetAdjacencyDimension(dm,adjDim);CHKERRQ(ierr); 767dd8e54a2SToby Isaac } 768dd8e54a2SToby Isaac else { 769dd8e54a2SToby Isaac ierr = DMForestGetAdjacencyCodimension(dm,&adjCodim);CHKERRQ(ierr); 770dd8e54a2SToby Isaac ierr = PetscOptionsInt("-dm_forest_adjacency_codimension","set the codimension of points that define adjacency in the forest","DMForestSetAdjacencyCodimension",adjCodim,&adjCodim,&flg);CHKERRQ(ierr); 771dd8e54a2SToby Isaac if (flg) { 772dd8e54a2SToby Isaac ierr = DMForestSetAdjacencyCodimension(dm,adjCodim);CHKERRQ(ierr); 773dd8e54a2SToby Isaac } 774dd8e54a2SToby Isaac } 775dd8e54a2SToby Isaac ierr = DMForestGetPartitionOverlap(dm,&overlap);CHKERRQ(ierr); 776dd8e54a2SToby Isaac ierr = PetscOptionsInt("-dm_forest_partition_overlap","set the degree of partition overlap","DMForestSetPartitionOverlap",overlap,&overlap,&flg);CHKERRQ(ierr); 777dd8e54a2SToby Isaac if (flg) { 778dd8e54a2SToby Isaac ierr = DMForestSetPartitionOverlap(dm,overlap);CHKERRQ(ierr); 779dd8e54a2SToby Isaac } 780a6121fbdSMatthew G. Knepley #if 0 781a6121fbdSMatthew G. Knepley ierr = PetscOptionsInt("-dm_refine","equivalent to -dm_forest_set_minimum_refinement and -dm_forest_set_initial_refinement with the same value",NULL,minRefinement,&minRefinement,&flg);CHKERRQ(ierr); 782a6121fbdSMatthew G. Knepley if (flg) { 783a6121fbdSMatthew G. Knepley ierr = DMForestSetMinimumRefinement(dm,minRefinement);CHKERRQ(ierr); 784a6121fbdSMatthew G. Knepley ierr = DMForestSetInitialRefinement(dm,minRefinement);CHKERRQ(ierr); 785a6121fbdSMatthew G. Knepley } 786a6121fbdSMatthew G. Knepley ierr = PetscOptionsInt("-dm_refine_hierarchy","equivalent to -dm_forest_set_minimum_refinement 0 and -dm_forest_set_initial_refinement",NULL,initRefinement,&initRefinement,&flg);CHKERRQ(ierr); 787a6121fbdSMatthew G. Knepley if (flg) { 788a6121fbdSMatthew G. Knepley ierr = DMForestSetMinimumRefinement(dm,0);CHKERRQ(ierr); 789a6121fbdSMatthew G. Knepley ierr = DMForestSetInitialRefinement(dm,initRefinement);CHKERRQ(ierr); 790a6121fbdSMatthew G. Knepley } 791a6121fbdSMatthew G. Knepley #endif 792dd8e54a2SToby Isaac ierr = DMForestGetMinimumRefinement(dm,&minRefinement);CHKERRQ(ierr); 793dd8e54a2SToby Isaac ierr = PetscOptionsInt("-dm_forest_minimum_refinement","set the minimum level of refinement in the forest","DMForestSetMinimumRefinement",minRefinement,&minRefinement,&flg);CHKERRQ(ierr); 794dd8e54a2SToby Isaac if (flg) { 795dd8e54a2SToby Isaac ierr = DMForestSetMinimumRefinement(dm,minRefinement);CHKERRQ(ierr); 796db4d5e8cSToby Isaac } 79756ba9f64SToby Isaac ierr = DMForestGetInitialRefinement(dm,&initRefinement);CHKERRQ(ierr); 79856ba9f64SToby Isaac ierr = PetscOptionsInt("-dm_forest_initial_refinement","set the initial level of refinement in the forest","DMForestSetInitialRefinement",initRefinement,&initRefinement,&flg);CHKERRQ(ierr); 79956ba9f64SToby Isaac if (flg) { 80056ba9f64SToby Isaac ierr = DMForestSetInitialRefinement(dm,initRefinement);CHKERRQ(ierr); 80156ba9f64SToby Isaac } 802c7eeac06SToby Isaac ierr = DMForestGetMaximumRefinement(dm,&maxRefinement);CHKERRQ(ierr); 803c7eeac06SToby Isaac ierr = PetscOptionsInt("-dm_forest_maximum_refinement","set the maximum level of refinement in the forest","DMForestSetMaximumRefinement",maxRefinement,&maxRefinement,&flg);CHKERRQ(ierr); 804c7eeac06SToby Isaac if (flg) { 805c7eeac06SToby Isaac ierr = DMForestSetMaximumRefinement(dm,maxRefinement);CHKERRQ(ierr); 806c7eeac06SToby Isaac } 807c7eeac06SToby Isaac ierr = DMForestGetAdaptivityStrategy(dm,&adaptStrategy);CHKERRQ(ierr); 808c7eeac06SToby Isaac ierr = PetscOptionsString("-dm_forest_adaptivity_strategy","the forest's adaptivity-flag resolution strategy","DMForestSetAdaptivityStrategy",adaptStrategy,stringBuffer,256,&flg);CHKERRQ(ierr); 809c7eeac06SToby Isaac if (flg) { 810c7eeac06SToby Isaac ierr = DMForestSetAdaptivityStrategy(dm,(DMForestAdaptivityStrategy)stringBuffer);CHKERRQ(ierr); 811c7eeac06SToby Isaac } 812c7eeac06SToby Isaac ierr = DMForestGetGradeFactor(dm,&grade);CHKERRQ(ierr); 813c7eeac06SToby Isaac ierr = PetscOptionsInt("-dm_forest_grade_factor","grade factor between neighboring cells","DMForestSetGradeFactor",grade,&grade,&flg);CHKERRQ(ierr); 814c7eeac06SToby Isaac if (flg) { 815c7eeac06SToby Isaac ierr = DMForestSetGradeFactor(dm,grade);CHKERRQ(ierr); 816c7eeac06SToby Isaac } 817c7eeac06SToby Isaac ierr = DMForestGetCellWeightFactor(dm,&weightsFactor);CHKERRQ(ierr); 818c7eeac06SToby Isaac ierr = PetscOptionsReal("-dm_forest_cell_weight_factor","multiplying weight factor for cell refinement","DMForestSetCellWeightFactor",weightsFactor,&weightsFactor,&flg);CHKERRQ(ierr); 819c7eeac06SToby Isaac if (flg) { 820c7eeac06SToby Isaac ierr = DMForestSetCellWeightFactor(dm,weightsFactor);CHKERRQ(ierr); 821c7eeac06SToby Isaac } 822db4d5e8cSToby Isaac ierr = PetscOptionsTail();CHKERRQ(ierr); 823db4d5e8cSToby Isaac PetscFunctionReturn(0); 824db4d5e8cSToby Isaac } 825db4d5e8cSToby Isaac 826db4d5e8cSToby Isaac #undef __FUNCT__ 827d8984e3bSMatthew G. Knepley #define __FUNCT__ "DMCreateSubDM_Forest" 828d8984e3bSMatthew G. Knepley PetscErrorCode DMCreateSubDM_Forest(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm) 829d8984e3bSMatthew G. Knepley { 830d8984e3bSMatthew G. Knepley PetscErrorCode ierr; 831d8984e3bSMatthew G. Knepley 832d8984e3bSMatthew G. Knepley PetscFunctionBegin; 833d8984e3bSMatthew G. Knepley if (subdm) {ierr = DMClone(dm, subdm);CHKERRQ(ierr);} 834d8984e3bSMatthew G. Knepley ierr = DMCreateSubDM_Section_Private(dm, numFields, fields, is, subdm);CHKERRQ(ierr); 835d8984e3bSMatthew G. Knepley PetscFunctionReturn(0); 836d8984e3bSMatthew G. Knepley } 837d8984e3bSMatthew G. Knepley 838d8984e3bSMatthew G. Knepley #undef __FUNCT__ 8395421bac9SToby Isaac #define __FUNCT__ "DMRefine_Forest" 8405421bac9SToby Isaac PetscErrorCode DMRefine_Forest(DM dm, MPI_Comm comm, DM *dmRefined) 8415421bac9SToby Isaac { 8425421bac9SToby Isaac DMLabel refine; 8435421bac9SToby Isaac DM fineDM; 8445421bac9SToby Isaac PetscErrorCode ierr; 8455421bac9SToby Isaac 8465421bac9SToby Isaac PetscFunctionBegin; 8475421bac9SToby Isaac ierr = DMGetFineDM(dm,&fineDM);CHKERRQ(ierr); 8485421bac9SToby Isaac if (fineDM) { 8495421bac9SToby Isaac ierr = PetscObjectReference((PetscObject)fineDM);CHKERRQ(ierr); 8505421bac9SToby Isaac *dmRefined = fineDM; 8515421bac9SToby Isaac PetscFunctionReturn(0); 8525421bac9SToby Isaac } 8535421bac9SToby Isaac ierr = DMForestTemplate(dm,comm,dmRefined);CHKERRQ(ierr); 8545421bac9SToby Isaac ierr = DMGetLabel(dm,"refine",&refine);CHKERRQ(ierr); 8555421bac9SToby Isaac if (!refine) { 8565421bac9SToby Isaac ierr = DMCreateLabel(dm,"refine");CHKERRQ(ierr); 8575421bac9SToby Isaac ierr = DMGetLabel(dm,"refine",&refine);CHKERRQ(ierr); 8585421bac9SToby Isaac ierr = DMLabelSetDefaultValue(refine,DM_FOREST_REFINE);CHKERRQ(ierr); 8595421bac9SToby Isaac } 8605421bac9SToby Isaac ierr = DMForestSetAdaptivityLabel(*dmRefined,"refine");CHKERRQ(ierr); 8615421bac9SToby Isaac PetscFunctionReturn(0); 8625421bac9SToby Isaac } 8635421bac9SToby Isaac 8645421bac9SToby Isaac #undef __FUNCT__ 8655421bac9SToby Isaac #define __FUNCT__ "DMCoarsen_Forest" 8665421bac9SToby Isaac PetscErrorCode DMCoarsen_Forest(DM dm, MPI_Comm comm, DM *dmCoarsened) 8675421bac9SToby Isaac { 8685421bac9SToby Isaac DMLabel coarsen; 8695421bac9SToby Isaac DM coarseDM; 8705421bac9SToby Isaac PetscErrorCode ierr; 8715421bac9SToby Isaac 8725421bac9SToby Isaac PetscFunctionBegin; 8735421bac9SToby Isaac ierr = DMGetCoarseDM(dm,&coarseDM);CHKERRQ(ierr); 8745421bac9SToby Isaac if (coarseDM) { 8755421bac9SToby Isaac ierr = PetscObjectReference((PetscObject)coarseDM);CHKERRQ(ierr); 8765421bac9SToby Isaac *dmCoarsened = coarseDM; 8775421bac9SToby Isaac PetscFunctionReturn(0); 8785421bac9SToby Isaac } 8795421bac9SToby Isaac ierr = DMForestTemplate(dm,comm,dmCoarsened);CHKERRQ(ierr); 8805421bac9SToby Isaac ierr = DMGetLabel(dm,"coarsen",&coarsen);CHKERRQ(ierr); 8815421bac9SToby Isaac if (!coarsen) { 8825421bac9SToby Isaac ierr = DMCreateLabel(dm,"coarsen");CHKERRQ(ierr); 8835421bac9SToby Isaac ierr = DMGetLabel(dm,"coarsen",&coarsen);CHKERRQ(ierr); 8845421bac9SToby Isaac ierr = DMLabelSetDefaultValue(coarsen,DM_FOREST_COARSEN);CHKERRQ(ierr); 8855421bac9SToby Isaac } 8865421bac9SToby Isaac ierr = DMForestSetAdaptivityLabel(*dmCoarsened,"coarsen");CHKERRQ(ierr); 8875421bac9SToby Isaac PetscFunctionReturn(0); 8885421bac9SToby Isaac } 8895421bac9SToby Isaac 8905421bac9SToby Isaac #undef __FUNCT__ 891d222f98bSToby Isaac #define __FUNCT__ "DMInitialize_Forest" 892d222f98bSToby Isaac static PetscErrorCode DMInitialize_Forest(DM dm) 893d222f98bSToby Isaac { 894d222f98bSToby Isaac PetscErrorCode ierr; 895d222f98bSToby Isaac 896d222f98bSToby Isaac PetscFunctionBegin; 897d222f98bSToby Isaac ierr = PetscMemzero(dm->ops,sizeof(*(dm->ops)));CHKERRQ(ierr); 898d222f98bSToby Isaac 899d222f98bSToby Isaac dm->ops->clone = DMClone_Forest; 900d222f98bSToby Isaac dm->ops->setfromoptions = DMSetFromOptions_Forest; 901d222f98bSToby Isaac dm->ops->destroy = DMDestroy_Forest; 902d8984e3bSMatthew G. Knepley dm->ops->createsubdm = DMCreateSubDM_Forest; 9035421bac9SToby Isaac dm->ops->refine = DMRefine_Forest; 9045421bac9SToby Isaac dm->ops->coarsen = DMCoarsen_Forest; 905d222f98bSToby Isaac PetscFunctionReturn(0); 906d222f98bSToby Isaac } 907d222f98bSToby Isaac 908d222f98bSToby Isaac #undef __FUNCT__ 909db4d5e8cSToby Isaac #define __FUNCT__ "DMCreate_Forest" 910db4d5e8cSToby Isaac PETSC_EXTERN PetscErrorCode DMCreate_Forest(DM dm) 911db4d5e8cSToby Isaac { 912db4d5e8cSToby Isaac DM_Forest *forest; 913db4d5e8cSToby Isaac PetscErrorCode ierr; 914db4d5e8cSToby Isaac 915db4d5e8cSToby Isaac PetscFunctionBegin; 916db4d5e8cSToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 917db4d5e8cSToby Isaac ierr = PetscNewLog(dm,&forest);CHKERRQ(ierr); 918db4d5e8cSToby Isaac dm->dim = 0; 919db4d5e8cSToby Isaac dm->data = forest; 920db4d5e8cSToby Isaac forest->refct = 1; 921db4d5e8cSToby Isaac forest->data = NULL; 92258762b62SToby Isaac forest->setfromoptionscalled = PETSC_FALSE; 923db4d5e8cSToby Isaac forest->topology = NULL; 924db4d5e8cSToby Isaac forest->base = NULL; 925db4d5e8cSToby Isaac forest->adjDim = PETSC_DEFAULT; 926db4d5e8cSToby Isaac forest->overlap = PETSC_DEFAULT; 927db4d5e8cSToby Isaac forest->minRefinement = PETSC_DEFAULT; 928db4d5e8cSToby Isaac forest->maxRefinement = PETSC_DEFAULT; 92956ba9f64SToby Isaac forest->initRefinement = PETSC_DEFAULT; 930c7eeac06SToby Isaac forest->cStart = PETSC_DETERMINE; 931c7eeac06SToby Isaac forest->cEnd = PETSC_DETERMINE; 932db4d5e8cSToby Isaac forest->cellSF = 0; 933ebdf65a2SToby Isaac forest->adaptLabel = NULL; 934db4d5e8cSToby Isaac forest->gradeFactor = 2; 935db4d5e8cSToby Isaac forest->cellWeights = NULL; 936db4d5e8cSToby Isaac forest->cellWeightsCopyMode = PETSC_USE_POINTER; 937db4d5e8cSToby Isaac forest->weightsFactor = 1.; 938db4d5e8cSToby Isaac forest->weightCapacity = 1.; 939a73e2921SToby Isaac ierr = DMForestSetAdaptivityStrategy(dm,DMFORESTADAPTALL);CHKERRQ(ierr); 940d222f98bSToby Isaac ierr = DMInitialize_Forest(dm);CHKERRQ(ierr); 941db4d5e8cSToby Isaac PetscFunctionReturn(0); 942db4d5e8cSToby Isaac } 943db4d5e8cSToby Isaac 944