GCC Code Coverage Report


Directory: ./
File: src/mfn/interface/mfnsetup.c
Date: 2025-10-04 04:19:13
Exec Total Coverage
Lines: 52 52 100.0%
Functions: 4 4 100.0%
Branches: 125 312 40.1%

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 problem setup
12 */
13
14 #include <slepc/private/mfnimpl.h> /*I "slepcmfn.h" I*/
15
16 /*@
17 MFNSetUp - Sets up all the internal data structures necessary for the
18 execution of the matrix function solver.
19
20 Collective
21
22 Input Parameter:
23 . mfn - matrix function context
24
25 Notes:
26 This function need not be called explicitly in most cases, since MFNSolve()
27 calls it. It can be useful when one wants to measure the set-up time
28 separately from the solve time.
29
30 Level: developer
31
32 .seealso: MFNCreate(), MFNSolve(), MFNDestroy()
33 @*/
34 1048 PetscErrorCode MFNSetUp(MFN mfn)
35 {
36 1048 PetscInt N;
37
38
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1048 PetscFunctionBegin;
39
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.
1048 PetscValidHeaderSpecific(mfn,MFN_CLASSID,1);
40
41 /* reset the convergence flag from the previous solves */
42 1048 mfn->reason = MFN_CONVERGED_ITERATING;
43
44
8/14
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ 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.
1048 if (mfn->setupcalled) PetscFunctionReturn(PETSC_SUCCESS);
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.
190 PetscCall(PetscLogEventBegin(MFN_SetUp,mfn,0,0,0));
46
47 /* Set default solver type (MFNSetFromOptions was not called) */
48
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
190 if (!((PetscObject)mfn)->type_name) PetscCall(MFNSetType(mfn,MFNKRYLOV));
49
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
190 if (!mfn->fn) PetscCall(MFNGetFN(mfn,&mfn->fn));
50
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
190 if (!((PetscObject)mfn->fn)->type_name) PetscCall(FNSetFromOptions(mfn->fn));
51
52 /* Check problem dimensions */
53
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
190 PetscCheck(mfn->A,PetscObjectComm((PetscObject)mfn),PETSC_ERR_ARG_WRONGSTATE,"MFNSetOperator must be called first");
54
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.
190 PetscCall(MatGetSize(mfn->A,&N,NULL));
55
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
190 if (mfn->ncv > N) mfn->ncv = N;
56
57 /* call specific solver setup */
58
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.
190 PetscUseTypeMethod(mfn,setup);
59
60 /* set tolerance if not yet set */
61
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
190 if (mfn->tol==(PetscReal)PETSC_DETERMINE) mfn->tol = SLEPC_DEFAULT_TOL;
62
63
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.
190 PetscCall(PetscLogEventEnd(MFN_SetUp,mfn,0,0,0));
64 190 mfn->setupcalled = 1;
65
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.
190 PetscFunctionReturn(PETSC_SUCCESS);
66 }
67
68 /*@
69 MFNSetOperator - Sets the matrix for which the matrix function is to be computed.
70
71 Collective
72
73 Input Parameters:
74 + mfn - the matrix function context
75 - A - the problem matrix
76
77 Notes:
78 It must be called before MFNSetUp(). If it is called again after MFNSetUp() then
79 the MFN object is reset.
80
81 Level: beginner
82
83 .seealso: MFNSolve(), MFNSetUp(), MFNReset()
84 @*/
85 190 PetscErrorCode MFNSetOperator(MFN mfn,Mat A)
86 {
87 190 PetscInt m,n;
88
89
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
190 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.
190 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.
190 PetscValidHeaderSpecific(A,MAT_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.
190 PetscCheckSameComm(mfn,1,A,2);
93
94
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.
190 PetscCall(MatGetSize(A,&m,&n));
95
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
190 PetscCheck(m==n,PetscObjectComm((PetscObject)mfn),PETSC_ERR_ARG_WRONG,"A is a non-square matrix");
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.
190 PetscCall(PetscObjectReference((PetscObject)A));
97
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
190 if (mfn->setupcalled) PetscCall(MFNReset(mfn));
98
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.
190 else PetscCall(MatDestroy(&mfn->A));
99 190 mfn->A = A;
100 190 mfn->setupcalled = 0;
101
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.
190 PetscFunctionReturn(PETSC_SUCCESS);
102 }
103
104 /*@
105 MFNGetOperator - Gets the matrix associated with the MFN object.
106
107 Collective
108
109 Input Parameter:
110 . mfn - the MFN context
111
112 Output Parameters:
113 . A - the matrix for which the matrix function is to be computed
114
115 Level: intermediate
116
117 .seealso: MFNSolve(), MFNSetOperator()
118 @*/
119 34 PetscErrorCode MFNGetOperator(MFN mfn,Mat *A)
120 {
121
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
34 PetscFunctionBegin;
122
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.
34 PetscValidHeaderSpecific(mfn,MFN_CLASSID,1);
123
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.
34 PetscAssertPointer(A,2);
124 34 *A = mfn->A;
125
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.
34 PetscFunctionReturn(PETSC_SUCCESS);
126 }
127
128 /*@
129 MFNAllocateSolution - Allocate memory storage for common variables such
130 as the basis vectors.
131
132 Collective
133
134 Input Parameters:
135 + mfn - matrix function context
136 - extra - number of additional positions, used for methods that require a
137 working basis slightly larger than ncv
138
139 Developer Notes:
140 This is SLEPC_EXTERN because it may be required by user plugin MFN
141 implementations.
142
143 Level: developer
144
145 .seealso: MFNSetUp()
146 @*/
147 190 PetscErrorCode MFNAllocateSolution(MFN mfn,PetscInt extra)
148 {
149 190 PetscInt oldsize,requested;
150 190 Vec t;
151
152
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
190 PetscFunctionBegin;
153 190 requested = mfn->ncv + extra;
154
155 /* oldsize is zero if this is the first time setup is called */
156
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.
190 PetscCall(BVGetSizes(mfn->V,NULL,NULL,&oldsize));
157
158 /* allocate basis vectors */
159
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
190 if (!mfn->V) PetscCall(MFNGetBV(mfn,&mfn->V));
160
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
190 if (!oldsize) {
161
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
182 if (!((PetscObject)mfn->V)->type_name) PetscCall(BVSetType(mfn->V,BVMAT));
162
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.
182 PetscCall(MatCreateVecsEmpty(mfn->A,&t,NULL));
163
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.
182 PetscCall(BVSetSizesFromVec(mfn->V,t,requested));
164
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.
182 PetscCall(VecDestroy(&t));
165
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 } else PetscCall(BVResize(mfn->V,requested,PETSC_FALSE));
166
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.
35 PetscFunctionReturn(PETSC_SUCCESS);
167 }
168