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