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