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