GCC Code Coverage Report


Directory: ./
File: src/lme/interface/lmebasic.c
Date: 2026-09-30 04:15:21
Exec Total Coverage
Lines: 155 166 93.4%
Functions: 12 13 92.3%
Branches: 356 908 39.2%

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 LME routines
12 */
13
14 #include <slepc/private/lmeimpl.h> /*I "slepclme.h" I*/
15
16 /* Logging support */
17 PetscClassId LME_CLASSID = 0;
18 PetscLogEvent LME_SetUp = 0,LME_Solve = 0,LME_ComputeError = 0;
19
20 /* List of registered LME routines */
21 PetscFunctionList LMEList = NULL;
22 PetscBool LMERegisterAllCalled = PETSC_FALSE;
23
24 /* List of registered LME monitors */
25 PetscFunctionList LMEMonitorList = NULL;
26 PetscFunctionList LMEMonitorCreateList = NULL;
27 PetscFunctionList LMEMonitorDestroyList = NULL;
28 PetscBool LMEMonitorRegisterAllCalled = PETSC_FALSE;
29
30 /*@
31 LMEView - Prints the `LME` data structure.
32
33 Collective
34
35 Input Parameters:
36 + lme - the linear matrix equation solver context
37 - viewer - optional visualization context
38
39 Options Database Key:
40 . -lme_view - calls `LMEView()` at end of `LMESolve()`
41
42 Notes:
43 The available visualization contexts include
44 + `PETSC_VIEWER_STDOUT_SELF` - standard output (default)
45 - `PETSC_VIEWER_STDOUT_WORLD` - synchronized standard output where only the
46 first process opens the file; all other processes send their data to the
47 first one to print
48
49 The user can open an alternative visualization context with `PetscViewerASCIIOpen()`
50 to output to a specified file.
51
52 Level: beginner
53
54 .seealso: [](ch:lme), `LMECreate()`, `LMEViewFromOptions()`
55 @*/
56 20 PetscErrorCode LMEView(LME lme,PetscViewer viewer)
57 {
58 20 PetscBool isascii;
59
60
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
20 PetscFunctionBegin;
61
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.
20 PetscValidHeaderSpecific(lme,LME_CLASSID,1);
62
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.
20 if (!viewer) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)lme),&viewer));
63
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.
20 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
64
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.
20 PetscCheckSameComm(lme,1,viewer,2);
65
66
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.
20 PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii));
67
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
20 if (isascii) {
68
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.
20 PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)lme,viewer));
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.
20 PetscCall(PetscViewerASCIIPushTab(viewer));
70
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.
20 PetscTryTypeMethod(lme,view,viewer);
71
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.
20 PetscCall(PetscViewerASCIIPopTab(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.
20 PetscCall(PetscViewerASCIIPrintf(viewer," equation type: %s\n",LMEProblemTypes[lme->problem_type]));
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.
20 PetscCall(PetscViewerASCIIPrintf(viewer," number of column vectors (ncv): %" PetscInt_FMT "\n",lme->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.
20 PetscCall(PetscViewerASCIIPrintf(viewer," maximum number of iterations: %" PetscInt_FMT "\n",lme->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.
20 PetscCall(PetscViewerASCIIPrintf(viewer," tolerance: %g\n",(double)lme->tol));
76 ✗ } else PetscTryTypeMethod(lme,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.
20 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.
20 if (!lme->V) PetscCall(LMEGetBV(lme,&lme->V));
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.
20 PetscCall(BVView(lme->V,viewer));
80
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.
20 PetscCall(PetscViewerPopFormat(viewer));
81
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);
82 }
83
84 /*@
85 LMEViewFromOptions - View (print) an `LME` object based on values in the options database.
86
87 Collective
88
89 Input Parameters:
90 + lme - the linear matrix equation solver context
91 . obj - optional object that provides the options prefix used to query the options database
92 - name - command line option
93
94 Level: intermediate
95
96 .seealso: [](ch:lme), `LMEView()`, `LMECreate()`, `PetscObjectViewFromOptions()`
97 @*/
98 1044 PetscErrorCode LMEViewFromOptions(LME lme,PetscObject obj,const char name[])
99 {
100
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1044 PetscFunctionBegin;
101
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.
1044 PetscValidHeaderSpecific(lme,LME_CLASSID,1);
102
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.
1044 PetscCall(PetscObjectViewFromOptions((PetscObject)lme,obj,name));
103
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.
144 PetscFunctionReturn(PETSC_SUCCESS);
104 }
105 /*@
106 LMEConvergedReasonView - Displays the reason an `LME` solve converged or diverged.
107
108 Collective
109
110 Input Parameters:
111 + lme - the linear matrix equation solver context
112 - viewer - the viewer to display the reason
113
114 Options Database Key:
115 . -lme_converged_reason - print reason for convergence/divergence, and number of iterations
116
117 Notes:
118 Use `LMEConvergedReasonViewFromOptions()` to display the reason based on values
119 in the options database.
120
121 To change the format of the output call `PetscViewerPushFormat()` before this
122 call. Use `PETSC_VIEWER_DEFAULT` for the default, or `PETSC_VIEWER_FAILED` to only
123 display a reason if it fails. The latter can be set in the command line with
124 `-lme_converged_reason ::failed`.
125
126 Level: intermediate
127
128 .seealso: [](ch:lme), `LMESetTolerances()`, `LMEGetIterationNumber()`, `LMEConvergedReasonViewFromOptions()`
129 @*/
130 10 PetscErrorCode LMEConvergedReasonView(LME lme,PetscViewer viewer)
131 {
132 10 PetscBool isAscii;
133 10 PetscViewerFormat format;
134
135
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
10 PetscFunctionBegin;
136
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 if (!viewer) viewer = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)lme));
137
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.
10 PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isAscii));
138
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
10 if (isAscii) {
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.
10 PetscCall(PetscViewerGetFormat(viewer,&format));
140
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.
10 PetscCall(PetscViewerASCIIAddTab(viewer,((PetscObject)lme)->tablevel));
141
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.
10 if (lme->reason > 0 && format != PETSC_VIEWER_FAILED) PetscCall(PetscViewerASCIIPrintf(viewer,"%s Linear matrix equation solve converged due to %s; iterations %" PetscInt_FMT "\n",((PetscObject)lme)->prefix?((PetscObject)lme)->prefix:"",LMEConvergedReasons[lme->reason],lme->its));
142 ✗ else if (lme->reason <= 0) PetscCall(PetscViewerASCIIPrintf(viewer,"%s Linear matrix equation solve did not converge due to %s; iterations %" PetscInt_FMT "\n",((PetscObject)lme)->prefix?((PetscObject)lme)->prefix:"",LMEConvergedReasons[lme->reason],lme->its));
143
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.
10 PetscCall(PetscViewerASCIISubtractTab(viewer,((PetscObject)lme)->tablevel));
144 }
145
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.
2 PetscFunctionReturn(PETSC_SUCCESS);
146 }
147
148 /*@
149 LMEConvergedReasonViewFromOptions - Processes command line options to determine if/how
150 the `LME` converged reason is to be viewed.
151
152 Collective
153
154 Input Parameter:
155 . lme - the linear matrix equation solver context
156
157 Level: intermediate
158
159 .seealso: [](ch:lme), `LMEConvergedReasonView()`
160 @*/
161 522 PetscErrorCode LMEConvergedReasonViewFromOptions(LME lme)
162 {
163 522 PetscViewer viewer;
164 522 PetscBool flg;
165 522 static PetscBool incall = PETSC_FALSE;
166 522 PetscViewerFormat format;
167
168
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
522 PetscFunctionBegin;
169
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.
522 if (incall) PetscFunctionReturn(PETSC_SUCCESS);
170 522 incall = PETSC_TRUE;
171
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.
522 PetscCall(PetscOptionsCreateViewer(PetscObjectComm((PetscObject)lme),((PetscObject)lme)->options,((PetscObject)lme)->prefix,"-lme_converged_reason",&viewer,&format,&flg));
172
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
522 if (flg) {
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.
10 PetscCall(PetscViewerPushFormat(viewer,format));
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.
10 PetscCall(LMEConvergedReasonView(lme,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.
10 PetscCall(PetscViewerPopFormat(viewer));
176
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.
10 PetscCall(PetscViewerDestroy(&viewer));
177 }
178 522 incall = PETSC_FALSE;
179
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.
522 PetscFunctionReturn(PETSC_SUCCESS);
180 }
181
182 /*@
183 LMECreate - Creates the `LME` context.
184
185 Collective
186
187 Input Parameter:
188 . comm - MPI communicator
189
190 Output Parameter:
191 . outlme - location to put the `LME` context
192
193 Note:
194 The default `LME` type is `LMEKRYLOV`.
195
196 Level: beginner
197
198 .seealso: [](ch:lme), `LMESetUp()`, `LMESolve()`, `LMEDestroy()`, `LME`
199 @*/
200 204 PetscErrorCode LMECreate(MPI_Comm comm,LME *outlme)
201 {
202 204 LME lme;
203
204
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
204 PetscFunctionBegin;
205
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.
204 PetscAssertPointer(outlme,2);
206
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.
204 PetscCall(LMEInitializePackage());
207
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.
204 PetscCall(SlepcHeaderCreate(lme,LME_CLASSID,"LME","Linear Matrix Equation","LME",comm,LMEDestroy,LMEView));
208
209 204 lme->A = NULL;
210 204 lme->B = NULL;
211 204 lme->D = NULL;
212 204 lme->E = NULL;
213 204 lme->C = NULL;
214 204 lme->X = NULL;
215 204 lme->problem_type = LME_LYAPUNOV;
216 204 lme->max_it = PETSC_DETERMINE;
217 204 lme->ncv = PETSC_DETERMINE;
218 204 lme->tol = PETSC_DETERMINE;
219 204 lme->errorifnotconverged = PETSC_FALSE;
220
221 204 lme->numbermonitors = 0;
222
223 204 lme->V = NULL;
224 204 lme->nwork = 0;
225 204 lme->work = NULL;
226 204 lme->data = NULL;
227
228 204 lme->its = 0;
229 204 lme->errest = 0;
230 204 lme->setupcalled = 0;
231 204 lme->reason = LME_CONVERGED_ITERATING;
232
233 204 *outlme = lme;
234
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.
204 PetscFunctionReturn(PETSC_SUCCESS);
235 }
236
237 /*@
238 LMESetType - Selects the particular solver to be used in the `LME` object.
239
240 Logically Collective
241
242 Input Parameters:
243 + lme - the linear matrix equation solver context
244 - type - a known method
245
246 Options Database Key:
247 . -lme_type type - sets the method; use -help for a list of available methods
248
249 Notes:
250 See `LMEType` for available methods. The default is `LMEKRYLOV`.
251
252 Normally, it is best to use the `LMESetFromOptions()` command and
253 then set the `LME` type from the options database rather than by using
254 this routine. Using the options database provides the user with
255 maximum flexibility in evaluating the different available methods.
256 The `LMESetType()` routine is provided for those situations where it
257 is necessary to set the iterative solver independently of the command
258 line or options database.
259
260 Level: intermediate
261
262 .seealso: [](ch:lme), `LMEType`
263 @*/
264 103 PetscErrorCode LMESetType(LME lme,LMEType type)
265 {
266 103 PetscErrorCode (*r)(LME);
267 103 PetscBool match;
268
269
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
103 PetscFunctionBegin;
270
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.
103 PetscValidHeaderSpecific(lme,LME_CLASSID,1);
271
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.
103 PetscAssertPointer(type,2);
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.
103 PetscCall(PetscObjectTypeCompare((PetscObject)lme,type,&match));
274
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.
103 if (match) PetscFunctionReturn(PETSC_SUCCESS);
275
276
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.
103 PetscCall(PetscFunctionListFind(LMEList,type,&r));
277
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
103 PetscCheck(r,PetscObjectComm((PetscObject)lme),PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown LME type given: %s",type);
278
279
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.
103 PetscTryTypeMethod(lme,destroy);
280
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.
103 PetscCall(PetscMemzero(lme->ops,sizeof(struct _LMEOps)));
281
282 103 lme->setupcalled = 0;
283
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.
103 PetscCall(PetscObjectChangeTypeName((PetscObject)lme,type));
284
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.
103 PetscCall((*r)(lme));
285
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.
17 PetscFunctionReturn(PETSC_SUCCESS);
286 }
287
288 /*@
289 LMEGetType - Gets the `LME` type as a string from the `LME` object.
290
291 Not Collective
292
293 Input Parameter:
294 . lme - the linear matrix equation solver context
295
296 Output Parameter:
297 . type - name of `LME` method
298
299 Note:
300 `type` should not be retained for later use as it will be an invalid pointer
301 if the `LMEType` of `lme` is changed.
302
303 Level: intermediate
304
305 .seealso: [](ch:lme), `LMESetType()`, `PetscObjectTypeCompare()`, `PetscObjectTypeCompareAny()`
306 @*/
307 46 PetscErrorCode LMEGetType(LME lme,LMEType *type)
308 {
309
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
46 PetscFunctionBegin;
310
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.
46 PetscValidHeaderSpecific(lme,LME_CLASSID,1);
311
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.
46 PetscAssertPointer(type,2);
312 46 *type = ((PetscObject)lme)->type_name;
313
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.
46 PetscFunctionReturn(PETSC_SUCCESS);
314 }
315
316 /*@
317 LMERegister - Adds a method to the linear matrix equation solver package.
318
319 Not Collective
320
321 Input Parameters:
322 + name - name of a new user-defined solver
323 - function - routine to create the solver context
324
325 Note:
326 `LMERegister()` may be called multiple times to add several user-defined solvers.
327
328 Example Usage:
329 .vb
330 LMERegister("my_solver",MySolverCreate);
331 .ve
332
333 Then, your solver can be chosen with the procedural interface via
334 .vb
335 LMESetType(lme,"my_solver")
336 .ve
337 or at runtime via the option `-lme_type my_solver`.
338
339 Level: advanced
340
341 .seealso: [](ch:lme), `LMERegisterAll()`
342 @*/
343 144 PetscErrorCode LMERegister(const char *name,PetscErrorCode (*function)(LME))
344 {
345
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
144 PetscFunctionBegin;
346
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.
144 PetscCall(LMEInitializePackage());
347
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.
144 PetscCall(PetscFunctionListAdd(&LMEList,name,function));
348
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.
21 PetscFunctionReturn(PETSC_SUCCESS);
349 }
350
351 /*@
352 LMEMonitorRegister - Registers an `LME` monitor routine that may be accessed with
353 `LMEMonitorSetFromOptions()`.
354
355 Not Collective
356
357 Input Parameters:
358 + name - name of a new monitor routine
359 . vtype - a `PetscViewerType` for the output
360 . format - a `PetscViewerFormat` for the output
361 . monitor - monitor routine, see `LMEMonitorRegisterFn`
362 . create - creation routine, or `NULL`
363 - destroy - destruction routine, or `NULL`
364
365 Notes:
366 `LMEMonitorRegister()` may be called multiple times to add several user-defined monitors.
367
368 The calling sequence for the given function matches the calling sequence of `LMEMonitorFn`
369 functions passed to `LMEMonitorSet()` with the additional requirement that its final argument
370 be a `PetscViewerAndFormat`.
371
372 Example Usage:
373 .vb
374 LMEMonitorRegister("my_monitor",PETSCVIEWERASCII,PETSC_VIEWER_ASCII_INFO_DETAIL,MyMonitor,NULL,NULL);
375 .ve
376
377 Then, your monitor can be chosen with the procedural interface via
378 .vb
379 LMEMonitorSetFromOptions(lme,"-lme_monitor_my_monitor","my_monitor",NULL);
380 .ve
381 or at runtime via the option `-lme_monitor_my_monitor`.
382
383 Level: advanced
384
385 .seealso: [](ch:lme), `LMEMonitorSet()`, `LMEMonitorRegisterAll()`, `LMEMonitorSetFromOptions()`
386 @*/
387 288 PetscErrorCode LMEMonitorRegister(const char name[],PetscViewerType vtype,PetscViewerFormat format,LMEMonitorRegisterFn *monitor,LMEMonitorRegisterCreateFn *create,LMEMonitorRegisterDestroyFn *destroy)
388 {
389 288 char key[PETSC_MAX_PATH_LEN];
390
391
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
288 PetscFunctionBegin;
392
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.
288 PetscCall(LMEInitializePackage());
393
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.
288 PetscCall(SlepcMonitorMakeKey_Internal(name,vtype,format,key));
394
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.
288 PetscCall(PetscFunctionListAdd(&LMEMonitorList,key,monitor));
395
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.
288 if (create) PetscCall(PetscFunctionListAdd(&LMEMonitorCreateList,key,create));
396
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.
288 if (destroy) PetscCall(PetscFunctionListAdd(&LMEMonitorDestroyList,key,destroy));
397
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.
42 PetscFunctionReturn(PETSC_SUCCESS);
398 }
399
400 /*@
401 LMEReset - Resets the `LME` context to the initial state (prior to setup)
402 and destroys any allocated `Vec`s and `Mat`s.
403
404 Collective
405
406 Input Parameter:
407 . lme - the linear matrix equation solver context
408
409 Level: advanced
410
411 .seealso: [](ch:lme), `LMEDestroy()`
412 @*/
413 204 PetscErrorCode LMEReset(LME lme)
414 {
415
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
204 PetscFunctionBegin;
416
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.
204 if (lme) PetscValidHeaderSpecific(lme,LME_CLASSID,1);
417
1/12
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✗ 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.
185 if (!lme) PetscFunctionReturn(PETSC_SUCCESS);
418
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.
204 PetscTryTypeMethod(lme,reset);
419
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.
204 PetscCall(MatDestroy(&lme->A));
420
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.
204 PetscCall(MatDestroy(&lme->B));
421
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.
204 PetscCall(MatDestroy(&lme->D));
422
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.
204 PetscCall(MatDestroy(&lme->E));
423
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.
204 PetscCall(MatDestroy(&lme->C));
424
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.
204 PetscCall(MatDestroy(&lme->X));
425
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.
204 PetscCall(BVDestroy(&lme->V));
426
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.
204 PetscCall(VecDestroyVecs(lme->nwork,&lme->work));
427 204 lme->nwork = 0;
428 204 lme->setupcalled = 0;
429
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.
204 PetscFunctionReturn(PETSC_SUCCESS);
430 }
431
432 /*@
433 LMEDestroy - Destroys the `LME` context.
434
435 Collective
436
437 Input Parameter:
438 . lme - the linear matrix equation solver context
439
440 Level: beginner
441
442 .seealso: [](ch:lme), `LMECreate()`, `LMESetUp()`, `LMESolve()`
443 @*/
444 225 PetscErrorCode LMEDestroy(LME *lme)
445 {
446
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
225 PetscFunctionBegin;
447
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.
225 if (!*lme) PetscFunctionReturn(PETSC_SUCCESS);
448
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.
225 PetscValidHeaderSpecific(*lme,LME_CLASSID,1);
449
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.
225 if (--((PetscObject)*lme)->refct > 0) { *lme = NULL; PetscFunctionReturn(PETSC_SUCCESS); }
450
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.
204 PetscCall(LMEReset(*lme));
451
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.
204 PetscTryTypeMethod(*lme,destroy);
452
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.
204 PetscCall(LMEMonitorCancel(*lme));
453
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.
204 PetscCall(PetscHeaderDestroy(lme));
454
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.
19 PetscFunctionReturn(PETSC_SUCCESS);
455 }
456
457 /*@
458 LMESetBV - Associates a basis vectors object to the linear matrix equation solver.
459
460 Collective
461
462 Input Parameters:
463 + lme - the linear matrix equation solver context
464 - bv - the basis vectors object
465
466 Note:
467 Use `LMEGetBV()` to retrieve the basis vectors context (for example,
468 to free it at the end of the computations).
469
470 Level: advanced
471
472 .seealso: [](ch:lme), `LMEGetBV()`
473 @*/
474 ✗ PetscErrorCode LMESetBV(LME lme,BV bv)
475 {
476 ✗ PetscFunctionBegin;
477 ✗ PetscValidHeaderSpecific(lme,LME_CLASSID,1);
478 ✗ PetscValidHeaderSpecific(bv,BV_CLASSID,2);
479 ✗ PetscCheckSameComm(lme,1,bv,2);
480 ✗ PetscCall(PetscObjectReference((PetscObject)bv));
481 ✗ PetscCall(BVDestroy(&lme->V));
482 ✗ lme->V = bv;
483 ✗ PetscFunctionReturn(PETSC_SUCCESS);
484 }
485
486 /*@
487 LMEGetBV - Obtain the basis vectors object associated to the matrix
488 function solver.
489
490 Not Collective
491
492 Input Parameter:
493 . lme - the linear matrix equation solver context
494
495 Output Parameter:
496 . bv - basis vectors context
497
498 Level: advanced
499
500 .seealso: [](ch:lme), `LMESetBV()`
501 @*/
502 103 PetscErrorCode LMEGetBV(LME lme,BV *bv)
503 {
504
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
103 PetscFunctionBegin;
505
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.
103 PetscValidHeaderSpecific(lme,LME_CLASSID,1);
506
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.
103 PetscAssertPointer(bv,2);
507
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
103 if (!lme->V) {
508
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.
103 PetscCall(BVCreate(PetscObjectComm((PetscObject)lme),&lme->V));
509
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.
103 PetscCall(PetscObjectIncrementTabLevel((PetscObject)lme->V,(PetscObject)lme,0));
510
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.
103 PetscCall(PetscObjectSetOptions((PetscObject)lme->V,((PetscObject)lme)->options));
511 }
512 103 *bv = lme->V;
513
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.
103 PetscFunctionReturn(PETSC_SUCCESS);
514 }
515