| 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: "krylovschur" | ||
| 12 | |||
| 13 | Method: thick-restarted Lanczos for Bethe-Salpeter pseudo-Hermitan matrices | ||
| 14 | |||
| 15 | References: | ||
| 16 | |||
| 17 | [1] M. Shao et al, "A structure preserving Lanczos algorithm for computing | ||
| 18 | the optical absorption spectrum", SIAM J. Matrix Anal. App. 39(2), 2018. | ||
| 19 | |||
| 20 | [2] F. Alvarruiz, B. Mellado-Pinto, J. E. Roman, "Variants of thick-restart | ||
| 21 | Lanczos for the Bethe-Salpeter eigenvalue problem", arXiv:2503.20920, | ||
| 22 | 2025. | ||
| 23 | |||
| 24 | */ | ||
| 25 | #include <slepc/private/epsimpl.h> | ||
| 26 | #include "krylovschur.h" | ||
| 27 | |||
| 28 | static PetscBool cited = PETSC_FALSE; | ||
| 29 | static const char citation[] = | ||
| 30 | "@Misc{slepc-bse,\n" | ||
| 31 | " author = \"F. Alvarruiz and B. Mellado-Pinto and J. E. Roman\",\n" | ||
| 32 | " title = \"Variants of thick-restart {Lanczos} for the {Bethe--Salpeter} eigenvalue problem\",\n" | ||
| 33 | " eprint = \"2503.20920\",\n" | ||
| 34 | " archivePrefix = \"arXiv\",\n" | ||
| 35 | " primaryClass = \"mathematics.numerical analysis\",\n" | ||
| 36 | " year = \"2025,\"\n" | ||
| 37 | " doi = \"https://doi.org/10.48550/arXiv.2503.20920\"\n" | ||
| 38 | "}\n"; | ||
| 39 | |||
| 40 | 13981 | static PetscErrorCode Orthog_Shao(Vec x,BV U,BV V,PetscInt j,PetscScalar *h,PetscScalar *c,PetscBool *breakdown) | |
| 41 | { | ||
| 42 | 13981 | PetscInt i; | |
| 43 | |||
| 44 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
13981 | PetscFunctionBegin; |
| 45 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(BVSetActiveColumns(U,0,j)); |
| 46 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(BVSetActiveColumns(V,0,j)); |
| 47 | /* c = real(V^* x) ; c2 = imag(U^* x)*1i */ | ||
| 48 | #if defined(PETSC_USE_COMPLEX) | ||
| 49 |
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.
|
8421 | PetscCall(BVDotVecBegin(V,x,c)); |
| 50 |
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.
|
8421 | PetscCall(BVDotVecBegin(U,x,c+j)); |
| 51 |
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.
|
8421 | PetscCall(BVDotVecEnd(V,x,c)); |
| 52 |
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.
|
8421 | PetscCall(BVDotVecEnd(U,x,c+j)); |
| 53 | #else | ||
| 54 |
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.
|
5560 | PetscCall(BVDotVec(V,x,c)); |
| 55 | #endif | ||
| 56 | #if defined(PETSC_USE_COMPLEX) | ||
| 57 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
113896 | for (i=0; i<j; i++) { |
| 58 | 105475 | c[i] = PetscRealPart(c[i]); | |
| 59 | 105475 | c[j+i] = PetscCMPLX(0.0,PetscImaginaryPart(c[j+i])); | |
| 60 | } | ||
| 61 | #endif | ||
| 62 | /* x = x-U*c-V*c2 */ | ||
| 63 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(BVMultVec(U,-1.0,1.0,x,c)); |
| 64 | #if defined(PETSC_USE_COMPLEX) | ||
| 65 |
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.
|
8421 | PetscCall(BVMultVec(V,-1.0,1.0,x,c+j)); |
| 66 | #endif | ||
| 67 | /* accumulate orthog coeffs into h */ | ||
| 68 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
355191 | for (i=0; i<2*j; i++) h[i] += c[i]; |
| 69 |
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.
|
2590 | PetscFunctionReturn(PETSC_SUCCESS); |
| 70 | } | ||
| 71 | |||
| 72 | /* Orthogonalize vector x against first j vectors in U and V | ||
| 73 | v is column j-1 of V */ | ||
| 74 | 13981 | static PetscErrorCode OrthogonalizeVector_Shao(Vec x,BV U,BV V,PetscInt j,Vec v,PetscReal *beta,PetscInt k,PetscScalar *h,PetscBool *breakdown) | |
| 75 | { | ||
| 76 | 13981 | PetscReal alpha; | |
| 77 | 13981 | PetscInt i,l; | |
| 78 | |||
| 79 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
13981 | PetscFunctionBegin; |
| 80 |
4/6✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(PetscArrayzero(h,2*j)); |
| 81 | |||
| 82 | /* Local orthogonalization */ | ||
| 83 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
13981 | l = j==k+1?0:j-2; /* 1st column to orthogonalize against */ |
| 84 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(VecDotRealPart(x,v,&alpha)); |
| 85 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
45933 | for (i=l; i<j-1; i++) h[i] = beta[i]; |
| 86 | 13981 | h[j-1] = alpha; | |
| 87 | /* x = x-U(:,l:j-1)*h(l:j-1) */ | ||
| 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.
|
13981 | PetscCall(BVSetActiveColumns(U,l,j)); |
| 89 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(BVMultVec(U,-1.0,1.0,x,h+l)); |
| 90 | |||
| 91 | /* Full orthogonalization */ | ||
| 92 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(Orthog_Shao(x,U,V,j,h,h+2*j,breakdown)); |
| 93 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
2590 | PetscFunctionReturn(PETSC_SUCCESS); |
| 94 | } | ||
| 95 | |||
| 96 | 2376 | static PetscErrorCode EPSBSELanczos_Shao(EPS eps,BV U,BV V,PetscReal *alpha,PetscReal *beta,PetscInt k,PetscInt *M,PetscBool *breakdown) | |
| 97 | { | ||
| 98 | 2376 | PetscInt j,m = *M; | |
| 99 | 2376 | Vec v,x,y,w,f,g,vecs[2]; | |
| 100 | 2376 | Mat H; | |
| 101 | 2376 | IS is[2]; | |
| 102 | 2376 | PetscReal nrm; | |
| 103 | 2376 | PetscScalar *hwork,lhwork[100],gamma; | |
| 104 | 2376 | PetscContainer container; | |
| 105 | 2376 | SlepcMatStruct mctx; | |
| 106 | |||
| 107 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2376 | PetscFunctionBegin; |
| 108 |
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.
|
2376 | if (4*m > 100) PetscCall(PetscMalloc1(4*m,&hwork)); |
| 109 | 2376 | else hwork = lhwork; | |
| 110 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(STGetMatrix(eps->st,0,&H)); |
| 111 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(MatNestGetISs(H,is,NULL)); |
| 112 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(PetscObjectQuery((PetscObject)H,"SlepcMatStruct",(PetscObject*)&container)); |
| 113 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(PetscContainerGetPointer(container,(void**)&mctx)); |
| 114 | |||
| 115 | /* create work vectors */ | ||
| 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.
|
2376 | PetscCall(BVGetColumn(V,0,&v)); |
| 117 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(VecDuplicate(v,&w)); |
| 118 | 2376 | vecs[0] = v; | |
| 119 | 2376 | vecs[1] = w; | |
| 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.
|
2376 | PetscCall(VecCreateNest(PetscObjectComm((PetscObject)eps),2,is,vecs,&f)); |
| 121 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(VecCreateNest(PetscObjectComm((PetscObject)eps),2,is,vecs,&g)); |
| 122 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(BVRestoreColumn(V,0,&v)); |
| 123 | |||
| 124 | /* Normalize initial vector */ | ||
| 125 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2376 | if (k==0) { |
| 126 |
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.
|
118 | if (eps->nini==0) PetscCall(BVSetRandomColumn(eps->V,0)); |
| 127 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(BVGetColumn(U,0,&x)); |
| 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.
|
118 | PetscCall(BVGetColumn(V,0,&y)); |
| 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.
|
118 | PetscCall(VecNestSetSubVec(f,0,x)); |
| 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.
|
118 | PetscCall(VecNestSetSubVec(g,0,y)); |
| 131 | 118 | mctx->s = 1.0; | |
| 132 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(STApply(eps->st,f,g)); |
| 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.
|
118 | PetscCall(VecDot(y,x,&gamma)); |
| 134 | 118 | nrm = PetscSqrtReal(PetscRealPart(gamma)); | |
| 135 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(VecScale(x,1.0/nrm)); |
| 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.
|
118 | PetscCall(VecScale(y,1.0/nrm)); |
| 137 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(BVRestoreColumn(U,0,&x)); |
| 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.
|
118 | PetscCall(BVRestoreColumn(V,0,&y)); |
| 139 | } | ||
| 140 | |||
| 141 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
16357 | for (j=k;j<m;j++) { |
| 142 | /* j+1 columns (indexes 0 to j) have been computed */ | ||
| 143 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(BVGetColumn(V,j,&v)); |
| 144 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(BVGetColumn(U,j+1,&x)); |
| 145 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(BVGetColumn(V,j+1,&y)); |
| 146 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(VecNestSetSubVec(f,0,v)); |
| 147 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(VecNestSetSubVec(g,0,x)); |
| 148 | 13981 | mctx->s = -1.0; | |
| 149 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(STApply(eps->st,f,g)); |
| 150 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(OrthogonalizeVector_Shao(x,U,V,j+1,v,beta,k,hwork,breakdown)); |
| 151 | 13981 | alpha[j] = PetscRealPart(hwork[j]); | |
| 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.
|
13981 | PetscCall(VecNestSetSubVec(f,0,x)); |
| 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.
|
13981 | PetscCall(VecNestSetSubVec(g,0,y)); |
| 154 | 13981 | mctx->s = 1.0; | |
| 155 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(STApply(eps->st,f,g)); |
| 156 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(VecDot(x,y,&gamma)); |
| 157 | 13981 | beta[j] = PetscSqrtReal(PetscRealPart(gamma)); | |
| 158 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(VecScale(x,1.0/beta[j])); |
| 159 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(VecScale(y,1.0/beta[j])); |
| 160 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(BVRestoreColumn(V,j,&v)); |
| 161 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(BVRestoreColumn(U,j+1,&x)); |
| 162 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(BVRestoreColumn(V,j+1,&y)); |
| 163 | } | ||
| 164 |
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.
|
2376 | if (4*m > 100) PetscCall(PetscFree(hwork)); |
| 165 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(VecDestroy(&w)); |
| 166 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(VecDestroy(&f)); |
| 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.
|
2376 | PetscCall(VecDestroy(&g)); |
| 168 |
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.
|
456 | PetscFunctionReturn(PETSC_SUCCESS); |
| 169 | } | ||
| 170 | |||
| 171 | 118 | static PetscErrorCode EPSComputeVectors_BSE_Shao(EPS eps) | |
| 172 | { | ||
| 173 | 118 | Mat H; | |
| 174 | 118 | Vec u1,v1; | |
| 175 | 118 | BV U,V; | |
| 176 | 118 | IS is[2]; | |
| 177 | 118 | PetscInt k; | |
| 178 | 118 | PetscScalar lambda; | |
| 179 | |||
| 180 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
118 | PetscFunctionBegin; |
| 181 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(STGetMatrix(eps->st,0,&H)); |
| 182 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(MatNestGetISs(H,is,NULL)); |
| 183 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&U,&V)); |
| 184 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
975 | for (k=0; k<eps->nconv; k++) { |
| 185 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
857 | PetscCall(BVGetColumn(U,k,&u1)); |
| 186 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
857 | PetscCall(BVGetColumn(V,k,&v1)); |
| 187 | /* approx eigenvector is [ (eigr[k]*u1+v1)] | ||
| 188 | [conj(eigr[k]*u1-v1)] */ | ||
| 189 | 857 | lambda = eps->eigr[k]; | |
| 190 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
857 | PetscCall(STBackTransform(eps->st,1,&lambda,&eps->eigi[k])); |
| 191 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
857 | PetscCall(VecAYPX(u1,lambda,v1)); |
| 192 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
857 | PetscCall(VecAYPX(v1,-2.0,u1)); |
| 193 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
857 | PetscCall(VecConjugate(v1)); |
| 194 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
857 | PetscCall(BVRestoreColumn(U,k,&u1)); |
| 195 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
857 | PetscCall(BVRestoreColumn(V,k,&v1)); |
| 196 | } | ||
| 197 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&U,&V)); |
| 198 | /* Normalize eigenvectors */ | ||
| 199 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(BVSetActiveColumns(eps->V,0,eps->nconv)); |
| 200 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(BVNormalize(eps->V,NULL)); |
| 201 |
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.
|
18 | PetscFunctionReturn(PETSC_SUCCESS); |
| 202 | } | ||
| 203 | |||
| 204 | 13541 | static PetscErrorCode Orthog_Gruning(Vec x,BV U,BV V,BV HU,BV HV,PetscInt j,PetscScalar *h,PetscScalar *c,PetscBool *breakdown) | |
| 205 | { | ||
| 206 | 13541 | PetscInt i; | |
| 207 | |||
| 208 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
13541 | PetscFunctionBegin; |
| 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.
|
13541 | PetscCall(BVSetActiveColumns(U,0,j)); |
| 210 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVSetActiveColumns(HU,0,j)); |
| 211 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVSetActiveColumns(V,0,j)); |
| 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.
|
13541 | PetscCall(BVSetActiveColumns(HV,0,j)); |
| 213 | #if defined(PETSC_USE_COMPLEX) | ||
| 214 |
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.
|
8262 | PetscCall(BVDotVecBegin(HU,x,c)); |
| 215 |
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.
|
8262 | PetscCall(BVDotVecBegin(HV,x,c+j)); |
| 216 |
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.
|
8262 | PetscCall(BVDotVecEnd(HU,x,c)); |
| 217 |
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.
|
8262 | PetscCall(BVDotVecEnd(HV,x,c+j)); |
| 218 | #else | ||
| 219 |
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.
|
5279 | PetscCall(BVDotVec(HU,x,c)); |
| 220 | #endif | ||
| 221 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
178056 | for (i=0; i<j; i++) { |
| 222 | /* c1 = 2*real(HU^* x) ; c2 = 2*imag(HV^* x)*1i */ | ||
| 223 | #if defined(PETSC_USE_COMPLEX) | ||
| 224 | 103033 | c[i] = PetscRealPart(c[i]); | |
| 225 | 103033 | c[j+i] = PetscCMPLX(0.0,PetscImaginaryPart(c[j+i])); | |
| 226 | #else | ||
| 227 | 61482 | c[j+i] = 0.0; | |
| 228 | #endif | ||
| 229 | } | ||
| 230 | /* x = x-U*c1-V*c2 */ | ||
| 231 | #if defined(PETSC_USE_COMPLEX) | ||
| 232 |
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.
|
8262 | PetscCall(BVMultVec(U,-2.0,1.0,x,c)); |
| 233 |
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.
|
8262 | PetscCall(BVMultVec(V,-2.0,1.0,x,c+j)); |
| 234 | #else | ||
| 235 |
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.
|
5279 | PetscCall(BVMultVec(U,-2.0,1.0,x,c)); |
| 236 | #endif | ||
| 237 | /* accumulate orthog coeffs into h */ | ||
| 238 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
342571 | for (i=0; i<2*j; i++) h[i] += 2*c[i]; |
| 239 |
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.
|
2575 | PetscFunctionReturn(PETSC_SUCCESS); |
| 240 | } | ||
| 241 | |||
| 242 | /* Orthogonalize vector x against first j vectors in U and V */ | ||
| 243 | 27082 | static PetscErrorCode OrthogonalizeVector_Gruning(Vec x,BV U,BV V,BV HU,BV HV,PetscInt j,PetscReal *beta,PetscInt k,PetscScalar *h,PetscBool s,PetscBool *breakdown) | |
| 244 | { | ||
| 245 | 27082 | PetscInt l,i; | |
| 246 | 27082 | Vec u; | |
| 247 | |||
| 248 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
27082 | PetscFunctionBegin; |
| 249 |
4/6✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
27082 | PetscCall(PetscArrayzero(h,4*j)); |
| 250 | |||
| 251 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
27082 | if (s) { |
| 252 | /* Local orthogonalization */ | ||
| 253 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVGetColumn(U,j-1,&u)); |
| 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.
|
13541 | PetscCall(VecAXPY(x,-*beta,u)); |
| 255 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVRestoreColumn(U,j-1,&u)); |
| 256 | 13541 | h[j-1] = *beta; | |
| 257 | /* Full orthogonalization */ | ||
| 258 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(Orthog_Gruning(x,U,V,HU,HV,j,h,h+2*j,breakdown)); |
| 259 | } else { | ||
| 260 | /* Local orthogonalization */ | ||
| 261 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
13541 | l = j==k+1?0:j-2; /* 1st column to orthogonalize against */ |
| 262 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
44717 | for (i=l; i<j-1; i++) h[j+i] = beta[i]; |
| 263 | /* x = x-V(:,l:j-2)*h(l:j-2) */ | ||
| 264 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVSetActiveColumns(V,l,j-1)); |
| 265 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVMultVec(V,-1.0,1.0,x,h+j+l)); |
| 266 | } | ||
| 267 |
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.
|
5150 | PetscFunctionReturn(PETSC_SUCCESS); |
| 268 | } | ||
| 269 | |||
| 270 | 2332 | static PetscErrorCode EPSBSELanczos_Gruning(EPS eps,BV U,BV V,BV HU,BV HV,PetscReal *beta1,PetscReal *beta2,PetscInt k,PetscInt *M,PetscBool *breakdown) | |
| 271 | { | ||
| 272 | 2332 | PetscInt j,m = *M; | |
| 273 | 2332 | Vec v,x,y,w,f,g,vecs[2]; | |
| 274 | 2332 | Mat H; | |
| 275 | 2332 | IS is[2]; | |
| 276 | 2332 | PetscReal nrm; | |
| 277 | 2332 | PetscScalar *hwork,lhwork[100],dot; | |
| 278 | 2332 | PetscContainer container; | |
| 279 | 2332 | SlepcMatStruct mctx; | |
| 280 | |||
| 281 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2332 | PetscFunctionBegin; |
| 282 |
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.
|
2332 | if (4*m > 100) PetscCall(PetscMalloc1(4*m,&hwork)); |
| 283 | 2332 | else hwork = lhwork; | |
| 284 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(STGetMatrix(eps->st,0,&H)); |
| 285 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(MatNestGetISs(H,is,NULL)); |
| 286 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(PetscObjectQuery((PetscObject)H,"SlepcMatStruct",(PetscObject*)&container)); |
| 287 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(PetscContainerGetPointer(container,(void**)&mctx)); |
| 288 | |||
| 289 | /* create work vectors */ | ||
| 290 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(BVGetColumn(V,0,&v)); |
| 291 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(VecDuplicate(v,&w)); |
| 292 | 2332 | vecs[0] = v; | |
| 293 | 2332 | vecs[1] = w; | |
| 294 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(VecCreateNest(PetscObjectComm((PetscObject)eps),2,is,vecs,&f)); |
| 295 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(VecCreateNest(PetscObjectComm((PetscObject)eps),2,is,vecs,&g)); |
| 296 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(BVRestoreColumn(V,0,&v)); |
| 297 | |||
| 298 | /* Normalize initial vector */ | ||
| 299 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2332 | if (k==0) { |
| 300 |
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.
|
113 | if (eps->nini==0) PetscCall(BVSetRandomColumn(eps->V,0)); |
| 301 | /* y = Hmult(v1,1) */ | ||
| 302 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(BVGetColumn(U,k,&x)); |
| 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.
|
113 | PetscCall(BVGetColumn(HU,k,&y)); |
| 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.
|
113 | PetscCall(VecNestSetSubVec(f,0,x)); |
| 305 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(VecNestSetSubVec(g,0,y)); |
| 306 | 113 | mctx->s = 1.0; | |
| 307 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(STApply(eps->st,f,g)); |
| 308 | /* nrm = sqrt(2*real(u1'*y)); */ | ||
| 309 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(VecDot(x,y,&dot)); |
| 310 | 113 | nrm = PetscSqrtReal(PetscRealPart(2*dot)); | |
| 311 | /* U(:,j) = u1/nrm; */ | ||
| 312 | /* HU(:,j) = y/nrm; */ | ||
| 313 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(VecScale(x,1.0/nrm)); |
| 314 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(VecScale(y,1.0/nrm)); |
| 315 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(BVRestoreColumn(U,k,&x)); |
| 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.
|
113 | PetscCall(BVRestoreColumn(HU,k,&y)); |
| 317 | } | ||
| 318 | |||
| 319 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
15873 | for (j=k;j<m;j++) { |
| 320 | /* j+1 columns (indexes 0 to j) have been computed */ | ||
| 321 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVGetColumn(HU,j,&x)); |
| 322 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVGetColumn(V,j,&v)); |
| 323 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVGetColumn(HV,j,&y)); |
| 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.
|
13541 | PetscCall(VecCopy(x,v)); |
| 325 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVRestoreColumn(HU,j,&x)); |
| 326 | /* v = Orthogonalize HU(:,j) */ | ||
| 327 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(OrthogonalizeVector_Gruning(v,U,V,HU,HV,j+1,beta2,k,hwork,PETSC_FALSE,breakdown)); |
| 328 | /* y = Hmult(v,-1) */ | ||
| 329 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(VecNestSetSubVec(f,0,v)); |
| 330 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(VecNestSetSubVec(g,0,y)); |
| 331 | 13541 | mctx->s = -1.0; | |
| 332 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(STApply(eps->st,f,g)); |
| 333 | /* beta = sqrt(2*real(v'*y)); */ | ||
| 334 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(VecDot(v,y,&dot)); |
| 335 | 13541 | beta1[j] = PetscSqrtReal(PetscRealPart(2*dot)); //FIXME Check beta != 0? | |
| 336 | /* V(:,j) = v/beta1; */ | ||
| 337 | /* HV(:,j) = y/beta1; */ | ||
| 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.
|
13541 | PetscCall(VecScale(v,1.0/beta1[j])); |
| 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.
|
13541 | PetscCall(VecScale(y,1.0/beta1[j])); |
| 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.
|
13541 | PetscCall(BVRestoreColumn(V,j,&v)); |
| 341 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVRestoreColumn(HV,j,&y)); |
| 342 | |||
| 343 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVGetColumn(HV,j,&x)); |
| 344 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVGetColumn(U,j+1,&v)); |
| 345 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVGetColumn(HU,j+1,&y)); |
| 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.
|
13541 | PetscCall(VecCopy(x,v)); |
| 347 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVRestoreColumn(HV,j,&x)); |
| 348 | /* v = Orthogonalize HV(:,j) */ | ||
| 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.
|
13541 | PetscCall(OrthogonalizeVector_Gruning(v,U,V,HU,HV,j+1,&beta1[j],k,hwork,PETSC_TRUE,breakdown)); |
| 350 | /* y = Hmult(v,1) */ | ||
| 351 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(VecNestSetSubVec(f,0,v)); |
| 352 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(VecNestSetSubVec(g,0,y)); |
| 353 | 13541 | mctx->s = 1.0; | |
| 354 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(STApply(eps->st,f,g)); |
| 355 | /* beta = sqrt(2*real(v'*y)); */ | ||
| 356 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(VecDot(v,y,&dot)); |
| 357 | 13541 | beta2[j] = PetscSqrtReal(PetscRealPart(2*dot)); //FIXME Check beta != 0? | |
| 358 | /* U(:,j) = v/beta2; */ | ||
| 359 | /* HU(:,j) = y/beta2; */ | ||
| 360 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(VecScale(v,1.0/beta2[j])); |
| 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.
|
13541 | PetscCall(VecScale(y,1.0/beta2[j])); |
| 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.
|
13541 | PetscCall(BVRestoreColumn(U,j+1,&v)); |
| 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.
|
13541 | PetscCall(BVRestoreColumn(HU,j+1,&y)); |
| 364 | } | ||
| 365 |
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.
|
2332 | if (4*m > 100) PetscCall(PetscFree(hwork)); |
| 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.
|
2332 | PetscCall(VecDestroy(&w)); |
| 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.
|
2332 | PetscCall(VecDestroy(&f)); |
| 368 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(VecDestroy(&g)); |
| 369 |
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.
|
465 | PetscFunctionReturn(PETSC_SUCCESS); |
| 370 | } | ||
| 371 | |||
| 372 | 113 | static PetscErrorCode EPSComputeVectors_BSE_Gruning(EPS eps) | |
| 373 | { | ||
| 374 | 113 | Mat H; | |
| 375 | 113 | Vec u1,v1; | |
| 376 | 113 | BV U,V; | |
| 377 | 113 | IS is[2]; | |
| 378 | 113 | PetscInt k; | |
| 379 | |||
| 380 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
113 | PetscFunctionBegin; |
| 381 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(STGetMatrix(eps->st,0,&H)); |
| 382 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(MatNestGetISs(H,is,NULL)); |
| 383 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&U,&V)); |
| 384 | /* approx eigenvector [x1] is [ u1+v1 ] | ||
| 385 | [x2] [conj(u1)-conj(v1)] */ | ||
| 386 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
901 | for (k=0; k<eps->nconv; k++) { |
| 387 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
788 | PetscCall(BVGetColumn(U,k,&u1)); |
| 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.
|
788 | PetscCall(BVGetColumn(V,k,&v1)); |
| 389 | /* x1 = u1 + v1 */ | ||
| 390 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
788 | PetscCall(VecAXPY(u1,1.0,v1)); |
| 391 | /* x2 = conj(u1) - conj(v1) = conj(u1 - v1) = conj((u1 + v1) - 2*v1) */ | ||
| 392 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
788 | PetscCall(VecAYPX(v1,-2.0,u1)); |
| 393 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
788 | PetscCall(VecConjugate(v1)); |
| 394 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
788 | PetscCall(BVRestoreColumn(U,k,&u1)); |
| 395 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
788 | PetscCall(BVRestoreColumn(V,k,&v1)); |
| 396 | } | ||
| 397 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&U,&V)); |
| 398 | /* Normalize eigenvectors */ | ||
| 399 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(BVSetActiveColumns(eps->V,0,eps->nconv)); |
| 400 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(BVNormalize(eps->V,NULL)); |
| 401 |
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.
|
17 | PetscFunctionReturn(PETSC_SUCCESS); |
| 402 | } | ||
| 403 | |||
| 404 | /* Full orthogonalization of vector [hx, conj(hx)] against first j vectors in X and Y */ | ||
| 405 | 13491 | static PetscErrorCode Orthog_ProjectedBSE(Vec hx,BV X,BV Y,PetscInt j,PetscScalar *h,PetscScalar *c,PetscBool *breakdown) | |
| 406 | { | ||
| 407 | 13491 | PetscInt i; | |
| 408 | |||
| 409 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
13491 | 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.
|
13491 | PetscCall(BVSetActiveColumns(X,0,j)); |
| 411 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(BVSetActiveColumns(Y,0,j)); |
| 412 | /* c1 = X^* hx */ | ||
| 413 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(BVDotVec(X,hx,c)); |
| 414 | /* c2 = Y^* conj(hx) */ | ||
| 415 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecConjugate(hx)); |
| 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.
|
13491 | PetscCall(BVDotVec(Y,hx,c+j)); |
| 417 | /* c = c1 - c2 */ | ||
| 418 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
179616 | for (i=0;i<j;i++) c[i] -= c[i+j]; |
| 419 | /* hx = hx - conj(Y*c) */ | ||
| 420 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(BVMultVec(Y,-1.0,1.0,hx,c)); |
| 421 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecConjugate(hx)); |
| 422 | /* hx = hx - X*c */ | ||
| 423 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(BVMultVec(X,-1.0,1.0,hx,c)); |
| 424 | /* accumulate orthog coeffs into h */ | ||
| 425 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
179616 | for (i=0;i<j;i++) h[i] += c[i]; |
| 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.
|
2528 | PetscFunctionReturn(PETSC_SUCCESS); |
| 427 | } | ||
| 428 | |||
| 429 | /* Orthogonalize vector [hx; hy] against first j vectors in X and Y | ||
| 430 | The result is a vector [u; conj(u)]. Vector hx is overwritten with u. */ | ||
| 431 | 13491 | static PetscErrorCode OrthogonalizeVector_ProjectedBSE(Vec hx,Vec hy,BV X,BV Y,PetscInt j,PetscReal *beta,PetscInt k,PetscScalar *h,PetscBool *breakdown) | |
| 432 | { | ||
| 433 | 13491 | PetscInt l,i; | |
| 434 | 13491 | PetscScalar alpha,alpha1,alpha2; | |
| 435 | 13491 | Vec x,y; | |
| 436 | |||
| 437 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
13491 | PetscFunctionBegin; |
| 438 |
4/6✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(PetscArrayzero(h,2*j)); |
| 439 | |||
| 440 | /* Local orthogonalization */ | ||
| 441 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
13491 | l = j==k+1?0:j-2; /* 1st column to orthogonalize against */ |
| 442 | /* alpha = X(:,j-1)'*hx-Y(:,j-1)'*hy */ | ||
| 443 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(BVGetColumn(X,j-1,&x)); |
| 444 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(BVGetColumn(Y,j-1,&y)); |
| 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.
|
13491 | PetscCall(VecDotBegin(hx,x,&alpha1)); |
| 446 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecDotBegin(hy,y,&alpha2)); |
| 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.
|
13491 | PetscCall(VecDotEnd(hx,x,&alpha1)); |
| 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.
|
13491 | PetscCall(VecDotEnd(hy,y,&alpha2)); |
| 449 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(BVRestoreColumn(X,j-1,&x)); |
| 450 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(BVRestoreColumn(Y,j-1,&y)); |
| 451 | 13491 | alpha = alpha1-alpha2; | |
| 452 | /* Store coeffs into h */ | ||
| 453 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
44911 | for (i=l; i<j-1; i++) h[i] = h[j+i] = beta[i]/2.0; |
| 454 | 13491 | h[j-1] = alpha; | |
| 455 | |||
| 456 | /* Orthogonalize: hx = hx - X(:,l:j-1)*h1 - conj(Y(:,l:j-1))*h2 */ | ||
| 457 | /* hx = hx - X(:,l:j-1)*h1 */ | ||
| 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.
|
13491 | PetscCall(BVSetActiveColumns(X,l,j)); |
| 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.
|
13491 | PetscCall(BVSetActiveColumns(Y,l,j)); |
| 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.
|
13491 | PetscCall(BVMultVec(X,-1.0,1.0,hx,h+l)); |
| 461 | /* hx = conj(hx) */ | ||
| 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.
|
13491 | PetscCall(VecConjugate(hx)); |
| 463 | /* hx = hx - Y(:,l:j-1)*conj(h2) */ | ||
| 464 | 13491 | h[2*j-1] = PetscConj(alpha-1.0); | |
| 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.
|
13491 | PetscCall(BVMultVec(Y,-1.0,1.0,hx,h+j+l)); |
| 466 | 13491 | h[2*j-1] = alpha-1.0; | |
| 467 | /* hx = conj(hx) */ | ||
| 468 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecConjugate(hx)); |
| 469 | |||
| 470 | /* Full orthogonalization */ | ||
| 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.
|
13491 | PetscCall(Orthog_ProjectedBSE(hx,X,Y,j,h,h+2*j,breakdown)); |
| 472 |
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.
|
2528 | PetscFunctionReturn(PETSC_SUCCESS); |
| 473 | } | ||
| 474 | |||
| 475 | 2332 | static PetscErrorCode EPSBSELanczos_ProjectedBSE(EPS eps,BV X,BV Y,Vec v,PetscReal *alpha,PetscReal *beta,PetscInt k,PetscInt *M,PetscBool *breakdown) | |
| 476 | { | ||
| 477 | 2332 | PetscInt j,m = *M; | |
| 478 | 2332 | Vec u,x,y,w,f,g,vecs[2]; | |
| 479 | 2332 | Mat H; | |
| 480 | 2332 | IS is[2]; | |
| 481 | 2332 | PetscReal nrm; | |
| 482 | 2332 | PetscScalar *hwork,lhwork[100],gamma; | |
| 483 | 2332 | PetscContainer container; | |
| 484 | 2332 | SlepcMatStruct mctx; | |
| 485 | |||
| 486 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2332 | PetscFunctionBegin; |
| 487 |
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.
|
2332 | if (4*m > 100) PetscCall(PetscMalloc1(4*m,&hwork)); |
| 488 | 2332 | else hwork = lhwork; | |
| 489 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(STGetMatrix(eps->st,0,&H)); |
| 490 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(MatNestGetISs(H,is,NULL)); |
| 491 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(PetscObjectQuery((PetscObject)H,"SlepcMatStruct",(PetscObject*)&container)); |
| 492 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(PetscContainerGetPointer(container,(void**)&mctx)); |
| 493 | |||
| 494 | /* create work vectors */ | ||
| 495 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(BVGetColumn(Y,0,&u)); |
| 496 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(VecDuplicate(u,&w)); |
| 497 | 2332 | vecs[0] = u; | |
| 498 | 2332 | vecs[1] = w; | |
| 499 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(VecCreateNest(PetscObjectComm((PetscObject)eps),2,is,vecs,&f)); |
| 500 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(VecCreateNest(PetscObjectComm((PetscObject)eps),2,is,vecs,&g)); |
| 501 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(BVRestoreColumn(Y,0,&u)); |
| 502 | |||
| 503 | /* Normalize initial vector */ | ||
| 504 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2332 | if (k==0) { |
| 505 |
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.
|
103 | if (eps->nini==0) PetscCall(BVSetRandomColumn(eps->V,0)); |
| 506 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(BVGetColumn(X,0,&x)); |
| 507 | /* v = Hmult(u,1) */ | ||
| 508 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(BVGetColumn(Y,0,&y)); |
| 509 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(VecNestSetSubVec(f,0,x)); |
| 510 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(VecNestSetSubVec(g,0,y)); |
| 511 | 103 | mctx->s = 1.0; | |
| 512 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(STApply(eps->st,f,g)); |
| 513 | /* nrm = sqrt(real(u'*v)) */ | ||
| 514 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(VecDot(y,x,&gamma)); |
| 515 | 103 | nrm = PetscSqrtReal(PetscRealPart(gamma)); | |
| 516 | /* u = u /(nrm*2) */ | ||
| 517 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(VecScale(x,1.0/(2.0*nrm))); |
| 518 | /* v = v /(nrm*2) */ | ||
| 519 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(VecScale(y,1.0/(2.0*nrm))); |
| 520 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(VecCopy(y,v)); |
| 521 | /* X(:,1) = (u+v) */ | ||
| 522 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(VecAXPY(x,1,y)); |
| 523 | /* Y(:,1) = conj(u-v) */ | ||
| 524 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(VecAYPX(y,-2,x)); |
| 525 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(VecConjugate(y)); |
| 526 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(BVRestoreColumn(X,0,&x)); |
| 527 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(BVRestoreColumn(Y,0,&y)); |
| 528 | } | ||
| 529 | |||
| 530 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
15823 | for (j=k;j<m;j++) { |
| 531 | /* j+1 columns (indexes 0 to j) have been computed */ | ||
| 532 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(BVGetColumn(X,j+1,&x)); |
| 533 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(BVGetColumn(Y,j+1,&y)); |
| 534 | /* u = Hmult(v,-1)*/ | ||
| 535 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecNestSetSubVec(f,0,v)); |
| 536 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecNestSetSubVec(g,0,x)); |
| 537 | 13491 | mctx->s = -1.0; | |
| 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.
|
13491 | PetscCall(STApply(eps->st,f,g)); |
| 539 | /* hx = (u+v) */ | ||
| 540 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecCopy(x,y)); |
| 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.
|
13491 | PetscCall(VecAXPY(x,1,v)); |
| 542 | /* hy = conj(u-v) */ | ||
| 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.
|
13491 | PetscCall(VecAXPY(y,-1,v)); |
| 544 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecConjugate(y)); |
| 545 | /* [u,cd] = orthog(hx,hy,X(:,1:j),Y(:,1:j),opt)*/ | ||
| 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.
|
13491 | PetscCall(OrthogonalizeVector_ProjectedBSE(x,y,X,Y,j+1,beta,k,hwork,breakdown)); |
| 547 | /* alpha(j) = 2*(real(cd(j))-1/2) */ | ||
| 548 | 13491 | alpha[j] = 2*(PetscRealPart(hwork[j]) - 0.5); | |
| 549 | /* v = Hmult(u,1) */ | ||
| 550 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecNestSetSubVec(f,0,x)); |
| 551 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecNestSetSubVec(g,0,y)); |
| 552 | 13491 | mctx->s = 1.0; | |
| 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.
|
13491 | PetscCall(STApply(eps->st,f,g)); |
| 554 | /* nrm = sqrt(real(u'*v)) */ | ||
| 555 | /* beta(j) = 2*nrm */ | ||
| 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.
|
13491 | PetscCall(VecDot(x,y,&gamma)); |
| 557 | 13491 | beta[j] = 2.0*PetscSqrtReal(PetscRealPart(gamma)); | |
| 558 | /* u = u/(nrm*2) */ | ||
| 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.
|
13491 | PetscCall(VecScale(x,1.0/beta[j])); |
| 560 | /* v = v/(nrm*2) */ | ||
| 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.
|
13491 | PetscCall(VecScale(y,1.0/beta[j])); |
| 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.
|
13491 | PetscCall(VecCopy(y,v)); |
| 563 | /* X(:,j+1) = (u+v) */ | ||
| 564 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecAXPY(x,1,y)); |
| 565 | /* Y(:,j+1) = conj(u-v) */ | ||
| 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.
|
13491 | PetscCall(VecAYPX(y,-2,x)); |
| 567 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecConjugate(y)); |
| 568 | /* Restore */ | ||
| 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.
|
13491 | PetscCall(BVRestoreColumn(X,j+1,&x)); |
| 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.
|
13491 | PetscCall(BVRestoreColumn(Y,j+1,&y)); |
| 571 | } | ||
| 572 |
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.
|
2332 | if (4*m > 100) PetscCall(PetscFree(hwork)); |
| 573 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(VecDestroy(&w)); |
| 574 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(VecDestroy(&f)); |
| 575 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(VecDestroy(&g)); |
| 576 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
452 | PetscFunctionReturn(PETSC_SUCCESS); |
| 577 | } | ||
| 578 | |||
| 579 | 103 | static PetscErrorCode EPSComputeVectors_BSE_ProjectedBSE(EPS eps) | |
| 580 | { | ||
| 581 | 103 | Mat H; | |
| 582 | 103 | Vec x1,y1,cx1,cy1; | |
| 583 | 103 | BV X,Y; | |
| 584 | 103 | IS is[2]; | |
| 585 | 103 | PetscInt k; | |
| 586 | 103 | PetscScalar delta1,delta2,lambda; | |
| 587 | |||
| 588 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
103 | PetscFunctionBegin; |
| 589 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(STGetMatrix(eps->st,0,&H)); |
| 590 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(MatNestGetISs(H,is,NULL)); |
| 591 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&X,&Y)); |
| 592 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(BVCreateVec(X,&cx1)); |
| 593 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(BVCreateVec(Y,&cy1)); |
| 594 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
835 | for (k=0; k<eps->nconv; k++) { |
| 595 | /* approx eigenvector is [ delta1*x1 + delta2*conj(y1) ] | ||
| 596 | [ delta1*y1 + delta2*conj(x1) ] */ | ||
| 597 | 732 | lambda = eps->eigr[k]; | |
| 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.
|
732 | PetscCall(STBackTransform(eps->st,1,&lambda,&eps->eigi[k])); |
| 599 | 732 | delta1 = lambda+1.0; | |
| 600 | 732 | delta2 = lambda-1.0; | |
| 601 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
732 | PetscCall(BVGetColumn(X,k,&x1)); |
| 602 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
732 | PetscCall(BVGetColumn(Y,k,&y1)); |
| 603 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
732 | PetscCall(VecCopy(x1,cx1)); |
| 604 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
732 | PetscCall(VecCopy(y1,cy1)); |
| 605 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
732 | PetscCall(VecConjugate(cx1)); |
| 606 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
732 | PetscCall(VecConjugate(cy1)); |
| 607 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
732 | PetscCall(VecScale(x1,delta1)); |
| 608 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
732 | PetscCall(VecScale(y1,delta1)); |
| 609 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
732 | PetscCall(VecAXPY(x1,delta2,cy1)); |
| 610 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
732 | PetscCall(VecAXPY(y1,delta2,cx1)); |
| 611 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
732 | PetscCall(BVRestoreColumn(X,k,&x1)); |
| 612 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
732 | PetscCall(BVRestoreColumn(Y,k,&y1)); |
| 613 | } | ||
| 614 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&X,&Y)); |
| 615 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(BVSetActiveColumns(eps->V,0,eps->nconv)); |
| 616 | /* Normalize eigenvector */ | ||
| 617 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(BVNormalize(eps->V,NULL)); |
| 618 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(VecDestroy(&cx1)); |
| 619 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(VecDestroy(&cy1)); |
| 620 |
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.
|
15 | PetscFunctionReturn(PETSC_SUCCESS); |
| 621 | } | ||
| 622 | |||
| 623 | 334 | PetscErrorCode EPSSetUp_KrylovSchur_BSE(EPS eps) | |
| 624 | { | ||
| 625 | 334 | EPS_KRYLOVSCHUR *ctx = (EPS_KRYLOVSCHUR*)eps->data; | |
| 626 | 334 | PetscBool flg,sinvert; | |
| 627 | |||
| 628 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
334 | PetscFunctionBegin; |
| 629 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
334 | PetscCheck((eps->problem_type==EPS_BSE),PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONGSTATE,"Problem type should be BSE"); |
| 630 |
9/22✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 8 times.
✓ Branch 10 taken 2 times.
✓ Branch 11 taken 8 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 10 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
334 | EPSCheckUnsupportedCondition(eps,EPS_FEATURE_ARBITRARY | EPS_FEATURE_REGION | EPS_FEATURE_EXTRACTION | EPS_FEATURE_BALANCE,PETSC_TRUE," with BSE structure"); |
| 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.
|
334 | PetscCall(PetscCitationsRegister(citation,&cited)); |
| 632 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
334 | PetscCall(EPSSetDimensions_Default(eps,&eps->nev,&eps->ncv,&eps->mpd)); |
| 633 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
334 | PetscCheck(eps->ncv<=eps->nev+eps->mpd,PetscObjectComm((PetscObject)eps),PETSC_ERR_USER_INPUT,"The value of ncv must not be larger than nev+mpd"); |
| 634 |
3/4✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
608 | if (eps->max_it==PETSC_DETERMINE) eps->max_it = PetscMax(100,2*eps->n/eps->ncv)*((eps->stop==EPS_STOP_THRESHOLD)?10:1); |
| 635 | |||
| 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.
|
334 | PetscCall(PetscObjectTypeCompareAny((PetscObject)eps->st,&flg,STSINVERT,STSHIFT,"")); |
| 637 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
334 | PetscCheck(flg,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Krylov-Schur BSE only supports shift and shift-and-invert ST"); |
| 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.
|
334 | PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STSINVERT,&sinvert)); |
| 639 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
334 | if (!eps->which) { |
| 640 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
314 | if (sinvert) eps->which = EPS_TARGET_MAGNITUDE; |
| 641 | 236 | else eps->which = EPS_SMALLEST_MAGNITUDE; | |
| 642 | } | ||
| 643 | |||
| 644 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
334 | if (!ctx->keep) ctx->keep = 0.5; |
| 645 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
334 | PetscCall(STSetStructured(eps->st,PETSC_TRUE)); |
| 646 | |||
| 647 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
334 | PetscCall(EPSAllocateSolution(eps,1)); |
| 648 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
|
334 | switch (ctx->bse) { |
| 649 | 118 | case EPS_KRYLOVSCHUR_BSE_SHAO: | |
| 650 | 118 | eps->ops->solve = EPSSolve_KrylovSchur_BSE_Shao; | |
| 651 | 118 | eps->ops->computevectors = EPSComputeVectors_BSE_Shao; | |
| 652 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(DSSetType(eps->ds,DSHEP)); |
| 653 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(DSSetCompact(eps->ds,PETSC_TRUE)); |
| 654 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(DSSetExtraRow(eps->ds,PETSC_TRUE)); |
| 655 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(DSAllocate(eps->ds,eps->ncv+1)); |
| 656 | break; | ||
| 657 | 113 | case EPS_KRYLOVSCHUR_BSE_GRUNING: | |
| 658 | 113 | eps->ops->solve = EPSSolve_KrylovSchur_BSE_Gruning; | |
| 659 | 113 | eps->ops->computevectors = EPSComputeVectors_BSE_Gruning; | |
| 660 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(DSSetType(eps->ds,DSSVD)); |
| 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.
|
113 | PetscCall(DSSetCompact(eps->ds,PETSC_TRUE)); |
| 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.
|
113 | PetscCall(DSSetExtraRow(eps->ds,PETSC_TRUE)); |
| 663 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(DSAllocate(eps->ds,eps->ncv+1)); |
| 664 | break; | ||
| 665 | 103 | case EPS_KRYLOVSCHUR_BSE_PROJECTEDBSE: | |
| 666 | 103 | eps->ops->solve = EPSSolve_KrylovSchur_BSE_ProjectedBSE; | |
| 667 | 103 | eps->ops->computevectors = EPSComputeVectors_BSE_ProjectedBSE; | |
| 668 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(DSSetType(eps->ds,DSHEP)); |
| 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.
|
103 | PetscCall(DSSetCompact(eps->ds,PETSC_TRUE)); |
| 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.
|
103 | PetscCall(DSSetExtraRow(eps->ds,PETSC_TRUE)); |
| 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.
|
103 | PetscCall(DSAllocate(eps->ds,eps->ncv+1)); |
| 672 | break; | ||
| 673 | ✗ | default: SETERRQ(PetscObjectComm((PetscObject)eps),PETSC_ERR_PLIB,"Unexpected error"); | |
| 674 | } | ||
| 675 |
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.
|
50 | PetscFunctionReturn(PETSC_SUCCESS); |
| 676 | } | ||
| 677 | |||
| 678 | 118 | PetscErrorCode EPSSolve_KrylovSchur_BSE_Shao(EPS eps) | |
| 679 | { | ||
| 680 | 118 | EPS_KRYLOVSCHUR *ctx = (EPS_KRYLOVSCHUR*)eps->data; | |
| 681 | 118 | PetscInt i,k,l,ld,nv,nconv=0,nevsave; | |
| 682 | 118 | Mat H,Q; | |
| 683 | 118 | BV U,V; | |
| 684 | 118 | IS is[2]; | |
| 685 | 118 | PetscReal *a,*b,beta; | |
| 686 | 118 | PetscBool breakdown=PETSC_FALSE; | |
| 687 | |||
| 688 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
118 | PetscFunctionBegin; |
| 689 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(DSGetLeadingDimension(eps->ds,&ld)); |
| 690 | |||
| 691 | /* Extract matrix blocks */ | ||
| 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.
|
118 | PetscCall(STGetMatrix(eps->st,0,&H)); |
| 693 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(MatNestGetISs(H,is,NULL)); |
| 694 | |||
| 695 | /* Get the split bases */ | ||
| 696 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&U,&V)); |
| 697 | |||
| 698 | 118 | nevsave = eps->nev; | |
| 699 | 118 | eps->nev = (eps->nev+1)/2; | |
| 700 | 118 | l = 0; | |
| 701 | |||
| 702 | /* Restart loop */ | ||
| 703 | 118 | while (eps->reason == EPS_CONVERGED_ITERATING) { | |
| 704 | 2376 | eps->its++; | |
| 705 | |||
| 706 | /* Compute an nv-step Lanczos factorization */ | ||
| 707 | 2376 | nv = PetscMin(eps->nconv+eps->mpd,eps->ncv); | |
| 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.
|
2376 | PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,eps->nconv+l)); |
| 709 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(DSGetArrayReal(eps->ds,DS_MAT_T,&a)); |
| 710 | 2376 | b = a + ld; | |
| 711 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(EPSBSELanczos_Shao(eps,U,V,a,b,eps->nconv+l,&nv,&breakdown)); |
| 712 | 2376 | beta = b[nv-1]; | |
| 713 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(DSRestoreArrayReal(eps->ds,DS_MAT_T,&a)); |
| 714 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,eps->nconv+l)); |
| 715 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(DSSetState(eps->ds,l?DS_STATE_RAW:DS_STATE_INTERMEDIATE)); |
| 716 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(BVSetActiveColumns(eps->V,eps->nconv,nv)); |
| 717 | |||
| 718 | /* Solve projected problem */ | ||
| 719 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(DSSolve(eps->ds,eps->eigr,eps->eigi)); |
| 720 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(DSSort(eps->ds,eps->eigr,eps->eigi,NULL,NULL,NULL)); |
| 721 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(DSUpdateExtraRow(eps->ds)); |
| 722 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(DSSynchronize(eps->ds,eps->eigr,eps->eigi)); |
| 723 | |||
| 724 | /* Check convergence */ | ||
| 725 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
36704 | for (i=0;i<nv;i++) eps->eigr[i] = PetscSqrtReal(PetscRealPart(eps->eigr[i])); |
| 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.
|
2376 | PetscCall(EPSKrylovConvergence(eps,PETSC_FALSE,eps->nconv,nv-eps->nconv,beta,0.0,1.0,&k)); |
| 727 |
14/18✓ 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 taken 8 times.
✓ Branch 8 taken 8 times.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
|
2376 | EPSSetCtxThreshold(eps,eps->eigr,eps->eigi,k); |
| 728 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall((*eps->stopping)(eps,eps->its,eps->max_it,k,eps->nev,&eps->reason,eps->stoppingctx)); |
| 729 | 2376 | nconv = k; | |
| 730 | |||
| 731 | /* Update l */ | ||
| 732 |
4/6✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
2376 | if (eps->reason != EPS_CONVERGED_ITERATING || breakdown || k==nv) l = 0; |
| 733 | 2258 | else l = PetscMax(1,(PetscInt)((nv-k)*ctx->keep)); | |
| 734 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
2376 | if (!ctx->lock && l>0) { l += k; k = 0; } /* non-locking variant: reset no. of converged pairs */ |
| 735 |
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.
|
2376 | if (l) PetscCall(PetscInfo(eps,"Preparing to restart keeping l=%" PetscInt_FMT " vectors\n",l)); |
| 736 | |||
| 737 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2376 | if (eps->reason == EPS_CONVERGED_ITERATING) { |
| 738 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
2258 | PetscCheck(!breakdown,PetscObjectComm((PetscObject)eps),PETSC_ERR_CONV_FAILED,"Breakdown in BSE Krylov-Schur (beta=%g)",(double)beta); |
| 739 | /* Prepare the Rayleigh quotient for restart */ | ||
| 740 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2258 | PetscCall(DSTruncate(eps->ds,k+l,PETSC_FALSE)); |
| 741 | } | ||
| 742 | /* Update the corresponding vectors | ||
| 743 | U(:,idx) = U*Q(:,idx), V(:,idx) = V*Q(:,idx) */ | ||
| 744 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(DSGetMat(eps->ds,DS_MAT_Q,&Q)); |
| 745 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(BVMultInPlace(U,Q,eps->nconv,k+l)); |
| 746 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(BVMultInPlace(V,Q,eps->nconv,k+l)); |
| 747 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(DSRestoreMat(eps->ds,DS_MAT_Q,&Q)); |
| 748 | |||
| 749 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
|
2376 | if (eps->reason == EPS_CONVERGED_ITERATING && !breakdown) { |
| 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.
|
2258 | PetscCall(BVCopyColumn(eps->V,nv,k+l)); |
| 751 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
2258 | if (eps->stop==EPS_STOP_THRESHOLD && nv-k<5) { /* reallocate */ |
| 752 | 15 | eps->ncv = eps->mpd+k; | |
| 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.
|
15 | PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&U,&V)); |
| 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.
|
15 | PetscCall(EPSReallocateSolution(eps,eps->ncv+1)); |
| 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.
|
15 | PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&U,&V)); |
| 756 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
105 | for (i=nv;i<eps->ncv;i++) eps->perm[i] = i; |
| 757 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15 | PetscCall(DSReallocate(eps->ds,eps->ncv+1)); |
| 758 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15 | PetscCall(DSGetLeadingDimension(eps->ds,&ld)); |
| 759 | } | ||
| 760 | } | ||
| 761 | 2376 | eps->nconv = k; | |
| 762 |
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.
|
2494 | PetscCall(EPSMonitor(eps,eps->its,nconv,eps->eigr,eps->eigi,eps->errest,nv)); |
| 763 | } | ||
| 764 | |||
| 765 | 118 | eps->nev = nevsave; | |
| 766 | |||
| 767 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(DSTruncate(eps->ds,eps->nconv,PETSC_TRUE)); |
| 768 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&U,&V)); |
| 769 |
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.
|
18 | PetscFunctionReturn(PETSC_SUCCESS); |
| 770 | } | ||
| 771 | |||
| 772 | /* | ||
| 773 | EPSConvergence_Gruning - convergence check based on SVDKrylovConvergence(). | ||
| 774 | */ | ||
| 775 | 2332 | static PetscErrorCode EPSConvergence_Gruning(EPS eps,PetscBool getall,PetscInt kini,PetscInt nits,PetscInt *kout) | |
| 776 | { | ||
| 777 | 2332 | PetscInt k,marker,ld; | |
| 778 | 2332 | PetscReal *alpha,*beta,resnorm; | |
| 779 | 2332 | PetscBool extra; | |
| 780 | |||
| 781 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2332 | PetscFunctionBegin; |
| 782 | 2332 | *kout = 0; | |
| 783 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSGetLeadingDimension(eps->ds,&ld)); |
| 784 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSGetExtraRow(eps->ds,&extra)); |
| 785 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
2332 | PetscCheck(extra,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Only implemented for DS with extra row"); |
| 786 | 2332 | marker = -1; | |
| 787 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
2332 | if (eps->trackall) getall = PETSC_TRUE; |
| 788 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSGetArrayReal(eps->ds,DS_MAT_T,&alpha)); |
| 789 | 2332 | beta = alpha + ld; | |
| 790 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
3120 | for (k=kini;k<kini+nits;k++) { |
| 791 | 3120 | resnorm = PetscAbsReal(beta[k]); | |
| 792 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3120 | PetscCall((*eps->converged)(eps,eps->eigr[k],eps->eigi[k],resnorm,&eps->errest[k],eps->convergedctx)); |
| 793 |
3/4✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
3120 | if (marker==-1 && eps->errest[k] >= eps->tol) marker = k; |
| 794 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
3120 | if (marker!=-1 && !getall) break; |
| 795 | } | ||
| 796 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSRestoreArrayReal(eps->ds,DS_MAT_T,&alpha)); |
| 797 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
2332 | if (marker!=-1) k = marker; |
| 798 | 2332 | *kout = k; | |
| 799 |
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.
|
2332 | PetscFunctionReturn(PETSC_SUCCESS); |
| 800 | } | ||
| 801 | |||
| 802 | 113 | PetscErrorCode EPSSolve_KrylovSchur_BSE_Gruning(EPS eps) | |
| 803 | { | ||
| 804 | 113 | EPS_KRYLOVSCHUR *ctx = (EPS_KRYLOVSCHUR*)eps->data; | |
| 805 | 113 | PetscInt i,k,l,ld,nv,nconv=0,nevsave; | |
| 806 | 113 | Mat H,Q,Z; | |
| 807 | 113 | BV U,V,HU,HV; | |
| 808 | 113 | IS is[2]; | |
| 809 | 113 | PetscReal *d1,*d2,beta; | |
| 810 | 113 | PetscBool breakdown=PETSC_FALSE; | |
| 811 | |||
| 812 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
113 | PetscFunctionBegin; |
| 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.
|
113 | PetscCall(DSGetLeadingDimension(eps->ds,&ld)); |
| 814 | |||
| 815 | /* Extract matrix blocks */ | ||
| 816 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(STGetMatrix(eps->st,0,&H)); |
| 817 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(MatNestGetISs(H,is,NULL)); |
| 818 | |||
| 819 | /* Get the split bases */ | ||
| 820 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&U,&V)); |
| 821 | |||
| 822 | /* Create HU and HV */ | ||
| 823 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(BVDuplicate(U,&HU)); |
| 824 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(BVDuplicate(V,&HV)); |
| 825 | |||
| 826 | 113 | nevsave = eps->nev; | |
| 827 | 113 | eps->nev = (eps->nev+1)/2; | |
| 828 | 113 | l = 0; | |
| 829 | |||
| 830 | /* Restart loop */ | ||
| 831 | 113 | while (eps->reason == EPS_CONVERGED_ITERATING) { | |
| 832 | 2332 | eps->its++; | |
| 833 | |||
| 834 | /* Compute an nv-step Lanczos factorization */ | ||
| 835 | 2332 | nv = PetscMin(eps->nconv+eps->mpd,eps->ncv); | |
| 836 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,eps->nconv+l)); |
| 837 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSGetArrayReal(eps->ds,DS_MAT_T,&d1)); |
| 838 | 2332 | d2 = d1 + ld; | |
| 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.
|
2332 | PetscCall(EPSBSELanczos_Gruning(eps,U,V,HU,HV,d1,d2,eps->nconv+l,&nv,&breakdown)); |
| 840 | 2332 | beta = d1[nv-1]; | |
| 841 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSRestoreArrayReal(eps->ds,DS_MAT_T,&d1)); |
| 842 | |||
| 843 | /* Compute SVD */ | ||
| 844 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,eps->nconv+l)); |
| 845 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSSVDSetDimensions(eps->ds,nv)); |
| 846 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSSetState(eps->ds,l?DS_STATE_RAW:DS_STATE_INTERMEDIATE)); |
| 847 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(BVSetActiveColumns(eps->V,eps->nconv,nv)); |
| 848 | |||
| 849 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSSolve(eps->ds,eps->eigr,eps->eigi)); |
| 850 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSSort(eps->ds,eps->eigr,eps->eigi,NULL,NULL,NULL)); |
| 851 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSUpdateExtraRow(eps->ds)); |
| 852 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSSynchronize(eps->ds,eps->eigr,eps->eigi)); |
| 853 | |||
| 854 | /* Check convergence */ | ||
| 855 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(EPSConvergence_Gruning(eps,PETSC_FALSE,eps->nconv,nv-eps->nconv,&k)); |
| 856 |
14/18✓ 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 taken 8 times.
✓ Branch 8 taken 8 times.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
|
2332 | EPSSetCtxThreshold(eps,eps->eigr,eps->eigi,k); |
| 857 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall((*eps->stopping)(eps,eps->its,eps->max_it,k,eps->nev,&eps->reason,eps->stoppingctx)); |
| 858 | 2332 | nconv = k; | |
| 859 | |||
| 860 | /* Update l */ | ||
| 861 |
4/6✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
2332 | if (eps->reason != EPS_CONVERGED_ITERATING || breakdown || k==nv) l = 0; |
| 862 | 2219 | else l = PetscMax(1,(PetscInt)((nv-k)*ctx->keep)); | |
| 863 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
2332 | if (!ctx->lock && l>0) { l += k; k = 0; } /* non-locking variant: reset no. of converged pairs */ |
| 864 |
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.
|
2332 | if (l) PetscCall(PetscInfo(eps,"Preparing to restart keeping l=%" PetscInt_FMT " vectors\n",l)); |
| 865 | |||
| 866 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2332 | if (eps->reason == EPS_CONVERGED_ITERATING) { |
| 867 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
2219 | PetscCheck(!breakdown,PetscObjectComm((PetscObject)eps),PETSC_ERR_CONV_FAILED,"Breakdown in BSE Krylov-Schur (beta=%g)",(double)beta); |
| 868 | /* Prepare the Rayleigh quotient for restart */ | ||
| 869 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2219 | PetscCall(DSTruncate(eps->ds,k+l,PETSC_FALSE)); |
| 870 | } | ||
| 871 | /* Update the corresponding vectors | ||
| 872 | U(:,idx) = U*Q(:,idx), V(:,idx) = V*Z(:,idx) */ | ||
| 873 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSGetMat(eps->ds,DS_MAT_U,&Q)); |
| 874 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSGetMat(eps->ds,DS_MAT_V,&Z)); |
| 875 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(BVMultInPlace(U,Z,eps->nconv,k+l)); |
| 876 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(BVMultInPlace(V,Q,eps->nconv,k+l)); |
| 877 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(BVMultInPlace(HU,Z,eps->nconv,k+l)); |
| 878 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(BVMultInPlace(HV,Q,eps->nconv,k+l)); |
| 879 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSRestoreMat(eps->ds,DS_MAT_U,&Q)); |
| 880 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSRestoreMat(eps->ds,DS_MAT_V,&Z)); |
| 881 | |||
| 882 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
|
2332 | if (eps->reason == EPS_CONVERGED_ITERATING && !breakdown) { |
| 883 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2219 | PetscCall(BVCopyColumn(U,nv,k+l)); |
| 884 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2219 | PetscCall(BVCopyColumn(HU,nv,k+l)); |
| 885 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
2219 | if (eps->stop==EPS_STOP_THRESHOLD && nv-k<5) { /* reallocate */ |
| 886 | 15 | eps->ncv = eps->mpd+k; | |
| 887 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15 | PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&U,&V)); |
| 888 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15 | PetscCall(EPSReallocateSolution(eps,eps->ncv+1)); |
| 889 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15 | PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&U,&V)); |
| 890 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15 | PetscCall(BVResize(HU,eps->ncv+1,PETSC_TRUE)); |
| 891 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15 | PetscCall(BVResize(HV,eps->ncv+1,PETSC_TRUE)); |
| 892 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
105 | for (i=nv;i<eps->ncv;i++) { eps->perm[i] = i; eps->eigi[i] = 0.0; } |
| 893 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15 | PetscCall(DSReallocate(eps->ds,eps->ncv+1)); |
| 894 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15 | PetscCall(DSGetLeadingDimension(eps->ds,&ld)); |
| 895 | } | ||
| 896 | } | ||
| 897 | 2332 | eps->nconv = k; | |
| 898 |
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.
|
2445 | PetscCall(EPSMonitor(eps,eps->its,nconv,eps->eigr,eps->eigi,eps->errest,nv)); |
| 899 | } | ||
| 900 | |||
| 901 | 113 | eps->nev = nevsave; | |
| 902 | |||
| 903 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(DSTruncate(eps->ds,eps->nconv,PETSC_TRUE)); |
| 904 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&U,&V)); |
| 905 | |||
| 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.
|
113 | PetscCall(BVDestroy(&HU)); |
| 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.
|
113 | PetscCall(BVDestroy(&HV)); |
| 908 |
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.
|
17 | PetscFunctionReturn(PETSC_SUCCESS); |
| 909 | } | ||
| 910 | |||
| 911 | 103 | PetscErrorCode EPSSolve_KrylovSchur_BSE_ProjectedBSE(EPS eps) | |
| 912 | { | ||
| 913 | 103 | EPS_KRYLOVSCHUR *ctx = (EPS_KRYLOVSCHUR*)eps->data; | |
| 914 | 103 | PetscInt i,k,l,ld,nv,nconv=0,nevsave; | |
| 915 | 103 | Mat H,Q; | |
| 916 | 103 | Vec v; | |
| 917 | 103 | BV U,V; | |
| 918 | 103 | IS is[2]; | |
| 919 | 103 | PetscReal *a,*b,beta; | |
| 920 | 103 | PetscBool breakdown=PETSC_FALSE; | |
| 921 | |||
| 922 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
103 | PetscFunctionBegin; |
| 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.
|
103 | PetscCall(DSGetLeadingDimension(eps->ds,&ld)); |
| 924 | |||
| 925 | /* Extract matrix blocks */ | ||
| 926 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(STGetMatrix(eps->st,0,&H)); |
| 927 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(MatNestGetISs(H,is,NULL)); |
| 928 | |||
| 929 | /* Get the split bases */ | ||
| 930 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&U,&V)); |
| 931 | |||
| 932 | /* Vector v */ | ||
| 933 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(BVCreateVec(V,&v)); |
| 934 | |||
| 935 | 103 | nevsave = eps->nev; | |
| 936 | 103 | eps->nev = (eps->nev+1)/2; | |
| 937 | 103 | l = 0; | |
| 938 | |||
| 939 | /* Restart loop */ | ||
| 940 | 103 | while (eps->reason == EPS_CONVERGED_ITERATING) { | |
| 941 | 2332 | eps->its++; | |
| 942 | |||
| 943 | /* Compute an nv-step Lanczos factorization */ | ||
| 944 | 2332 | nv = PetscMin(eps->nconv+eps->mpd,eps->ncv); | |
| 945 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,eps->nconv+l)); |
| 946 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSGetArrayReal(eps->ds,DS_MAT_T,&a)); |
| 947 | 2332 | b = a + ld; | |
| 948 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(EPSBSELanczos_ProjectedBSE(eps,U,V,v,a,b,eps->nconv+l,&nv,&breakdown)); |
| 949 | 2332 | beta = b[nv-1]; | |
| 950 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSRestoreArrayReal(eps->ds,DS_MAT_T,&a)); |
| 951 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,eps->nconv+l)); |
| 952 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSSetState(eps->ds,l?DS_STATE_RAW:DS_STATE_INTERMEDIATE)); |
| 953 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(BVSetActiveColumns(eps->V,eps->nconv,nv)); |
| 954 | |||
| 955 | /* Solve projected problem */ | ||
| 956 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSSolve(eps->ds,eps->eigr,eps->eigi)); |
| 957 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSSort(eps->ds,eps->eigr,eps->eigi,NULL,NULL,NULL)); |
| 958 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSUpdateExtraRow(eps->ds)); |
| 959 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSSynchronize(eps->ds,eps->eigr,eps->eigi)); |
| 960 | |||
| 961 | /* Check convergence */ | ||
| 962 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
36084 | for (i=0;i<nv;i++) eps->eigr[i] = PetscSqrtReal(PetscRealPart(eps->eigr[i])); |
| 963 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(EPSKrylovConvergence(eps,PETSC_FALSE,eps->nconv,nv-eps->nconv,beta,0.0,1.0,&k)); |
| 964 |
14/18✓ 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 taken 8 times.
✓ Branch 8 taken 8 times.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
|
2332 | EPSSetCtxThreshold(eps,eps->eigr,eps->eigi,k); |
| 965 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall((*eps->stopping)(eps,eps->its,eps->max_it,k,eps->nev,&eps->reason,eps->stoppingctx)); |
| 966 | 2332 | nconv = k; | |
| 967 | |||
| 968 | /* Update l */ | ||
| 969 |
4/6✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
2332 | if (eps->reason != EPS_CONVERGED_ITERATING || breakdown || k==nv) l = 0; |
| 970 | 2229 | else l = PetscMax(1,(PetscInt)((nv-k)*ctx->keep)); | |
| 971 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
2332 | if (!ctx->lock && l>0) { l += k; k = 0; } /* non-locking variant: reset no. of converged pairs */ |
| 972 |
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.
|
2332 | if (l) PetscCall(PetscInfo(eps,"Preparing to restart keeping l=%" PetscInt_FMT " vectors\n",l)); |
| 973 | |||
| 974 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2332 | if (eps->reason == EPS_CONVERGED_ITERATING) { |
| 975 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
2229 | PetscCheck(!breakdown,PetscObjectComm((PetscObject)eps),PETSC_ERR_CONV_FAILED,"Breakdown in BSE Krylov-Schur (beta=%g)",(double)beta); |
| 976 | /* Prepare the Rayleigh quotient for restart */ | ||
| 977 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2229 | PetscCall(DSTruncate(eps->ds,k+l,PETSC_FALSE)); |
| 978 | } | ||
| 979 | /* Update the corresponding vectors | ||
| 980 | U(:,idx) = U*Q(:,idx), V(:,idx) = V*Q(:,idx) */ | ||
| 981 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSGetMat(eps->ds,DS_MAT_Q,&Q)); |
| 982 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(BVMultInPlace(U,Q,eps->nconv,k+l)); |
| 983 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(BVMultInPlace(V,Q,eps->nconv,k+l)); |
| 984 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSRestoreMat(eps->ds,DS_MAT_Q,&Q)); |
| 985 | |||
| 986 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
|
2332 | if (eps->reason == EPS_CONVERGED_ITERATING && !breakdown) { |
| 987 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2229 | PetscCall(BVCopyColumn(eps->V,nv,k+l)); |
| 988 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
2229 | if (eps->stop==EPS_STOP_THRESHOLD && nv-k<5) { /* reallocate */ |
| 989 | 15 | eps->ncv = eps->mpd+k; | |
| 990 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15 | PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&U,&V)); |
| 991 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15 | PetscCall(EPSReallocateSolution(eps,eps->ncv+1)); |
| 992 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15 | PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&U,&V)); |
| 993 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
105 | for (i=nv;i<eps->ncv;i++) eps->perm[i] = i; |
| 994 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15 | PetscCall(DSReallocate(eps->ds,eps->ncv+1)); |
| 995 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15 | PetscCall(DSGetLeadingDimension(eps->ds,&ld)); |
| 996 | } | ||
| 997 | } | ||
| 998 | 2332 | eps->nconv = k; | |
| 999 |
7/8✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
|
2435 | PetscCall(EPSMonitor(eps,eps->its,nconv,eps->eigr,eps->eigi,eps->errest,nv)); |
| 1000 | } | ||
| 1001 | |||
| 1002 | 103 | eps->nev = nevsave; | |
| 1003 | |||
| 1004 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(DSTruncate(eps->ds,eps->nconv,PETSC_TRUE)); |
| 1005 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&U,&V)); |
| 1006 | |||
| 1007 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(VecDestroy(&v)); |
| 1008 |
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.
|
15 | PetscFunctionReturn(PETSC_SUCCESS); |
| 1009 | } | ||
| 1010 |