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