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