xref: /petsc/src/dm/interface/dlregisdmdm.c (revision a72f3261c1c8b535bdbc1dff0883b74a7c2113c0)
1 
2 #include <petsc-private/dmdaimpl.h>
3 #include <petsc-private/dmpleximpl.h>
4 
5 static PetscBool DMPackageInitialized = PETSC_FALSE;
6 #undef __FUNCT__
7 #define __FUNCT__ "DMFinalizePackage"
8 /*@C
9   DMFinalizePackage - This function finalizes everything in the DM package. It is called
10   from PetscFinalize().
11 
12   Level: developer
13 
14 .keywords: AO, initialize, package
15 .seealso: PetscInitialize()
16 @*/
17 PetscErrorCode  DMFinalizePackage(void)
18 {
19   PetscErrorCode ierr;
20 
21   PetscFunctionBegin;
22   ierr = PetscFunctionListDestroy(&DMList);CHKERRQ(ierr);
23   DMPackageInitialized = PETSC_FALSE;
24   DMRegisterAllCalled  = PETSC_FALSE;
25   PetscFunctionReturn(0);
26 }
27 
28 #if defined(PETSC_HAVE_HYPRE)
29 PETSC_EXTERN PetscErrorCode MatCreate_HYPREStruct(Mat);
30 #endif
31 
32 #undef __FUNCT__
33 #define __FUNCT__ "DMInitializePackage"
34 /*@C
35   DMInitializePackage - This function initializes everything in the DM package. It is called
36   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to AOCreate()
37   or DMDACreate() when using static libraries.
38 
39   Level: developer
40 
41 .keywords: AO, initialize, package
42 .seealso: PetscInitialize()
43 @*/
44 PetscErrorCode  DMInitializePackage(void)
45 {
46   char           logList[256];
47   char           *className;
48   PetscBool      opt;
49   PetscErrorCode ierr;
50 
51   PetscFunctionBegin;
52   if (DMPackageInitialized) PetscFunctionReturn(0);
53   DMPackageInitialized = PETSC_TRUE;
54 
55   /* Register Classes */
56   ierr = PetscClassIdRegister("Distributed Mesh",&DM_CLASSID);CHKERRQ(ierr);
57 
58 #if defined(PETSC_HAVE_HYPRE)
59   ierr = MatRegister(MATHYPRESTRUCT, MatCreate_HYPREStruct);CHKERRQ(ierr);
60 #endif
61 
62   /* Register Constructors */
63   ierr = DMRegisterAll();CHKERRQ(ierr);
64   /* Register Events */
65   ierr = PetscLogEventRegister("DMConvert",              DM_CLASSID,&DM_Convert);CHKERRQ(ierr);
66   ierr = PetscLogEventRegister("DMGlobalToLocal",        DM_CLASSID,&DM_GlobalToLocal);CHKERRQ(ierr);
67   ierr = PetscLogEventRegister("DMLocalToGlobal",        DM_CLASSID,&DM_LocalToGlobal);CHKERRQ(ierr);
68 
69   ierr = PetscLogEventRegister("DMDALocalADFunc",        DM_CLASSID,&DMDA_LocalADFunction);CHKERRQ(ierr);
70 
71   ierr = PetscLogEventRegister("DMPlexInterpolate",      DM_CLASSID,&DMPLEX_Interpolate);CHKERRQ(ierr);
72   ierr = PetscLogEventRegister("DMPlexPartition",        DM_CLASSID,&DMPLEX_Partition);CHKERRQ(ierr);
73   ierr = PetscLogEventRegister("DMPlexDistribute",       DM_CLASSID,&DMPLEX_Distribute);CHKERRQ(ierr);
74   ierr = PetscLogEventRegister("DMPlexDistributeLabels", DM_CLASSID,&DMPLEX_DistributeLabels);CHKERRQ(ierr);
75   ierr = PetscLogEventRegister("DMPlexDistributeSF",     DM_CLASSID,&DMPLEX_DistributeSF);CHKERRQ(ierr);
76   ierr = PetscLogEventRegister("DMPlexStratify",         DM_CLASSID,&DMPLEX_Stratify);CHKERRQ(ierr);
77   ierr = PetscLogEventRegister("DMPlexPreallocate",      DM_CLASSID,&DMPLEX_Preallocate);CHKERRQ(ierr);
78   ierr = PetscLogEventRegister("DMPlexResidualFEM",      DM_CLASSID,&DMPLEX_ResidualFEM);CHKERRQ(ierr);
79   ierr = PetscLogEventRegister("DMPlexJacobianFEM",      DM_CLASSID,&DMPLEX_JacobianFEM);CHKERRQ(ierr);
80   /* Process info exclusions */
81   ierr = PetscOptionsGetString(NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr);
82   if (opt) {
83     ierr = PetscStrstr(logList, "da", &className);CHKERRQ(ierr);
84     if (className) {
85       ierr = PetscInfoDeactivateClass(DM_CLASSID);CHKERRQ(ierr);
86     }
87   }
88   /* Process summary exclusions */
89   ierr = PetscOptionsGetString(NULL, "-log_summary_exclude", logList, 256, &opt);CHKERRQ(ierr);
90   if (opt) {
91     ierr = PetscStrstr(logList, "da", &className);CHKERRQ(ierr);
92     if (className) {
93       ierr = PetscLogEventDeactivateClass(DM_CLASSID);CHKERRQ(ierr);
94     }
95   }
96   ierr = PetscRegisterFinalize(DMFinalizePackage);CHKERRQ(ierr);
97   PetscFunctionReturn(0);
98 }
99 #include <petscfe.h>
100 
101 static PetscBool PetscFEPackageInitialized = PETSC_FALSE;
102 #undef __FUNCT__
103 #define __FUNCT__ "PetscFEFinalizePackage"
104 /*@C
105   PetscFEFinalizePackage - This function finalizes everything in the PetscFE package. It is called
106   from PetscFinalize().
107 
108   Level: developer
109 
110 .keywords: PetscFE, initialize, package
111 .seealso: PetscInitialize()
112 @*/
113 PetscErrorCode PetscFEFinalizePackage(void)
114 {
115   PetscErrorCode ierr;
116 
117   PetscFunctionBegin;
118   ierr = PetscFunctionListDestroy(&PetscSpaceList);CHKERRQ(ierr);
119   ierr = PetscFunctionListDestroy(&PetscDualSpaceList);CHKERRQ(ierr);
120   ierr = PetscFunctionListDestroy(&PetscFEList);CHKERRQ(ierr);
121   PetscFEPackageInitialized       = PETSC_FALSE;
122   PetscSpaceRegisterAllCalled     = PETSC_FALSE;
123   PetscDualSpaceRegisterAllCalled = PETSC_FALSE;
124   PetscFERegisterAllCalled        = PETSC_FALSE;
125   PetscFunctionReturn(0);
126 }
127 
128 #undef __FUNCT__
129 #define __FUNCT__ "PetscFEInitializePackage"
130 /*@C
131   PetscFEInitializePackage - This function initializes everything in the FE package. It is called
132   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscSpaceCreate()
133   when using static libraries.
134 
135   Level: developer
136 
137 .keywords: PetscFE, initialize, package
138 .seealso: PetscInitialize()
139 @*/
140 PetscErrorCode PetscFEInitializePackage(void)
141 {
142   char           logList[256];
143   char          *className;
144   PetscBool      opt;
145   PetscErrorCode ierr;
146 
147   PetscFunctionBegin;
148   if (PetscFEPackageInitialized) PetscFunctionReturn(0);
149   PetscFEPackageInitialized = PETSC_TRUE;
150 
151   /* Register Classes */
152   ierr = PetscClassIdRegister("Linear Space", &PETSCSPACE_CLASSID);CHKERRQ(ierr);
153   ierr = PetscClassIdRegister("Dual Space",   &PETSCDUALSPACE_CLASSID);CHKERRQ(ierr);
154   ierr = PetscClassIdRegister("FE Space",     &PETSCFE_CLASSID);CHKERRQ(ierr);
155 
156   /* Register Constructors */
157   ierr = PetscSpaceRegisterAll();CHKERRQ(ierr);
158   ierr = PetscDualSpaceRegisterAll();CHKERRQ(ierr);
159   ierr = PetscFERegisterAll();CHKERRQ(ierr);
160   /* Register Events */
161   /* Process info exclusions */
162   ierr = PetscOptionsGetString(NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr);
163   if (opt) {
164     ierr = PetscStrstr(logList, "fe", &className);CHKERRQ(ierr);
165     if (className) {
166       ierr = PetscInfoDeactivateClass(PETSCFE_CLASSID);CHKERRQ(ierr);
167     }
168   }
169   /* Process summary exclusions */
170   ierr = PetscOptionsGetString(NULL, "-log_summary_exclude", logList, 256, &opt);CHKERRQ(ierr);
171   if (opt) {
172     ierr = PetscStrstr(logList, "da", &className);CHKERRQ(ierr);
173     if (className) {
174       ierr = PetscLogEventDeactivateClass(DM_CLASSID);CHKERRQ(ierr);
175     }
176   }
177   ierr = PetscRegisterFinalize(PetscFEFinalizePackage);CHKERRQ(ierr);
178   PetscFunctionReturn(0);
179 }
180 
181 #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES)
182 #undef __FUNCT__
183 #define __FUNCT__ "PetscDLLibraryRegister_petscdm"
184 /*
185   PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened.
186 
187   This one registers all the mesh generators and partitioners that are in
188   the basic DM library.
189 
190 */
191 PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscdm(void)
192 {
193   PetscErrorCode ierr;
194 
195   PetscFunctionBegin;
196   ierr = AOInitializePackage();CHKERRQ(ierr);
197   ierr = DMInitializePackage();CHKERRQ(ierr);
198   ierr = PetscFEInitializePackage();CHKERRQ(ierr);
199   PetscFunctionReturn(0);
200 }
201 
202 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */
203