xref: /petsc/src/dm/interface/dlregisdmdm.c (revision 0d41bb8b3154f55b564d8f58954494225c4e7bf8)
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("DMPlexDistField",        DM_CLASSID,&DMPLEX_DistributeField);CHKERRQ(ierr);
81   ierr = PetscLogEventRegister("DMPlexDistData",         DM_CLASSID,&DMPLEX_DistributeData);CHKERRQ(ierr);
82   ierr = PetscLogEventRegister("DMPlexStratify",         DM_CLASSID,&DMPLEX_Stratify);CHKERRQ(ierr);
83   ierr = PetscLogEventRegister("DMPlexPrealloc",         DM_CLASSID,&DMPLEX_Preallocate);CHKERRQ(ierr);
84   ierr = PetscLogEventRegister("DMPlexResidualFE",       DM_CLASSID,&DMPLEX_ResidualFEM);CHKERRQ(ierr);
85   ierr = PetscLogEventRegister("DMPlexJacobianFE",       DM_CLASSID,&DMPLEX_JacobianFEM);CHKERRQ(ierr);
86   ierr = PetscLogEventRegister("DMPlexInterpFE",         DM_CLASSID,&DMPLEX_InterpolatorFEM);CHKERRQ(ierr);
87   ierr = PetscLogEventRegister("DMPlexInjectorFE",       DM_CLASSID,&DMPLEX_InjectorFEM);CHKERRQ(ierr);
88   /* Process info exclusions */
89   ierr = PetscOptionsGetString(NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr);
90   if (opt) {
91     ierr = PetscStrstr(logList, "da", &className);CHKERRQ(ierr);
92     if (className) {
93       ierr = PetscInfoDeactivateClass(DM_CLASSID);CHKERRQ(ierr);
94     }
95   }
96   /* Process summary exclusions */
97   ierr = PetscOptionsGetString(NULL, "-log_summary_exclude", logList, 256, &opt);CHKERRQ(ierr);
98   if (opt) {
99     ierr = PetscStrstr(logList, "da", &className);CHKERRQ(ierr);
100     if (className) {
101       ierr = PetscLogEventDeactivateClass(DM_CLASSID);CHKERRQ(ierr);
102     }
103   }
104   ierr = PetscRegisterFinalize(DMFinalizePackage);CHKERRQ(ierr);
105   PetscFunctionReturn(0);
106 }
107 #include <petscfe.h>
108 
109 static PetscBool PetscFEPackageInitialized = PETSC_FALSE;
110 #undef __FUNCT__
111 #define __FUNCT__ "PetscFEFinalizePackage"
112 /*@C
113   PetscFEFinalizePackage - This function finalizes everything in the PetscFE package. It is called
114   from PetscFinalize().
115 
116   Level: developer
117 
118 .keywords: PetscFE, initialize, package
119 .seealso: PetscInitialize()
120 @*/
121 PetscErrorCode PetscFEFinalizePackage(void)
122 {
123   PetscErrorCode ierr;
124 
125   PetscFunctionBegin;
126   ierr = PetscFunctionListDestroy(&PetscSpaceList);CHKERRQ(ierr);
127   ierr = PetscFunctionListDestroy(&PetscDualSpaceList);CHKERRQ(ierr);
128   ierr = PetscFunctionListDestroy(&PetscFEList);CHKERRQ(ierr);
129   PetscFEPackageInitialized       = PETSC_FALSE;
130   PetscSpaceRegisterAllCalled     = PETSC_FALSE;
131   PetscDualSpaceRegisterAllCalled = PETSC_FALSE;
132   PetscFERegisterAllCalled        = PETSC_FALSE;
133   PetscFunctionReturn(0);
134 }
135 
136 #undef __FUNCT__
137 #define __FUNCT__ "PetscFEInitializePackage"
138 /*@C
139   PetscFEInitializePackage - This function initializes everything in the FE package. It is called
140   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscSpaceCreate()
141   when using static libraries.
142 
143   Level: developer
144 
145 .keywords: PetscFE, initialize, package
146 .seealso: PetscInitialize()
147 @*/
148 PetscErrorCode PetscFEInitializePackage(void)
149 {
150   char           logList[256];
151   char          *className;
152   PetscBool      opt;
153   PetscErrorCode ierr;
154 
155   PetscFunctionBegin;
156   if (PetscFEPackageInitialized) PetscFunctionReturn(0);
157   PetscFEPackageInitialized = PETSC_TRUE;
158 
159   /* Register Classes */
160   ierr = PetscClassIdRegister("Linear Space", &PETSCSPACE_CLASSID);CHKERRQ(ierr);
161   ierr = PetscClassIdRegister("Dual Space",   &PETSCDUALSPACE_CLASSID);CHKERRQ(ierr);
162   ierr = PetscClassIdRegister("FE Space",     &PETSCFE_CLASSID);CHKERRQ(ierr);
163 
164   /* Register Constructors */
165   ierr = PetscSpaceRegisterAll();CHKERRQ(ierr);
166   ierr = PetscDualSpaceRegisterAll();CHKERRQ(ierr);
167   ierr = PetscFERegisterAll();CHKERRQ(ierr);
168   /* Register Events */
169   /* Process info exclusions */
170   ierr = PetscOptionsGetString(NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr);
171   if (opt) {
172     ierr = PetscStrstr(logList, "fe", &className);CHKERRQ(ierr);
173     if (className) {ierr = PetscInfoDeactivateClass(PETSCFE_CLASSID);CHKERRQ(ierr);}
174   }
175   /* Process summary exclusions */
176   ierr = PetscOptionsGetString(NULL, "-log_summary_exclude", logList, 256, &opt);CHKERRQ(ierr);
177   if (opt) {
178     ierr = PetscStrstr(logList, "fe", &className);CHKERRQ(ierr);
179     if (className) {ierr = PetscLogEventDeactivateClass(PETSCFE_CLASSID);CHKERRQ(ierr);}
180   }
181   ierr = PetscRegisterFinalize(PetscFEFinalizePackage);CHKERRQ(ierr);
182   PetscFunctionReturn(0);
183 }
184 #include <petscfv.h>
185 
186 static PetscBool PetscFVPackageInitialized = PETSC_FALSE;
187 #undef __FUNCT__
188 #define __FUNCT__ "PetscFVFinalizePackage"
189 /*@C
190   PetscFVFinalizePackage - This function finalizes everything in the PetscFV package. It is called
191   from PetscFinalize().
192 
193   Level: developer
194 
195 .keywords: PetscFV, initialize, package
196 .seealso: PetscInitialize()
197 @*/
198 PetscErrorCode PetscFVFinalizePackage(void)
199 {
200   PetscErrorCode ierr;
201 
202   PetscFunctionBegin;
203   ierr = PetscFunctionListDestroy(&PetscLimiterList);CHKERRQ(ierr);
204   ierr = PetscFunctionListDestroy(&PetscFVList);CHKERRQ(ierr);
205   PetscFVPackageInitialized     = PETSC_FALSE;
206   PetscFVRegisterAllCalled      = PETSC_FALSE;
207   PetscLimiterRegisterAllCalled = PETSC_FALSE;
208   PetscFunctionReturn(0);
209 }
210 
211 #undef __FUNCT__
212 #define __FUNCT__ "PetscFVInitializePackage"
213 /*@C
214   PetscFVInitializePackage - This function initializes everything in the FV package. It is called
215   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscFVCreate()
216   when using static libraries.
217 
218   Level: developer
219 
220 .keywords: PetscFV, initialize, package
221 .seealso: PetscInitialize()
222 @*/
223 PetscErrorCode PetscFVInitializePackage(void)
224 {
225   char           logList[256];
226   char          *className;
227   PetscBool      opt;
228   PetscErrorCode ierr;
229 
230   PetscFunctionBegin;
231   if (PetscFVPackageInitialized) PetscFunctionReturn(0);
232   PetscFVPackageInitialized = PETSC_TRUE;
233 
234   /* Register Classes */
235   ierr = PetscClassIdRegister("FV Space", &PETSCFV_CLASSID);CHKERRQ(ierr);
236   ierr = PetscClassIdRegister("Limiter",  &PETSCLIMITER_CLASSID);CHKERRQ(ierr);
237 
238   /* Register Constructors */
239   ierr = PetscFVRegisterAll();CHKERRQ(ierr);
240   /* Register Events */
241   /* Process info exclusions */
242   ierr = PetscOptionsGetString(NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr);
243   if (opt) {
244     ierr = PetscStrstr(logList, "fv", &className);CHKERRQ(ierr);
245     if (className) {ierr = PetscInfoDeactivateClass(PETSCFV_CLASSID);CHKERRQ(ierr);}
246     ierr = PetscStrstr(logList, "limiter", &className);CHKERRQ(ierr);
247     if (className) {ierr = PetscInfoDeactivateClass(PETSCLIMITER_CLASSID);CHKERRQ(ierr);}
248   }
249   /* Process summary exclusions */
250   ierr = PetscOptionsGetString(NULL, "-log_summary_exclude", logList, 256, &opt);CHKERRQ(ierr);
251   if (opt) {
252     ierr = PetscStrstr(logList, "fv", &className);CHKERRQ(ierr);
253     if (className) {ierr = PetscLogEventDeactivateClass(PETSCFV_CLASSID);CHKERRQ(ierr);}
254     ierr = PetscStrstr(logList, "limiter", &className);CHKERRQ(ierr);
255     if (className) {ierr = PetscLogEventDeactivateClass(PETSCLIMITER_CLASSID);CHKERRQ(ierr);}
256   }
257   ierr = PetscRegisterFinalize(PetscFVFinalizePackage);CHKERRQ(ierr);
258   PetscFunctionReturn(0);
259 }
260 #include <petscds.h>
261 
262 static PetscBool PetscDSPackageInitialized = PETSC_FALSE;
263 #undef __FUNCT__
264 #define __FUNCT__ "PetscDSFinalizePackage"
265 /*@C
266   PetscDSFinalizePackage - This function finalizes everything in the PetscDS package. It is called
267   from PetscFinalize().
268 
269   Level: developer
270 
271 .keywords: PetscDS, initialize, package
272 .seealso: PetscInitialize()
273 @*/
274 PetscErrorCode PetscDSFinalizePackage(void)
275 {
276   PetscErrorCode ierr;
277 
278   PetscFunctionBegin;
279   ierr = PetscFunctionListDestroy(&PetscDSList);CHKERRQ(ierr);
280   PetscDSPackageInitialized = PETSC_FALSE;
281   PetscDSRegisterAllCalled  = PETSC_FALSE;
282   PetscFunctionReturn(0);
283 }
284 
285 #undef __FUNCT__
286 #define __FUNCT__ "PetscDSInitializePackage"
287 /*@C
288   PetscDSInitializePackage - This function initializes everything in the DS package. It is called
289   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscDSCreate()
290   when using static libraries.
291 
292   Level: developer
293 
294 .keywords: PetscDS, initialize, package
295 .seealso: PetscInitialize()
296 @*/
297 PetscErrorCode PetscDSInitializePackage(void)
298 {
299   char           logList[256];
300   char          *className;
301   PetscBool      opt;
302   PetscErrorCode ierr;
303 
304   PetscFunctionBegin;
305   if (PetscDSPackageInitialized) PetscFunctionReturn(0);
306   PetscDSPackageInitialized = PETSC_TRUE;
307 
308   /* Register Classes */
309   ierr = PetscClassIdRegister("Discrete System", &PETSCDS_CLASSID);CHKERRQ(ierr);
310 
311   /* Register Constructors */
312   ierr = PetscDSRegisterAll();CHKERRQ(ierr);
313   /* Register Events */
314   /* Process info exclusions */
315   ierr = PetscOptionsGetString(NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr);
316   if (opt) {
317     ierr = PetscStrstr(logList, "ds", &className);CHKERRQ(ierr);
318     if (className) {ierr = PetscInfoDeactivateClass(PETSCDS_CLASSID);CHKERRQ(ierr);}
319   }
320   /* Process summary exclusions */
321   ierr = PetscOptionsGetString(NULL, "-log_summary_exclude", logList, 256, &opt);CHKERRQ(ierr);
322   if (opt) {
323     ierr = PetscStrstr(logList, "ds", &className);CHKERRQ(ierr);
324     if (className) {ierr = PetscLogEventDeactivateClass(PETSCDS_CLASSID);CHKERRQ(ierr);}
325   }
326   ierr = PetscRegisterFinalize(PetscDSFinalizePackage);CHKERRQ(ierr);
327   PetscFunctionReturn(0);
328 }
329 
330 #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES)
331 #undef __FUNCT__
332 #define __FUNCT__ "PetscDLLibraryRegister_petscdm"
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