xref: /petsc/src/dm/interface/dlregisdmdm.c (revision c4762a1b19cd2af06abeed90e8f9d34fb975dd94)
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   ierr = PetscClassIdRegister("Quadrature",&PETSCQUADRATURE_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   ierr = PetscLogEventRegister("DMCreateInject",         DM_CLASSID,&DM_CreateInjection);CHKERRQ(ierr);
80   ierr = PetscLogEventRegister("DMCreateMat",            DM_CLASSID,&DM_CreateMatrix);CHKERRQ(ierr);
81   ierr = PetscLogEventRegister("DMLoad",                 DM_CLASSID,&DM_Load);CHKERRQ(ierr);
82 
83   ierr = PetscLogEventRegister("DMPlexCrFrCeLi",         DM_CLASSID,&DMPLEX_CreateFromCellList);CHKERRQ(ierr);
84   ierr = PetscLogEventRegister("DMPlexCrFrCeLiCo",       DM_CLASSID,&DMPLEX_CreateFromCellList_Coordinates);CHKERRQ(ierr);
85   ierr = PetscLogEventRegister("DMPlexCreateGmsh",       DM_CLASSID,&DMPLEX_CreateGmsh);CHKERRQ(ierr);
86   ierr = PetscLogEventRegister("DMPlexCrFromFile",       DM_CLASSID,&DMPLEX_CreateFromFile);CHKERRQ(ierr);
87   ierr = PetscLogEventRegister("Mesh Partition",         DM_CLASSID,&DMPLEX_Partition);CHKERRQ(ierr);
88   ierr = PetscLogEventRegister("Mesh Migration",         DM_CLASSID,&DMPLEX_Migrate);CHKERRQ(ierr);
89   ierr = PetscLogEventRegister("DMPlexPartSelf",         DM_CLASSID,&DMPLEX_PartSelf);CHKERRQ(ierr);
90   ierr = PetscLogEventRegister("DMPlexPartLblInv",       DM_CLASSID,&DMPLEX_PartLabelInvert);CHKERRQ(ierr);
91   ierr = PetscLogEventRegister("DMPlexPartLblSF",        DM_CLASSID,&DMPLEX_PartLabelCreateSF);CHKERRQ(ierr);
92   ierr = PetscLogEventRegister("DMPlexPartStrtSF",       DM_CLASSID,&DMPLEX_PartStratSF);CHKERRQ(ierr);
93   ierr = PetscLogEventRegister("DMPlexPointSF",          DM_CLASSID,&DMPLEX_CreatePointSF);CHKERRQ(ierr);
94   ierr = PetscLogEventRegister("DMPlexInterp",           DM_CLASSID,&DMPLEX_Interpolate);CHKERRQ(ierr);
95   ierr = PetscLogEventRegister("DMPlexDistribute",       DM_CLASSID,&DMPLEX_Distribute);CHKERRQ(ierr);
96   ierr = PetscLogEventRegister("DMPlexDistCones",        DM_CLASSID,&DMPLEX_DistributeCones);CHKERRQ(ierr);
97   ierr = PetscLogEventRegister("DMPlexDistLabels",       DM_CLASSID,&DMPLEX_DistributeLabels);CHKERRQ(ierr);
98   ierr = PetscLogEventRegister("DMPlexDistSF",           DM_CLASSID,&DMPLEX_DistributeSF);CHKERRQ(ierr);
99   ierr = PetscLogEventRegister("DMPlexDistOvrlp",        DM_CLASSID,&DMPLEX_DistributeOverlap);CHKERRQ(ierr);
100   ierr = PetscLogEventRegister("DMPlexDistField",        DM_CLASSID,&DMPLEX_DistributeField);CHKERRQ(ierr);
101   ierr = PetscLogEventRegister("DMPlexDistData",         DM_CLASSID,&DMPLEX_DistributeData);CHKERRQ(ierr);
102   ierr = PetscLogEventRegister("DMPlexInterpSF",         DM_CLASSID,&DMPLEX_InterpolateSF);CHKERRQ(ierr);
103   ierr = PetscLogEventRegister("DMPlexGToNBegin",        DM_CLASSID,&DMPLEX_GlobalToNaturalBegin);CHKERRQ(ierr);
104   ierr = PetscLogEventRegister("DMPlexGToNEnd",          DM_CLASSID,&DMPLEX_GlobalToNaturalEnd);CHKERRQ(ierr);
105   ierr = PetscLogEventRegister("DMPlexNToGBegin",        DM_CLASSID,&DMPLEX_NaturalToGlobalBegin);CHKERRQ(ierr);
106   ierr = PetscLogEventRegister("DMPlexNToGEnd",          DM_CLASSID,&DMPLEX_NaturalToGlobalEnd);CHKERRQ(ierr);
107   ierr = PetscLogEventRegister("DMPlexStratify",         DM_CLASSID,&DMPLEX_Stratify);CHKERRQ(ierr);
108   ierr = PetscLogEventRegister("DMPlexSymmetrize",       DM_CLASSID,&DMPLEX_Symmetrize);CHKERRQ(ierr);
109   ierr = PetscLogEventRegister("DMPlexPrealloc",         DM_CLASSID,&DMPLEX_Preallocate);CHKERRQ(ierr);
110   ierr = PetscLogEventRegister("DMPlexResidualFE",       DM_CLASSID,&DMPLEX_ResidualFEM);CHKERRQ(ierr);
111   ierr = PetscLogEventRegister("DMPlexJacobianFE",       DM_CLASSID,&DMPLEX_JacobianFEM);CHKERRQ(ierr);
112   ierr = PetscLogEventRegister("DMPlexInterpFE",         DM_CLASSID,&DMPLEX_InterpolatorFEM);CHKERRQ(ierr);
113   ierr = PetscLogEventRegister("DMPlexInjectorFE",       DM_CLASSID,&DMPLEX_InjectorFEM);CHKERRQ(ierr);
114   ierr = PetscLogEventRegister("DMPlexIntegralFEM",      DM_CLASSID,&DMPLEX_IntegralFEM);CHKERRQ(ierr);
115   ierr = PetscLogEventRegister("DMPlexRebalance",        DM_CLASSID,&DMPLEX_RebalanceSharedPoints);CHKERRQ(ierr);
116 
117   ierr = PetscLogEventRegister("DMSwarmMigrate",         DM_CLASSID,&DMSWARM_Migrate);CHKERRQ(ierr);
118   ierr = PetscLogEventRegister("DMSwarmDETSetup",        DM_CLASSID,&DMSWARM_DataExchangerTopologySetup);CHKERRQ(ierr);
119   ierr = PetscLogEventRegister("DMSwarmDExBegin",        DM_CLASSID,&DMSWARM_DataExchangerBegin);CHKERRQ(ierr);
120   ierr = PetscLogEventRegister("DMSwarmDExEnd",          DM_CLASSID,&DMSWARM_DataExchangerEnd);CHKERRQ(ierr);
121   ierr = PetscLogEventRegister("DMSwarmDESendCnt",       DM_CLASSID,&DMSWARM_DataExchangerSendCount);CHKERRQ(ierr);
122   ierr = PetscLogEventRegister("DMSwarmDEPack",          DM_CLASSID,&DMSWARM_DataExchangerPack);CHKERRQ(ierr);
123   ierr = PetscLogEventRegister("DMSwarmAddPnts",         DM_CLASSID,&DMSWARM_AddPoints);CHKERRQ(ierr);
124   ierr = PetscLogEventRegister("DMSwarmRmvPnts",         DM_CLASSID,&DMSWARM_RemovePoints);CHKERRQ(ierr);
125   ierr = PetscLogEventRegister("DMSwarmSort",            DM_CLASSID,&DMSWARM_Sort);CHKERRQ(ierr);
126   ierr = PetscLogEventRegister("DMSwarmSetSizes",        DM_CLASSID,&DMSWARM_SetSizes);CHKERRQ(ierr);
127 
128   /* Process info exclusions */
129   ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
130   if (opt) {
131     ierr = PetscStrInList("dm",logList,',',&pkg);CHKERRQ(ierr);
132     if (pkg) {ierr = PetscInfoDeactivateClass(DM_CLASSID);CHKERRQ(ierr);}
133   }
134 
135   /* Process summary exclusions */
136   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
137   if (opt) {
138     ierr = PetscStrInList("dm",logList,',',&pkg);CHKERRQ(ierr);
139     if (pkg) {ierr = PetscLogEventExcludeClass(DM_CLASSID);CHKERRQ(ierr);}
140   }
141 
142   ierr = DMPlexGenerateRegisterAll();CHKERRQ(ierr);
143   ierr = PetscRegisterFinalize(DMPlexGenerateRegisterDestroy);CHKERRQ(ierr);
144   ierr = PetscRegisterFinalize(DMFinalizePackage);CHKERRQ(ierr);
145   PetscFunctionReturn(0);
146 }
147 #include <petscfe.h>
148 
149 static PetscBool PetscFEPackageInitialized = PETSC_FALSE;
150 /*@C
151   PetscFEFinalizePackage - This function finalizes everything in the PetscFE package. It is called
152   from PetscFinalize().
153 
154   Level: developer
155 
156 .seealso: PetscInitialize()
157 @*/
158 PetscErrorCode PetscFEFinalizePackage(void)
159 {
160   PetscErrorCode ierr;
161 
162   PetscFunctionBegin;
163   ierr = PetscFunctionListDestroy(&PetscSpaceList);CHKERRQ(ierr);
164   ierr = PetscFunctionListDestroy(&PetscDualSpaceList);CHKERRQ(ierr);
165   ierr = PetscFunctionListDestroy(&PetscFEList);CHKERRQ(ierr);
166   PetscFEPackageInitialized       = PETSC_FALSE;
167   PetscSpaceRegisterAllCalled     = PETSC_FALSE;
168   PetscDualSpaceRegisterAllCalled = PETSC_FALSE;
169   PetscFERegisterAllCalled        = PETSC_FALSE;
170   PetscFunctionReturn(0);
171 }
172 
173 /*@C
174   PetscFEInitializePackage - This function initializes everything in the FE package. It is called
175   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscSpaceCreate()
176   when using static libraries.
177 
178   Level: developer
179 
180 .seealso: PetscInitialize()
181 @*/
182 PetscErrorCode PetscFEInitializePackage(void)
183 {
184   char           logList[256];
185   PetscBool      opt,pkg;
186   PetscErrorCode ierr;
187 
188   PetscFunctionBegin;
189   if (PetscFEPackageInitialized) PetscFunctionReturn(0);
190   PetscFEPackageInitialized = PETSC_TRUE;
191 
192   /* Register Classes */
193   ierr = PetscClassIdRegister("Linear Space", &PETSCSPACE_CLASSID);CHKERRQ(ierr);
194   ierr = PetscClassIdRegister("Dual Space",   &PETSCDUALSPACE_CLASSID);CHKERRQ(ierr);
195   ierr = PetscClassIdRegister("FE Space",     &PETSCFE_CLASSID);CHKERRQ(ierr);
196   /* Register Constructors */
197   ierr = PetscSpaceRegisterAll();CHKERRQ(ierr);
198   ierr = PetscDualSpaceRegisterAll();CHKERRQ(ierr);
199   ierr = PetscFERegisterAll();CHKERRQ(ierr);
200   /* Register Events */
201   /* Process info exclusions */
202   ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
203   if (opt) {
204     ierr = PetscStrInList("fe",logList,',',&pkg);CHKERRQ(ierr);
205     if (pkg) {ierr = PetscInfoDeactivateClass(PETSCFE_CLASSID);CHKERRQ(ierr);}
206   }
207   /* Process summary exclusions */
208   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
209   if (opt) {
210     ierr = PetscStrInList("fe",logList,',',&pkg);CHKERRQ(ierr);
211     if (pkg) {ierr = PetscLogEventExcludeClass(PETSCFE_CLASSID);CHKERRQ(ierr);}
212   }
213   /* Register package finalizer */
214   ierr = PetscRegisterFinalize(PetscFEFinalizePackage);CHKERRQ(ierr);
215   PetscFunctionReturn(0);
216 }
217 #include <petscfv.h>
218 
219 static PetscBool PetscFVPackageInitialized = PETSC_FALSE;
220 /*@C
221   PetscFVFinalizePackage - This function finalizes everything in the PetscFV package. It is called
222   from PetscFinalize().
223 
224   Level: developer
225 
226 .seealso: PetscInitialize()
227 @*/
228 PetscErrorCode PetscFVFinalizePackage(void)
229 {
230   PetscErrorCode ierr;
231 
232   PetscFunctionBegin;
233   ierr = PetscFunctionListDestroy(&PetscLimiterList);CHKERRQ(ierr);
234   ierr = PetscFunctionListDestroy(&PetscFVList);CHKERRQ(ierr);
235   PetscFVPackageInitialized     = PETSC_FALSE;
236   PetscFVRegisterAllCalled      = PETSC_FALSE;
237   PetscLimiterRegisterAllCalled = PETSC_FALSE;
238   PetscFunctionReturn(0);
239 }
240 
241 /*@C
242   PetscFVInitializePackage - This function initializes everything in the FV package. It is called
243   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscFVCreate()
244   when using static libraries.
245 
246   Level: developer
247 
248 .seealso: PetscInitialize()
249 @*/
250 PetscErrorCode PetscFVInitializePackage(void)
251 {
252   char           logList[256];
253   PetscBool      opt,pkg;
254   PetscErrorCode ierr;
255 
256   PetscFunctionBegin;
257   if (PetscFVPackageInitialized) PetscFunctionReturn(0);
258   PetscFVPackageInitialized = PETSC_TRUE;
259 
260   /* Register Classes */
261   ierr = PetscClassIdRegister("FV Space", &PETSCFV_CLASSID);CHKERRQ(ierr);
262   ierr = PetscClassIdRegister("Limiter",  &PETSCLIMITER_CLASSID);CHKERRQ(ierr);
263   /* Register Constructors */
264   ierr = PetscFVRegisterAll();CHKERRQ(ierr);
265   /* Register Events */
266   /* Process info exclusions */
267   ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
268   if (opt) {
269     ierr = PetscStrInList("fv",logList,',',&pkg);CHKERRQ(ierr);
270     if (pkg) {ierr = PetscInfoDeactivateClass(PETSCFV_CLASSID);CHKERRQ(ierr);}
271     ierr = PetscStrInList("limiter",logList,',',&pkg);CHKERRQ(ierr);
272     if (pkg) {ierr = PetscInfoDeactivateClass(PETSCLIMITER_CLASSID);CHKERRQ(ierr);}
273   }
274   /* Process summary exclusions */
275   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
276   if (opt) {
277     ierr = PetscStrInList("fv",logList,',',&pkg);CHKERRQ(ierr);
278     if (pkg) {ierr = PetscLogEventExcludeClass(PETSCFV_CLASSID);CHKERRQ(ierr);}
279     ierr = PetscStrInList("limiter",logList,',',&pkg);CHKERRQ(ierr);
280     if (pkg) {ierr = PetscLogEventExcludeClass(PETSCLIMITER_CLASSID);CHKERRQ(ierr);}
281   }
282   /* Register package finalizer */
283   ierr = PetscRegisterFinalize(PetscFVFinalizePackage);CHKERRQ(ierr);
284   PetscFunctionReturn(0);
285 }
286 #include <petscds.h>
287 
288 static PetscBool PetscDSPackageInitialized = PETSC_FALSE;
289 /*@C
290   PetscDSFinalizePackage - This function finalizes everything in the PetscDS package. It is called
291   from PetscFinalize().
292 
293   Level: developer
294 
295 .seealso: PetscInitialize()
296 @*/
297 PetscErrorCode PetscDSFinalizePackage(void)
298 {
299   PetscErrorCode ierr;
300 
301   PetscFunctionBegin;
302   ierr = PetscFunctionListDestroy(&PetscDSList);CHKERRQ(ierr);
303   PetscDSPackageInitialized = PETSC_FALSE;
304   PetscDSRegisterAllCalled  = PETSC_FALSE;
305   PetscFunctionReturn(0);
306 }
307 
308 /*@C
309   PetscDSInitializePackage - This function initializes everything in the DS package. It is called
310   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscDSCreate()
311   when using static libraries.
312 
313   Level: developer
314 
315 .seealso: PetscInitialize()
316 @*/
317 PetscErrorCode PetscDSInitializePackage(void)
318 {
319   char           logList[256];
320   PetscBool      opt,pkg;
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   /* Register Constructors */
330   ierr = PetscDSRegisterAll();CHKERRQ(ierr);
331   /* Register Events */
332   /* Process info exclusions */
333   ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
334   if (opt) {
335     ierr = PetscStrInList("ds",logList,',',&pkg);CHKERRQ(ierr);
336     if (pkg) {ierr = PetscInfoDeactivateClass(PETSCDS_CLASSID);CHKERRQ(ierr);}
337   }
338   /* Process summary exclusions */
339   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
340   if (opt) {
341     ierr = PetscStrInList("ds",logList,',',&pkg);CHKERRQ(ierr);
342     if (pkg) {ierr = PetscLogEventExcludeClass(PETSCDS_CLASSID);CHKERRQ(ierr);}
343   }
344   /* Register package finalizer */
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   ierr = DMFieldInitializePackage();CHKERRQ(ierr);
367   PetscFunctionReturn(0);
368 }
369 
370 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */
371