xref: /petsc/src/dm/interface/dlregisdmdm.c (revision f1f45c6317fc61daec9a7001f16481d2525be400)
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   ierr = PetscLogEventRegister("DMLoad",                 DM_CLASSID,&DM_Load);CHKERRQ(ierr);
81 
82   ierr = PetscLogEventRegister("DMPlexCrFrCeLi",         DM_CLASSID,&DMPLEX_CreateFromCellList);CHKERRQ(ierr);
83   ierr = PetscLogEventRegister("DMPlexCrFrCeLiCo",       DM_CLASSID,&DMPLEX_CreateFromCellList_Coordinates);CHKERRQ(ierr);
84   ierr = PetscLogEventRegister("DMPlexCreateGmsh",       DM_CLASSID,&DMPLEX_CreateGmsh);CHKERRQ(ierr);
85   ierr = PetscLogEventRegister("DMPlexCrFromFile",       DM_CLASSID,&DMPLEX_CreateFromFile);CHKERRQ(ierr);
86   ierr = PetscLogEventRegister("Mesh Partition",         DM_CLASSID,&DMPLEX_Partition);CHKERRQ(ierr);
87   ierr = PetscLogEventRegister("Mesh Migration",         DM_CLASSID,&DMPLEX_Migrate);CHKERRQ(ierr);
88   ierr = PetscLogEventRegister("DMPlexPartSelf",         DM_CLASSID,&DMPLEX_PartSelf);CHKERRQ(ierr);
89   ierr = PetscLogEventRegister("DMPlexPartLblInv",       DM_CLASSID,&DMPLEX_PartLabelInvert);CHKERRQ(ierr);
90   ierr = PetscLogEventRegister("DMPlexPartLblSF",        DM_CLASSID,&DMPLEX_PartLabelCreateSF);CHKERRQ(ierr);
91   ierr = PetscLogEventRegister("DMPlexPartStrtSF",       DM_CLASSID,&DMPLEX_PartStratSF);CHKERRQ(ierr);
92   ierr = PetscLogEventRegister("DMPlexPointSF",          DM_CLASSID,&DMPLEX_CreatePointSF);CHKERRQ(ierr);
93   ierr = PetscLogEventRegister("DMPlexInterp",           DM_CLASSID,&DMPLEX_Interpolate);CHKERRQ(ierr);
94   ierr = PetscLogEventRegister("DMPlexDistribute",       DM_CLASSID,&DMPLEX_Distribute);CHKERRQ(ierr);
95   ierr = PetscLogEventRegister("DMPlexDistCones",        DM_CLASSID,&DMPLEX_DistributeCones);CHKERRQ(ierr);
96   ierr = PetscLogEventRegister("DMPlexDistLabels",       DM_CLASSID,&DMPLEX_DistributeLabels);CHKERRQ(ierr);
97   ierr = PetscLogEventRegister("DMPlexDistSF",           DM_CLASSID,&DMPLEX_DistributeSF);CHKERRQ(ierr);
98   ierr = PetscLogEventRegister("DMPlexDistOvrlp",        DM_CLASSID,&DMPLEX_DistributeOverlap);CHKERRQ(ierr);
99   ierr = PetscLogEventRegister("DMPlexDistField",        DM_CLASSID,&DMPLEX_DistributeField);CHKERRQ(ierr);
100   ierr = PetscLogEventRegister("DMPlexDistData",         DM_CLASSID,&DMPLEX_DistributeData);CHKERRQ(ierr);
101   ierr = PetscLogEventRegister("DMPlexInterpSF",         DM_CLASSID,&DMPLEX_InterpolateSF);CHKERRQ(ierr);
102   ierr = PetscLogEventRegister("DMPlexGToNBegin",        DM_CLASSID,&DMPLEX_GlobalToNaturalBegin);CHKERRQ(ierr);
103   ierr = PetscLogEventRegister("DMPlexGToNEnd",          DM_CLASSID,&DMPLEX_GlobalToNaturalEnd);CHKERRQ(ierr);
104   ierr = PetscLogEventRegister("DMPlexNToGBegin",        DM_CLASSID,&DMPLEX_NaturalToGlobalBegin);CHKERRQ(ierr);
105   ierr = PetscLogEventRegister("DMPlexNToGEnd",          DM_CLASSID,&DMPLEX_NaturalToGlobalEnd);CHKERRQ(ierr);
106   ierr = PetscLogEventRegister("DMPlexStratify",         DM_CLASSID,&DMPLEX_Stratify);CHKERRQ(ierr);
107   ierr = PetscLogEventRegister("DMPlexSymmetrize",       DM_CLASSID,&DMPLEX_Symmetrize);CHKERRQ(ierr);
108   ierr = PetscLogEventRegister("DMPlexPrealloc",         DM_CLASSID,&DMPLEX_Preallocate);CHKERRQ(ierr);
109   ierr = PetscLogEventRegister("DMPlexResidualFE",       DM_CLASSID,&DMPLEX_ResidualFEM);CHKERRQ(ierr);
110   ierr = PetscLogEventRegister("DMPlexJacobianFE",       DM_CLASSID,&DMPLEX_JacobianFEM);CHKERRQ(ierr);
111   ierr = PetscLogEventRegister("DMPlexInterpFE",         DM_CLASSID,&DMPLEX_InterpolatorFEM);CHKERRQ(ierr);
112   ierr = PetscLogEventRegister("DMPlexInjectorFE",       DM_CLASSID,&DMPLEX_InjectorFEM);CHKERRQ(ierr);
113   ierr = PetscLogEventRegister("DMPlexIntegralFEM",      DM_CLASSID,&DMPLEX_IntegralFEM);CHKERRQ(ierr);
114   ierr = PetscLogEventRegister("DMPlexRebalance",        DM_CLASSID,&DMPLEX_RebalanceSharedPoints);CHKERRQ(ierr);
115 
116   ierr = PetscLogEventRegister("DMSwarmMigrate",         DM_CLASSID,&DMSWARM_Migrate);CHKERRQ(ierr);
117   ierr = PetscLogEventRegister("DMSwarmDETSetup",        DM_CLASSID,&DMSWARM_DataExchangerTopologySetup);CHKERRQ(ierr);
118   ierr = PetscLogEventRegister("DMSwarmDExBegin",        DM_CLASSID,&DMSWARM_DataExchangerBegin);CHKERRQ(ierr);
119   ierr = PetscLogEventRegister("DMSwarmDExEnd",          DM_CLASSID,&DMSWARM_DataExchangerEnd);CHKERRQ(ierr);
120   ierr = PetscLogEventRegister("DMSwarmDESendCnt",       DM_CLASSID,&DMSWARM_DataExchangerSendCount);CHKERRQ(ierr);
121   ierr = PetscLogEventRegister("DMSwarmDEPack",          DM_CLASSID,&DMSWARM_DataExchangerPack);CHKERRQ(ierr);
122   ierr = PetscLogEventRegister("DMSwarmAddPnts",         DM_CLASSID,&DMSWARM_AddPoints);CHKERRQ(ierr);
123   ierr = PetscLogEventRegister("DMSwarmRmvPnts",         DM_CLASSID,&DMSWARM_RemovePoints);CHKERRQ(ierr);
124   ierr = PetscLogEventRegister("DMSwarmSort",            DM_CLASSID,&DMSWARM_Sort);CHKERRQ(ierr);
125   ierr = PetscLogEventRegister("DMSwarmSetSizes",        DM_CLASSID,&DMSWARM_SetSizes);CHKERRQ(ierr);
126 
127   /* Process info exclusions */
128   ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
129   if (opt) {
130     ierr = PetscStrInList("dm",logList,',',&pkg);CHKERRQ(ierr);
131     if (pkg) {ierr = PetscInfoDeactivateClass(DM_CLASSID);CHKERRQ(ierr);}
132   }
133 
134   /* Process summary exclusions */
135   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
136   if (opt) {
137     ierr = PetscStrInList("dm",logList,',',&pkg);CHKERRQ(ierr);
138     if (pkg) {ierr = PetscLogEventExcludeClass(DM_CLASSID);CHKERRQ(ierr);}
139   }
140 
141   ierr = DMPlexGenerateRegisterAll();CHKERRQ(ierr);
142   ierr = PetscRegisterFinalize(DMPlexGenerateRegisterDestroy);CHKERRQ(ierr);
143   ierr = PetscRegisterFinalize(DMFinalizePackage);CHKERRQ(ierr);
144   PetscFunctionReturn(0);
145 }
146 #include <petscfe.h>
147 
148 static PetscBool PetscFEPackageInitialized = PETSC_FALSE;
149 /*@C
150   PetscFEFinalizePackage - This function finalizes everything in the PetscFE package. It is called
151   from PetscFinalize().
152 
153   Level: developer
154 
155 .seealso: PetscInitialize()
156 @*/
157 PetscErrorCode PetscFEFinalizePackage(void)
158 {
159   PetscErrorCode ierr;
160 
161   PetscFunctionBegin;
162   ierr = PetscFunctionListDestroy(&PetscSpaceList);CHKERRQ(ierr);
163   ierr = PetscFunctionListDestroy(&PetscDualSpaceList);CHKERRQ(ierr);
164   ierr = PetscFunctionListDestroy(&PetscFEList);CHKERRQ(ierr);
165   PetscFEPackageInitialized       = PETSC_FALSE;
166   PetscSpaceRegisterAllCalled     = PETSC_FALSE;
167   PetscDualSpaceRegisterAllCalled = PETSC_FALSE;
168   PetscFERegisterAllCalled        = PETSC_FALSE;
169   PetscFunctionReturn(0);
170 }
171 
172 /*@C
173   PetscFEInitializePackage - This function initializes everything in the FE package. It is called
174   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscSpaceCreate()
175   when using static libraries.
176 
177   Level: developer
178 
179 .seealso: PetscInitialize()
180 @*/
181 PetscErrorCode PetscFEInitializePackage(void)
182 {
183   char           logList[256];
184   PetscBool      opt,pkg;
185   PetscErrorCode ierr;
186 
187   PetscFunctionBegin;
188   if (PetscFEPackageInitialized) PetscFunctionReturn(0);
189   PetscFEPackageInitialized = PETSC_TRUE;
190 
191   /* Register Classes */
192   ierr = PetscClassIdRegister("Linear Space", &PETSCSPACE_CLASSID);CHKERRQ(ierr);
193   ierr = PetscClassIdRegister("Dual Space",   &PETSCDUALSPACE_CLASSID);CHKERRQ(ierr);
194   ierr = PetscClassIdRegister("FE Space",     &PETSCFE_CLASSID);CHKERRQ(ierr);
195   /* Register Constructors */
196   ierr = PetscSpaceRegisterAll();CHKERRQ(ierr);
197   ierr = PetscDualSpaceRegisterAll();CHKERRQ(ierr);
198   ierr = PetscFERegisterAll();CHKERRQ(ierr);
199   /* Register Events */
200   /* Process info exclusions */
201   ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
202   if (opt) {
203     ierr = PetscStrInList("fe",logList,',',&pkg);CHKERRQ(ierr);
204     if (pkg) {ierr = PetscInfoDeactivateClass(PETSCFE_CLASSID);CHKERRQ(ierr);}
205   }
206   /* Process summary exclusions */
207   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
208   if (opt) {
209     ierr = PetscStrInList("fe",logList,',',&pkg);CHKERRQ(ierr);
210     if (pkg) {ierr = PetscLogEventExcludeClass(PETSCFE_CLASSID);CHKERRQ(ierr);}
211   }
212   /* Register package finalizer */
213   ierr = PetscRegisterFinalize(PetscFEFinalizePackage);CHKERRQ(ierr);
214   PetscFunctionReturn(0);
215 }
216 #include <petscfv.h>
217 
218 static PetscBool PetscFVPackageInitialized = PETSC_FALSE;
219 /*@C
220   PetscFVFinalizePackage - This function finalizes everything in the PetscFV package. It is called
221   from PetscFinalize().
222 
223   Level: developer
224 
225 .seealso: PetscInitialize()
226 @*/
227 PetscErrorCode PetscFVFinalizePackage(void)
228 {
229   PetscErrorCode ierr;
230 
231   PetscFunctionBegin;
232   ierr = PetscFunctionListDestroy(&PetscLimiterList);CHKERRQ(ierr);
233   ierr = PetscFunctionListDestroy(&PetscFVList);CHKERRQ(ierr);
234   PetscFVPackageInitialized     = PETSC_FALSE;
235   PetscFVRegisterAllCalled      = PETSC_FALSE;
236   PetscLimiterRegisterAllCalled = PETSC_FALSE;
237   PetscFunctionReturn(0);
238 }
239 
240 /*@C
241   PetscFVInitializePackage - This function initializes everything in the FV package. It is called
242   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscFVCreate()
243   when using static libraries.
244 
245   Level: developer
246 
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 .seealso: PetscInitialize()
295 @*/
296 PetscErrorCode PetscDSFinalizePackage(void)
297 {
298   PetscErrorCode ierr;
299 
300   PetscFunctionBegin;
301   ierr = PetscFunctionListDestroy(&PetscDSList);CHKERRQ(ierr);
302   PetscDSPackageInitialized = PETSC_FALSE;
303   PetscDSRegisterAllCalled  = PETSC_FALSE;
304   PetscFunctionReturn(0);
305 }
306 
307 /*@C
308   PetscDSInitializePackage - This function initializes everything in the DS package. It is called
309   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscDSCreate()
310   when using static libraries.
311 
312   Level: developer
313 
314 .seealso: PetscInitialize()
315 @*/
316 PetscErrorCode PetscDSInitializePackage(void)
317 {
318   char           logList[256];
319   PetscBool      opt,pkg;
320   PetscErrorCode ierr;
321 
322   PetscFunctionBegin;
323   if (PetscDSPackageInitialized) PetscFunctionReturn(0);
324   PetscDSPackageInitialized = PETSC_TRUE;
325 
326   /* Register Classes */
327   ierr = PetscClassIdRegister("Discrete System", &PETSCDS_CLASSID);CHKERRQ(ierr);
328   /* Register Constructors */
329   ierr = PetscDSRegisterAll();CHKERRQ(ierr);
330   /* Register Events */
331   /* Process info exclusions */
332   ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
333   if (opt) {
334     ierr = PetscStrInList("ds",logList,',',&pkg);CHKERRQ(ierr);
335     if (pkg) {ierr = PetscInfoDeactivateClass(PETSCDS_CLASSID);CHKERRQ(ierr);}
336   }
337   /* Process summary exclusions */
338   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
339   if (opt) {
340     ierr = PetscStrInList("ds",logList,',',&pkg);CHKERRQ(ierr);
341     if (pkg) {ierr = PetscLogEventExcludeClass(PETSCDS_CLASSID);CHKERRQ(ierr);}
342   }
343   /* Register package finalizer */
344   ierr = PetscRegisterFinalize(PetscDSFinalizePackage);CHKERRQ(ierr);
345   PetscFunctionReturn(0);
346 }
347 
348 #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES)
349 /*
350   PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened.
351 
352   This one registers all the mesh generators and partitioners that are in
353   the basic DM library.
354 
355 */
356 PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscdm(void)
357 {
358   PetscErrorCode ierr;
359 
360   PetscFunctionBegin;
361   ierr = AOInitializePackage();CHKERRQ(ierr);
362   ierr = DMInitializePackage();CHKERRQ(ierr);
363   ierr = PetscFEInitializePackage();CHKERRQ(ierr);
364   ierr = PetscFVInitializePackage();CHKERRQ(ierr);
365   ierr = DMFieldInitializePackage();CHKERRQ(ierr);
366   PetscFunctionReturn(0);
367 }
368 
369 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */
370