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