| 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: "subspace" | ||
| 12 | |||
| 13 | Method: Subspace Iteration | ||
| 14 | |||
| 15 | Algorithm: | ||
| 16 | |||
| 17 | Subspace iteration with Rayleigh-Ritz projection and locking, | ||
| 18 | based on the SRRIT implementation. | ||
| 19 | |||
| 20 | References: | ||
| 21 | |||
| 22 | [1] "Subspace Iteration in SLEPc", SLEPc Technical Report STR-3, | ||
| 23 | available at https://slepc.upv.es. | ||
| 24 | */ | ||
| 25 | |||
| 26 | #include <slepc/private/epsimpl.h> | ||
| 27 | |||
| 28 | typedef struct { | ||
| 29 | PetscBool estimatedrange; /* the filter range was not set by the user */ | ||
| 30 | } EPS_SUBSPACE; | ||
| 31 | |||
| 32 | 28 | static PetscErrorCode EPSSetUp_Subspace_Filter(EPS eps) | |
| 33 | { | ||
| 34 | 28 | EPS_SUBSPACE *ctx = (EPS_SUBSPACE*)eps->data; | |
| 35 | 28 | PetscBool estimaterange=PETSC_TRUE; | |
| 36 | 28 | PetscReal rleft,rright; | |
| 37 | 28 | Mat A; | |
| 38 | |||
| 39 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
28 | PetscFunctionBegin; |
| 40 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
28 | EPSCheckHermitianCondition(eps,PETSC_TRUE," with polynomial filter"); |
| 41 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
28 | EPSCheckStandardCondition(eps,PETSC_TRUE," with polynomial filter"); |
| 42 |
1/6✗ 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.
|
28 | PetscCheck(eps->intb<PETSC_MAX_REAL || eps->inta>PETSC_MIN_REAL,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONG,"The defined computational interval should have at least one of their sides bounded"); |
| 43 |
8/18✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 10 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
|
28 | EPSCheckUnsupportedCondition(eps,EPS_FEATURE_ARBITRARY | EPS_FEATURE_REGION | EPS_FEATURE_EXTRACTION,PETSC_TRUE," with polynomial filter"); |
| 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.
|
28 | PetscCall(STFilterSetInterval(eps->st,eps->inta,eps->intb)); |
| 45 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
28 | if (!ctx->estimatedrange) { |
| 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.
|
28 | PetscCall(STFilterGetRange(eps->st,&rleft,&rright)); |
| 47 |
3/4✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 2 times.
|
28 | estimaterange = (!rleft && !rright)? PETSC_TRUE: PETSC_FALSE; |
| 48 | } | ||
| 49 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
4 | if (estimaterange) { /* user did not set a range */ |
| 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.
|
28 | PetscCall(STGetMatrix(eps->st,0,&A)); |
| 51 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
28 | PetscCall(MatEstimateSpectralRange_EPS(A,&rleft,&rright)); |
| 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.
|
28 | PetscCall(PetscInfo(eps,"Setting eigenvalue range to [%g,%g]\n",(double)rleft,(double)rright)); |
| 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.
|
28 | PetscCall(STFilterSetRange(eps->st,rleft,rright)); |
| 54 | 28 | ctx->estimatedrange = PETSC_TRUE; | |
| 55 | } | ||
| 56 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
28 | if (eps->ncv==PETSC_DETERMINE && eps->nev==1) eps->nev = 40; /* user did not provide nev estimation */ |
| 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.
|
28 | PetscCall(EPSSetDimensions_Default(eps,&eps->nev,&eps->ncv,&eps->mpd)); |
| 58 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
28 | 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"); |
| 59 |
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.
|
4 | PetscFunctionReturn(PETSC_SUCCESS); |
| 60 | } | ||
| 61 | |||
| 62 | 207 | static PetscErrorCode EPSSetUp_Subspace(EPS eps) | |
| 63 | { | ||
| 64 | 207 | PetscBool isfilt; | |
| 65 | |||
| 66 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
207 | PetscFunctionBegin; |
| 67 |
4/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
207 | EPSCheckDefinite(eps); |
| 68 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
207 | EPSCheckNotStructured(eps); |
| 69 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
207 | if (eps->max_it==PETSC_DETERMINE) eps->max_it = PetscMax(100,2*eps->n/eps->ncv); |
| 70 |
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.
|
207 | if (!eps->which) PetscCall(EPSSetWhichEigenpairs_Default(eps)); |
| 71 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
207 | if (eps->which==EPS_ALL) { |
| 72 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
28 | if (eps->nev==0) eps->nev = 1; |
| 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.
|
28 | PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STFILTER,&isfilt)); |
| 74 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
28 | PetscCheck(isfilt,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Spectrum slicing not supported in this solver"); |
| 75 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
28 | PetscCall(EPSSetUp_Subspace_Filter(eps)); |
| 76 | } else { | ||
| 77 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
179 | PetscCheck(eps->which==EPS_LARGEST_MAGNITUDE || eps->which==EPS_TARGET_MAGNITUDE,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"This solver supports only largest magnitude or target magnitude eigenvalues"); |
| 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.
|
179 | PetscCall(EPSSetDimensions_Default(eps,&eps->nev,&eps->ncv,&eps->mpd)); |
| 79 | } | ||
| 80 |
4/16✗ 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 not taken.
✓ Branch 9 taken 10 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 10 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
207 | EPSCheckUnsupported(eps,EPS_FEATURE_ARBITRARY | EPS_FEATURE_EXTRACTION | EPS_FEATURE_THRESHOLD | EPS_FEATURE_TWOSIDED); |
| 81 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
207 | PetscCheck(eps->converged==EPSConvergedRelative,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"This solver only supports relative convergence test"); |
| 82 | |||
| 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.
|
207 | PetscCall(EPSAllocateSolution(eps,0)); |
| 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.
|
207 | PetscCall(EPS_SetInnerProduct(eps)); |
| 85 |
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.
|
207 | if (eps->ishermitian) PetscCall(DSSetType(eps->ds,DSHEP)); |
| 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.
|
56 | else PetscCall(DSSetType(eps->ds,DSNHEP)); |
| 87 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
207 | PetscCall(DSAllocate(eps->ds,eps->ncv)); |
| 88 |
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.
|
39 | PetscFunctionReturn(PETSC_SUCCESS); |
| 89 | } | ||
| 90 | |||
| 91 | 207 | static PetscErrorCode EPSSetUpSort_Subspace(EPS eps) | |
| 92 | { | ||
| 93 | 207 | SlepcSC sc; | |
| 94 | |||
| 95 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
207 | PetscFunctionBegin; |
| 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.
|
207 | PetscCall(EPSSetUpSort_Default(eps)); |
| 97 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
207 | if (eps->which==EPS_ALL) { |
| 98 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
28 | PetscCall(DSGetSlepcSC(eps->ds,&sc)); |
| 99 | 28 | sc->rg = NULL; | |
| 100 | 28 | sc->comparison = SlepcCompareLargestReal; | |
| 101 | 28 | sc->comparisonctx = NULL; | |
| 102 | 28 | sc->map = NULL; | |
| 103 | 28 | sc->mapobj = NULL; | |
| 104 | } | ||
| 105 |
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.
|
39 | PetscFunctionReturn(PETSC_SUCCESS); |
| 106 | } | ||
| 107 | |||
| 108 | /* | ||
| 109 | EPSSubspaceFindGroup - Find a group of nearly equimodular eigenvalues, provided | ||
| 110 | in arrays wr and wi, according to the tolerance grptol. Also the 2-norms | ||
| 111 | of the residuals must be passed in (rsd). Arrays are processed from index | ||
| 112 | l to index m only. The output information is: | ||
| 113 | |||
| 114 | ngrp - number of entries of the group | ||
| 115 | ctr - (w(l)+w(l+ngrp-1))/2 | ||
| 116 | ae - average of wr(l),...,wr(l+ngrp-1) | ||
| 117 | arsd - average of rsd(l),...,rsd(l+ngrp-1) | ||
| 118 | */ | ||
| 119 | 6560 | static PetscErrorCode EPSSubspaceFindGroup(PetscInt l,PetscInt m,PetscScalar *wr,PetscScalar *wi,PetscReal *rsd,PetscReal grptol,PetscInt *ngrp,PetscReal *ctr,PetscReal *ae,PetscReal *arsd) | |
| 120 | { | ||
| 121 | 6560 | PetscInt i; | |
| 122 | 6560 | PetscReal rmod,rmod1; | |
| 123 | |||
| 124 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
6560 | PetscFunctionBegin; |
| 125 | 6560 | *ngrp = 0; | |
| 126 | 6560 | *ctr = 0; | |
| 127 | 6560 | rmod = SlepcAbsEigenvalue(wr[l],wi[l]); | |
| 128 | |||
| 129 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
19768 | for (i=l;i<m;) { |
| 130 | 16383 | rmod1 = SlepcAbsEigenvalue(wr[i],wi[i]); | |
| 131 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
16383 | if (PetscAbsReal(rmod-rmod1) > grptol*(rmod+rmod1)) break; |
| 132 | 10042 | *ctr = (rmod+rmod1)/2.0; | |
| 133 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10042 | if (wi[i] == 0.0) { |
| 134 | 10042 | (*ngrp)++; | |
| 135 | 10042 | i++; | |
| 136 | } else { | ||
| 137 | ✗ | (*ngrp)+=2; | |
| 138 | ✗ | i+=2; | |
| 139 | } | ||
| 140 | } | ||
| 141 | |||
| 142 | 6560 | *ae = 0; | |
| 143 | 6560 | *arsd = 0; | |
| 144 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
6560 | if (*ngrp) { |
| 145 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
16602 | for (i=l;i<l+*ngrp;i++) { |
| 146 | 10042 | (*ae) += PetscRealPart(wr[i]); | |
| 147 | 10042 | (*arsd) += rsd[i]*rsd[i]; | |
| 148 | } | ||
| 149 | 6560 | *ae = *ae / *ngrp; | |
| 150 | 6560 | *arsd = PetscSqrtReal(*arsd / *ngrp); | |
| 151 | } | ||
| 152 |
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.
|
6560 | PetscFunctionReturn(PETSC_SUCCESS); |
| 153 | } | ||
| 154 | |||
| 155 | /* | ||
| 156 | EPSSubspaceResidualNorms - Computes the column norms of residual vectors | ||
| 157 | OP*V(1:n,l:m) - V*T(1:m,l:m), where, on entry, OP*V has been computed and | ||
| 158 | stored in R. On exit, rsd(l) to rsd(m) contain the computed norms. | ||
| 159 | */ | ||
| 160 | 1939 | static PetscErrorCode EPSSubspaceResidualNorms(BV R,BV V,Mat T,PetscInt l,PetscInt m,PetscScalar *eigi,PetscReal *rsd) | |
| 161 | { | ||
| 162 | 1939 | PetscInt i; | |
| 163 | |||
| 164 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1939 | PetscFunctionBegin; |
| 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.
|
1939 | PetscCall(BVMult(R,-1.0,1.0,V,T)); |
| 166 |
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.
|
34128 | for (i=l;i<m;i++) PetscCall(BVNormColumnBegin(R,i,NORM_2,rsd+i)); |
| 167 |
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.
|
34128 | for (i=l;i<m;i++) PetscCall(BVNormColumnEnd(R,i,NORM_2,rsd+i)); |
| 168 | #if !defined(PETSC_USE_COMPLEX) | ||
| 169 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
15487 | for (i=l;i<m-1;i++) { |
| 170 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
|
14550 | if (eigi[i]!=0.0) { |
| 171 | ✗ | rsd[i] = SlepcAbs(rsd[i],rsd[i+1]); | |
| 172 | ✗ | rsd[i+1] = rsd[i]; | |
| 173 | ✗ | i++; | |
| 174 | } | ||
| 175 | } | ||
| 176 | #endif | ||
| 177 |
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.
|
357 | PetscFunctionReturn(PETSC_SUCCESS); |
| 178 | } | ||
| 179 | |||
| 180 | 207 | static PetscErrorCode EPSSolve_Subspace(EPS eps) | |
| 181 | { | ||
| 182 | 207 | Mat H,Q,S,T,B; | |
| 183 | 207 | BV AV,R; | |
| 184 | 207 | PetscBool indef; | |
| 185 | 207 | PetscInt i,k,ld,ngrp,nogrp,*itrsd,*itrsdold; | |
| 186 | 207 | PetscInt nxtsrr,idsrr,idort,nxtort,nv,ncv = eps->ncv,its,ninside; | |
| 187 | 207 | PetscReal arsd,oarsd,ctr,octr,ae,oae,*rsd,*orsd,tcond=1.0,gamma; | |
| 188 | 207 | PetscScalar *oeigr,*oeigi; | |
| 189 | /* Parameters */ | ||
| 190 | 207 | PetscInt init = 5; /* Number of initial iterations */ | |
| 191 | 207 | PetscReal stpfac = 1.5; /* Max num of iter before next SRR step */ | |
| 192 | 207 | PetscReal alpha = 1.0; /* Used to predict convergence of next residual */ | |
| 193 | 207 | PetscReal beta = 1.1; /* Used to predict convergence of next residual */ | |
| 194 | 207 | PetscReal grptol = SLEPC_DEFAULT_TOL; /* Tolerance for EPSSubspaceFindGroup */ | |
| 195 | 207 | PetscReal cnvtol = 1e-6; /* Convergence criterion for cnv */ | |
| 196 | 207 | PetscInt orttol = 2; /* Number of decimal digits whose loss | |
| 197 | can be tolerated in orthogonalization */ | ||
| 198 | |||
| 199 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
207 | PetscFunctionBegin; |
| 200 | 207 | its = 0; | |
| 201 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
207 | PetscCall(PetscMalloc6(ncv,&rsd,ncv,&orsd,ncv,&oeigr,ncv,&oeigi,ncv,&itrsd,ncv,&itrsdold)); |
| 202 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
207 | PetscCall(DSGetLeadingDimension(eps->ds,&ld)); |
| 203 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
207 | PetscCall(BVDuplicate(eps->V,&AV)); |
| 204 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
207 | PetscCall(BVDuplicate(eps->V,&R)); |
| 205 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
207 | PetscCall(STGetOperator(eps->st,&S)); |
| 206 | |||
| 207 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
3956 | for (i=0;i<ncv;i++) { |
| 208 | 3749 | rsd[i] = 0.0; | |
| 209 | 3749 | itrsd[i] = -1; | |
| 210 | } | ||
| 211 | |||
| 212 | /* Complete the initial basis with random vectors and orthonormalize them */ | ||
| 213 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
3936 | for (k=eps->nini;k<ncv;k++) { |
| 214 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3729 | PetscCall(BVSetRandomColumn(eps->V,k)); |
| 215 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3729 | PetscCall(BVOrthonormalizeColumn(eps->V,k,PETSC_TRUE,NULL,NULL)); |
| 216 | } | ||
| 217 | |||
| 218 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
1939 | while (eps->reason == EPS_CONVERGED_ITERATING) { |
| 219 | 1939 | eps->its++; | |
| 220 | 1939 | nv = PetscMin(eps->nconv+eps->mpd,ncv); | |
| 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.
|
1939 | PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,0)); |
| 222 | |||
| 223 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
34128 | for (i=eps->nconv;i<nv;i++) { |
| 224 | 32189 | oeigr[i] = eps->eigr[i]; | |
| 225 | 32189 | oeigi[i] = eps->eigi[i]; | |
| 226 | 32189 | orsd[i] = rsd[i]; | |
| 227 | } | ||
| 228 | |||
| 229 | /* AV(:,idx) = OP * V(:,idx) */ | ||
| 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.
|
1939 | PetscCall(BVSetActiveColumns(eps->V,eps->nconv,nv)); |
| 231 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(BVSetActiveColumns(AV,eps->nconv,nv)); |
| 232 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(BVMatMult(eps->V,S,AV)); |
| 233 | |||
| 234 | /* T(:,idx) = V' * AV(:,idx) */ | ||
| 235 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(BVSetActiveColumns(eps->V,0,nv)); |
| 236 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(DSGetMat(eps->ds,DS_MAT_A,&H)); |
| 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.
|
1939 | PetscCall(BVDot(AV,eps->V,H)); |
| 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.
|
1939 | PetscCall(DSRestoreMat(eps->ds,DS_MAT_A,&H)); |
| 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.
|
1939 | PetscCall(DSSetState(eps->ds,DS_STATE_RAW)); |
| 240 | |||
| 241 | /* Solve projected problem */ | ||
| 242 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(DSSolve(eps->ds,eps->eigr,eps->eigi)); |
| 243 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(DSSort(eps->ds,eps->eigr,eps->eigi,NULL,NULL,NULL)); |
| 244 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(DSSynchronize(eps->ds,eps->eigr,eps->eigi)); |
| 245 | |||
| 246 | /* Update vectors V(:,idx) = V * U(:,idx) */ | ||
| 247 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(DSGetMat(eps->ds,DS_MAT_Q,&Q)); |
| 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.
|
1939 | PetscCall(BVSetActiveColumns(AV,0,nv)); |
| 249 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(BVSetActiveColumns(R,0,nv)); |
| 250 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(BVMultInPlace(eps->V,Q,eps->nconv,nv)); |
| 251 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(BVMultInPlace(AV,Q,eps->nconv,nv)); |
| 252 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(DSRestoreMat(eps->ds,DS_MAT_Q,&Q)); |
| 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.
|
1939 | PetscCall(BVCopy(AV,R)); |
| 254 | |||
| 255 | /* Convergence check */ | ||
| 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.
|
1939 | PetscCall(DSGetMat(eps->ds,DS_MAT_A,&T)); |
| 257 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(EPSSubspaceResidualNorms(R,eps->V,T,eps->nconv,nv,eps->eigi,rsd)); |
| 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.
|
1939 | PetscCall(DSRestoreMat(eps->ds,DS_MAT_A,&T)); |
| 259 | |||
| 260 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
1939 | if (eps->which==EPS_ALL && eps->its>1) { /* adjust eigenvalue count */ |
| 261 | 289 | ninside = 0; | |
| 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.
|
289 | PetscCall(STFilterGetThreshold(eps->st,&gamma)); |
| 263 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
2567 | for (i=eps->nconv;i<nv;i++) { |
| 264 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2567 | if (PetscRealPart(eps->eigr[i]) < gamma) break; |
| 265 | 2278 | ninside++; | |
| 266 | } | ||
| 267 | 289 | eps->nev = eps->nconv+ninside; | |
| 268 | } | ||
| 269 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
34128 | for (i=eps->nconv;i<nv;i++) { |
| 270 | 32189 | itrsdold[i] = itrsd[i]; | |
| 271 | 32189 | itrsd[i] = its; | |
| 272 | 32189 | eps->errest[i] = rsd[i]; | |
| 273 | } | ||
| 274 | |||
| 275 | 3280 | for (;;) { | |
| 276 | /* Find clusters of computed eigenvalues */ | ||
| 277 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3280 | PetscCall(EPSSubspaceFindGroup(eps->nconv,nv,eps->eigr,eps->eigi,eps->errest,grptol,&ngrp,&ctr,&ae,&arsd)); |
| 278 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3280 | PetscCall(EPSSubspaceFindGroup(eps->nconv,nv,oeigr,oeigi,orsd,grptol,&nogrp,&octr,&oae,&oarsd)); |
| 279 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
3280 | if (ngrp!=nogrp) break; |
| 280 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
3073 | if (ngrp==0) break; |
| 281 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
3073 | if (PetscAbsReal(ae-oae)>ctr*cnvtol*(itrsd[eps->nconv]-itrsdold[eps->nconv])) break; |
| 282 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2271 | if (arsd>ctr*eps->tol) break; |
| 283 | 1347 | eps->nconv = eps->nconv + ngrp; | |
| 284 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 6 times.
|
1347 | if (eps->nconv>=nv) break; |
| 285 | } | ||
| 286 | |||
| 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.
|
1939 | PetscCall(EPSMonitor(eps,eps->its,eps->nconv,eps->eigr,eps->eigi,eps->errest,nv)); |
| 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.
|
1939 | PetscCall((*eps->stopping)(eps,eps->its,eps->max_it,eps->nconv,eps->nev,&eps->reason,eps->stoppingctx)); |
| 289 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1939 | if (eps->reason != EPS_CONVERGED_ITERATING) break; |
| 290 | |||
| 291 | /* Compute nxtsrr (iteration of next projection step) */ | ||
| 292 | 1732 | nxtsrr = PetscMin(eps->max_it,PetscMax((PetscInt)PetscFloorReal(stpfac*its),init)); | |
| 293 | |||
| 294 |
5/6✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
|
1732 | if (ngrp!=nogrp || ngrp==0 || arsd>=oarsd) { |
| 295 | 237 | idsrr = nxtsrr - its; | |
| 296 | } else { | ||
| 297 | 1495 | idsrr = (PetscInt)PetscFloorReal(alpha+beta*(itrsdold[eps->nconv]-itrsd[eps->nconv])*PetscLogReal(arsd/eps->tol)/PetscLogReal(arsd/oarsd)); | |
| 298 | 1495 | idsrr = PetscMax(1,idsrr); | |
| 299 | } | ||
| 300 | 1732 | nxtsrr = PetscMin(nxtsrr,its+idsrr); | |
| 301 | |||
| 302 | /* Compute nxtort (iteration of next orthogonalization step) */ | ||
| 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.
|
1732 | PetscCall(DSCond(eps->ds,&tcond)); |
| 304 |
5/6✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
|
1732 | idort = PetscMax(1,(PetscInt)PetscFloorReal(orttol/PetscMax(1,PetscLog10Real(tcond)))); |
| 305 | 1732 | nxtort = PetscMin(its+idort,nxtsrr); | |
| 306 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1732 | PetscCall(PetscInfo(eps,"Updated iteration counts: nxtort=%" PetscInt_FMT ", nxtsrr=%" PetscInt_FMT "\n",nxtort,nxtsrr)); |
| 307 | |||
| 308 | /* V(:,idx) = AV(:,idx) */ | ||
| 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.
|
1732 | PetscCall(BVSetActiveColumns(eps->V,eps->nconv,nv)); |
| 310 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1732 | PetscCall(BVSetActiveColumns(AV,eps->nconv,nv)); |
| 311 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1732 | PetscCall(BVCopy(AV,eps->V)); |
| 312 | 1732 | its++; | |
| 313 | |||
| 314 | /* Orthogonalization loop */ | ||
| 315 | 19216 | do { | |
| 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.
|
19216 | PetscCall(BVGetMatrix(eps->V,&B,&indef)); |
| 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.
|
19216 | PetscCall(BVSetMatrix(eps->V,NULL,PETSC_FALSE)); |
| 318 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
53751 | while (its<nxtort) { |
| 319 | /* A(:,idx) = OP*V(:,idx) with normalization */ | ||
| 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.
|
34535 | PetscCall(BVMatMult(eps->V,S,AV)); |
| 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.
|
34535 | PetscCall(BVCopy(AV,eps->V)); |
| 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.
|
34535 | PetscCall(BVNormalize(eps->V,NULL)); |
| 323 | 34535 | its++; | |
| 324 | } | ||
| 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.
|
19216 | PetscCall(BVSetMatrix(eps->V,B,indef)); |
| 326 | /* Orthonormalize vectors */ | ||
| 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.
|
19216 | PetscCall(BVOrthogonalize(eps->V,NULL)); |
| 328 | 19216 | nxtort = PetscMin(its+idort,nxtsrr); | |
| 329 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
19216 | } while (its<nxtsrr); |
| 330 | } | ||
| 331 | |||
| 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.
|
207 | PetscCall(PetscFree6(rsd,orsd,oeigr,oeigi,itrsd,itrsdold)); |
| 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.
|
207 | PetscCall(BVDestroy(&AV)); |
| 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.
|
207 | PetscCall(BVDestroy(&R)); |
| 335 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
207 | PetscCall(STRestoreOperator(eps->st,&S)); |
| 336 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
207 | PetscCall(DSTruncate(eps->ds,eps->nconv,PETSC_TRUE)); |
| 337 |
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.
|
39 | PetscFunctionReturn(PETSC_SUCCESS); |
| 338 | } | ||
| 339 | |||
| 340 | 187 | static PetscErrorCode EPSDestroy_Subspace(EPS eps) | |
| 341 | { | ||
| 342 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
187 | PetscFunctionBegin; |
| 343 |
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.
|
187 | PetscCall(PetscFree(eps->data)); |
| 344 |
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.
|
35 | PetscFunctionReturn(PETSC_SUCCESS); |
| 345 | } | ||
| 346 | |||
| 347 | /*MC | ||
| 348 | EPSSUBSPACE - EPSSUBSPACE = "subspace" - The simple subspace iteration method. | ||
| 349 | |||
| 350 | Notes: | ||
| 351 | This solver is very basic and is not recommended in general, since it | ||
| 352 | will not be competitive with respect to other solvers. | ||
| 353 | |||
| 354 | The implemented method is subspace iteration with Rayleigh-Ritz projection and | ||
| 355 | locking, based on the SRRIT code {cite:p}`Bai97`. | ||
| 356 | |||
| 357 | Level: beginner | ||
| 358 | |||
| 359 | .seealso: [](ch:eps), `EPS`, `EPSType`, `EPSSetType()` | ||
| 360 | M*/ | ||
| 361 | 187 | SLEPC_EXTERN PetscErrorCode EPSCreate_Subspace(EPS eps) | |
| 362 | { | ||
| 363 | 187 | EPS_SUBSPACE *ctx; | |
| 364 | |||
| 365 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
187 | PetscFunctionBegin; |
| 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.
|
187 | PetscCall(PetscNew(&ctx)); |
| 367 | 187 | eps->data = (void*)ctx; | |
| 368 | |||
| 369 | 187 | eps->useds = PETSC_TRUE; | |
| 370 | 187 | eps->categ = EPS_CATEGORY_OTHER; | |
| 371 | |||
| 372 | 187 | eps->ops->solve = EPSSolve_Subspace; | |
| 373 | 187 | eps->ops->setup = EPSSetUp_Subspace; | |
| 374 | 187 | eps->ops->setupsort = EPSSetUpSort_Subspace; | |
| 375 | 187 | eps->ops->destroy = EPSDestroy_Subspace; | |
| 376 | 187 | eps->ops->backtransform = EPSBackTransform_Default; | |
| 377 | 187 | eps->ops->computevectors = EPSComputeVectors_Schur; | |
| 378 |
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.
|
187 | PetscFunctionReturn(PETSC_SUCCESS); |
| 379 | } | ||
| 380 |