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