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