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