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