GCC Code Coverage Report


Directory: ./
File: src/mfn/interface/mfnsolve.c
Date: 2026-05-04 03:58:11
Exec Total Coverage
Lines: 54 54 100.0%
Functions: 5 5 100.0%
Branches: 200 476 42.0%

Line Branch Exec Source
1 /*
2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3 SLEPc - Scalable Library for Eigenvalue Problem Computations
4 Copyright (c) 2002-, Universitat Politecnica de Valencia, Spain
5
6 This file is part of SLEPc.
7 SLEPc is distributed under a 2-clause BSD license (see LICENSE).
8 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
9 */
10 /*
11 MFN routines related to the solution process
12 */
13
14 #include <slepc/private/mfnimpl.h> /*I "slepcmfn.h" I*/
15
16 1050 static PetscErrorCode MFNSolve_Private(MFN mfn,Vec b,Vec x)
17 {
18
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1050 PetscFunctionBegin;
19
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1050 PetscCall(VecSetErrorIfLocked(x,3));
20
21 /* call setup */
22
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1050 PetscCall(MFNSetUp(mfn));
23 1050 mfn->its = 0;
24
25
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1050 PetscCall(MFNViewFromOptions(mfn,NULL,"-mfn_view_pre"));
26
27 /* check nonzero right-hand side */
28
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1050 PetscCall(VecNorm(b,NORM_2,&mfn->bnorm));
29
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1050 PetscCheck(mfn->bnorm,PetscObjectComm((PetscObject)mfn),PETSC_ERR_ARG_WRONG,"Cannot pass a zero b vector to MFNSolve()");
30
31 /* call solver */
32
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1050 PetscCall(PetscLogEventBegin(MFN_Solve,mfn,b,x,0));
33
6/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
1050 if (b!=x) PetscCall(VecLockReadPush(b));
34
5/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
1050 PetscUseTypeMethod(mfn,solve,b,x);
35
6/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
1050 if (b!=x) PetscCall(VecLockReadPop(b));
36
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1050 PetscCall(PetscLogEventEnd(MFN_Solve,mfn,b,x,0));
37
38
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1050 PetscCheck(mfn->reason,PetscObjectComm((PetscObject)mfn),PETSC_ERR_PLIB,"Internal error, solver returned without setting converged reason");
39
40
3/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1050 PetscCheck(!mfn->errorifnotconverged || mfn->reason>=0,PetscObjectComm((PetscObject)mfn),PETSC_ERR_NOT_CONVERGED,"MFNSolve has not converged");
41
42 /* various viewers */
43
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1050 PetscCall(MFNViewFromOptions(mfn,NULL,"-mfn_view"));
44
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1050 PetscCall(MFNConvergedReasonViewFromOptions(mfn));
45
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1050 PetscCall(MatViewFromOptions(mfn->A,(PetscObject)mfn,"-mfn_view_mat"));
46
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1050 PetscCall(VecViewFromOptions(b,(PetscObject)mfn,"-mfn_view_rhs"));
47
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1050 PetscCall(VecViewFromOptions(x,(PetscObject)mfn,"-mfn_view_solution"));
48
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
206 PetscFunctionReturn(PETSC_SUCCESS);
49 }
50
51 /*@
52 MFNSolve - Solves the matrix function problem. Given a vector $b$, the
53 vector $x = f(A)b$ is returned.
54
55 Collective
56
57 Input Parameters:
58 + mfn - the matrix function solver context
59 - b - the right hand side vector
60
61 Output Parameter:
62 . x - the solution (this may be the same vector as `b`, then `b` will be
63 overwritten with the answer)
64
65 Options Database Keys:
66 + -mfn_view - print information about the solver used
67 . -mfn_view_pre - print information about the solver before the solve starts
68 . -mfn_view_mat - view the matrix
69 . -mfn_view_rhs - view right hand side vector
70 . -mfn_view_solution - view computed solution vector
71 - -mfn_converged_reason - print reason for convergence/divergence, and number of iterations
72
73 Notes:
74 The matrix $A$ is specified with `MFNSetOperator()`. The function $f$ is
75 specified via the `FN` object obtained with `MFNGetFN()` or set with `MFNSetFN()`.
76
77 All the command-line options listed above admit an optional argument specifying
78 the viewer type and options. For instance, use `-mfn_view_mat binary:amatrix.bin`
79 to save the matrix to a binary file, or `-mfn_view_solution :sol.m:ascii_matlab`
80 to save the solution in a file that can be executed in Matlab.
81 See `PetscObjectViewFromOptions()` for more details.
82
83 Level: beginner
84
85 .seealso: [](ch:mfn), `MFNCreate()`, `MFNSetUp()`, `MFNDestroy()`, `MFNSetTolerances()`, `MFNSetOperator()`, `MFNSetFN()`
86 @*/
87 1038 PetscErrorCode MFNSolve(MFN mfn,Vec b,Vec x)
88 {
89
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1038 PetscFunctionBegin;
90
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
1038 PetscValidHeaderSpecific(mfn,MFN_CLASSID,1);
91
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
1038 PetscValidHeaderSpecific(b,VEC_CLASSID,2);
92
13/32
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
1038 PetscCheckSameComm(mfn,1,b,2);
93
5/18
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
1038 if (b!=x) PetscValidHeaderSpecific(x,VEC_CLASSID,3);
94
15/34
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
1038 if (b!=x) PetscCheckSameComm(mfn,1,x,3);
95 1038 mfn->transpose_solve = PETSC_FALSE;
96
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1038 PetscCall(MFNSolve_Private(mfn,b,x));
97
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
202 PetscFunctionReturn(PETSC_SUCCESS);
98 }
99
100 /*@
101 MFNSolveTranspose - Solves the transpose matrix function problem. Given a vector $b$,
102 the vector $x = f(A^T)b$ is returned.
103
104 Collective
105
106 Input Parameters:
107 + mfn - the matrix function solver context
108 - b - the right hand side vector
109
110 Output Parameter:
111 . x - the solution (this may be the same vector as `b`, then `b` will be
112 overwritten with the answer)
113
114 Notes:
115 The matrix $A$ is specified with `MFNSetOperator()`. The function $f$ is
116 specified via the `FN` object obtained with `MFNGetFN()` or set with `MFNSetFN()`.
117
118 See available command-line options at `MFNSolve()`.
119
120 Developer Notes:
121 This is currently implemented with an explicit transpose matrix created
122 with `MatCreateTranspose()`.
123
124 Currently there is no conjugate-transpose version.
125
126 Level: beginner
127
128 .seealso: [](ch:mfn), `MFNSolve()`, `MatCreateTranspose()`
129 @*/
130 12 PetscErrorCode MFNSolveTranspose(MFN mfn,Vec b,Vec x)
131 {
132
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
12 PetscFunctionBegin;
133
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
12 PetscValidHeaderSpecific(mfn,MFN_CLASSID,1);
134
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
12 PetscValidHeaderSpecific(b,VEC_CLASSID,2);
135
13/32
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
12 PetscCheckSameComm(mfn,1,b,2);
136
4/18
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
12 if (b!=x) PetscValidHeaderSpecific(x,VEC_CLASSID,3);
137
14/34
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
12 if (b!=x) PetscCheckSameComm(mfn,1,x,3);
138 12 mfn->transpose_solve = PETSC_TRUE;
139
5/8
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
12 if (!mfn->AT) PetscCall(MatCreateTranspose(mfn->A,&mfn->AT));
140
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
12 PetscCall(MFNSolve_Private(mfn,b,x));
141
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
4 PetscFunctionReturn(PETSC_SUCCESS);
142 }
143
144 /*@
145 MFNGetIterationNumber - Gets the current iteration number. If the
146 call to `MFNSolve()` is complete, then it returns the number of iterations
147 carried out by the solution method.
148
149 Not Collective
150
151 Input Parameter:
152 . mfn - the matrix function solver context
153
154 Output Parameter:
155 . its - number of iterations
156
157 Note:
158 During the $i$-th iteration this call returns $i-1$. If `MFNSolve()` is
159 complete, then parameter `its` contains either the iteration number at
160 which convergence was successfully reached, or failure was detected.
161 Call `MFNGetConvergedReason()` to determine if the solver converged or
162 failed and why.
163
164 Level: intermediate
165
166 .seealso: [](ch:mfn), `MFNGetConvergedReason()`, `MFNSetTolerances()`
167 @*/
168 104 PetscErrorCode MFNGetIterationNumber(MFN mfn,PetscInt *its)
169 {
170
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
104 PetscFunctionBegin;
171
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
104 PetscValidHeaderSpecific(mfn,MFN_CLASSID,1);
172
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
104 PetscAssertPointer(its,2);
173 104 *its = mfn->its;
174
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
104 PetscFunctionReturn(PETSC_SUCCESS);
175 }
176
177 /*@
178 MFNGetConvergedReason - Gets the reason why the `MFNSolve()` iteration was
179 stopped.
180
181 Not Collective
182
183 Input Parameter:
184 . mfn - the matrix function solver context
185
186 Output Parameter:
187 . reason - negative value indicates diverged, positive value converged, see
188 `MFNConvergedReason` for the possible values
189
190 Options Database Key:
191 . -mfn_converged_reason - print reason for convergence/divergence, and number of iterations
192
193 Notes:
194 If this routine is called before or doing the `MFNSolve()` the value of
195 `MFN_CONVERGED_ITERATING` is returned.
196
197 Basic solvers (e.g., unrestarted Krylov iterations) cannot determine if the
198 computation is accurate up to the requested tolerance. In that case, the
199 converged reason is set to `MFN_CONVERGED_ITS` if the requested number of steps
200 (for instance, the `ncv` value in unrestarted Krylov methods) have been
201 completed successfully.
202
203 Level: intermediate
204
205 .seealso: [](ch:mfn), `MFNSetTolerances()`, `MFNSolve()`, `MFNConvergedReason`, `MFNSetErrorIfNotConverged()`
206 @*/
207 134 PetscErrorCode MFNGetConvergedReason(MFN mfn,MFNConvergedReason *reason)
208 {
209
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
134 PetscFunctionBegin;
210
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
134 PetscValidHeaderSpecific(mfn,MFN_CLASSID,1);
211
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
134 PetscAssertPointer(reason,2);
212 134 *reason = mfn->reason;
213
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
134 PetscFunctionReturn(PETSC_SUCCESS);
214 }
215