GCC Code Coverage Report


Directory: ./
File: src/mfn/interface/mfnbasic.c
Date: 2025-10-04 04:19:13
Exec Total Coverage
Lines: 177 179 98.9%
Functions: 15 15 100.0%
Branches: 445 1048 42.5%

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 Basic MFN routines
12 */
13
14 #include <slepc/private/mfnimpl.h> /*I "slepcmfn.h" I*/
15
16 /* Logging support */
17 PetscClassId MFN_CLASSID = 0;
18 PetscLogEvent MFN_SetUp = 0,MFN_Solve = 0;
19
20 /* List of registered MFN routines */
21 PetscFunctionList MFNList = NULL;
22 PetscBool MFNRegisterAllCalled = PETSC_FALSE;
23
24 /* List of registered MFN monitors */
25 PetscFunctionList MFNMonitorList = NULL;
26 PetscFunctionList MFNMonitorCreateList = NULL;
27 PetscFunctionList MFNMonitorDestroyList = NULL;
28 PetscBool MFNMonitorRegisterAllCalled = PETSC_FALSE;
29
30 /*@
31 MFNView - Prints the MFN data structure.
32
33 Collective
34
35 Input Parameters:
36 + mfn - the matrix function solver context
37 - viewer - optional visualization context
38
39 Options Database Key:
40 . -mfn_view - Calls MFNView() at end of MFNSolve()
41
42 Note:
43 The available visualization contexts include
44 + PETSC_VIEWER_STDOUT_SELF - standard output (default)
45 - PETSC_VIEWER_STDOUT_WORLD - synchronized standard
46 output where only the first processor opens
47 the file. All other processors send their
48 data to the first processor to print.
49
50 The user can open an alternative visualization context with
51 PetscViewerASCIIOpen() - output to a specified file.
52
53 Level: beginner
54
55 .seealso: MFNCreate()
56 @*/
57 28 PetscErrorCode MFNView(MFN mfn,PetscViewer viewer)
58 {
59 28 PetscBool isascii;
60
61
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
28 PetscFunctionBegin;
62
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.
28 PetscValidHeaderSpecific(mfn,MFN_CLASSID,1);
63
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.
28 if (!viewer) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)mfn),&viewer));
64
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.
28 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
65
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.
28 PetscCheckSameComm(mfn,1,viewer,2);
66
67
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.
28 PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii));
68
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
28 if (isascii) {
69
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.
28 PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)mfn,viewer));
70
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.
28 PetscCall(PetscViewerASCIIPushTab(viewer));
71
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.
28 PetscTryTypeMethod(mfn,view,viewer);
72
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.
28 PetscCall(PetscViewerASCIIPopTab(viewer));
73
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.
28 PetscCall(PetscViewerASCIIPrintf(viewer," number of column vectors (ncv): %" PetscInt_FMT "\n",mfn->ncv));
74
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.
28 PetscCall(PetscViewerASCIIPrintf(viewer," maximum number of iterations: %" PetscInt_FMT "\n",mfn->max_it));
75
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.
28 PetscCall(PetscViewerASCIIPrintf(viewer," tolerance: %g\n",(double)mfn->tol));
76 } else PetscTryTypeMethod(mfn,view,viewer);
77
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.
28 PetscCall(PetscViewerPushFormat(viewer,PETSC_VIEWER_ASCII_INFO));
78
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.
28 if (!mfn->V) PetscCall(MFNGetFN(mfn,&mfn->fn));
79
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.
28 PetscCall(FNView(mfn->fn,viewer));
80
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.
28 if (!mfn->V) PetscCall(MFNGetBV(mfn,&mfn->V));
81
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.
28 PetscCall(BVView(mfn->V,viewer));
82
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.
28 PetscCall(PetscViewerPopFormat(viewer));
83
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.
5 PetscFunctionReturn(PETSC_SUCCESS);
84 }
85
86 /*@
87 MFNViewFromOptions - View from options
88
89 Collective
90
91 Input Parameters:
92 + mfn - the matrix function context
93 . obj - optional object
94 - name - command line option
95
96 Level: intermediate
97
98 .seealso: MFNView(), MFNCreate()
99 @*/
100 2096 PetscErrorCode MFNViewFromOptions(MFN mfn,PetscObject obj,const char name[])
101 {
102
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2096 PetscFunctionBegin;
103
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.
2096 PetscValidHeaderSpecific(mfn,MFN_CLASSID,1);
104
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.
2096 PetscCall(PetscObjectViewFromOptions((PetscObject)mfn,obj,name));
105
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.
410 PetscFunctionReturn(PETSC_SUCCESS);
106 }
107 /*@
108 MFNConvergedReasonView - Displays the reason an MFN solve converged or diverged.
109
110 Collective
111
112 Input Parameters:
113 + mfn - the matrix function context
114 - viewer - the viewer to display the reason
115
116 Options Database Keys:
117 . -mfn_converged_reason - print reason for convergence, and number of iterations
118
119 Note:
120 To change the format of the output call PetscViewerPushFormat(viewer,format) before
121 this call. Use PETSC_VIEWER_DEFAULT for the default, use PETSC_VIEWER_FAILED to only
122 display a reason if it fails. The latter can be set in the command line with
123 -mfn_converged_reason ::failed
124
125 Level: intermediate
126
127 .seealso: MFNSetTolerances(), MFNGetIterationNumber(), MFNConvergedReasonViewFromOptions()
128 @*/
129 18 PetscErrorCode MFNConvergedReasonView(MFN mfn,PetscViewer viewer)
130 {
131 18 PetscBool isAscii;
132 18 PetscViewerFormat format;
133
134
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
18 PetscFunctionBegin;
135
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
18 if (!viewer) viewer = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)mfn));
136
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.
18 PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isAscii));
137
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
18 if (isAscii) {
138
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.
18 PetscCall(PetscViewerGetFormat(viewer,&format));
139
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.
18 PetscCall(PetscViewerASCIIAddTab(viewer,((PetscObject)mfn)->tablevel));
140
8/12
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
18 if (mfn->reason > 0 && format != PETSC_VIEWER_FAILED) PetscCall(PetscViewerASCIIPrintf(viewer,"%s Matrix function solve converged due to %s; iterations %" PetscInt_FMT "\n",((PetscObject)mfn)->prefix?((PetscObject)mfn)->prefix:"",MFNConvergedReasons[mfn->reason],mfn->its));
141 else if (mfn->reason <= 0) PetscCall(PetscViewerASCIIPrintf(viewer,"%s Matrix function solve did not converge due to %s; iterations %" PetscInt_FMT "\n",((PetscObject)mfn)->prefix?((PetscObject)mfn)->prefix:"",MFNConvergedReasons[mfn->reason],mfn->its));
142
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.
18 PetscCall(PetscViewerASCIISubtractTab(viewer,((PetscObject)mfn)->tablevel));
143 }
144
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.
3 PetscFunctionReturn(PETSC_SUCCESS);
145 }
146
147 /*@
148 MFNConvergedReasonViewFromOptions - Processes command line options to determine if/how
149 the MFN converged reason is to be viewed.
150
151 Collective
152
153 Input Parameter:
154 . mfn - the matrix function context
155
156 Level: developer
157
158 .seealso: MFNConvergedReasonView()
159 @*/
160 1048 PetscErrorCode MFNConvergedReasonViewFromOptions(MFN mfn)
161 {
162 1048 PetscViewer viewer;
163 1048 PetscBool flg;
164 1048 static PetscBool incall = PETSC_FALSE;
165 1048 PetscViewerFormat format;
166
167
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1048 PetscFunctionBegin;
168
2/14
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 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.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
1048 if (incall) PetscFunctionReturn(PETSC_SUCCESS);
169 1048 incall = PETSC_TRUE;
170
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(PetscOptionsCreateViewer(PetscObjectComm((PetscObject)mfn),((PetscObject)mfn)->options,((PetscObject)mfn)->prefix,"-mfn_converged_reason",&viewer,&format,&flg));
171
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1048 if (flg) {
172
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.
18 PetscCall(PetscViewerPushFormat(viewer,format));
173
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.
18 PetscCall(MFNConvergedReasonView(mfn,viewer));
174
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.
18 PetscCall(PetscViewerPopFormat(viewer));
175
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.
18 PetscCall(PetscViewerDestroy(&viewer));
176 }
177 1048 incall = PETSC_FALSE;
178
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.
1048 PetscFunctionReturn(PETSC_SUCCESS);
179 }
180
181 /*@
182 MFNCreate - Creates the default MFN context.
183
184 Collective
185
186 Input Parameter:
187 . comm - MPI communicator
188
189 Output Parameter:
190 . outmfn - location to put the MFN context
191
192 Note:
193 The default MFN type is MFNKRYLOV
194
195 Level: beginner
196
197 .seealso: MFNSetUp(), MFNSolve(), MFNDestroy(), MFN
198 @*/
199 295 PetscErrorCode MFNCreate(MPI_Comm comm,MFN *outmfn)
200 {
201 295 MFN mfn;
202
203
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
295 PetscFunctionBegin;
204
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.
295 PetscAssertPointer(outmfn,2);
205
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.
295 PetscCall(MFNInitializePackage());
206
7/12
✓ 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 10 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
295 PetscCall(SlepcHeaderCreate(mfn,MFN_CLASSID,"MFN","Matrix Function","MFN",comm,MFNDestroy,MFNView));
207
208 295 mfn->A = NULL;
209 295 mfn->fn = NULL;
210 295 mfn->max_it = PETSC_DETERMINE;
211 295 mfn->ncv = PETSC_DETERMINE;
212 295 mfn->tol = PETSC_DETERMINE;
213 295 mfn->errorifnotconverged = PETSC_FALSE;
214
215 295 mfn->numbermonitors = 0;
216
217 295 mfn->V = NULL;
218 295 mfn->nwork = 0;
219 295 mfn->work = NULL;
220 295 mfn->data = NULL;
221
222 295 mfn->its = 0;
223 295 mfn->nv = 0;
224 295 mfn->errest = 0;
225 295 mfn->setupcalled = 0;
226 295 mfn->reason = MFN_CONVERGED_ITERATING;
227
228 295 *outmfn = mfn;
229
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.
295 PetscFunctionReturn(PETSC_SUCCESS);
230 }
231
232 /*@
233 MFNSetType - Selects the particular solver to be used in the MFN object.
234
235 Logically Collective
236
237 Input Parameters:
238 + mfn - the matrix function context
239 - type - a known method
240
241 Options Database Key:
242 . -mfn_type <method> - Sets the method; use -help for a list
243 of available methods
244
245 Notes:
246 See "slepc/include/slepcmfn.h" for available methods. The default
247 is MFNKRYLOV
248
249 Normally, it is best to use the MFNSetFromOptions() command and
250 then set the MFN type from the options database rather than by using
251 this routine. Using the options database provides the user with
252 maximum flexibility in evaluating the different available methods.
253 The MFNSetType() routine is provided for those situations where it
254 is necessary to set the iterative solver independently of the command
255 line or options database.
256
257 Level: intermediate
258
259 .seealso: MFNType
260 @*/
261 214 PetscErrorCode MFNSetType(MFN mfn,MFNType type)
262 {
263 214 PetscErrorCode (*r)(MFN);
264 214 PetscBool match;
265
266
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
214 PetscFunctionBegin;
267
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.
214 PetscValidHeaderSpecific(mfn,MFN_CLASSID,1);
268
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.
214 PetscAssertPointer(type,2);
269
270
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.
214 PetscCall(PetscObjectTypeCompare((PetscObject)mfn,type,&match));
271
2/14
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 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.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
214 if (match) PetscFunctionReturn(PETSC_SUCCESS);
272
273
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.
214 PetscCall(PetscFunctionListFind(MFNList,type,&r));
274
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
214 PetscCheck(r,PetscObjectComm((PetscObject)mfn),PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown MFN type given: %s",type);
275
276
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.
214 PetscTryTypeMethod(mfn,destroy);
277
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
214 PetscCall(PetscMemzero(mfn->ops,sizeof(struct _MFNOps)));
278
279 214 mfn->setupcalled = 0;
280
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.
214 PetscCall(PetscObjectChangeTypeName((PetscObject)mfn,type));
281
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.
214 PetscCall((*r)(mfn));
282
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.
37 PetscFunctionReturn(PETSC_SUCCESS);
283 }
284
285 /*@
286 MFNGetType - Gets the MFN type as a string from the MFN object.
287
288 Not Collective
289
290 Input Parameter:
291 . mfn - the matrix function context
292
293 Output Parameter:
294 . type - name of MFN method
295
296 Level: intermediate
297
298 .seealso: MFNSetType()
299 @*/
300 44 PetscErrorCode MFNGetType(MFN mfn,MFNType *type)
301 {
302
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
44 PetscFunctionBegin;
303
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.
44 PetscValidHeaderSpecific(mfn,MFN_CLASSID,1);
304
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.
44 PetscAssertPointer(type,2);
305 44 *type = ((PetscObject)mfn)->type_name;
306
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.
44 PetscFunctionReturn(PETSC_SUCCESS);
307 }
308
309 /*@C
310 MFNRegister - Adds a method to the matrix function solver package.
311
312 Not Collective
313
314 Input Parameters:
315 + name - name of a new user-defined solver
316 - function - routine to create the solver context
317
318 Notes:
319 MFNRegister() may be called multiple times to add several user-defined solvers.
320
321 Example Usage:
322 .vb
323 MFNRegister("my_solver",MySolverCreate);
324 .ve
325
326 Then, your solver can be chosen with the procedural interface via
327 $ MFNSetType(mfn,"my_solver")
328 or at runtime via the option
329 $ -mfn_type my_solver
330
331 Level: advanced
332
333 .seealso: MFNRegisterAll()
334 @*/
335 426 PetscErrorCode MFNRegister(const char *name,PetscErrorCode (*function)(MFN))
336 {
337
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
426 PetscFunctionBegin;
338
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.
426 PetscCall(MFNInitializePackage());
339
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.
426 PetscCall(PetscFunctionListAdd(&MFNList,name,function));
340
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.
66 PetscFunctionReturn(PETSC_SUCCESS);
341 }
342
343 /*@C
344 MFNMonitorRegister - Registers an MFN monitor routine that may be accessed with MFNMonitorSetFromOptions().
345
346 Not Collective
347
348 Input Parameters:
349 + name - name of a new monitor routine
350 . vtype - a PetscViewerType for the output
351 . format - a PetscViewerFormat for the output
352 . monitor - monitor routine, see MFNMonitorRegisterFn
353 . create - creation routine, or NULL
354 - destroy - destruction routine, or NULL
355
356 Notes:
357 MFNMonitorRegister() may be called multiple times to add several user-defined monitors.
358
359 The calling sequence for the given function matches the calling sequence of MFNMonitorFn
360 functions passed to MFNMonitorSet() with the additional requirement that its final argument
361 be a PetscViewerAndFormat.
362
363 Example Usage:
364 .vb
365 MFNMonitorRegister("my_monitor",PETSCVIEWERASCII,PETSC_VIEWER_ASCII_INFO_DETAIL,MyMonitor,NULL,NULL);
366 .ve
367
368 Then, your monitor can be chosen with the procedural interface via
369 $ MFNMonitorSetFromOptions(mfn,"-mfn_monitor_my_monitor","my_monitor",NULL)
370 or at runtime via the option
371 $ -mfn_monitor_my_monitor
372
373 Level: advanced
374
375 .seealso: MFNMonitorSet(), MFNMonitorRegisterAll()
376 @*/
377 426 PetscErrorCode MFNMonitorRegister(const char name[],PetscViewerType vtype,PetscViewerFormat format,MFNMonitorRegisterFn *monitor,MFNMonitorRegisterCreateFn *create,MFNMonitorRegisterDestroyFn *destroy)
378 {
379 426 char key[PETSC_MAX_PATH_LEN];
380
381
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
426 PetscFunctionBegin;
382
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.
426 PetscCall(MFNInitializePackage());
383
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.
426 PetscCall(SlepcMonitorMakeKey_Internal(name,vtype,format,key));
384
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.
426 PetscCall(PetscFunctionListAdd(&MFNMonitorList,key,monitor));
385
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.
426 if (create) PetscCall(PetscFunctionListAdd(&MFNMonitorCreateList,key,create));
386
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.
426 if (destroy) PetscCall(PetscFunctionListAdd(&MFNMonitorDestroyList,key,destroy));
387
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.
66 PetscFunctionReturn(PETSC_SUCCESS);
388 }
389
390 /*@
391 MFNReset - Resets the MFN context to the initial state (prior to setup)
392 and destroys any allocated Vecs and Mats.
393
394 Collective
395
396 Input Parameter:
397 . mfn - matrix function context obtained from MFNCreate()
398
399 Level: advanced
400
401 .seealso: MFNDestroy()
402 @*/
403 295 PetscErrorCode MFNReset(MFN mfn)
404 {
405
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
295 PetscFunctionBegin;
406
3/14
✓ 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 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
295 if (mfn) PetscValidHeaderSpecific(mfn,MFN_CLASSID,1);
407
2/14
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 1 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.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
277 if (!mfn) PetscFunctionReturn(PETSC_SUCCESS);
408
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.
295 PetscTryTypeMethod(mfn,reset);
409
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.
295 PetscCall(MatDestroy(&mfn->A));
410
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.
295 PetscCall(BVDestroy(&mfn->V));
411
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.
295 PetscCall(VecDestroyVecs(mfn->nwork,&mfn->work));
412 295 mfn->nwork = 0;
413 295 mfn->setupcalled = 0;
414
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.
295 PetscFunctionReturn(PETSC_SUCCESS);
415 }
416
417 /*@
418 MFNDestroy - Destroys the MFN context.
419
420 Collective
421
422 Input Parameter:
423 . mfn - matrix function context obtained from MFNCreate()
424
425 Level: beginner
426
427 .seealso: MFNCreate(), MFNSetUp(), MFNSolve()
428 @*/
429 316 PetscErrorCode MFNDestroy(MFN *mfn)
430 {
431
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
316 PetscFunctionBegin;
432
2/14
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 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.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
316 if (!*mfn) PetscFunctionReturn(PETSC_SUCCESS);
433
2/12
✗ 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 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
316 PetscValidHeaderSpecific(*mfn,MFN_CLASSID,1);
434
2/14
✓ Branch 0 taken 2 times.
✓ 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.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
316 if (--((PetscObject)*mfn)->refct > 0) { *mfn = NULL; PetscFunctionReturn(PETSC_SUCCESS); }
435
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.
295 PetscCall(MFNReset(*mfn));
436
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.
295 PetscTryTypeMethod(*mfn,destroy);
437
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.
295 PetscCall(FNDestroy(&(*mfn)->fn));
438
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.
295 PetscCall(MatDestroy(&(*mfn)->AT));
439
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.
295 PetscCall(MFNMonitorCancel(*mfn));
440
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.
295 PetscCall(PetscHeaderDestroy(mfn));
441
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);
442 }
443
444 /*@
445 MFNSetBV - Associates a basis vectors object to the matrix function solver.
446
447 Collective
448
449 Input Parameters:
450 + mfn - matrix function context obtained from MFNCreate()
451 - bv - the basis vectors object
452
453 Note:
454 Use MFNGetBV() to retrieve the basis vectors context (for example,
455 to free it at the end of the computations).
456
457 Level: advanced
458
459 .seealso: MFNGetBV()
460 @*/
461 8 PetscErrorCode MFNSetBV(MFN mfn,BV bv)
462 {
463
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
8 PetscFunctionBegin;
464
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.
8 PetscValidHeaderSpecific(mfn,MFN_CLASSID,1);
465
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.
8 PetscValidHeaderSpecific(bv,BV_CLASSID,2);
466
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.
8 PetscCheckSameComm(mfn,1,bv,2);
467
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 PetscCall(PetscObjectReference((PetscObject)bv));
468
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 PetscCall(BVDestroy(&mfn->V));
469 8 mfn->V = bv;
470
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.
8 PetscFunctionReturn(PETSC_SUCCESS);
471 }
472
473 /*@
474 MFNGetBV - Obtain the basis vectors object associated to the matrix
475 function solver.
476
477 Not Collective
478
479 Input Parameters:
480 . mfn - matrix function context obtained from MFNCreate()
481
482 Output Parameter:
483 . bv - basis vectors context
484
485 Level: advanced
486
487 .seealso: MFNSetBV()
488 @*/
489 196 PetscErrorCode MFNGetBV(MFN mfn,BV *bv)
490 {
491
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
196 PetscFunctionBegin;
492
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.
196 PetscValidHeaderSpecific(mfn,MFN_CLASSID,1);
493
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.
196 PetscAssertPointer(bv,2);
494
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
196 if (!mfn->V) {
495
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.
196 PetscCall(BVCreate(PetscObjectComm((PetscObject)mfn),&mfn->V));
496
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.
196 PetscCall(PetscObjectIncrementTabLevel((PetscObject)mfn->V,(PetscObject)mfn,0));
497
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.
196 PetscCall(PetscObjectSetOptions((PetscObject)mfn->V,((PetscObject)mfn)->options));
498 }
499 196 *bv = mfn->V;
500
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.
196 PetscFunctionReturn(PETSC_SUCCESS);
501 }
502
503 /*@
504 MFNSetFN - Specifies the function to be computed.
505
506 Collective
507
508 Input Parameters:
509 + mfn - matrix function context obtained from MFNCreate()
510 - fn - the math function object
511
512 Note:
513 Use MFNGetFN() to retrieve the math function context (for example,
514 to free it at the end of the computations).
515
516 Level: beginner
517
518 .seealso: MFNGetFN()
519 @*/
520 48 PetscErrorCode MFNSetFN(MFN mfn,FN fn)
521 {
522
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
48 PetscFunctionBegin;
523
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.
48 PetscValidHeaderSpecific(mfn,MFN_CLASSID,1);
524
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.
48 PetscValidHeaderSpecific(fn,FN_CLASSID,2);
525
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.
48 PetscCheckSameComm(mfn,1,fn,2);
526
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.
48 PetscCall(PetscObjectReference((PetscObject)fn));
527
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.
48 PetscCall(FNDestroy(&mfn->fn));
528 48 mfn->fn = fn;
529
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.
48 PetscFunctionReturn(PETSC_SUCCESS);
530 }
531
532 /*@
533 MFNGetFN - Obtain the math function object associated to the MFN object.
534
535 Not Collective
536
537 Input Parameters:
538 . mfn - matrix function context obtained from MFNCreate()
539
540 Output Parameter:
541 . fn - math function context
542
543 Level: beginner
544
545 .seealso: MFNSetFN()
546 @*/
547 6046 PetscErrorCode MFNGetFN(MFN mfn,FN *fn)
548 {
549
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
6046 PetscFunctionBegin;
550
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.
6046 PetscValidHeaderSpecific(mfn,MFN_CLASSID,1);
551
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.
6046 PetscAssertPointer(fn,2);
552
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6046 if (!mfn->fn) {
553
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.
156 PetscCall(FNCreate(PetscObjectComm((PetscObject)mfn),&mfn->fn));
554
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.
156 PetscCall(PetscObjectIncrementTabLevel((PetscObject)mfn->fn,(PetscObject)mfn,0));
555
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.
156 PetscCall(PetscObjectSetOptions((PetscObject)mfn->fn,((PetscObject)mfn)->options));
556 }
557 6046 *fn = mfn->fn;
558
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.
6046 PetscFunctionReturn(PETSC_SUCCESS);
559 }
560