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 | 376614 | static PetscErrorCode dvd_improvex_apply_proj(dvdDashboard *d,Vec *V,PetscInt cV) | |
53 | { | ||
54 | 376614 | dvdImprovex_jd *data = (dvdImprovex_jd*)d->improveX_data; | |
55 | 376614 | PetscInt i,ldh,k,l; | |
56 | 376614 | PetscScalar *h; | |
57 | 376614 | PetscBLASInt cV_,n,info,ld; | |
58 | #if defined(PETSC_USE_COMPLEX) | ||
59 | 304319 | PetscInt j; | |
60 | #endif | ||
61 | |||
62 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
376614 | PetscFunctionBegin; |
63 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
376614 | 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.
|
376614 | PetscCall(PetscMalloc1(data->size_iXKZ*cV,&h)); |
67 | 376614 | 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.
|
376614 | 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.
|
376614 | 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.
|
376614 | PetscCall(BVSetActiveColumns(data->U,0,k)); |
71 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
753728 | 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.
|
377114 | PetscCall(BVDotVec(data->U,V[i],&h[ldh*i])); |
73 | #if defined(PETSC_USE_COMPLEX) | ||
74 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
608638 | 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.
|
376614 | 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.
|
376614 | 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.
|
376614 | 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.
|
376614 | 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.
|
376614 | PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF)); |
84 |
10/20✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
376614 | PetscCallBLAS("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.
|
376614 | PetscCall(PetscFPTrapPop()); |
86 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
376614 | SlepcCheckLapackInfo("getrs",info); |
87 | |||
88 | /* V <- V - KZ*h */ | ||
89 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
376614 | PetscCall(BVSetActiveColumns(data->KZ,0,k)); |
90 |
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.
|
753728 | for (i=0;i<cV;i++) PetscCall(BVMultVec(data->KZ,-1.0,1.0,V[i],&h[ldh*i])); |
91 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
376614 | PetscCall(BVSetActiveColumns(data->KZ,l,k)); |
92 |
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.
|
376614 | PetscCall(PetscFree(h)); |
93 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
72668 | PetscFunctionReturn(PETSC_SUCCESS); |
94 | } | ||
95 | |||
96 | /* | ||
97 | Compute (I - X*iXKZ*KZ')*V where, | ||
98 | V, the vectors to apply the projector, | ||
99 | cV, the number of vectors in V, | ||
100 | */ | ||
101 | 5814 | static PetscErrorCode dvd_improvex_applytrans_proj(dvdDashboard *d,Vec *V,PetscInt cV) | |
102 | { | ||
103 | 5814 | dvdImprovex_jd *data = (dvdImprovex_jd*)d->improveX_data; | |
104 | 5814 | PetscInt i,ldh,k,l; | |
105 | 5814 | PetscScalar *h; | |
106 | 5814 | PetscBLASInt cV_, n, info, ld; | |
107 | #if defined(PETSC_USE_COMPLEX) | ||
108 | 5337 | PetscInt j; | |
109 | #endif | ||
110 | |||
111 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
5814 | PetscFunctionBegin; |
112 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
5814 | PetscAssert(cV<=2,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Consistency broken"); |
113 | |||
114 | /* h <- KZ'*V */ | ||
115 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5814 | PetscCall(PetscMalloc1(data->size_iXKZ*cV,&h)); |
116 | 5814 | ldh = data->size_iXKZ; | |
117 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5814 | PetscCall(BVGetActiveColumns(data->U,&l,&k)); |
118 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
5814 | PetscAssert(ldh==k,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Consistency broken"); |
119 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5814 | PetscCall(BVSetActiveColumns(data->KZ,0,k)); |
120 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
11628 | for (i=0;i<cV;i++) { |
121 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5814 | PetscCall(BVDotVec(data->KZ,V[i],&h[ldh*i])); |
122 | #if defined(PETSC_USE_COMPLEX) | ||
123 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
10674 | for (j=0;j<k;j++) h[ldh*i+j] = PetscConj(h[ldh*i+j]); |
124 | #endif | ||
125 | } | ||
126 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5814 | PetscCall(BVSetActiveColumns(data->KZ,l,k)); |
127 | |||
128 | /* h <- iXKZ\h */ | ||
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.
|
5814 | PetscCall(PetscBLASIntCast(cV,&cV_)); |
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.
|
5814 | PetscCall(PetscBLASIntCast(data->size_iXKZ,&n)); |
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.
|
5814 | PetscCall(PetscBLASIntCast(data->ldiXKZ,&ld)); |
132 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5814 | PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF)); |
133 |
10/20✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
5814 | PetscCallBLAS("LAPACKgetrs",LAPACKgetrs_("C",&n,&cV_,data->iXKZ,&ld,data->iXKZPivots,h,&n,&info)); |
134 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5814 | PetscCall(PetscFPTrapPop()); |
135 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
5814 | SlepcCheckLapackInfo("getrs",info); |
136 | |||
137 | /* V <- V - U*h */ | ||
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.
|
5814 | PetscCall(BVSetActiveColumns(data->U,0,k)); |
139 |
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.
|
11628 | for (i=0;i<cV;i++) PetscCall(BVMultVec(data->U,-1.0,1.0,V[i],&h[ldh*i])); |
140 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5814 | PetscCall(BVSetActiveColumns(data->U,l,k)); |
141 |
5/8✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
5814 | PetscCall(PetscFree(h)); |
142 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
1252 | PetscFunctionReturn(PETSC_SUCCESS); |
143 | } | ||
144 | |||
145 | 814 | static PetscErrorCode dvd_improvex_jd_end(dvdDashboard *d) | |
146 | { | ||
147 | 814 | dvdImprovex_jd *data = (dvdImprovex_jd*)d->improveX_data; | |
148 | |||
149 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
814 | PetscFunctionBegin; |
150 |
4/6✓ Branch 0 taken 2 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)); |
151 | |||
152 | /* Restore the pc of ksp */ | ||
153 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
814 | if (data->old_pc) { |
154 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
194 | PetscCall(KSPSetPC(data->ksp, data->old_pc)); |
155 |
4/6✓ Branch 0 taken 2 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)); |
156 | } | ||
157 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
158 | PetscFunctionReturn(PETSC_SUCCESS); |
158 | } | ||
159 | |||
160 | 814 | static PetscErrorCode dvd_improvex_jd_d(dvdDashboard *d) | |
161 | { | ||
162 | 814 | dvdImprovex_jd *data = (dvdImprovex_jd*)d->improveX_data; | |
163 | |||
164 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
814 | PetscFunctionBegin; |
165 | /* Free local data and objects */ | ||
166 |
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.
|
814 | PetscCall(PetscFree(data->XKZ)); |
167 |
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.
|
814 | PetscCall(PetscFree(data->iXKZ)); |
168 |
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.
|
814 | PetscCall(PetscFree(data->iXKZPivots)); |
169 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
814 | PetscCall(BVDestroy(&data->KZ)); |
170 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
814 | PetscCall(BVDestroy(&data->U)); |
171 |
6/8✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
814 | PetscCall(PetscFree(data)); |
172 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
158 | PetscFunctionReturn(PETSC_SUCCESS); |
173 | } | ||
174 | |||
175 | /* | ||
176 | y <- theta[1]A*x - theta[0]*B*x | ||
177 | auxV, two auxiliary vectors | ||
178 | */ | ||
179 | 501620 | static inline PetscErrorCode dvd_aux_matmult(dvdImprovex_jd *data,const Vec *x,const Vec *y) | |
180 | { | ||
181 | 501620 | PetscInt n,i; | |
182 | 501620 | const Vec *Bx; | |
183 | 501620 | Vec *auxV; | |
184 | |||
185 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
501620 | PetscFunctionBegin; |
186 | 501620 | n = data->r_e - data->r_s; | |
187 |
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.
|
1003504 | for (i=0;i<n;i++) PetscCall(MatMult(data->d->A,x[i],y[i])); |
188 | |||
189 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
501620 | PetscCall(SlepcVecPoolGetVecs(data->d->auxV,2,&auxV)); |
190 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1003240 | for (i=0;i<n;i++) { |
191 | #if !defined(PETSC_USE_COMPLEX) | ||
192 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
101121 | if (PetscUnlikely(data->d->eigi[data->r_s+i] != 0.0)) { |
193 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
|
264 | if (data->d->B) { |
194 | ✗ | PetscCall(MatMult(data->d->B,x[i],auxV[0])); | |
195 | ✗ | PetscCall(MatMult(data->d->B,x[i+1],auxV[1])); | |
196 | ✗ | Bx = auxV; | |
197 | 264 | } else Bx = &x[i]; | |
198 | |||
199 | /* y_i <- [ t_2i+1*A*x_i - t_2i*Bx_i + ti_i*Bx_i+1; | ||
200 | y_i+1 t_2i+1*A*x_i+1 - ti_i*Bx_i - t_2i*Bx_i+1 ] */ | ||
201 |
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.
|
264 | PetscCall(VecAXPBYPCZ(y[i],-data->theta[2*i],data->thetai[i],data->theta[2*i+1],Bx[0],Bx[1])); |
202 |
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.
|
264 | PetscCall(VecAXPBYPCZ(y[i+1],-data->thetai[i],-data->theta[2*i],data->theta[2*i+1],Bx[0],Bx[1])); |
203 | 264 | i++; | |
204 | } else | ||
205 | #endif | ||
206 | { | ||
207 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
501356 | if (data->d->B) { |
208 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
96166 | PetscCall(MatMult(data->d->B,x[i],auxV[0])); |
209 | 96166 | Bx = auxV; | |
210 | 405190 | } else Bx = &x[i]; | |
211 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
501620 | PetscCall(VecAXPBY(y[i],-data->theta[i*2],data->theta[i*2+1],Bx[0])); |
212 | } | ||
213 | } | ||
214 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
501620 | PetscCall(SlepcVecPoolRestoreVecs(data->d->auxV,2,&auxV)); |
215 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
88438 | PetscFunctionReturn(PETSC_SUCCESS); |
216 | } | ||
217 | |||
218 | /* | ||
219 | y <- theta[1]'*A'*x - theta[0]'*B'*x | ||
220 | */ | ||
221 | 5512 | static inline PetscErrorCode dvd_aux_matmulttrans(dvdImprovex_jd *data,const Vec *x,const Vec *y) | |
222 | { | ||
223 | 5512 | PetscInt n,i; | |
224 | 5512 | const Vec *Bx; | |
225 | 5512 | Vec *auxV; | |
226 | |||
227 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
5512 | PetscFunctionBegin; |
228 | 5512 | n = data->r_e - data->r_s; | |
229 |
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.
|
11024 | for (i=0;i<n;i++) PetscCall(MatMultTranspose(data->d->A,x[i],y[i])); |
230 | |||
231 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5512 | PetscCall(SlepcVecPoolGetVecs(data->d->auxV,2,&auxV)); |
232 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
11024 | for (i=0;i<n;i++) { |
233 | #if !defined(PETSC_USE_COMPLEX) | ||
234 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
|
402 | if (data->d->eigi[data->r_s+i] != 0.0) { |
235 | ✗ | if (data->d->B) { | |
236 | ✗ | PetscCall(MatMultTranspose(data->d->B,x[i],auxV[0])); | |
237 | ✗ | PetscCall(MatMultTranspose(data->d->B,x[i+1],auxV[1])); | |
238 | ✗ | Bx = auxV; | |
239 | ✗ | } else Bx = &x[i]; | |
240 | |||
241 | /* y_i <- [ t_2i+1*A*x_i - t_2i*Bx_i - ti_i*Bx_i+1; | ||
242 | y_i+1 t_2i+1*A*x_i+1 + ti_i*Bx_i - t_2i*Bx_i+1 ] */ | ||
243 | ✗ | PetscCall(VecAXPBYPCZ(y[i],-data->theta[2*i],-data->thetai[i],data->theta[2*i+1],Bx[0],Bx[1])); | |
244 | ✗ | PetscCall(VecAXPBYPCZ(y[i+1],data->thetai[i],-data->theta[2*i],data->theta[2*i+1],Bx[0],Bx[1])); | |
245 | ✗ | i++; | |
246 | } else | ||
247 | #endif | ||
248 | { | ||
249 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
5512 | if (data->d->B) { |
250 | ✗ | PetscCall(MatMultTranspose(data->d->B,x[i],auxV[0])); | |
251 | ✗ | Bx = auxV; | |
252 | 5512 | } else Bx = &x[i]; | |
253 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5512 | PetscCall(VecAXPBY(y[i],PetscConj(-data->theta[i*2]),PetscConj(data->theta[i*2+1]),Bx[0])); |
254 | } | ||
255 | } | ||
256 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5512 | PetscCall(SlepcVecPoolRestoreVecs(data->d->auxV,2,&auxV)); |
257 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
1177 | PetscFunctionReturn(PETSC_SUCCESS); |
258 | } | ||
259 | |||
260 | 322040 | static PetscErrorCode PCApplyBA_dvd(PC pc,PCSide side,Vec in,Vec out,Vec w) | |
261 | { | ||
262 | 322040 | dvdImprovex_jd *data; | |
263 | 322040 | PetscInt n,i; | |
264 | 322040 | const Vec *inx,*outx,*wx; | |
265 | 322040 | Vec *auxV; | |
266 | 322040 | Mat A; | |
267 | |||
268 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
322040 | PetscFunctionBegin; |
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.
|
322040 | PetscCall(PCGetOperators(pc,&A,NULL)); |
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.
|
322040 | PetscCall(MatShellGetContext(A,&data)); |
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.
|
322040 | PetscCall(VecCompGetSubVecs(in,NULL,&inx)); |
272 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
322040 | PetscCall(VecCompGetSubVecs(out,NULL,&outx)); |
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.
|
322040 | PetscCall(VecCompGetSubVecs(w,NULL,&wx)); |
274 | 322040 | n = data->r_e - data->r_s; | |
275 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
322040 | PetscCall(SlepcVecPoolGetVecs(data->d->auxV,n,&auxV)); |
276 |
1/4✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
322040 | switch (side) { |
277 | 322040 | case PC_LEFT: | |
278 | /* aux <- theta[1]A*in - theta[0]*B*in */ | ||
279 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
322040 | PetscCall(dvd_aux_matmult(data,inx,auxV)); |
280 | |||
281 | /* out <- K * aux */ | ||
282 |
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.
|
644344 | for (i=0;i<n;i++) PetscCall(data->d->improvex_precond(data->d,data->r_s+i,auxV[i],outx[i])); |
283 | break; | ||
284 | case PC_RIGHT: | ||
285 | /* aux <- K * in */ | ||
286 | ✗ | for (i=0;i<n;i++) PetscCall(data->d->improvex_precond(data->d,data->r_s+i,inx[i],auxV[i])); | |
287 | |||
288 | /* out <- theta[1]A*auxV - theta[0]*B*auxV */ | ||
289 | ✗ | PetscCall(dvd_aux_matmult(data,auxV,outx)); | |
290 | break; | ||
291 | case PC_SYMMETRIC: | ||
292 | /* aux <- K^{1/2} * in */ | ||
293 | ✗ | for (i=0;i<n;i++) PetscCall(PCApplySymmetricRight(data->old_pc,inx[i],auxV[i])); | |
294 | |||
295 | /* wx <- theta[1]A*auxV - theta[0]*B*auxV */ | ||
296 | ✗ | PetscCall(dvd_aux_matmult(data,auxV,wx)); | |
297 | |||
298 | /* aux <- K^{1/2} * in */ | ||
299 | ✗ | for (i=0;i<n;i++) PetscCall(PCApplySymmetricLeft(data->old_pc,wx[i],outx[i])); | |
300 | break; | ||
301 | ✗ | default: | |
302 | ✗ | SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Unsupported KSP side"); | |
303 | } | ||
304 | /* out <- out - v*(u'*out) */ | ||
305 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
322040 | PetscCall(dvd_improvex_apply_proj(data->d,(Vec*)outx,n)); |
306 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
322040 | PetscCall(SlepcVecPoolRestoreVecs(data->d->auxV,n,&auxV)); |
307 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
62100 | PetscFunctionReturn(PETSC_SUCCESS); |
308 | } | ||
309 | |||
310 | 9822 | static PetscErrorCode PCApply_dvd(PC pc,Vec in,Vec out) | |
311 | { | ||
312 | 9822 | dvdImprovex_jd *data; | |
313 | 9822 | PetscInt n,i; | |
314 | 9822 | const Vec *inx, *outx; | |
315 | 9822 | Mat A; | |
316 | |||
317 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
9822 | PetscFunctionBegin; |
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.
|
9822 | PetscCall(PCGetOperators(pc,&A,NULL)); |
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.
|
9822 | PetscCall(MatShellGetContext(A,&data)); |
320 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
9822 | PetscCall(VecCompGetSubVecs(in,NULL,&inx)); |
321 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
9822 | PetscCall(VecCompGetSubVecs(out,NULL,&outx)); |
322 | 9822 | n = data->r_e - data->r_s; | |
323 | /* out <- K * in */ | ||
324 |
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.
|
19649 | for (i=0;i<n;i++) PetscCall(data->d->improvex_precond(data->d,data->r_s+i,inx[i],outx[i])); |
325 | /* out <- out - v*(u'*out) */ | ||
326 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
9822 | PetscCall(dvd_improvex_apply_proj(data->d,(Vec*)outx,n)); |
327 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
2031 | PetscFunctionReturn(PETSC_SUCCESS); |
328 | } | ||
329 | |||
330 | 5814 | static PetscErrorCode PCApplyTranspose_dvd(PC pc,Vec in,Vec out) | |
331 | { | ||
332 | 5814 | dvdImprovex_jd *data; | |
333 | 5814 | PetscInt n,i; | |
334 | 5814 | const Vec *inx, *outx; | |
335 | 5814 | Vec *auxV; | |
336 | 5814 | Mat A; | |
337 | |||
338 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
5814 | PetscFunctionBegin; |
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.
|
5814 | PetscCall(PCGetOperators(pc,&A,NULL)); |
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.
|
5814 | PetscCall(MatShellGetContext(A,&data)); |
341 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5814 | PetscCall(VecCompGetSubVecs(in,NULL,&inx)); |
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.
|
5814 | PetscCall(VecCompGetSubVecs(out,NULL,&outx)); |
343 | 5814 | n = data->r_e - data->r_s; | |
344 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5814 | PetscCall(SlepcVecPoolGetVecs(data->d->auxV,n,&auxV)); |
345 | /* auxV <- in */ | ||
346 |
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.
|
11628 | for (i=0;i<n;i++) PetscCall(VecCopy(inx[i],auxV[i])); |
347 | /* auxV <- auxV - u*(v'*auxV) */ | ||
348 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5814 | PetscCall(dvd_improvex_applytrans_proj(data->d,auxV,n)); |
349 | /* out <- K' * aux */ | ||
350 |
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.
|
11628 | for (i=0;i<n;i++) PetscCall(PCApplyTranspose(data->old_pc,auxV[i],outx[i])); |
351 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5814 | PetscCall(SlepcVecPoolRestoreVecs(data->d->auxV,n,&auxV)); |
352 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
1252 | PetscFunctionReturn(PETSC_SUCCESS); |
353 | } | ||
354 | |||
355 | 179580 | static PetscErrorCode MatMult_dvd_jd(Mat A,Vec in,Vec out) | |
356 | { | ||
357 | 179580 | dvdImprovex_jd *data; | |
358 | 179580 | PetscInt n; | |
359 | 179580 | const Vec *inx, *outx; | |
360 | 179580 | PCSide side; | |
361 | |||
362 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
179580 | PetscFunctionBegin; |
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.
|
179580 | PetscCall(MatShellGetContext(A,&data)); |
364 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
179580 | PetscCall(VecCompGetSubVecs(in,NULL,&inx)); |
365 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
179580 | PetscCall(VecCompGetSubVecs(out,NULL,&outx)); |
366 | 179580 | n = data->r_e - data->r_s; | |
367 | /* out <- theta[1]A*in - theta[0]*B*in */ | ||
368 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
179580 | PetscCall(dvd_aux_matmult(data,inx,outx)); |
369 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
179580 | PetscCall(KSPGetPCSide(data->ksp,&side)); |
370 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
179580 | if (side == PC_RIGHT) { |
371 | /* out <- out - v*(u'*out) */ | ||
372 | ✗ | PetscCall(dvd_improvex_apply_proj(data->d,(Vec*)outx,n)); | |
373 | } | ||
374 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
26338 | PetscFunctionReturn(PETSC_SUCCESS); |
375 | } | ||
376 | |||
377 | 5512 | static PetscErrorCode MatMultTranspose_dvd_jd(Mat A,Vec in,Vec out) | |
378 | { | ||
379 | 5512 | dvdImprovex_jd *data; | |
380 | 5512 | PetscInt n,i; | |
381 | 5512 | const Vec *inx,*outx,*r; | |
382 | 5512 | Vec *auxV; | |
383 | 5512 | PCSide side; | |
384 | |||
385 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
5512 | PetscFunctionBegin; |
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.
|
5512 | PetscCall(MatShellGetContext(A,&data)); |
387 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5512 | PetscCall(VecCompGetSubVecs(in,NULL,&inx)); |
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.
|
5512 | PetscCall(VecCompGetSubVecs(out,NULL,&outx)); |
389 | 5512 | n = data->r_e - data->r_s; | |
390 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5512 | PetscCall(KSPGetPCSide(data->ksp,&side)); |
391 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
5512 | if (side == PC_RIGHT) { |
392 | /* auxV <- in */ | ||
393 | ✗ | PetscCall(SlepcVecPoolGetVecs(data->d->auxV,n,&auxV)); | |
394 | ✗ | for (i=0;i<n;i++) PetscCall(VecCopy(inx[i],auxV[i])); | |
395 | /* auxV <- auxV - v*(u'*auxV) */ | ||
396 | ✗ | PetscCall(dvd_improvex_applytrans_proj(data->d,auxV,n)); | |
397 | ✗ | r = auxV; | |
398 | 5512 | } else r = inx; | |
399 | /* out <- theta[1]A*r - theta[0]*B*r */ | ||
400 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5512 | PetscCall(dvd_aux_matmulttrans(data,r,outx)); |
401 |
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.
|
5512 | if (side == PC_RIGHT) PetscCall(SlepcVecPoolRestoreVecs(data->d->auxV,n,&auxV)); |
402 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
1177 | PetscFunctionReturn(PETSC_SUCCESS); |
403 | } | ||
404 | |||
405 | 244 | static PetscErrorCode MatCreateVecs_dvd_jd(Mat A,Vec *right,Vec *left) | |
406 | { | ||
407 | 244 | Vec *r,*l; | |
408 | 244 | dvdImprovex_jd *data; | |
409 | 244 | PetscInt n,i; | |
410 | |||
411 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
244 | PetscFunctionBegin; |
412 |
4/6✓ Branch 0 taken 2 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)); |
413 | 244 | n = data->ksp_max_size; | |
414 |
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)); |
415 |
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)); |
416 |
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)); |
417 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
244 | if (right) { |
418 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
244 | PetscCall(VecCreateCompWithVecs(r,n,data->friends,right)); |
419 |
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])); |
420 | } | ||
421 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
244 | if (left) { |
422 | ✗ | PetscCall(VecCreateCompWithVecs(l,n,data->friends,left)); | |
423 | ✗ | for (i=0;i<n;i++) PetscCall(VecDestroy(&l[i])); | |
424 | } | ||
425 | |||
426 |
6/10✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
|
244 | if (right) PetscCall(PetscFree(r)); |
427 |
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)); |
428 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
48 | PetscFunctionReturn(PETSC_SUCCESS); |
429 | } | ||
430 | |||
431 | 814 | static PetscErrorCode dvd_improvex_jd_start(dvdDashboard *d) | |
432 | { | ||
433 | 814 | dvdImprovex_jd *data = (dvdImprovex_jd*)d->improveX_data; | |
434 | 814 | PetscInt rA, cA, rlA, clA; | |
435 | 814 | Mat A; | |
436 | 814 | PetscBool t; | |
437 | 814 | PC pc; | |
438 | 814 | Vec v0[2]; | |
439 | |||
440 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
814 | PetscFunctionBegin; |
441 | 814 | data->size_cX = data->old_size_X = 0; | |
442 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
814 | data->lastTol = data->dynamic?0.5:0.0; |
443 | |||
444 | /* Setup the ksp */ | ||
445 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
814 | if (data->ksp) { |
446 | /* Create the reference vector */ | ||
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(BVGetColumn(d->eps->V,0,&v0[0])); |
448 | 327 | v0[1] = v0[0]; | |
449 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
327 | PetscCall(VecCreateCompWithVecs(v0,data->ksp_max_size,NULL,&data->friends)); |
450 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
327 | PetscCall(BVRestoreColumn(d->eps->V,0,&v0[0])); |
451 | |||
452 | /* Save the current pc and set a PCNONE */ | ||
453 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
327 | PetscCall(KSPGetPC(data->ksp, &data->old_pc)); |
454 |
4/6✓ Branch 0 taken 2 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)); |
455 | 327 | data->lastTol = 0.5; | |
456 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
327 | if (t) data->old_pc = NULL; |
457 | else { | ||
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(PetscObjectReference((PetscObject)data->old_pc)); |
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(PCCreate(PetscObjectComm((PetscObject)d->eps),&pc)); |
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(PCSetType(pc,PCSHELL)); |
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(PCSetOperators(pc,d->A,d->A)); |
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(PCSetReusePreconditioner(pc,PETSC_TRUE)); |
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(PCShellSetApply(pc,PCApply_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(PCShellSetApplyBA(pc,PCApplyBA_dvd)); |
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(PCShellSetApplyTranspose(pc,PCApplyTranspose_dvd)); |
466 |
4/6✓ Branch 0 taken 2 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)); |
467 |
4/6✓ Branch 0 taken 2 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)); |
468 | } | ||
469 | |||
470 | /* Create the (I-v*u')*K*(A-s*B) matrix */ | ||
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(MatGetSize(d->A,&rA,&cA)); |
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(MatGetLocalSize(d->A,&rlA,&clA)); |
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(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)); |
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_MULT,(PetscErrorCodeFn*)MatMult_dvd_jd)); |
475 |
4/6✓ Branch 0 taken 2 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)); |
476 |
4/6✓ Branch 0 taken 2 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)); |
477 | |||
478 | /* Try to avoid KSPReset */ | ||
479 |
4/6✓ Branch 0 taken 2 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)); |
480 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
327 | if (t) { |
481 | 262 | Mat M; | |
482 | 262 | PetscInt rM; | |
483 |
4/6✓ Branch 0 taken 2 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)); |
484 |
4/6✓ Branch 0 taken 2 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)); |
485 |
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)); |
486 | } | ||
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(EPS_KSPSetOperators(data->ksp,A,A)); |
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(KSPSetReusePreconditioner(data->ksp,PETSC_TRUE)); |
489 |
4/6✓ Branch 0 taken 2 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)); |
490 |
4/6✓ Branch 0 taken 2 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)); |
491 | } else { | ||
492 | 487 | data->old_pc = NULL; | |
493 | 487 | data->friends = NULL; | |
494 | } | ||
495 |
4/6✓ Branch 0 taken 2 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)); |
496 |
4/6✓ Branch 0 taken 2 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)); |
497 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
158 | PetscFunctionReturn(PETSC_SUCCESS); |
498 | } | ||
499 | |||
500 | /* | ||
501 | Compute: u <- X, v <- K*(theta[0]*A+theta[1]*B)*X, | ||
502 | kr <- K^{-1}*(A-eig*B)*X, being X <- V*pX[i_s..i_e-1], Y <- W*pY[i_s..i_e-1] | ||
503 | where | ||
504 | pX,pY, the right and left eigenvectors of the projected system | ||
505 | ld, the leading dimension of pX and pY | ||
506 | */ | ||
507 | 54137 | 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) | |
508 | { | ||
509 | 54137 | PetscInt n=i_e-i_s,size_KZ,V_new,rm,i,lv,kv,lKZ,kKZ; | |
510 | 54137 | dvdImprovex_jd *data = (dvdImprovex_jd*)d->improveX_data; | |
511 | 54137 | const PetscScalar *array; | |
512 | 54137 | Mat M; | |
513 | 54137 | Vec u[2],v[2]; | |
514 | 54137 | PetscBLASInt s,ldXKZ,info; | |
515 | |||
516 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
54137 | PetscFunctionBegin; |
517 | /* Check consistency */ | ||
518 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
54137 | PetscCall(BVGetActiveColumns(d->eps->V,&lv,&kv)); |
519 | 54137 | V_new = lv - data->size_cX; | |
520 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
54137 | PetscAssert(V_new<=data->old_size_X,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Consistency broken"); |
521 | 54137 | data->old_size_X = n; | |
522 | 54137 | data->size_cX = lv; | |
523 | |||
524 | /* KZ <- KZ(rm:rm+max_cX-1) */ | ||
525 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
54137 | PetscCall(BVGetActiveColumns(data->KZ,&lKZ,&kKZ)); |
526 | 54137 | rm = PetscMax(V_new+lKZ,0); | |
527 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
54137 | if (rm > 0) { |
528 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
1874 | for (i=0;i<lKZ;i++) { |
529 | ✗ | PetscCall(BVCopyColumn(data->KZ,i+rm,i)); | |
530 | ✗ | PetscCall(BVCopyColumn(data->U,i+rm,i)); | |
531 | } | ||
532 | } | ||
533 | |||
534 | /* XKZ <- XKZ(rm:rm+max_cX-1,rm:rm+max_cX-1) */ | ||
535 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
|
11412 | if (rm > 0) { |
536 |
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)); |
537 | } | ||
538 | 54137 | lKZ = PetscMin(0,lKZ+V_new); | |
539 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
54137 | PetscCall(BVSetActiveColumns(data->KZ,lKZ,lKZ+n)); |
540 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
54137 | PetscCall(BVSetActiveColumns(data->U,lKZ,lKZ+n)); |
541 | |||
542 | /* Compute X, KZ and KR */ | ||
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.
|
54137 | PetscCall(BVGetColumn(data->U,lKZ,u)); |
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.
|
54137 | if (n>1) PetscCall(BVGetColumn(data->U,lKZ+1,&u[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.
|
54137 | PetscCall(BVGetColumn(data->KZ,lKZ,v)); |
546 |
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.
|
54137 | if (n>1) PetscCall(BVGetColumn(data->KZ,lKZ+1,&v[1])); |
547 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
54137 | PetscCall(d->improvex_jd_proj_uv(d,i_s,i_e,u,v,kr,theta,thetai,pX,pY,ld)); |
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.
|
54137 | PetscCall(BVRestoreColumn(data->U,lKZ,u)); |
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.
|
54137 | if (n>1) PetscCall(BVRestoreColumn(data->U,lKZ+1,&u[1])); |
550 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
54137 | PetscCall(BVRestoreColumn(data->KZ,lKZ,v)); |
551 |
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.
|
54137 | if (n>1) PetscCall(BVRestoreColumn(data->KZ,lKZ+1,&v[1])); |
552 | |||
553 | /* XKZ <- U'*KZ */ | ||
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.
|
54137 | PetscCall(MatCreateSeqDense(PETSC_COMM_SELF,lKZ+n,lKZ+n,NULL,&M)); |
555 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
54137 | PetscCall(BVMatProject(data->KZ,NULL,data->U,M)); |
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.
|
54137 | PetscCall(MatDenseGetArrayRead(M,&array)); |
557 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
108520 | for (i=lKZ;i<lKZ+n;i++) { /* upper part */ |
558 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
54383 | PetscCall(PetscArraycpy(&data->XKZ[data->ldXKZ*i],&array[i*(lKZ+n)],lKZ)); |
559 | } | ||
560 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
108520 | for (i=0;i<lKZ+n;i++) { /* lower part */ |
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.
|
54383 | PetscCall(PetscArraycpy(&data->XKZ[data->ldXKZ*i+lKZ],&array[i*(lKZ+n)+lKZ],n)); |
562 | } | ||
563 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
54137 | PetscCall(MatDenseRestoreArrayRead(M,&array)); |
564 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
54137 | PetscCall(MatDestroy(&M)); |
565 | |||
566 | /* iXKZ <- inv(XKZ) */ | ||
567 | 54137 | size_KZ = lKZ+n; | |
568 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
54137 | PetscCall(PetscBLASIntCast(lKZ+n,&s)); |
569 | 54137 | data->ldiXKZ = data->size_iXKZ = size_KZ; | |
570 |
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.
|
108520 | for (i=0;i<size_KZ;i++) PetscCall(PetscArraycpy(&data->iXKZ[data->ldiXKZ*i],&data->XKZ[data->ldXKZ*i],size_KZ)); |
571 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
54137 | PetscCall(PetscBLASIntCast(data->ldiXKZ,&ldXKZ)); |
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.
|
54137 | PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF)); |
573 |
10/20✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
54137 | PetscCallBLAS("LAPACKgetrf",LAPACKgetrf_(&s,&s,data->iXKZ,&ldXKZ,data->iXKZPivots,&info)); |
574 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
54137 | PetscCall(PetscFPTrapPop()); |
575 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
54137 | SlepcCheckLapackInfo("getrf",info); |
576 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
10326 | PetscFunctionReturn(PETSC_SUCCESS); |
577 | } | ||
578 | |||
579 | 50218 | static PetscErrorCode dvd_improvex_jd_gen(dvdDashboard *d,PetscInt r_s,PetscInt r_e,PetscInt *size_D) | |
580 | { | ||
581 | 50218 | dvdImprovex_jd *data = (dvdImprovex_jd*)d->improveX_data; | |
582 | 50218 | PetscInt i,j,n,maxits,maxits0,lits,s,ld,k,max_size_D,lV,kV; | |
583 | 50218 | PetscScalar *pX,*pY; | |
584 | 50218 | PetscReal tol,tol0; | |
585 | 50218 | Vec *kr,kr_comp,D_comp,D[2],kr0[2]; | |
586 | 50218 | PetscBool odd_situation = PETSC_FALSE; | |
587 | |||
588 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
50218 | PetscFunctionBegin; |
589 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
50218 | PetscCall(BVGetActiveColumns(d->eps->V,&lV,&kV)); |
590 | 50218 | max_size_D = d->eps->ncv-kV; | |
591 | /* Quick exit */ | ||
592 |
2/4✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
|
50218 | if ((max_size_D == 0) || r_e-r_s <= 0) { |
593 | ✗ | *size_D = 0; | |
594 | ✗ | PetscFunctionReturn(PETSC_SUCCESS); | |
595 | } | ||
596 | |||
597 | 50218 | n = PetscMin(PetscMin(data->size_X, max_size_D), r_e-r_s); | |
598 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
50218 | PetscAssert(n>0,PETSC_COMM_SELF,PETSC_ERR_PLIB,"n == 0"); |
599 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
50218 | PetscAssert(data->size_X>=r_e-r_s,PETSC_COMM_SELF,PETSC_ERR_PLIB,"size_X < r_e-r_s"); |
600 | |||
601 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
50218 | PetscCall(DSGetLeadingDimension(d->eps->ds,&ld)); |
602 | |||
603 | /* Restart lastTol if a new pair converged */ | ||
604 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
50218 | if (data->dynamic && data->size_cX < lV) |
605 | 10 | data->lastTol = 0.5; | |
606 | |||
607 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
101667 | for (i=0;i<n;i+=s) { |
608 | /* If the selected eigenvalue is complex, but the arithmetic is real... */ | ||
609 | #if !defined(PETSC_USE_COMPLEX) | ||
610 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
25084 | if (d->eigi[r_s+i] != 0.0) { |
611 |
1/2✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
|
246 | if (i+2 <= max_size_D) s=2; |
612 | else break; | ||
613 | } else | ||
614 | #endif | ||
615 | 29053 | s=1; | |
616 | |||
617 | 54137 | data->r_s = r_s+i; | |
618 | 54137 | data->r_e = r_s+i+s; | |
619 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
54137 | PetscCall(SlepcVecPoolGetVecs(d->auxV,s,&kr)); |
620 | |||
621 | /* Compute theta, maximum iterations and tolerance */ | ||
622 | maxits = 0; | ||
623 | tol = 1; | ||
624 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
108520 | for (j=0;j<s;j++) { |
625 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
54383 | PetscCall(d->improvex_jd_lit(d,r_s+i+j,&data->theta[2*j],&data->thetai[j],&maxits0,&tol0)); |
626 | 54383 | maxits += maxits0; | |
627 | 54383 | tol *= tol0; | |
628 | } | ||
629 | 54137 | maxits/= s; | |
630 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
54137 | tol = data->dynamic?data->lastTol:PetscExpReal(PetscLogReal(tol)/s); |
631 | |||
632 | /* Compute u, v and kr */ | ||
633 | 54137 | k = r_s+i; | |
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.
|
54137 | PetscCall(DSVectors(d->eps->ds,DS_MAT_X,&k,NULL)); |
635 | 54137 | k = r_s+i; | |
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.
|
54137 | PetscCall(DSVectors(d->eps->ds,DS_MAT_Y,&k,NULL)); |
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.
|
54137 | PetscCall(DSGetArray(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.
|
54137 | PetscCall(DSGetArray(d->eps->ds,DS_MAT_Y,&pY)); |
639 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
54137 | PetscCall(dvd_improvex_jd_proj_cuv(d,r_s+i,r_s+i+s,kr,data->theta,data->thetai,pX,pY,ld)); |
640 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
54137 | PetscCall(DSRestoreArray(d->eps->ds,DS_MAT_X,&pX)); |
641 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
54137 | PetscCall(DSRestoreArray(d->eps->ds,DS_MAT_Y,&pY)); |
642 | |||
643 | /* Check if the first eigenpairs are converged */ | ||
644 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
54137 | if (i == 0) { |
645 | 50218 | PetscInt oldnpreconv = d->npreconv; | |
646 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
50218 | PetscCall(d->preTestConv(d,0,r_s+s,r_s+s,&d->npreconv)); |
647 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
50218 | if (d->npreconv > oldnpreconv) break; |
648 | } | ||
649 | |||
650 | /* Test the odd situation of solving Ax=b with A=I */ | ||
651 | #if !defined(PETSC_USE_COMPLEX) | ||
652 |
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.
|
23765 | odd_situation = (data->ksp && data->theta[0] == 1. && data->theta[1] == 0. && data->thetai[0] == 0. && d->B == NULL)? PETSC_TRUE: PETSC_FALSE; |
653 | #else | ||
654 |
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.
|
27684 | odd_situation = (data->ksp && data->theta[0] == 1. && data->theta[1] == 0. && d->B == NULL)? PETSC_TRUE: PETSC_FALSE; |
655 | #endif | ||
656 | /* If JD */ | ||
657 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
51449 | if (data->ksp && !odd_situation) { |
658 | /* kr <- -kr */ | ||
659 |
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.
|
13399 | for (j=0;j<s;j++) PetscCall(VecScale(kr[j],-1.0)); |
660 | |||
661 | /* Compose kr and D */ | ||
662 | 6697 | kr0[0] = kr[0]; | |
663 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
6697 | kr0[1] = (s==2 ? kr[1] : NULL); |
664 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6697 | PetscCall(VecCreateCompWithVecs(kr0,data->ksp_max_size,data->friends,&kr_comp)); |
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.
|
6697 | PetscCall(BVGetColumn(d->eps->V,kV+i,&D[0])); |
666 |
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.
|
6697 | if (s==2) PetscCall(BVGetColumn(d->eps->V,kV+i+1,&D[1])); |
667 | 6692 | else D[1] = NULL; | |
668 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6697 | PetscCall(VecCreateCompWithVecs(D,data->ksp_max_size,data->friends,&D_comp)); |
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.
|
6697 | PetscCall(VecCompSetSubVecs(data->friends,s,NULL)); |
670 | |||
671 | /* Solve the correction equation */ | ||
672 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6697 | PetscCall(KSPSetTolerances(data->ksp,tol,PETSC_CURRENT,PETSC_CURRENT,maxits)); |
673 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6697 | PetscCall(KSPSolve(data->ksp,kr_comp,D_comp)); |
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.
|
6697 | PetscCall(KSPGetIterationNumber(data->ksp,&lits)); |
675 | |||
676 | /* Destroy the composed ks and D */ | ||
677 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6697 | PetscCall(VecDestroy(&kr_comp)); |
678 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6697 | PetscCall(VecDestroy(&D_comp)); |
679 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6697 | PetscCall(BVRestoreColumn(d->eps->V,kV+i,&D[0])); |
680 |
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.
|
2577 | if (s==2) PetscCall(BVRestoreColumn(d->eps->V,kV+i+1,&D[1])); |
681 | |||
682 | /* If GD */ | ||
683 | } else { | ||
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.
|
44752 | PetscCall(BVGetColumn(d->eps->V,kV+i,&D[0])); |
685 |
5/8✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
|
21188 | if (s==2) PetscCall(BVGetColumn(d->eps->V,kV+i+1,&D[1])); |
686 |
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.
|
89735 | for (j=0;j<s;j++) PetscCall(d->improvex_precond(d,r_s+i+j,kr[j],D[j])); |
687 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
44752 | PetscCall(dvd_improvex_apply_proj(d,D,s)); |
688 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
44752 | PetscCall(BVRestoreColumn(d->eps->V,kV+i,&D[0])); |
689 |
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.
|
48872 | if (s==2) PetscCall(BVRestoreColumn(d->eps->V,kV+i+1,&D[1])); |
690 | } | ||
691 | /* Prevent that short vectors are discarded in the orthogonalization */ | ||
692 |
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.
|
51449 | if (i == 0 && d->eps->errest[d->nconv+r_s] > PETSC_MACHINE_EPSILON && d->eps->errest[d->nconv+r_s] < PETSC_MAX_REAL) { |
693 |
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.
|
95291 | for (j=0;j<s;j++) PetscCall(BVScaleColumn(d->eps->V,kV+i+j,1.0/d->eps->errest[d->nconv+r_s])); |
694 | } | ||
695 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
51449 | PetscCall(SlepcVecPoolRestoreVecs(d->auxV,s,&kr)); |
696 | } | ||
697 | 50218 | *size_D = i; | |
698 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 5 times.
|
50746 | if (data->dynamic) data->lastTol = PetscMax(data->lastTol/2.0,PETSC_MACHINE_EPSILON*10.0); |
699 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
9541 | PetscFunctionReturn(PETSC_SUCCESS); |
700 | } | ||
701 | |||
702 | 2442 | PetscErrorCode dvd_improvex_jd(dvdDashboard *d,dvdBlackboard *b,KSP ksp,PetscInt max_bs,PetscBool dynamic) | |
703 | { | ||
704 | 2442 | dvdImprovex_jd *data; | |
705 | 2442 | PetscBool useGD; | |
706 | 2442 | PC pc; | |
707 | 2442 | PetscInt size_P; | |
708 | |||
709 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2442 | PetscFunctionBegin; |
710 | /* Setting configuration constrains */ | ||
711 |
4/6✓ Branch 0 taken 2 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)); |
712 | |||
713 | /* If the arithmetic is real and the problem is not Hermitian, then | ||
714 | the block size is incremented in one */ | ||
715 | #if !defined(PETSC_USE_COMPLEX) | ||
716 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
1206 | if (!DVD_IS(d->sEP,DVD_EP_HERMITIAN)) { |
717 | 318 | max_bs++; | |
718 | 318 | b->max_size_P = PetscMax(b->max_size_P,2); | |
719 | } else | ||
720 | #endif | ||
721 | { | ||
722 | 2124 | b->max_size_P = PetscMax(b->max_size_P,1); | |
723 | } | ||
724 | 2442 | b->max_size_X = PetscMax(b->max_size_X,max_bs); | |
725 | 2442 | size_P = b->max_size_P; | |
726 | |||
727 | /* Setup the preconditioner */ | ||
728 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
2442 | if (ksp) { |
729 |
4/6✓ Branch 0 taken 2 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)); |
730 |
4/6✓ Branch 0 taken 2 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)); |
731 | ✗ | } else PetscCall(dvd_static_precond_PC(d,b,NULL)); | |
732 | |||
733 | /* Setup the step */ | ||
734 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2442 | if (b->state >= DVD_STATE_CONF) { |
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(PetscNew(&data)); |
736 | 814 | data->dynamic = dynamic; | |
737 |
4/6✓ Branch 0 taken 2 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)); |
738 |
4/6✓ Branch 0 taken 2 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)); |
739 |
4/6✓ Branch 0 taken 2 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)); |
740 | 814 | data->ldXKZ = size_P; | |
741 | 814 | data->size_X = b->max_size_X; | |
742 | 814 | d->improveX_data = data; | |
743 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
814 | data->ksp = useGD? NULL: ksp; |
744 | 814 | data->d = d; | |
745 | 814 | d->improveX = dvd_improvex_jd_gen; | |
746 | #if !defined(PETSC_USE_COMPLEX) | ||
747 |
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; |
748 | else | ||
749 | #endif | ||
750 | 708 | data->ksp_max_size = 1; | |
751 | /* Create various vector basis */ | ||
752 |
4/6✓ Branch 0 taken 2 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)); |
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(BVSetMatrix(data->KZ,NULL,PETSC_FALSE)); |
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(BVDuplicate(data->KZ,&data->U)); |
755 | |||
756 |
4/6✓ Branch 0 taken 2 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)); |
757 |
4/6✓ Branch 0 taken 2 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)); |
758 |
4/6✓ Branch 0 taken 2 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)); |
759 | } | ||
760 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
474 | PetscFunctionReturn(PETSC_SUCCESS); |
761 | } | ||
762 | |||
763 | #if !defined(PETSC_USE_COMPLEX) | ||
764 | 246 | static inline PetscErrorCode dvd_complex_rayleigh_quotient(Vec ur,Vec ui,Vec Axr,Vec Axi,Vec Bxr,Vec Bxi,PetscScalar *eigr,PetscScalar *eigi) | |
765 | { | ||
766 | 246 | PetscScalar rAr,iAr,rAi,iAi,rBr,iBr,rBi,iBi,b0,b2,b4,b6,b7; | |
767 | |||
768 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
246 | PetscFunctionBegin; |
769 | /* eigr = [(rAr+iAi)*(rBr+iBi) + (rAi-iAr)*(rBi-iBr)]/k | ||
770 | eigi = [(rAi-iAr)*(rBr+iBi) - (rAr+iAi)*(rBi-iBr)]/k | ||
771 | k = (rBr+iBi)*(rBr+iBi) + (rBi-iBr)*(rBi-iBr) */ | ||
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.
|
246 | PetscCall(VecDotBegin(Axr,ur,&rAr)); /* r*A*r */ |
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.
|
246 | PetscCall(VecDotBegin(Axr,ui,&iAr)); /* i*A*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.
|
246 | PetscCall(VecDotBegin(Axi,ur,&rAi)); /* r*A*i */ |
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.
|
246 | PetscCall(VecDotBegin(Axi,ui,&iAi)); /* i*A*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.
|
246 | PetscCall(VecDotBegin(Bxr,ur,&rBr)); /* r*B*r */ |
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.
|
246 | PetscCall(VecDotBegin(Bxr,ui,&iBr)); /* i*B*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.
|
246 | PetscCall(VecDotBegin(Bxi,ur,&rBi)); /* r*B*i */ |
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.
|
246 | PetscCall(VecDotBegin(Bxi,ui,&iBi)); /* i*B*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.
|
246 | PetscCall(VecDotEnd(Axr,ur,&rAr)); /* r*A*r */ |
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.
|
246 | PetscCall(VecDotEnd(Axr,ui,&iAr)); /* i*A*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.
|
246 | PetscCall(VecDotEnd(Axi,ur,&rAi)); /* r*A*i */ |
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.
|
246 | PetscCall(VecDotEnd(Axi,ui,&iAi)); /* i*A*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.
|
246 | PetscCall(VecDotEnd(Bxr,ur,&rBr)); /* r*B*r */ |
785 |
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.
|
246 | PetscCall(VecDotEnd(Bxr,ui,&iBr)); /* i*B*r */ |
786 |
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.
|
246 | PetscCall(VecDotEnd(Bxi,ur,&rBi)); /* r*B*i */ |
787 |
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.
|
246 | PetscCall(VecDotEnd(Bxi,ui,&iBi)); /* i*B*i */ |
788 | 246 | b0 = rAr+iAi; /* rAr+iAi */ | |
789 | 246 | b2 = rAi-iAr; /* rAi-iAr */ | |
790 | 246 | b4 = rBr+iBi; /* rBr+iBi */ | |
791 | 246 | b6 = rBi-iBr; /* rBi-iBr */ | |
792 | 246 | b7 = b4*b4 + b6*b6; /* k */ | |
793 | 246 | *eigr = (b0*b4 + b2*b6) / b7; /* eig_r */ | |
794 | 246 | *eigi = (b2*b4 - b0*b6) / b7; /* eig_i */ | |
795 |
6/12✓ 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 not taken.
✓ Branch 11 taken 1 times.
|
246 | PetscFunctionReturn(PETSC_SUCCESS); |
796 | } | ||
797 | #endif | ||
798 | |||
799 | 54137 | static inline PetscErrorCode dvd_compute_n_rr(PetscInt i_s,PetscInt n,PetscScalar *eigr,PetscScalar *eigi,Vec *u,Vec *Ax,Vec *Bx) | |
800 | { | ||
801 | 54137 | PetscInt i; | |
802 | 54137 | PetscScalar b0,b1; | |
803 | |||
804 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
54137 | PetscFunctionBegin; |
805 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
108274 | for (i=0; i<n; i++) { |
806 | #if !defined(PETSC_USE_COMPLEX) | ||
807 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
25084 | if (eigi[i_s+i] != 0.0) { |
808 | 246 | PetscScalar eigr0=0.0,eigi0=0.0; | |
809 |
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.
|
246 | PetscCall(dvd_complex_rayleigh_quotient(u[i],u[i+1],Ax[i],Ax[i+1],Bx[i],Bx[i+1],&eigr0,&eigi0)); |
810 |
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.
|
246 | 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)); |
811 | 246 | i++; | |
812 | } else | ||
813 | #endif | ||
814 | { | ||
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.
|
53891 | PetscCall(VecDotBegin(Ax[i],u[i],&b0)); |
816 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
53891 | PetscCall(VecDotBegin(Bx[i],u[i],&b1)); |
817 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
53891 | PetscCall(VecDotEnd(Ax[i],u[i],&b0)); |
818 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
53891 | PetscCall(VecDotEnd(Bx[i],u[i],&b1)); |
819 | 53891 | b0 = b0/b1; | |
820 |
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.
|
54137 | 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))); |
821 | } | ||
822 | } | ||
823 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
10326 | PetscFunctionReturn(PETSC_SUCCESS); |
824 | } | ||
825 | |||
826 | /* | ||
827 | Compute: u <- X, v <- K*(theta[0]*A+theta[1]*B)*X, | ||
828 | kr <- K^{-1}*(A-eig*B)*X, being X <- V*pX[i_s..i_e-1], Y <- W*pY[i_s..i_e-1] | ||
829 | where | ||
830 | pX,pY, the right and left eigenvectors of the projected system | ||
831 | ld, the leading dimension of pX and pY | ||
832 | */ | ||
833 | 54137 | 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) | |
834 | { | ||
835 | 54137 | PetscInt n = i_e-i_s,i; | |
836 | 54137 | PetscScalar *b; | |
837 | 54137 | Vec *Ax,*Bx,*r; | |
838 | 54137 | Mat M; | |
839 | 54137 | BV X; | |
840 | |||
841 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
54137 | PetscFunctionBegin; |
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.
|
54137 | PetscCall(BVDuplicateResize(d->eps->V,4,&X)); |
843 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
54137 | PetscCall(MatCreateSeqDense(PETSC_COMM_SELF,4,4,NULL,&M)); |
844 | /* u <- X(i) */ | ||
845 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
54137 | PetscCall(dvd_improvex_compute_X(d,i_s,i_e,u,pX,ld)); |
846 | |||
847 | /* v <- theta[0]A*u + theta[1]*B*u */ | ||
848 | |||
849 | /* Bx <- B*X(i) */ | ||
850 | 54137 | Bx = kr; | |
851 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
54137 | if (d->BX) { |
852 |
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.
|
26199 | for (i=i_s; i<i_e; ++i) PetscCall(BVMultVec(d->BX,1.0,0.0,Bx[i-i_s],&pX[ld*i])); |
853 | } else { | ||
854 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
82321 | for (i=0;i<n;i++) { |
855 |
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.
|
41168 | if (d->B) PetscCall(MatMult(d->B, u[i], Bx[i])); |
856 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
41168 | else PetscCall(VecCopy(u[i], Bx[i])); |
857 | } | ||
858 | } | ||
859 | |||
860 | /* Ax <- A*X(i) */ | ||
861 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
54137 | PetscCall(SlepcVecPoolGetVecs(d->auxV,i_e-i_s,&r)); |
862 | 54137 | Ax = r; | |
863 |
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.
|
108520 | for (i=i_s; i<i_e; ++i) PetscCall(BVMultVec(d->AX,1.0,0.0,Ax[i-i_s],&pX[ld*i])); |
864 | |||
865 | /* v <- Y(i) */ | ||
866 |
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.
|
108520 | 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])); |
867 | |||
868 | /* Recompute the eigenvalue */ | ||
869 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
54137 | PetscCall(dvd_compute_n_rr(i_s,n,d->eigr,d->eigi,v,Ax,Bx)); |
870 | |||
871 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
108274 | for (i=0;i<n;i++) { |
872 | #if !defined(PETSC_USE_COMPLEX) | ||
873 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
25084 | if (d->eigi[i_s+i] != 0.0) { |
874 | /* [r_i r_i+1 kr_i kr_i+1]*= [ theta_2i' 0 1 0 | ||
875 | 0 theta_2i' 0 1 | ||
876 | theta_2i+1 -thetai_i -eigr_i -eigi_i | ||
877 | thetai_i theta_2i+1 eigi_i -eigr_i ] */ | ||
878 |
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.
|
246 | PetscCall(MatDenseGetArrayWrite(M,&b)); |
879 | 246 | b[0] = b[5] = PetscConj(theta[2*i]); | |
880 | 246 | b[2] = b[7] = -theta[2*i+1]; | |
881 | 246 | b[6] = -(b[3] = thetai[i]); | |
882 | 246 | b[1] = b[4] = 0.0; | |
883 | 246 | b[8] = b[13] = 1.0/d->nX[i_s+i]; | |
884 | 246 | b[10] = b[15] = -d->eigr[i_s+i]/d->nX[i_s+i]; | |
885 | 246 | b[14] = -(b[11] = d->eigi[i_s+i]/d->nX[i_s+i]); | |
886 | 246 | b[9] = b[12] = 0.0; | |
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.
|
246 | PetscCall(MatDenseRestoreArrayWrite(M,&b)); |
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.
|
246 | PetscCall(BVInsertVec(X,0,Ax[i])); |
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.
|
246 | PetscCall(BVInsertVec(X,1,Ax[i+1])); |
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.
|
246 | PetscCall(BVInsertVec(X,2,Bx[i])); |
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.
|
246 | PetscCall(BVInsertVec(X,3,Bx[i+1])); |
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.
|
246 | PetscCall(BVSetActiveColumns(X,0,4)); |
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.
|
246 | PetscCall(BVMultInPlace(X,M,0,4)); |
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.
|
246 | PetscCall(BVCopyVec(X,0,Ax[i])); |
895 |
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.
|
246 | PetscCall(BVCopyVec(X,1,Ax[i+1])); |
896 |
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.
|
246 | PetscCall(BVCopyVec(X,2,Bx[i])); |
897 |
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.
|
246 | PetscCall(BVCopyVec(X,3,Bx[i+1])); |
898 | 246 | i++; | |
899 | } else | ||
900 | #endif | ||
901 | { | ||
902 | /* [Ax_i Bx_i]*= [ theta_2i' 1/nX_i | ||
903 | theta_2i+1 -eig_i/nX_i ] */ | ||
904 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
53891 | PetscCall(MatDenseGetArrayWrite(M,&b)); |
905 | 53891 | b[0] = PetscConj(theta[i*2]); | |
906 | 53891 | b[1] = theta[i*2+1]; | |
907 | 53891 | b[4] = 1.0/d->nX[i_s+i]; | |
908 | 53891 | b[5] = -d->eigr[i_s+i]/d->nX[i_s+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.
|
53891 | PetscCall(MatDenseRestoreArrayWrite(M,&b)); |
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.
|
53891 | PetscCall(BVInsertVec(X,0,Ax[i])); |
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.
|
53891 | PetscCall(BVInsertVec(X,1,Bx[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.
|
53891 | PetscCall(BVSetActiveColumns(X,0,2)); |
913 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
53891 | PetscCall(BVMultInPlace(X,M,0,2)); |
914 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
53891 | PetscCall(BVCopyVec(X,0,Ax[i])); |
915 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
54137 | PetscCall(BVCopyVec(X,1,Bx[i])); |
916 | } | ||
917 | } | ||
918 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
108520 | for (i=0; i<n; i++) d->nX[i_s+i] = 1.0; |
919 | |||
920 | /* v <- K^{-1} r = K^{-1}(theta_2i'*Ax + theta_2i+1*Bx) */ | ||
921 |
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.
|
108520 | for (i=0;i<n;i++) PetscCall(d->improvex_precond(d,i_s+i,r[i],v[i])); |
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.
|
54137 | PetscCall(SlepcVecPoolRestoreVecs(d->auxV,i_e-i_s,&r)); |
923 | |||
924 | /* kr <- P*(Ax - eig_i*Bx) */ | ||
925 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
54137 | PetscCall(d->calcpairs_proj_res(d,i_s,i_e,kr)); |
926 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
54137 | PetscCall(BVDestroy(&X)); |
927 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
54137 | PetscCall(MatDestroy(&M)); |
928 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
10326 | PetscFunctionReturn(PETSC_SUCCESS); |
929 | } | ||
930 | |||
931 | 54383 | static PetscErrorCode dvd_improvex_jd_lit_const_0(dvdDashboard *d,PetscInt i,PetscScalar* theta,PetscScalar* thetai,PetscInt *maxits,PetscReal *tol) | |
932 | { | ||
933 | 54383 | dvdImprovex_jd *data = (dvdImprovex_jd*)d->improveX_data; | |
934 | 54383 | PetscReal a; | |
935 | |||
936 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
54383 | PetscFunctionBegin; |
937 | 54383 | a = SlepcAbsEigenvalue(d->eigr[i],d->eigi[i]); | |
938 | |||
939 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
54383 | if (d->nR[i] < data->fix*a) { |
940 | 4990 | theta[0] = d->eigr[i]; | |
941 | 4990 | theta[1] = 1.0; | |
942 | #if !defined(PETSC_USE_COMPLEX) | ||
943 | 1896 | *thetai = d->eigi[i]; | |
944 | #endif | ||
945 | } else { | ||
946 | 49393 | theta[0] = d->target[0]; | |
947 | 49393 | theta[1] = d->target[1]; | |
948 | #if !defined(PETSC_USE_COMPLEX) | ||
949 | 23434 | *thetai = 0.0; | |
950 | #endif | ||
951 | } | ||
952 | |||
953 | #if defined(PETSC_USE_COMPLEX) | ||
954 |
1/2✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
|
29053 | if (thetai) *thetai = 0.0; |
955 | #endif | ||
956 | 54383 | *maxits = data->maxits; | |
957 | 54383 | *tol = data->tol; | |
958 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
54383 | PetscFunctionReturn(PETSC_SUCCESS); |
959 | } | ||
960 | |||
961 | 2442 | PetscErrorCode dvd_improvex_jd_lit_const(dvdDashboard *d,dvdBlackboard *b,PetscInt maxits,PetscReal tol,PetscReal fix) | |
962 | { | ||
963 | 2442 | dvdImprovex_jd *data = (dvdImprovex_jd*)d->improveX_data; | |
964 | |||
965 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2442 | PetscFunctionBegin; |
966 | /* Setup the step */ | ||
967 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2442 | if (b->state >= DVD_STATE_CONF) { |
968 | 814 | data->maxits = maxits; | |
969 | 814 | data->tol = tol; | |
970 | 814 | data->fix = fix; | |
971 | 814 | d->improvex_jd_lit = dvd_improvex_jd_lit_const_0; | |
972 | } | ||
973 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
2442 | PetscFunctionReturn(PETSC_SUCCESS); |
974 | } | ||
975 | |||
976 | 2442 | PetscErrorCode dvd_improvex_jd_proj_uv(dvdDashboard *d,dvdBlackboard *b) | |
977 | { | ||
978 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2442 | PetscFunctionBegin; |
979 | /* Setup the step */ | ||
980 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2442 | if (b->state >= DVD_STATE_CONF) { |
981 | 814 | d->improvex_jd_proj_uv = dvd_improvex_jd_proj_uv_KZX; | |
982 | } | ||
983 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
2442 | PetscFunctionReturn(PETSC_SUCCESS); |
984 | } | ||
985 | |||
986 | 244071 | PetscErrorCode dvd_improvex_compute_X(dvdDashboard *d,PetscInt i_s,PetscInt i_e,Vec *u_,PetscScalar *pX,PetscInt ld) | |
987 | { | ||
988 | 244071 | PetscInt n = i_e - i_s,i; | |
989 | 244071 | Vec *u; | |
990 | |||
991 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
244071 | PetscFunctionBegin; |
992 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
244071 | if (u_) u = u_; |
993 |
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.
|
25211 | else if (d->correctXnorm) PetscCall(SlepcVecPoolGetVecs(d->auxV,i_e-i_s,&u)); |
994 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
244071 | if (u_ || d->correctXnorm) { |
995 |
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.
|
440810 | for (i=0;i<n;i++) PetscCall(BVMultVec(d->eps->V,1.0,0.0,u[i],&pX[ld*(i+i_s)])); |
996 | } | ||
997 | /* nX(i) <- ||X(i)|| */ | ||
998 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
244071 | if (d->correctXnorm) { |
999 |
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.
|
25992 | for (i=0;i<n;i++) PetscCall(VecNormBegin(u[i],NORM_2,&d->nX[i_s+i])); |
1000 |
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.
|
25992 | for (i=0;i<n;i++) PetscCall(VecNormEnd(u[i],NORM_2,&d->nX[i_s+i])); |
1001 | #if !defined(PETSC_USE_COMPLEX) | ||
1002 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
12896 | for (i=0;i<n;i++) { |
1003 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
|
6448 | if (d->eigi[i_s+i] != 0.0) { |
1004 | ✗ | 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]); | |
1005 | ✗ | i++; | |
1006 | } | ||
1007 | } | ||
1008 | #endif | ||
1009 | } else { | ||
1010 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
462445 | for (i=0;i<n;i++) d->nX[i_s+i] = 1.0; |
1011 | } | ||
1012 |
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.
|
244071 | if (d->correctXnorm && !u_) PetscCall(SlepcVecPoolRestoreVecs(d->auxV,i_e-i_s,&u)); |
1013 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
49452 | PetscFunctionReturn(PETSC_SUCCESS); |
1014 | } | ||
1015 |