xref: /petsc/src/dm/interface/dlregisdmdm.c (revision 5d7a6ebe9dde080aedbe86be0085708de8f97bb7)
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   PetscCall(PetscLogEventRegister("DMPlexUninterp", DM_CLASSID, &DMPLEX_Uninterpolate));
147 
148   PetscCall(PetscLogEventRegister("DMSwarmMigrate", DM_CLASSID, &DMSWARM_Migrate));
149   PetscCall(PetscLogEventRegister("DMSwarmDETSetup", DM_CLASSID, &DMSWARM_DataExchangerTopologySetup));
150   PetscCall(PetscLogEventRegister("DMSwarmDExBegin", DM_CLASSID, &DMSWARM_DataExchangerBegin));
151   PetscCall(PetscLogEventRegister("DMSwarmDExEnd", DM_CLASSID, &DMSWARM_DataExchangerEnd));
152   PetscCall(PetscLogEventRegister("DMSwarmDESendCnt", DM_CLASSID, &DMSWARM_DataExchangerSendCount));
153   PetscCall(PetscLogEventRegister("DMSwarmDEPack", DM_CLASSID, &DMSWARM_DataExchangerPack));
154   PetscCall(PetscLogEventRegister("DMSwarmAddPnts", DM_CLASSID, &DMSWARM_AddPoints));
155   PetscCall(PetscLogEventRegister("DMSwarmRmvPnts", DM_CLASSID, &DMSWARM_RemovePoints));
156   PetscCall(PetscLogEventRegister("DMSwarmSort", DM_CLASSID, &DMSWARM_Sort));
157   PetscCall(PetscLogEventRegister("DMSwarmSetSizes", DM_CLASSID, &DMSWARM_SetSizes));
158 
159   PetscCall(PetscLogEventRegister("DMNtLayoutSetUp", DM_CLASSID, &DMNetwork_LayoutSetUp));
160   PetscCall(PetscLogEventRegister("DMNtSetUp", DM_CLASSID, &DMNetwork_SetUpNetwork));
161   PetscCall(PetscLogEventRegister("DMNtDistribute", DM_CLASSID, &DMNetwork_Distribute));
162   /* Process Info */
163   {
164     PetscClassId classids[1];
165 
166     classids[0] = DM_CLASSID;
167     PetscCall(PetscInfoProcessClass("dm", 1, classids));
168   }
169 
170   /* Process summary exclusions */
171   PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt));
172   if (opt) {
173     PetscCall(PetscStrInList("dm", logList, ',', &pkg));
174     if (pkg) PetscCall(PetscLogEventExcludeClass(DM_CLASSID));
175   }
176 
177   PetscCall(DMGenerateRegisterAll());
178   PetscCall(PetscRegisterFinalize(DMGenerateRegisterDestroy));
179   PetscCall(DMPlexTransformRegisterAll());
180   PetscCall(PetscRegisterFinalize(DMPlexTransformRegisterDestroy));
181   PetscCall(DMLabelRegisterAll());
182   PetscCall(PetscRegisterFinalize(DMLabelRegisterDestroy));
183   PetscCall(PetscRegisterFinalize(DMFinalizePackage));
184   PetscFunctionReturn(PETSC_SUCCESS);
185 }
186 #include <petscfe.h>
187 
188 static PetscBool PetscFEPackageInitialized = PETSC_FALSE;
189 
190 /*@C
191   PetscFEFinalizePackage - This function finalizes everything in the PetscFE package. It is called
192   from PetscFinalize().
193 
194   Level: developer
195 
196 .seealso: `PetscInitialize()`
197 @*/
198 PetscErrorCode PetscFEFinalizePackage(void)
199 {
200   PetscFunctionBegin;
201   PetscCall(PetscFunctionListDestroy(&PetscSpaceList));
202   PetscCall(PetscFunctionListDestroy(&PetscDualSpaceList));
203   PetscCall(PetscFunctionListDestroy(&PetscFEList));
204   PetscFEPackageInitialized       = PETSC_FALSE;
205   PetscSpaceRegisterAllCalled     = PETSC_FALSE;
206   PetscDualSpaceRegisterAllCalled = PETSC_FALSE;
207   PetscFERegisterAllCalled        = PETSC_FALSE;
208   PetscFunctionReturn(PETSC_SUCCESS);
209 }
210 
211 /*@C
212   PetscFEInitializePackage - This function initializes everything in the FE package. It is called
213   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscSpaceCreate()
214   when using static libraries.
215 
216   Level: developer
217 
218 .seealso: `PetscInitialize()`
219 @*/
220 PetscErrorCode PetscFEInitializePackage(void)
221 {
222   char      logList[256];
223   PetscBool opt, pkg;
224 
225   PetscFunctionBegin;
226   if (PetscFEPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS);
227   PetscFEPackageInitialized = PETSC_TRUE;
228 
229   /* Register Classes */
230   PetscCall(PetscClassIdRegister("Linear Space", &PETSCSPACE_CLASSID));
231   PetscCall(PetscClassIdRegister("Dual Space", &PETSCDUALSPACE_CLASSID));
232   PetscCall(PetscClassIdRegister("FE Space", &PETSCFE_CLASSID));
233   /* Register Constructors */
234   PetscCall(PetscSpaceRegisterAll());
235   PetscCall(PetscDualSpaceRegisterAll());
236   PetscCall(PetscFERegisterAll());
237   /* Register Events */
238   PetscCall(PetscLogEventRegister("DualSpaceSetUp", PETSCDUALSPACE_CLASSID, &PETSCDUALSPACE_SetUp));
239   PetscCall(PetscLogEventRegister("FESetUp", PETSCFE_CLASSID, &PETSCFE_SetUp));
240   /* Process Info */
241   {
242     PetscClassId classids[3];
243 
244     classids[0] = PETSCFE_CLASSID;
245     classids[1] = PETSCSPACE_CLASSID;
246     classids[2] = PETSCDUALSPACE_CLASSID;
247     PetscCall(PetscInfoProcessClass("fe", 1, classids));
248     PetscCall(PetscInfoProcessClass("space", 1, &classids[1]));
249     PetscCall(PetscInfoProcessClass("dualspace", 1, &classids[2]));
250   }
251   /* Process summary exclusions */
252   PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt));
253   if (opt) {
254     PetscCall(PetscStrInList("fe", logList, ',', &pkg));
255     if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCFE_CLASSID));
256   }
257   /* Register package finalizer */
258   PetscCall(PetscRegisterFinalize(PetscFEFinalizePackage));
259   PetscFunctionReturn(PETSC_SUCCESS);
260 }
261 #include <petscfv.h>
262 
263 static PetscBool PetscFVPackageInitialized = PETSC_FALSE;
264 
265 /*@C
266   PetscFVFinalizePackage - This function finalizes everything in the PetscFV package. It is called
267   from PetscFinalize().
268 
269   Level: developer
270 
271 .seealso: `PetscInitialize()`
272 @*/
273 PetscErrorCode PetscFVFinalizePackage(void)
274 {
275   PetscFunctionBegin;
276   PetscCall(PetscFunctionListDestroy(&PetscLimiterList));
277   PetscCall(PetscFunctionListDestroy(&PetscFVList));
278   PetscFVPackageInitialized     = PETSC_FALSE;
279   PetscFVRegisterAllCalled      = PETSC_FALSE;
280   PetscLimiterRegisterAllCalled = PETSC_FALSE;
281   PetscFunctionReturn(PETSC_SUCCESS);
282 }
283 
284 /*@C
285   PetscFVInitializePackage - This function initializes everything in the FV package. It is called
286   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscFVCreate()
287   when using static libraries.
288 
289   Level: developer
290 
291 .seealso: `PetscInitialize()`
292 @*/
293 PetscErrorCode PetscFVInitializePackage(void)
294 {
295   char      logList[256];
296   PetscBool opt, pkg;
297 
298   PetscFunctionBegin;
299   if (PetscFVPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS);
300   PetscFVPackageInitialized = PETSC_TRUE;
301 
302   /* Register Classes */
303   PetscCall(PetscClassIdRegister("FV Space", &PETSCFV_CLASSID));
304   PetscCall(PetscClassIdRegister("Limiter", &PETSCLIMITER_CLASSID));
305   /* Register Constructors */
306   PetscCall(PetscFVRegisterAll());
307   /* Register Events */
308   /* Process Info */
309   {
310     PetscClassId classids[2];
311 
312     classids[0] = PETSCFV_CLASSID;
313     classids[1] = PETSCLIMITER_CLASSID;
314     PetscCall(PetscInfoProcessClass("fv", 1, classids));
315     PetscCall(PetscInfoProcessClass("limiter", 1, &classids[1]));
316   }
317   /* Process summary exclusions */
318   PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt));
319   if (opt) {
320     PetscCall(PetscStrInList("fv", logList, ',', &pkg));
321     if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCFV_CLASSID));
322     PetscCall(PetscStrInList("limiter", logList, ',', &pkg));
323     if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCLIMITER_CLASSID));
324   }
325   /* Register package finalizer */
326   PetscCall(PetscRegisterFinalize(PetscFVFinalizePackage));
327   PetscFunctionReturn(PETSC_SUCCESS);
328 }
329 #include <petscds.h>
330 
331 static PetscBool PetscDSPackageInitialized = PETSC_FALSE;
332 
333 /*@C
334   PetscDSFinalizePackage - This function finalizes everything in the PetscDS package. It is called
335   from PetscFinalize().
336 
337   Level: developer
338 
339 .seealso: `PetscInitialize()`
340 @*/
341 PetscErrorCode PetscDSFinalizePackage(void)
342 {
343   PetscFunctionBegin;
344   PetscCall(PetscFunctionListDestroy(&PetscDSList));
345   PetscDSPackageInitialized = PETSC_FALSE;
346   PetscDSRegisterAllCalled  = PETSC_FALSE;
347   PetscFunctionReturn(PETSC_SUCCESS);
348 }
349 
350 /*@C
351   PetscDSInitializePackage - This function initializes everything in the DS package. It is called
352   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscDSCreate()
353   when using static libraries.
354 
355   Level: developer
356 
357 .seealso: `PetscInitialize()`
358 @*/
359 PetscErrorCode PetscDSInitializePackage(void)
360 {
361   char      logList[256];
362   PetscBool opt, pkg;
363 
364   PetscFunctionBegin;
365   if (PetscDSPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS);
366   PetscDSPackageInitialized = PETSC_TRUE;
367 
368   /* Register Classes */
369   PetscCall(PetscClassIdRegister("Discrete System", &PETSCDS_CLASSID));
370   PetscCall(PetscClassIdRegister("Weak Form", &PETSCWEAKFORM_CLASSID));
371   /* Register Constructors */
372   PetscCall(PetscDSRegisterAll());
373   /* Register Events */
374   /* Process Info */
375   {
376     PetscClassId classids[1];
377 
378     classids[0] = PETSCDS_CLASSID;
379     PetscCall(PetscInfoProcessClass("ds", 1, classids));
380   }
381   /* Process summary exclusions */
382   PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt));
383   if (opt) {
384     PetscCall(PetscStrInList("ds", logList, ',', &pkg));
385     if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCDS_CLASSID));
386   }
387   /* Register package finalizer */
388   PetscCall(PetscRegisterFinalize(PetscDSFinalizePackage));
389   PetscFunctionReturn(PETSC_SUCCESS);
390 }
391 
392 #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES)
393 /*
394   PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened.
395 
396   This one registers all the mesh generators and partitioners that are in
397   the basic DM library.
398 
399 */
400 PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscdm(void)
401 {
402   PetscFunctionBegin;
403   PetscCall(AOInitializePackage());
404   PetscCall(PetscPartitionerInitializePackage());
405   PetscCall(DMInitializePackage());
406   PetscCall(PetscFEInitializePackage());
407   PetscCall(PetscFVInitializePackage());
408   PetscCall(DMFieldInitializePackage());
409   PetscFunctionReturn(PETSC_SUCCESS);
410 }
411 
412 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */
413