1 #include <../src/ksp/pc/impls/factor/factor.h> /*I "petscpc.h" I*/
2 #include <petsc/private/matimpl.h>
3
4 /*
5 If an ordering is not yet set and the matrix is available determine a default ordering
6 */
PCFactorSetDefaultOrdering_Factor(PC pc)7 PetscErrorCode PCFactorSetDefaultOrdering_Factor(PC pc)
8 {
9 PetscBool foundmtype, flg, destroy = PETSC_FALSE;
10 const char *prefix;
11
12 PetscFunctionBegin;
13 if (pc->pmat) {
14 PetscCall(PCGetOptionsPrefix(pc, &prefix));
15 PetscCall(MatSetOptionsPrefixFactor(pc->pmat, prefix));
16 PC_Factor *fact = (PC_Factor *)pc->data;
17 PetscCall(MatSolverTypeGet(fact->solvertype, ((PetscObject)pc->pmat)->type_name, fact->factortype, NULL, &foundmtype, NULL));
18 if (foundmtype) {
19 if (!fact->fact) {
20 /* factored matrix is not present at this point, we want to create it during PCSetUp.
21 Since this can be called from setfromoptions, we destroy it when we are done with it */
22 PetscCall(MatGetFactor(pc->pmat, fact->solvertype, fact->factortype, &fact->fact));
23 destroy = PETSC_TRUE;
24 }
25 if (!fact->fact) PetscFunctionReturn(PETSC_SUCCESS);
26 if (!fact->fact->assembled) {
27 PetscCall(PetscStrcmp(fact->solvertype, fact->fact->solvertype, &flg));
28 if (!flg) {
29 Mat B;
30 PetscCall(MatGetFactor(pc->pmat, fact->solvertype, fact->factortype, &B));
31 PetscCall(MatHeaderReplace(fact->fact, &B));
32 }
33 }
34 if (!fact->ordering) {
35 PetscBool canuseordering;
36 MatOrderingType otype;
37
38 PetscCall(MatFactorGetCanUseOrdering(fact->fact, &canuseordering));
39 if (canuseordering) PetscCall(MatFactorGetPreferredOrdering(fact->fact, fact->factortype, &otype));
40 else otype = MATORDERINGEXTERNAL;
41 PetscCall(PetscStrallocpy(otype, (char **)&fact->ordering));
42 }
43 if (destroy) PetscCall(MatDestroy(&fact->fact));
44 }
45 }
46 PetscFunctionReturn(PETSC_SUCCESS);
47 }
48
PCFactorSetReuseOrdering_Factor(PC pc,PetscBool flag)49 static PetscErrorCode PCFactorSetReuseOrdering_Factor(PC pc, PetscBool flag)
50 {
51 PC_Factor *lu = (PC_Factor *)pc->data;
52
53 PetscFunctionBegin;
54 lu->reuseordering = flag;
55 PetscFunctionReturn(PETSC_SUCCESS);
56 }
57
PCFactorSetReuseFill_Factor(PC pc,PetscBool flag)58 static PetscErrorCode PCFactorSetReuseFill_Factor(PC pc, PetscBool flag)
59 {
60 PC_Factor *lu = (PC_Factor *)pc->data;
61
62 PetscFunctionBegin;
63 lu->reusefill = flag;
64 PetscFunctionReturn(PETSC_SUCCESS);
65 }
66
PCFactorSetUseInPlace_Factor(PC pc,PetscBool flg)67 static PetscErrorCode PCFactorSetUseInPlace_Factor(PC pc, PetscBool flg)
68 {
69 PC_Factor *dir = (PC_Factor *)pc->data;
70
71 PetscFunctionBegin;
72 dir->inplace = flg;
73 PetscFunctionReturn(PETSC_SUCCESS);
74 }
75
PCFactorGetUseInPlace_Factor(PC pc,PetscBool * flg)76 static PetscErrorCode PCFactorGetUseInPlace_Factor(PC pc, PetscBool *flg)
77 {
78 PC_Factor *dir = (PC_Factor *)pc->data;
79
80 PetscFunctionBegin;
81 *flg = dir->inplace;
82 PetscFunctionReturn(PETSC_SUCCESS);
83 }
84
85 /*@
86 PCFactorSetUpMatSolverType - Can be called after `KSPSetOperators()` or `PCSetOperators()`, causes `MatGetFactor()` to be called so then one may
87 set the options for that particular factorization object.
88
89 Input Parameter:
90 . pc - the preconditioner context
91
92 Level: intermediate
93
94 Note:
95 After you have called this function (which has to be after the `KSPSetOperators()` or `PCSetOperators()`) you can call `PCFactorGetMatrix()` and then set factor options on that matrix.
96 This function raises an error if the requested combination of solver package and matrix type is not supported.
97
98 Developer Note:
99 This function should have a name that clearly indicates that this calls `MatGetFactor()` and thus populates the `->factor` field. The `MatSetSolverType` portion of the name
100 may not add value to the clarity of the purpose of the function and could be removed.
101
102 .seealso: [](ch_ksp), `PCCHOLESKY`, `PCLU`, `PCFactorSetMatSolverType()`, `PCFactorGetMatrix()`
103 @*/
PCFactorSetUpMatSolverType(PC pc)104 PetscErrorCode PCFactorSetUpMatSolverType(PC pc)
105 {
106 PetscFunctionBegin;
107 PetscValidHeaderSpecific(pc, PC_CLASSID, 1);
108 PetscTryMethod(pc, "PCFactorSetUpMatSolverType_C", (PC), (pc));
109 PetscFunctionReturn(PETSC_SUCCESS);
110 }
111
112 /*@
113 PCFactorSetZeroPivot - Sets the size at which smaller pivots are declared to be zero
114
115 Logically Collective
116
117 Input Parameters:
118 + pc - the preconditioner context
119 - zero - all pivots smaller than this will be considered zero
120
121 Options Database Key:
122 . -pc_factor_zeropivot <zero> - Sets tolerance for what is considered a zero pivot
123
124 Level: intermediate
125
126 .seealso: [](ch_ksp), `PCCHOLESKY`, `PCLU`, `PCFactorSetShiftType()`, `PCFactorSetShiftAmount()`
127 @*/
PCFactorSetZeroPivot(PC pc,PetscReal zero)128 PetscErrorCode PCFactorSetZeroPivot(PC pc, PetscReal zero)
129 {
130 PetscFunctionBegin;
131 PetscValidHeaderSpecific(pc, PC_CLASSID, 1);
132 PetscValidLogicalCollectiveReal(pc, zero, 2);
133 PetscTryMethod(pc, "PCFactorSetZeroPivot_C", (PC, PetscReal), (pc, zero));
134 PetscFunctionReturn(PETSC_SUCCESS);
135 }
136
137 /*@
138 PCFactorSetShiftType - adds a particular type of quantity to the diagonal of the matrix during
139 numerical factorization, thus the matrix has nonzero pivots
140
141 Logically Collective
142
143 Input Parameters:
144 + pc - the preconditioner context
145 - shifttype - type of shift; one of `MAT_SHIFT_NONE`, `MAT_SHIFT_NONZERO`, `MAT_SHIFT_POSITIVE_DEFINITE`, `MAT_SHIFT_INBLOCKS`
146
147 Options Database Key:
148 . -pc_factor_shift_type <shifttype> - Sets shift type; use '-help' for a list of available types
149
150 Level: intermediate
151
152 .seealso: [](ch_ksp), `PCCHOLESKY`, `PCLU`, `PCFactorSetZeroPivot()`, `PCFactorSetShiftAmount()`
153 @*/
PCFactorSetShiftType(PC pc,MatFactorShiftType shifttype)154 PetscErrorCode PCFactorSetShiftType(PC pc, MatFactorShiftType shifttype)
155 {
156 PetscFunctionBegin;
157 PetscValidHeaderSpecific(pc, PC_CLASSID, 1);
158 PetscValidLogicalCollectiveEnum(pc, shifttype, 2);
159 PetscTryMethod(pc, "PCFactorSetShiftType_C", (PC, MatFactorShiftType), (pc, shifttype));
160 PetscFunctionReturn(PETSC_SUCCESS);
161 }
162
163 /*@
164 PCFactorSetShiftAmount - adds a quantity to the diagonal of the matrix during
165 numerical factorization, thus the matrix has nonzero pivots
166
167 Logically Collective
168
169 Input Parameters:
170 + pc - the preconditioner context
171 - shiftamount - amount of shift or `PETSC_DECIDE` for the default
172
173 Options Database Key:
174 . -pc_factor_shift_amount <shiftamount> - Sets shift amount or -1 for the default
175
176 Level: intermediate
177
178 .seealso: [](ch_ksp), `PCCHOLESKY`, `PCLU`, `PCFactorSetZeroPivot()`, `PCFactorSetShiftType()`
179 @*/
PCFactorSetShiftAmount(PC pc,PetscReal shiftamount)180 PetscErrorCode PCFactorSetShiftAmount(PC pc, PetscReal shiftamount)
181 {
182 PetscFunctionBegin;
183 PetscValidHeaderSpecific(pc, PC_CLASSID, 1);
184 PetscValidLogicalCollectiveReal(pc, shiftamount, 2);
185 PetscTryMethod(pc, "PCFactorSetShiftAmount_C", (PC, PetscReal), (pc, shiftamount));
186 PetscFunctionReturn(PETSC_SUCCESS);
187 }
188
189 /*@
190 PCFactorSetDropTolerance - The preconditioner will use an `PCILU`
191 based on a drop tolerance.
192
193 Logically Collective
194
195 Input Parameters:
196 + pc - the preconditioner context
197 . dt - the drop tolerance, try from 1.e-10 to .1
198 . dtcol - tolerance for column pivot, good values [0.1 to 0.01]
199 - maxrowcount - the max number of nonzeros allowed in a row, best value
200 depends on the number of nonzeros in row of original matrix
201
202 Options Database Key:
203 . -pc_factor_drop_tolerance <dt,dtcol,maxrowcount> - Sets drop tolerance
204
205 Level: intermediate
206
207 Note:
208 There are NO default values for the 3 parameters, you must set them with reasonable values for your
209 matrix. We don't know how to compute reasonable values.
210
211 .seealso: [](ch_ksp), `PCILU`
212 @*/
PCFactorSetDropTolerance(PC pc,PetscReal dt,PetscReal dtcol,PetscInt maxrowcount)213 PetscErrorCode PCFactorSetDropTolerance(PC pc, PetscReal dt, PetscReal dtcol, PetscInt maxrowcount)
214 {
215 PetscFunctionBegin;
216 PetscValidHeaderSpecific(pc, PC_CLASSID, 1);
217 PetscValidLogicalCollectiveReal(pc, dtcol, 3);
218 PetscValidLogicalCollectiveInt(pc, maxrowcount, 4);
219 PetscTryMethod(pc, "PCFactorSetDropTolerance_C", (PC, PetscReal, PetscReal, PetscInt), (pc, dt, dtcol, maxrowcount));
220 PetscFunctionReturn(PETSC_SUCCESS);
221 }
222
223 /*@
224 PCFactorGetZeroPivot - Gets the tolerance used to define a zero privot
225
226 Not Collective
227
228 Input Parameter:
229 . pc - the preconditioner context
230
231 Output Parameter:
232 . pivot - the tolerance
233
234 Level: intermediate
235
236 .seealso: [](ch_ksp), `PCLU`, `PCCHOLESKY`, `PCFactorSetZeroPivot()`
237 @*/
PCFactorGetZeroPivot(PC pc,PetscReal * pivot)238 PetscErrorCode PCFactorGetZeroPivot(PC pc, PetscReal *pivot)
239 {
240 PetscFunctionBegin;
241 PetscValidHeaderSpecific(pc, PC_CLASSID, 1);
242 PetscUseMethod(pc, "PCFactorGetZeroPivot_C", (PC, PetscReal *), (pc, pivot));
243 PetscFunctionReturn(PETSC_SUCCESS);
244 }
245
246 /*@
247 PCFactorGetShiftAmount - Gets the tolerance used to define a zero privot
248
249 Not Collective
250
251 Input Parameter:
252 . pc - the preconditioner context
253
254 Output Parameter:
255 . shift - how much to shift the diagonal entry
256
257 Level: intermediate
258
259 .seealso: [](ch_ksp), `PCLU`, `PCCHOLESKY`, `PCFactorSetShiftAmount()`, `PCFactorSetShiftType()`, `PCFactorGetShiftType()`
260 @*/
PCFactorGetShiftAmount(PC pc,PetscReal * shift)261 PetscErrorCode PCFactorGetShiftAmount(PC pc, PetscReal *shift)
262 {
263 PetscFunctionBegin;
264 PetscValidHeaderSpecific(pc, PC_CLASSID, 1);
265 PetscUseMethod(pc, "PCFactorGetShiftAmount_C", (PC, PetscReal *), (pc, shift));
266 PetscFunctionReturn(PETSC_SUCCESS);
267 }
268
269 /*@
270 PCFactorGetShiftType - Gets the type of shift, if any, done when a zero pivot is detected
271
272 Not Collective
273
274 Input Parameter:
275 . pc - the preconditioner context
276
277 Output Parameter:
278 . type - one of `MAT_SHIFT_NONE`, `MAT_SHIFT_NONZERO`, `MAT_SHIFT_POSITIVE_DEFINITE`, or `MAT_SHIFT_INBLOCKS`
279
280 Level: intermediate
281
282 .seealso: [](ch_ksp), `PCLU`, `PCCHOLESKY`, `PCFactorSetShiftType()`, `MatFactorShiftType`, `PCFactorSetShiftAmount()`, `PCFactorGetShiftAmount()`
283 @*/
PCFactorGetShiftType(PC pc,MatFactorShiftType * type)284 PetscErrorCode PCFactorGetShiftType(PC pc, MatFactorShiftType *type)
285 {
286 PetscFunctionBegin;
287 PetscValidHeaderSpecific(pc, PC_CLASSID, 1);
288 PetscUseMethod(pc, "PCFactorGetShiftType_C", (PC, MatFactorShiftType *), (pc, type));
289 PetscFunctionReturn(PETSC_SUCCESS);
290 }
291
292 /*@
293 PCFactorGetLevels - Gets the number of levels of fill to use.
294
295 Logically Collective
296
297 Input Parameter:
298 . pc - the preconditioner context
299
300 Output Parameter:
301 . levels - number of levels of fill
302
303 Level: intermediate
304
305 .seealso: [](ch_ksp), `PCILU`, `PCICC`, `PCFactorSetLevels()`
306 @*/
PCFactorGetLevels(PC pc,PetscInt * levels)307 PetscErrorCode PCFactorGetLevels(PC pc, PetscInt *levels)
308 {
309 PetscFunctionBegin;
310 PetscValidHeaderSpecific(pc, PC_CLASSID, 1);
311 PetscUseMethod(pc, "PCFactorGetLevels_C", (PC, PetscInt *), (pc, levels));
312 PetscFunctionReturn(PETSC_SUCCESS);
313 }
314
315 /*@
316 PCFactorSetLevels - Sets the number of levels of fill to use.
317
318 Logically Collective
319
320 Input Parameters:
321 + pc - the preconditioner context
322 - levels - number of levels of fill
323
324 Options Database Key:
325 . -pc_factor_levels <levels> - Sets fill level
326
327 Level: intermediate
328
329 .seealso: [](ch_ksp), `PCILU`, `PCICC`, `PCFactorGetLevels()`
330 @*/
PCFactorSetLevels(PC pc,PetscInt levels)331 PetscErrorCode PCFactorSetLevels(PC pc, PetscInt levels)
332 {
333 PetscFunctionBegin;
334 PetscValidHeaderSpecific(pc, PC_CLASSID, 1);
335 PetscCheck(levels >= 0, PetscObjectComm((PetscObject)pc), PETSC_ERR_ARG_OUTOFRANGE, "negative levels");
336 PetscValidLogicalCollectiveInt(pc, levels, 2);
337 PetscTryMethod(pc, "PCFactorSetLevels_C", (PC, PetscInt), (pc, levels));
338 PetscFunctionReturn(PETSC_SUCCESS);
339 }
340
341 /*@
342 PCFactorSetAllowDiagonalFill - Causes all diagonal matrix entries to be
343 treated as level 0 fill even if there is no non-zero location.
344
345 Logically Collective
346
347 Input Parameters:
348 + pc - the preconditioner context
349 - flg - `PETSC_TRUE` to turn on, `PETSC_FALSE` to turn off
350
351 Options Database Key:
352 . -pc_factor_diagonal_fill <bool> - allow the diagonal fill
353
354 Note:
355 Does not apply with 0 fill.
356
357 Level: intermediate
358
359 .seealso: [](ch_ksp), `PCILU`, `PCICC`, `PCFactorGetAllowDiagonalFill()`
360 @*/
PCFactorSetAllowDiagonalFill(PC pc,PetscBool flg)361 PetscErrorCode PCFactorSetAllowDiagonalFill(PC pc, PetscBool flg)
362 {
363 PetscFunctionBegin;
364 PetscValidHeaderSpecific(pc, PC_CLASSID, 1);
365 PetscTryMethod(pc, "PCFactorSetAllowDiagonalFill_C", (PC, PetscBool), (pc, flg));
366 PetscFunctionReturn(PETSC_SUCCESS);
367 }
368
369 /*@
370 PCFactorGetAllowDiagonalFill - Determines if all diagonal matrix entries are
371 treated as level 0 fill even if there is no non-zero location.
372
373 Logically Collective
374
375 Input Parameter:
376 . pc - the preconditioner context
377
378 Output Parameter:
379 . flg - `PETSC_TRUE` to turn on, `PETSC_FALSE` to turn off
380
381 Note:
382 Does not apply with 0 fill.
383
384 Level: intermediate
385
386 .seealso: [](ch_ksp), `PCILU`, `PCICC`, `PCFactorSetAllowDiagonalFill()`
387 @*/
PCFactorGetAllowDiagonalFill(PC pc,PetscBool * flg)388 PetscErrorCode PCFactorGetAllowDiagonalFill(PC pc, PetscBool *flg)
389 {
390 PetscFunctionBegin;
391 PetscValidHeaderSpecific(pc, PC_CLASSID, 1);
392 PetscUseMethod(pc, "PCFactorGetAllowDiagonalFill_C", (PC, PetscBool *), (pc, flg));
393 PetscFunctionReturn(PETSC_SUCCESS);
394 }
395
396 /*@
397 PCFactorReorderForNonzeroDiagonal - reorders rows/columns of matrix to remove zeros from diagonal
398
399 Logically Collective
400
401 Input Parameters:
402 + pc - the preconditioner context
403 - rtol - diagonal entries smaller than this in absolute value are considered zero
404
405 Options Database Key:
406 . -pc_factor_nonzeros_along_diagonal <tol> - perform the reordering with the given tolerance
407
408 Level: intermediate
409
410 .seealso: [](ch_ksp), `PCILU`, `PCICC`, `PCFactorSetFill()`, `PCFactorSetShiftAmount()`, `PCFactorSetZeroPivot()`, `MatReorderForNonzeroDiagonal()`
411 @*/
PCFactorReorderForNonzeroDiagonal(PC pc,PetscReal rtol)412 PetscErrorCode PCFactorReorderForNonzeroDiagonal(PC pc, PetscReal rtol)
413 {
414 PetscFunctionBegin;
415 PetscValidHeaderSpecific(pc, PC_CLASSID, 1);
416 PetscValidLogicalCollectiveReal(pc, rtol, 2);
417 PetscTryMethod(pc, "PCFactorReorderForNonzeroDiagonal_C", (PC, PetscReal), (pc, rtol));
418 PetscFunctionReturn(PETSC_SUCCESS);
419 }
420
421 /*@
422 PCFactorSetMatSolverType - sets the solver package that is used to perform the factorization
423
424 Logically Collective
425
426 Input Parameters:
427 + pc - the preconditioner context
428 - stype - for example, `MATSOLVERSUPERLU`, `MATSOLVERSUPERLU_DIST`, `MATSOLVERMUMPS`
429
430 Options Database Key:
431 . -pc_factor_mat_solver_type <stype> - petsc, superlu, superlu_dist, mumps, cusparse
432
433 Level: intermediate
434
435 Note:
436 The default type is set by searching for available types based on the order of the calls to `MatSolverTypeRegister()` in `MatInitializePackage()`.
437 Since different PETSc configurations may have different external solvers, seemingly identical runs with different PETSc configurations may use a different solver.
438 For example if one configuration had --download-mumps while a different one had --download-superlu_dist.
439
440 .seealso: [](ch_ksp), `PCLU`, `PCCHOLESKY`, `MatGetFactor()`, `MatSolverType`, `PCFactorGetMatSolverType()`, `MatSolverTypeRegister()`,
441 `MatInitializePackage()`, `MATSOLVERSUPERLU`, `MATSOLVERSUPERLU_DIST`, `MATSOLVERMUMPS`, `MatSolverTypeGet()`
442 @*/
PCFactorSetMatSolverType(PC pc,MatSolverType stype)443 PetscErrorCode PCFactorSetMatSolverType(PC pc, MatSolverType stype)
444 {
445 PetscFunctionBegin;
446 PetscValidHeaderSpecific(pc, PC_CLASSID, 1);
447 PetscTryMethod(pc, "PCFactorSetMatSolverType_C", (PC, MatSolverType), (pc, stype));
448 PetscFunctionReturn(PETSC_SUCCESS);
449 }
450
451 /*@
452 PCFactorGetMatSolverType - gets the solver package that is used to perform the factorization
453
454 Not Collective
455
456 Input Parameter:
457 . pc - the preconditioner context
458
459 Output Parameter:
460 . stype - for example, `MATSOLVERSUPERLU`, `MATSOLVERSUPERLU_DIST`, `MATSOLVERMUMPS`
461
462 Level: intermediate
463
464 .seealso: [](ch_ksp), `PCLU`, `PCCHOLESKY`, `MatGetFactor()`, `MatSolverType`, `MATSOLVERSUPERLU`,
465 `MATSOLVERSUPERLU_DIST`, `MATSOLVERMUMPS`
466 @*/
PCFactorGetMatSolverType(PC pc,MatSolverType * stype)467 PetscErrorCode PCFactorGetMatSolverType(PC pc, MatSolverType *stype)
468 {
469 PetscErrorCode (*f)(PC, MatSolverType *);
470
471 PetscFunctionBegin;
472 PetscValidHeaderSpecific(pc, PC_CLASSID, 1);
473 PetscAssertPointer(stype, 2);
474 PetscCall(PetscObjectQueryFunction((PetscObject)pc, "PCFactorGetMatSolverType_C", &f));
475 if (f) PetscCall((*f)(pc, stype));
476 else *stype = NULL;
477 PetscFunctionReturn(PETSC_SUCCESS);
478 }
479
480 /*@
481 PCFactorSetFill - Indicate the amount of fill you expect in the factored matrix,
482 fill = number nonzeros in factor/number nonzeros in original matrix.
483
484 Not Collective, each process can expect a different amount of fill
485
486 Input Parameters:
487 + pc - the preconditioner context
488 - fill - amount of expected fill
489
490 Options Database Key:
491 . -pc_factor_fill <fill> - Sets fill amount
492
493 Level: intermediate
494
495 Notes:
496 For sparse matrix factorizations it is difficult to predict how much
497 fill to expect. By running with the option -info PETSc will print the
498 actual amount of fill used; allowing you to set the value accurately for
499 future runs. Default PETSc uses a value of 5.0
500
501 This is ignored for most solver packages
502
503 This parameter has NOTHING to do with the levels-of-fill of ILU(). That is set with `PCFactorSetLevels()` or -pc_factor_levels.
504
505 .seealso: [](ch_ksp), `PCLU`, `PCCHOLESKY`, `PCILU`, `PCICC`, `PCFactorSetReuseFill()`
506 @*/
PCFactorSetFill(PC pc,PetscReal fill)507 PetscErrorCode PCFactorSetFill(PC pc, PetscReal fill)
508 {
509 PetscFunctionBegin;
510 PetscValidHeaderSpecific(pc, PC_CLASSID, 1);
511 PetscCheck(fill >= 1.0, PetscObjectComm((PetscObject)pc), PETSC_ERR_ARG_OUTOFRANGE, "Fill factor cannot be less than 1.0");
512 PetscTryMethod(pc, "PCFactorSetFill_C", (PC, PetscReal), (pc, fill));
513 PetscFunctionReturn(PETSC_SUCCESS);
514 }
515
516 /*@
517 PCFactorSetUseInPlace - Tells the preconditioner to do an in-place factorization.
518
519 Logically Collective
520
521 Input Parameters:
522 + pc - the preconditioner context
523 - flg - `PETSC_TRUE` to enable, `PETSC_FALSE` to disable
524
525 Options Database Key:
526 . -pc_factor_in_place <true,false> - Activate/deactivate in-place factorization
527
528 Note:
529 For dense matrices, this enables the solution of much larger problems.
530 For sparse matrices the factorization cannot be done truly in-place
531 so this does not save memory during the factorization, but after the matrix
532 is factored, the original unfactored matrix is freed, thus recovering that
533 space. For ICC(0) and ILU(0) with the default natural ordering the factorization is done efficiently in-place.
534
535 `PCFactorSetUseInplace()` can only be used with the `KSP` method `KSPPREONLY` or when
536 a different matrix is provided for the multiply and the preconditioner in
537 a call to `KSPSetOperators()`.
538 This is because the Krylov space methods require an application of the
539 matrix multiplication, which is not possible here because the matrix has
540 been factored in-place, replacing the original matrix.
541
542 Level: intermediate
543
544 .seealso: [](ch_ksp), `PC`, `Mat`, `PCLU`, `PCCHOLESKY`, `PCILU`, `PCICC`, `PCFactorGetUseInPlace()`
545 @*/
PCFactorSetUseInPlace(PC pc,PetscBool flg)546 PetscErrorCode PCFactorSetUseInPlace(PC pc, PetscBool flg)
547 {
548 PetscFunctionBegin;
549 PetscValidHeaderSpecific(pc, PC_CLASSID, 1);
550 PetscTryMethod(pc, "PCFactorSetUseInPlace_C", (PC, PetscBool), (pc, flg));
551 PetscFunctionReturn(PETSC_SUCCESS);
552 }
553
554 /*@
555 PCFactorGetUseInPlace - Determines if an in-place factorization is being used.
556
557 Logically Collective
558
559 Input Parameter:
560 . pc - the preconditioner context
561
562 Output Parameter:
563 . flg - `PETSC_TRUE` to enable, `PETSC_FALSE` to disable
564
565 Level: intermediate
566
567 .seealso: [](ch_ksp), `PCLU`, `PCCHOLESKY`, `PCILU`, `PCICC`, `PCFactorSetUseInPlace()`
568 @*/
PCFactorGetUseInPlace(PC pc,PetscBool * flg)569 PetscErrorCode PCFactorGetUseInPlace(PC pc, PetscBool *flg)
570 {
571 PetscFunctionBegin;
572 PetscValidHeaderSpecific(pc, PC_CLASSID, 1);
573 PetscUseMethod(pc, "PCFactorGetUseInPlace_C", (PC, PetscBool *), (pc, flg));
574 PetscFunctionReturn(PETSC_SUCCESS);
575 }
576
577 /*@
578 PCFactorSetMatOrderingType - Sets the ordering routine (to reduce fill) to
579 be used in the `PCLU`, `PCCHOLESKY`, `PCILU`, or `PCICC` preconditioners
580
581 Logically Collective
582
583 Input Parameters:
584 + pc - the preconditioner context
585 - ordering - the matrix ordering name, for example, `MATORDERINGND` or `MATORDERINGRCM`
586
587 Options Database Key:
588 . -pc_factor_mat_ordering_type <nd,rcm,...,external> - Sets ordering routine
589
590 Level: intermediate
591
592 Notes:
593 Nested dissection is used by default for some of PETSc's sparse matrix formats
594
595 For `PCCHOLESKY` and `PCICC` and the `MATSBAIJ` format the only reordering available is natural since only the upper half of the matrix is stored
596 and reordering this matrix is very expensive.
597
598 You can use a `MATSEQAIJ` matrix with Cholesky and ICC and use any ordering.
599
600 `MATORDERINGEXTERNAL` means PETSc will not compute an ordering and the package will use its own ordering, usable with `MATSOLVERCHOLMOD`, `MATSOLVERUMFPACK`, and others.
601
602 .seealso: [](ch_ksp), `PCLU`, `PCCHOLESKY`, `PCILU`, `PCICC`, `MatOrderingType`, `MATORDERINGEXTERNAL`, `MATORDERINGND`, `MATORDERINGRCM`
603 @*/
PCFactorSetMatOrderingType(PC pc,MatOrderingType ordering)604 PetscErrorCode PCFactorSetMatOrderingType(PC pc, MatOrderingType ordering)
605 {
606 PetscFunctionBegin;
607 PetscValidHeaderSpecific(pc, PC_CLASSID, 1);
608 PetscTryMethod(pc, "PCFactorSetMatOrderingType_C", (PC, MatOrderingType), (pc, ordering));
609 PetscFunctionReturn(PETSC_SUCCESS);
610 }
611
612 /*@
613 PCFactorSetColumnPivot - Determines when column pivoting is done during matrix factorization.
614 For PETSc dense matrices column pivoting is always done, for PETSc sparse matrices
615 it is never done. For the MATLAB and `MATSOLVERSUPERLU` factorization this is used.
616
617 Logically Collective
618
619 Input Parameters:
620 + pc - the preconditioner context
621 - dtcol - 0.0 implies no pivoting, 1.0 complete pivoting (slower, requires more memory but more stable)
622
623 Options Database Key:
624 . -pc_factor_pivoting <dtcol> - perform the pivoting with the given tolerance
625
626 Level: intermediate
627
628 .seealso: [](ch_ksp), `PCLU`, `PCCHOLESKY`, `PCILU`, `PCICC`, `PCILUSetMatOrdering()`, `PCFactorSetPivotInBlocks()`
629 @*/
PCFactorSetColumnPivot(PC pc,PetscReal dtcol)630 PetscErrorCode PCFactorSetColumnPivot(PC pc, PetscReal dtcol)
631 {
632 PetscFunctionBegin;
633 PetscValidHeaderSpecific(pc, PC_CLASSID, 1);
634 PetscValidLogicalCollectiveReal(pc, dtcol, 2);
635 PetscTryMethod(pc, "PCFactorSetColumnPivot_C", (PC, PetscReal), (pc, dtcol));
636 PetscFunctionReturn(PETSC_SUCCESS);
637 }
638
639 /*@
640 PCFactorSetPivotInBlocks - Determines if pivoting is done while factoring each block
641 with `MATBAIJ` or `MATSBAIJ` matrices
642
643 Logically Collective
644
645 Input Parameters:
646 + pc - the preconditioner context
647 - pivot - `PETSC_TRUE` or `PETSC_FALSE`
648
649 Options Database Key:
650 . -pc_factor_pivot_in_blocks <true,false> - Pivot inside matrix dense blocks for `MATBAIJ` and `MATSBAIJ`
651
652 Level: intermediate
653
654 .seealso: [](ch_ksp), `PCLU`, `PCCHOLESKY`, `PCILU`, `PCICC`, `PCILUSetMatOrdering()`, `PCFactorSetColumnPivot()`
655 @*/
PCFactorSetPivotInBlocks(PC pc,PetscBool pivot)656 PetscErrorCode PCFactorSetPivotInBlocks(PC pc, PetscBool pivot)
657 {
658 PetscFunctionBegin;
659 PetscValidHeaderSpecific(pc, PC_CLASSID, 1);
660 PetscValidLogicalCollectiveBool(pc, pivot, 2);
661 PetscTryMethod(pc, "PCFactorSetPivotInBlocks_C", (PC, PetscBool), (pc, pivot));
662 PetscFunctionReturn(PETSC_SUCCESS);
663 }
664
665 /*@
666 PCFactorSetReuseFill - When matrices with different nonzero structure are factored,
667 this causes later ones to use the fill ratio computed in the initial factorization.
668
669 Logically Collective
670
671 Input Parameters:
672 + pc - the preconditioner context
673 - flag - `PETSC_TRUE` to reuse else `PETSC_FALSE`
674
675 Options Database Key:
676 . -pc_factor_reuse_fill - Activates `PCFactorSetReuseFill()`
677
678 Level: intermediate
679
680 .seealso: [](ch_ksp), `PCLU`, `PCCHOLESKY`, `PCILU`, `PCICC`, `PCFactorSetReuseOrdering()`, `PCFactorSetFill()`
681 @*/
PCFactorSetReuseFill(PC pc,PetscBool flag)682 PetscErrorCode PCFactorSetReuseFill(PC pc, PetscBool flag)
683 {
684 PetscFunctionBegin;
685 PetscValidHeaderSpecific(pc, PC_CLASSID, 1);
686 PetscValidLogicalCollectiveBool(pc, flag, 2);
687 PetscTryMethod(pc, "PCFactorSetReuseFill_C", (PC, PetscBool), (pc, flag));
688 PetscFunctionReturn(PETSC_SUCCESS);
689 }
690
PCFactorInitialize(PC pc,MatFactorType ftype)691 PetscErrorCode PCFactorInitialize(PC pc, MatFactorType ftype)
692 {
693 PC_Factor *fact = (PC_Factor *)pc->data;
694
695 PetscFunctionBegin;
696 PetscCall(MatFactorInfoInitialize(&fact->info));
697 fact->factortype = ftype;
698 fact->info.shifttype = (PetscReal)MAT_SHIFT_NONE;
699 fact->info.shiftamount = 100.0 * PETSC_MACHINE_EPSILON;
700 fact->info.zeropivot = 100.0 * PETSC_MACHINE_EPSILON;
701 fact->info.pivotinblocks = 1.0;
702 pc->ops->getfactoredmatrix = PCFactorGetMatrix_Factor;
703
704 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorSetZeroPivot_C", PCFactorSetZeroPivot_Factor));
705 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorGetZeroPivot_C", PCFactorGetZeroPivot_Factor));
706 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorSetShiftType_C", PCFactorSetShiftType_Factor));
707 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorGetShiftType_C", PCFactorGetShiftType_Factor));
708 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorSetShiftAmount_C", PCFactorSetShiftAmount_Factor));
709 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorGetShiftAmount_C", PCFactorGetShiftAmount_Factor));
710 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorGetMatSolverType_C", PCFactorGetMatSolverType_Factor));
711 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorSetMatSolverType_C", PCFactorSetMatSolverType_Factor));
712 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorSetUpMatSolverType_C", PCFactorSetUpMatSolverType_Factor));
713 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorSetFill_C", PCFactorSetFill_Factor));
714 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorSetMatOrderingType_C", PCFactorSetMatOrderingType_Factor));
715 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorSetLevels_C", PCFactorSetLevels_Factor));
716 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorGetLevels_C", PCFactorGetLevels_Factor));
717 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorSetAllowDiagonalFill_C", PCFactorSetAllowDiagonalFill_Factor));
718 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorGetAllowDiagonalFill_C", PCFactorGetAllowDiagonalFill_Factor));
719 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorSetPivotInBlocks_C", PCFactorSetPivotInBlocks_Factor));
720 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorSetUseInPlace_C", PCFactorSetUseInPlace_Factor));
721 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorGetUseInPlace_C", PCFactorGetUseInPlace_Factor));
722 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorSetReuseOrdering_C", PCFactorSetReuseOrdering_Factor));
723 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorSetReuseFill_C", PCFactorSetReuseFill_Factor));
724 PetscFunctionReturn(PETSC_SUCCESS);
725 }
726
PCFactorClearComposedFunctions(PC pc)727 PetscErrorCode PCFactorClearComposedFunctions(PC pc)
728 {
729 PetscFunctionBegin;
730 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorSetZeroPivot_C", NULL));
731 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorGetZeroPivot_C", NULL));
732 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorSetShiftType_C", NULL));
733 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorGetShiftType_C", NULL));
734 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorSetShiftAmount_C", NULL));
735 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorGetShiftAmount_C", NULL));
736 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorGetMatSolverType_C", NULL));
737 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorSetMatSolverType_C", NULL));
738 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorSetUpMatSolverType_C", NULL));
739 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorSetFill_C", NULL));
740 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorSetMatOrderingType_C", NULL));
741 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorSetLevels_C", NULL));
742 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorGetLevels_C", NULL));
743 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorSetAllowDiagonalFill_C", NULL));
744 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorGetAllowDiagonalFill_C", NULL));
745 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorSetPivotInBlocks_C", NULL));
746 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorSetUseInPlace_C", NULL));
747 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorGetUseInPlace_C", NULL));
748 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorSetReuseOrdering_C", NULL));
749 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorSetReuseFill_C", NULL));
750 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorReorderForNonzeroDiagonal_C", NULL));
751 PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCFactorSetDropTolerance_C", NULL));
752 PetscFunctionReturn(PETSC_SUCCESS);
753 }
754