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