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