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