GCC Code Coverage Report


Directory: ./
File: src/lme/impls/krylov/lmekrylov.c
Date: 2025-10-03 04:28:47
Exec Total Coverage
Lines: 121 123 98.4%
Functions: 4 4 100.0%
Branches: 318 480 66.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 SLEPc matrix equation solver: "krylov"
12
13 Method: Arnoldi with Eiermann-Ernst restart
14
15 Algorithm:
16
17 Project the equation onto the Arnoldi basis and solve the compressed
18 equation the Hessenberg matrix H, restart by discarding the Krylov
19 basis but keeping H.
20
21 References:
22
23 [1] Y. Saad, "Numerical solution of large Lyapunov equations", in
24 Signal processing, scattering and operator theory, and numerical
25 methods, vol. 5 of Progr. Systems Control Theory, pages 503-511,
26 1990.
27
28 [2] D. Kressner, "Memory-efficient Krylov subspace techniques for
29 solving large-scale Lyapunov equations", in 2008 IEEE Int. Conf.
30 Computer-Aided Control Systems, pages 613-618, 2008.
31 */
32
33 #include <slepc/private/lmeimpl.h>
34 #include <slepcblaslapack.h>
35
36 85 static PetscErrorCode LMESetUp_Krylov(LME lme)
37 {
38 85 PetscInt N;
39
40
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
85 PetscFunctionBegin;
41
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));
42
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
85 if (lme->ncv==PETSC_DETERMINE) lme->ncv = PetscMin(30,N);
43
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
85 if (lme->max_it==PETSC_DETERMINE) lme->max_it = 100;
44
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(LMEAllocateSolution(lme,1));
45
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);
46 }
47
48 729 static PetscErrorCode LMESolve_Krylov_Lyapunov_Vec(LME lme,Vec b,PetscBool fixed,PetscInt rrank,BV C1,BV *X1,PetscInt *col,PetscBool *fail,PetscInt *totalits)
49 {
50 729 PetscInt n=0,m,ldh,ldg=0,i,j,rank=0,lrank,pass,nouter=0,its;
51 729 PetscReal bnorm,beta,errest;
52 729 PetscBool breakdown;
53 729 PetscScalar *Harray,*G=NULL,*Gnew=NULL,*L=NULL,*U=NULL,*r,*Qarray,sone=1.0,zero=0.0;
54 729 PetscBLASInt n_,m_,rk_;
55 729 Mat Q,H;
56
57
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
729 PetscFunctionBegin;
58 729 *fail = PETSC_FALSE;
59 729 its = 0;
60 729 m = lme->ncv;
61 729 ldh = m+1;
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.
729 PetscCall(MatCreateSeqDense(PETSC_COMM_SELF,ldh,m,NULL,&H));
63
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.
729 PetscCall(MatDenseGetArray(H,&Harray));
64
65
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.
729 PetscCall(VecNorm(b,NORM_2,&bnorm));
66
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
729 PetscCheck(bnorm,PetscObjectComm((PetscObject)lme),PETSC_ERR_ARG_WRONG,"Cannot process a zero vector in the right-hand side");
67
68
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2187 for (pass=0;pass<2;pass++) {
69
70 /* set initial vector to b/||b|| */
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.
1458 PetscCall(BVInsertVec(lme->V,0,b));
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.
1458 PetscCall(BVScaleColumn(lme->V,0,1.0/bnorm));
73
74 /* Restart loop */
75
4/6
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
2307 while ((pass==0 && !*fail) || (pass==1 && its+1<nouter)) {
76 1578 its++;
77
78 /* compute Arnoldi factorization */
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.
1578 PetscCall(BVMatArnoldi(lme->V,lme->A,H,0,&m,&beta,&breakdown));
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.
1578 PetscCall(BVSetActiveColumns(lme->V,0,m));
81
82
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1578 if (pass==0) {
83 /* glue together the previous H and the new H obtained with Arnoldi */
84 789 ldg = n+m+1;
85
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.
789 PetscCall(PetscCalloc1(ldg*(n+m),&Gnew));
86
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
23451 for (j=0;j<m;j++) PetscCall(PetscArraycpy(Gnew+n+(j+n)*ldg,Harray+j*ldh,m));
87 789 Gnew[n+m+(n+m-1)*ldg] = beta;
88
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
789 if (G) {
89
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
1356 for (j=0;j<n;j++) PetscCall(PetscArraycpy(Gnew+j*ldg,G+j*(n+1),n+1));
90
6/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
60 PetscCall(PetscFree(G));
91 }
92 789 G = Gnew;
93 789 n += m;
94 } else {
95 /* update Z = Z + V(:,1:m)*Q with Q=U(blk,:)*P(1:nrk,:)' */
96
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.
789 PetscCall(MatCreateSeqDense(PETSC_COMM_SELF,m,*col+rank,NULL,&Q));
97
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.
789 PetscCall(MatDenseGetArray(Q,&Qarray));
98
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.
789 PetscCall(PetscBLASIntCast(m,&m_));
99
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.
789 PetscCall(PetscBLASIntCast(n,&n_));
100
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.
789 PetscCall(PetscBLASIntCast(rank,&rk_));
101
10/20
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ 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 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
789 PetscCallBLAS("BLASgemm",BLASgemm_("N","N",&m_,&rk_,&rk_,&sone,U+its*m,&n_,L,&n_,&zero,Qarray+(*col)*m,&m_));
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.
789 PetscCall(MatDenseRestoreArray(Q,&Qarray));
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.
789 PetscCall(BVSetActiveColumns(*X1,*col,*col+rank));
104
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
789 PetscCall(BVMult(*X1,1.0,1.0,lme->V,Q));
105
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.
789 PetscCall(MatDestroy(&Q));
106 }
107
108
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1578 if (pass==0) {
109 /* solve compressed Lyapunov equation */
110
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.
789 PetscCall(PetscCalloc1(n,&r));
111
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.
789 PetscCall(PetscCalloc1(n*n,&L));
112 789 r[0] = bnorm;
113 789 errest = PetscAbsScalar(G[n+(n-1)*ldg]);
114
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.
789 PetscCall(LMEDenseHessLyapunovChol(lme,n,G,ldg,1,r,n,L,n,&errest));
115
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.
789 PetscCall(LMEMonitor(lme,*totalits+its,errest));
116
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.
789 PetscCall(PetscFree(r));
117
118 /* check convergence */
119
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
789 if (errest<lme->tol) {
120 729 lme->errest += errest;
121
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.
729 PetscCall(PetscMalloc1(n*n,&U));
122 /* transpose L */
123
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
23391 for (j=0;j<n;j++) {
124
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
368973 for (i=j+1;i<n;i++) {
125 346311 L[i+j*n] = PetscConj(L[j+i*n]);
126 346311 L[j+i*n] = 0.0;
127 }
128 }
129
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.
729 PetscCall(LMEDenseRankSVD(lme,n,L,n,U,n,&lrank));
130
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.
729 PetscCall(PetscInfo(lme,"Rank of the Cholesky factor = %" PetscInt_FMT "\n",lrank));
131 729 nouter = its;
132 729 its = -1;
133
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
729 if (!fixed) { /* X1 was not set by user, allocate it with rank columns */
134 80 rank = lrank;
135
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.
80 if (*col) PetscCall(BVResize(*X1,*col+rank,PETSC_TRUE));
136
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
40 else PetscCall(BVDuplicateResize(C1,rank,X1));
137 649 } else rank = PetscMin(lrank,rrank);
138
6/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
729 PetscCall(PetscFree(G));
139 break;
140 } else {
141
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.
60 PetscCall(PetscFree(L));
142
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
60 if (*totalits+its>=lme->max_it) *fail = PETSC_TRUE;
143 }
144 }
145
146 /* restart with vector v_{m+1} */
147
8/10
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 2 times.
3156 if (!*fail) PetscCall(BVCopyColumn(lme->V,m,0));
148 }
149 }
150
151 729 *col += rank;
152 729 *totalits += its+1;
153
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.
729 PetscCall(MatDenseRestoreArray(H,&Harray));
154
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.
729 PetscCall(MatDestroy(&H));
155
6/10
✓ 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 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
729 if (L) PetscCall(PetscFree(L));
156
6/10
✓ 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 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
729 if (U) PetscCall(PetscFree(U));
157
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.
116 PetscFunctionReturn(PETSC_SUCCESS);
158 }
159
160 497 static PetscErrorCode LMESolve_Krylov_Lyapunov(LME lme)
161 {
162 497 PetscBool fail,fixed = lme->X? PETSC_TRUE: PETSC_FALSE;
163 497 PetscInt i,k,rank=0,col=0;
164 497 Vec b;
165 497 BV X1=NULL,C1;
166 497 Mat X1m,X1t,C1m;
167
168
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
497 PetscFunctionBegin;
169
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(lme->C,NULL,&C1m,NULL,NULL));
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.
497 PetscCall(BVCreateFromMat(C1m,&C1));
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(BVSetFromOptions(C1));
172
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
497 PetscCall(BVGetActiveColumns(C1,NULL,&k));
173
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
497 if (fixed) {
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.
457 PetscCall(MatLRCGetMats(lme->X,NULL,&X1m,NULL,NULL));
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.
457 PetscCall(BVCreateFromMat(X1m,&X1));
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.
457 PetscCall(BVSetFromOptions(X1));
177
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(BVGetActiveColumns(X1,NULL,&rank));
178 457 rank = rank/k;
179 }
180
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1226 for (i=0;i<k;i++) {
181
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.
729 PetscCall(BVGetColumn(C1,i,&b));
182
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.
729 PetscCall(LMESolve_Krylov_Lyapunov_Vec(lme,b,fixed,rank,C1,&X1,&col,&fail,&lme->its));
183
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.
729 PetscCall(BVRestoreColumn(C1,i,&b));
184
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
729 if (fail) {
185 lme->reason = LME_DIVERGED_ITS;
186 break;
187 }
188 }
189
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
497 if (lme->reason==LME_CONVERGED_ITERATING) lme->reason = LME_CONVERGED_TOL;
190
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(BVCreateMat(X1,&X1t));
191
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.
497 if (fixed) PetscCall(MatCopy(X1t,X1m,SAME_NONZERO_PATTERN));
192
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.
40 else PetscCall(MatCreateLRC(NULL,X1t,NULL,NULL,&lme->X));
193
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(&X1t));
194
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(BVDestroy(&C1));
195
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(BVDestroy(&X1));
196
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.
71 PetscFunctionReturn(PETSC_SUCCESS);
197 }
198
199 99 SLEPC_EXTERN PetscErrorCode LMECreate_Krylov(LME lme)
200 {
201
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
99 PetscFunctionBegin;
202 99 lme->ops->solve[LME_LYAPUNOV] = LMESolve_Krylov_Lyapunov;
203 99 lme->ops->setup = LMESetUp_Krylov;
204
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);
205 }
206