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