xref: /petsc/src/dm/interface/dlregisdmdm.c (revision 3d96e9964ff330fd2a9eee374bcd4376da7efe60)
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 #endif
36 
37 /*@C
38   DMInitializePackage - This function initializes everything in the DM package. It is called
39   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to AOCreate()
40   or DMDACreate() when using static libraries.
41 
42   Level: developer
43 
44 .keywords: AO, initialize, package
45 .seealso: PetscInitialize()
46 @*/
47 PetscErrorCode  DMInitializePackage(void)
48 {
49   char           logList[256];
50   char           *className;
51   PetscBool      opt;
52   PetscErrorCode ierr;
53 
54   PetscFunctionBegin;
55   if (DMPackageInitialized) PetscFunctionReturn(0);
56   DMPackageInitialized = PETSC_TRUE;
57 
58   /* Register Classes */
59   ierr = PetscClassIdRegister("Distributed Mesh",&DM_CLASSID);CHKERRQ(ierr);
60   ierr = PetscClassIdRegister("GraphPartitioner",&PETSCPARTITIONER_CLASSID);CHKERRQ(ierr);
61 
62 #if defined(PETSC_HAVE_HYPRE)
63   ierr = MatRegister(MATHYPRESTRUCT, MatCreate_HYPREStruct);CHKERRQ(ierr);
64 #endif
65   ierr = PetscSectionSymRegister(PETSCSECTIONSYMLABEL,PetscSectionSymCreate_Label);CHKERRQ(ierr);
66 
67   /* Register Constructors */
68   ierr = DMRegisterAll();CHKERRQ(ierr);
69   /* Register Events */
70   ierr = PetscLogEventRegister("DMConvert",              DM_CLASSID,&DM_Convert);CHKERRQ(ierr);
71   ierr = PetscLogEventRegister("DMGlobalToLocal",        DM_CLASSID,&DM_GlobalToLocal);CHKERRQ(ierr);
72   ierr = PetscLogEventRegister("DMLocalToGlobal",        DM_CLASSID,&DM_LocalToGlobal);CHKERRQ(ierr);
73   ierr = PetscLogEventRegister("DMLocatePoints",         DM_CLASSID,&DM_LocatePoints);CHKERRQ(ierr);
74   ierr = PetscLogEventRegister("DMCoarsen",              DM_CLASSID,&DM_Coarsen);CHKERRQ(ierr);
75   ierr = PetscLogEventRegister("DMCreateInterp",         DM_CLASSID,&DM_CreateInterpolation);CHKERRQ(ierr);
76   ierr = PetscLogEventRegister("DMCreateRestrict",       DM_CLASSID,&DM_CreateRestriction);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("DMPlexInterpSF",         DM_CLASSID,&DMPLEX_InterpolateSF);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 
104   ierr = PetscLogEventRegister("DMSwarmMigrate",         DM_CLASSID,&DMSWARM_Migrate);CHKERRQ(ierr);
105   ierr = PetscLogEventRegister("DMSwarmDETSetup",        DM_CLASSID,&DMSWARM_DataExchangerTopologySetup);CHKERRQ(ierr);
106   ierr = PetscLogEventRegister("DMSwarmDExBegin",        DM_CLASSID,&DMSWARM_DataExchangerBegin);CHKERRQ(ierr);
107   ierr = PetscLogEventRegister("DMSwarmDExEnd",          DM_CLASSID,&DMSWARM_DataExchangerEnd);CHKERRQ(ierr);
108   ierr = PetscLogEventRegister("DMSwarmDESendCnt",       DM_CLASSID,&DMSWARM_DataExchangerSendCount);CHKERRQ(ierr);
109   ierr = PetscLogEventRegister("DMSwarmDEPack",          DM_CLASSID,&DMSWARM_DataExchangerPack);CHKERRQ(ierr);
110   ierr = PetscLogEventRegister("DMSwarmAddPnts",         DM_CLASSID,&DMSWARM_AddPoints);CHKERRQ(ierr);
111   ierr = PetscLogEventRegister("DMSwarmRmvPnts",         DM_CLASSID,&DMSWARM_RemovePoints);CHKERRQ(ierr);
112   ierr = PetscLogEventRegister("DMSwarmSort",            DM_CLASSID,&DMSWARM_Sort);CHKERRQ(ierr);
113   ierr = PetscLogEventRegister("DMSwarmSetSizes",        DM_CLASSID,&DMSWARM_SetSizes);CHKERRQ(ierr);
114 
115   /* Process info exclusions */
116   ierr = PetscOptionsGetString(NULL,NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr);
117   if (opt) {
118     ierr = PetscStrstr(logList, "da", &className);CHKERRQ(ierr);
119     if (className) {
120       ierr = PetscInfoDeactivateClass(DM_CLASSID);CHKERRQ(ierr);
121     }
122   }
123   /* Process summary exclusions */
124   ierr = PetscOptionsGetString(NULL,NULL, "-log_exclude", logList, 256, &opt);CHKERRQ(ierr);
125   if (opt) {
126     ierr = PetscStrstr(logList, "da", &className);CHKERRQ(ierr);
127     if (className) {
128       ierr = PetscLogEventDeactivateClass(DM_CLASSID);CHKERRQ(ierr);
129     }
130   }
131   ierr = PetscRegisterFinalize(DMFinalizePackage);CHKERRQ(ierr);
132   PetscFunctionReturn(0);
133 }
134 #include <petscfe.h>
135 
136 static PetscBool PetscFEPackageInitialized = PETSC_FALSE;
137 /*@C
138   PetscFEFinalizePackage - This function finalizes everything in the PetscFE package. It is called
139   from PetscFinalize().
140 
141   Level: developer
142 
143 .keywords: PetscFE, initialize, package
144 .seealso: PetscInitialize()
145 @*/
146 PetscErrorCode PetscFEFinalizePackage(void)
147 {
148   PetscErrorCode ierr;
149 
150   PetscFunctionBegin;
151   ierr = PetscFunctionListDestroy(&PetscSpaceList);CHKERRQ(ierr);
152   ierr = PetscFunctionListDestroy(&PetscDualSpaceList);CHKERRQ(ierr);
153   ierr = PetscFunctionListDestroy(&PetscFEList);CHKERRQ(ierr);
154   PetscFEPackageInitialized       = PETSC_FALSE;
155   PetscSpaceRegisterAllCalled     = PETSC_FALSE;
156   PetscDualSpaceRegisterAllCalled = PETSC_FALSE;
157   PetscFERegisterAllCalled        = PETSC_FALSE;
158   PetscFunctionReturn(0);
159 }
160 
161 /*@C
162   PetscFEInitializePackage - This function initializes everything in the FE package. It is called
163   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscSpaceCreate()
164   when using static libraries.
165 
166   Level: developer
167 
168 .keywords: PetscFE, initialize, package
169 .seealso: PetscInitialize()
170 @*/
171 PetscErrorCode PetscFEInitializePackage(void)
172 {
173   char           logList[256];
174   char          *className;
175   PetscBool      opt;
176   PetscErrorCode ierr;
177 
178   PetscFunctionBegin;
179   if (PetscFEPackageInitialized) PetscFunctionReturn(0);
180   PetscFEPackageInitialized = PETSC_TRUE;
181 
182   /* Register Classes */
183   ierr = PetscClassIdRegister("Linear Space", &PETSCSPACE_CLASSID);CHKERRQ(ierr);
184   ierr = PetscClassIdRegister("Dual Space",   &PETSCDUALSPACE_CLASSID);CHKERRQ(ierr);
185   ierr = PetscClassIdRegister("FE Space",     &PETSCFE_CLASSID);CHKERRQ(ierr);
186 
187   /* Register Constructors */
188   ierr = PetscSpaceRegisterAll();CHKERRQ(ierr);
189   ierr = PetscDualSpaceRegisterAll();CHKERRQ(ierr);
190   ierr = PetscFERegisterAll();CHKERRQ(ierr);
191   /* Register Events */
192   /* Process info exclusions */
193   ierr = PetscOptionsGetString(NULL,NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr);
194   if (opt) {
195     ierr = PetscStrstr(logList, "fe", &className);CHKERRQ(ierr);
196     if (className) {ierr = PetscInfoDeactivateClass(PETSCFE_CLASSID);CHKERRQ(ierr);}
197   }
198   /* Process summary exclusions */
199   ierr = PetscOptionsGetString(NULL,NULL, "-log_exclude", logList, 256, &opt);CHKERRQ(ierr);
200   if (opt) {
201     ierr = PetscStrstr(logList, "fe", &className);CHKERRQ(ierr);
202     if (className) {ierr = PetscLogEventDeactivateClass(PETSCFE_CLASSID);CHKERRQ(ierr);}
203   }
204   ierr = PetscRegisterFinalize(PetscFEFinalizePackage);CHKERRQ(ierr);
205   PetscFunctionReturn(0);
206 }
207 #include <petscfv.h>
208 
209 static PetscBool PetscFVPackageInitialized = PETSC_FALSE;
210 /*@C
211   PetscFVFinalizePackage - This function finalizes everything in the PetscFV package. It is called
212   from PetscFinalize().
213 
214   Level: developer
215 
216 .keywords: PetscFV, initialize, package
217 .seealso: PetscInitialize()
218 @*/
219 PetscErrorCode PetscFVFinalizePackage(void)
220 {
221   PetscErrorCode ierr;
222 
223   PetscFunctionBegin;
224   ierr = PetscFunctionListDestroy(&PetscLimiterList);CHKERRQ(ierr);
225   ierr = PetscFunctionListDestroy(&PetscFVList);CHKERRQ(ierr);
226   PetscFVPackageInitialized     = PETSC_FALSE;
227   PetscFVRegisterAllCalled      = PETSC_FALSE;
228   PetscLimiterRegisterAllCalled = PETSC_FALSE;
229   PetscFunctionReturn(0);
230 }
231 
232 /*@C
233   PetscFVInitializePackage - This function initializes everything in the FV package. It is called
234   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscFVCreate()
235   when using static libraries.
236 
237   Level: developer
238 
239 .keywords: PetscFV, initialize, package
240 .seealso: PetscInitialize()
241 @*/
242 PetscErrorCode PetscFVInitializePackage(void)
243 {
244   char           logList[256];
245   char          *className;
246   PetscBool      opt;
247   PetscErrorCode ierr;
248 
249   PetscFunctionBegin;
250   if (PetscFVPackageInitialized) PetscFunctionReturn(0);
251   PetscFVPackageInitialized = PETSC_TRUE;
252 
253   /* Register Classes */
254   ierr = PetscClassIdRegister("FV Space", &PETSCFV_CLASSID);CHKERRQ(ierr);
255   ierr = PetscClassIdRegister("Limiter",  &PETSCLIMITER_CLASSID);CHKERRQ(ierr);
256 
257   /* Register Constructors */
258   ierr = PetscFVRegisterAll();CHKERRQ(ierr);
259   /* Register Events */
260   /* Process info exclusions */
261   ierr = PetscOptionsGetString(NULL,NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr);
262   if (opt) {
263     ierr = PetscStrstr(logList, "fv", &className);CHKERRQ(ierr);
264     if (className) {ierr = PetscInfoDeactivateClass(PETSCFV_CLASSID);CHKERRQ(ierr);}
265     ierr = PetscStrstr(logList, "limiter", &className);CHKERRQ(ierr);
266     if (className) {ierr = PetscInfoDeactivateClass(PETSCLIMITER_CLASSID);CHKERRQ(ierr);}
267   }
268   /* Process summary exclusions */
269   ierr = PetscOptionsGetString(NULL,NULL, "-log_exclude", logList, 256, &opt);CHKERRQ(ierr);
270   if (opt) {
271     ierr = PetscStrstr(logList, "fv", &className);CHKERRQ(ierr);
272     if (className) {ierr = PetscLogEventDeactivateClass(PETSCFV_CLASSID);CHKERRQ(ierr);}
273     ierr = PetscStrstr(logList, "limiter", &className);CHKERRQ(ierr);
274     if (className) {ierr = PetscLogEventDeactivateClass(PETSCLIMITER_CLASSID);CHKERRQ(ierr);}
275   }
276   ierr = PetscRegisterFinalize(PetscFVFinalizePackage);CHKERRQ(ierr);
277   PetscFunctionReturn(0);
278 }
279 #include <petscds.h>
280 
281 static PetscBool PetscDSPackageInitialized = PETSC_FALSE;
282 /*@C
283   PetscDSFinalizePackage - This function finalizes everything in the PetscDS package. It is called
284   from PetscFinalize().
285 
286   Level: developer
287 
288 .keywords: PetscDS, initialize, package
289 .seealso: PetscInitialize()
290 @*/
291 PetscErrorCode PetscDSFinalizePackage(void)
292 {
293   PetscErrorCode ierr;
294 
295   PetscFunctionBegin;
296   ierr = PetscFunctionListDestroy(&PetscDSList);CHKERRQ(ierr);
297   PetscDSPackageInitialized = PETSC_FALSE;
298   PetscDSRegisterAllCalled  = PETSC_FALSE;
299   PetscFunctionReturn(0);
300 }
301 
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_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 /*
347   PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened.
348 
349   This one registers all the mesh generators and partitioners that are in
350   the basic DM library.
351 
352 */
353 PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscdm(void)
354 {
355   PetscErrorCode ierr;
356 
357   PetscFunctionBegin;
358   ierr = AOInitializePackage();CHKERRQ(ierr);
359   ierr = DMInitializePackage();CHKERRQ(ierr);
360   ierr = PetscFEInitializePackage();CHKERRQ(ierr);
361   ierr = PetscFVInitializePackage();CHKERRQ(ierr);
362   PetscFunctionReturn(0);
363 }
364 
365 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */
366