GCC Code Coverage Report


Directory: ./
File: src/eps/impls/davidson/dvdimprovex.c
Date: 2026-10-22 02:08:06
Exec Total Coverage
Lines: 576 609 94.6%
Functions: 23 23 100.0%
Branches: 1514 2502 60.5%

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 eigensolver: "davidson"
12
13 Step: improve the eigenvectors X
14 */
15
16 #include "davidson.h"
17 #include <slepcblaslapack.h>
18
19 /**** JD update step (I - Kfg'/(g'Kf)) K(A - sB) (I - Kfg'/(g'Kf)) t = (I - Kfg'/(g'Kf))r ****/
20
21 typedef struct {
22 PetscInt size_X;
23 KSP ksp; /* correction equation solver */
24 Vec friends; /* reference vector for composite vectors */
25 PetscScalar theta[4],thetai[2]; /* the shifts used in the correction eq. */
26 PetscInt maxits; /* maximum number of iterations */
27 PetscInt r_s,r_e; /* the selected eigenpairs to improve */
28 PetscInt ksp_max_size; /* the ksp maximum subvectors size */
29 PetscReal tol; /* the maximum solution tolerance */
30 PetscReal lastTol; /* last tol for dynamic stopping criterion */
31 PetscReal fix; /* tolerance for using the approx. eigenvalue */
32 PetscBool dynamic; /* if the dynamic stopping criterion is applied */
33 dvdDashboard *d; /* the current dvdDashboard reference */
34 PC old_pc; /* old pc in ksp */
35 BV KZ; /* KZ vecs for the projector KZ*inv(X'*KZ)*X' */
36 BV U; /* new X vectors */
37 PetscScalar *XKZ; /* X'*KZ */
38 PetscScalar *iXKZ; /* inverse of XKZ */
39 PetscInt ldXKZ; /* leading dimension of XKZ */
40 PetscInt size_iXKZ; /* size of iXKZ */
41 PetscInt ldiXKZ; /* leading dimension of iXKZ */
42 PetscInt size_cX; /* last value of d->size_cX */
43 PetscInt old_size_X; /* last number of improved vectors */
44 PetscBLASInt *iXKZPivots; /* array of pivots */
45 } dvdImprovex_jd;
46
47 /*
48 Compute (I - KZ*iXKZ*X')*V where,
49 V, the vectors to apply the projector,
50 cV, the number of vectors in V,
51 */
52 370928 static PetscErrorCode dvd_improvex_apply_proj(dvdDashboard *d,Vec *V,PetscInt cV)
53 {
54 370928 dvdImprovex_jd *data = (dvdImprovex_jd*)d->improveX_data;
55 370928 PetscInt i,ldh,k,l;
56 370928 PetscScalar *h;
57 370928 PetscBLASInt cV_,n,ld;
58 #if PetscDefined(USE_COMPLEX)
59 298879 PetscInt j;
60 #endif
61
62
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
370928 PetscFunctionBegin;
63
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
370928 PetscAssert(cV<=2,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Consistency broken");
64
65 /* h <- X'*V */
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.
370928 PetscCall(PetscMalloc1(data->size_iXKZ*cV,&h));
67 370928 ldh = data->size_iXKZ;
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.
370928 PetscCall(BVGetActiveColumns(data->U,&l,&k));
69
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
370928 PetscAssert(ldh==k,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Consistency broken");
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.
370928 PetscCall(BVSetActiveColumns(data->U,0,k));
71
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
742545 for (i=0;i<cV;i++) {
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.
371617 PetscCall(BVDotVec(data->U,V[i],&h[ldh*i]));
73 #if PetscDefined(USE_COMPLEX)
74
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
597758 for (j=0; j<k; j++) h[ldh*i+j] = PetscConj(h[ldh*i+j]);
75 #endif
76 }
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.
370928 PetscCall(BVSetActiveColumns(data->U,l,k));
78
79 /* h <- iXKZ\h */
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.
370928 PetscCall(PetscBLASIntCast(cV,&cV_));
81
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.
370928 PetscCall(PetscBLASIntCast(data->size_iXKZ,&n));
82
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.
370928 PetscCall(PetscBLASIntCast(data->ldiXKZ,&ld));
83
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.
370928 PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
84
16/32
✓ 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 taken 2 times.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✓ 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.
370928 PetscCallLAPACKInfo("LAPACKgetrs",LAPACKgetrs_("N",&n,&cV_,data->iXKZ,&ld,data->iXKZPivots,h,&n,&info));
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.
370928 PetscCall(PetscFPTrapPop());
86
87 /* V <- V - KZ*h */
88
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.
370928 PetscCall(BVSetActiveColumns(data->KZ,0,k));
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.
742545 for (i=0;i<cV;i++) PetscCall(BVMultVec(data->KZ,-1.0,1.0,V[i],&h[ldh*i]));
90
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.
370928 PetscCall(BVSetActiveColumns(data->KZ,l,k));
91
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
370928 PetscCall(PetscFree(h));
92
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
73549 PetscFunctionReturn(PETSC_SUCCESS);
93 }
94
95 /*
96 Compute (I - X*iXKZ*KZ')*V where,
97 V, the vectors to apply the projector,
98 cV, the number of vectors in V,
99 */
100 6767 static PetscErrorCode dvd_improvex_applytrans_proj(dvdDashboard *d,Vec *V,PetscInt cV)
101 {
102 6767 dvdImprovex_jd *data = (dvdImprovex_jd*)d->improveX_data;
103 6767 PetscInt i,ldh,k,l;
104 6767 PetscScalar *h;
105 6767 PetscBLASInt cV_,n,ld;
106 #if PetscDefined(USE_COMPLEX)
107 6289 PetscInt j;
108 #endif
109
110
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
6767 PetscFunctionBegin;
111
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6767 PetscAssert(cV<=2,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Consistency broken");
112
113 /* h <- KZ'*V */
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.
6767 PetscCall(PetscMalloc1(data->size_iXKZ*cV,&h));
115 6767 ldh = data->size_iXKZ;
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.
6767 PetscCall(BVGetActiveColumns(data->U,&l,&k));
117
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6767 PetscAssert(ldh==k,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Consistency broken");
118
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.
6767 PetscCall(BVSetActiveColumns(data->KZ,0,k));
119
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
13534 for (i=0;i<cV;i++) {
120
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.
6767 PetscCall(BVDotVec(data->KZ,V[i],&h[ldh*i]));
121 #if PetscDefined(USE_COMPLEX)
122
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
12578 for (j=0;j<k;j++) h[ldh*i+j] = PetscConj(h[ldh*i+j]);
123 #endif
124 }
125
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.
6767 PetscCall(BVSetActiveColumns(data->KZ,l,k));
126
127 /* h <- iXKZ\h */
128
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.
6767 PetscCall(PetscBLASIntCast(cV,&cV_));
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.
6767 PetscCall(PetscBLASIntCast(data->size_iXKZ,&n));
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.
6767 PetscCall(PetscBLASIntCast(data->ldiXKZ,&ld));
131
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.
6767 PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
132
16/32
✓ 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 taken 2 times.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✓ 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.
6767 PetscCallLAPACKInfo("LAPACKgetrs",LAPACKgetrs_("C",&n,&cV_,data->iXKZ,&ld,data->iXKZPivots,h,&n,&info));
133
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.
6767 PetscCall(PetscFPTrapPop());
134
135 /* V <- V - U*h */
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.
6767 PetscCall(BVSetActiveColumns(data->U,0,k));
137
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.
13534 for (i=0;i<cV;i++) PetscCall(BVMultVec(data->U,-1.0,1.0,V[i],&h[ldh*i]));
138
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.
6767 PetscCall(BVSetActiveColumns(data->U,l,k));
139
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
6767 PetscCall(PetscFree(h));
140
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
1334 PetscFunctionReturn(PETSC_SUCCESS);
141 }
142
143 814 static PetscErrorCode dvd_improvex_jd_end(dvdDashboard *d)
144 {
145 814 dvdImprovex_jd *data = (dvdImprovex_jd*)d->improveX_data;
146
147
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
814 PetscFunctionBegin;
148
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.
814 PetscCall(VecDestroy(&data->friends));
149
150 /* Restore the pc of ksp */
151
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
814 if (data->old_pc) {
152
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.
194 PetscCall(KSPSetPC(data->ksp, data->old_pc));
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.
194 PetscCall(PCDestroy(&data->old_pc));
154 }
155
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
158 PetscFunctionReturn(PETSC_SUCCESS);
156 }
157
158 814 static PetscErrorCode dvd_improvex_jd_d(dvdDashboard *d)
159 {
160 814 dvdImprovex_jd *data = (dvdImprovex_jd*)d->improveX_data;
161
162
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
814 PetscFunctionBegin;
163 /* Free local data and objects */
164
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
814 PetscCall(PetscFree(data->XKZ));
165
5/8
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
814 PetscCall(PetscFree(data->iXKZ));
166
5/8
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
814 PetscCall(PetscFree(data->iXKZPivots));
167
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.
814 PetscCall(BVDestroy(&data->KZ));
168
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.
814 PetscCall(BVDestroy(&data->U));
169
6/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
814 PetscCall(PetscFree(data));
170
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
158 PetscFunctionReturn(PETSC_SUCCESS);
171 }
172
173 /*
174 y <- theta[1]A*x - theta[0]*B*x
175 auxV, two auxiliary vectors
176 */
177 447568 static inline PetscErrorCode dvd_aux_matmult(dvdImprovex_jd *data,const Vec *x,const Vec *y)
178 {
179 447568 PetscInt n,i;
180 447568 const Vec *Bx;
181 447568 Vec *auxV;
182
183
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
447568 PetscFunctionBegin;
184 447568 n = data->r_e - data->r_s;
185
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.
895588 for (i=0;i<n;i++) PetscCall(MatMult(data->d->A,x[i],y[i]));
186
187
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.
447568 PetscCall(SlepcVecPoolGetVecs(data->d->auxV,2,&auxV));
188
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
895136 for (i=0;i<n;i++) {
189 #if !PetscDefined(USE_COMPLEX)
190
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
101333 if (PetscUnlikely(data->d->eigi[data->r_s+i] != 0.0)) {
191
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
452 if (data->d->B) {
192 ✗ PetscCall(MatMult(data->d->B,x[i],auxV[0]));
193 ✗ PetscCall(MatMult(data->d->B,x[i+1],auxV[1]));
194 ✗ Bx = auxV;
195 452 } else Bx = &x[i];
196
197 /* y_i <- [ t_2i+1*A*x_i - t_2i*Bx_i + ti_i*Bx_i+1;
198 y_i+1 t_2i+1*A*x_i+1 - ti_i*Bx_i - t_2i*Bx_i+1 ] */
199
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
452 PetscCall(VecAXPBYPCZ(y[i],-data->theta[2*i],data->thetai[i],data->theta[2*i+1],Bx[0],Bx[1]));
200
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
452 PetscCall(VecAXPBYPCZ(y[i+1],-data->thetai[i],-data->theta[2*i],data->theta[2*i+1],Bx[0],Bx[1]));
201 452 i++;
202 } else
203 #endif
204 {
205
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
447116 if (data->d->B) {
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.
95774 PetscCall(MatMult(data->d->B,x[i],auxV[0]));
207 95774 Bx = auxV;
208 351342 } else Bx = &x[i];
209
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.
447568 PetscCall(VecAXPBY(y[i],-data->theta[i*2],data->theta[i*2+1],Bx[0]));
210 }
211 }
212
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.
447568 PetscCall(SlepcVecPoolRestoreVecs(data->d->auxV,2,&auxV));
213
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
86105 PetscFunctionReturn(PETSC_SUCCESS);
214 }
215
216 /*
217 y <- theta[1]'*A'*x - theta[0]'*B'*x
218 */
219 6483 static inline PetscErrorCode dvd_aux_matmulttrans(dvdImprovex_jd *data,const Vec *x,const Vec *y)
220 {
221 6483 PetscInt n,i;
222 6483 const Vec *Bx;
223 6483 Vec *auxV;
224
225
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
6483 PetscFunctionBegin;
226 6483 n = data->r_e - data->r_s;
227
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.
12966 for (i=0;i<n;i++) PetscCall(MatMultTranspose(data->d->A,x[i],y[i]));
228
229
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.
6483 PetscCall(SlepcVecPoolGetVecs(data->d->auxV,2,&auxV));
230
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
12966 for (i=0;i<n;i++) {
231 #if !PetscDefined(USE_COMPLEX)
232
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
407 if (data->d->eigi[data->r_s+i] != 0.0) {
233 ✗ if (data->d->B) {
234 ✗ PetscCall(MatMultTranspose(data->d->B,x[i],auxV[0]));
235 ✗ PetscCall(MatMultTranspose(data->d->B,x[i+1],auxV[1]));
236 ✗ Bx = auxV;
237 ✗ } else Bx = &x[i];
238
239 /* y_i <- [ t_2i+1*A*x_i - t_2i*Bx_i - ti_i*Bx_i+1;
240 y_i+1 t_2i+1*A*x_i+1 + ti_i*Bx_i - t_2i*Bx_i+1 ] */
241 ✗ PetscCall(VecAXPBYPCZ(y[i],-data->theta[2*i],-data->thetai[i],data->theta[2*i+1],Bx[0],Bx[1]));
242 ✗ PetscCall(VecAXPBYPCZ(y[i+1],data->thetai[i],-data->theta[2*i],data->theta[2*i+1],Bx[0],Bx[1]));
243 ✗ i++;
244 } else
245 #endif
246 {
247
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
6483 if (data->d->B) {
248 ✗ PetscCall(MatMultTranspose(data->d->B,x[i],auxV[0]));
249 ✗ Bx = auxV;
250 6483 } else Bx = &x[i];
251
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.
6483 PetscCall(VecAXPBY(y[i],PetscConj(-data->theta[i*2]),PetscConj(data->theta[i*2+1]),Bx[0]));
252 }
253 }
254
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.
6483 PetscCall(SlepcVecPoolRestoreVecs(data->d->auxV,2,&auxV));
255
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
1278 PetscFunctionReturn(PETSC_SUCCESS);
256 }
257
258 315464 static PetscErrorCode PCApplyBA_dvd(PC pc,PCSide side,Vec in,Vec out,Vec w)
259 {
260 315464 dvdImprovex_jd *data;
261 315464 PetscInt n,i;
262 315464 const Vec *inx,*outx,*wx;
263 315464 Vec *auxV;
264 315464 Mat A;
265
266
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
315464 PetscFunctionBegin;
267
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.
315464 PetscCall(PCGetOperators(pc,&A,NULL));
268
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.
315464 PetscCall(MatShellGetContext(A,&data));
269
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.
315464 PetscCall(VecCompGetSubVecs(in,NULL,&inx));
270
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.
315464 PetscCall(VecCompGetSubVecs(out,NULL,&outx));
271
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.
315464 PetscCall(VecCompGetSubVecs(w,NULL,&wx));
272 315464 n = data->r_e - data->r_s;
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.
315464 PetscCall(SlepcVecPoolGetVecs(data->d->auxV,n,&auxV));
274
1/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
315464 switch (side) {
275 315464 case PC_LEFT:
276 /* aux <- theta[1]A*in - theta[0]*B*in */
277
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.
315464 PetscCall(dvd_aux_matmult(data,inx,auxV));
278
279 /* out <- K * aux */
280
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.
631380 for (i=0;i<n;i++) PetscCall(data->d->improvex_precond(data->d,data->r_s+i,auxV[i],outx[i]));
281 break;
282 case PC_RIGHT:
283 /* aux <- K * in */
284 ✗ for (i=0;i<n;i++) PetscCall(data->d->improvex_precond(data->d,data->r_s+i,inx[i],auxV[i]));
285
286 /* out <- theta[1]A*auxV - theta[0]*B*auxV */
287 ✗ PetscCall(dvd_aux_matmult(data,auxV,outx));
288 break;
289 case PC_SYMMETRIC:
290 /* aux <- K^{1/2} * in */
291 ✗ for (i=0;i<n;i++) PetscCall(PCApplySymmetricRight(data->old_pc,inx[i],auxV[i]));
292
293 /* wx <- theta[1]A*auxV - theta[0]*B*auxV */
294 ✗ PetscCall(dvd_aux_matmult(data,auxV,wx));
295
296 /* aux <- K^{1/2} * in */
297 ✗ for (i=0;i<n;i++) PetscCall(PCApplySymmetricLeft(data->old_pc,wx[i],outx[i]));
298 break;
299 ✗ default:
300 − SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Unsupported KSP side");
301 }
302 /* out <- out - v*(u'*out) */
303
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.
315464 PetscCall(dvd_improvex_apply_proj(data->d,(Vec*)outx,n));
304
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.
315464 PetscCall(SlepcVecPoolRestoreVecs(data->d->auxV,n,&auxV));
305
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
62904 PetscFunctionReturn(PETSC_SUCCESS);
306 }
307
308 10725 static PetscErrorCode PCApply_dvd(PC pc,Vec in,Vec out)
309 {
310 10725 dvdImprovex_jd *data;
311 10725 PetscInt n,i;
312 10725 const Vec *inx, *outx;
313 10725 Mat A;
314
315
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
10725 PetscFunctionBegin;
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.
10725 PetscCall(PCGetOperators(pc,&A,NULL));
317
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.
10725 PetscCall(MatShellGetContext(A,&data));
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.
10725 PetscCall(VecCompGetSubVecs(in,NULL,&inx));
319
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.
10725 PetscCall(VecCompGetSubVecs(out,NULL,&outx));
320 10725 n = data->r_e - data->r_s;
321 /* out <- K * in */
322
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.
21456 for (i=0;i<n;i++) PetscCall(data->d->improvex_precond(data->d,data->r_s+i,inx[i],outx[i]));
323 /* out <- out - v*(u'*out) */
324
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.
10725 PetscCall(dvd_improvex_apply_proj(data->d,(Vec*)outx,n));
325
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
2113 PetscFunctionReturn(PETSC_SUCCESS);
326 }
327
328 6767 static PetscErrorCode PCApplyTranspose_dvd(PC pc,Vec in,Vec out)
329 {
330 6767 dvdImprovex_jd *data;
331 6767 PetscInt n,i;
332 6767 const Vec *inx, *outx;
333 6767 Vec *auxV;
334 6767 Mat A;
335
336
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
6767 PetscFunctionBegin;
337
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.
6767 PetscCall(PCGetOperators(pc,&A,NULL));
338
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.
6767 PetscCall(MatShellGetContext(A,&data));
339
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.
6767 PetscCall(VecCompGetSubVecs(in,NULL,&inx));
340
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.
6767 PetscCall(VecCompGetSubVecs(out,NULL,&outx));
341 6767 n = data->r_e - data->r_s;
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.
6767 PetscCall(SlepcVecPoolGetVecs(data->d->auxV,n,&auxV));
343 /* auxV <- in */
344
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.
13534 for (i=0;i<n;i++) PetscCall(VecCopy(inx[i],auxV[i]));
345 /* auxV <- auxV - u*(v'*auxV) */
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.
6767 PetscCall(dvd_improvex_applytrans_proj(data->d,auxV,n));
347 /* out <- K' * aux */
348
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.
13534 for (i=0;i<n;i++) PetscCall(PCApplyTranspose(data->old_pc,auxV[i],outx[i]));
349
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.
6767 PetscCall(SlepcVecPoolRestoreVecs(data->d->auxV,n,&auxV));
350
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
1334 PetscFunctionReturn(PETSC_SUCCESS);
351 }
352
353 132104 static PetscErrorCode MatMult_dvd_jd(Mat A,Vec in,Vec out)
354 {
355 132104 dvdImprovex_jd *data;
356 132104 PetscInt n;
357 132104 const Vec *inx, *outx;
358 132104 PCSide side;
359
360
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
132104 PetscFunctionBegin;
361
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.
132104 PetscCall(MatShellGetContext(A,&data));
362
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.
132104 PetscCall(VecCompGetSubVecs(in,NULL,&inx));
363
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.
132104 PetscCall(VecCompGetSubVecs(out,NULL,&outx));
364 132104 n = data->r_e - data->r_s;
365 /* out <- theta[1]A*in - theta[0]*B*in */
366
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.
132104 PetscCall(dvd_aux_matmult(data,inx,outx));
367
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.
132104 PetscCall(KSPGetPCSide(data->ksp,&side));
368
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
132104 if (side == PC_RIGHT) {
369 /* out <- out - v*(u'*out) */
370 ✗ PetscCall(dvd_improvex_apply_proj(data->d,(Vec*)outx,n));
371 }
372
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
23201 PetscFunctionReturn(PETSC_SUCCESS);
373 }
374
375 6483 static PetscErrorCode MatMultTranspose_dvd_jd(Mat A,Vec in,Vec out)
376 {
377 6483 dvdImprovex_jd *data;
378 6483 PetscInt n,i;
379 6483 const Vec *inx,*outx,*r;
380 6483 Vec *auxV;
381 6483 PCSide side;
382
383
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
6483 PetscFunctionBegin;
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.
6483 PetscCall(MatShellGetContext(A,&data));
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.
6483 PetscCall(VecCompGetSubVecs(in,NULL,&inx));
386
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.
6483 PetscCall(VecCompGetSubVecs(out,NULL,&outx));
387 6483 n = data->r_e - data->r_s;
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.
6483 PetscCall(KSPGetPCSide(data->ksp,&side));
389
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
6483 if (side == PC_RIGHT) {
390 /* auxV <- in */
391 ✗ PetscCall(SlepcVecPoolGetVecs(data->d->auxV,n,&auxV));
392 ✗ for (i=0;i<n;i++) PetscCall(VecCopy(inx[i],auxV[i]));
393 /* auxV <- auxV - v*(u'*auxV) */
394 ✗ PetscCall(dvd_improvex_applytrans_proj(data->d,auxV,n));
395 ✗ r = auxV;
396 6483 } else r = inx;
397 /* out <- theta[1]A*r - theta[0]*B*r */
398
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.
6483 PetscCall(dvd_aux_matmulttrans(data,r,outx));
399
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.
6483 if (side == PC_RIGHT) PetscCall(SlepcVecPoolRestoreVecs(data->d->auxV,n,&auxV));
400
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
1278 PetscFunctionReturn(PETSC_SUCCESS);
401 }
402
403 244 static PetscErrorCode MatCreateVecs_dvd_jd(Mat A,Vec *right,Vec *left)
404 {
405 244 Vec *r,*l;
406 244 dvdImprovex_jd *data;
407 244 PetscInt n,i;
408
409
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
244 PetscFunctionBegin;
410
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.
244 PetscCall(MatShellGetContext(A,&data));
411 244 n = data->ksp_max_size;
412
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.
244 if (right) PetscCall(PetscMalloc1(n,&r));
413
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.
244 if (left) PetscCall(PetscMalloc1(n,&l));
414
9/12
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 10 times.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 2 times.
✓ Branch 11 taken 2 times.
526 for (i=0;i<n;i++) PetscCall(MatCreateVecs(data->d->A,right?&r[i]:NULL,left?&l[i]:NULL));
415
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
244 if (right) {
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.
244 PetscCall(VecCreateCompWithVecs(r,n,data->friends,right));
417
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.
526 for (i=0;i<n;i++) PetscCall(VecDestroy(&r[i]));
418 }
419
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
244 if (left) {
420 ✗ PetscCall(VecCreateCompWithVecs(l,n,data->friends,left));
421 ✗ for (i=0;i<n;i++) PetscCall(VecDestroy(&l[i]));
422 }
423
424
7/10
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 6 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
244 if (right) PetscCall(PetscFree(r));
425
1/10
✗ 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.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
244 if (left) PetscCall(PetscFree(l));
426
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
48 PetscFunctionReturn(PETSC_SUCCESS);
427 }
428
429 814 static PetscErrorCode dvd_improvex_jd_start(dvdDashboard *d)
430 {
431 814 dvdImprovex_jd *data = (dvdImprovex_jd*)d->improveX_data;
432 814 PetscInt rA, cA, rlA, clA;
433 814 Mat A;
434 814 PetscBool t;
435 814 PC pc;
436 814 Vec v0[2];
437
438
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
814 PetscFunctionBegin;
439 814 data->size_cX = data->old_size_X = 0;
440
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
814 data->lastTol = data->dynamic?0.5:0.0;
441
442 /* Setup the ksp */
443
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
814 if (data->ksp) {
444 /* Create the reference vector */
445
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.
327 PetscCall(BVGetColumn(d->eps->V,0,&v0[0]));
446 327 v0[1] = v0[0];
447
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.
327 PetscCall(VecCreateCompWithVecs(v0,data->ksp_max_size,NULL,&data->friends));
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.
327 PetscCall(BVRestoreColumn(d->eps->V,0,&v0[0]));
449
450 /* Save the current pc and set a PCNONE */
451
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.
327 PetscCall(KSPGetPC(data->ksp, &data->old_pc));
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.
327 PetscCall(PetscObjectTypeCompare((PetscObject)data->old_pc,PCNONE,&t));
453 327 data->lastTol = 0.5;
454
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
327 if (t) data->old_pc = NULL;
455 else {
456
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.
194 PetscCall(PetscObjectReference((PetscObject)data->old_pc));
457
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.
194 PetscCall(PCCreate(PetscObjectComm((PetscObject)d->eps),&pc));
458
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.
194 PetscCall(PCSetType(pc,PCSHELL));
459
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.
194 PetscCall(PCSetOperators(pc,d->A,d->A));
460
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.
194 PetscCall(PCSetReusePreconditioner(pc,PETSC_TRUE));
461
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.
194 PetscCall(PCShellSetApply(pc,PCApply_dvd));
462
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.
194 PetscCall(PCShellSetApplyBA(pc,PCApplyBA_dvd));
463
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.
194 PetscCall(PCShellSetApplyTranspose(pc,PCApplyTranspose_dvd));
464
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.
194 PetscCall(KSPSetPC(data->ksp,pc));
465
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.
194 PetscCall(PCDestroy(&pc));
466 }
467
468 /* Create the (I-v*u')*K*(A-s*B) matrix */
469
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.
327 PetscCall(MatGetSize(d->A,&rA,&cA));
470
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.
327 PetscCall(MatGetLocalSize(d->A,&rlA,&clA));
471
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.
327 PetscCall(MatCreateShell(PetscObjectComm((PetscObject)d->A),rlA*data->ksp_max_size,clA*data->ksp_max_size,rA*data->ksp_max_size,cA*data->ksp_max_size,data,&A));
472
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.
327 PetscCall(MatShellSetOperation(A,MATOP_MULT,(PetscErrorCodeFn*)MatMult_dvd_jd));
473
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.
327 PetscCall(MatShellSetOperation(A,MATOP_MULT_TRANSPOSE,(PetscErrorCodeFn*)MatMultTranspose_dvd_jd));
474
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.
327 PetscCall(MatShellSetOperation(A,MATOP_CREATE_VECS,(PetscErrorCodeFn*)MatCreateVecs_dvd_jd));
475
476 /* Try to avoid KSPReset */
477
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.
327 PetscCall(KSPGetOperatorsSet(data->ksp,&t,NULL));
478
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
327 if (t) {
479 262 Mat M;
480 262 PetscInt rM;
481
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.
262 PetscCall(KSPGetOperators(data->ksp,&M,NULL));
482
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.
262 PetscCall(MatGetSize(M,&rM,NULL));
483
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
262 if (rM != rA*data->ksp_max_size) PetscCall(KSPReset(data->ksp));
484 }
485
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.
327 PetscCall(EPS_KSPSetOperators(data->ksp,A,A));
486
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.
327 PetscCall(KSPSetReusePreconditioner(data->ksp,PETSC_TRUE));
487
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.
327 PetscCall(KSPSetUp(data->ksp));
488
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.
327 PetscCall(MatDestroy(&A));
489 } else {
490 487 data->old_pc = NULL;
491 487 data->friends = NULL;
492 }
493
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.
814 PetscCall(BVSetActiveColumns(data->KZ,0,0));
494
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.
814 PetscCall(BVSetActiveColumns(data->U,0,0));
495
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
158 PetscFunctionReturn(PETSC_SUCCESS);
496 }
497
498 /*
499 Compute: u <- X, v <- K*(theta[0]*A+theta[1]*B)*X,
500 kr <- K^{-1}*(A-eig*B)*X, being X <- V*pX[i_s..i_e-1], Y <- W*pY[i_s..i_e-1]
501 where
502 pX,pY, the right and left eigenvectors of the projected system
503 ld, the leading dimension of pX and pY
504 */
505 53693 static PetscErrorCode dvd_improvex_jd_proj_cuv(dvdDashboard *d,PetscInt i_s,PetscInt i_e,Vec *kr,PetscScalar *theta,PetscScalar *thetai,PetscScalar *pX,PetscScalar *pY,PetscInt ld)
506 {
507 53693 PetscInt n=i_e-i_s,size_KZ,V_new,rm,i,lv,kv,lKZ,kKZ;
508 53693 dvdImprovex_jd *data = (dvdImprovex_jd*)d->improveX_data;
509 53693 const PetscScalar *array;
510 53693 Mat M;
511 53693 Vec u[2],v[2];
512 53693 PetscBLASInt s,ldXKZ;
513
514
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
53693 PetscFunctionBegin;
515 /* Check consistency */
516
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.
53693 PetscCall(BVGetActiveColumns(d->eps->V,&lv,&kv));
517 53693 V_new = lv - data->size_cX;
518
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
53693 PetscAssert(V_new<=data->old_size_X,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Consistency broken");
519 53693 data->old_size_X = n;
520 53693 data->size_cX = lv;
521
522 /* KZ <- KZ(rm:rm+max_cX-1) */
523
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.
53693 PetscCall(BVGetActiveColumns(data->KZ,&lKZ,&kKZ));
524 53693 rm = PetscMax(V_new+lKZ,0);
525
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
53693 if (rm > 0) {
526
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
1874 for (i=0;i<lKZ;i++) {
527 ✗ PetscCall(BVCopyColumn(data->KZ,i+rm,i));
528 ✗ PetscCall(BVCopyColumn(data->U,i+rm,i));
529 }
530 }
531
532 /* XKZ <- XKZ(rm:rm+max_cX-1,rm:rm+max_cX-1) */
533
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
5548 if (rm > 0) {
534
2/8
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
1874 for (i=0;i<lKZ;i++) PetscCall(PetscArraycpy(&data->XKZ[i*data->ldXKZ+i],&data->XKZ[(i+rm)*data->ldXKZ+i+rm],lKZ));
535 }
536 53693 lKZ = PetscMin(0,lKZ+V_new);
537
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.
53693 PetscCall(BVSetActiveColumns(data->KZ,lKZ,lKZ+n));
538
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.
53693 PetscCall(BVSetActiveColumns(data->U,lKZ,lKZ+n));
539
540 /* Compute X, KZ and KR */
541
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.
53693 PetscCall(BVGetColumn(data->U,lKZ,u));
542
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
53693 if (n>1) PetscCall(BVGetColumn(data->U,lKZ+1,&u[1]));
543
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.
53693 PetscCall(BVGetColumn(data->KZ,lKZ,v));
544
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
53693 if (n>1) PetscCall(BVGetColumn(data->KZ,lKZ+1,&v[1]));
545
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.
53693 PetscCall(d->improvex_jd_proj_uv(d,i_s,i_e,u,v,kr,theta,thetai,pX,pY,ld));
546
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.
53693 PetscCall(BVRestoreColumn(data->U,lKZ,u));
547
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
53693 if (n>1) PetscCall(BVRestoreColumn(data->U,lKZ+1,&u[1]));
548
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.
53693 PetscCall(BVRestoreColumn(data->KZ,lKZ,v));
549
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
53693 if (n>1) PetscCall(BVRestoreColumn(data->KZ,lKZ+1,&v[1]));
550
551 /* XKZ <- U'*KZ */
552
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.
53693 PetscCall(MatCreateSeqDense(PETSC_COMM_SELF,lKZ+n,lKZ+n,NULL,&M));
553
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.
53693 PetscCall(BVMatProject(data->KZ,NULL,data->U,M));
554
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.
53693 PetscCall(MatDenseGetArrayRead(M,&array));
555
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
107633 for (i=lKZ;i<lKZ+n;i++) { /* upper part */
556
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.
53940 PetscCall(PetscArraycpy(&data->XKZ[data->ldXKZ*i],&array[i*(lKZ+n)],lKZ));
557 }
558
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
107633 for (i=0;i<lKZ+n;i++) { /* lower part */
559
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.
53940 PetscCall(PetscArraycpy(&data->XKZ[data->ldXKZ*i+lKZ],&array[i*(lKZ+n)+lKZ],n));
560 }
561
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.
53693 PetscCall(MatDenseRestoreArrayRead(M,&array));
562
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.
53693 PetscCall(MatDestroy(&M));
563
564 /* iXKZ <- inv(XKZ) */
565 53693 size_KZ = lKZ+n;
566
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.
53693 PetscCall(PetscBLASIntCast(lKZ+n,&s));
567 53693 data->ldiXKZ = data->size_iXKZ = size_KZ;
568
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.
107633 for (i=0;i<size_KZ;i++) PetscCall(PetscArraycpy(&data->iXKZ[data->ldiXKZ*i],&data->XKZ[data->ldXKZ*i],size_KZ));
569
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.
53693 PetscCall(PetscBLASIntCast(data->ldiXKZ,&ldXKZ));
570
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.
53693 PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
571
16/32
✓ 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 taken 2 times.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✓ 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.
53693 PetscCallLAPACKInfo("LAPACKgetrf",LAPACKgetrf_(&s,&s,data->iXKZ,&ldXKZ,data->iXKZPivots,&info));
572
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.
53693 PetscCall(PetscFPTrapPop());
573
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
10258 PetscFunctionReturn(PETSC_SUCCESS);
574 }
575
576 49783 static PetscErrorCode dvd_improvex_jd_gen(dvdDashboard *d,PetscInt r_s,PetscInt r_e,PetscInt *size_D)
577 {
578 49783 dvdImprovex_jd *data = (dvdImprovex_jd*)d->improveX_data;
579 49783 PetscInt i,j,n,maxits,maxits0,lits,s,ld,k,max_size_D,lV,kV;
580 49783 PetscScalar *pX,*pY;
581 49783 PetscReal tol,tol0;
582 49783 Vec *kr,kr_comp,D_comp,D[2],kr0[2];
583 49783 PetscBool odd_situation = PETSC_FALSE;
584
585
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
49783 PetscFunctionBegin;
586
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.
49783 PetscCall(BVGetActiveColumns(d->eps->V,&lV,&kV));
587 49783 max_size_D = d->eps->ncv-kV;
588 /* Quick exit */
589
2/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
49783 if ((max_size_D == 0) || r_e-r_s <= 0) {
590 ✗ *size_D = 0;
591 ✗ PetscFunctionReturn(PETSC_SUCCESS);
592 }
593
594 49783 n = PetscMin(PetscMin(data->size_X, max_size_D), r_e-r_s);
595
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
49783 PetscAssert(n>0,PETSC_COMM_SELF,PETSC_ERR_PLIB,"n == 0");
596
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
49783 PetscAssert(data->size_X>=r_e-r_s,PETSC_COMM_SELF,PETSC_ERR_PLIB,"size_X < r_e-r_s");
597
598
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.
49783 PetscCall(DSGetLeadingDimension(d->eps->ds,&ld));
599
600 /* Restart lastTol if a new pair converged */
601
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
49783 if (data->dynamic && data->size_cX < lV)
602 10 data->lastTol = 0.5;
603
604
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
100788 for (i=0;i<n;i+=s) {
605 /* If the selected eigenvalue is complex, but the arithmetic is real... */
606 #if !PetscDefined(USE_COMPLEX)
607
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
25097 if (d->eigi[r_s+i] != 0.0) {
608
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
247 if (i+2 <= max_size_D) s=2;
609 else break;
610 } else
611 #endif
612 28596 s=1;
613
614 53693 data->r_s = r_s+i;
615 53693 data->r_e = r_s+i+s;
616
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.
53693 PetscCall(SlepcVecPoolGetVecs(d->auxV,s,&kr));
617
618 /* Compute theta, maximum iterations and tolerance */
619 maxits = 0;
620 tol = 1;
621
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
107633 for (j=0;j<s;j++) {
622
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.
53940 PetscCall(d->improvex_jd_lit(d,r_s+i+j,&data->theta[2*j],&data->thetai[j],&maxits0,&tol0));
623 53940 maxits += maxits0;
624 53940 tol *= tol0;
625 }
626 53693 maxits/= s;
627
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
53693 tol = data->dynamic?data->lastTol:PetscExpReal(PetscLogReal(tol)/s);
628
629 /* Compute u, v and kr */
630 53693 k = r_s+i;
631
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.
53693 PetscCall(DSVectors(d->eps->ds,DS_MAT_X,&k,NULL));
632 53693 k = r_s+i;
633
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.
53693 PetscCall(DSVectors(d->eps->ds,DS_MAT_Y,&k,NULL));
634
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.
53693 PetscCall(DSGetArray(d->eps->ds,DS_MAT_X,&pX));
635
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.
53693 PetscCall(DSGetArray(d->eps->ds,DS_MAT_Y,&pY));
636
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.
53693 PetscCall(dvd_improvex_jd_proj_cuv(d,r_s+i,r_s+i+s,kr,data->theta,data->thetai,pX,pY,ld));
637
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.
53693 PetscCall(DSRestoreArray(d->eps->ds,DS_MAT_X,&pX));
638
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.
53693 PetscCall(DSRestoreArray(d->eps->ds,DS_MAT_Y,&pY));
639
640 /* Check if the first eigenpairs are converged */
641
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
53693 if (i == 0) {
642 49783 PetscInt oldnpreconv = d->npreconv;
643
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.
49783 PetscCall(d->preTestConv(d,0,r_s+s,r_s+s,&d->npreconv));
644
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
49783 if (d->npreconv > oldnpreconv) break;
645 }
646
647 /* Test the odd situation of solving Ax=b with A=I */
648 #if !PetscDefined(USE_COMPLEX)
649
8/10
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 5 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 5 times.
✓ Branch 9 taken 5 times.
23778 odd_situation = (data->ksp && data->theta[0] == 1. && data->theta[1] == 0. && data->thetai[0] == 0. && d->B == NULL)? PETSC_TRUE: PETSC_FALSE;
650 #else
651
7/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 5 times.
✓ Branch 7 taken 5 times.
27227 odd_situation = (data->ksp && data->theta[0] == 1. && data->theta[1] == 0. && d->B == NULL)? PETSC_TRUE: PETSC_FALSE;
652 #endif
653 /* If JD */
654
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
51005 if (data->ksp && !odd_situation) {
655 /* kr <- -kr */
656
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.
12538 for (j=0;j<s;j++) PetscCall(VecScale(kr[j],-1.0));
657
658 /* Compose kr and D */
659 6266 kr0[0] = kr[0];
660
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
6266 kr0[1] = (s==2 ? kr[1] : NULL);
661
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.
6266 PetscCall(VecCreateCompWithVecs(kr0,data->ksp_max_size,data->friends,&kr_comp));
662
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.
6266 PetscCall(BVGetColumn(d->eps->V,kV+i,&D[0]));
663
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
6266 if (s==2) PetscCall(BVGetColumn(d->eps->V,kV+i+1,&D[1]));
664 6260 else D[1] = NULL;
665
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.
6266 PetscCall(VecCreateCompWithVecs(D,data->ksp_max_size,data->friends,&D_comp));
666
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.
6266 PetscCall(VecCompSetSubVecs(data->friends,s,NULL));
667
668 /* Solve the correction equation */
669
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.
6266 PetscCall(KSPSetTolerances(data->ksp,tol,PETSC_CURRENT,PETSC_CURRENT,maxits));
670
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.
6266 PetscCall(KSPSolve(data->ksp,kr_comp,D_comp));
671
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.
6266 PetscCall(KSPGetIterationNumber(data->ksp,&lits));
672
673 /* Destroy the composed ks and D */
674
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.
6266 PetscCall(VecDestroy(&kr_comp));
675
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.
6266 PetscCall(VecDestroy(&D_comp));
676
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.
6266 PetscCall(BVRestoreColumn(d->eps->V,kV+i,&D[0]));
677
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
2581 if (s==2) PetscCall(BVRestoreColumn(d->eps->V,kV+i+1,&D[1]));
678
679 /* If GD */
680 } else {
681
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.
44739 PetscCall(BVGetColumn(d->eps->V,kV+i,&D[0]));
682
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
21197 if (s==2) PetscCall(BVGetColumn(d->eps->V,kV+i+1,&D[1]));
683
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.
89709 for (j=0;j<s;j++) PetscCall(d->improvex_precond(d,r_s+i+j,kr[j],D[j]));
684
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.
44739 PetscCall(dvd_improvex_apply_proj(d,D,s));
685
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.
44739 PetscCall(BVRestoreColumn(d->eps->V,kV+i,&D[0]));
686
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
48424 if (s==2) PetscCall(BVRestoreColumn(d->eps->V,kV+i+1,&D[1]));
687 }
688 /* Prevent that short vectors are discarded in the orthogonalization */
689
4/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
51005 if (i == 0 && d->eps->errest[d->nconv+r_s] > PETSC_MACHINE_EPSILON && d->eps->errest[d->nconv+r_s] < PETSC_MAX_REAL) {
690
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.
94422 for (j=0;j<s;j++) PetscCall(BVScaleColumn(d->eps->V,kV+i+j,1.0/d->eps->errest[d->nconv+r_s]));
691 }
692
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.
51005 PetscCall(SlepcVecPoolRestoreVecs(d->auxV,s,&kr));
693 }
694 49783 *size_D = i;
695
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 4 times.
50191 if (data->dynamic) data->lastTol = PetscMax(data->lastTol/2.0,PETSC_MACHINE_EPSILON*10.0);
696
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
9480 PetscFunctionReturn(PETSC_SUCCESS);
697 }
698
699 2442 PetscErrorCode dvd_improvex_jd(dvdDashboard *d,dvdBlackboard *b,KSP ksp,PetscInt max_bs,PetscBool dynamic)
700 {
701 2442 dvdImprovex_jd *data;
702 2442 PetscBool useGD;
703 2442 PC pc;
704 2442 PetscInt size_P;
705
706
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2442 PetscFunctionBegin;
707 /* Setting configuration constrains */
708
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.
2442 PetscCall(PetscObjectTypeCompare((PetscObject)ksp,KSPPREONLY,&useGD));
709
710 /* If the arithmetic is real and the problem is not Hermitian, then
711 the block size is incremented in one */
712 #if !PetscDefined(USE_COMPLEX)
713
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
1206 if (!DVD_IS(d->sEP,DVD_EP_HERMITIAN)) {
714 318 max_bs++;
715 318 b->max_size_P = PetscMax(b->max_size_P,2);
716 } else
717 #endif
718 {
719 2124 b->max_size_P = PetscMax(b->max_size_P,1);
720 }
721 2442 b->max_size_X = PetscMax(b->max_size_X,max_bs);
722 2442 size_P = b->max_size_P;
723
724 /* Setup the preconditioner */
725
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
2442 if (ksp) {
726
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.
2442 PetscCall(KSPGetPC(ksp,&pc));
727
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.
2442 PetscCall(dvd_static_precond_PC(d,b,pc));
728 ✗ } else PetscCall(dvd_static_precond_PC(d,b,NULL));
729
730 /* Setup the step */
731
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2442 if (b->state >= DVD_STATE_CONF) {
732
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.
814 PetscCall(PetscNew(&data));
733 814 data->dynamic = dynamic;
734
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.
814 PetscCall(PetscMalloc1(size_P*size_P,&data->XKZ));
735
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.
814 PetscCall(PetscMalloc1(size_P*size_P,&data->iXKZ));
736
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.
814 PetscCall(PetscMalloc1(size_P,&data->iXKZPivots));
737 814 data->ldXKZ = size_P;
738 814 data->size_X = b->max_size_X;
739 814 d->improveX_data = data;
740
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
814 data->ksp = useGD? NULL: ksp;
741 814 data->d = d;
742 814 d->improveX = dvd_improvex_jd_gen;
743 #if !PetscDefined(USE_COMPLEX)
744
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
402 if (!DVD_IS(d->sEP,DVD_EP_HERMITIAN)) data->ksp_max_size = 2;
745 else
746 #endif
747 708 data->ksp_max_size = 1;
748 /* Create various vector basis */
749
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.
814 PetscCall(BVDuplicateResize(d->eps->V,size_P,&data->KZ));
750
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.
814 PetscCall(BVSetMatrix(data->KZ,NULL,PETSC_FALSE));
751
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.
814 PetscCall(BVDuplicate(data->KZ,&data->U));
752
753
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.
814 PetscCall(EPSDavidsonFLAdd(&d->startList,dvd_improvex_jd_start));
754
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.
814 PetscCall(EPSDavidsonFLAdd(&d->endList,dvd_improvex_jd_end));
755
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.
814 PetscCall(EPSDavidsonFLAdd(&d->destroyList,dvd_improvex_jd_d));
756 }
757
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
474 PetscFunctionReturn(PETSC_SUCCESS);
758 }
759
760 #if !PetscDefined(USE_COMPLEX)
761 247 static inline PetscErrorCode dvd_complex_rayleigh_quotient(Vec ur,Vec ui,Vec Axr,Vec Axi,Vec Bxr,Vec Bxi,PetscScalar *eigr,PetscScalar *eigi)
762 {
763 247 PetscScalar rAr,iAr,rAi,iAi,rBr,iBr,rBi,iBi,b0,b2,b4,b6,b7;
764
765
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
247 PetscFunctionBegin;
766 /* eigr = [(rAr+iAi)*(rBr+iBi) + (rAi-iAr)*(rBi-iBr)]/k
767 eigi = [(rAi-iAr)*(rBr+iBi) - (rAr+iAi)*(rBi-iBr)]/k
768 k = (rBr+iBi)*(rBr+iBi) + (rBi-iBr)*(rBi-iBr) */
769
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
247 PetscCall(VecDotBegin(Axr,ur,&rAr)); /* r*A*r */
770
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
247 PetscCall(VecDotBegin(Axr,ui,&iAr)); /* i*A*r */
771
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
247 PetscCall(VecDotBegin(Axi,ur,&rAi)); /* r*A*i */
772
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
247 PetscCall(VecDotBegin(Axi,ui,&iAi)); /* i*A*i */
773
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
247 PetscCall(VecDotBegin(Bxr,ur,&rBr)); /* r*B*r */
774
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
247 PetscCall(VecDotBegin(Bxr,ui,&iBr)); /* i*B*r */
775
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
247 PetscCall(VecDotBegin(Bxi,ur,&rBi)); /* r*B*i */
776
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
247 PetscCall(VecDotBegin(Bxi,ui,&iBi)); /* i*B*i */
777
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
247 PetscCall(VecDotEnd(Axr,ur,&rAr)); /* r*A*r */
778
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
247 PetscCall(VecDotEnd(Axr,ui,&iAr)); /* i*A*r */
779
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
247 PetscCall(VecDotEnd(Axi,ur,&rAi)); /* r*A*i */
780
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
247 PetscCall(VecDotEnd(Axi,ui,&iAi)); /* i*A*i */
781
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
247 PetscCall(VecDotEnd(Bxr,ur,&rBr)); /* r*B*r */
782
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
247 PetscCall(VecDotEnd(Bxr,ui,&iBr)); /* i*B*r */
783
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
247 PetscCall(VecDotEnd(Bxi,ur,&rBi)); /* r*B*i */
784
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
247 PetscCall(VecDotEnd(Bxi,ui,&iBi)); /* i*B*i */
785 247 b0 = rAr+iAi; /* rAr+iAi */
786 247 b2 = rAi-iAr; /* rAi-iAr */
787 247 b4 = rBr+iBi; /* rBr+iBi */
788 247 b6 = rBi-iBr; /* rBi-iBr */
789 247 b7 = b4*b4 + b6*b6; /* k */
790 247 *eigr = (b0*b4 + b2*b6) / b7; /* eig_r */
791 247 *eigi = (b2*b4 - b0*b6) / b7; /* eig_i */
792
7/14
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
247 PetscFunctionReturn(PETSC_SUCCESS);
793 }
794 #endif
795
796 53693 static inline PetscErrorCode dvd_compute_n_rr(PetscInt i_s,PetscInt n,PetscScalar *eigr,PetscScalar *eigi,Vec *u,Vec *Ax,Vec *Bx)
797 {
798 53693 PetscInt i;
799 53693 PetscScalar b0,b1;
800
801
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
53693 PetscFunctionBegin;
802
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
107386 for (i=0; i<n; i++) {
803 #if !PetscDefined(USE_COMPLEX)
804
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
25097 if (eigi[i_s+i] != 0.0) {
805 247 PetscScalar eigr0=0.0,eigi0=0.0;
806
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
247 PetscCall(dvd_complex_rayleigh_quotient(u[i],u[i+1],Ax[i],Ax[i+1],Bx[i],Bx[i+1],&eigr0,&eigi0));
807
2/10
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
247 if (PetscAbsScalar(eigr[i_s+i]-eigr0)/PetscAbsScalar(eigr[i_s+i]) > 1e-10 || PetscAbsScalar(eigi[i_s+i]-eigi0)/PetscAbsScalar(eigi[i_s+i]) > 1e-10) PetscCall(PetscInfo(u[0],"The eigenvalue %g%+gi is far from its Rayleigh quotient value %g%+gi\n",(double)eigr[i_s+i],(double)eigi[i_s+i],(double)eigr0,(double)eigi0));
808 247 i++;
809 } else
810 #endif
811 {
812
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.
53446 PetscCall(VecDotBegin(Ax[i],u[i],&b0));
813
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.
53446 PetscCall(VecDotBegin(Bx[i],u[i],&b1));
814
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.
53446 PetscCall(VecDotEnd(Ax[i],u[i],&b0));
815
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.
53446 PetscCall(VecDotEnd(Bx[i],u[i],&b1));
816 53446 b0 = b0/b1;
817
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.
53693 if (PetscAbsScalar(eigr[i_s+i]-b0)/PetscAbsScalar(eigr[i_s+i]) > 1e-10) PetscCall(PetscInfo(u[0],"The eigenvalue %g+%g is far from its Rayleigh quotient value %g+%g\n",(double)PetscRealPart(eigr[i_s+i]),(double)PetscImaginaryPart(eigr[i_s+i]),(double)PetscRealPart(b0),(double)PetscImaginaryPart(b0)));
818 }
819 }
820
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
10258 PetscFunctionReturn(PETSC_SUCCESS);
821 }
822
823 /*
824 Compute: u <- X, v <- K*(theta[0]*A+theta[1]*B)*X,
825 kr <- K^{-1}*(A-eig*B)*X, being X <- V*pX[i_s..i_e-1], Y <- W*pY[i_s..i_e-1]
826 where
827 pX,pY, the right and left eigenvectors of the projected system
828 ld, the leading dimension of pX and pY
829 */
830 53693 static PetscErrorCode dvd_improvex_jd_proj_uv_KZX(dvdDashboard *d,PetscInt i_s,PetscInt i_e,Vec *u,Vec *v,Vec *kr,PetscScalar *theta,PetscScalar *thetai,PetscScalar *pX,PetscScalar *pY,PetscInt ld)
831 {
832 53693 PetscInt n = i_e-i_s,i;
833 53693 PetscScalar *b;
834 53693 Vec *Ax,*Bx,*r;
835 53693 Mat M;
836 53693 BV X;
837
838
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
53693 PetscFunctionBegin;
839
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.
53693 PetscCall(BVDuplicateResize(d->eps->V,4,&X));
840
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.
53693 PetscCall(MatCreateSeqDense(PETSC_COMM_SELF,4,4,NULL,&M));
841 /* u <- X(i) */
842
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.
53693 PetscCall(dvd_improvex_compute_X(d,i_s,i_e,u,pX,ld));
843
844 /* v <- theta[0]A*u + theta[1]*B*u */
845
846 /* Bx <- B*X(i) */
847 53693 Bx = kr;
848
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
53693 if (d->BX) {
849
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.
26205 for (i=i_s; i<i_e; ++i) PetscCall(BVMultVec(d->BX,1.0,0.0,Bx[i-i_s],&pX[ld*i]));
850 } else {
851
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
81428 for (i=0;i<n;i++) {
852
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.
40722 if (d->B) PetscCall(MatMult(d->B, u[i], Bx[i]));
853
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.
40722 else PetscCall(VecCopy(u[i], Bx[i]));
854 }
855 }
856
857 /* Ax <- A*X(i) */
858
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.
53693 PetscCall(SlepcVecPoolGetVecs(d->auxV,i_e-i_s,&r));
859 53693 Ax = r;
860
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.
107633 for (i=i_s; i<i_e; ++i) PetscCall(BVMultVec(d->AX,1.0,0.0,Ax[i-i_s],&pX[ld*i]));
861
862 /* v <- Y(i) */
863
9/10
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 2 times.
107633 for (i=i_s; i<i_e; ++i) PetscCall(BVMultVec(d->W?d->W:d->eps->V,1.0,0.0,v[i-i_s],&pY[ld*i]));
864
865 /* Recompute the eigenvalue */
866
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.
53693 PetscCall(dvd_compute_n_rr(i_s,n,d->eigr,d->eigi,v,Ax,Bx));
867
868
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
107386 for (i=0;i<n;i++) {
869 #if !PetscDefined(USE_COMPLEX)
870
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
25097 if (d->eigi[i_s+i] != 0.0) {
871 /* [r_i r_i+1 kr_i kr_i+1]*= [ theta_2i' 0 1 0
872 0 theta_2i' 0 1
873 theta_2i+1 -thetai_i -eigr_i -eigi_i
874 thetai_i theta_2i+1 eigi_i -eigr_i ] */
875
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
247 PetscCall(MatDenseGetArrayWrite(M,&b));
876 247 b[0] = b[5] = PetscConj(theta[2*i]);
877 247 b[2] = b[7] = -theta[2*i+1];
878 247 b[6] = -(b[3] = thetai[i]);
879 247 b[1] = b[4] = 0.0;
880 247 b[8] = b[13] = 1.0/d->nX[i_s+i];
881 247 b[10] = b[15] = -d->eigr[i_s+i]/d->nX[i_s+i];
882 247 b[14] = -(b[11] = d->eigi[i_s+i]/d->nX[i_s+i]);
883 247 b[9] = b[12] = 0.0;
884
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
247 PetscCall(MatDenseRestoreArrayWrite(M,&b));
885
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
247 PetscCall(BVInsertVec(X,0,Ax[i]));
886
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
247 PetscCall(BVInsertVec(X,1,Ax[i+1]));
887
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
247 PetscCall(BVInsertVec(X,2,Bx[i]));
888
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
247 PetscCall(BVInsertVec(X,3,Bx[i+1]));
889
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
247 PetscCall(BVSetActiveColumns(X,0,4));
890
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
247 PetscCall(BVMultInPlace(X,M,0,4));
891
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
247 PetscCall(BVCopyVec(X,0,Ax[i]));
892
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
247 PetscCall(BVCopyVec(X,1,Ax[i+1]));
893
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
247 PetscCall(BVCopyVec(X,2,Bx[i]));
894
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
247 PetscCall(BVCopyVec(X,3,Bx[i+1]));
895 247 i++;
896 } else
897 #endif
898 {
899 /* [Ax_i Bx_i]*= [ theta_2i' 1/nX_i
900 theta_2i+1 -eig_i/nX_i ] */
901
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.
53446 PetscCall(MatDenseGetArrayWrite(M,&b));
902 53446 b[0] = PetscConj(theta[i*2]);
903 53446 b[1] = theta[i*2+1];
904 53446 b[4] = 1.0/d->nX[i_s+i];
905 53446 b[5] = -d->eigr[i_s+i]/d->nX[i_s+i];
906
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.
53446 PetscCall(MatDenseRestoreArrayWrite(M,&b));
907
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.
53446 PetscCall(BVInsertVec(X,0,Ax[i]));
908
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.
53446 PetscCall(BVInsertVec(X,1,Bx[i]));
909
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.
53446 PetscCall(BVSetActiveColumns(X,0,2));
910
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.
53446 PetscCall(BVMultInPlace(X,M,0,2));
911
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.
53446 PetscCall(BVCopyVec(X,0,Ax[i]));
912
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.
53693 PetscCall(BVCopyVec(X,1,Bx[i]));
913 }
914 }
915
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
107633 for (i=0; i<n; i++) d->nX[i_s+i] = 1.0;
916
917 /* v <- K^{-1} r = K^{-1}(theta_2i'*Ax + theta_2i+1*Bx) */
918
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.
107633 for (i=0;i<n;i++) PetscCall(d->improvex_precond(d,i_s+i,r[i],v[i]));
919
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.
53693 PetscCall(SlepcVecPoolRestoreVecs(d->auxV,i_e-i_s,&r));
920
921 /* kr <- P*(Ax - eig_i*Bx) */
922
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.
53693 PetscCall(d->calcpairs_proj_res(d,i_s,i_e,kr));
923
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.
53693 PetscCall(BVDestroy(&X));
924
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.
53693 PetscCall(MatDestroy(&M));
925
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
10258 PetscFunctionReturn(PETSC_SUCCESS);
926 }
927
928 53940 static PetscErrorCode dvd_improvex_jd_lit_const_0(dvdDashboard *d,PetscInt i,PetscScalar* theta,PetscScalar* thetai,PetscInt *maxits,PetscReal *tol)
929 {
930 53940 dvdImprovex_jd *data = (dvdImprovex_jd*)d->improveX_data;
931 53940 PetscReal a;
932
933
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
53940 PetscFunctionBegin;
934 53940 a = SlepcAbsEigenvalue(d->eigr[i],d->eigi[i]);
935
936
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
53940 if (d->nR[i] < data->fix*a) {
937 4585 theta[0] = d->eigr[i];
938 4585 theta[1] = 1.0;
939 #if !PetscDefined(USE_COMPLEX)
940 1894 *thetai = d->eigi[i];
941 #endif
942 } else {
943 49355 theta[0] = d->target[0];
944 49355 theta[1] = d->target[1];
945 #if !PetscDefined(USE_COMPLEX)
946 23450 *thetai = 0.0;
947 #endif
948 }
949
950 #if PetscDefined(USE_COMPLEX)
951
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
28596 if (thetai) *thetai = 0.0;
952 #endif
953 53940 *maxits = data->maxits;
954 53940 *tol = data->tol;
955
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
53940 PetscFunctionReturn(PETSC_SUCCESS);
956 }
957
958 2442 PetscErrorCode dvd_improvex_jd_lit_const(dvdDashboard *d,dvdBlackboard *b,PetscInt maxits,PetscReal tol,PetscReal fix)
959 {
960 2442 dvdImprovex_jd *data = (dvdImprovex_jd*)d->improveX_data;
961
962
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2442 PetscFunctionBegin;
963 /* Setup the step */
964
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2442 if (b->state >= DVD_STATE_CONF) {
965 814 data->maxits = maxits;
966 814 data->tol = tol;
967 814 data->fix = fix;
968 814 d->improvex_jd_lit = dvd_improvex_jd_lit_const_0;
969 }
970
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
2442 PetscFunctionReturn(PETSC_SUCCESS);
971 }
972
973 2442 PetscErrorCode dvd_improvex_jd_proj_uv(dvdDashboard *d,dvdBlackboard *b)
974 {
975
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2442 PetscFunctionBegin;
976 /* Setup the step */
977
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2442 if (b->state >= DVD_STATE_CONF) {
978 814 d->improvex_jd_proj_uv = dvd_improvex_jd_proj_uv_KZX;
979 }
980
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
2442 PetscFunctionReturn(PETSC_SUCCESS);
981 }
982
983 239199 PetscErrorCode dvd_improvex_compute_X(dvdDashboard *d,PetscInt i_s,PetscInt i_e,Vec *u_,PetscScalar *pX,PetscInt ld)
984 {
985 239199 PetscInt n = i_e - i_s,i;
986 239199 Vec *u;
987
988
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
239199 PetscFunctionBegin;
989
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
239199 if (u_) u = u_;
990
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.
25225 else if (d->correctXnorm) PetscCall(SlepcVecPoolGetVecs(d->auxV,i_e-i_s,&u));
991
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
239199 if (u_ || d->correctXnorm) {
992
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.
431039 for (i=0;i<n;i++) PetscCall(BVMultVec(d->eps->V,1.0,0.0,u[i],&pX[ld*(i+i_s)]));
993 }
994 /* nX(i) <- ||X(i)|| */
995
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
239199 if (d->correctXnorm) {
996
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.
25996 for (i=0;i<n;i++) PetscCall(VecNormBegin(u[i],NORM_2,&d->nX[i_s+i]));
997
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.
25996 for (i=0;i<n;i++) PetscCall(VecNormEnd(u[i],NORM_2,&d->nX[i_s+i]));
998 #if !PetscDefined(USE_COMPLEX)
999
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
12896 for (i=0;i<n;i++) {
1000
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
6448 if (d->eigi[i_s+i] != 0.0) {
1001 ✗ d->nX[i_s+i] = d->nX[i_s+i+1] = PetscSqrtScalar(d->nX[i_s+i]*d->nX[i_s+i]+d->nX[i_s+i+1]*d->nX[i_s+i+1]);
1002 ✗ i++;
1003 }
1004 }
1005 #endif
1006 } else {
1007
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
452677 for (i=0;i<n;i++) d->nX[i_s+i] = 1.0;
1008 }
1009
8/10
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ 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.
239199 if (d->correctXnorm && !u_) PetscCall(SlepcVecPoolRestoreVecs(d->auxV,i_e-i_s,&u));
1010
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
46458 PetscFunctionReturn(PETSC_SUCCESS);
1011 }
1012