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