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 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 char logList[256]; 46 PetscBool opt, pkg; 47 48 PetscFunctionBegin; 49 if (DMPackageInitialized) PetscFunctionReturn(0); 50 DMPackageInitialized = PETSC_TRUE; 51 52 /* Register Classes */ 53 PetscCall(PetscClassIdRegister("Distributed Mesh", &DM_CLASSID)); 54 PetscCall(PetscClassIdRegister("DM Label", &DMLABEL_CLASSID)); 55 PetscCall(PetscClassIdRegister("Quadrature", &PETSCQUADRATURE_CLASSID)); 56 PetscCall(PetscClassIdRegister("Mesh Transform", &DMPLEXTRANSFORM_CLASSID)); 57 58 #if defined(PETSC_HAVE_HYPRE) 59 PetscCall(MatRegister(MATHYPRESTRUCT, MatCreate_HYPREStruct)); 60 PetscCall(MatRegister(MATHYPRESSTRUCT, MatCreate_HYPRESStruct)); 61 #endif 62 PetscCall(PetscSectionSymRegister(PETSCSECTIONSYMLABEL, PetscSectionSymCreate_Label)); 63 64 /* Register Constructors */ 65 PetscCall(DMRegisterAll()); 66 /* Register Events */ 67 PetscCall(PetscLogEventRegister("DMConvert", DM_CLASSID, &DM_Convert)); 68 PetscCall(PetscLogEventRegister("DMGlobalToLocal", DM_CLASSID, &DM_GlobalToLocal)); 69 PetscCall(PetscLogEventRegister("DMLocalToGlobal", DM_CLASSID, &DM_LocalToGlobal)); 70 PetscCall(PetscLogEventRegister("DMLocatePoints", DM_CLASSID, &DM_LocatePoints)); 71 PetscCall(PetscLogEventRegister("DMCoarsen", DM_CLASSID, &DM_Coarsen)); 72 PetscCall(PetscLogEventRegister("DMRefine", DM_CLASSID, &DM_Refine)); 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("DMCreateMassMat", DM_CLASSID, &DM_CreateMassMatrix)); 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("RebalBuildGraph", DM_CLASSID, &DMPLEX_RebalBuildGraph)); 133 PetscCall(PetscLogEventRegister("RebalGatherGraph", DM_CLASSID, &DMPLEX_RebalGatherGraph)); 134 PetscCall(PetscLogEventRegister("RebalPartition", DM_CLASSID, &DMPLEX_RebalPartition)); 135 PetscCall(PetscLogEventRegister("RebalScatterPart", DM_CLASSID, &DMPLEX_RebalScatterPart)); 136 PetscCall(PetscLogEventRegister("RebalRewriteSF", DM_CLASSID, &DMPLEX_RebalRewriteSF)); 137 138 PetscCall(PetscLogEventRegister("DMSwarmMigrate", DM_CLASSID, &DMSWARM_Migrate)); 139 PetscCall(PetscLogEventRegister("DMSwarmDETSetup", DM_CLASSID, &DMSWARM_DataExchangerTopologySetup)); 140 PetscCall(PetscLogEventRegister("DMSwarmDExBegin", DM_CLASSID, &DMSWARM_DataExchangerBegin)); 141 PetscCall(PetscLogEventRegister("DMSwarmDExEnd", DM_CLASSID, &DMSWARM_DataExchangerEnd)); 142 PetscCall(PetscLogEventRegister("DMSwarmDESendCnt", DM_CLASSID, &DMSWARM_DataExchangerSendCount)); 143 PetscCall(PetscLogEventRegister("DMSwarmDEPack", DM_CLASSID, &DMSWARM_DataExchangerPack)); 144 PetscCall(PetscLogEventRegister("DMSwarmAddPnts", DM_CLASSID, &DMSWARM_AddPoints)); 145 PetscCall(PetscLogEventRegister("DMSwarmRmvPnts", DM_CLASSID, &DMSWARM_RemovePoints)); 146 PetscCall(PetscLogEventRegister("DMSwarmSort", DM_CLASSID, &DMSWARM_Sort)); 147 PetscCall(PetscLogEventRegister("DMSwarmSetSizes", DM_CLASSID, &DMSWARM_SetSizes)); 148 149 PetscCall(PetscLogEventRegister("DMNtLayoutSetUp", DM_CLASSID, &DMNetwork_LayoutSetUp)); 150 PetscCall(PetscLogEventRegister("DMNtSetUp", DM_CLASSID, &DMNetwork_SetUpNetwork)); 151 PetscCall(PetscLogEventRegister("DMNtDistribute", DM_CLASSID, &DMNetwork_Distribute)); 152 /* Process Info */ 153 { 154 PetscClassId classids[1]; 155 156 classids[0] = DM_CLASSID; 157 PetscCall(PetscInfoProcessClass("dm", 1, classids)); 158 } 159 160 /* Process summary exclusions */ 161 PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt)); 162 if (opt) { 163 PetscCall(PetscStrInList("dm", logList, ',', &pkg)); 164 if (pkg) PetscCall(PetscLogEventExcludeClass(DM_CLASSID)); 165 } 166 167 PetscCall(DMGenerateRegisterAll()); 168 PetscCall(PetscRegisterFinalize(DMGenerateRegisterDestroy)); 169 PetscCall(DMPlexTransformRegisterAll()); 170 PetscCall(PetscRegisterFinalize(DMPlexTransformRegisterDestroy)); 171 PetscCall(PetscRegisterFinalize(DMFinalizePackage)); 172 PetscFunctionReturn(0); 173 } 174 #include <petscfe.h> 175 176 static PetscBool PetscFEPackageInitialized = PETSC_FALSE; 177 /*@C 178 PetscFEFinalizePackage - This function finalizes everything in the PetscFE package. It is called 179 from PetscFinalize(). 180 181 Level: developer 182 183 .seealso: `PetscInitialize()` 184 @*/ 185 PetscErrorCode PetscFEFinalizePackage(void) { 186 PetscFunctionBegin; 187 PetscCall(PetscFunctionListDestroy(&PetscSpaceList)); 188 PetscCall(PetscFunctionListDestroy(&PetscDualSpaceList)); 189 PetscCall(PetscFunctionListDestroy(&PetscFEList)); 190 PetscFEPackageInitialized = PETSC_FALSE; 191 PetscSpaceRegisterAllCalled = PETSC_FALSE; 192 PetscDualSpaceRegisterAllCalled = PETSC_FALSE; 193 PetscFERegisterAllCalled = PETSC_FALSE; 194 PetscFunctionReturn(0); 195 } 196 197 /*@C 198 PetscFEInitializePackage - This function initializes everything in the FE package. It is called 199 from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscSpaceCreate() 200 when using static libraries. 201 202 Level: developer 203 204 .seealso: `PetscInitialize()` 205 @*/ 206 PetscErrorCode PetscFEInitializePackage(void) { 207 char logList[256]; 208 PetscBool opt, pkg; 209 210 PetscFunctionBegin; 211 if (PetscFEPackageInitialized) PetscFunctionReturn(0); 212 PetscFEPackageInitialized = PETSC_TRUE; 213 214 /* Register Classes */ 215 PetscCall(PetscClassIdRegister("Linear Space", &PETSCSPACE_CLASSID)); 216 PetscCall(PetscClassIdRegister("Dual Space", &PETSCDUALSPACE_CLASSID)); 217 PetscCall(PetscClassIdRegister("FE Space", &PETSCFE_CLASSID)); 218 /* Register Constructors */ 219 PetscCall(PetscSpaceRegisterAll()); 220 PetscCall(PetscDualSpaceRegisterAll()); 221 PetscCall(PetscFERegisterAll()); 222 /* Register Events */ 223 PetscCall(PetscLogEventRegister("DualSpaceSetUp", PETSCDUALSPACE_CLASSID, &PETSCDUALSPACE_SetUp)); 224 PetscCall(PetscLogEventRegister("FESetUp", PETSCFE_CLASSID, &PETSCFE_SetUp)); 225 /* Process Info */ 226 { 227 PetscClassId classids[3]; 228 229 classids[0] = PETSCFE_CLASSID; 230 classids[1] = PETSCSPACE_CLASSID; 231 classids[2] = PETSCDUALSPACE_CLASSID; 232 PetscCall(PetscInfoProcessClass("fe", 1, classids)); 233 PetscCall(PetscInfoProcessClass("space", 1, &classids[1])); 234 PetscCall(PetscInfoProcessClass("dualspace", 1, &classids[2])); 235 } 236 /* Process summary exclusions */ 237 PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt)); 238 if (opt) { 239 PetscCall(PetscStrInList("fe", logList, ',', &pkg)); 240 if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCFE_CLASSID)); 241 } 242 /* Register package finalizer */ 243 PetscCall(PetscRegisterFinalize(PetscFEFinalizePackage)); 244 PetscFunctionReturn(0); 245 } 246 #include <petscfv.h> 247 248 static PetscBool PetscFVPackageInitialized = PETSC_FALSE; 249 /*@C 250 PetscFVFinalizePackage - This function finalizes everything in the PetscFV package. It is called 251 from PetscFinalize(). 252 253 Level: developer 254 255 .seealso: `PetscInitialize()` 256 @*/ 257 PetscErrorCode PetscFVFinalizePackage(void) { 258 PetscFunctionBegin; 259 PetscCall(PetscFunctionListDestroy(&PetscLimiterList)); 260 PetscCall(PetscFunctionListDestroy(&PetscFVList)); 261 PetscFVPackageInitialized = PETSC_FALSE; 262 PetscFVRegisterAllCalled = PETSC_FALSE; 263 PetscLimiterRegisterAllCalled = PETSC_FALSE; 264 PetscFunctionReturn(0); 265 } 266 267 /*@C 268 PetscFVInitializePackage - This function initializes everything in the FV package. It is called 269 from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscFVCreate() 270 when using static libraries. 271 272 Level: developer 273 274 .seealso: `PetscInitialize()` 275 @*/ 276 PetscErrorCode PetscFVInitializePackage(void) { 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 PetscFunctionBegin; 324 PetscCall(PetscFunctionListDestroy(&PetscDSList)); 325 PetscDSPackageInitialized = PETSC_FALSE; 326 PetscDSRegisterAllCalled = PETSC_FALSE; 327 PetscFunctionReturn(0); 328 } 329 330 /*@C 331 PetscDSInitializePackage - This function initializes everything in the DS package. It is called 332 from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscDSCreate() 333 when using static libraries. 334 335 Level: developer 336 337 .seealso: `PetscInitialize()` 338 @*/ 339 PetscErrorCode PetscDSInitializePackage(void) { 340 char logList[256]; 341 PetscBool opt, pkg; 342 343 PetscFunctionBegin; 344 if (PetscDSPackageInitialized) PetscFunctionReturn(0); 345 PetscDSPackageInitialized = PETSC_TRUE; 346 347 /* Register Classes */ 348 PetscCall(PetscClassIdRegister("Discrete System", &PETSCDS_CLASSID)); 349 PetscCall(PetscClassIdRegister("Weak Form", &PETSCWEAKFORM_CLASSID)); 350 /* Register Constructors */ 351 PetscCall(PetscDSRegisterAll()); 352 /* Register Events */ 353 /* Process Info */ 354 { 355 PetscClassId classids[1]; 356 357 classids[0] = PETSCDS_CLASSID; 358 PetscCall(PetscInfoProcessClass("ds", 1, classids)); 359 } 360 /* Process summary exclusions */ 361 PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt)); 362 if (opt) { 363 PetscCall(PetscStrInList("ds", logList, ',', &pkg)); 364 if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCDS_CLASSID)); 365 } 366 /* Register package finalizer */ 367 PetscCall(PetscRegisterFinalize(PetscDSFinalizePackage)); 368 PetscFunctionReturn(0); 369 } 370 371 #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES) 372 /* 373 PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened. 374 375 This one registers all the mesh generators and partitioners that are in 376 the basic DM library. 377 378 */ 379 PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscdm(void) { 380 PetscFunctionBegin; 381 PetscCall(AOInitializePackage()); 382 PetscCall(PetscPartitionerInitializePackage()); 383 PetscCall(DMInitializePackage()); 384 PetscCall(PetscFEInitializePackage()); 385 PetscCall(PetscFVInitializePackage()); 386 PetscCall(DMFieldInitializePackage()); 387 PetscFunctionReturn(0); 388 } 389 390 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */ 391