xref: /petsc/src/dm/interface/dlregisdmdm.c (revision 3338378cc101aa65b47a89f540b98ec4eaa14e3f)
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   /* Process Info */
128   {
129     PetscClassId  classids[1];
130 
131     classids[0] = DM_CLASSID;
132     ierr = PetscInfoProcessClass("dm", 1, classids);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   ierr = PetscLogEventRegister("DualSpaceSetUp", PETSCDUALSPACE_CLASSID, &PETSCDUALSPACE_SetUp);CHKERRQ(ierr);
202   ierr = PetscLogEventRegister("FESetUp",        PETSCFE_CLASSID,        &PETSCFE_SetUp);CHKERRQ(ierr);
203   /* Process Info */
204   {
205     PetscClassId  classids[3];
206 
207     classids[0] = PETSCFE_CLASSID;
208     classids[1] = PETSCSPACE_CLASSID;
209     classids[2] = PETSCDUALSPACE_CLASSID;
210     ierr = PetscInfoProcessClass("fe", 1, classids);CHKERRQ(ierr);
211     ierr = PetscInfoProcessClass("space", 1, &classids[1]);CHKERRQ(ierr);
212     ierr = PetscInfoProcessClass("dualspace", 1, &classids[2]);CHKERRQ(ierr);
213   }
214   /* Process summary exclusions */
215   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
216   if (opt) {
217     ierr = PetscStrInList("fe",logList,',',&pkg);CHKERRQ(ierr);
218     if (pkg) {ierr = PetscLogEventExcludeClass(PETSCFE_CLASSID);CHKERRQ(ierr);}
219   }
220   /* Register package finalizer */
221   ierr = PetscRegisterFinalize(PetscFEFinalizePackage);CHKERRQ(ierr);
222   PetscFunctionReturn(0);
223 }
224 #include <petscfv.h>
225 
226 static PetscBool PetscFVPackageInitialized = PETSC_FALSE;
227 /*@C
228   PetscFVFinalizePackage - This function finalizes everything in the PetscFV package. It is called
229   from PetscFinalize().
230 
231   Level: developer
232 
233 .seealso: PetscInitialize()
234 @*/
235 PetscErrorCode PetscFVFinalizePackage(void)
236 {
237   PetscErrorCode ierr;
238 
239   PetscFunctionBegin;
240   ierr = PetscFunctionListDestroy(&PetscLimiterList);CHKERRQ(ierr);
241   ierr = PetscFunctionListDestroy(&PetscFVList);CHKERRQ(ierr);
242   PetscFVPackageInitialized     = PETSC_FALSE;
243   PetscFVRegisterAllCalled      = PETSC_FALSE;
244   PetscLimiterRegisterAllCalled = PETSC_FALSE;
245   PetscFunctionReturn(0);
246 }
247 
248 /*@C
249   PetscFVInitializePackage - This function initializes everything in the FV package. It is called
250   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscFVCreate()
251   when using static libraries.
252 
253   Level: developer
254 
255 .seealso: PetscInitialize()
256 @*/
257 PetscErrorCode PetscFVInitializePackage(void)
258 {
259   char           logList[256];
260   PetscBool      opt,pkg;
261   PetscErrorCode ierr;
262 
263   PetscFunctionBegin;
264   if (PetscFVPackageInitialized) PetscFunctionReturn(0);
265   PetscFVPackageInitialized = PETSC_TRUE;
266 
267   /* Register Classes */
268   ierr = PetscClassIdRegister("FV Space", &PETSCFV_CLASSID);CHKERRQ(ierr);
269   ierr = PetscClassIdRegister("Limiter",  &PETSCLIMITER_CLASSID);CHKERRQ(ierr);
270   /* Register Constructors */
271   ierr = PetscFVRegisterAll();CHKERRQ(ierr);
272   /* Register Events */
273   /* Process Info */
274   {
275     PetscClassId  classids[2];
276 
277     classids[0] = PETSCFV_CLASSID;
278     classids[1] = PETSCLIMITER_CLASSID;
279     ierr = PetscInfoProcessClass("fv", 1, classids);CHKERRQ(ierr);
280     ierr = PetscInfoProcessClass("limiter", 1, &classids[1]);CHKERRQ(ierr);
281   }
282   /* Process summary exclusions */
283   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
284   if (opt) {
285     ierr = PetscStrInList("fv",logList,',',&pkg);CHKERRQ(ierr);
286     if (pkg) {ierr = PetscLogEventExcludeClass(PETSCFV_CLASSID);CHKERRQ(ierr);}
287     ierr = PetscStrInList("limiter",logList,',',&pkg);CHKERRQ(ierr);
288     if (pkg) {ierr = PetscLogEventExcludeClass(PETSCLIMITER_CLASSID);CHKERRQ(ierr);}
289   }
290   /* Register package finalizer */
291   ierr = PetscRegisterFinalize(PetscFVFinalizePackage);CHKERRQ(ierr);
292   PetscFunctionReturn(0);
293 }
294 #include <petscds.h>
295 
296 static PetscBool PetscDSPackageInitialized = PETSC_FALSE;
297 /*@C
298   PetscDSFinalizePackage - This function finalizes everything in the PetscDS package. It is called
299   from PetscFinalize().
300 
301   Level: developer
302 
303 .seealso: PetscInitialize()
304 @*/
305 PetscErrorCode PetscDSFinalizePackage(void)
306 {
307   PetscErrorCode ierr;
308 
309   PetscFunctionBegin;
310   ierr = PetscFunctionListDestroy(&PetscDSList);CHKERRQ(ierr);
311   PetscDSPackageInitialized = PETSC_FALSE;
312   PetscDSRegisterAllCalled  = PETSC_FALSE;
313   PetscFunctionReturn(0);
314 }
315 
316 /*@C
317   PetscDSInitializePackage - This function initializes everything in the DS package. It is called
318   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscDSCreate()
319   when using static libraries.
320 
321   Level: developer
322 
323 .seealso: PetscInitialize()
324 @*/
325 PetscErrorCode PetscDSInitializePackage(void)
326 {
327   char           logList[256];
328   PetscBool      opt,pkg;
329   PetscErrorCode ierr;
330 
331   PetscFunctionBegin;
332   if (PetscDSPackageInitialized) PetscFunctionReturn(0);
333   PetscDSPackageInitialized = PETSC_TRUE;
334 
335   /* Register Classes */
336   ierr = PetscClassIdRegister("Discrete System", &PETSCDS_CLASSID);CHKERRQ(ierr);
337   /* Register Constructors */
338   ierr = PetscDSRegisterAll();CHKERRQ(ierr);
339   /* Register Events */
340   /* Process Info */
341   {
342     PetscClassId  classids[1];
343 
344     classids[0] = PETSCDS_CLASSID;
345     ierr = PetscInfoProcessClass("ds", 1, classids);CHKERRQ(ierr);
346   }
347   /* Process summary exclusions */
348   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
349   if (opt) {
350     ierr = PetscStrInList("ds",logList,',',&pkg);CHKERRQ(ierr);
351     if (pkg) {ierr = PetscLogEventExcludeClass(PETSCDS_CLASSID);CHKERRQ(ierr);}
352   }
353   /* Register package finalizer */
354   ierr = PetscRegisterFinalize(PetscDSFinalizePackage);CHKERRQ(ierr);
355   PetscFunctionReturn(0);
356 }
357 
358 #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES)
359 /*
360   PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened.
361 
362   This one registers all the mesh generators and partitioners that are in
363   the basic DM library.
364 
365 */
366 PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscdm(void)
367 {
368   PetscErrorCode ierr;
369 
370   PetscFunctionBegin;
371   ierr = AOInitializePackage();CHKERRQ(ierr);
372   ierr = DMInitializePackage();CHKERRQ(ierr);
373   ierr = PetscFEInitializePackage();CHKERRQ(ierr);
374   ierr = PetscFVInitializePackage();CHKERRQ(ierr);
375   ierr = DMFieldInitializePackage();CHKERRQ(ierr);
376   PetscFunctionReturn(0);
377 }
378 
379 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */
380