1 2 #include <petscao.h> 3 #include <petsc/private/dmlabelimpl.h> 4 #include <petsc/private/dmfieldimpl.h> 5 #include <petsc/private/dmpleximpl.h> 6 #include <petsc/private/dmplextransformimpl.h> 7 #include <petsc/private/petscdsimpl.h> 8 #include <petsc/private/petscfeimpl.h> 9 #include <petsc/private/petscfvimpl.h> 10 #include <petsc/private/dmswarmimpl.h> 11 12 static PetscBool DMPackageInitialized = PETSC_FALSE; 13 /*@C 14 DMFinalizePackage - This function finalizes everything in the DM package. It is called 15 from PetscFinalize(). 16 17 Level: developer 18 19 .seealso: `PetscInitialize()` 20 @*/ 21 PetscErrorCode DMFinalizePackage(void) 22 { 23 PetscFunctionBegin; 24 PetscCall(PetscFunctionListDestroy(&DMList)); 25 DMPackageInitialized = PETSC_FALSE; 26 DMRegisterAllCalled = PETSC_FALSE; 27 PetscFunctionReturn(0); 28 } 29 30 #if defined(PETSC_HAVE_HYPRE) 31 PETSC_EXTERN PetscErrorCode MatCreate_HYPREStruct(Mat); 32 PETSC_EXTERN PetscErrorCode MatCreate_HYPRESStruct(Mat); 33 #endif 34 35 /*@C 36 DMInitializePackage - This function initializes everything in the DM package. It is called 37 from PetscDLLibraryRegister_petscdm() when using dynamic libraries, and on the first call to AOCreate() 38 or DMDACreate() when using shared or static libraries. 39 40 Level: developer 41 42 .seealso: `PetscInitialize()` 43 @*/ 44 PetscErrorCode DMInitializePackage(void) 45 { 46 char logList[256]; 47 PetscBool opt,pkg; 48 49 PetscFunctionBegin; 50 if (DMPackageInitialized) PetscFunctionReturn(0); 51 DMPackageInitialized = PETSC_TRUE; 52 53 /* Register Classes */ 54 PetscCall(PetscClassIdRegister("Distributed Mesh",&DM_CLASSID)); 55 PetscCall(PetscClassIdRegister("DM Label",&DMLABEL_CLASSID)); 56 PetscCall(PetscClassIdRegister("Quadrature",&PETSCQUADRATURE_CLASSID)); 57 PetscCall(PetscClassIdRegister("Mesh Transform",&DMPLEXTRANSFORM_CLASSID)); 58 59 #if defined(PETSC_HAVE_HYPRE) 60 PetscCall(MatRegister(MATHYPRESTRUCT, MatCreate_HYPREStruct)); 61 PetscCall(MatRegister(MATHYPRESSTRUCT, MatCreate_HYPRESStruct)); 62 #endif 63 PetscCall(PetscSectionSymRegister(PETSCSECTIONSYMLABEL,PetscSectionSymCreate_Label)); 64 65 /* Register Constructors */ 66 PetscCall(DMRegisterAll()); 67 /* Register Events */ 68 PetscCall(PetscLogEventRegister("DMConvert", DM_CLASSID,&DM_Convert)); 69 PetscCall(PetscLogEventRegister("DMGlobalToLocal", DM_CLASSID,&DM_GlobalToLocal)); 70 PetscCall(PetscLogEventRegister("DMLocalToGlobal", DM_CLASSID,&DM_LocalToGlobal)); 71 PetscCall(PetscLogEventRegister("DMLocatePoints", DM_CLASSID,&DM_LocatePoints)); 72 PetscCall(PetscLogEventRegister("DMCoarsen", DM_CLASSID,&DM_Coarsen)); 73 PetscCall(PetscLogEventRegister("DMRefine", DM_CLASSID,&DM_Refine)); 74 PetscCall(PetscLogEventRegister("DMCreateInterp", DM_CLASSID,&DM_CreateInterpolation)); 75 PetscCall(PetscLogEventRegister("DMCreateRestrict", DM_CLASSID,&DM_CreateRestriction)); 76 PetscCall(PetscLogEventRegister("DMCreateInject", DM_CLASSID,&DM_CreateInjection)); 77 PetscCall(PetscLogEventRegister("DMCreateMat", DM_CLASSID,&DM_CreateMatrix)); 78 PetscCall(PetscLogEventRegister("DMCreateMassMat", DM_CLASSID,&DM_CreateMassMatrix)); 79 PetscCall(PetscLogEventRegister("DMLoad", DM_CLASSID,&DM_Load)); 80 PetscCall(PetscLogEventRegister("DMAdaptInterp", DM_CLASSID,&DM_AdaptInterpolator)); 81 82 PetscCall(PetscLogEventRegister("DMPlexBuFrCeLi", DM_CLASSID,&DMPLEX_BuildFromCellList)); 83 PetscCall(PetscLogEventRegister("DMPlexBuCoFrCeLi", DM_CLASSID,&DMPLEX_BuildCoordinatesFromCellList)); 84 PetscCall(PetscLogEventRegister("DMPlexCreateGmsh", DM_CLASSID,&DMPLEX_CreateGmsh)); 85 PetscCall(PetscLogEventRegister("DMPlexCrFromFile", DM_CLASSID,&DMPLEX_CreateFromFile)); 86 PetscCall(PetscLogEventRegister("Mesh Partition", DM_CLASSID,&DMPLEX_Partition)); 87 PetscCall(PetscLogEventRegister("Mesh Migration", DM_CLASSID,&DMPLEX_Migrate)); 88 PetscCall(PetscLogEventRegister("DMPlexPartSelf", DM_CLASSID,&DMPLEX_PartSelf)); 89 PetscCall(PetscLogEventRegister("DMPlexPartLblInv", DM_CLASSID,&DMPLEX_PartLabelInvert)); 90 PetscCall(PetscLogEventRegister("DMPlexPartLblSF", DM_CLASSID,&DMPLEX_PartLabelCreateSF)); 91 PetscCall(PetscLogEventRegister("DMPlexPartStrtSF", DM_CLASSID,&DMPLEX_PartStratSF)); 92 PetscCall(PetscLogEventRegister("DMPlexPointSF", DM_CLASSID,&DMPLEX_CreatePointSF)); 93 PetscCall(PetscLogEventRegister("DMPlexInterp", DM_CLASSID,&DMPLEX_Interpolate)); 94 PetscCall(PetscLogEventRegister("DMPlexDistribute", DM_CLASSID,&DMPLEX_Distribute)); 95 PetscCall(PetscLogEventRegister("DMPlexDistCones", DM_CLASSID,&DMPLEX_DistributeCones)); 96 PetscCall(PetscLogEventRegister("DMPlexDistLabels", DM_CLASSID,&DMPLEX_DistributeLabels)); 97 PetscCall(PetscLogEventRegister("DMPlexDistSF", DM_CLASSID,&DMPLEX_DistributeSF)); 98 PetscCall(PetscLogEventRegister("DMPlexDistOvrlp", DM_CLASSID,&DMPLEX_DistributeOverlap)); 99 PetscCall(PetscLogEventRegister("DMPlexDistField", DM_CLASSID,&DMPLEX_DistributeField)); 100 PetscCall(PetscLogEventRegister("DMPlexDistData", DM_CLASSID,&DMPLEX_DistributeData)); 101 PetscCall(PetscLogEventRegister("DMPlexInterpSF", DM_CLASSID,&DMPLEX_InterpolateSF)); 102 PetscCall(PetscLogEventRegister("DMPlexGToNBegin", DM_CLASSID,&DMPLEX_GlobalToNaturalBegin)); 103 PetscCall(PetscLogEventRegister("DMPlexGToNEnd", DM_CLASSID,&DMPLEX_GlobalToNaturalEnd)); 104 PetscCall(PetscLogEventRegister("DMPlexNToGBegin", DM_CLASSID,&DMPLEX_NaturalToGlobalBegin)); 105 PetscCall(PetscLogEventRegister("DMPlexNToGEnd", DM_CLASSID,&DMPLEX_NaturalToGlobalEnd)); 106 PetscCall(PetscLogEventRegister("DMPlexStratify", DM_CLASSID,&DMPLEX_Stratify)); 107 PetscCall(PetscLogEventRegister("DMPlexSymmetrize", DM_CLASSID,&DMPLEX_Symmetrize)); 108 PetscCall(PetscLogEventRegister("DMPlexPrealloc", DM_CLASSID,&DMPLEX_Preallocate)); 109 PetscCall(PetscLogEventRegister("DMPlexResidualFE", DM_CLASSID,&DMPLEX_ResidualFEM)); 110 PetscCall(PetscLogEventRegister("DMPlexJacobianFE", DM_CLASSID,&DMPLEX_JacobianFEM)); 111 PetscCall(PetscLogEventRegister("DMPlexInterpFE", DM_CLASSID,&DMPLEX_InterpolatorFEM)); 112 PetscCall(PetscLogEventRegister("DMPlexInjectorFE", DM_CLASSID,&DMPLEX_InjectorFEM)); 113 PetscCall(PetscLogEventRegister("DMPlexIntegralFEM", DM_CLASSID,&DMPLEX_IntegralFEM)); 114 PetscCall(PetscLogEventRegister("DMPlexRebalance", DM_CLASSID,&DMPLEX_RebalanceSharedPoints)); 115 PetscCall(PetscLogEventRegister("DMPlexLocatePoints", DM_CLASSID,&DMPLEX_LocatePoints)); 116 PetscCall(PetscLogEventRegister("DMPlexTopologyView", DM_CLASSID,&DMPLEX_TopologyView)); 117 PetscCall(PetscLogEventRegister("DMPlexLabelsView", DM_CLASSID,&DMPLEX_LabelsView)); 118 PetscCall(PetscLogEventRegister("DMPlexCoordinatesView", DM_CLASSID,&DMPLEX_CoordinatesView)); 119 PetscCall(PetscLogEventRegister("DMPlexSectionView", DM_CLASSID,&DMPLEX_SectionView)); 120 PetscCall(PetscLogEventRegister("DMPlexGlobalVectorView", DM_CLASSID,&DMPLEX_GlobalVectorView)); 121 PetscCall(PetscLogEventRegister("DMPlexLocalVectorView", DM_CLASSID,&DMPLEX_LocalVectorView)); 122 PetscCall(PetscLogEventRegister("DMPlexTopologyLoad", DM_CLASSID,&DMPLEX_TopologyLoad)); 123 PetscCall(PetscLogEventRegister("DMPlexLabelsLoad", DM_CLASSID,&DMPLEX_LabelsLoad)); 124 PetscCall(PetscLogEventRegister("DMPlexCoordinatesLoad", DM_CLASSID,&DMPLEX_CoordinatesLoad)); 125 PetscCall(PetscLogEventRegister("DMPlexSectionLoad", DM_CLASSID,&DMPLEX_SectionLoad)); 126 PetscCall(PetscLogEventRegister("DMPlexGlobalVectorLoad", DM_CLASSID,&DMPLEX_GlobalVectorLoad)); 127 PetscCall(PetscLogEventRegister("DMPlexLocalVectorLoad", DM_CLASSID,&DMPLEX_LocalVectorLoad)); 128 PetscCall(PetscLogEventRegister("DMPlexMetricEnforceSPD", DM_CLASSID,&DMPLEX_MetricEnforceSPD)); 129 PetscCall(PetscLogEventRegister("DMPlexMetricNormalize", DM_CLASSID,&DMPLEX_MetricNormalize)); 130 PetscCall(PetscLogEventRegister("DMPlexMetricAverage", DM_CLASSID,&DMPLEX_MetricAverage)); 131 PetscCall(PetscLogEventRegister("DMPlexMetricIntersect", DM_CLASSID,&DMPLEX_MetricIntersection)); 132 133 PetscCall(PetscLogEventRegister("RebalBuildGraph", DM_CLASSID,&DMPLEX_RebalBuildGraph)); 134 PetscCall(PetscLogEventRegister("RebalGatherGraph", DM_CLASSID,&DMPLEX_RebalGatherGraph)); 135 PetscCall(PetscLogEventRegister("RebalPartition", DM_CLASSID,&DMPLEX_RebalPartition)); 136 PetscCall(PetscLogEventRegister("RebalScatterPart", DM_CLASSID,&DMPLEX_RebalScatterPart)); 137 PetscCall(PetscLogEventRegister("RebalRewriteSF", DM_CLASSID,&DMPLEX_RebalRewriteSF)); 138 139 PetscCall(PetscLogEventRegister("DMSwarmMigrate", DM_CLASSID,&DMSWARM_Migrate)); 140 PetscCall(PetscLogEventRegister("DMSwarmDETSetup", DM_CLASSID,&DMSWARM_DataExchangerTopologySetup)); 141 PetscCall(PetscLogEventRegister("DMSwarmDExBegin", DM_CLASSID,&DMSWARM_DataExchangerBegin)); 142 PetscCall(PetscLogEventRegister("DMSwarmDExEnd", DM_CLASSID,&DMSWARM_DataExchangerEnd)); 143 PetscCall(PetscLogEventRegister("DMSwarmDESendCnt", DM_CLASSID,&DMSWARM_DataExchangerSendCount)); 144 PetscCall(PetscLogEventRegister("DMSwarmDEPack", DM_CLASSID,&DMSWARM_DataExchangerPack)); 145 PetscCall(PetscLogEventRegister("DMSwarmAddPnts", DM_CLASSID,&DMSWARM_AddPoints)); 146 PetscCall(PetscLogEventRegister("DMSwarmRmvPnts", DM_CLASSID,&DMSWARM_RemovePoints)); 147 PetscCall(PetscLogEventRegister("DMSwarmSort", DM_CLASSID,&DMSWARM_Sort)); 148 PetscCall(PetscLogEventRegister("DMSwarmSetSizes", DM_CLASSID,&DMSWARM_SetSizes)); 149 /* Process Info */ 150 { 151 PetscClassId classids[1]; 152 153 classids[0] = DM_CLASSID; 154 PetscCall(PetscInfoProcessClass("dm", 1, classids)); 155 } 156 157 /* Process summary exclusions */ 158 PetscCall(PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt)); 159 if (opt) { 160 PetscCall(PetscStrInList("dm",logList,',',&pkg)); 161 if (pkg) PetscCall(PetscLogEventExcludeClass(DM_CLASSID)); 162 } 163 164 PetscCall(DMGenerateRegisterAll()); 165 PetscCall(PetscRegisterFinalize(DMGenerateRegisterDestroy)); 166 PetscCall(DMPlexTransformRegisterAll()); 167 PetscCall(PetscRegisterFinalize(DMPlexTransformRegisterDestroy)); 168 PetscCall(PetscRegisterFinalize(DMFinalizePackage)); 169 PetscFunctionReturn(0); 170 } 171 #include <petscfe.h> 172 173 static PetscBool PetscFEPackageInitialized = PETSC_FALSE; 174 /*@C 175 PetscFEFinalizePackage - This function finalizes everything in the PetscFE package. It is called 176 from PetscFinalize(). 177 178 Level: developer 179 180 .seealso: `PetscInitialize()` 181 @*/ 182 PetscErrorCode PetscFEFinalizePackage(void) 183 { 184 PetscFunctionBegin; 185 PetscCall(PetscFunctionListDestroy(&PetscSpaceList)); 186 PetscCall(PetscFunctionListDestroy(&PetscDualSpaceList)); 187 PetscCall(PetscFunctionListDestroy(&PetscFEList)); 188 PetscFEPackageInitialized = PETSC_FALSE; 189 PetscSpaceRegisterAllCalled = PETSC_FALSE; 190 PetscDualSpaceRegisterAllCalled = PETSC_FALSE; 191 PetscFERegisterAllCalled = PETSC_FALSE; 192 PetscFunctionReturn(0); 193 } 194 195 /*@C 196 PetscFEInitializePackage - This function initializes everything in the FE package. It is called 197 from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscSpaceCreate() 198 when using static libraries. 199 200 Level: developer 201 202 .seealso: `PetscInitialize()` 203 @*/ 204 PetscErrorCode PetscFEInitializePackage(void) 205 { 206 char logList[256]; 207 PetscBool opt,pkg; 208 209 PetscFunctionBegin; 210 if (PetscFEPackageInitialized) PetscFunctionReturn(0); 211 PetscFEPackageInitialized = PETSC_TRUE; 212 213 /* Register Classes */ 214 PetscCall(PetscClassIdRegister("Linear Space", &PETSCSPACE_CLASSID)); 215 PetscCall(PetscClassIdRegister("Dual Space", &PETSCDUALSPACE_CLASSID)); 216 PetscCall(PetscClassIdRegister("FE Space", &PETSCFE_CLASSID)); 217 /* Register Constructors */ 218 PetscCall(PetscSpaceRegisterAll()); 219 PetscCall(PetscDualSpaceRegisterAll()); 220 PetscCall(PetscFERegisterAll()); 221 /* Register Events */ 222 PetscCall(PetscLogEventRegister("DualSpaceSetUp", PETSCDUALSPACE_CLASSID, &PETSCDUALSPACE_SetUp)); 223 PetscCall(PetscLogEventRegister("FESetUp", PETSCFE_CLASSID, &PETSCFE_SetUp)); 224 /* Process Info */ 225 { 226 PetscClassId classids[3]; 227 228 classids[0] = PETSCFE_CLASSID; 229 classids[1] = PETSCSPACE_CLASSID; 230 classids[2] = PETSCDUALSPACE_CLASSID; 231 PetscCall(PetscInfoProcessClass("fe", 1, classids)); 232 PetscCall(PetscInfoProcessClass("space", 1, &classids[1])); 233 PetscCall(PetscInfoProcessClass("dualspace", 1, &classids[2])); 234 } 235 /* Process summary exclusions */ 236 PetscCall(PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt)); 237 if (opt) { 238 PetscCall(PetscStrInList("fe",logList,',',&pkg)); 239 if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCFE_CLASSID)); 240 } 241 /* Register package finalizer */ 242 PetscCall(PetscRegisterFinalize(PetscFEFinalizePackage)); 243 PetscFunctionReturn(0); 244 } 245 #include <petscfv.h> 246 247 static PetscBool PetscFVPackageInitialized = PETSC_FALSE; 248 /*@C 249 PetscFVFinalizePackage - This function finalizes everything in the PetscFV package. It is called 250 from PetscFinalize(). 251 252 Level: developer 253 254 .seealso: `PetscInitialize()` 255 @*/ 256 PetscErrorCode PetscFVFinalizePackage(void) 257 { 258 PetscFunctionBegin; 259 PetscCall(PetscFunctionListDestroy(&PetscLimiterList)); 260 PetscCall(PetscFunctionListDestroy(&PetscFVList)); 261 PetscFVPackageInitialized = PETSC_FALSE; 262 PetscFVRegisterAllCalled = PETSC_FALSE; 263 PetscLimiterRegisterAllCalled = PETSC_FALSE; 264 PetscFunctionReturn(0); 265 } 266 267 /*@C 268 PetscFVInitializePackage - This function initializes everything in the FV package. It is called 269 from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscFVCreate() 270 when using static libraries. 271 272 Level: developer 273 274 .seealso: `PetscInitialize()` 275 @*/ 276 PetscErrorCode PetscFVInitializePackage(void) 277 { 278 char logList[256]; 279 PetscBool opt,pkg; 280 281 PetscFunctionBegin; 282 if (PetscFVPackageInitialized) PetscFunctionReturn(0); 283 PetscFVPackageInitialized = PETSC_TRUE; 284 285 /* Register Classes */ 286 PetscCall(PetscClassIdRegister("FV Space", &PETSCFV_CLASSID)); 287 PetscCall(PetscClassIdRegister("Limiter", &PETSCLIMITER_CLASSID)); 288 /* Register Constructors */ 289 PetscCall(PetscFVRegisterAll()); 290 /* Register Events */ 291 /* Process Info */ 292 { 293 PetscClassId classids[2]; 294 295 classids[0] = PETSCFV_CLASSID; 296 classids[1] = PETSCLIMITER_CLASSID; 297 PetscCall(PetscInfoProcessClass("fv", 1, classids)); 298 PetscCall(PetscInfoProcessClass("limiter", 1, &classids[1])); 299 } 300 /* Process summary exclusions */ 301 PetscCall(PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt)); 302 if (opt) { 303 PetscCall(PetscStrInList("fv",logList,',',&pkg)); 304 if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCFV_CLASSID)); 305 PetscCall(PetscStrInList("limiter",logList,',',&pkg)); 306 if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCLIMITER_CLASSID)); 307 } 308 /* Register package finalizer */ 309 PetscCall(PetscRegisterFinalize(PetscFVFinalizePackage)); 310 PetscFunctionReturn(0); 311 } 312 #include <petscds.h> 313 314 static PetscBool PetscDSPackageInitialized = PETSC_FALSE; 315 /*@C 316 PetscDSFinalizePackage - This function finalizes everything in the PetscDS package. It is called 317 from PetscFinalize(). 318 319 Level: developer 320 321 .seealso: `PetscInitialize()` 322 @*/ 323 PetscErrorCode PetscDSFinalizePackage(void) 324 { 325 PetscFunctionBegin; 326 PetscCall(PetscFunctionListDestroy(&PetscDSList)); 327 PetscDSPackageInitialized = PETSC_FALSE; 328 PetscDSRegisterAllCalled = PETSC_FALSE; 329 PetscFunctionReturn(0); 330 } 331 332 /*@C 333 PetscDSInitializePackage - This function initializes everything in the DS package. It is called 334 from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscDSCreate() 335 when using static libraries. 336 337 Level: developer 338 339 .seealso: `PetscInitialize()` 340 @*/ 341 PetscErrorCode PetscDSInitializePackage(void) 342 { 343 char logList[256]; 344 PetscBool opt,pkg; 345 346 PetscFunctionBegin; 347 if (PetscDSPackageInitialized) PetscFunctionReturn(0); 348 PetscDSPackageInitialized = PETSC_TRUE; 349 350 /* Register Classes */ 351 PetscCall(PetscClassIdRegister("Discrete System", &PETSCDS_CLASSID)); 352 PetscCall(PetscClassIdRegister("Weak Form", &PETSCWEAKFORM_CLASSID)); 353 /* Register Constructors */ 354 PetscCall(PetscDSRegisterAll()); 355 /* Register Events */ 356 /* Process Info */ 357 { 358 PetscClassId classids[1]; 359 360 classids[0] = PETSCDS_CLASSID; 361 PetscCall(PetscInfoProcessClass("ds", 1, classids)); 362 } 363 /* Process summary exclusions */ 364 PetscCall(PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt)); 365 if (opt) { 366 PetscCall(PetscStrInList("ds",logList,',',&pkg)); 367 if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCDS_CLASSID)); 368 } 369 /* Register package finalizer */ 370 PetscCall(PetscRegisterFinalize(PetscDSFinalizePackage)); 371 PetscFunctionReturn(0); 372 } 373 374 #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES) 375 /* 376 PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened. 377 378 This one registers all the mesh generators and partitioners that are in 379 the basic DM library. 380 381 */ 382 PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscdm(void) 383 { 384 PetscFunctionBegin; 385 PetscCall(AOInitializePackage()); 386 PetscCall(PetscPartitionerInitializePackage()); 387 PetscCall(DMInitializePackage()); 388 PetscCall(PetscFEInitializePackage()); 389 PetscCall(PetscFVInitializePackage()); 390 PetscCall(DMFieldInitializePackage()); 391 PetscFunctionReturn(0); 392 } 393 394 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */ 395