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