xref: /petsc/src/dm/interface/dlregisdmdm.c (revision 58c0e5077dcf40d6a880c19c87f1075ae1d22c8e)
1 
2 #include <petscao.h>
3 #include <petsc/private/dmlabelimpl.h>
4 #include <petsc/private/dmfieldimpl.h>
5 #include <petsc/private/dmpleximpl.h>
6 #include <petsc/private/petscdsimpl.h>
7 #include <petsc/private/petscfeimpl.h>
8 #include <petsc/private/petscfvimpl.h>
9 #include <petsc/private/dmswarmimpl.h>
10 
11 static PetscBool DMPackageInitialized = PETSC_FALSE;
12 /*@C
13   DMFinalizePackage - This function finalizes everything in the DM package. It is called
14   from PetscFinalize().
15 
16   Level: developer
17 
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_petscdm() when using dynamic libraries, and on the first call to AOCreate()
41   or DMDACreate() when using shared or static libraries.
42 
43   Level: developer
44 
45 .seealso: PetscInitialize()
46 @*/
47 PetscErrorCode  DMInitializePackage(void)
48 {
49   char           logList[256];
50   PetscBool      opt,pkg;
51   PetscErrorCode ierr;
52 
53   PetscFunctionBegin;
54   if (DMPackageInitialized) PetscFunctionReturn(0);
55   DMPackageInitialized = PETSC_TRUE;
56 
57   /* Register Classes */
58   ierr = PetscClassIdRegister("Distributed Mesh",&DM_CLASSID);CHKERRQ(ierr);
59   ierr = PetscClassIdRegister("DM Label",&DMLABEL_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   ierr = MatRegister(MATHYPRESSTRUCT, MatCreate_HYPRESStruct);CHKERRQ(ierr);
65 #endif
66   ierr = PetscSectionSymRegister(PETSCSECTIONSYMLABEL,PetscSectionSymCreate_Label);CHKERRQ(ierr);
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   ierr = PetscLogEventRegister("DMCreateInject",         DM_CLASSID,&DM_CreateInjection);CHKERRQ(ierr);
79   ierr = PetscLogEventRegister("DMCreateMat",            DM_CLASSID,&DM_CreateMatrix);CHKERRQ(ierr);
80 
81   ierr = PetscLogEventRegister("Mesh Partition",         DM_CLASSID,&DMPLEX_Partition);CHKERRQ(ierr);
82   ierr = PetscLogEventRegister("Mesh Migration",         DM_CLASSID,&DMPLEX_Migrate);CHKERRQ(ierr);
83   ierr = PetscLogEventRegister("DMPlexPartSelf",         DM_CLASSID,&DMPLEX_PartSelf);CHKERRQ(ierr);
84   ierr = PetscLogEventRegister("DMPlexPartLblInv",       DM_CLASSID,&DMPLEX_PartLabelInvert);CHKERRQ(ierr);
85   ierr = PetscLogEventRegister("DMPlexPartLblSF",        DM_CLASSID,&DMPLEX_PartLabelCreateSF);CHKERRQ(ierr);
86   ierr = PetscLogEventRegister("DMPlexPartStrtSF",       DM_CLASSID,&DMPLEX_PartStratSF);CHKERRQ(ierr);
87   ierr = PetscLogEventRegister("DMPlexPointSF",          DM_CLASSID,&DMPLEX_CreatePointSF);CHKERRQ(ierr);
88   ierr = PetscLogEventRegister("DMPlexInterp",           DM_CLASSID,&DMPLEX_Interpolate);CHKERRQ(ierr);
89   ierr = PetscLogEventRegister("DMPlexDistribute",       DM_CLASSID,&DMPLEX_Distribute);CHKERRQ(ierr);
90   ierr = PetscLogEventRegister("DMPlexDistCones",        DM_CLASSID,&DMPLEX_DistributeCones);CHKERRQ(ierr);
91   ierr = PetscLogEventRegister("DMPlexDistLabels",       DM_CLASSID,&DMPLEX_DistributeLabels);CHKERRQ(ierr);
92   ierr = PetscLogEventRegister("DMPlexDistSF",           DM_CLASSID,&DMPLEX_DistributeSF);CHKERRQ(ierr);
93   ierr = PetscLogEventRegister("DMPlexDistOvrlp",        DM_CLASSID,&DMPLEX_DistributeOverlap);CHKERRQ(ierr);
94   ierr = PetscLogEventRegister("DMPlexDistField",        DM_CLASSID,&DMPLEX_DistributeField);CHKERRQ(ierr);
95   ierr = PetscLogEventRegister("DMPlexDistData",         DM_CLASSID,&DMPLEX_DistributeData);CHKERRQ(ierr);
96   ierr = PetscLogEventRegister("DMPlexInterpSF",         DM_CLASSID,&DMPLEX_InterpolateSF);CHKERRQ(ierr);
97   ierr = PetscLogEventRegister("DMPlexGToNBegin",        DM_CLASSID,&DMPLEX_GlobalToNaturalBegin);CHKERRQ(ierr);
98   ierr = PetscLogEventRegister("DMPlexGToNEnd",          DM_CLASSID,&DMPLEX_GlobalToNaturalEnd);CHKERRQ(ierr);
99   ierr = PetscLogEventRegister("DMPlexNToGBegin",        DM_CLASSID,&DMPLEX_NaturalToGlobalBegin);CHKERRQ(ierr);
100   ierr = PetscLogEventRegister("DMPlexNToGEnd",          DM_CLASSID,&DMPLEX_NaturalToGlobalEnd);CHKERRQ(ierr);
101   ierr = PetscLogEventRegister("DMPlexStratify",         DM_CLASSID,&DMPLEX_Stratify);CHKERRQ(ierr);
102   ierr = PetscLogEventRegister("DMPlexSymmetrize",       DM_CLASSID,&DMPLEX_Symmetrize);CHKERRQ(ierr);
103   ierr = PetscLogEventRegister("DMPlexPrealloc",         DM_CLASSID,&DMPLEX_Preallocate);CHKERRQ(ierr);
104   ierr = PetscLogEventRegister("DMPlexResidualFE",       DM_CLASSID,&DMPLEX_ResidualFEM);CHKERRQ(ierr);
105   ierr = PetscLogEventRegister("DMPlexJacobianFE",       DM_CLASSID,&DMPLEX_JacobianFEM);CHKERRQ(ierr);
106   ierr = PetscLogEventRegister("DMPlexInterpFE",         DM_CLASSID,&DMPLEX_InterpolatorFEM);CHKERRQ(ierr);
107   ierr = PetscLogEventRegister("DMPlexInjectorFE",       DM_CLASSID,&DMPLEX_InjectorFEM);CHKERRQ(ierr);
108   ierr = PetscLogEventRegister("DMPlexIntegralFEM",      DM_CLASSID,&DMPLEX_IntegralFEM);CHKERRQ(ierr);
109   ierr = PetscLogEventRegister("DMPlexCreateGmsh",       DM_CLASSID,&DMPLEX_CreateGmsh);CHKERRQ(ierr);
110   ierr = PetscLogEventRegister("DMPlexRebalance",        DM_CLASSID,&DMPLEX_RebalanceSharedPoints);CHKERRQ(ierr);
111 
112   ierr = PetscLogEventRegister("DMSwarmMigrate",         DM_CLASSID,&DMSWARM_Migrate);CHKERRQ(ierr);
113   ierr = PetscLogEventRegister("DMSwarmDETSetup",        DM_CLASSID,&DMSWARM_DataExchangerTopologySetup);CHKERRQ(ierr);
114   ierr = PetscLogEventRegister("DMSwarmDExBegin",        DM_CLASSID,&DMSWARM_DataExchangerBegin);CHKERRQ(ierr);
115   ierr = PetscLogEventRegister("DMSwarmDExEnd",          DM_CLASSID,&DMSWARM_DataExchangerEnd);CHKERRQ(ierr);
116   ierr = PetscLogEventRegister("DMSwarmDESendCnt",       DM_CLASSID,&DMSWARM_DataExchangerSendCount);CHKERRQ(ierr);
117   ierr = PetscLogEventRegister("DMSwarmDEPack",          DM_CLASSID,&DMSWARM_DataExchangerPack);CHKERRQ(ierr);
118   ierr = PetscLogEventRegister("DMSwarmAddPnts",         DM_CLASSID,&DMSWARM_AddPoints);CHKERRQ(ierr);
119   ierr = PetscLogEventRegister("DMSwarmRmvPnts",         DM_CLASSID,&DMSWARM_RemovePoints);CHKERRQ(ierr);
120   ierr = PetscLogEventRegister("DMSwarmSort",            DM_CLASSID,&DMSWARM_Sort);CHKERRQ(ierr);
121   ierr = PetscLogEventRegister("DMSwarmSetSizes",        DM_CLASSID,&DMSWARM_SetSizes);CHKERRQ(ierr);
122 
123   /* Process info exclusions */
124   ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
125   if (opt) {
126     ierr = PetscStrInList("dm",logList,',',&pkg);CHKERRQ(ierr);
127     if (pkg) {ierr = PetscInfoDeactivateClass(DM_CLASSID);CHKERRQ(ierr);}
128   }
129 
130   /* Process summary exclusions */
131   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
132   if (opt) {
133     ierr = PetscStrInList("dm",logList,',',&pkg);CHKERRQ(ierr);
134     if (pkg) {ierr = PetscLogEventExcludeClass(DM_CLASSID);CHKERRQ(ierr);}
135   }
136 
137   ierr = DMPlexGenerateRegisterAll();CHKERRQ(ierr);
138   ierr = PetscRegisterFinalize(DMPlexGenerateRegisterDestroy);CHKERRQ(ierr);
139   ierr = PetscRegisterFinalize(DMFinalizePackage);CHKERRQ(ierr);
140   PetscFunctionReturn(0);
141 }
142 #include <petscfe.h>
143 
144 static PetscBool PetscFEPackageInitialized = PETSC_FALSE;
145 /*@C
146   PetscFEFinalizePackage - This function finalizes everything in the PetscFE package. It is called
147   from PetscFinalize().
148 
149   Level: developer
150 
151 .seealso: PetscInitialize()
152 @*/
153 PetscErrorCode PetscFEFinalizePackage(void)
154 {
155   PetscErrorCode ierr;
156 
157   PetscFunctionBegin;
158   ierr = PetscFunctionListDestroy(&PetscSpaceList);CHKERRQ(ierr);
159   ierr = PetscFunctionListDestroy(&PetscDualSpaceList);CHKERRQ(ierr);
160   ierr = PetscFunctionListDestroy(&PetscFEList);CHKERRQ(ierr);
161   PetscFEPackageInitialized       = PETSC_FALSE;
162   PetscSpaceRegisterAllCalled     = PETSC_FALSE;
163   PetscDualSpaceRegisterAllCalled = PETSC_FALSE;
164   PetscFERegisterAllCalled        = PETSC_FALSE;
165   PetscFunctionReturn(0);
166 }
167 
168 /*@C
169   PetscFEInitializePackage - This function initializes everything in the FE package. It is called
170   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscSpaceCreate()
171   when using static libraries.
172 
173   Level: developer
174 
175 .seealso: PetscInitialize()
176 @*/
177 PetscErrorCode PetscFEInitializePackage(void)
178 {
179   char           logList[256];
180   PetscBool      opt,pkg;
181   PetscErrorCode ierr;
182 
183   PetscFunctionBegin;
184   if (PetscFEPackageInitialized) PetscFunctionReturn(0);
185   PetscFEPackageInitialized = PETSC_TRUE;
186 
187   /* Register Classes */
188   ierr = PetscClassIdRegister("Linear Space", &PETSCSPACE_CLASSID);CHKERRQ(ierr);
189   ierr = PetscClassIdRegister("Dual Space",   &PETSCDUALSPACE_CLASSID);CHKERRQ(ierr);
190   ierr = PetscClassIdRegister("FE Space",     &PETSCFE_CLASSID);CHKERRQ(ierr);
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,sizeof(logList),&opt);CHKERRQ(ierr);
198   if (opt) {
199     ierr = PetscStrInList("fe",logList,',',&pkg);CHKERRQ(ierr);
200     if (pkg) {ierr = PetscInfoDeactivateClass(PETSCFE_CLASSID);CHKERRQ(ierr);}
201   }
202   /* Process summary exclusions */
203   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
204   if (opt) {
205     ierr = PetscStrInList("fe",logList,',',&pkg);CHKERRQ(ierr);
206     if (pkg) {ierr = PetscLogEventExcludeClass(PETSCFE_CLASSID);CHKERRQ(ierr);}
207   }
208   /* Register package finalizer */
209   ierr = PetscRegisterFinalize(PetscFEFinalizePackage);CHKERRQ(ierr);
210   PetscFunctionReturn(0);
211 }
212 #include <petscfv.h>
213 
214 static PetscBool PetscFVPackageInitialized = PETSC_FALSE;
215 /*@C
216   PetscFVFinalizePackage - This function finalizes everything in the PetscFV package. It is called
217   from PetscFinalize().
218 
219   Level: developer
220 
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 .seealso: PetscInitialize()
244 @*/
245 PetscErrorCode PetscFVInitializePackage(void)
246 {
247   char           logList[256];
248   PetscBool      opt,pkg;
249   PetscErrorCode ierr;
250 
251   PetscFunctionBegin;
252   if (PetscFVPackageInitialized) PetscFunctionReturn(0);
253   PetscFVPackageInitialized = PETSC_TRUE;
254 
255   /* Register Classes */
256   ierr = PetscClassIdRegister("FV Space", &PETSCFV_CLASSID);CHKERRQ(ierr);
257   ierr = PetscClassIdRegister("Limiter",  &PETSCLIMITER_CLASSID);CHKERRQ(ierr);
258   /* Register Constructors */
259   ierr = PetscFVRegisterAll();CHKERRQ(ierr);
260   /* Register Events */
261   /* Process info exclusions */
262   ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
263   if (opt) {
264     ierr = PetscStrInList("fv",logList,',',&pkg);CHKERRQ(ierr);
265     if (pkg) {ierr = PetscInfoDeactivateClass(PETSCFV_CLASSID);CHKERRQ(ierr);}
266     ierr = PetscStrInList("limiter",logList,',',&pkg);CHKERRQ(ierr);
267     if (pkg) {ierr = PetscInfoDeactivateClass(PETSCLIMITER_CLASSID);CHKERRQ(ierr);}
268   }
269   /* Process summary exclusions */
270   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
271   if (opt) {
272     ierr = PetscStrInList("fv",logList,',',&pkg);CHKERRQ(ierr);
273     if (pkg) {ierr = PetscLogEventExcludeClass(PETSCFV_CLASSID);CHKERRQ(ierr);}
274     ierr = PetscStrInList("limiter",logList,',',&pkg);CHKERRQ(ierr);
275     if (pkg) {ierr = PetscLogEventExcludeClass(PETSCLIMITER_CLASSID);CHKERRQ(ierr);}
276   }
277   /* Register package finalizer */
278   ierr = PetscRegisterFinalize(PetscFVFinalizePackage);CHKERRQ(ierr);
279   PetscFunctionReturn(0);
280 }
281 #include <petscds.h>
282 
283 static PetscBool PetscDSPackageInitialized = PETSC_FALSE;
284 /*@C
285   PetscDSFinalizePackage - This function finalizes everything in the PetscDS package. It is called
286   from PetscFinalize().
287 
288   Level: developer
289 
290 .seealso: PetscInitialize()
291 @*/
292 PetscErrorCode PetscDSFinalizePackage(void)
293 {
294   PetscErrorCode ierr;
295 
296   PetscFunctionBegin;
297   ierr = PetscFunctionListDestroy(&PetscDSList);CHKERRQ(ierr);
298   PetscDSPackageInitialized = PETSC_FALSE;
299   PetscDSRegisterAllCalled  = PETSC_FALSE;
300   PetscFunctionReturn(0);
301 }
302 
303 /*@C
304   PetscDSInitializePackage - This function initializes everything in the DS package. It is called
305   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscDSCreate()
306   when using static libraries.
307 
308   Level: developer
309 
310 .seealso: PetscInitialize()
311 @*/
312 PetscErrorCode PetscDSInitializePackage(void)
313 {
314   char           logList[256];
315   PetscBool      opt,pkg;
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   /* Register Constructors */
325   ierr = PetscDSRegisterAll();CHKERRQ(ierr);
326   /* Register Events */
327   /* Process info exclusions */
328   ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
329   if (opt) {
330     ierr = PetscStrInList("ds",logList,',',&pkg);CHKERRQ(ierr);
331     if (pkg) {ierr = PetscInfoDeactivateClass(PETSCDS_CLASSID);CHKERRQ(ierr);}
332   }
333   /* Process summary exclusions */
334   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
335   if (opt) {
336     ierr = PetscStrInList("ds",logList,',',&pkg);CHKERRQ(ierr);
337     if (pkg) {ierr = PetscLogEventExcludeClass(PETSCDS_CLASSID);CHKERRQ(ierr);}
338   }
339   /* Register package finalizer */
340   ierr = PetscRegisterFinalize(PetscDSFinalizePackage);CHKERRQ(ierr);
341   PetscFunctionReturn(0);
342 }
343 
344 #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES)
345 /*
346   PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened.
347 
348   This one registers all the mesh generators and partitioners that are in
349   the basic DM library.
350 
351 */
352 PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscdm(void)
353 {
354   PetscErrorCode ierr;
355 
356   PetscFunctionBegin;
357   ierr = AOInitializePackage();CHKERRQ(ierr);
358   ierr = DMInitializePackage();CHKERRQ(ierr);
359   ierr = PetscFEInitializePackage();CHKERRQ(ierr);
360   ierr = PetscFVInitializePackage();CHKERRQ(ierr);
361   ierr = DMFieldInitializePackage();CHKERRQ(ierr);
362   PetscFunctionReturn(0);
363 }
364 
365 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */
366