| 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 | Common subroutines for all Krylov-type solvers | ||
| 12 | */ | ||
| 13 | |||
| 14 | #include <slepc/private/epsimpl.h> | ||
| 15 | #include <slepc/private/slepcimpl.h> | ||
| 16 | #include <slepcblaslapack.h> | ||
| 17 | |||
| 18 | /* | ||
| 19 | EPSDelayedArnoldi - This function is equivalent to BVMatArnoldi but | ||
| 20 | performs the computation in a different way. The main idea is that | ||
| 21 | reorthogonalization is delayed to the next Arnoldi step. This version is | ||
| 22 | more scalable but in some cases convergence may stagnate. | ||
| 23 | */ | ||
| 24 | 430 | PetscErrorCode EPSDelayedArnoldi(EPS eps,PetscScalar *H,PetscInt ldh,PetscInt k,PetscInt *M,PetscReal *beta,PetscBool *breakdown) | |
| 25 | { | ||
| 26 | 430 | PetscInt i,j,m=*M; | |
| 27 | 430 | Vec u,t; | |
| 28 | 430 | PetscScalar shh[100],*lhh,dot,dot2; | |
| 29 | 430 | PetscReal norm1=0.0,norm2=1.0; | |
| 30 | 430 | Vec vj,vj1,vj2=NULL; | |
| 31 | |||
| 32 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
430 | PetscFunctionBegin; |
| 33 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
430 | if (m<=100) lhh = shh; |
| 34 | ✗ | else PetscCall(PetscMalloc1(m,&lhh)); | |
| 35 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
430 | PetscCall(BVCreateVec(eps->V,&u)); |
| 36 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
430 | PetscCall(BVCreateVec(eps->V,&t)); |
| 37 | |||
| 38 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
430 | PetscCall(BVSetActiveColumns(eps->V,0,m)); |
| 39 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
7885 | for (j=k;j<m;j++) { |
| 40 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7455 | PetscCall(BVGetColumn(eps->V,j,&vj)); |
| 41 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7455 | PetscCall(BVGetColumn(eps->V,j+1,&vj1)); |
| 42 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7455 | PetscCall(STApply(eps->st,vj,vj1)); |
| 43 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7455 | PetscCall(BVRestoreColumn(eps->V,j,&vj)); |
| 44 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7455 | PetscCall(BVRestoreColumn(eps->V,j+1,&vj1)); |
| 45 | |||
| 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.
|
7455 | PetscCall(BVDotColumnBegin(eps->V,j+1,H+ldh*j)); |
| 47 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
7455 | if (j>k) { |
| 48 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7025 | PetscCall(BVDotColumnBegin(eps->V,j,lhh)); |
| 49 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7025 | PetscCall(BVGetColumn(eps->V,j,&vj)); |
| 50 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7025 | PetscCall(VecDotBegin(vj,vj,&dot)); |
| 51 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
7025 | if (j>k+1) { |
| 52 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6595 | PetscCall(BVNormVecBegin(eps->V,u,NORM_2,&norm2)); |
| 53 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6595 | PetscCall(BVGetColumn(eps->V,j-2,&vj2)); |
| 54 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6595 | PetscCall(VecDotBegin(u,vj2,&dot2)); |
| 55 | } | ||
| 56 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7025 | PetscCall(BVDotColumnEnd(eps->V,j+1,H+ldh*j)); |
| 57 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7025 | PetscCall(BVDotColumnEnd(eps->V,j,lhh)); |
| 58 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7025 | PetscCall(VecDotEnd(vj,vj,&dot)); |
| 59 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7025 | PetscCall(BVRestoreColumn(eps->V,j,&vj)); |
| 60 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
7025 | if (j>k+1) { |
| 61 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6595 | PetscCall(BVNormVecEnd(eps->V,u,NORM_2,&norm2)); |
| 62 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6595 | PetscCall(VecDotEnd(u,vj2,&dot2)); |
| 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.
|
6595 | PetscCall(BVRestoreColumn(eps->V,j-2,&vj2)); |
| 64 | } | ||
| 65 | 7025 | norm1 = PetscSqrtReal(PetscRealPart(dot)); | |
| 66 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
76470 | for (i=0;i<j;i++) H[ldh*j+i] = H[ldh*j+i]/norm1; |
| 67 | 7025 | H[ldh*j+j] = H[ldh*j+j]/dot; | |
| 68 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7025 | PetscCall(BVCopyVec(eps->V,j,t)); |
| 69 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7025 | PetscCall(BVScaleColumn(eps->V,j,1.0/norm1)); |
| 70 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7025 | PetscCall(BVScaleColumn(eps->V,j+1,1.0/norm1)); |
| 71 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
430 | } else PetscCall(BVDotColumnEnd(eps->V,j+1,H+ldh*j)); /* j==k */ |
| 72 | |||
| 73 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7455 | PetscCall(BVMultColumn(eps->V,-1.0,1.0,j+1,H+ldh*j)); |
| 74 | |||
| 75 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
7455 | if (j>k) { |
| 76 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7025 | PetscCall(BVSetActiveColumns(eps->V,0,j)); |
| 77 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7025 | PetscCall(BVMultVec(eps->V,-1.0,1.0,t,lhh)); |
| 78 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7025 | PetscCall(BVSetActiveColumns(eps->V,0,m)); |
| 79 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
76470 | for (i=0;i<j;i++) H[ldh*(j-1)+i] += lhh[i]; |
| 80 | } | ||
| 81 | |||
| 82 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
7455 | if (j>k+1) { |
| 83 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6595 | PetscCall(BVGetColumn(eps->V,j-1,&vj1)); |
| 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.
|
6595 | PetscCall(VecCopy(u,vj1)); |
| 85 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6595 | PetscCall(BVRestoreColumn(eps->V,j-1,&vj1)); |
| 86 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6595 | PetscCall(BVScaleColumn(eps->V,j-1,1.0/norm2)); |
| 87 | 6595 | H[ldh*(j-2)+j-1] = norm2; | |
| 88 | } | ||
| 89 | |||
| 90 |
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.
|
7455 | if (j<m-1) PetscCall(VecCopy(t,u)); |
| 91 | } | ||
| 92 | |||
| 93 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
430 | PetscCall(BVNormVec(eps->V,t,NORM_2,&norm2)); |
| 94 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
430 | PetscCall(VecScale(t,1.0/norm2)); |
| 95 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
430 | PetscCall(BVGetColumn(eps->V,m-1,&vj1)); |
| 96 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
430 | PetscCall(VecCopy(t,vj1)); |
| 97 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
430 | PetscCall(BVRestoreColumn(eps->V,m-1,&vj1)); |
| 98 | 430 | H[ldh*(m-2)+m-1] = norm2; | |
| 99 | |||
| 100 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
430 | PetscCall(BVDotColumn(eps->V,m,lhh)); |
| 101 | |||
| 102 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
430 | PetscCall(BVMultColumn(eps->V,-1.0,1.0,m,lhh)); |
| 103 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
8420 | for (i=0;i<m;i++) |
| 104 | 7990 | H[ldh*(m-1)+i] += lhh[i]; | |
| 105 | |||
| 106 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
430 | PetscCall(BVNormColumn(eps->V,m,NORM_2,beta)); |
| 107 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
430 | PetscCall(BVScaleColumn(eps->V,m,1.0 / *beta)); |
| 108 | 430 | *breakdown = PETSC_FALSE; | |
| 109 | |||
| 110 |
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.
|
430 | if (m>100) PetscCall(PetscFree(lhh)); |
| 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.
|
430 | PetscCall(VecDestroy(&u)); |
| 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.
|
430 | PetscCall(VecDestroy(&t)); |
| 113 |
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.
|
86 | PetscFunctionReturn(PETSC_SUCCESS); |
| 114 | } | ||
| 115 | |||
| 116 | /* | ||
| 117 | EPSDelayedArnoldi1 - This function is similar to EPSDelayedArnoldi, | ||
| 118 | but without reorthogonalization (only delayed normalization). | ||
| 119 | */ | ||
| 120 | 180 | PetscErrorCode EPSDelayedArnoldi1(EPS eps,PetscScalar *H,PetscInt ldh,PetscInt k,PetscInt *M,PetscReal *beta,PetscBool *breakdown) | |
| 121 | { | ||
| 122 | 180 | PetscInt i,j,m=*M; | |
| 123 | 180 | PetscScalar dot; | |
| 124 | 180 | PetscReal norm=0.0; | |
| 125 | 180 | Vec vj,vj1; | |
| 126 | |||
| 127 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
180 | PetscFunctionBegin; |
| 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.
|
180 | PetscCall(BVSetActiveColumns(eps->V,0,m)); |
| 129 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
3260 | for (j=k;j<m;j++) { |
| 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.
|
3080 | PetscCall(BVGetColumn(eps->V,j,&vj)); |
| 131 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3080 | PetscCall(BVGetColumn(eps->V,j+1,&vj1)); |
| 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.
|
3080 | PetscCall(STApply(eps->st,vj,vj1)); |
| 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.
|
3080 | PetscCall(BVRestoreColumn(eps->V,j+1,&vj1)); |
| 134 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
3080 | if (j>k) { |
| 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.
|
2900 | PetscCall(BVDotColumnBegin(eps->V,j+1,H+ldh*j)); |
| 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.
|
2900 | PetscCall(VecDotBegin(vj,vj,&dot)); |
| 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.
|
2900 | PetscCall(BVDotColumnEnd(eps->V,j+1,H+ldh*j)); |
| 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.
|
2900 | PetscCall(VecDotEnd(vj,vj,&dot)); |
| 139 | 2900 | norm = PetscSqrtReal(PetscRealPart(dot)); | |
| 140 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2900 | PetscCall(BVScaleColumn(eps->V,j,1.0/norm)); |
| 141 | 2900 | H[ldh*(j-1)+j] = norm; | |
| 142 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
30220 | for (i=0;i<j;i++) H[ldh*j+i] = H[ldh*j+i]/norm; |
| 143 | 2900 | H[ldh*j+j] = H[ldh*j+j]/dot; | |
| 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.
|
2900 | PetscCall(BVScaleColumn(eps->V,j+1,1.0/norm)); |
| 145 | 2900 | *beta = norm; | |
| 146 | } else { /* j==k */ | ||
| 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.
|
180 | PetscCall(BVDotColumn(eps->V,j+1,H+ldh*j)); |
| 148 | } | ||
| 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.
|
3080 | PetscCall(BVRestoreColumn(eps->V,j,&vj)); |
| 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.
|
3080 | PetscCall(BVMultColumn(eps->V,-1.0,1.0,j+1,H+ldh*j)); |
| 151 | } | ||
| 152 | |||
| 153 | 180 | *breakdown = PETSC_FALSE; | |
| 154 |
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.
|
180 | PetscFunctionReturn(PETSC_SUCCESS); |
| 155 | } | ||
| 156 | |||
| 157 | /* | ||
| 158 | EPSKrylovConvergence_Filter - Specialized version for STFILTER. | ||
| 159 | */ | ||
| 160 | 332 | static PetscErrorCode EPSKrylovConvergence_Filter(EPS eps,PetscBool getall,PetscInt kini,PetscInt nits,PetscReal beta,PetscReal gamma,PetscInt *kout) | |
| 161 | { | ||
| 162 | 332 | PetscInt k,ninside,nconv; | |
| 163 | 332 | PetscScalar re,im; | |
| 164 | 332 | PetscReal resnorm; | |
| 165 | |||
| 166 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
332 | PetscFunctionBegin; |
| 167 | 332 | ninside = 0; /* count how many eigenvalues are located in the interval */ | |
| 168 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
2812 | for (k=kini;k<kini+nits;k++) { |
| 169 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2812 | if (PetscRealPart(eps->eigr[k]) < gamma) break; |
| 170 | 2480 | ninside++; | |
| 171 | } | ||
| 172 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
332 | if (eps->trackall) getall = PETSC_TRUE; |
| 173 | 332 | eps->nev = ninside+kini; /* adjust eigenvalue count */ | |
| 174 | 332 | nconv = 0; /* count how many eigenvalues satisfy the convergence criterion */ | |
| 175 |
3/4✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
3484 | for (k=kini;k<kini+(getall?nits:ninside);k++) { |
| 176 | /* eigenvalue */ | ||
| 177 | 1564 | re = eps->eigr[k]; | |
| 178 | 1564 | im = eps->eigi[k]; | |
| 179 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1564 | PetscCall(DSVectors(eps->ds,DS_MAT_X,&k,&resnorm)); |
| 180 | 1564 | resnorm *= beta; | |
| 181 | /* error estimate */ | ||
| 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.
|
1564 | PetscCall((*eps->converged)(eps,re,im,resnorm,&eps->errest[k],eps->convergedctx)); |
| 183 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1564 | if (eps->errest[k] < eps->tol) nconv++; |
| 184 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
154 | else if (!getall) break; |
| 185 | } | ||
| 186 | 332 | *kout = kini+nconv; | |
| 187 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
332 | PetscCall(PetscInfo(eps,"Found %" PetscInt_FMT " eigenvalue approximations inside the interval (gamma=%g), k=%" PetscInt_FMT " nconv=%" PetscInt_FMT "\n",ninside,(double)gamma,k,nconv)); |
| 188 |
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.
|
56 | PetscFunctionReturn(PETSC_SUCCESS); |
| 189 | } | ||
| 190 | |||
| 191 | /* | ||
| 192 | EPSKrylovConvergence - Implements the loop that checks for convergence | ||
| 193 | in Krylov methods. | ||
| 194 | |||
| 195 | Input Parameters: | ||
| 196 | eps - the eigensolver; some error estimates are updated in eps->errest | ||
| 197 | getall - whether all residuals must be computed | ||
| 198 | kini - initial value of k (the loop variable) | ||
| 199 | nits - number of iterations of the loop | ||
| 200 | V - set of basis vectors (used only if trueresidual is activated) | ||
| 201 | nv - number of vectors to process (dimension of Q, columns of V) | ||
| 202 | beta - norm of f (the residual vector of the Arnoldi/Lanczos factorization) | ||
| 203 | corrf - correction factor for residual estimates (only in harmonic KS) | ||
| 204 | |||
| 205 | Output Parameters: | ||
| 206 | kout - the first index where the convergence test failed | ||
| 207 | */ | ||
| 208 | 54309 | PetscErrorCode EPSKrylovConvergence(EPS eps,PetscBool getall,PetscInt kini,PetscInt nits,PetscReal beta,PetscReal betat,PetscReal corrf,PetscInt *kout) | |
| 209 | { | ||
| 210 | 54309 | PetscInt k,newk,newk2,marker,ld,inside; | |
| 211 | 54309 | PetscScalar re,im,*Zr,*Zi,*X; | |
| 212 | 54309 | PetscReal resnorm,gamma,lerrest; | |
| 213 | 54309 | PetscBool isshift,isfilter,refined,istrivial; | |
| 214 | 54309 | Vec x=NULL,y=NULL,w[3]; | |
| 215 | |||
| 216 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
54309 | PetscFunctionBegin; |
| 217 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
54309 | if (PetscUnlikely(eps->which == EPS_ALL)) { |
| 218 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1119 | PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STFILTER,&isfilter)); |
| 219 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1119 | if (isfilter) { |
| 220 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
332 | PetscCall(STFilterGetThreshold(eps->st,&gamma)); |
| 221 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
332 | PetscCall(EPSKrylovConvergence_Filter(eps,getall,kini,nits,beta,gamma,kout)); |
| 222 |
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.
|
56 | PetscFunctionReturn(PETSC_SUCCESS); |
| 223 | } | ||
| 224 | } | ||
| 225 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
53977 | PetscCall(RGIsTrivial(eps->rg,&istrivial)); |
| 226 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
53977 | if (PetscUnlikely(eps->trueres)) { |
| 227 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
420 | PetscCall(BVCreateVec(eps->V,&x)); |
| 228 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
420 | PetscCall(BVCreateVec(eps->V,&y)); |
| 229 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
420 | PetscCall(BVCreateVec(eps->V,&w[0])); |
| 230 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
420 | PetscCall(BVCreateVec(eps->V,&w[2])); |
| 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.
|
240 | PetscCall(BVCreateVec(eps->V,&w[1])); |
| 233 | #else | ||
| 234 | 180 | w[1] = NULL; | |
| 235 | #endif | ||
| 236 | } | ||
| 237 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
53977 | PetscCall(DSGetLeadingDimension(eps->ds,&ld)); |
| 238 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
53977 | PetscCall(DSGetRefined(eps->ds,&refined)); |
| 239 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
53977 | PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STSHIFT,&isshift)); |
| 240 | 53977 | marker = -1; | |
| 241 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
53977 | if (eps->trackall) getall = PETSC_TRUE; |
| 242 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
145795 | for (k=kini;k<kini+nits;k++) { |
| 243 | /* eigenvalue */ | ||
| 244 | 144225 | re = eps->eigr[k]; | |
| 245 | 144225 | im = eps->eigi[k]; | |
| 246 |
12/14✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 10 times.
✓ Branch 7 taken 10 times.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 8 times.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
|
144225 | if (!istrivial || eps->trueres || isshift || eps->conv==EPS_CONV_NORM) PetscCall(STBackTransform(eps->st,1,&re,&im)); |
| 247 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
144225 | if (PetscUnlikely(!istrivial)) { |
| 248 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1150 | PetscCall(RGCheckInside(eps->rg,1,&re,&im,&inside)); |
| 249 |
3/4✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
1150 | if (marker==-1 && inside<0) marker = k; |
| 250 |
4/6✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
|
1150 | if (!(eps->trueres || isshift || eps->conv==EPS_CONV_NORM)) { /* make sure eps->converged below uses the right value */ |
| 251 | 425 | re = eps->eigr[k]; | |
| 252 | 425 | im = eps->eigi[k]; | |
| 253 | } | ||
| 254 | } | ||
| 255 | 144225 | newk = k; | |
| 256 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
144225 | PetscCall(DSVectors(eps->ds,DS_MAT_X,&newk,&resnorm)); |
| 257 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
144225 | if (PetscUnlikely(eps->trueres)) { |
| 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.
|
655 | PetscCall(DSGetArray(eps->ds,DS_MAT_X,&X)); |
| 259 | 655 | Zr = X+k*ld; | |
| 260 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
|
655 | if (newk==k+1) Zi = X+newk*ld; |
| 261 | else Zi = NULL; | ||
| 262 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
655 | PetscCall(EPSComputeRitzVector(eps,Zr,Zi,eps->V,x,y)); |
| 263 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
655 | PetscCall(DSRestoreArray(eps->ds,DS_MAT_X,&X)); |
| 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.
|
655 | PetscCall(EPSComputeResidualNorm_Private(eps,PETSC_FALSE,re,im,x,y,w,&resnorm)); |
| 265 | } | ||
| 266 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
143570 | else if (!refined) resnorm *= beta*corrf; |
| 267 | /* error estimate */ | ||
| 268 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
144225 | PetscCall((*eps->converged)(eps,re,im,resnorm,&eps->errest[k],eps->convergedctx)); |
| 269 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
144225 | if (marker==-1 && eps->errest[k] >= eps->tol) marker = k; |
| 270 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
144225 | if (PetscUnlikely(eps->twosided)) { |
| 271 | 1942 | newk2 = k; | |
| 272 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1942 | PetscCall(DSVectors(eps->ds,DS_MAT_Y,&newk2,&resnorm)); |
| 273 | 1942 | resnorm *= betat; | |
| 274 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1942 | PetscCall((*eps->converged)(eps,re,im,resnorm,&lerrest,eps->convergedctx)); |
| 275 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1942 | eps->errest[k] = PetscMax(eps->errest[k],lerrest); |
| 276 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
1942 | if (marker==-1 && lerrest >= eps->tol) marker = k; |
| 277 | } | ||
| 278 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
144225 | if (PetscUnlikely(newk==k+1)) { |
| 279 | 2991 | eps->errest[k+1] = eps->errest[k]; | |
| 280 | 2991 | k++; | |
| 281 | } | ||
| 282 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
144225 | if (marker!=-1 && !getall) break; |
| 283 | } | ||
| 284 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
53977 | if (marker!=-1) k = marker; |
| 285 | 53977 | *kout = k; | |
| 286 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
53977 | if (PetscUnlikely(eps->trueres)) { |
| 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.
|
420 | PetscCall(VecDestroy(&x)); |
| 288 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
420 | PetscCall(VecDestroy(&y)); |
| 289 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
420 | PetscCall(VecDestroy(&w[0])); |
| 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.
|
420 | PetscCall(VecDestroy(&w[2])); |
| 291 | #if !defined(PETSC_USE_COMPLEX) | ||
| 292 |
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.
|
240 | PetscCall(VecDestroy(&w[1])); |
| 293 | #endif | ||
| 294 | } | ||
| 295 |
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.
|
10422 | PetscFunctionReturn(PETSC_SUCCESS); |
| 296 | } | ||
| 297 | |||
| 298 | 6999 | PetscErrorCode EPSPseudoLanczos(EPS eps,PetscReal *alpha,PetscReal *beta,PetscReal *omega,PetscInt k,PetscInt *M,PetscBool *breakdown,PetscBool *symmlost,PetscReal *cos,Vec w) | |
| 299 | { | ||
| 300 | 6999 | PetscInt j,m = *M,i,ld,l; | |
| 301 | 6999 | Vec vj,vj1; | |
| 302 | 6999 | PetscScalar *hwork,lhwork[100]; | |
| 303 | 6999 | PetscReal norm,norm1,norm2,t,sym=0.0,fro=0.0; | |
| 304 | 6999 | PetscBLASInt j_,one=1; | |
| 305 | |||
| 306 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
6999 | PetscFunctionBegin; |
| 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.
|
6999 | PetscCall(DSGetLeadingDimension(eps->ds,&ld)); |
| 308 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6999 | PetscCall(DSGetDimensions(eps->ds,NULL,&l,NULL,NULL)); |
| 309 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
6999 | if (cos) *cos = 1.0; |
| 310 |
6/8✓ Branch 0 taken 6 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
6999 | if (m > 100) PetscCall(PetscMalloc1(m,&hwork)); |
| 311 | 6956 | else hwork = lhwork; | |
| 312 | |||
| 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.
|
6999 | PetscCall(BVSetActiveColumns(eps->V,0,m)); |
| 314 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
86834 | for (j=k;j<m;j++) { |
| 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.
|
79835 | PetscCall(BVGetColumn(eps->V,j,&vj)); |
| 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.
|
79835 | PetscCall(BVGetColumn(eps->V,j+1,&vj1)); |
| 317 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
79835 | PetscCall(STApply(eps->st,vj,vj1)); |
| 318 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
79835 | PetscCall(BVRestoreColumn(eps->V,j,&vj)); |
| 319 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
79835 | PetscCall(BVRestoreColumn(eps->V,j+1,&vj1)); |
| 320 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
79835 | PetscCall(BVOrthogonalizeColumn(eps->V,j+1,hwork,&norm,breakdown)); |
| 321 | 79835 | alpha[j] = PetscRealPart(hwork[j]); | |
| 322 | 79835 | beta[j] = PetscAbsReal(norm); | |
| 323 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
79835 | if (j==k) { |
| 324 | 6999 | PetscReal *f; | |
| 325 | |||
| 326 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6999 | PetscCall(DSGetArrayReal(eps->ds,DS_MAT_T,&f)); |
| 327 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
10901 | for (i=0;i<l;i++) hwork[i] = 0.0; |
| 328 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
174191 | for (;i<j-1;i++) hwork[i] -= f[2*ld+i]; |
| 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.
|
6999 | PetscCall(DSRestoreArrayReal(eps->ds,DS_MAT_T,&f)); |
| 330 | } | ||
| 331 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
79835 | if (j>0) { |
| 332 | 79714 | hwork[j-1] -= beta[j-1]; | |
| 333 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
79714 | PetscCall(PetscBLASIntCast(j,&j_)); |
| 334 | 79714 | sym = SlepcAbs(BLASnrm2_(&j_,hwork,&one),sym); | |
| 335 | } | ||
| 336 | 79835 | fro = SlepcAbs(fro,SlepcAbs(alpha[j],beta[j])); | |
| 337 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
79835 | if (j>0) fro = SlepcAbs(fro,beta[j-1]); |
| 338 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
|
80729 | if (sym/fro>PetscMax(PETSC_SQRT_MACHINE_EPSILON,10*eps->tol)) { *symmlost = PETSC_TRUE; *M=j; break; } |
| 339 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
79835 | omega[j+1] = (norm<0.0)? -1.0: 1.0; |
| 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.
|
79835 | PetscCall(BVScaleColumn(eps->V,j+1,1.0/norm)); |
| 341 | /* */ | ||
| 342 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
79835 | if (cos) { |
| 343 | ✗ | PetscCall(BVGetColumn(eps->V,j+1,&vj1)); | |
| 344 | ✗ | PetscCall(VecNorm(vj1,NORM_2,&norm1)); | |
| 345 | ✗ | PetscCall(BVApplyMatrix(eps->V,vj1,w)); | |
| 346 | ✗ | PetscCall(BVRestoreColumn(eps->V,j+1,&vj1)); | |
| 347 | ✗ | PetscCall(VecNorm(w,NORM_2,&norm2)); | |
| 348 | ✗ | t = 1.0/(norm1*norm2); | |
| 349 | ✗ | if (*cos>t) *cos = t; | |
| 350 | } | ||
| 351 | } | ||
| 352 |
7/10✓ Branch 0 taken 6 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 4 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
|
6999 | if (m > 100) PetscCall(PetscFree(hwork)); |
| 353 |
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.
|
1388 | PetscFunctionReturn(PETSC_SUCCESS); |
| 354 | } | ||
| 355 |