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