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