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