GCC Code Coverage Report


Directory: ./
File: src/lme/interface/lmebasic.c
Date: 2026-06-15 03:58:11
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 998 PetscErrorCode LMEViewFromOptions(LME lme,PetscObject obj,const char name[])
99 {
100
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
998 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.
998 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.
998 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 499 PetscErrorCode LMEConvergedReasonViewFromOptions(LME lme)
162 {
163 499 PetscViewer viewer;
164 499 PetscBool flg;
165 499 static PetscBool incall = PETSC_FALSE;
166 499 PetscViewerFormat format;
167
168
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
499 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.
499 if (incall) PetscFunctionReturn(PETSC_SUCCESS);
170 499 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.
499 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.
499 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 499 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.
499 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 202 PetscErrorCode LMECreate(MPI_Comm comm,LME *outlme)
201 {
202 202 LME lme;
203
204
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
202 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.
202 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.
202 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.
202 PetscCall(SlepcHeaderCreate(lme,LME_CLASSID,"LME","Linear Matrix Equation","LME",comm,LMEDestroy,LMEView));
208
209 202 lme->A = NULL;
210 202 lme->B = NULL;
211 202 lme->D = NULL;
212 202 lme->E = NULL;
213 202 lme->C = NULL;
214 202 lme->X = NULL;
215 202 lme->problem_type = LME_LYAPUNOV;
216 202 lme->max_it = PETSC_DETERMINE;
217 202 lme->ncv = PETSC_DETERMINE;
218 202 lme->tol = PETSC_DETERMINE;
219 202 lme->errorifnotconverged = PETSC_FALSE;
220
221 202 lme->numbermonitors = 0;
222
223 202 lme->V = NULL;
224 202 lme->nwork = 0;
225 202 lme->work = NULL;
226 202 lme->data = NULL;
227
228 202 lme->its = 0;
229 202 lme->errest = 0;
230 202 lme->setupcalled = 0;
231 202 lme->reason = LME_CONVERGED_ITERATING;
232
233 202 *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.
202 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 101 PetscErrorCode LMESetType(LME lme,LMEType type)
265 {
266 101 PetscErrorCode (*r)(LME);
267 101 PetscBool match;
268
269
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
101 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.
101 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.
101 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.
101 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.
101 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.
101 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.
101 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.
101 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.
101 PetscCall(PetscMemzero(lme->ops,sizeof(struct _LMEOps)));
281
282 101 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.
101 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.
101 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 /*@C
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 142 PetscErrorCode LMERegister(const char *name,PetscErrorCode (*function)(LME))
344 {
345
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
142 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.
142 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.
142 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 /*@C
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 284 PetscErrorCode LMEMonitorRegister(const char name[],PetscViewerType vtype,PetscViewerFormat format,LMEMonitorRegisterFn *monitor,LMEMonitorRegisterCreateFn *create,LMEMonitorRegisterDestroyFn *destroy)
388 {
389 284 char key[PETSC_MAX_PATH_LEN];
390
391
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
284 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.
284 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.
284 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.
284 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.
284 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.
284 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 202 PetscErrorCode LMEReset(LME lme)
414 {
415
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
202 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.
202 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.
183 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.
202 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.
202 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.
202 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.
202 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.
202 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.
202 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.
202 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.
202 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.
202 PetscCall(VecDestroyVecs(lme->nwork,&lme->work));
427 202 lme->nwork = 0;
428 202 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.
202 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 223 PetscErrorCode LMEDestroy(LME *lme)
445 {
446
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
223 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.
223 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.
223 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.
223 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.
202 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.
202 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.
202 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.
202 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 101 PetscErrorCode LMEGetBV(LME lme,BV *bv)
503 {
504
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
101 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.
101 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.
101 PetscAssertPointer(bv,2);
507
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
101 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.
101 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.
101 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.
101 PetscCall(PetscObjectSetOptions((PetscObject)lme->V,((PetscObject)lme)->options));
511 }
512 101 *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.
101 PetscFunctionReturn(PETSC_SUCCESS);
514 }
515