xref: /petsc/src/dm/interface/dlregisdmdm.c (revision fc8a9adeb7fcdc98711d755fa2dc544ddccf0f3e)
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 .keywords: AO, initialize, package
19 .seealso: PetscInitialize()
20 @*/
21 PetscErrorCode  DMFinalizePackage(void)
22 {
23   PetscErrorCode ierr;
24 
25   PetscFunctionBegin;
26   ierr = PetscFunctionListDestroy(&PetscPartitionerList);CHKERRQ(ierr);
27   ierr = PetscFunctionListDestroy(&DMList);CHKERRQ(ierr);
28   DMPackageInitialized = PETSC_FALSE;
29   DMRegisterAllCalled  = PETSC_FALSE;
30   PetscPartitionerRegisterAllCalled = PETSC_FALSE;
31   PetscFunctionReturn(0);
32 }
33 
34 #if defined(PETSC_HAVE_HYPRE)
35 PETSC_EXTERN PetscErrorCode MatCreate_HYPREStruct(Mat);
36 PETSC_EXTERN PetscErrorCode MatCreate_HYPRESStruct(Mat);
37 #endif
38 
39 /*@C
40   DMInitializePackage - This function initializes everything in the DM package. It is called
41   from PetscDLLibraryRegister_petscdm() when using dynamic libraries, and on the first call to AOCreate()
42   or DMDACreate() when using shared or static libraries.
43 
44   Level: developer
45 
46 .keywords: AO, initialize, package
47 .seealso: PetscInitialize()
48 @*/
49 PetscErrorCode  DMInitializePackage(void)
50 {
51   char           logList[256];
52   PetscBool      opt,pkg;
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("DM Label",&DMLABEL_CLASSID);CHKERRQ(ierr);
62   ierr = PetscClassIdRegister("GraphPartitioner",&PETSCPARTITIONER_CLASSID);CHKERRQ(ierr);
63 
64 #if defined(PETSC_HAVE_HYPRE)
65   ierr = MatRegister(MATHYPRESTRUCT, MatCreate_HYPREStruct);CHKERRQ(ierr);
66   ierr = MatRegister(MATHYPRESSTRUCT, MatCreate_HYPRESStruct);CHKERRQ(ierr);
67 #endif
68   ierr = PetscSectionSymRegister(PETSCSECTIONSYMLABEL,PetscSectionSymCreate_Label);CHKERRQ(ierr);
69 
70   /* Register Constructors */
71   ierr = DMRegisterAll();CHKERRQ(ierr);
72   /* Register Events */
73   ierr = PetscLogEventRegister("DMConvert",              DM_CLASSID,&DM_Convert);CHKERRQ(ierr);
74   ierr = PetscLogEventRegister("DMGlobalToLocal",        DM_CLASSID,&DM_GlobalToLocal);CHKERRQ(ierr);
75   ierr = PetscLogEventRegister("DMLocalToGlobal",        DM_CLASSID,&DM_LocalToGlobal);CHKERRQ(ierr);
76   ierr = PetscLogEventRegister("DMLocatePoints",         DM_CLASSID,&DM_LocatePoints);CHKERRQ(ierr);
77   ierr = PetscLogEventRegister("DMCoarsen",              DM_CLASSID,&DM_Coarsen);CHKERRQ(ierr);
78   ierr = PetscLogEventRegister("DMCreateInterp",         DM_CLASSID,&DM_CreateInterpolation);CHKERRQ(ierr);
79   ierr = PetscLogEventRegister("DMCreateRestrict",       DM_CLASSID,&DM_CreateRestriction);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 .keywords: PetscFE, initialize, package
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 .keywords: PetscFE, initialize, package
177 .seealso: PetscInitialize()
178 @*/
179 PetscErrorCode PetscFEInitializePackage(void)
180 {
181   char           logList[256];
182   PetscBool      opt,pkg;
183   PetscErrorCode ierr;
184 
185   PetscFunctionBegin;
186   if (PetscFEPackageInitialized) PetscFunctionReturn(0);
187   PetscFEPackageInitialized = PETSC_TRUE;
188 
189   /* Register Classes */
190   ierr = PetscClassIdRegister("Linear Space", &PETSCSPACE_CLASSID);CHKERRQ(ierr);
191   ierr = PetscClassIdRegister("Dual Space",   &PETSCDUALSPACE_CLASSID);CHKERRQ(ierr);
192   ierr = PetscClassIdRegister("FE Space",     &PETSCFE_CLASSID);CHKERRQ(ierr);
193   /* Register Constructors */
194   ierr = PetscSpaceRegisterAll();CHKERRQ(ierr);
195   ierr = PetscDualSpaceRegisterAll();CHKERRQ(ierr);
196   ierr = PetscFERegisterAll();CHKERRQ(ierr);
197   /* Register Events */
198   /* Process info exclusions */
199   ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
200   if (opt) {
201     ierr = PetscStrInList("fe",logList,',',&pkg);CHKERRQ(ierr);
202     if (pkg) {ierr = PetscInfoDeactivateClass(PETSCFE_CLASSID);CHKERRQ(ierr);}
203   }
204   /* Process summary exclusions */
205   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
206   if (opt) {
207     ierr = PetscStrInList("fe",logList,',',&pkg);CHKERRQ(ierr);
208     if (pkg) {ierr = PetscLogEventExcludeClass(PETSCFE_CLASSID);CHKERRQ(ierr);}
209   }
210   /* Register package finalizer */
211   ierr = PetscRegisterFinalize(PetscFEFinalizePackage);CHKERRQ(ierr);
212   PetscFunctionReturn(0);
213 }
214 #include <petscfv.h>
215 
216 static PetscBool PetscFVPackageInitialized = PETSC_FALSE;
217 /*@C
218   PetscFVFinalizePackage - This function finalizes everything in the PetscFV package. It is called
219   from PetscFinalize().
220 
221   Level: developer
222 
223 .keywords: PetscFV, initialize, package
224 .seealso: PetscInitialize()
225 @*/
226 PetscErrorCode PetscFVFinalizePackage(void)
227 {
228   PetscErrorCode ierr;
229 
230   PetscFunctionBegin;
231   ierr = PetscFunctionListDestroy(&PetscLimiterList);CHKERRQ(ierr);
232   ierr = PetscFunctionListDestroy(&PetscFVList);CHKERRQ(ierr);
233   PetscFVPackageInitialized     = PETSC_FALSE;
234   PetscFVRegisterAllCalled      = PETSC_FALSE;
235   PetscLimiterRegisterAllCalled = PETSC_FALSE;
236   PetscFunctionReturn(0);
237 }
238 
239 /*@C
240   PetscFVInitializePackage - This function initializes everything in the FV package. It is called
241   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscFVCreate()
242   when using static libraries.
243 
244   Level: developer
245 
246 .keywords: PetscFV, initialize, package
247 .seealso: PetscInitialize()
248 @*/
249 PetscErrorCode PetscFVInitializePackage(void)
250 {
251   char           logList[256];
252   PetscBool      opt,pkg;
253   PetscErrorCode ierr;
254 
255   PetscFunctionBegin;
256   if (PetscFVPackageInitialized) PetscFunctionReturn(0);
257   PetscFVPackageInitialized = PETSC_TRUE;
258 
259   /* Register Classes */
260   ierr = PetscClassIdRegister("FV Space", &PETSCFV_CLASSID);CHKERRQ(ierr);
261   ierr = PetscClassIdRegister("Limiter",  &PETSCLIMITER_CLASSID);CHKERRQ(ierr);
262   /* Register Constructors */
263   ierr = PetscFVRegisterAll();CHKERRQ(ierr);
264   /* Register Events */
265   /* Process info exclusions */
266   ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
267   if (opt) {
268     ierr = PetscStrInList("fv",logList,',',&pkg);CHKERRQ(ierr);
269     if (pkg) {ierr = PetscInfoDeactivateClass(PETSCFV_CLASSID);CHKERRQ(ierr);}
270     ierr = PetscStrInList("limiter",logList,',',&pkg);CHKERRQ(ierr);
271     if (pkg) {ierr = PetscInfoDeactivateClass(PETSCLIMITER_CLASSID);CHKERRQ(ierr);}
272   }
273   /* Process summary exclusions */
274   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
275   if (opt) {
276     ierr = PetscStrInList("fv",logList,',',&pkg);CHKERRQ(ierr);
277     if (pkg) {ierr = PetscLogEventExcludeClass(PETSCFV_CLASSID);CHKERRQ(ierr);}
278     ierr = PetscStrInList("limiter",logList,',',&pkg);CHKERRQ(ierr);
279     if (pkg) {ierr = PetscLogEventExcludeClass(PETSCLIMITER_CLASSID);CHKERRQ(ierr);}
280   }
281   /* Register package finalizer */
282   ierr = PetscRegisterFinalize(PetscFVFinalizePackage);CHKERRQ(ierr);
283   PetscFunctionReturn(0);
284 }
285 #include <petscds.h>
286 
287 static PetscBool PetscDSPackageInitialized = PETSC_FALSE;
288 /*@C
289   PetscDSFinalizePackage - This function finalizes everything in the PetscDS package. It is called
290   from PetscFinalize().
291 
292   Level: developer
293 
294 .keywords: PetscDS, initialize, package
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 .keywords: PetscDS, initialize, package
316 .seealso: PetscInitialize()
317 @*/
318 PetscErrorCode PetscDSInitializePackage(void)
319 {
320   char           logList[256];
321   PetscBool      opt,pkg;
322   PetscErrorCode ierr;
323 
324   PetscFunctionBegin;
325   if (PetscDSPackageInitialized) PetscFunctionReturn(0);
326   PetscDSPackageInitialized = PETSC_TRUE;
327 
328   /* Register Classes */
329   ierr = PetscClassIdRegister("Discrete System", &PETSCDS_CLASSID);CHKERRQ(ierr);
330   /* Register Constructors */
331   ierr = PetscDSRegisterAll();CHKERRQ(ierr);
332   /* Register Events */
333   /* Process info exclusions */
334   ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
335   if (opt) {
336     ierr = PetscStrInList("ds",logList,',',&pkg);CHKERRQ(ierr);
337     if (pkg) {ierr = PetscInfoDeactivateClass(PETSCDS_CLASSID);CHKERRQ(ierr);}
338   }
339   /* Process summary exclusions */
340   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
341   if (opt) {
342     ierr = PetscStrInList("ds",logList,',',&pkg);CHKERRQ(ierr);
343     if (pkg) {ierr = PetscLogEventExcludeClass(PETSCDS_CLASSID);CHKERRQ(ierr);}
344   }
345   /* Register package finalizer */
346   ierr = PetscRegisterFinalize(PetscDSFinalizePackage);CHKERRQ(ierr);
347   PetscFunctionReturn(0);
348 }
349 
350 #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES)
351 /*
352   PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened.
353 
354   This one registers all the mesh generators and partitioners that are in
355   the basic DM library.
356 
357 */
358 PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscdm(void)
359 {
360   PetscErrorCode ierr;
361 
362   PetscFunctionBegin;
363   ierr = AOInitializePackage();CHKERRQ(ierr);
364   ierr = DMInitializePackage();CHKERRQ(ierr);
365   ierr = PetscFEInitializePackage();CHKERRQ(ierr);
366   ierr = PetscFVInitializePackage();CHKERRQ(ierr);
367   ierr = DMFieldInitializePackage();CHKERRQ(ierr);
368   PetscFunctionReturn(0);
369 }
370 
371 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */
372