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