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