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