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("DMPlexDistMS", DM_CLASSID, &DMPLEX_DistributeMultistage)); 104 PetscCall(PetscLogEventRegister("DMPlexDistCones", DM_CLASSID, &DMPLEX_DistributeCones)); 105 PetscCall(PetscLogEventRegister("DMPlexDistLabels", DM_CLASSID, &DMPLEX_DistributeLabels)); 106 PetscCall(PetscLogEventRegister("DMPlexDistSF", DM_CLASSID, &DMPLEX_DistributeSF)); 107 PetscCall(PetscLogEventRegister("DMPlexDistOvrlp", DM_CLASSID, &DMPLEX_DistributeOverlap)); 108 PetscCall(PetscLogEventRegister("DMPlexDistField", DM_CLASSID, &DMPLEX_DistributeField)); 109 PetscCall(PetscLogEventRegister("DMPlexDistData", DM_CLASSID, &DMPLEX_DistributeData)); 110 PetscCall(PetscLogEventRegister("DMPlexInterpSF", DM_CLASSID, &DMPLEX_InterpolateSF)); 111 PetscCall(PetscLogEventRegister("DMPlexGToNBegin", DM_CLASSID, &DMPLEX_GlobalToNaturalBegin)); 112 PetscCall(PetscLogEventRegister("DMPlexGToNEnd", DM_CLASSID, &DMPLEX_GlobalToNaturalEnd)); 113 PetscCall(PetscLogEventRegister("DMPlexNToGBegin", DM_CLASSID, &DMPLEX_NaturalToGlobalBegin)); 114 PetscCall(PetscLogEventRegister("DMPlexNToGEnd", DM_CLASSID, &DMPLEX_NaturalToGlobalEnd)); 115 PetscCall(PetscLogEventRegister("DMPlexStratify", DM_CLASSID, &DMPLEX_Stratify)); 116 PetscCall(PetscLogEventRegister("DMPlexSymmetrize", DM_CLASSID, &DMPLEX_Symmetrize)); 117 PetscCall(PetscLogEventRegister("DMPlexPrealloc", DM_CLASSID, &DMPLEX_Preallocate)); 118 PetscCall(PetscLogEventRegister("DMPlexResidualFE", DM_CLASSID, &DMPLEX_ResidualFEM)); 119 PetscCall(PetscLogEventRegister("DMPlexJacobianFE", DM_CLASSID, &DMPLEX_JacobianFEM)); 120 PetscCall(PetscLogEventRegister("DMPlexInterpFE", DM_CLASSID, &DMPLEX_InterpolatorFEM)); 121 PetscCall(PetscLogEventRegister("DMPlexInjectorFE", DM_CLASSID, &DMPLEX_InjectorFEM)); 122 PetscCall(PetscLogEventRegister("DMPlexIntegralFE", DM_CLASSID, &DMPLEX_IntegralFEM)); 123 PetscCall(PetscLogEventRegister("DMPlexRebalance", DM_CLASSID, &DMPLEX_RebalanceSharedPoints)); 124 PetscCall(PetscLogEventRegister("DMPlexLocatePoints", DM_CLASSID, &DMPLEX_LocatePoints)); 125 PetscCall(PetscLogEventRegister("DMPlexTopologyView", DM_CLASSID, &DMPLEX_TopologyView)); 126 PetscCall(PetscLogEventRegister("DMPlexLabelsView", DM_CLASSID, &DMPLEX_LabelsView)); 127 PetscCall(PetscLogEventRegister("DMPlexCoordinatesView", DM_CLASSID, &DMPLEX_CoordinatesView)); 128 PetscCall(PetscLogEventRegister("DMPlexSectionView", DM_CLASSID, &DMPLEX_SectionView)); 129 PetscCall(PetscLogEventRegister("DMPlexGlobalVectorView", DM_CLASSID, &DMPLEX_GlobalVectorView)); 130 PetscCall(PetscLogEventRegister("DMPlexLocalVectorView", DM_CLASSID, &DMPLEX_LocalVectorView)); 131 PetscCall(PetscLogEventRegister("DMPlexTopologyLoad", DM_CLASSID, &DMPLEX_TopologyLoad)); 132 #if defined(PETSC_HAVE_HDF5) 133 PetscCall(PetscLogEventRegister("DMPlexDistributionView", DM_CLASSID, &DMPLEX_DistributionView)); 134 PetscCall(PetscLogEventRegister("DMPlexDistributionLoad", DM_CLASSID, &DMPLEX_DistributionLoad)); 135 #endif 136 PetscCall(PetscLogEventRegister("DMPlexLabelsLoad", DM_CLASSID, &DMPLEX_LabelsLoad)); 137 PetscCall(PetscLogEventRegister("DMPlexCoordinatesLoad", DM_CLASSID, &DMPLEX_CoordinatesLoad)); 138 PetscCall(PetscLogEventRegister("DMPlexSectionLoad", DM_CLASSID, &DMPLEX_SectionLoad)); 139 PetscCall(PetscLogEventRegister("DMPlexGlobalVectorLoad", DM_CLASSID, &DMPLEX_GlobalVectorLoad)); 140 PetscCall(PetscLogEventRegister("DMPlexLocalVectorLoad", DM_CLASSID, &DMPLEX_LocalVectorLoad)); 141 PetscCall(PetscLogEventRegister("DMPlexMetricEnforceSPD", DM_CLASSID, &DMPLEX_MetricEnforceSPD)); 142 PetscCall(PetscLogEventRegister("DMPlexMetricNormalize", DM_CLASSID, &DMPLEX_MetricNormalize)); 143 PetscCall(PetscLogEventRegister("DMPlexMetricAverage", DM_CLASSID, &DMPLEX_MetricAverage)); 144 PetscCall(PetscLogEventRegister("DMPlexMetricIntersect", DM_CLASSID, &DMPLEX_MetricIntersection)); 145 PetscCall(PetscLogEventRegister("DMPlexGenerate", DM_CLASSID, &DMPLEX_Generate)); 146 PetscCall(PetscLogEventRegister("DMPlexGetLocOff", DM_CLASSID, &DMPLEX_GetLocalOffsets)); 147 148 PetscCall(PetscLogEventRegister("RebalBuildGraph", DM_CLASSID, &DMPLEX_RebalBuildGraph)); 149 PetscCall(PetscLogEventRegister("RebalGatherGraph", DM_CLASSID, &DMPLEX_RebalGatherGraph)); 150 PetscCall(PetscLogEventRegister("RebalPartition", DM_CLASSID, &DMPLEX_RebalPartition)); 151 PetscCall(PetscLogEventRegister("RebalScatterPart", DM_CLASSID, &DMPLEX_RebalScatterPart)); 152 PetscCall(PetscLogEventRegister("RebalRewriteSF", DM_CLASSID, &DMPLEX_RebalRewriteSF)); 153 PetscCall(PetscLogEventRegister("DMPlexUninterp", DM_CLASSID, &DMPLEX_Uninterpolate)); 154 155 PetscCall(PetscLogEventRegister("DMPlexTrSetUp", DM_CLASSID, &DMPLEXTRANSFORM_SetUp)); 156 PetscCall(PetscLogEventRegister("DMPlexTrApply", DM_CLASSID, &DMPLEXTRANSFORM_Apply)); 157 PetscCall(PetscLogEventRegister("DMPlexTrSizes", DM_CLASSID, &DMPLEXTRANSFORM_SetConeSizes)); 158 PetscCall(PetscLogEventRegister("DMPlexTrCones", DM_CLASSID, &DMPLEXTRANSFORM_SetCones)); 159 PetscCall(PetscLogEventRegister("DMPlexTrSF", DM_CLASSID, &DMPLEXTRANSFORM_CreateSF)); 160 PetscCall(PetscLogEventRegister("DMPlexTrLabels", DM_CLASSID, &DMPLEXTRANSFORM_CreateLabels)); 161 PetscCall(PetscLogEventRegister("DMPlexTrCoords", DM_CLASSID, &DMPLEXTRANSFORM_SetCoordinates)); 162 163 PetscCall(PetscLogEventRegister("DMSwarmMigrate", DM_CLASSID, &DMSWARM_Migrate)); 164 PetscCall(PetscLogEventRegister("DMSwarmDETSetup", DM_CLASSID, &DMSWARM_DataExchangerTopologySetup)); 165 PetscCall(PetscLogEventRegister("DMSwarmDExBegin", DM_CLASSID, &DMSWARM_DataExchangerBegin)); 166 PetscCall(PetscLogEventRegister("DMSwarmDExEnd", DM_CLASSID, &DMSWARM_DataExchangerEnd)); 167 PetscCall(PetscLogEventRegister("DMSwarmDESendCnt", DM_CLASSID, &DMSWARM_DataExchangerSendCount)); 168 PetscCall(PetscLogEventRegister("DMSwarmDEPack", DM_CLASSID, &DMSWARM_DataExchangerPack)); 169 PetscCall(PetscLogEventRegister("DMSwarmAddPnts", DM_CLASSID, &DMSWARM_AddPoints)); 170 PetscCall(PetscLogEventRegister("DMSwarmRmvPnts", DM_CLASSID, &DMSWARM_RemovePoints)); 171 PetscCall(PetscLogEventRegister("DMSwarmSort", DM_CLASSID, &DMSWARM_Sort)); 172 PetscCall(PetscLogEventRegister("DMSwarmSetSizes", DM_CLASSID, &DMSWARM_SetSizes)); 173 174 PetscCall(PetscLogEventRegister("DMNtLayoutSetUp", DM_CLASSID, &DMNetwork_LayoutSetUp)); 175 PetscCall(PetscLogEventRegister("DMNtSetUp", DM_CLASSID, &DMNetwork_SetUpNetwork)); 176 PetscCall(PetscLogEventRegister("DMNtDistribute", DM_CLASSID, &DMNetwork_Distribute)); 177 /* Process Info */ 178 { 179 PetscClassId classids[1]; 180 181 classids[0] = DM_CLASSID; 182 PetscCall(PetscInfoProcessClass("dm", 1, classids)); 183 } 184 185 /* Process summary exclusions */ 186 PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt)); 187 if (opt) { 188 PetscCall(PetscStrInList("dm", logList, ',', &pkg)); 189 if (pkg) PetscCall(PetscLogEventExcludeClass(DM_CLASSID)); 190 } 191 192 PetscCall(DMGenerateRegisterAll()); 193 PetscCall(PetscRegisterFinalize(DMGenerateRegisterDestroy)); 194 PetscCall(DMGeomModelRegisterAll()); 195 PetscCall(PetscRegisterFinalize(DMGeomModelRegisterDestroy)); 196 PetscCall(DMPlexTransformRegisterAll()); 197 PetscCall(PetscRegisterFinalize(DMPlexTransformRegisterDestroy)); 198 PetscCall(DMLabelRegisterAll()); 199 PetscCall(PetscRegisterFinalize(DMLabelRegisterDestroy)); 200 PetscCall(PetscRegisterFinalize(DMFinalizePackage)); 201 PetscFunctionReturn(PETSC_SUCCESS); 202 } 203 #include <petscfe.h> 204 205 static PetscBool PetscFEPackageInitialized = PETSC_FALSE; 206 207 /*@C 208 PetscFEFinalizePackage - This function finalizes everything in the `PetscFE` package. It is called 209 from `PetscFinalize()`. 210 211 Level: developer 212 213 .seealso: `PetscInitialize()` 214 @*/ 215 PetscErrorCode PetscFEFinalizePackage(void) 216 { 217 PetscFunctionBegin; 218 PetscCall(PetscFunctionListDestroy(&PetscSpaceList)); 219 PetscCall(PetscFunctionListDestroy(&PetscDualSpaceList)); 220 PetscCall(PetscFunctionListDestroy(&PetscFEList)); 221 PetscFEPackageInitialized = PETSC_FALSE; 222 PetscSpaceRegisterAllCalled = PETSC_FALSE; 223 PetscDualSpaceRegisterAllCalled = PETSC_FALSE; 224 PetscFERegisterAllCalled = PETSC_FALSE; 225 PetscFunctionReturn(PETSC_SUCCESS); 226 } 227 228 /*@C 229 PetscFEInitializePackage - This function initializes everything in the `PetscFE` package. It is called 230 from `PetscDLLibraryRegister()` when using dynamic libraries, and on the first call to `PetscSpaceCreate()` 231 when using static libraries. 232 233 Level: developer 234 235 .seealso: `PetscInitialize()` 236 @*/ 237 PetscErrorCode PetscFEInitializePackage(void) 238 { 239 char logList[256]; 240 PetscBool opt, pkg; 241 242 PetscFunctionBegin; 243 if (PetscFEPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS); 244 PetscFEPackageInitialized = PETSC_TRUE; 245 246 /* Register Classes */ 247 PetscCall(PetscClassIdRegister("Linear Space", &PETSCSPACE_CLASSID)); 248 PetscCall(PetscClassIdRegister("Dual Space", &PETSCDUALSPACE_CLASSID)); 249 PetscCall(PetscClassIdRegister("FE Space", &PETSCFE_CLASSID)); 250 /* Register Constructors */ 251 PetscCall(PetscSpaceRegisterAll()); 252 PetscCall(PetscDualSpaceRegisterAll()); 253 PetscCall(PetscFERegisterAll()); 254 /* Register Events */ 255 PetscCall(PetscLogEventRegister("DualSpaceSetUp", PETSCDUALSPACE_CLASSID, &PETSCDUALSPACE_SetUp)); 256 PetscCall(PetscLogEventRegister("FESetUp", PETSCFE_CLASSID, &PETSCFE_SetUp)); 257 /* Process Info */ 258 { 259 PetscClassId classids[3]; 260 261 classids[0] = PETSCFE_CLASSID; 262 classids[1] = PETSCSPACE_CLASSID; 263 classids[2] = PETSCDUALSPACE_CLASSID; 264 PetscCall(PetscInfoProcessClass("fe", 1, classids)); 265 PetscCall(PetscInfoProcessClass("space", 1, &classids[1])); 266 PetscCall(PetscInfoProcessClass("dualspace", 1, &classids[2])); 267 } 268 /* Process summary exclusions */ 269 PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt)); 270 if (opt) { 271 PetscCall(PetscStrInList("fe", logList, ',', &pkg)); 272 if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCFE_CLASSID)); 273 } 274 /* Register package finalizer */ 275 PetscCall(PetscRegisterFinalize(PetscFEFinalizePackage)); 276 PetscFunctionReturn(PETSC_SUCCESS); 277 } 278 #include <petscfv.h> 279 280 static PetscBool PetscFVPackageInitialized = PETSC_FALSE; 281 282 /*@C 283 PetscFVFinalizePackage - This function finalizes everything in the `PetscFV` package. It is called 284 from `PetscFinalize()`. 285 286 Level: developer 287 288 .seealso: `PetscInitialize()` 289 @*/ 290 PetscErrorCode PetscFVFinalizePackage(void) 291 { 292 PetscFunctionBegin; 293 PetscCall(PetscFunctionListDestroy(&PetscLimiterList)); 294 PetscCall(PetscFunctionListDestroy(&PetscFVList)); 295 PetscFVPackageInitialized = PETSC_FALSE; 296 PetscFVRegisterAllCalled = PETSC_FALSE; 297 PetscLimiterRegisterAllCalled = PETSC_FALSE; 298 PetscFunctionReturn(PETSC_SUCCESS); 299 } 300 301 /*@C 302 PetscFVInitializePackage - This function initializes everything in the `PetscFV` package. It is called 303 from `PetscDLLibraryRegister()` when using dynamic libraries, and on the first call to `PetscFVCreate()` 304 when using static libraries. 305 306 Level: developer 307 308 .seealso: `PetscInitialize()` 309 @*/ 310 PetscErrorCode PetscFVInitializePackage(void) 311 { 312 char logList[256]; 313 PetscBool opt, pkg; 314 315 PetscFunctionBegin; 316 if (PetscFVPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS); 317 PetscFVPackageInitialized = PETSC_TRUE; 318 319 /* Register Classes */ 320 PetscCall(PetscClassIdRegister("FV Space", &PETSCFV_CLASSID)); 321 PetscCall(PetscClassIdRegister("Limiter", &PETSCLIMITER_CLASSID)); 322 /* Register Constructors */ 323 PetscCall(PetscFVRegisterAll()); 324 /* Register Events */ 325 /* Process Info */ 326 { 327 PetscClassId classids[2]; 328 329 classids[0] = PETSCFV_CLASSID; 330 classids[1] = PETSCLIMITER_CLASSID; 331 PetscCall(PetscInfoProcessClass("fv", 1, classids)); 332 PetscCall(PetscInfoProcessClass("limiter", 1, &classids[1])); 333 } 334 /* Process summary exclusions */ 335 PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt)); 336 if (opt) { 337 PetscCall(PetscStrInList("fv", logList, ',', &pkg)); 338 if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCFV_CLASSID)); 339 PetscCall(PetscStrInList("limiter", logList, ',', &pkg)); 340 if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCLIMITER_CLASSID)); 341 } 342 /* Register package finalizer */ 343 PetscCall(PetscRegisterFinalize(PetscFVFinalizePackage)); 344 PetscFunctionReturn(PETSC_SUCCESS); 345 } 346 #include <petscds.h> 347 348 static PetscBool PetscDSPackageInitialized = PETSC_FALSE; 349 350 /*@C 351 PetscDSFinalizePackage - This function finalizes everything in the `PetscDS` package. It is called 352 from `PetscFinalize()`. 353 354 Level: developer 355 356 .seealso: `PetscInitialize()` 357 @*/ 358 PetscErrorCode PetscDSFinalizePackage(void) 359 { 360 PetscFunctionBegin; 361 PetscCall(PetscFunctionListDestroy(&PetscDSList)); 362 PetscDSPackageInitialized = PETSC_FALSE; 363 PetscDSRegisterAllCalled = PETSC_FALSE; 364 PetscFunctionReturn(PETSC_SUCCESS); 365 } 366 367 /*@C 368 PetscDSInitializePackage - This function initializes everything in the `PetscDS` package. It is called 369 from `PetscDLLibraryRegister()` when using dynamic libraries, and on the first call to `PetscDSCreate()` 370 when using static libraries. 371 372 Level: developer 373 374 .seealso: `PetscInitialize()` 375 @*/ 376 PetscErrorCode PetscDSInitializePackage(void) 377 { 378 char logList[256]; 379 PetscBool opt, pkg; 380 381 PetscFunctionBegin; 382 if (PetscDSPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS); 383 PetscDSPackageInitialized = PETSC_TRUE; 384 385 /* Register Classes */ 386 PetscCall(PetscClassIdRegister("Discrete System", &PETSCDS_CLASSID)); 387 PetscCall(PetscClassIdRegister("Weak Form", &PETSCWEAKFORM_CLASSID)); 388 /* Register Constructors */ 389 PetscCall(PetscDSRegisterAll()); 390 /* Register Events */ 391 /* Process Info */ 392 { 393 PetscClassId classids[1]; 394 395 classids[0] = PETSCDS_CLASSID; 396 PetscCall(PetscInfoProcessClass("ds", 1, classids)); 397 } 398 /* Process summary exclusions */ 399 PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt)); 400 if (opt) { 401 PetscCall(PetscStrInList("ds", logList, ',', &pkg)); 402 if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCDS_CLASSID)); 403 } 404 /* Register package finalizer */ 405 PetscCall(PetscRegisterFinalize(PetscDSFinalizePackage)); 406 PetscFunctionReturn(PETSC_SUCCESS); 407 } 408 409 #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES) 410 /* 411 PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened. 412 413 This one registers all the mesh generators and partitioners that are in 414 the basic DM library. 415 416 */ 417 PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscdm(void) 418 { 419 PetscFunctionBegin; 420 PetscCall(AOInitializePackage()); 421 PetscCall(PetscPartitionerInitializePackage()); 422 PetscCall(DMInitializePackage()); 423 PetscCall(PetscFEInitializePackage()); 424 PetscCall(PetscFVInitializePackage()); 425 PetscCall(DMFieldInitializePackage()); 426 PetscCall(PetscDSInitializePackage()); 427 PetscFunctionReturn(PETSC_SUCCESS); 428 } 429 430 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */ 431