GCC Code Coverage Report


Directory: ./
File: src/lme/interface/lmebasic.c
Date: 2025-11-19 04:19:03
Exec Total Coverage
Lines: 155 166 93.4%
Functions: 12 13 92.3%
Branches: 357 910 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 994 PetscErrorCode LMEViewFromOptions(LME lme,PetscObject obj,const char name[])
99 {
100
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
994 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.
994 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.
994 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.
142 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 497 PetscErrorCode LMEConvergedReasonViewFromOptions(LME lme)
162 {
163 497 PetscViewer viewer;
164 497 PetscBool flg;
165 497 static PetscBool incall = PETSC_FALSE;
166 497 PetscViewerFormat format;
167
168
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
497 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.
497 if (incall) PetscFunctionReturn(PETSC_SUCCESS);
170 497 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.
497 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.
497 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 497 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.
497 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 200 PetscErrorCode LMECreate(MPI_Comm comm,LME *outlme)
201 {
202 200 LME lme;
203
204
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
200 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.
200 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.
200 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.
200 PetscCall(SlepcHeaderCreate(lme,LME_CLASSID,"LME","Linear Matrix Equation","LME",comm,LMEDestroy,LMEView));
208
209 200 lme->A = NULL;
210 200 lme->B = NULL;
211 200 lme->D = NULL;
212 200 lme->E = NULL;
213 200 lme->C = NULL;
214 200 lme->X = NULL;
215 200 lme->problem_type = LME_LYAPUNOV;
216 200 lme->max_it = PETSC_DETERMINE;
217 200 lme->ncv = PETSC_DETERMINE;
218 200 lme->tol = PETSC_DETERMINE;
219 200 lme->errorifnotconverged = PETSC_FALSE;
220
221 200 lme->numbermonitors = 0;
222
223 200 lme->V = NULL;
224 200 lme->nwork = 0;
225 200 lme->work = NULL;
226 200 lme->data = NULL;
227
228 200 lme->its = 0;
229 200 lme->errest = 0;
230 200 lme->setupcalled = 0;
231 200 lme->reason = LME_CONVERGED_ITERATING;
232
233 200 *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.
200 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 99 PetscErrorCode LMESetType(LME lme,LMEType type)
265 {
266 99 PetscErrorCode (*r)(LME);
267 99 PetscBool match;
268
269
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
99 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.
99 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.
99 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.
99 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.
99 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.
99 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.
99 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.
99 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.
99 PetscCall(PetscMemzero(lme->ops,sizeof(struct _LMEOps)));
281
282 99 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.
99 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.
99 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.
16 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 Level: intermediate
300
301 .seealso: [](ch:lme), `LMESetType()`
302 @*/
303 44 PetscErrorCode LMEGetType(LME lme,LMEType *type)
304 {
305
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
44 PetscFunctionBegin;
306
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(lme,LME_CLASSID,1);
307
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);
308 44 *type = ((PetscObject)lme)->type_name;
309
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);
310 }
311
312 /*@C
313 LMERegister - Adds a method to the linear matrix equation solver package.
314
315 Not Collective
316
317 Input Parameters:
318 + name - name of a new user-defined solver
319 - function - routine to create the solver context
320
321 Note:
322 `LMERegister()` may be called multiple times to add several user-defined solvers.
323
324 Example Usage:
325 .vb
326 LMERegister("my_solver",MySolverCreate);
327 .ve
328
329 Then, your solver can be chosen with the procedural interface via
330 .vb
331 LMESetType(lme,"my_solver")
332 .ve
333 or at runtime via the option `-lme_type my_solver`.
334
335 Level: advanced
336
337 .seealso: [](ch:lme), `LMERegisterAll()`
338 @*/
339 138 PetscErrorCode LMERegister(const char *name,PetscErrorCode (*function)(LME))
340 {
341
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
138 PetscFunctionBegin;
342
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.
138 PetscCall(LMEInitializePackage());
343
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.
138 PetscCall(PetscFunctionListAdd(&LMEList,name,function));
344
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.
20 PetscFunctionReturn(PETSC_SUCCESS);
345 }
346
347 /*@C
348 LMEMonitorRegister - Registers an `LME` monitor routine that may be accessed with
349 `LMEMonitorSetFromOptions()`.
350
351 Not Collective
352
353 Input Parameters:
354 + name - name of a new monitor routine
355 . vtype - a `PetscViewerType` for the output
356 . format - a `PetscViewerFormat` for the output
357 . monitor - monitor routine, see `LMEMonitorRegisterFn`
358 . create - creation routine, or `NULL`
359 - destroy - destruction routine, or `NULL`
360
361 Notes:
362 `LMEMonitorRegister()` may be called multiple times to add several user-defined monitors.
363
364 The calling sequence for the given function matches the calling sequence of `LMEMonitorFn`
365 functions passed to `LMEMonitorSet()` with the additional requirement that its final argument
366 be a `PetscViewerAndFormat`.
367
368 Example Usage:
369 .vb
370 LMEMonitorRegister("my_monitor",PETSCVIEWERASCII,PETSC_VIEWER_ASCII_INFO_DETAIL,MyMonitor,NULL,NULL);
371 .ve
372
373 Then, your monitor can be chosen with the procedural interface via
374 .vb
375 LMEMonitorSetFromOptions(lme,"-lme_monitor_my_monitor","my_monitor",NULL);
376 .ve
377 or at runtime via the option `-lme_monitor_my_monitor`.
378
379 Level: advanced
380
381 .seealso: [](ch:lme), `LMEMonitorSet()`, `LMEMonitorRegisterAll()`, `LMEMonitorSetFromOptions()`
382 @*/
383 276 PetscErrorCode LMEMonitorRegister(const char name[],PetscViewerType vtype,PetscViewerFormat format,LMEMonitorRegisterFn *monitor,LMEMonitorRegisterCreateFn *create,LMEMonitorRegisterDestroyFn *destroy)
384 {
385 276 char key[PETSC_MAX_PATH_LEN];
386
387
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
276 PetscFunctionBegin;
388
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.
276 PetscCall(LMEInitializePackage());
389
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.
276 PetscCall(SlepcMonitorMakeKey_Internal(name,vtype,format,key));
390
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.
276 PetscCall(PetscFunctionListAdd(&LMEMonitorList,key,monitor));
391
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.
276 if (create) PetscCall(PetscFunctionListAdd(&LMEMonitorCreateList,key,create));
392
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.
276 if (destroy) PetscCall(PetscFunctionListAdd(&LMEMonitorDestroyList,key,destroy));
393
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.
40 PetscFunctionReturn(PETSC_SUCCESS);
394 }
395
396 /*@
397 LMEReset - Resets the `LME` context to the initial state (prior to setup)
398 and destroys any allocated `Vec`s and `Mat`s.
399
400 Collective
401
402 Input Parameter:
403 . lme - the linear matrix equation solver context
404
405 Level: advanced
406
407 .seealso: [](ch:lme), `LMEDestroy()`
408 @*/
409 200 PetscErrorCode LMEReset(LME lme)
410 {
411
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
200 PetscFunctionBegin;
412
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.
200 if (lme) PetscValidHeaderSpecific(lme,LME_CLASSID,1);
413
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.
190 if (!lme) PetscFunctionReturn(PETSC_SUCCESS);
414
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.
200 PetscTryTypeMethod(lme,reset);
415
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.
200 PetscCall(MatDestroy(&lme->A));
416
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.
200 PetscCall(MatDestroy(&lme->B));
417
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.
200 PetscCall(MatDestroy(&lme->D));
418
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.
200 PetscCall(MatDestroy(&lme->E));
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.
200 PetscCall(MatDestroy(&lme->C));
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.
200 PetscCall(MatDestroy(&lme->X));
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.
200 PetscCall(BVDestroy(&lme->V));
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.
200 PetscCall(VecDestroyVecs(lme->nwork,&lme->work));
423 200 lme->nwork = 0;
424 200 lme->setupcalled = 0;
425
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.
200 PetscFunctionReturn(PETSC_SUCCESS);
426 }
427
428 /*@
429 LMEDestroy - Destroys the `LME` context.
430
431 Collective
432
433 Input Parameter:
434 . lme - the linear matrix equation solver context
435
436 Level: beginner
437
438 .seealso: [](ch:lme), `LMECreate()`, `LMESetUp()`, `LMESolve()`
439 @*/
440 221 PetscErrorCode LMEDestroy(LME *lme)
441 {
442
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
221 PetscFunctionBegin;
443
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.
221 if (!*lme) PetscFunctionReturn(PETSC_SUCCESS);
444
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.
221 PetscValidHeaderSpecific(*lme,LME_CLASSID,1);
445
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.
221 if (--((PetscObject)*lme)->refct > 0) { *lme = NULL; PetscFunctionReturn(PETSC_SUCCESS); }
446
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.
200 PetscCall(LMEReset(*lme));
447
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.
200 PetscTryTypeMethod(*lme,destroy);
448
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.
200 PetscCall(LMEMonitorCancel(*lme));
449
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.
200 PetscCall(PetscHeaderDestroy(lme));
450
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.
18 PetscFunctionReturn(PETSC_SUCCESS);
451 }
452
453 /*@
454 LMESetBV - Associates a basis vectors object to the linear matrix equation solver.
455
456 Collective
457
458 Input Parameters:
459 + lme - the linear matrix equation solver context
460 - bv - the basis vectors object
461
462 Note:
463 Use `LMEGetBV()` to retrieve the basis vectors context (for example,
464 to free it at the end of the computations).
465
466 Level: advanced
467
468 .seealso: [](ch:lme), `LMEGetBV()`
469 @*/
470 PetscErrorCode LMESetBV(LME lme,BV bv)
471 {
472 PetscFunctionBegin;
473 PetscValidHeaderSpecific(lme,LME_CLASSID,1);
474 PetscValidHeaderSpecific(bv,BV_CLASSID,2);
475 PetscCheckSameComm(lme,1,bv,2);
476 PetscCall(PetscObjectReference((PetscObject)bv));
477 PetscCall(BVDestroy(&lme->V));
478 lme->V = bv;
479 PetscFunctionReturn(PETSC_SUCCESS);
480 }
481
482 /*@
483 LMEGetBV - Obtain the basis vectors object associated to the matrix
484 function solver.
485
486 Not Collective
487
488 Input Parameter:
489 . lme - the linear matrix equation solver context
490
491 Output Parameter:
492 . bv - basis vectors context
493
494 Level: advanced
495
496 .seealso: [](ch:lme), `LMESetBV()`
497 @*/
498 99 PetscErrorCode LMEGetBV(LME lme,BV *bv)
499 {
500
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
99 PetscFunctionBegin;
501
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.
99 PetscValidHeaderSpecific(lme,LME_CLASSID,1);
502
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.
99 PetscAssertPointer(bv,2);
503
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
99 if (!lme->V) {
504
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.
99 PetscCall(BVCreate(PetscObjectComm((PetscObject)lme),&lme->V));
505
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.
99 PetscCall(PetscObjectIncrementTabLevel((PetscObject)lme->V,(PetscObject)lme,0));
506
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.
99 PetscCall(PetscObjectSetOptions((PetscObject)lme->V,((PetscObject)lme)->options));
507 }
508 99 *bv = lme->V;
509
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.
99 PetscFunctionReturn(PETSC_SUCCESS);
510 }
511