GCC Code Coverage Report


Directory: ./
File: src/lme/interface/lmesetup.c
Date: 2025-10-04 04:19:13
Exec Total Coverage
Lines: 126 137 92.0%
Functions: 10 10 100.0%
Branches: 291 886 32.8%

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 LME routines related to problem setup
12 */
13
14 #include <slepc/private/lmeimpl.h> /*I "slepclme.h" I*/
15
16 85 static inline PetscErrorCode LMESetUp_Lyapunov(LME lme)
17 {
18 85 Mat C1,C2,X1,X2;
19 85 Vec dc,dx;
20
21
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
85 PetscFunctionBegin;
22
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.
85 PetscCall(MatLRCGetMats(lme->C,NULL,&C1,&dc,&C2));
23
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
85 PetscCheck(C1==C2,PetscObjectComm((PetscObject)lme),PETSC_ERR_ARG_WRONGSTATE,"Lyapunov matrix equation requires symmetric right-hand side C");
24
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
85 PetscCheck(!dc,PetscObjectComm((PetscObject)lme),PETSC_ERR_ARG_WRONGSTATE,"Lyapunov solvers currently require positive-definite right-hand side C");
25
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
85 if (lme->X) {
26
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.
45 PetscCall(MatLRCGetMats(lme->X,NULL,&X1,&dx,&X2));
27
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
45 PetscCheck(X1==X2,PetscObjectComm((PetscObject)lme),PETSC_ERR_ARG_WRONGSTATE,"Lyapunov matrix equation requires symmetric solution X");
28
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
45 PetscCheck(!dx,PetscObjectComm((PetscObject)lme),PETSC_ERR_ARG_WRONGSTATE,"Lyapunov solvers currently assume a positive-definite solution X");
29 }
30
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);
31 }
32
33 /*@
34 LMESetUp - Sets up all the internal data structures necessary for the
35 execution of the linear matrix equation solver.
36
37 Collective
38
39 Input Parameter:
40 . lme - linear matrix equation solver context
41
42 Notes:
43 This function need not be called explicitly in most cases, since LMESolve()
44 calls it. It can be useful when one wants to measure the set-up time
45 separately from the solve time.
46
47 Level: developer
48
49 .seealso: LMECreate(), LMESolve(), LMEDestroy()
50 @*/
51 497 PetscErrorCode LMESetUp(LME lme)
52 {
53 497 PetscInt N;
54
55
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
497 PetscFunctionBegin;
56
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.
497 PetscValidHeaderSpecific(lme,LME_CLASSID,1);
57
58 /* reset the convergence flag from the previous solves */
59 497 lme->reason = LME_CONVERGED_ITERATING;
60
61
8/14
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
497 if (lme->setupcalled) PetscFunctionReturn(PETSC_SUCCESS);
62
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.
85 PetscCall(PetscLogEventBegin(LME_SetUp,lme,0,0,0));
63
64 /* Set default solver type (LMESetFromOptions was not called) */
65
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.
85 if (!((PetscObject)lme)->type_name) PetscCall(LMESetType(lme,LMEKRYLOV));
66
67 /* Check problem dimensions */
68
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
85 PetscCheck(lme->A,PetscObjectComm((PetscObject)lme),PETSC_ERR_ARG_WRONGSTATE,"LMESetCoefficients must be called first");
69
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
85 PetscCheck(lme->C,PetscObjectComm((PetscObject)lme),PETSC_ERR_ARG_WRONGSTATE,"LMESetRHS must be called first");
70
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
85 PetscCall(MatGetSize(lme->A,&N,NULL));
71
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
85 if (lme->ncv > N) lme->ncv = N;
72
73 /* setup options for the particular equation type */
74
1/6
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
85 switch (lme->problem_type) {
75 85 case LME_LYAPUNOV:
76
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.
85 PetscCall(LMESetUp_Lyapunov(lme));
77 break;
78 case LME_SYLVESTER:
79 LMECheckCoeff(lme,lme->B,"B","Sylvester");
80 break;
81 case LME_GEN_LYAPUNOV:
82 LMECheckCoeff(lme,lme->D,"D","Generalized Lyapunov");
83 break;
84 case LME_GEN_SYLVESTER:
85 LMECheckCoeff(lme,lme->B,"B","Generalized Sylvester");
86 LMECheckCoeff(lme,lme->D,"D","Generalized Sylvester");
87 LMECheckCoeff(lme,lme->E,"E","Generalized Sylvester");
88 break;
89 case LME_DT_LYAPUNOV:
90 break;
91 case LME_STEIN:
92 LMECheckCoeff(lme,lme->D,"D","Stein");
93 break;
94 }
95
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
85 PetscCheck(lme->problem_type==LME_LYAPUNOV,PetscObjectComm((PetscObject)lme),PETSC_ERR_SUP,"There is no solver yet for this matrix equation type");
96
97 /* call specific solver setup */
98
5/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
85 PetscUseTypeMethod(lme,setup);
99
100 /* set tolerance if not yet set */
101
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
85 if (lme->tol==(PetscReal)PETSC_DETERMINE) lme->tol = SLEPC_DEFAULT_TOL;
102
103
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.
85 PetscCall(PetscLogEventEnd(LME_SetUp,lme,0,0,0));
104 85 lme->setupcalled = 1;
105
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
85 PetscFunctionReturn(PETSC_SUCCESS);
106 }
107
108 85 static inline PetscErrorCode LMESetCoefficients_Private(LME lme,Mat A,Mat *lmeA)
109 {
110 85 PetscInt m,n;
111
112
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
85 PetscFunctionBegin;
113
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.
85 PetscCall(MatGetSize(A,&m,&n));
114
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
85 PetscCheck(m==n,PetscObjectComm((PetscObject)lme),PETSC_ERR_ARG_WRONG,"Matrix is non-square");
115
5/8
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ 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.
85 if (!lme->setupcalled) PetscCall(MatDestroy(lmeA));
116
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.
85 PetscCall(PetscObjectReference((PetscObject)A));
117 85 *lmeA = A;
118
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.
85 PetscFunctionReturn(PETSC_SUCCESS);
119 }
120
121 /*@
122 LMESetCoefficients - Sets the coefficient matrices that define the linear matrix
123 equation to be solved.
124
125 Collective
126
127 Input Parameters:
128 + lme - the matrix function context
129 . A - first coefficient matrix
130 . B - second coefficient matrix
131 . D - third coefficient matrix
132 - E - fourth coefficient matrix
133
134 Notes:
135 The matrix equation takes the general form A*X*E+D*X*B=C, where matrix C is not
136 provided here but with LMESetRHS(). Not all four matrices must be passed, some
137 can be NULL instead, see LMESetProblemType() for details.
138
139 It must be called before LMESetUp(). If it is called again after LMESetUp() then
140 the LME object is reset.
141
142 In order to delete a previously set matrix, pass a NULL in the corresponding
143 argument.
144
145 Level: beginner
146
147 .seealso: LMESolve(), LMESetUp(), LMESetRHS(), LMESetProblemType()
148 @*/
149 85 PetscErrorCode LMESetCoefficients(LME lme,Mat A,Mat B,Mat D,Mat E)
150 {
151
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
85 PetscFunctionBegin;
152
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.
85 PetscValidHeaderSpecific(lme,LME_CLASSID,1);
153
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.
85 PetscValidHeaderSpecific(A,MAT_CLASSID,2);
154
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.
85 PetscCheckSameComm(lme,1,A,2);
155
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
85 if (B) {
156
0/12
✗ Branch 0 not taken.
✗ 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.
69 PetscValidHeaderSpecific(B,MAT_CLASSID,3);
157
0/32
✗ Branch 0 not taken.
✗ 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.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
69 PetscCheckSameComm(lme,1,B,3);
158 }
159
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
85 if (D) {
160
0/12
✗ Branch 0 not taken.
✗ 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.
69 PetscValidHeaderSpecific(D,MAT_CLASSID,4);
161
0/32
✗ Branch 0 not taken.
✗ 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.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
69 PetscCheckSameComm(lme,1,D,4);
162 }
163
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
85 if (E) {
164
0/12
✗ Branch 0 not taken.
✗ 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.
69 PetscValidHeaderSpecific(E,MAT_CLASSID,5);
165
0/32
✗ Branch 0 not taken.
✗ 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.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
69 PetscCheckSameComm(lme,1,E,5);
166 }
167
168
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.
85 if (lme->setupcalled) PetscCall(LMEReset(lme));
169
170
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
85 PetscCall(LMESetCoefficients_Private(lme,A,&lme->A));
171
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.
85 if (B) PetscCall(LMESetCoefficients_Private(lme,B,&lme->B));
172
5/8
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ 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.
85 else if (!lme->setupcalled) PetscCall(MatDestroy(&lme->B));
173
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.
85 if (D) PetscCall(LMESetCoefficients_Private(lme,D,&lme->D));
174
5/8
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ 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.
85 else if (!lme->setupcalled) PetscCall(MatDestroy(&lme->D));
175
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.
85 if (E) PetscCall(LMESetCoefficients_Private(lme,E,&lme->E));
176
5/8
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ 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.
85 else if (!lme->setupcalled) PetscCall(MatDestroy(&lme->E));
177
178 85 lme->setupcalled = 0;
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.
85 PetscFunctionReturn(PETSC_SUCCESS);
180 }
181
182 /*@
183 LMEGetCoefficients - Gets the coefficient matrices of the matrix equation.
184
185 Collective
186
187 Input Parameter:
188 . lme - the LME context
189
190 Output Parameters:
191 + A - first coefficient matrix
192 . B - second coefficient matrix
193 . D - third coefficient matrix
194 - E - fourth coefficient matrix
195
196 Level: intermediate
197
198 .seealso: LMESolve(), LMESetCoefficients()
199 @*/
200 28 PetscErrorCode LMEGetCoefficients(LME lme,Mat *A,Mat *B,Mat *D,Mat *E)
201 {
202
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
28 PetscFunctionBegin;
203
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
28 PetscValidHeaderSpecific(lme,LME_CLASSID,1);
204
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
28 if (A) *A = lme->A;
205
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
28 if (B) *B = lme->B;
206
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
28 if (D) *D = lme->D;
207
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
28 if (E) *E = lme->E;
208
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.
28 PetscFunctionReturn(PETSC_SUCCESS);
209 }
210
211 /*@
212 LMESetRHS - Sets the right-hand side of the matrix equation, as a low-rank
213 matrix.
214
215 Collective
216
217 Input Parameters:
218 + lme - the matrix function context
219 - C - the right-hand side matrix
220
221 Notes:
222 The matrix equation takes the general form A*X*E+D*X*B=C, where matrix C is
223 given with this function. C must be a low-rank matrix of type MATLRC, that is,
224 C = U*D*V' where D is diagonal of order k, and U, V are dense tall-skinny
225 matrices with k columns. No sparse matrix must be provided when creating the
226 MATLRC matrix.
227
228 In equation types that require C to be symmetric, such as Lyapunov, C must be
229 created with V=U (or V=NULL).
230
231 Level: beginner
232
233 .seealso: LMESetSolution(), LMESetProblemType()
234 @*/
235 497 PetscErrorCode LMESetRHS(LME lme,Mat C)
236 {
237 497 Mat A;
238
239
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
497 PetscFunctionBegin;
240
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.
497 PetscValidHeaderSpecific(lme,LME_CLASSID,1);
241
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.
497 PetscValidHeaderSpecific(C,MAT_CLASSID,2);
242
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.
497 PetscCheckSameComm(lme,1,C,2);
243
4/10
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
497 PetscCheckTypeName(C,MATLRC);
244
245
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(MatLRCGetMats(C,&A,NULL,NULL,NULL));
246
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
497 PetscCheck(!A,PetscObjectComm((PetscObject)C),PETSC_ERR_SUP,"The MatLRC must not have a sparse matrix term");
247
248
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(PetscObjectReference((PetscObject)C));
249
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(MatDestroy(&lme->C));
250 497 lme->C = C;
251
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);
252 }
253
254 /*@
255 LMEGetRHS - Gets the right-hand side of the matrix equation.
256
257 Collective
258
259 Input Parameter:
260 . lme - the LME context
261
262 Output Parameters:
263 . C - the low-rank matrix
264
265 Level: intermediate
266
267 .seealso: LMESolve(), LMESetRHS()
268 @*/
269 28 PetscErrorCode LMEGetRHS(LME lme,Mat *C)
270 {
271
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
28 PetscFunctionBegin;
272
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
28 PetscValidHeaderSpecific(lme,LME_CLASSID,1);
273
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.
28 PetscAssertPointer(C,2);
274 28 *C = lme->C;
275
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.
28 PetscFunctionReturn(PETSC_SUCCESS);
276 }
277
278 /*@
279 LMESetSolution - Sets the placeholder for the solution of the matrix
280 equation, as a low-rank matrix.
281
282 Collective
283
284 Input Parameters:
285 + lme - the matrix function context
286 - X - the solution matrix
287
288 Notes:
289 The matrix equation takes the general form A*X*E+D*X*B=C, where the solution
290 matrix is of low rank and is written in factored form X = U*D*V'. This function
291 provides a Mat object of type MATLRC that stores U, V and (optionally) D.
292 These factors will be computed during LMESolve().
293
294 In equation types whose solution X is symmetric, such as Lyapunov, X must be
295 created with V=U (or V=NULL).
296
297 If the user provides X with this function, then the solver will
298 return a solution with rank at most the number of columns of U. Alternatively,
299 it is possible to let the solver choose the rank of the solution, by
300 setting X to NULL and then calling LMEGetSolution() after LMESolve().
301
302 Level: intermediate
303
304 .seealso: LMEGetSolution(), LMESetRHS(), LMESetProblemType(), LMESolve()
305 @*/
306 457 PetscErrorCode LMESetSolution(LME lme,Mat X)
307 {
308 457 Mat A;
309
310
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
457 PetscFunctionBegin;
311
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.
457 PetscValidHeaderSpecific(lme,LME_CLASSID,1);
312
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
457 if (X) {
313
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.
457 PetscValidHeaderSpecific(X,MAT_CLASSID,2);
314
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.
457 PetscCheckSameComm(lme,1,X,2);
315
4/10
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
457 PetscCheckTypeName(X,MATLRC);
316
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.
457 PetscCall(MatLRCGetMats(X,&A,NULL,NULL,NULL));
317
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
457 PetscCheck(!A,PetscObjectComm((PetscObject)X),PETSC_ERR_SUP,"The MatLRC must not have a sparse matrix term");
318
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.
457 PetscCall(PetscObjectReference((PetscObject)X));
319 }
320
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.
457 PetscCall(MatDestroy(&lme->X));
321 457 lme->X = X;
322
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.
457 PetscFunctionReturn(PETSC_SUCCESS);
323 }
324
325 /*@
326 LMEGetSolution - Gets the solution of the matrix equation.
327
328 Collective
329
330 Input Parameter:
331 . lme - the LME context
332
333 Output Parameters:
334 . X - the low-rank matrix
335
336 Level: intermediate
337
338 .seealso: LMESolve(), LMESetSolution()
339 @*/
340 12 PetscErrorCode LMEGetSolution(LME lme,Mat *X)
341 {
342
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
12 PetscFunctionBegin;
343
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.
12 PetscValidHeaderSpecific(lme,LME_CLASSID,1);
344
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.
12 PetscAssertPointer(X,2);
345 12 *X = lme->X;
346
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.
12 PetscFunctionReturn(PETSC_SUCCESS);
347 }
348
349 /*@
350 LMEAllocateSolution - Allocate memory storage for common variables such
351 as the basis vectors.
352
353 Collective
354
355 Input Parameters:
356 + lme - linear matrix equation solver context
357 - extra - number of additional positions, used for methods that require a
358 working basis slightly larger than ncv
359
360 Developer Notes:
361 This is SLEPC_EXTERN because it may be required by user plugin LME
362 implementations.
363
364 Level: developer
365
366 .seealso: LMESetUp()
367 @*/
368 85 PetscErrorCode LMEAllocateSolution(LME lme,PetscInt extra)
369 {
370 85 PetscInt oldsize,requested;
371 85 Vec t;
372
373
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
85 PetscFunctionBegin;
374 85 requested = lme->ncv + extra;
375
376 /* oldsize is zero if this is the first time setup is called */
377
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.
85 PetscCall(BVGetSizes(lme->V,NULL,NULL,&oldsize));
378
379 /* allocate basis vectors */
380
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.
85 if (!lme->V) PetscCall(LMEGetBV(lme,&lme->V));
381
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
85 if (!oldsize) {
382
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.
85 if (!((PetscObject)lme->V)->type_name) PetscCall(BVSetType(lme->V,BVMAT));
383
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
85 PetscCall(MatCreateVecsEmpty(lme->A,&t,NULL));
384
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
85 PetscCall(BVSetSizesFromVec(lme->V,t,requested));
385
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.
85 PetscCall(VecDestroy(&t));
386 } else PetscCall(BVResize(lme->V,requested,PETSC_FALSE));
387
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
16 PetscFunctionReturn(PETSC_SUCCESS);
388 }
389