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" 87a0452a8eSToby Isaac PETSC_EXTERN PetscErrorCode DMForestTemplate(DM dm, DM tdm) 88a0452a8eSToby Isaac { 89a0452a8eSToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 90a0452a8eSToby Isaac DM base; 91a0452a8eSToby Isaac DMForestTopology topology; 92a0452a8eSToby Isaac PetscInt dim, overlap, ref, factor; 93a0452a8eSToby Isaac DMForestAdaptivityStrategy strat; 94a0452a8eSToby Isaac PetscErrorCode ierr; 95a0452a8eSToby Isaac 96a0452a8eSToby Isaac PetscFunctionBegin; 97a0452a8eSToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 98a0452a8eSToby Isaac PetscValidHeaderSpecific(tdm, DM_CLASSID, 2); 99a0452a8eSToby Isaac ierr = DMForestGetBaseDM(dm,&base);CHKERRQ(ierr); 100a0452a8eSToby Isaac ierr = DMForestSetBaseDM(tdm,base);CHKERRQ(ierr); 101a0452a8eSToby Isaac ierr = DMForestGetTopology(dm,&topology);CHKERRQ(ierr); 102a0452a8eSToby Isaac ierr = DMForestSetTopology(tdm,topology);CHKERRQ(ierr); 103a0452a8eSToby Isaac ierr = DMForestGetAdjacencyDimension(dm,&dim);CHKERRQ(ierr); 104a0452a8eSToby Isaac ierr = DMForestSetAdjacencyDimension(tdm,dim);CHKERRQ(ierr); 105a0452a8eSToby Isaac ierr = DMForestGetPartitionOverlap(dm,&overlap);CHKERRQ(ierr); 106a0452a8eSToby Isaac ierr = DMForestSetPartitionOverlap(tdm,overlap);CHKERRQ(ierr); 107a0452a8eSToby Isaac ierr = DMForestGetMinimumRefinement(dm,&ref);CHKERRQ(ierr); 108a0452a8eSToby Isaac ierr = DMForestSetMinimumRefinement(tdm,ref);CHKERRQ(ierr); 109a0452a8eSToby Isaac ierr = DMForestGetMaximumRefinement(dm,&ref);CHKERRQ(ierr); 110a0452a8eSToby Isaac ierr = DMForestSetMaximumRefinement(tdm,ref);CHKERRQ(ierr); 111a0452a8eSToby Isaac ierr = DMForestGetAdaptivityStrategy(dm,&strat);CHKERRQ(ierr); 112a0452a8eSToby Isaac ierr = DMForestSetAdaptivityStrategy(tdm,strat);CHKERRQ(ierr); 113a0452a8eSToby Isaac ierr = DMForestGetGradeFactor(dm,&factor);CHKERRQ(ierr); 114a0452a8eSToby Isaac ierr = DMForestSetGradeFactor(tdm,factor);CHKERRQ(ierr); 115a0452a8eSToby Isaac if (forest->ftemplate) { 116a0452a8eSToby Isaac ierr = (forest->ftemplate) (dm, tdm);CHKERRQ(ierr); 117a0452a8eSToby Isaac } 118a0452a8eSToby Isaac PetscFunctionReturn(0); 119a0452a8eSToby Isaac } 120a0452a8eSToby Isaac 12101d9d024SToby Isaac static PetscErrorCode DMInitialize_Forest(DM dm); 12201d9d024SToby Isaac 123a0452a8eSToby Isaac #undef __FUNCT__ 124db4d5e8cSToby Isaac #define __FUNCT__ "DMClone_Forest" 125db4d5e8cSToby Isaac PETSC_EXTERN PetscErrorCode DMClone_Forest(DM dm, DM *newdm) 126db4d5e8cSToby Isaac { 127db4d5e8cSToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 128db4d5e8cSToby Isaac const char *type; 129db4d5e8cSToby Isaac PetscErrorCode ierr; 130db4d5e8cSToby Isaac 131db4d5e8cSToby Isaac PetscFunctionBegin; 132db4d5e8cSToby Isaac forest->refct++; 133db4d5e8cSToby Isaac (*newdm)->data = forest; 134db4d5e8cSToby Isaac ierr = PetscObjectGetType((PetscObject) dm, &type);CHKERRQ(ierr); 135db4d5e8cSToby Isaac ierr = PetscObjectChangeTypeName((PetscObject) *newdm, type);CHKERRQ(ierr); 13601d9d024SToby Isaac ierr = DMInitialize_Forest(*newdm);CHKERRQ(ierr); 137db4d5e8cSToby Isaac PetscFunctionReturn(0); 138db4d5e8cSToby Isaac } 139db4d5e8cSToby Isaac 140db4d5e8cSToby Isaac #undef __FUNCT__ 141db4d5e8cSToby Isaac #define __FUNCT__ "DMDestroy_Forest" 142d222f98bSToby Isaac static PetscErrorCode DMDestroy_Forest(DM dm) 143db4d5e8cSToby Isaac { 144db4d5e8cSToby Isaac DM_Forest *forest = (DM_Forest*) dm->data; 145db4d5e8cSToby Isaac PetscErrorCode ierr; 146db4d5e8cSToby Isaac 147db4d5e8cSToby Isaac PetscFunctionBegin; 148db4d5e8cSToby Isaac if (--forest->refct > 0) PetscFunctionReturn(0); 149d222f98bSToby Isaac if (forest->destroy) {ierr = forest->destroy(dm);CHKERRQ(ierr);} 150db4d5e8cSToby Isaac ierr = PetscSFDestroy(&forest->cellSF);CHKERRQ(ierr); 151*ebdf65a2SToby Isaac ierr = PetscFree(forest->adaptLabel);CHKERRQ(ierr); 1529a81d013SToby Isaac ierr = PetscFree(forest->adaptStrategy);CHKERRQ(ierr); 15356ba9f64SToby Isaac ierr = DMDestroy(&forest->base);CHKERRQ(ierr); 15430f902e7SToby Isaac ierr = PetscFree(forest->topology);CHKERRQ(ierr); 15530f902e7SToby Isaac ierr = PetscFree(forest);CHKERRQ(ierr); 156db4d5e8cSToby Isaac PetscFunctionReturn(0); 157db4d5e8cSToby Isaac } 158db4d5e8cSToby Isaac 159db4d5e8cSToby Isaac #undef __FUNCT__ 160dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetTopology" 161dd8e54a2SToby Isaac PetscErrorCode DMForestSetTopology(DM dm, DMForestTopology topology) 162db4d5e8cSToby Isaac { 163db4d5e8cSToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 164db4d5e8cSToby Isaac PetscErrorCode ierr; 165db4d5e8cSToby Isaac 166db4d5e8cSToby Isaac PetscFunctionBegin; 167db4d5e8cSToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 168ef51cf95SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the topology after setup"); 169dd8e54a2SToby Isaac ierr = PetscFree(forest->topology);CHKERRQ(ierr); 170dd8e54a2SToby Isaac ierr = PetscStrallocpy((const char *)topology,(char **) &forest->topology);CHKERRQ(ierr); 171db4d5e8cSToby Isaac PetscFunctionReturn(0); 172db4d5e8cSToby Isaac } 173db4d5e8cSToby Isaac 174db4d5e8cSToby Isaac #undef __FUNCT__ 175dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetTopology" 176dd8e54a2SToby Isaac PetscErrorCode DMForestGetTopology(DM dm, DMForestTopology *topology) 177dd8e54a2SToby Isaac { 178dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 179dd8e54a2SToby Isaac 180dd8e54a2SToby Isaac PetscFunctionBegin; 181dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 182dd8e54a2SToby Isaac PetscValidPointer(topology,2); 183dd8e54a2SToby Isaac *topology = forest->topology; 184dd8e54a2SToby Isaac PetscFunctionReturn(0); 185dd8e54a2SToby Isaac } 186dd8e54a2SToby Isaac 187dd8e54a2SToby Isaac #undef __FUNCT__ 188dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetBaseDM" 189dd8e54a2SToby Isaac PetscErrorCode DMForestSetBaseDM(DM dm, DM base) 190dd8e54a2SToby Isaac { 191dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 192dd8e54a2SToby Isaac PetscInt dim, dimEmbed; 193dd8e54a2SToby Isaac PetscErrorCode ierr; 194dd8e54a2SToby Isaac 195dd8e54a2SToby Isaac PetscFunctionBegin; 196dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 197ef51cf95SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the base after setup"); 198dd8e54a2SToby Isaac ierr = PetscObjectReference((PetscObject)base);CHKERRQ(ierr); 199dd8e54a2SToby Isaac ierr = DMDestroy(&forest->base);CHKERRQ(ierr); 200dd8e54a2SToby Isaac forest->base = base; 201a0452a8eSToby Isaac if (base) { 202a0452a8eSToby Isaac PetscValidHeaderSpecific(base, DM_CLASSID, 2); 203dd8e54a2SToby Isaac ierr = DMGetDimension(base,&dim);CHKERRQ(ierr); 204dd8e54a2SToby Isaac ierr = DMSetDimension(dm,dim);CHKERRQ(ierr); 205dd8e54a2SToby Isaac ierr = DMGetCoordinateDim(base,&dimEmbed);CHKERRQ(ierr); 206dd8e54a2SToby Isaac ierr = DMSetCoordinateDim(dm,dimEmbed);CHKERRQ(ierr); 207a0452a8eSToby Isaac } 208dd8e54a2SToby Isaac PetscFunctionReturn(0); 209dd8e54a2SToby Isaac } 210dd8e54a2SToby Isaac 211dd8e54a2SToby Isaac #undef __FUNCT__ 212dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetBaseDM" 213dd8e54a2SToby Isaac PetscErrorCode DMForestGetBaseDM(DM dm, DM *base) 214dd8e54a2SToby Isaac { 215dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 216dd8e54a2SToby Isaac 217dd8e54a2SToby Isaac PetscFunctionBegin; 218dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 219dd8e54a2SToby Isaac PetscValidPointer(base, 2); 220dd8e54a2SToby Isaac *base = forest->base; 221dd8e54a2SToby Isaac PetscFunctionReturn(0); 222dd8e54a2SToby Isaac } 223dd8e54a2SToby Isaac 224dd8e54a2SToby Isaac #undef __FUNCT__ 225dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetCoarseForest" 226dd8e54a2SToby Isaac PetscErrorCode DMForestSetCoarseForest(DM dm,DM coarse) 227dd8e54a2SToby Isaac { 228dd8e54a2SToby Isaac PetscErrorCode ierr; 229dd8e54a2SToby Isaac 230dd8e54a2SToby Isaac PetscFunctionBegin; 231dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 232ef51cf95SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the coarse forest after setup"); 23356ba9f64SToby Isaac ierr = DMSetCoarseDM(dm,coarse);CHKERRQ(ierr); 234a0452a8eSToby Isaac if (coarse) { 235a0452a8eSToby Isaac PetscValidHeaderSpecific(coarse, DM_CLASSID, 2); 236a0452a8eSToby Isaac ierr = DMForestTemplate(coarse,dm);CHKERRQ(ierr); 237a0452a8eSToby Isaac } 238dd8e54a2SToby Isaac PetscFunctionReturn(0); 239dd8e54a2SToby Isaac } 240dd8e54a2SToby Isaac 241dd8e54a2SToby Isaac #undef __FUNCT__ 242dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetCoarseForest" 243dd8e54a2SToby Isaac PetscErrorCode DMForestGetCoarseForest(DM dm, DM *coarse) 244dd8e54a2SToby Isaac { 24556ba9f64SToby Isaac PetscErrorCode ierr; 246dd8e54a2SToby Isaac 247dd8e54a2SToby Isaac PetscFunctionBegin; 24856ba9f64SToby Isaac ierr = DMGetCoarseDM(dm,coarse);CHKERRQ(ierr); 249dd8e54a2SToby Isaac PetscFunctionReturn(0); 250dd8e54a2SToby Isaac } 251dd8e54a2SToby Isaac 252dd8e54a2SToby Isaac #undef __FUNCT__ 253dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetFineForest" 254dd8e54a2SToby Isaac PetscErrorCode DMForestSetFineForest(DM dm,DM fine) 255dd8e54a2SToby Isaac { 256dd8e54a2SToby Isaac PetscErrorCode ierr; 257dd8e54a2SToby Isaac 258dd8e54a2SToby Isaac PetscFunctionBegin; 259dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 260ef51cf95SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the fine forest after setup"); 26188bdff64SToby Isaac ierr = DMSetFineDM(dm,fine);CHKERRQ(ierr); 262a0452a8eSToby Isaac if (fine) { 263a0452a8eSToby Isaac PetscValidHeaderSpecific(fine, DM_CLASSID, 2); 264a0452a8eSToby Isaac ierr = DMForestTemplate(fine,dm);CHKERRQ(ierr); 265a0452a8eSToby Isaac } 266dd8e54a2SToby Isaac PetscFunctionReturn(0); 267dd8e54a2SToby Isaac } 268dd8e54a2SToby Isaac 269dd8e54a2SToby Isaac #undef __FUNCT__ 270ef51cf95SToby Isaac #define __FUNCT__ "DMForestGetFineForest" 271dd8e54a2SToby Isaac PetscErrorCode DMForestGetFineForest(DM dm, DM *fine) 272dd8e54a2SToby Isaac { 27388bdff64SToby Isaac PetscErrorCode ierr; 274dd8e54a2SToby Isaac 275dd8e54a2SToby Isaac PetscFunctionBegin; 27688bdff64SToby Isaac ierr = DMGetFineDM(dm,fine);CHKERRQ(ierr); 277dd8e54a2SToby Isaac PetscFunctionReturn(0); 278dd8e54a2SToby Isaac } 279dd8e54a2SToby Isaac 280dd8e54a2SToby Isaac #undef __FUNCT__ 281dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetAdjacencyDimension" 282dd8e54a2SToby Isaac PetscErrorCode DMForestSetAdjacencyDimension(DM dm, PetscInt adjDim) 283dd8e54a2SToby Isaac { 284dd8e54a2SToby Isaac PetscInt dim; 285dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 286dd8e54a2SToby Isaac PetscErrorCode ierr; 287dd8e54a2SToby Isaac 288dd8e54a2SToby Isaac PetscFunctionBegin; 289dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 290ef51cf95SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the adjacency dimension after setup"); 291dd8e54a2SToby Isaac if (adjDim < 0) SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_OUTOFRANGE,"adjacency dim cannot be < 0: %d", adjDim); 292dd8e54a2SToby Isaac ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr); 293dd8e54a2SToby Isaac if (adjDim > dim) SETERRQ2(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_OUTOFRANGE,"adjacency dim cannot be > %d: %d", dim, adjDim); 294dd8e54a2SToby Isaac forest->adjDim = adjDim; 295dd8e54a2SToby Isaac PetscFunctionReturn(0); 296dd8e54a2SToby Isaac } 297dd8e54a2SToby Isaac 298dd8e54a2SToby Isaac #undef __FUNCT__ 299dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetAdjacencyCodimension" 300dd8e54a2SToby Isaac PetscErrorCode DMForestSetAdjacencyCodimension(DM dm, PetscInt adjCodim) 301dd8e54a2SToby Isaac { 302dd8e54a2SToby Isaac PetscInt dim; 303dd8e54a2SToby Isaac PetscErrorCode ierr; 304dd8e54a2SToby Isaac 305dd8e54a2SToby Isaac PetscFunctionBegin; 306dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 307dd8e54a2SToby Isaac ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr); 308dd8e54a2SToby Isaac ierr = DMForestSetAdjacencyDimension(dm,dim-adjCodim);CHKERRQ(ierr); 309dd8e54a2SToby Isaac PetscFunctionReturn(0); 310dd8e54a2SToby Isaac } 311dd8e54a2SToby Isaac 312dd8e54a2SToby Isaac #undef __FUNCT__ 313dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetAdjacencyDimension" 314dd8e54a2SToby Isaac PetscErrorCode DMForestGetAdjacencyDimension(DM dm, PetscInt *adjDim) 315dd8e54a2SToby Isaac { 316dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 317dd8e54a2SToby Isaac 318dd8e54a2SToby Isaac PetscFunctionBegin; 319dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 320dd8e54a2SToby Isaac PetscValidIntPointer(adjDim,2); 321dd8e54a2SToby Isaac *adjDim = forest->adjDim; 322dd8e54a2SToby Isaac PetscFunctionReturn(0); 323dd8e54a2SToby Isaac } 324dd8e54a2SToby Isaac 325dd8e54a2SToby Isaac #undef __FUNCT__ 326dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetAdjacencyCodimension" 327dd8e54a2SToby Isaac PetscErrorCode DMForestGetAdjacencyCodimension(DM dm, PetscInt *adjCodim) 328dd8e54a2SToby Isaac { 329dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 330dd8e54a2SToby Isaac PetscInt dim; 331dd8e54a2SToby Isaac PetscErrorCode ierr; 332dd8e54a2SToby Isaac 333dd8e54a2SToby Isaac PetscFunctionBegin; 334dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 335dd8e54a2SToby Isaac PetscValidIntPointer(adjCodim,2); 336dd8e54a2SToby Isaac ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr); 337dd8e54a2SToby Isaac *adjCodim = dim - forest->adjDim; 338dd8e54a2SToby Isaac PetscFunctionReturn(0); 339dd8e54a2SToby Isaac } 340dd8e54a2SToby Isaac 341dd8e54a2SToby Isaac #undef __FUNCT__ 342ef51cf95SToby Isaac #define __FUNCT__ "DMForestSetPartitionOverlap" 343dd8e54a2SToby Isaac PetscErrorCode DMForestSetPartitionOverlap(DM dm, PetscInt overlap) 344dd8e54a2SToby Isaac { 345dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 346dd8e54a2SToby Isaac 347dd8e54a2SToby Isaac PetscFunctionBegin; 348dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 349ef51cf95SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the overlap after setup"); 350dd8e54a2SToby Isaac if (overlap < 0) SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_OUTOFRANGE,"overlap cannot be < 0: %d", overlap); 351dd8e54a2SToby Isaac forest->overlap = overlap; 352dd8e54a2SToby Isaac PetscFunctionReturn(0); 353dd8e54a2SToby Isaac } 354dd8e54a2SToby Isaac 355dd8e54a2SToby Isaac #undef __FUNCT__ 356dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetPartitionOverlap" 357dd8e54a2SToby Isaac PetscErrorCode DMForestGetPartitionOverlap(DM dm, PetscInt *overlap) 358dd8e54a2SToby Isaac { 359dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 360dd8e54a2SToby Isaac 361dd8e54a2SToby Isaac PetscFunctionBegin; 362dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 363dd8e54a2SToby Isaac PetscValidIntPointer(overlap,2); 364dd8e54a2SToby Isaac *overlap = forest->overlap; 365dd8e54a2SToby Isaac PetscFunctionReturn(0); 366dd8e54a2SToby Isaac } 367dd8e54a2SToby Isaac 368dd8e54a2SToby Isaac #undef __FUNCT__ 369dd8e54a2SToby Isaac #define __FUNCT__ "DMForestSetMinimumRefinement" 370dd8e54a2SToby Isaac PetscErrorCode DMForestSetMinimumRefinement(DM dm, PetscInt minRefinement) 371dd8e54a2SToby Isaac { 372dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 373dd8e54a2SToby Isaac 374dd8e54a2SToby Isaac PetscFunctionBegin; 375dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 376ef51cf95SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the minimum refinement after setup"); 377dd8e54a2SToby Isaac forest->minRefinement = minRefinement; 378dd8e54a2SToby Isaac PetscFunctionReturn(0); 379dd8e54a2SToby Isaac } 380dd8e54a2SToby Isaac 381dd8e54a2SToby Isaac #undef __FUNCT__ 382dd8e54a2SToby Isaac #define __FUNCT__ "DMForestGetMinimumRefinement" 383dd8e54a2SToby Isaac PetscErrorCode DMForestGetMinimumRefinement(DM dm, PetscInt *minRefinement) 384dd8e54a2SToby Isaac { 385dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 386dd8e54a2SToby Isaac 387dd8e54a2SToby Isaac PetscFunctionBegin; 388dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 389dd8e54a2SToby Isaac PetscValidIntPointer(minRefinement,2); 390dd8e54a2SToby Isaac *minRefinement = forest->minRefinement; 391dd8e54a2SToby Isaac PetscFunctionReturn(0); 392dd8e54a2SToby Isaac } 393dd8e54a2SToby Isaac 394dd8e54a2SToby Isaac #undef __FUNCT__ 39556ba9f64SToby Isaac #define __FUNCT__ "DMForestSetInitialRefinement" 39656ba9f64SToby Isaac PetscErrorCode DMForestSetInitialRefinement(DM dm, PetscInt initRefinement) 39756ba9f64SToby Isaac { 39856ba9f64SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 39956ba9f64SToby Isaac 40056ba9f64SToby Isaac PetscFunctionBegin; 40156ba9f64SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 40256ba9f64SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the initial refinement after setup"); 40356ba9f64SToby Isaac forest->initRefinement = initRefinement; 40456ba9f64SToby Isaac PetscFunctionReturn(0); 40556ba9f64SToby Isaac } 40656ba9f64SToby Isaac 40756ba9f64SToby Isaac #undef __FUNCT__ 40856ba9f64SToby Isaac #define __FUNCT__ "DMForestGetInitialRefinement" 40956ba9f64SToby Isaac PetscErrorCode DMForestGetInitialRefinement(DM dm, PetscInt *initRefinement) 41056ba9f64SToby Isaac { 41156ba9f64SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 41256ba9f64SToby Isaac 41356ba9f64SToby Isaac PetscFunctionBegin; 41456ba9f64SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 41556ba9f64SToby Isaac PetscValidIntPointer(initRefinement,2); 41656ba9f64SToby Isaac *initRefinement = forest->initRefinement; 41756ba9f64SToby Isaac PetscFunctionReturn(0); 41856ba9f64SToby Isaac } 41956ba9f64SToby Isaac 42056ba9f64SToby Isaac #undef __FUNCT__ 421c7eeac06SToby Isaac #define __FUNCT__ "DMForestSetMaximumRefinement" 422c7eeac06SToby Isaac PetscErrorCode DMForestSetMaximumRefinement(DM dm, PetscInt maxRefinement) 423dd8e54a2SToby Isaac { 424dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 425dd8e54a2SToby Isaac 426dd8e54a2SToby Isaac PetscFunctionBegin; 427dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 428ef51cf95SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the maximum refinement after setup"); 429c7eeac06SToby Isaac forest->maxRefinement = maxRefinement; 430dd8e54a2SToby Isaac PetscFunctionReturn(0); 431dd8e54a2SToby Isaac } 432dd8e54a2SToby Isaac 433dd8e54a2SToby Isaac #undef __FUNCT__ 434c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetMaximumRefinement" 435c7eeac06SToby Isaac PetscErrorCode DMForestGetMaximumRefinement(DM dm, PetscInt *maxRefinement) 436dd8e54a2SToby Isaac { 437dd8e54a2SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 438dd8e54a2SToby Isaac 439dd8e54a2SToby Isaac PetscFunctionBegin; 440dd8e54a2SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 441c7eeac06SToby Isaac PetscValidIntPointer(maxRefinement,2); 442c7eeac06SToby Isaac *maxRefinement = forest->maxRefinement; 443dd8e54a2SToby Isaac PetscFunctionReturn(0); 444dd8e54a2SToby Isaac } 445c7eeac06SToby Isaac 446c7eeac06SToby Isaac #undef __FUNCT__ 447c7eeac06SToby Isaac #define __FUNCT__ "DMForestSetAdaptivityStrategy" 448c7eeac06SToby Isaac PetscErrorCode DMForestSetAdaptivityStrategy(DM dm, DMForestAdaptivityStrategy adaptStrategy) 449c7eeac06SToby Isaac { 450c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 451c7eeac06SToby Isaac PetscErrorCode ierr; 452c7eeac06SToby Isaac 453c7eeac06SToby Isaac PetscFunctionBegin; 454c7eeac06SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 455c7eeac06SToby Isaac ierr = PetscFree(forest->adaptStrategy);CHKERRQ(ierr); 456a73e2921SToby Isaac ierr = PetscStrallocpy((const char *) adaptStrategy,(char **)&forest->adaptStrategy);CHKERRQ(ierr); 457c7eeac06SToby Isaac PetscFunctionReturn(0); 458c7eeac06SToby Isaac } 459c7eeac06SToby Isaac 460c7eeac06SToby Isaac #undef __FUNCT__ 461c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetAdaptivityStrategy" 462c7eeac06SToby Isaac PetscErrorCode DMForestGetAdaptivityStrategy(DM dm, DMForestAdaptivityStrategy *adaptStrategy) 463c7eeac06SToby Isaac { 464c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 465c7eeac06SToby Isaac 466c7eeac06SToby Isaac PetscFunctionBegin; 467c7eeac06SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 468c7eeac06SToby Isaac PetscValidPointer(adaptStrategy,2); 469c7eeac06SToby Isaac *adaptStrategy = forest->adaptStrategy; 470c7eeac06SToby Isaac PetscFunctionReturn(0); 471c7eeac06SToby Isaac } 472c7eeac06SToby Isaac 473c7eeac06SToby Isaac #undef __FUNCT__ 474c7eeac06SToby Isaac #define __FUNCT__ "DMForestSetGradeFactor" 475c7eeac06SToby Isaac PetscErrorCode DMForestSetGradeFactor(DM dm, PetscInt grade) 476c7eeac06SToby Isaac { 477c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 478c7eeac06SToby Isaac 479c7eeac06SToby Isaac PetscFunctionBegin; 480c7eeac06SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 481ef51cf95SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the grade factor after setup"); 482c7eeac06SToby Isaac forest->gradeFactor = grade; 483c7eeac06SToby Isaac PetscFunctionReturn(0); 484c7eeac06SToby Isaac } 485c7eeac06SToby Isaac 486c7eeac06SToby Isaac #undef __FUNCT__ 487c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetGradeFactor" 488c7eeac06SToby Isaac PetscErrorCode DMForestGetGradeFactor(DM dm, PetscInt *grade) 489c7eeac06SToby Isaac { 490c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 491c7eeac06SToby Isaac 492c7eeac06SToby Isaac PetscFunctionBegin; 493c7eeac06SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 494c7eeac06SToby Isaac PetscValidIntPointer(grade,2); 495c7eeac06SToby Isaac *grade = forest->gradeFactor; 496c7eeac06SToby Isaac PetscFunctionReturn(0); 497c7eeac06SToby Isaac } 498c7eeac06SToby Isaac 499c7eeac06SToby Isaac #undef __FUNCT__ 500ef51cf95SToby Isaac #define __FUNCT__ "DMForestSetCellWeightFactor" 501ef51cf95SToby Isaac PetscErrorCode DMForestSetCellWeightFactor(DM dm, PetscReal weightsFactor) 502c7eeac06SToby Isaac { 503c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 504c7eeac06SToby Isaac 505c7eeac06SToby Isaac PetscFunctionBegin; 506c7eeac06SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 507ef51cf95SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the weights factor after setup"); 508c7eeac06SToby Isaac forest->weightsFactor = weightsFactor; 509c7eeac06SToby Isaac PetscFunctionReturn(0); 510c7eeac06SToby Isaac } 511c7eeac06SToby Isaac 512c7eeac06SToby Isaac #undef __FUNCT__ 513ef51cf95SToby Isaac #define __FUNCT__ "DMForestGetCellWeightFactor" 514ef51cf95SToby Isaac PetscErrorCode DMForestGetCellWeightFactor(DM dm, PetscReal *weightsFactor) 515c7eeac06SToby Isaac { 516c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 517c7eeac06SToby Isaac 518c7eeac06SToby Isaac PetscFunctionBegin; 519c7eeac06SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 520c7eeac06SToby Isaac PetscValidRealPointer(weightsFactor,2); 521c7eeac06SToby Isaac *weightsFactor = forest->weightsFactor; 522c7eeac06SToby Isaac PetscFunctionReturn(0); 523c7eeac06SToby Isaac } 524c7eeac06SToby Isaac 525c7eeac06SToby Isaac #undef __FUNCT__ 526c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetCellChart" 527c7eeac06SToby Isaac PetscErrorCode DMForestGetCellChart(DM dm, PetscInt *cStart, PetscInt *cEnd) 528c7eeac06SToby Isaac { 529c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 530c7eeac06SToby Isaac PetscErrorCode ierr; 531c7eeac06SToby Isaac 532c7eeac06SToby Isaac PetscFunctionBegin; 533c7eeac06SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 534c7eeac06SToby Isaac PetscValidIntPointer(cStart,2); 535c7eeac06SToby Isaac PetscValidIntPointer(cEnd,2); 536c7eeac06SToby Isaac if (((forest->cStart == PETSC_DETERMINE) || (forest->cEnd == PETSC_DETERMINE)) && forest->createcellchart) { 537c7eeac06SToby Isaac ierr = forest->createcellchart(dm,&forest->cStart,&forest->cEnd);CHKERRQ(ierr); 538c7eeac06SToby Isaac } 539c7eeac06SToby Isaac *cStart = forest->cStart; 540c7eeac06SToby Isaac *cEnd = forest->cEnd; 541c7eeac06SToby Isaac PetscFunctionReturn(0); 542c7eeac06SToby Isaac } 543c7eeac06SToby Isaac 544c7eeac06SToby Isaac #undef __FUNCT__ 545c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetCellSF" 546c7eeac06SToby Isaac PetscErrorCode DMForestGetCellSF(DM dm, PetscSF *cellSF) 547c7eeac06SToby Isaac { 548c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 549c7eeac06SToby Isaac PetscErrorCode ierr; 550c7eeac06SToby Isaac 551c7eeac06SToby Isaac PetscFunctionBegin; 552c7eeac06SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 553c7eeac06SToby Isaac PetscValidPointer(cellSF,2); 554c7eeac06SToby Isaac if ((!forest->cellSF) && forest->createcellsf) { 555c7eeac06SToby Isaac ierr = forest->createcellsf(dm,&forest->cellSF);CHKERRQ(ierr); 556c7eeac06SToby Isaac } 557c7eeac06SToby Isaac *cellSF = forest->cellSF; 558c7eeac06SToby Isaac PetscFunctionReturn(0); 559c7eeac06SToby Isaac } 560c7eeac06SToby Isaac 561c7eeac06SToby Isaac #undef __FUNCT__ 562*ebdf65a2SToby Isaac #define __FUNCT__ "DMForestSetAdaptivityLabel" 563*ebdf65a2SToby Isaac PetscErrorCode DMForestSetAdaptivityLabel(DM dm, const char * adaptLabel) 564c7eeac06SToby Isaac { 565c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 566c7eeac06SToby Isaac PetscErrorCode ierr; 567c7eeac06SToby Isaac 568c7eeac06SToby Isaac PetscFunctionBegin; 569c7eeac06SToby Isaac PetscValidHeaderSpecific(dm,DM_CLASSID,1); 570*ebdf65a2SToby Isaac ierr = PetscFree(forest->adaptLabel);CHKERRQ(ierr); 571*ebdf65a2SToby Isaac ierr = PetscStrallocpy(adaptLabel,&forest->adaptLabel);CHKERRQ(ierr); 572c7eeac06SToby Isaac PetscFunctionReturn(0); 573c7eeac06SToby Isaac } 574c7eeac06SToby Isaac 575c7eeac06SToby Isaac #undef __FUNCT__ 576*ebdf65a2SToby Isaac #define __FUNCT__ "DMForestGetAdaptivityLabel" 577*ebdf65a2SToby Isaac PetscErrorCode DMForestGetAdaptivityLabel(DM dm, DMLabel *label) 578c7eeac06SToby Isaac { 579c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 580*ebdf65a2SToby Isaac PetscErrorCode ierr; 581c7eeac06SToby Isaac 582c7eeac06SToby Isaac PetscFunctionBegin; 583c7eeac06SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 584*ebdf65a2SToby Isaac if (forest->adaptLabel) { 585*ebdf65a2SToby Isaac ierr = DMGetLabel(dm,forest->adaptLabel,label);CHKERRQ(ierr); 586*ebdf65a2SToby Isaac } 587*ebdf65a2SToby Isaac else { 588*ebdf65a2SToby Isaac *label = NULL; 589*ebdf65a2SToby Isaac } 590c7eeac06SToby Isaac PetscFunctionReturn(0); 591c7eeac06SToby Isaac } 592c7eeac06SToby Isaac 593c7eeac06SToby Isaac #undef __FUNCT__ 594c7eeac06SToby Isaac #define __FUNCT__ "DMForestSetCellWeights" 595c7eeac06SToby Isaac PetscErrorCode DMForestSetCellWeights(DM dm, PetscReal weights[], PetscCopyMode copyMode) 596c7eeac06SToby Isaac { 597c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 598c7eeac06SToby Isaac PetscInt cStart, cEnd; 599c7eeac06SToby Isaac PetscErrorCode ierr; 600c7eeac06SToby Isaac 601c7eeac06SToby Isaac PetscFunctionBegin; 602c7eeac06SToby Isaac PetscValidHeaderSpecific(dm,DM_CLASSID,1); 603c7eeac06SToby Isaac ierr = DMForestGetCellChart(dm,&cStart,&cEnd);CHKERRQ(ierr); 604c7eeac06SToby Isaac if (cEnd < cStart) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"cell chart [%d,%d) is not valid",cStart,cEnd); 605c7eeac06SToby Isaac if (copyMode == PETSC_COPY_VALUES) { 606c7eeac06SToby Isaac if (forest->cellWeightsCopyMode != PETSC_OWN_POINTER || forest->cellWeights == weights) { 607c7eeac06SToby Isaac ierr = PetscMalloc1(cEnd-cStart,&forest->cellWeights);CHKERRQ(ierr); 608c7eeac06SToby Isaac } 609c7eeac06SToby Isaac ierr = PetscMemcpy(forest->cellWeights,weights,(cEnd-cStart)*sizeof(*weights));CHKERRQ(ierr); 610c7eeac06SToby Isaac forest->cellWeightsCopyMode = PETSC_OWN_POINTER; 611c7eeac06SToby Isaac PetscFunctionReturn(0); 612c7eeac06SToby Isaac } 613c7eeac06SToby Isaac if (forest->cellWeightsCopyMode == PETSC_OWN_POINTER) { 614c7eeac06SToby Isaac ierr = PetscFree(forest->cellWeights);CHKERRQ(ierr); 615c7eeac06SToby Isaac } 616c7eeac06SToby Isaac forest->cellWeights = weights; 617c7eeac06SToby Isaac forest->cellWeightsCopyMode = copyMode; 618c7eeac06SToby Isaac PetscFunctionReturn(0); 619c7eeac06SToby Isaac } 620c7eeac06SToby Isaac 621c7eeac06SToby Isaac #undef __FUNCT__ 622c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetCellWeights" 623c7eeac06SToby Isaac PetscErrorCode DMForestGetCellWeights(DM dm, PetscReal **weights) 624c7eeac06SToby Isaac { 625c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 626c7eeac06SToby Isaac 627c7eeac06SToby Isaac PetscFunctionBegin; 628c7eeac06SToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 629c7eeac06SToby Isaac PetscValidPointer(weights,2); 630c7eeac06SToby Isaac *weights = forest->cellWeights; 631c7eeac06SToby Isaac PetscFunctionReturn(0); 632c7eeac06SToby Isaac } 633c7eeac06SToby Isaac 634c7eeac06SToby Isaac #undef __FUNCT__ 635c7eeac06SToby Isaac #define __FUNCT__ "DMForestSetWeightCapacity" 636c7eeac06SToby Isaac PetscErrorCode DMForestSetWeightCapacity(DM dm, PetscReal capacity) 637c7eeac06SToby Isaac { 638c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 639c7eeac06SToby Isaac 640c7eeac06SToby Isaac PetscFunctionBegin; 641c7eeac06SToby Isaac PetscValidHeaderSpecific(dm,DM_CLASSID,1); 642ef51cf95SToby Isaac if (dm->setupcalled) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Cannot change the weight capacity after setup"); 643c7eeac06SToby Isaac if (capacity < 0.) SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_OUTOFRANGE,"Cannot have negative weight capacity; %f",capacity); 644c7eeac06SToby Isaac forest->weightCapacity = capacity; 645c7eeac06SToby Isaac PetscFunctionReturn(0); 646c7eeac06SToby Isaac } 647c7eeac06SToby Isaac 648c7eeac06SToby Isaac #undef __FUNCT__ 649c7eeac06SToby Isaac #define __FUNCT__ "DMForestGetWeightCapacity" 650c7eeac06SToby Isaac PetscErrorCode DMForestGetWeightCapacity(DM dm, PetscReal *capacity) 651c7eeac06SToby Isaac { 652c7eeac06SToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 653c7eeac06SToby Isaac 654c7eeac06SToby Isaac PetscFunctionBegin; 655c7eeac06SToby Isaac PetscValidHeaderSpecific(dm,DM_CLASSID,1); 656c7eeac06SToby Isaac PetscValidRealPointer(capacity,2); 657c7eeac06SToby Isaac *capacity = forest->weightCapacity; 658c7eeac06SToby Isaac PetscFunctionReturn(0); 659c7eeac06SToby Isaac } 660c7eeac06SToby Isaac 661dd8e54a2SToby Isaac #undef __FUNCT__ 662db4d5e8cSToby Isaac #define __FUNCT__ "DMSetFromOptions_Forest" 6630709b2feSToby Isaac PETSC_EXTERN PetscErrorCode DMSetFromOptions_Forest(PetscOptionItems *PetscOptionsObject,DM dm) 664db4d5e8cSToby Isaac { 665db4d5e8cSToby Isaac DM_Forest *forest = (DM_Forest *) dm->data; 66656ba9f64SToby Isaac PetscBool flg, flg1, flg2, flg3, flg4; 667dd8e54a2SToby Isaac DMForestTopology oldTopo; 668c7eeac06SToby Isaac char stringBuffer[256]; 669dd8e54a2SToby Isaac PetscViewer viewer; 670dd8e54a2SToby Isaac PetscViewerFormat format; 67156ba9f64SToby Isaac PetscInt adjDim, adjCodim, overlap, minRefinement, initRefinement, maxRefinement, grade; 672c7eeac06SToby Isaac PetscReal weightsFactor; 673c7eeac06SToby Isaac DMForestAdaptivityStrategy adaptStrategy; 674db4d5e8cSToby Isaac PetscErrorCode ierr; 675db4d5e8cSToby Isaac 676db4d5e8cSToby Isaac PetscFunctionBegin; 677db4d5e8cSToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 678db4d5e8cSToby Isaac forest->setFromOptions = PETSC_TRUE; 679dd8e54a2SToby Isaac ierr = DMForestGetTopology(dm, &oldTopo);CHKERRQ(ierr); 680a3eda1eaSToby Isaac ierr = PetscOptionsHead(PetscOptionsObject,"DMForest Options");CHKERRQ(ierr); 68156ba9f64SToby Isaac ierr = PetscOptionsString("-dm_forest_topology","the topology of the forest's base mesh","DMForestSetTopology",oldTopo,stringBuffer,256,&flg1);CHKERRQ(ierr); 68256ba9f64SToby Isaac ierr = PetscOptionsViewer("-dm_forest_base_dm","load the base DM from a viewer specification","DMForestSetBaseDM",&viewer,&format,&flg2);CHKERRQ(ierr); 68356ba9f64SToby Isaac ierr = PetscOptionsViewer("-dm_forest_coarse_forest","load the coarse forest from a viewer specification","DMForestSetCoarseForest",&viewer,&format,&flg3);CHKERRQ(ierr); 68456ba9f64SToby Isaac ierr = PetscOptionsViewer("-dm_forest_fine_forest","load the fine forest from a viewer specification","DMForestSetFineForest",&viewer,&format,&flg4);CHKERRQ(ierr); 68556ba9f64SToby Isaac if ((PetscInt) flg1 + (PetscInt) flg2 + (PetscInt) flg3 + (PetscInt) flg4 > 1) { 68656ba9f64SToby Isaac SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_INCOMP,"Specify only one of -dm_forest_{topology,base_dm,coarse_forest,fine_forest}"); 687dd8e54a2SToby Isaac } 68856ba9f64SToby Isaac if (flg1) { 68956ba9f64SToby Isaac ierr = DMForestSetTopology(dm,(DMForestTopology)stringBuffer);CHKERRQ(ierr); 69056ba9f64SToby Isaac ierr = DMForestSetBaseDM(dm,NULL);CHKERRQ(ierr); 69156ba9f64SToby Isaac ierr = DMForestSetCoarseForest(dm,NULL);CHKERRQ(ierr); 69256ba9f64SToby Isaac ierr = DMForestSetFineForest(dm,NULL);CHKERRQ(ierr); 69356ba9f64SToby Isaac } 69456ba9f64SToby Isaac if (flg2) { 695dd8e54a2SToby Isaac DM base; 696dd8e54a2SToby Isaac 697dd8e54a2SToby Isaac ierr = DMCreate(PetscObjectComm((PetscObject)dm),&base);CHKERRQ(ierr); 698dd8e54a2SToby Isaac ierr = PetscViewerPushFormat(viewer,format);CHKERRQ(ierr); 699dd8e54a2SToby Isaac ierr = DMLoad(base,viewer);CHKERRQ(ierr); 700dd8e54a2SToby Isaac ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 701dd8e54a2SToby Isaac ierr = DMForestSetBaseDM(dm,base);CHKERRQ(ierr); 702dd8e54a2SToby Isaac ierr = DMDestroy(&base);CHKERRQ(ierr); 70356ba9f64SToby Isaac ierr = DMForestSetTopology(dm,NULL);CHKERRQ(ierr); 70456ba9f64SToby Isaac ierr = DMForestSetCoarseForest(dm,NULL);CHKERRQ(ierr); 70556ba9f64SToby Isaac ierr = DMForestSetFineForest(dm,NULL);CHKERRQ(ierr); 706dd8e54a2SToby Isaac } 70756ba9f64SToby Isaac if (flg3) { 708dd8e54a2SToby Isaac DM coarse; 709dd8e54a2SToby Isaac 710dd8e54a2SToby Isaac ierr = DMCreate(PetscObjectComm((PetscObject)dm),&coarse);CHKERRQ(ierr); 711dd8e54a2SToby Isaac ierr = PetscViewerPushFormat(viewer,format);CHKERRQ(ierr); 712dd8e54a2SToby Isaac ierr = DMLoad(coarse,viewer);CHKERRQ(ierr); 713dd8e54a2SToby Isaac ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 714dd8e54a2SToby Isaac ierr = DMForestSetCoarseForest(dm,coarse);CHKERRQ(ierr); 715dd8e54a2SToby Isaac ierr = DMDestroy(&coarse);CHKERRQ(ierr); 71656ba9f64SToby Isaac ierr = DMForestSetTopology(dm,NULL);CHKERRQ(ierr); 71756ba9f64SToby Isaac ierr = DMForestSetBaseDM(dm,NULL);CHKERRQ(ierr); 71856ba9f64SToby Isaac ierr = DMForestSetFineForest(dm,NULL);CHKERRQ(ierr); 719dd8e54a2SToby Isaac } 72056ba9f64SToby Isaac if (flg4) { 721dd8e54a2SToby Isaac DM fine; 722dd8e54a2SToby Isaac 723dd8e54a2SToby Isaac ierr = DMCreate(PetscObjectComm((PetscObject)dm),&fine);CHKERRQ(ierr); 724dd8e54a2SToby Isaac ierr = PetscViewerPushFormat(viewer,format);CHKERRQ(ierr); 725dd8e54a2SToby Isaac ierr = DMLoad(fine,viewer);CHKERRQ(ierr); 726dd8e54a2SToby Isaac ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 727dd8e54a2SToby Isaac ierr = DMForestSetFineForest(dm,fine);CHKERRQ(ierr); 728dd8e54a2SToby Isaac ierr = DMDestroy(&fine);CHKERRQ(ierr); 72956ba9f64SToby Isaac ierr = DMForestSetTopology(dm,NULL);CHKERRQ(ierr); 73056ba9f64SToby Isaac ierr = DMForestSetBaseDM(dm,NULL);CHKERRQ(ierr); 73156ba9f64SToby Isaac ierr = DMForestSetCoarseForest(dm,NULL);CHKERRQ(ierr); 732dd8e54a2SToby Isaac } 733dd8e54a2SToby Isaac ierr = DMForestGetAdjacencyDimension(dm,&adjDim);CHKERRQ(ierr); 734dd8e54a2SToby Isaac ierr = PetscOptionsInt("-dm_forest_adjacency_dimension","set the dimension of points that define adjacency in the forest","DMForestSetAdjacencyDimension",adjDim,&adjDim,&flg);CHKERRQ(ierr); 735dd8e54a2SToby Isaac if (flg) { 736dd8e54a2SToby Isaac ierr = DMForestSetAdjacencyDimension(dm,adjDim);CHKERRQ(ierr); 737dd8e54a2SToby Isaac } 738dd8e54a2SToby Isaac else { 739dd8e54a2SToby Isaac ierr = DMForestGetAdjacencyCodimension(dm,&adjCodim);CHKERRQ(ierr); 740dd8e54a2SToby Isaac ierr = PetscOptionsInt("-dm_forest_adjacency_codimension","set the codimension of points that define adjacency in the forest","DMForestSetAdjacencyCodimension",adjCodim,&adjCodim,&flg);CHKERRQ(ierr); 741dd8e54a2SToby Isaac if (flg) { 742dd8e54a2SToby Isaac ierr = DMForestSetAdjacencyCodimension(dm,adjCodim);CHKERRQ(ierr); 743dd8e54a2SToby Isaac } 744dd8e54a2SToby Isaac } 745dd8e54a2SToby Isaac ierr = DMForestGetPartitionOverlap(dm,&overlap);CHKERRQ(ierr); 746dd8e54a2SToby Isaac ierr = PetscOptionsInt("-dm_forest_partition_overlap","set the degree of partition overlap","DMForestSetPartitionOverlap",overlap,&overlap,&flg);CHKERRQ(ierr); 747dd8e54a2SToby Isaac if (flg) { 748dd8e54a2SToby Isaac ierr = DMForestSetPartitionOverlap(dm,overlap);CHKERRQ(ierr); 749dd8e54a2SToby Isaac } 750a6121fbdSMatthew G. Knepley #if 0 751a6121fbdSMatthew 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); 752a6121fbdSMatthew G. Knepley if (flg) { 753a6121fbdSMatthew G. Knepley ierr = DMForestSetMinimumRefinement(dm,minRefinement);CHKERRQ(ierr); 754a6121fbdSMatthew G. Knepley ierr = DMForestSetInitialRefinement(dm,minRefinement);CHKERRQ(ierr); 755a6121fbdSMatthew G. Knepley } 756a6121fbdSMatthew 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); 757a6121fbdSMatthew G. Knepley if (flg) { 758a6121fbdSMatthew G. Knepley ierr = DMForestSetMinimumRefinement(dm,0);CHKERRQ(ierr); 759a6121fbdSMatthew G. Knepley ierr = DMForestSetInitialRefinement(dm,initRefinement);CHKERRQ(ierr); 760a6121fbdSMatthew G. Knepley } 761a6121fbdSMatthew G. Knepley #endif 762dd8e54a2SToby Isaac ierr = DMForestGetMinimumRefinement(dm,&minRefinement);CHKERRQ(ierr); 763dd8e54a2SToby Isaac ierr = PetscOptionsInt("-dm_forest_minimum_refinement","set the minimum level of refinement in the forest","DMForestSetMinimumRefinement",minRefinement,&minRefinement,&flg);CHKERRQ(ierr); 764dd8e54a2SToby Isaac if (flg) { 765dd8e54a2SToby Isaac ierr = DMForestSetMinimumRefinement(dm,minRefinement);CHKERRQ(ierr); 766db4d5e8cSToby Isaac } 76756ba9f64SToby Isaac ierr = DMForestGetInitialRefinement(dm,&initRefinement);CHKERRQ(ierr); 76856ba9f64SToby Isaac ierr = PetscOptionsInt("-dm_forest_initial_refinement","set the initial level of refinement in the forest","DMForestSetInitialRefinement",initRefinement,&initRefinement,&flg);CHKERRQ(ierr); 76956ba9f64SToby Isaac if (flg) { 77056ba9f64SToby Isaac ierr = DMForestSetInitialRefinement(dm,initRefinement);CHKERRQ(ierr); 77156ba9f64SToby Isaac } 772c7eeac06SToby Isaac ierr = DMForestGetMaximumRefinement(dm,&maxRefinement);CHKERRQ(ierr); 773c7eeac06SToby Isaac ierr = PetscOptionsInt("-dm_forest_maximum_refinement","set the maximum level of refinement in the forest","DMForestSetMaximumRefinement",maxRefinement,&maxRefinement,&flg);CHKERRQ(ierr); 774c7eeac06SToby Isaac if (flg) { 775c7eeac06SToby Isaac ierr = DMForestSetMaximumRefinement(dm,maxRefinement);CHKERRQ(ierr); 776c7eeac06SToby Isaac } 777c7eeac06SToby Isaac ierr = DMForestGetAdaptivityStrategy(dm,&adaptStrategy);CHKERRQ(ierr); 778c7eeac06SToby Isaac ierr = PetscOptionsString("-dm_forest_adaptivity_strategy","the forest's adaptivity-flag resolution strategy","DMForestSetAdaptivityStrategy",adaptStrategy,stringBuffer,256,&flg);CHKERRQ(ierr); 779c7eeac06SToby Isaac if (flg) { 780c7eeac06SToby Isaac ierr = DMForestSetAdaptivityStrategy(dm,(DMForestAdaptivityStrategy)stringBuffer);CHKERRQ(ierr); 781c7eeac06SToby Isaac } 782c7eeac06SToby Isaac ierr = DMForestGetGradeFactor(dm,&grade);CHKERRQ(ierr); 783c7eeac06SToby Isaac ierr = PetscOptionsInt("-dm_forest_grade_factor","grade factor between neighboring cells","DMForestSetGradeFactor",grade,&grade,&flg);CHKERRQ(ierr); 784c7eeac06SToby Isaac if (flg) { 785c7eeac06SToby Isaac ierr = DMForestSetGradeFactor(dm,grade);CHKERRQ(ierr); 786c7eeac06SToby Isaac } 787c7eeac06SToby Isaac ierr = DMForestGetCellWeightFactor(dm,&weightsFactor);CHKERRQ(ierr); 788c7eeac06SToby Isaac ierr = PetscOptionsReal("-dm_forest_cell_weight_factor","multiplying weight factor for cell refinement","DMForestSetCellWeightFactor",weightsFactor,&weightsFactor,&flg);CHKERRQ(ierr); 789c7eeac06SToby Isaac if (flg) { 790c7eeac06SToby Isaac ierr = DMForestSetCellWeightFactor(dm,weightsFactor);CHKERRQ(ierr); 791c7eeac06SToby Isaac } 792db4d5e8cSToby Isaac ierr = PetscOptionsTail();CHKERRQ(ierr); 793db4d5e8cSToby Isaac PetscFunctionReturn(0); 794db4d5e8cSToby Isaac } 795db4d5e8cSToby Isaac 796db4d5e8cSToby Isaac #undef __FUNCT__ 797d8984e3bSMatthew G. Knepley #define __FUNCT__ "DMCreateSubDM_Forest" 798d8984e3bSMatthew G. Knepley PetscErrorCode DMCreateSubDM_Forest(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm) 799d8984e3bSMatthew G. Knepley { 800d8984e3bSMatthew G. Knepley PetscErrorCode ierr; 801d8984e3bSMatthew G. Knepley 802d8984e3bSMatthew G. Knepley PetscFunctionBegin; 803d8984e3bSMatthew G. Knepley if (subdm) {ierr = DMClone(dm, subdm);CHKERRQ(ierr);} 804d8984e3bSMatthew G. Knepley ierr = DMCreateSubDM_Section_Private(dm, numFields, fields, is, subdm);CHKERRQ(ierr); 805d8984e3bSMatthew G. Knepley PetscFunctionReturn(0); 806d8984e3bSMatthew G. Knepley } 807d8984e3bSMatthew G. Knepley 808d8984e3bSMatthew G. Knepley #undef __FUNCT__ 809d222f98bSToby Isaac #define __FUNCT__ "DMInitialize_Forest" 810d222f98bSToby Isaac static PetscErrorCode DMInitialize_Forest(DM dm) 811d222f98bSToby Isaac { 812d222f98bSToby Isaac PetscErrorCode ierr; 813d222f98bSToby Isaac 814d222f98bSToby Isaac PetscFunctionBegin; 815d222f98bSToby Isaac ierr = PetscMemzero(dm->ops,sizeof(*(dm->ops)));CHKERRQ(ierr); 816d222f98bSToby Isaac 817d222f98bSToby Isaac dm->ops->clone = DMClone_Forest; 818d222f98bSToby Isaac dm->ops->setfromoptions = DMSetFromOptions_Forest; 819d222f98bSToby Isaac dm->ops->destroy = DMDestroy_Forest; 820d8984e3bSMatthew G. Knepley dm->ops->createsubdm = DMCreateSubDM_Forest; 821d222f98bSToby Isaac PetscFunctionReturn(0); 822d222f98bSToby Isaac } 823d222f98bSToby Isaac 824d222f98bSToby Isaac #undef __FUNCT__ 825db4d5e8cSToby Isaac #define __FUNCT__ "DMCreate_Forest" 826db4d5e8cSToby Isaac PETSC_EXTERN PetscErrorCode DMCreate_Forest(DM dm) 827db4d5e8cSToby Isaac { 828db4d5e8cSToby Isaac DM_Forest *forest; 829db4d5e8cSToby Isaac PetscErrorCode ierr; 830db4d5e8cSToby Isaac 831db4d5e8cSToby Isaac PetscFunctionBegin; 832db4d5e8cSToby Isaac PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 833db4d5e8cSToby Isaac ierr = PetscNewLog(dm,&forest);CHKERRQ(ierr); 834db4d5e8cSToby Isaac dm->dim = 0; 835db4d5e8cSToby Isaac dm->data = forest; 836db4d5e8cSToby Isaac forest->refct = 1; 837db4d5e8cSToby Isaac forest->data = NULL; 838dd8e54a2SToby Isaac forest->setFromOptions = PETSC_FALSE; 839db4d5e8cSToby Isaac forest->topology = NULL; 840db4d5e8cSToby Isaac forest->base = NULL; 841db4d5e8cSToby Isaac forest->adjDim = PETSC_DEFAULT; 842db4d5e8cSToby Isaac forest->overlap = PETSC_DEFAULT; 843db4d5e8cSToby Isaac forest->minRefinement = PETSC_DEFAULT; 844db4d5e8cSToby Isaac forest->maxRefinement = PETSC_DEFAULT; 84556ba9f64SToby Isaac forest->initRefinement = PETSC_DEFAULT; 846c7eeac06SToby Isaac forest->cStart = PETSC_DETERMINE; 847c7eeac06SToby Isaac forest->cEnd = PETSC_DETERMINE; 848db4d5e8cSToby Isaac forest->cellSF = 0; 849*ebdf65a2SToby Isaac forest->adaptLabel = NULL; 850db4d5e8cSToby Isaac forest->gradeFactor = 2; 851db4d5e8cSToby Isaac forest->cellWeights = NULL; 852db4d5e8cSToby Isaac forest->cellWeightsCopyMode = PETSC_USE_POINTER; 853db4d5e8cSToby Isaac forest->weightsFactor = 1.; 854db4d5e8cSToby Isaac forest->weightCapacity = 1.; 855a73e2921SToby Isaac ierr = DMForestSetAdaptivityStrategy(dm,DMFORESTADAPTALL);CHKERRQ(ierr); 856d222f98bSToby Isaac ierr = DMInitialize_Forest(dm);CHKERRQ(ierr); 857db4d5e8cSToby Isaac PetscFunctionReturn(0); 858db4d5e8cSToby Isaac } 859db4d5e8cSToby Isaac 860