| 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 | 1048 | static PetscErrorCode MFNSolve_Private(MFN mfn,Vec b,Vec x) | |
| 17 | { | ||
| 18 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1048 | 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.
|
1048 | 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.
|
1048 | PetscCall(MFNSetUp(mfn)); |
| 23 | 1048 | 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.
|
1048 | 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.
|
1048 | 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.
|
1048 | 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.
|
1048 | 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.
|
1048 | 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.
|
1048 | 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.
|
1048 | 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.
|
1048 | 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.
|
1048 | 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.
|
1048 | 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.
|
1048 | 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.
|
1048 | 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.
|
1048 | 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.
|
1048 | 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.
|
1048 | 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.
|
205 | 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 | |||
| 82 | Level: beginner | ||
| 83 | |||
| 84 | .seealso: [](ch:mfn), `MFNCreate()`, `MFNSetUp()`, `MFNDestroy()`, `MFNSetTolerances()`, `MFNSetOperator()`, `MFNSetFN()` | ||
| 85 | @*/ | ||
| 86 | 1036 | PetscErrorCode MFNSolve(MFN mfn,Vec b,Vec x) | |
| 87 | { | ||
| 88 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1036 | PetscFunctionBegin; |
| 89 |
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.
|
1036 | PetscValidHeaderSpecific(mfn,MFN_CLASSID,1); |
| 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.
|
1036 | PetscValidHeaderSpecific(b,VEC_CLASSID,2); |
| 91 |
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.
|
1036 | PetscCheckSameComm(mfn,1,b,2); |
| 92 |
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.
|
1036 | if (b!=x) PetscValidHeaderSpecific(x,VEC_CLASSID,3); |
| 93 |
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.
|
1036 | if (b!=x) PetscCheckSameComm(mfn,1,x,3); |
| 94 | 1036 | mfn->transpose_solve = PETSC_FALSE; | |
| 95 |
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.
|
1036 | PetscCall(MFNSolve_Private(mfn,b,x)); |
| 96 |
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.
|
201 | PetscFunctionReturn(PETSC_SUCCESS); |
| 97 | } | ||
| 98 | |||
| 99 | /*@ | ||
| 100 | MFNSolveTranspose - Solves the transpose matrix function problem. Given a vector $b$, | ||
| 101 | the vector $x = f(A^T)b$ is returned. | ||
| 102 | |||
| 103 | Collective | ||
| 104 | |||
| 105 | Input Parameters: | ||
| 106 | + mfn - the matrix function solver context | ||
| 107 | - b - the right hand side vector | ||
| 108 | |||
| 109 | Output Parameter: | ||
| 110 | . x - the solution (this may be the same vector as `b`, then `b` will be | ||
| 111 | overwritten with the answer) | ||
| 112 | |||
| 113 | Notes: | ||
| 114 | The matrix $A$ is specified with `MFNSetOperator()`. The function $f$ is | ||
| 115 | specified via the `FN` object obtained with `MFNGetFN()` or set with `MFNSetFN()`. | ||
| 116 | |||
| 117 | See available command-line options at `MFNSolve()`. | ||
| 118 | |||
| 119 | Developer Notes: | ||
| 120 | This is currently implemented with an explicit transpose matrix created | ||
| 121 | with `MatCreateTranspose()`. | ||
| 122 | |||
| 123 | Currently there is no conjugate-transpose version. | ||
| 124 | |||
| 125 | Level: beginner | ||
| 126 | |||
| 127 | .seealso: [](ch:mfn), `MFNSolve()`, `MatCreateTranspose()` | ||
| 128 | @*/ | ||
| 129 | 12 | PetscErrorCode MFNSolveTranspose(MFN mfn,Vec b,Vec x) | |
| 130 | { | ||
| 131 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
12 | PetscFunctionBegin; |
| 132 |
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); |
| 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(b,VEC_CLASSID,2); |
| 134 |
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); |
| 135 |
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); |
| 136 |
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); |
| 137 | 12 | mfn->transpose_solve = PETSC_TRUE; | |
| 138 |
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)); |
| 139 |
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)); |
| 140 |
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); |
| 141 | } | ||
| 142 | |||
| 143 | /*@ | ||
| 144 | MFNGetIterationNumber - Gets the current iteration number. If the | ||
| 145 | call to `MFNSolve()` is complete, then it returns the number of iterations | ||
| 146 | carried out by the solution method. | ||
| 147 | |||
| 148 | Not Collective | ||
| 149 | |||
| 150 | Input Parameter: | ||
| 151 | . mfn - the matrix function solver context | ||
| 152 | |||
| 153 | Output Parameter: | ||
| 154 | . its - number of iterations | ||
| 155 | |||
| 156 | Note: | ||
| 157 | During the $i$-th iteration this call returns $i-1$. If `MFNSolve()` is | ||
| 158 | complete, then parameter `its` contains either the iteration number at | ||
| 159 | which convergence was successfully reached, or failure was detected. | ||
| 160 | Call `MFNGetConvergedReason()` to determine if the solver converged or | ||
| 161 | failed and why. | ||
| 162 | |||
| 163 | Level: intermediate | ||
| 164 | |||
| 165 | .seealso: [](ch:mfn), `MFNGetConvergedReason()`, `MFNSetTolerances()` | ||
| 166 | @*/ | ||
| 167 | 102 | PetscErrorCode MFNGetIterationNumber(MFN mfn,PetscInt *its) | |
| 168 | { | ||
| 169 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
102 | PetscFunctionBegin; |
| 170 |
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.
|
102 | PetscValidHeaderSpecific(mfn,MFN_CLASSID,1); |
| 171 |
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.
|
102 | PetscAssertPointer(its,2); |
| 172 | 102 | *its = mfn->its; | |
| 173 |
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.
|
102 | PetscFunctionReturn(PETSC_SUCCESS); |
| 174 | } | ||
| 175 | |||
| 176 | /*@ | ||
| 177 | MFNGetConvergedReason - Gets the reason why the `MFNSolve()` iteration was | ||
| 178 | stopped. | ||
| 179 | |||
| 180 | Not Collective | ||
| 181 | |||
| 182 | Input Parameter: | ||
| 183 | . mfn - the matrix function solver context | ||
| 184 | |||
| 185 | Output Parameter: | ||
| 186 | . reason - negative value indicates diverged, positive value converged, see | ||
| 187 | `MFNConvergedReason` for the possible values | ||
| 188 | |||
| 189 | Options Database Key: | ||
| 190 | . -mfn_converged_reason - print reason for convergence/divergence, and number of iterations | ||
| 191 | |||
| 192 | Notes: | ||
| 193 | If this routine is called before or doing the `MFNSolve()` the value of | ||
| 194 | `MFN_CONVERGED_ITERATING` is returned. | ||
| 195 | |||
| 196 | Basic solvers (e.g., unrestarted Krylov iterations) cannot determine if the | ||
| 197 | computation is accurate up to the requested tolerance. In that case, the | ||
| 198 | converged reason is set to `MFN_CONVERGED_ITS` if the requested number of steps | ||
| 199 | (for instance, the `ncv` value in unrestarted Krylov methods) have been | ||
| 200 | completed successfully. | ||
| 201 | |||
| 202 | Level: intermediate | ||
| 203 | |||
| 204 | .seealso: [](ch:mfn), `MFNSetTolerances()`, `MFNSolve()`, `MFNConvergedReason`, `MFNSetErrorIfNotConverged()` | ||
| 205 | @*/ | ||
| 206 | 132 | PetscErrorCode MFNGetConvergedReason(MFN mfn,MFNConvergedReason *reason) | |
| 207 | { | ||
| 208 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
132 | PetscFunctionBegin; |
| 209 |
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.
|
132 | PetscValidHeaderSpecific(mfn,MFN_CLASSID,1); |
| 210 |
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.
|
132 | PetscAssertPointer(reason,2); |
| 211 | 132 | *reason = mfn->reason; | |
| 212 |
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.
|
132 | PetscFunctionReturn(PETSC_SUCCESS); |
| 213 | } | ||
| 214 |