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