1 #include <petsc/private/pcimpl.h>
2 #include <petsc/private/pcpatchimpl.h> /* For new events */
3 #include <petsc/private/kspimpl.h>
4
5 static const char *const PCSides_Shifted[] = {"DEFAULT", "LEFT", "RIGHT", "SYMMETRIC", "PCSide", "PC_", NULL};
6 const char *const *const PCSides = PCSides_Shifted + 1;
7 const char *const PCASMTypes[] = {"NONE", "RESTRICT", "INTERPOLATE", "BASIC", "PCASMType", "PC_ASM_", NULL};
8 const char *const PCGASMTypes[] = {"NONE", "RESTRICT", "INTERPOLATE", "BASIC", "PCGASMType", "PC_GASM_", NULL};
9 const char *const PCCompositeTypes[] = {"ADDITIVE", "MULTIPLICATIVE", "SYMMETRIC_MULTIPLICATIVE", "SPECIAL", "SCHUR", "GKB", "PCCompositeType", "PC_COMPOSITE", NULL};
10 const char *const PCPARMSGlobalTypes[] = {"RAS", "SCHUR", "BJ", "PCPARMSGlobalType", "PC_PARMS_", NULL};
11 const char *const PCPARMSLocalTypes[] = {"ILU0", "ILUK", "ILUT", "ARMS", "PCPARMSLocalType", "PC_PARMS_", NULL};
12 const char *const PCPatchConstructTypes[] = {"star", "vanka", "pardecomp", "user", "python", "PCPatchSetConstructType", "PC_PATCH_", NULL};
13
14 const char *const PCFailedReasons_Shifted[] = {"SETUP_ERROR", "FACTOR_NOERROR", "FACTOR_STRUCT_ZEROPIVOT", "FACTOR_NUMERIC_ZEROPIVOT", "FACTOR_OUTMEMORY", "FACTOR_OTHER", "PC_INCONSISTENT_RHS", "SUBPC_ERROR", NULL};
15 const char *const *const PCFailedReasons = PCFailedReasons_Shifted + 1;
16
17 static PetscBool PCPackageInitialized = PETSC_FALSE;
18
19 /*@C
20 PCFinalizePackage - This function destroys everything in the `PC` package. It is
21 called from `PetscFinalize()`.
22
23 Level: developer
24
25 .seealso: [](ch_ksp), `PetscFinalize()`, `PCInitializePackage()`
26 @*/
PCFinalizePackage(void)27 PetscErrorCode PCFinalizePackage(void)
28 {
29 PetscFunctionBegin;
30 PetscCall(PetscFunctionListDestroy(&PCList));
31 PetscCall(PetscFunctionListDestroy(&PCMGCoarseList));
32 PCPackageInitialized = PETSC_FALSE;
33 PCRegisterAllCalled = PETSC_FALSE;
34 PetscFunctionReturn(PETSC_SUCCESS);
35 }
36
37 /*@C
38 PCInitializePackage - This function initializes everything in the `PC` package. It is called
39 from `PetscDLLibraryRegister_petscksp()` when using dynamic libraries, and on the first call to `PCCreate()`
40 when using shared static libraries.
41
42 Level: developer
43
44 .seealso: [](ch_ksp), `PetscInitialize()`, `PCFinalizePackage()`
45 @*/
PCInitializePackage(void)46 PetscErrorCode PCInitializePackage(void)
47 {
48 char logList[256];
49 PetscBool opt, pkg;
50
51 PetscFunctionBegin;
52 if (PCPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS);
53 PCPackageInitialized = PETSC_TRUE;
54 /* Initialize subpackages */
55 PetscCall(PCGAMGInitializePackage());
56 PetscCall(PCBDDCInitializePackage());
57 #if defined(PETSC_HAVE_HPDDM) && defined(PETSC_HAVE_DYNAMIC_LIBRARIES) && defined(PETSC_USE_SHARED_LIBRARIES)
58 PetscCall(PCHPDDMInitializePackage());
59 #endif
60 /* Register Classes */
61 PetscCall(PetscClassIdRegister("Preconditioner", &PC_CLASSID));
62 /* Register Constructors */
63 PetscCall(PCRegisterAll());
64 /* Register Events */
65 PetscCall(PetscLogEventRegister("PCSetUp", PC_CLASSID, &PC_SetUp));
66 PetscCall(PetscLogEventRegister("PCSetUpOnBlocks", PC_CLASSID, &PC_SetUpOnBlocks));
67 PetscCall(PetscLogEventRegister("PCApply", PC_CLASSID, &PC_Apply));
68 PetscCall(PetscLogEventRegister("PCMatApply", PC_CLASSID, &PC_MatApply));
69 PetscCall(PetscLogEventRegister("PCApplyOnBlocks", PC_CLASSID, &PC_ApplyOnBlocks));
70 PetscCall(PetscLogEventRegister("PCApplyCoarse", PC_CLASSID, &PC_ApplyCoarse));
71 PetscCall(PetscLogEventRegister("PCApplySymmLeft", PC_CLASSID, &PC_ApplySymmetricLeft));
72 PetscCall(PetscLogEventRegister("PCApplySymmRight", PC_CLASSID, &PC_ApplySymmetricRight));
73 PetscCall(PetscLogEventRegister("PCModifySubMatri", PC_CLASSID, &PC_ModifySubMatrices));
74
75 PetscCall(PetscLogEventRegister("PCPATCHCreate", PC_CLASSID, &PC_Patch_CreatePatches));
76 PetscCall(PetscLogEventRegister("PCPATCHComputeOp", PC_CLASSID, &PC_Patch_ComputeOp));
77 PetscCall(PetscLogEventRegister("PCPATCHSolve", PC_CLASSID, &PC_Patch_Solve));
78 PetscCall(PetscLogEventRegister("PCPATCHApply", PC_CLASSID, &PC_Patch_Apply));
79 PetscCall(PetscLogEventRegister("PCPATCHPrealloc", PC_CLASSID, &PC_Patch_Prealloc));
80
81 PetscCall(PetscLogEventRegister("KSPSolve_FS_0", KSP_CLASSID, &KSP_Solve_FS_0));
82 PetscCall(PetscLogEventRegister("KSPSolve_FS_1", KSP_CLASSID, &KSP_Solve_FS_1));
83 PetscCall(PetscLogEventRegister("KSPSolve_FS_2", KSP_CLASSID, &KSP_Solve_FS_2));
84 PetscCall(PetscLogEventRegister("KSPSolve_FS_3", KSP_CLASSID, &KSP_Solve_FS_3));
85 PetscCall(PetscLogEventRegister("KSPSolve_FS_4", KSP_CLASSID, &KSP_Solve_FS_4));
86 PetscCall(PetscLogEventRegister("KSPSolve_FS_Schu", KSP_CLASSID, &KSP_Solve_FS_S));
87 PetscCall(PetscLogEventRegister("KSPSolve_FS_Up", KSP_CLASSID, &KSP_Solve_FS_U));
88 PetscCall(PetscLogEventRegister("KSPSolve_FS_Low", KSP_CLASSID, &KSP_Solve_FS_L));
89
90 /* Process Info */
91 {
92 PetscClassId classids[1];
93
94 classids[0] = PC_CLASSID;
95 PetscCall(PetscInfoProcessClass("pc", 1, classids));
96 }
97 /* Process summary exclusions */
98 PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt));
99 if (opt) {
100 PetscCall(PetscStrInList("pc", logList, ',', &pkg));
101 if (pkg) PetscCall(PetscLogEventExcludeClass(PC_CLASSID));
102 }
103 /* Register data */
104 PetscCall(PetscObjectComposedDataRegister(&PetscMGLevelId));
105 /* Register package finalizer */
106 PetscCall(PetscRegisterFinalize(PCFinalizePackage));
107 PetscFunctionReturn(PETSC_SUCCESS);
108 }
109
110 const char *const KSPCGTypes[] = {"SYMMETRIC", "HERMITIAN", "KSPCGType", "KSP_CG_", NULL};
111 const char *const KSPGMRESCGSRefinementTypes[] = {"REFINE_NEVER", "REFINE_IFNEEDED", "REFINE_ALWAYS", "KSPGMRESRefinementType", "KSP_GMRES_CGS_", NULL};
112 const char *const KSPNormTypes_Shifted[] = {"DEFAULT", "NONE", "PRECONDITIONED", "UNPRECONDITIONED", "NATURAL", "KSPNormType", "KSP_NORM_", NULL};
113 const char *const *const KSPNormTypes = KSPNormTypes_Shifted + 1;
114 const char *const KSPConvergedReasons_Shifted[] = {"DIVERGED_USER", "DIVERGED_PC_FAILED", "DIVERGED_INDEFINITE_MAT", "DIVERGED_NANORINF", "DIVERGED_INDEFINITE_PC", "DIVERGED_NONSYMMETRIC", "DIVERGED_BREAKDOWN_BICG", "DIVERGED_BREAKDOWN", "DIVERGED_DTOL", "DIVERGED_ITS", "DIVERGED_NULL", "", "CONVERGED_ITERATING", "CONVERGED_RTOL_NORMAL_EQUATIONS", "CONVERGED_RTOL", "CONVERGED_ATOL", "CONVERGED_ITS", "CONVERGED_NEG_CURVE", "CONVERGED_STEP_LENGTH", "CONVERGED_HAPPY_BREAKDOWN", "CONVERGED_USER", "CONVERGED_ATOL_NORMAL_EQUATIONS", "KSPConvergedReason", "KSP_", NULL};
115 const char *const *KSPConvergedReasons = KSPConvergedReasons_Shifted + 12;
116 const char *const KSPFCDTruncationTypes[] = {"STANDARD", "NOTAY", "KSPFCDTruncationTypes", "KSP_FCD_TRUNC_TYPE_", NULL};
117
118 static PetscBool KSPPackageInitialized = PETSC_FALSE;
119
120 /*@C
121 KSPFinalizePackage - This function destroys everything in the `KSP` package. It is
122 called from `PetscFinalize()`.
123
124 Level: developer
125
126 .seealso: [](ch_ksp), `PetscFinalize()`, `KSPInitializePackage()`
127 @*/
KSPFinalizePackage(void)128 PetscErrorCode KSPFinalizePackage(void)
129 {
130 PetscFunctionBegin;
131 PetscCall(PetscFunctionListDestroy(&KSPList));
132 PetscCall(PetscFunctionListDestroy(&KSPGuessList));
133 PetscCall(PetscFunctionListDestroy(&KSPMonitorList));
134 PetscCall(PetscFunctionListDestroy(&KSPMonitorCreateList));
135 PetscCall(PetscFunctionListDestroy(&KSPMonitorDestroyList));
136 KSPPackageInitialized = PETSC_FALSE;
137 KSPRegisterAllCalled = PETSC_FALSE;
138 KSPMonitorRegisterAllCalled = PETSC_FALSE;
139 PetscFunctionReturn(PETSC_SUCCESS);
140 }
141
142 /*@C
143 KSPInitializePackage - This function initializes everything in the `KSP` package. It is called
144 from `PetscDLLibraryRegister_petscksp()` when using dynamic libraries, and on the first call to `KSPCreate()`
145 when using shared or static libraries.
146
147 Level: developer
148
149 Note:
150 This function never needs to be called by PETSc users.
151
152 .seealso: [](ch_ksp), `PetscInitialize()`, `KSPFinalizePackage()`
153 @*/
KSPInitializePackage(void)154 PetscErrorCode KSPInitializePackage(void)
155 {
156 char logList[256];
157 PetscBool opt, pkg, cls;
158
159 PetscFunctionBegin;
160 if (KSPPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS);
161 KSPPackageInitialized = PETSC_TRUE;
162 /* Register Classes */
163 PetscCall(PetscClassIdRegister("Krylov Solver", &KSP_CLASSID));
164 PetscCall(PetscClassIdRegister("DMKSP interface", &DMKSP_CLASSID));
165 PetscCall(PetscClassIdRegister("KSPGuess interface", &KSPGUESS_CLASSID));
166 /* Register Constructors */
167 PetscCall(KSPRegisterAll());
168 /* Register matrix implementations packaged in KSP */
169 PetscCall(KSPMatRegisterAll());
170 /* Register KSP guesses implementations */
171 PetscCall(KSPGuessRegisterAll());
172 /* Register Monitors */
173 PetscCall(KSPMonitorRegisterAll());
174 /* Register Events */
175 PetscCall(PetscLogEventRegister("KSPSetUp", KSP_CLASSID, &KSP_SetUp));
176 PetscCall(PetscLogEventRegister("KSPSolve", KSP_CLASSID, &KSP_Solve));
177 PetscCall(PetscLogEventRegister("KSPGMRESOrthog", KSP_CLASSID, &KSP_GMRESOrthogonalization));
178 PetscCall(PetscLogEventRegister("KSPSolveTranspos", KSP_CLASSID, &KSP_SolveTranspose));
179 PetscCall(PetscLogEventRegister("KSPMatSolve", KSP_CLASSID, &KSP_MatSolve));
180 PetscCall(PetscLogEventRegister("KSPMatSolveTrans", KSP_CLASSID, &KSP_MatSolveTranspose));
181 /* Process Info */
182 {
183 PetscClassId classids[3];
184
185 classids[0] = KSP_CLASSID;
186 classids[1] = DMKSP_CLASSID;
187 classids[2] = KSPGUESS_CLASSID;
188 PetscCall(PetscInfoProcessClass("ksp", 1, &classids[0]));
189 PetscCall(PetscInfoProcessClass("dm", 1, &classids[1]));
190 PetscCall(PetscInfoProcessClass("kspguess", 1, &classids[2]));
191 }
192 /* Process summary exclusions */
193 PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt));
194 if (opt) {
195 PetscCall(PetscStrInList("ksp", logList, ',', &pkg));
196 if (pkg) PetscCall(PetscLogEventExcludeClass(KSP_CLASSID));
197 PetscCall(PetscStrInList("dm", logList, ',', &cls));
198 if (pkg || cls) PetscCall(PetscLogEventExcludeClass(DMKSP_CLASSID));
199 PetscCall(PetscStrInList("kspguess", logList, ',', &cls));
200 if (pkg || cls) PetscCall(PetscLogEventExcludeClass(KSPGUESS_CLASSID));
201 }
202 /* Register package finalizer */
203 PetscCall(PetscRegisterFinalize(KSPFinalizePackage));
204 PetscFunctionReturn(PETSC_SUCCESS);
205 }
206
207 #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES)
208
209 /*
210 PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened.
211
212 This one registers all the `KSP` and `PC` methods that are in the basic PETSc libpetscksp library.
213 */
PetscDLLibraryRegister_petscksp(void)214 PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscksp(void)
215 {
216 PetscFunctionBegin;
217 PetscCall(PCInitializePackage());
218 PetscCall(KSPInitializePackage());
219 PetscFunctionReturn(PETSC_SUCCESS);
220 }
221
222 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */
223