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("DMSwarmMigrate", DM_CLASSID,&DMSWARM_Migrate)); 134 PetscCall(PetscLogEventRegister("DMSwarmDETSetup", DM_CLASSID,&DMSWARM_DataExchangerTopologySetup)); 135 PetscCall(PetscLogEventRegister("DMSwarmDExBegin", DM_CLASSID,&DMSWARM_DataExchangerBegin)); 136 PetscCall(PetscLogEventRegister("DMSwarmDExEnd", DM_CLASSID,&DMSWARM_DataExchangerEnd)); 137 PetscCall(PetscLogEventRegister("DMSwarmDESendCnt", DM_CLASSID,&DMSWARM_DataExchangerSendCount)); 138 PetscCall(PetscLogEventRegister("DMSwarmDEPack", DM_CLASSID,&DMSWARM_DataExchangerPack)); 139 PetscCall(PetscLogEventRegister("DMSwarmAddPnts", DM_CLASSID,&DMSWARM_AddPoints)); 140 PetscCall(PetscLogEventRegister("DMSwarmRmvPnts", DM_CLASSID,&DMSWARM_RemovePoints)); 141 PetscCall(PetscLogEventRegister("DMSwarmSort", DM_CLASSID,&DMSWARM_Sort)); 142 PetscCall(PetscLogEventRegister("DMSwarmSetSizes", DM_CLASSID,&DMSWARM_SetSizes)); 143 /* Process Info */ 144 { 145 PetscClassId classids[1]; 146 147 classids[0] = DM_CLASSID; 148 PetscCall(PetscInfoProcessClass("dm", 1, classids)); 149 } 150 151 /* Process summary exclusions */ 152 PetscCall(PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt)); 153 if (opt) { 154 PetscCall(PetscStrInList("dm",logList,',',&pkg)); 155 if (pkg) PetscCall(PetscLogEventExcludeClass(DM_CLASSID)); 156 } 157 158 PetscCall(DMGenerateRegisterAll()); 159 PetscCall(PetscRegisterFinalize(DMGenerateRegisterDestroy)); 160 PetscCall(DMPlexTransformRegisterAll()); 161 PetscCall(PetscRegisterFinalize(DMPlexTransformRegisterDestroy)); 162 PetscCall(PetscRegisterFinalize(DMFinalizePackage)); 163 PetscFunctionReturn(0); 164 } 165 #include <petscfe.h> 166 167 static PetscBool PetscFEPackageInitialized = PETSC_FALSE; 168 /*@C 169 PetscFEFinalizePackage - This function finalizes everything in the PetscFE package. It is called 170 from PetscFinalize(). 171 172 Level: developer 173 174 .seealso: `PetscInitialize()` 175 @*/ 176 PetscErrorCode PetscFEFinalizePackage(void) 177 { 178 PetscFunctionBegin; 179 PetscCall(PetscFunctionListDestroy(&PetscSpaceList)); 180 PetscCall(PetscFunctionListDestroy(&PetscDualSpaceList)); 181 PetscCall(PetscFunctionListDestroy(&PetscFEList)); 182 PetscFEPackageInitialized = PETSC_FALSE; 183 PetscSpaceRegisterAllCalled = PETSC_FALSE; 184 PetscDualSpaceRegisterAllCalled = PETSC_FALSE; 185 PetscFERegisterAllCalled = PETSC_FALSE; 186 PetscFunctionReturn(0); 187 } 188 189 /*@C 190 PetscFEInitializePackage - This function initializes everything in the FE package. It is called 191 from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscSpaceCreate() 192 when using static libraries. 193 194 Level: developer 195 196 .seealso: `PetscInitialize()` 197 @*/ 198 PetscErrorCode PetscFEInitializePackage(void) 199 { 200 char logList[256]; 201 PetscBool opt,pkg; 202 203 PetscFunctionBegin; 204 if (PetscFEPackageInitialized) PetscFunctionReturn(0); 205 PetscFEPackageInitialized = PETSC_TRUE; 206 207 /* Register Classes */ 208 PetscCall(PetscClassIdRegister("Linear Space", &PETSCSPACE_CLASSID)); 209 PetscCall(PetscClassIdRegister("Dual Space", &PETSCDUALSPACE_CLASSID)); 210 PetscCall(PetscClassIdRegister("FE Space", &PETSCFE_CLASSID)); 211 /* Register Constructors */ 212 PetscCall(PetscSpaceRegisterAll()); 213 PetscCall(PetscDualSpaceRegisterAll()); 214 PetscCall(PetscFERegisterAll()); 215 /* Register Events */ 216 PetscCall(PetscLogEventRegister("DualSpaceSetUp", PETSCDUALSPACE_CLASSID, &PETSCDUALSPACE_SetUp)); 217 PetscCall(PetscLogEventRegister("FESetUp", PETSCFE_CLASSID, &PETSCFE_SetUp)); 218 /* Process Info */ 219 { 220 PetscClassId classids[3]; 221 222 classids[0] = PETSCFE_CLASSID; 223 classids[1] = PETSCSPACE_CLASSID; 224 classids[2] = PETSCDUALSPACE_CLASSID; 225 PetscCall(PetscInfoProcessClass("fe", 1, classids)); 226 PetscCall(PetscInfoProcessClass("space", 1, &classids[1])); 227 PetscCall(PetscInfoProcessClass("dualspace", 1, &classids[2])); 228 } 229 /* Process summary exclusions */ 230 PetscCall(PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt)); 231 if (opt) { 232 PetscCall(PetscStrInList("fe",logList,',',&pkg)); 233 if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCFE_CLASSID)); 234 } 235 /* Register package finalizer */ 236 PetscCall(PetscRegisterFinalize(PetscFEFinalizePackage)); 237 PetscFunctionReturn(0); 238 } 239 #include <petscfv.h> 240 241 static PetscBool PetscFVPackageInitialized = PETSC_FALSE; 242 /*@C 243 PetscFVFinalizePackage - This function finalizes everything in the PetscFV package. It is called 244 from PetscFinalize(). 245 246 Level: developer 247 248 .seealso: `PetscInitialize()` 249 @*/ 250 PetscErrorCode PetscFVFinalizePackage(void) 251 { 252 PetscFunctionBegin; 253 PetscCall(PetscFunctionListDestroy(&PetscLimiterList)); 254 PetscCall(PetscFunctionListDestroy(&PetscFVList)); 255 PetscFVPackageInitialized = PETSC_FALSE; 256 PetscFVRegisterAllCalled = PETSC_FALSE; 257 PetscLimiterRegisterAllCalled = PETSC_FALSE; 258 PetscFunctionReturn(0); 259 } 260 261 /*@C 262 PetscFVInitializePackage - This function initializes everything in the FV package. It is called 263 from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscFVCreate() 264 when using static libraries. 265 266 Level: developer 267 268 .seealso: `PetscInitialize()` 269 @*/ 270 PetscErrorCode PetscFVInitializePackage(void) 271 { 272 char logList[256]; 273 PetscBool opt,pkg; 274 275 PetscFunctionBegin; 276 if (PetscFVPackageInitialized) PetscFunctionReturn(0); 277 PetscFVPackageInitialized = PETSC_TRUE; 278 279 /* Register Classes */ 280 PetscCall(PetscClassIdRegister("FV Space", &PETSCFV_CLASSID)); 281 PetscCall(PetscClassIdRegister("Limiter", &PETSCLIMITER_CLASSID)); 282 /* Register Constructors */ 283 PetscCall(PetscFVRegisterAll()); 284 /* Register Events */ 285 /* Process Info */ 286 { 287 PetscClassId classids[2]; 288 289 classids[0] = PETSCFV_CLASSID; 290 classids[1] = PETSCLIMITER_CLASSID; 291 PetscCall(PetscInfoProcessClass("fv", 1, classids)); 292 PetscCall(PetscInfoProcessClass("limiter", 1, &classids[1])); 293 } 294 /* Process summary exclusions */ 295 PetscCall(PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt)); 296 if (opt) { 297 PetscCall(PetscStrInList("fv",logList,',',&pkg)); 298 if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCFV_CLASSID)); 299 PetscCall(PetscStrInList("limiter",logList,',',&pkg)); 300 if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCLIMITER_CLASSID)); 301 } 302 /* Register package finalizer */ 303 PetscCall(PetscRegisterFinalize(PetscFVFinalizePackage)); 304 PetscFunctionReturn(0); 305 } 306 #include <petscds.h> 307 308 static PetscBool PetscDSPackageInitialized = PETSC_FALSE; 309 /*@C 310 PetscDSFinalizePackage - This function finalizes everything in the PetscDS package. It is called 311 from PetscFinalize(). 312 313 Level: developer 314 315 .seealso: `PetscInitialize()` 316 @*/ 317 PetscErrorCode PetscDSFinalizePackage(void) 318 { 319 PetscFunctionBegin; 320 PetscCall(PetscFunctionListDestroy(&PetscDSList)); 321 PetscDSPackageInitialized = PETSC_FALSE; 322 PetscDSRegisterAllCalled = PETSC_FALSE; 323 PetscFunctionReturn(0); 324 } 325 326 /*@C 327 PetscDSInitializePackage - This function initializes everything in the DS package. It is called 328 from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscDSCreate() 329 when using static libraries. 330 331 Level: developer 332 333 .seealso: `PetscInitialize()` 334 @*/ 335 PetscErrorCode PetscDSInitializePackage(void) 336 { 337 char logList[256]; 338 PetscBool opt,pkg; 339 340 PetscFunctionBegin; 341 if (PetscDSPackageInitialized) PetscFunctionReturn(0); 342 PetscDSPackageInitialized = PETSC_TRUE; 343 344 /* Register Classes */ 345 PetscCall(PetscClassIdRegister("Discrete System", &PETSCDS_CLASSID)); 346 PetscCall(PetscClassIdRegister("Weak Form", &PETSCWEAKFORM_CLASSID)); 347 /* Register Constructors */ 348 PetscCall(PetscDSRegisterAll()); 349 /* Register Events */ 350 /* Process Info */ 351 { 352 PetscClassId classids[1]; 353 354 classids[0] = PETSCDS_CLASSID; 355 PetscCall(PetscInfoProcessClass("ds", 1, classids)); 356 } 357 /* Process summary exclusions */ 358 PetscCall(PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt)); 359 if (opt) { 360 PetscCall(PetscStrInList("ds",logList,',',&pkg)); 361 if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCDS_CLASSID)); 362 } 363 /* Register package finalizer */ 364 PetscCall(PetscRegisterFinalize(PetscDSFinalizePackage)); 365 PetscFunctionReturn(0); 366 } 367 368 #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES) 369 /* 370 PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened. 371 372 This one registers all the mesh generators and partitioners that are in 373 the basic DM library. 374 375 */ 376 PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscdm(void) 377 { 378 PetscFunctionBegin; 379 PetscCall(AOInitializePackage()); 380 PetscCall(PetscPartitionerInitializePackage()); 381 PetscCall(DMInitializePackage()); 382 PetscCall(PetscFEInitializePackage()); 383 PetscCall(PetscFVInitializePackage()); 384 PetscCall(DMFieldInitializePackage()); 385 PetscFunctionReturn(0); 386 } 387 388 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */ 389