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