Actual source code: borthog.c
1: /*
2: Routines used for the orthogonalization of the Hessenberg matrix.
4: Note that for the complex numbers version, the VecDot() and
5: VecMDot() arguments within the code MUST remain in the order
6: given for correct computation of inner products.
7: */
8: #include <../src/ksp/ksp/impls/gmres/gmresimpl.h>
10: /*@C
11: KSPGMRESModifiedGramSchmidtOrthogonalization - This is the basic orthogonalization routine
12: using modified Gram-Schmidt.
14: Collective
16: Input Parameters:
17: + ksp - `KSP` object, must be associated with `KSPGMRES`, `KSPFGMRES`, or `KSPLGMRES` Krylov method
18: - it - one less than the current GMRES restart iteration, i.e. the size of the Krylov space
20: Options Database Key:
21: . -ksp_gmres_modifiedgramschmidt - Activates `KSPGMRESModifiedGramSchmidtOrthogonalization()`
23: Level: intermediate
25: Note:
26: In general this is much slower than `KSPGMRESClassicalGramSchmidtOrthogonalization()` but has better stability properties.
28: .seealso: [](ch_ksp), `KSPGMRESSetOrthogonalization()`, `KSPGMRESClassicalGramSchmidtOrthogonalization()`, `KSPGMRESGetOrthogonalization()`
29: @*/
30: PetscErrorCode KSPGMRESModifiedGramSchmidtOrthogonalization(KSP ksp, PetscInt it)
31: {
32: KSP_GMRES *gmres = (KSP_GMRES *)(ksp->data);
33: PetscInt j;
34: PetscScalar *hh, *hes;
36: PetscFunctionBegin;
37: PetscCall(PetscLogEventBegin(KSP_GMRESOrthogonalization, ksp, 0, 0, 0));
38: /* update Hessenberg matrix and do Gram-Schmidt */
39: hh = HH(0, it);
40: hes = HES(0, it);
41: for (j = 0; j <= it; j++) {
42: /* (vv(it+1), vv(j)) */
43: PetscCall(VecDot(VEC_VV(it + 1), VEC_VV(j), hh));
44: KSPCheckDot(ksp, *hh);
45: if (ksp->reason) break;
46: *hes++ = *hh;
47: /* vv(it+1) <- vv(it+1) - hh[it+1][j] vv(j) */
48: PetscCall(VecAXPY(VEC_VV(it + 1), -(*hh++), VEC_VV(j)));
49: }
50: PetscCall(PetscLogEventEnd(KSP_GMRESOrthogonalization, ksp, 0, 0, 0));
51: PetscFunctionReturn(PETSC_SUCCESS);
52: }