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