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