| 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: "rqcg" | ||
| 12 | |||
| 13 | Method: Rayleigh Quotient Conjugate Gradient | ||
| 14 | |||
| 15 | Algorithm: | ||
| 16 | |||
| 17 | Conjugate Gradient minimization of the Rayleigh quotient with | ||
| 18 | periodic Rayleigh-Ritz acceleration. | ||
| 19 | |||
| 20 | References: | ||
| 21 | |||
| 22 | [1] L. Bergamaschi et al., "Parallel preconditioned conjugate gradient | ||
| 23 | optimization of the Rayleigh quotient for the solution of sparse | ||
| 24 | eigenproblems", Appl. Math. Comput. 175(2):1694-1715, 2006. | ||
| 25 | */ | ||
| 26 | |||
| 27 | #include <slepc/private/epsimpl.h> /*I "slepceps.h" I*/ | ||
| 28 | |||
| 29 | static PetscErrorCode EPSSolve_RQCG(EPS); | ||
| 30 | |||
| 31 | typedef struct { | ||
| 32 | PetscInt nrest; /* user-provided reset parameter */ | ||
| 33 | PetscInt allocsize; /* number of columns of work BV's allocated at setup */ | ||
| 34 | BV AV,W,P,G; | ||
| 35 | } EPS_RQCG; | ||
| 36 | |||
| 37 | 149 | static PetscErrorCode EPSSetUp_RQCG(EPS eps) | |
| 38 | { | ||
| 39 | 149 | PetscInt nmat; | |
| 40 | 149 | EPS_RQCG *ctx = (EPS_RQCG*)eps->data; | |
| 41 | |||
| 42 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
149 | PetscFunctionBegin; |
| 43 |
4/10✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
149 | EPSCheckHermitianDefinite(eps); |
| 44 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
149 | EPSCheckNotStructured(eps); |
| 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.
|
149 | PetscCall(EPSSetDimensions_Default(eps,&eps->nev,&eps->ncv,&eps->mpd)); |
| 46 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
149 | if (eps->max_it==PETSC_DETERMINE) eps->max_it = PetscMax(100,2*eps->n/eps->ncv); |
| 47 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
149 | if (!eps->which) eps->which = EPS_SMALLEST_REAL; |
| 48 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
149 | PetscCheck(eps->which==EPS_SMALLEST_REAL,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"This solver supports only smallest real eigenvalues"); |
| 49 |
9/22✗ 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 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.
|
149 | EPSCheckUnsupported(eps,EPS_FEATURE_ARBITRARY | EPS_FEATURE_REGION | EPS_FEATURE_EXTRACTION | EPS_FEATURE_THRESHOLD); |
| 50 |
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.
|
149 | EPSCheckIgnored(eps,EPS_FEATURE_BALANCE); |
| 51 | |||
| 52 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
149 | if (!ctx->nrest) ctx->nrest = 20; |
| 53 | |||
| 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.
|
149 | PetscCall(EPSAllocateSolution(eps,0)); |
| 55 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
149 | PetscCall(EPS_SetInnerProduct(eps)); |
| 56 | |||
| 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.
|
149 | PetscCall(STGetNumMatrices(eps->st,&nmat)); |
| 58 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
149 | if (!ctx->allocsize) { |
| 59 | 119 | ctx->allocsize = eps->mpd; | |
| 60 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
119 | PetscCall(BVDuplicateResize(eps->V,eps->mpd,&ctx->AV)); |
| 61 |
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.
|
119 | if (nmat>1) PetscCall(BVDuplicate(ctx->AV,&ctx->W)); |
| 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.
|
119 | PetscCall(BVDuplicate(ctx->AV,&ctx->P)); |
| 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.
|
119 | PetscCall(BVDuplicate(ctx->AV,&ctx->G)); |
| 64 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
30 | } else if (ctx->allocsize!=eps->mpd) { |
| 65 | 10 | ctx->allocsize = eps->mpd; | |
| 66 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(BVResize(ctx->AV,eps->mpd,PETSC_FALSE)); |
| 67 |
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.
|
10 | if (nmat>1) PetscCall(BVResize(ctx->W,eps->mpd,PETSC_FALSE)); |
| 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.
|
10 | PetscCall(BVResize(ctx->P,eps->mpd,PETSC_FALSE)); |
| 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.
|
10 | PetscCall(BVResize(ctx->G,eps->mpd,PETSC_FALSE)); |
| 70 | } | ||
| 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.
|
149 | PetscCall(DSSetType(eps->ds,DSHEP)); |
| 72 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
149 | PetscCall(DSAllocate(eps->ds,eps->ncv)); |
| 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.
|
149 | PetscCall(EPSSetWorkVecs(eps,1)); |
| 74 |
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.
|
29 | PetscFunctionReturn(PETSC_SUCCESS); |
| 75 | } | ||
| 76 | |||
| 77 | 149 | static PetscErrorCode EPSSolve_RQCG(EPS eps) | |
| 78 | { | ||
| 79 | 149 | EPS_RQCG *ctx = (EPS_RQCG*)eps->data; | |
| 80 | 149 | PetscInt i,j,k,ld,nv,ncv = eps->ncv,kini,nmat; | |
| 81 | 149 | PetscScalar *C,*gamma,g,pap,pbp,pbx,pax,nu,mu,alpha,beta; | |
| 82 | 149 | PetscReal resnorm,a,b,c,d,disc,t; | |
| 83 | 149 | PetscBool reset; | |
| 84 | 149 | Mat A,B,Q,Q1; | |
| 85 | 149 | Vec v,av,bv,p,w=eps->work[0]; | |
| 86 | |||
| 87 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
149 | PetscFunctionBegin; |
| 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.
|
149 | PetscCall(DSGetLeadingDimension(eps->ds,&ld)); |
| 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.
|
149 | PetscCall(STGetNumMatrices(eps->st,&nmat)); |
| 90 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
149 | PetscCall(STGetMatrix(eps->st,0,&A)); |
| 91 |
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.
|
149 | if (nmat>1) PetscCall(STGetMatrix(eps->st,1,&B)); |
| 92 | 125 | else B = NULL; | |
| 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.
|
149 | PetscCall(PetscMalloc1(eps->mpd,&gamma)); |
| 94 | |||
| 95 | 149 | kini = eps->nini; | |
| 96 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
6319 | while (eps->reason == EPS_CONVERGED_ITERATING) { |
| 97 | 6170 | eps->its++; | |
| 98 | 6170 | nv = PetscMin(eps->nconv+eps->mpd,ncv); | |
| 99 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6170 | PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,0)); |
| 100 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
9119 | for (;kini<nv;kini++) { /* Generate more initial vectors if necessary */ |
| 101 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2949 | PetscCall(BVSetRandomColumn(eps->V,kini)); |
| 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.
|
2949 | PetscCall(BVOrthonormalizeColumn(eps->V,kini,PETSC_TRUE,NULL,NULL)); |
| 103 | } | ||
| 104 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
6170 | reset = (eps->its>1 && (eps->its-1)%ctx->nrest==0)? PETSC_TRUE: PETSC_FALSE; |
| 105 | |||
| 106 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
|
6170 | if (reset) { |
| 107 | /* Prevent BVDotVec below to use B-product, restored at the end */ | ||
| 108 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
379 | PetscCall(BVSetMatrix(eps->V,NULL,PETSC_FALSE)); |
| 109 | |||
| 110 | /* Compute Rayleigh quotient */ | ||
| 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.
|
379 | PetscCall(BVSetActiveColumns(eps->V,eps->nconv,nv)); |
| 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.
|
379 | PetscCall(BVSetActiveColumns(ctx->AV,0,nv-eps->nconv)); |
| 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.
|
379 | PetscCall(BVMatMult(eps->V,A,ctx->AV)); |
| 114 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
379 | PetscCall(DSGetArray(eps->ds,DS_MAT_A,&C)); |
| 115 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
8395 | for (i=eps->nconv;i<nv;i++) { |
| 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.
|
8016 | PetscCall(BVSetActiveColumns(eps->V,eps->nconv,i+1)); |
| 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.
|
8016 | PetscCall(BVGetColumn(ctx->AV,i-eps->nconv,&av)); |
| 118 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8016 | PetscCall(BVDotVec(eps->V,av,C+eps->nconv+i*ld)); |
| 119 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8016 | PetscCall(BVRestoreColumn(ctx->AV,i-eps->nconv,&av)); |
| 120 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
92857 | for (j=eps->nconv;j<i-1;j++) C[i+j*ld] = PetscConj(C[j+i*ld]); |
| 121 | } | ||
| 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.
|
379 | PetscCall(DSRestoreArray(eps->ds,DS_MAT_A,&C)); |
| 123 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
379 | PetscCall(DSSetState(eps->ds,DS_STATE_RAW)); |
| 124 | |||
| 125 | /* Solve projected problem */ | ||
| 126 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
379 | PetscCall(DSSolve(eps->ds,eps->eigr,eps->eigi)); |
| 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.
|
379 | PetscCall(DSSort(eps->ds,eps->eigr,eps->eigi,NULL,NULL,NULL)); |
| 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.
|
379 | PetscCall(DSSynchronize(eps->ds,eps->eigr,eps->eigi)); |
| 129 | |||
| 130 | /* Update vectors V(:,idx) = V * Y(:,idx) */ | ||
| 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.
|
379 | PetscCall(DSGetMat(eps->ds,DS_MAT_Q,&Q)); |
| 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.
|
379 | PetscCall(BVMultInPlace(eps->V,Q,eps->nconv,nv)); |
| 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.
|
379 | PetscCall(MatDenseGetSubMatrix(Q,eps->nconv,PETSC_DECIDE,eps->nconv,PETSC_DECIDE,&Q1)); |
| 134 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
379 | PetscCall(BVMultInPlace(ctx->AV,Q1,0,nv-eps->nconv)); |
| 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.
|
379 | PetscCall(MatDenseRestoreSubMatrix(Q,&Q1)); |
| 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.
|
379 | PetscCall(DSRestoreMat(eps->ds,DS_MAT_Q,&Q)); |
| 137 |
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.
|
379 | if (B) PetscCall(BVSetMatrix(eps->V,B,PETSC_FALSE)); |
| 138 | } else { | ||
| 139 | /* No need to do Rayleigh-Ritz, just take diag(V'*A*V) */ | ||
| 140 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
105262 | for (i=eps->nconv;i<nv;i++) { |
| 141 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
99471 | PetscCall(BVGetColumn(eps->V,i,&v)); |
| 142 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
99471 | PetscCall(BVGetColumn(ctx->AV,i-eps->nconv,&av)); |
| 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.
|
99471 | PetscCall(MatMult(A,v,av)); |
| 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.
|
99471 | PetscCall(VecDot(av,v,eps->eigr+i)); |
| 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.
|
99471 | PetscCall(BVRestoreColumn(eps->V,i,&v)); |
| 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.
|
99471 | PetscCall(BVRestoreColumn(ctx->AV,i-eps->nconv,&av)); |
| 147 | } | ||
| 148 | } | ||
| 149 | |||
| 150 | /* Compute gradient and check convergence */ | ||
| 151 | 6170 | k = -1; | |
| 152 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
113657 | for (i=eps->nconv;i<nv;i++) { |
| 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.
|
107487 | PetscCall(BVGetColumn(eps->V,i,&v)); |
| 154 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
107487 | PetscCall(BVGetColumn(ctx->AV,i-eps->nconv,&av)); |
| 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.
|
107487 | PetscCall(BVGetColumn(ctx->G,i-eps->nconv,&p)); |
| 156 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
107487 | if (B) { |
| 157 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
17954 | PetscCall(BVGetColumn(ctx->W,i-eps->nconv,&bv)); |
| 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.
|
17954 | PetscCall(MatMult(B,v,bv)); |
| 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.
|
17954 | PetscCall(VecWAXPY(p,-eps->eigr[i],bv,av)); |
| 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.
|
17954 | PetscCall(BVRestoreColumn(ctx->W,i-eps->nconv,&bv)); |
| 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.
|
89533 | } else PetscCall(VecWAXPY(p,-eps->eigr[i],v,av)); |
| 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.
|
107487 | PetscCall(BVRestoreColumn(eps->V,i,&v)); |
| 163 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
107487 | PetscCall(BVRestoreColumn(ctx->AV,i-eps->nconv,&av)); |
| 164 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
107487 | PetscCall(VecNorm(p,NORM_2,&resnorm)); |
| 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.
|
107487 | PetscCall(BVRestoreColumn(ctx->G,i-eps->nconv,&p)); |
| 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.
|
107487 | PetscCall((*eps->converged)(eps,eps->eigr[i],0.0,resnorm,&eps->errest[i],eps->convergedctx)); |
| 167 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
107487 | if (k==-1 && eps->errest[i] >= eps->tol) k = i; |
| 168 | } | ||
| 169 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
6170 | if (k==-1) k = nv; |
| 170 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6170 | PetscCall((*eps->stopping)(eps,eps->its,eps->max_it,k,eps->nev,&eps->reason,eps->stoppingctx)); |
| 171 | |||
| 172 | /* The next lines are necessary to avoid DS zeroing eigr */ | ||
| 173 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6170 | PetscCall(DSGetArray(eps->ds,DS_MAT_A,&C)); |
| 174 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
7487 | for (i=eps->nconv;i<k;i++) C[i+i*ld] = eps->eigr[i]; |
| 175 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6170 | PetscCall(DSRestoreArray(eps->ds,DS_MAT_A,&C)); |
| 176 | |||
| 177 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
6170 | if (eps->reason == EPS_CONVERGED_ITERATING) { |
| 178 | |||
| 179 | /* Search direction */ | ||
| 180 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
110823 | for (i=0;i<nv-eps->nconv;i++) { |
| 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.
|
104802 | PetscCall(BVGetColumn(ctx->G,i,&v)); |
| 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.
|
104802 | PetscCall(STApply(eps->st,v,w)); |
| 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.
|
104802 | PetscCall(VecDot(w,v,&g)); |
| 184 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
104802 | PetscCall(BVRestoreColumn(ctx->G,i,&v)); |
| 185 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
104802 | beta = (!reset && eps->its>1)? g/gamma[i]: 0.0; |
| 186 | 104802 | gamma[i] = g; | |
| 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.
|
104802 | PetscCall(BVGetColumn(ctx->P,i,&v)); |
| 188 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
104802 | PetscCall(VecAXPBY(v,1.0,beta,w)); |
| 189 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
104802 | if (i+eps->nconv>0) { |
| 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.
|
102534 | PetscCall(BVSetActiveColumns(eps->V,0,i+eps->nconv)); |
| 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.
|
102534 | PetscCall(BVOrthogonalizeVec(eps->V,v,NULL,NULL,NULL)); |
| 192 | } | ||
| 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.
|
104802 | PetscCall(BVRestoreColumn(ctx->P,i,&v)); |
| 194 | } | ||
| 195 | |||
| 196 | /* Minimization problem */ | ||
| 197 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
110823 | for (i=eps->nconv;i<nv;i++) { |
| 198 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
104802 | PetscCall(BVGetColumn(eps->V,i,&v)); |
| 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.
|
104802 | PetscCall(BVGetColumn(ctx->AV,i-eps->nconv,&av)); |
| 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.
|
104802 | PetscCall(BVGetColumn(ctx->P,i-eps->nconv,&p)); |
| 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.
|
104802 | PetscCall(VecDot(av,v,&nu)); |
| 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.
|
104802 | PetscCall(VecDot(av,p,&pax)); |
| 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.
|
104802 | PetscCall(MatMult(A,p,w)); |
| 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.
|
104802 | PetscCall(VecDot(w,p,&pap)); |
| 205 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
104802 | if (B) { |
| 206 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
17552 | PetscCall(BVGetColumn(ctx->W,i-eps->nconv,&bv)); |
| 207 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
17552 | PetscCall(VecDot(bv,v,&mu)); |
| 208 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
17552 | PetscCall(VecDot(bv,p,&pbx)); |
| 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.
|
17552 | PetscCall(BVRestoreColumn(ctx->W,i-eps->nconv,&bv)); |
| 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.
|
17552 | PetscCall(MatMult(B,p,w)); |
| 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.
|
17552 | PetscCall(VecDot(w,p,&pbp)); |
| 212 | } else { | ||
| 213 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
87250 | PetscCall(VecDot(v,v,&mu)); |
| 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.
|
87250 | PetscCall(VecDot(v,p,&pbx)); |
| 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.
|
87250 | PetscCall(VecDot(p,p,&pbp)); |
| 216 | } | ||
| 217 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
104802 | PetscCall(BVRestoreColumn(ctx->AV,i-eps->nconv,&av)); |
| 218 | 104802 | a = PetscRealPart(pap*pbx-pax*pbp); | |
| 219 | 104802 | b = PetscRealPart(nu*pbp-mu*pap); | |
| 220 | 104802 | c = PetscRealPart(mu*pax-nu*pbx); | |
| 221 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
111017 | t = PetscMax(PetscMax(PetscAbsReal(a),PetscAbsReal(b)),PetscAbsReal(c)); |
| 222 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 9 times.
|
104802 | if (t!=0.0) { a /= t; b /= t; c /= t; } |
| 223 | 104802 | disc = b*b-4.0*a*c; | |
| 224 | 104802 | d = PetscSqrtReal(PetscAbsReal(disc)); | |
| 225 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
104802 | if (b>=0.0 && a!=0.0) alpha = (b+d)/(2.0*a); |
| 226 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
96324 | else if (b!=d) alpha = 2.0*c/(b-d); |
| 227 | else alpha = 0; | ||
| 228 | /* Next iterate */ | ||
| 229 |
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.
|
104757 | if (alpha!=0.0) PetscCall(VecAXPY(v,alpha,p)); |
| 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.
|
104802 | PetscCall(BVRestoreColumn(eps->V,i,&v)); |
| 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.
|
104802 | PetscCall(BVRestoreColumn(ctx->P,i-eps->nconv,&p)); |
| 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.
|
104802 | PetscCall(BVOrthonormalizeColumn(eps->V,i,PETSC_TRUE,NULL,NULL)); |
| 233 | } | ||
| 234 | } | ||
| 235 | |||
| 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.
|
6170 | PetscCall(EPSMonitor(eps,eps->its,k,eps->eigr,eps->eigi,eps->errest,nv)); |
| 237 | 6170 | eps->nconv = k; | |
| 238 | } | ||
| 239 | |||
| 240 |
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.
|
149 | PetscCall(PetscFree(gamma)); |
| 241 |
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.
|
29 | PetscFunctionReturn(PETSC_SUCCESS); |
| 242 | } | ||
| 243 | |||
| 244 | 20 | static PetscErrorCode EPSRQCGSetReset_RQCG(EPS eps,PetscInt nrest) | |
| 245 | { | ||
| 246 | 20 | EPS_RQCG *ctx = (EPS_RQCG*)eps->data; | |
| 247 | |||
| 248 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
20 | PetscFunctionBegin; |
| 249 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
20 | if (nrest==PETSC_DEFAULT || nrest==PETSC_DECIDE) { |
| 250 | ✗ | ctx->nrest = 0; | |
| 251 | ✗ | eps->state = EPS_STATE_INITIAL; | |
| 252 | } else { | ||
| 253 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
20 | PetscCheck(nrest>0,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Reset parameter must be >0"); |
| 254 | 20 | ctx->nrest = nrest; | |
| 255 | } | ||
| 256 |
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); |
| 257 | } | ||
| 258 | |||
| 259 | /*@ | ||
| 260 | EPSRQCGSetReset - Sets the reset parameter of the RQCG iteration. | ||
| 261 | |||
| 262 | Logically Collective | ||
| 263 | |||
| 264 | Input Parameters: | ||
| 265 | + eps - the linear eigensolver context | ||
| 266 | - nrest - the number of iterations between resets | ||
| 267 | |||
| 268 | Options Database Key: | ||
| 269 | . -eps_rqcg_reset \<nrest\> - sets the reset parameter | ||
| 270 | |||
| 271 | Note: | ||
| 272 | The meaning of the reset parameter is that every `nrest` iterations the | ||
| 273 | solver performs a Rayleigh-Ritz projection step. | ||
| 274 | |||
| 275 | Level: advanced | ||
| 276 | |||
| 277 | .seealso: [](ch:eps), `EPSRQCG`, `EPSRQCGGetReset()` | ||
| 278 | @*/ | ||
| 279 | 20 | PetscErrorCode EPSRQCGSetReset(EPS eps,PetscInt nrest) | |
| 280 | { | ||
| 281 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
20 | PetscFunctionBegin; |
| 282 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
20 | PetscValidHeaderSpecific(eps,EPS_CLASSID,1); |
| 283 |
27/62✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
|
20 | PetscValidLogicalCollectiveInt(eps,nrest,2); |
| 284 |
8/14✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
|
20 | PetscTryMethod(eps,"EPSRQCGSetReset_C",(EPS,PetscInt),(eps,nrest)); |
| 285 |
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.
|
20 | PetscFunctionReturn(PETSC_SUCCESS); |
| 286 | } | ||
| 287 | |||
| 288 | 10 | static PetscErrorCode EPSRQCGGetReset_RQCG(EPS eps,PetscInt *nrest) | |
| 289 | { | ||
| 290 | 10 | EPS_RQCG *ctx = (EPS_RQCG*)eps->data; | |
| 291 | |||
| 292 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
10 | PetscFunctionBegin; |
| 293 | 10 | *nrest = ctx->nrest; | |
| 294 |
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.
|
10 | PetscFunctionReturn(PETSC_SUCCESS); |
| 295 | } | ||
| 296 | |||
| 297 | /*@ | ||
| 298 | EPSRQCGGetReset - Gets the reset parameter used in the RQCG method. | ||
| 299 | |||
| 300 | Not Collective | ||
| 301 | |||
| 302 | Input Parameter: | ||
| 303 | . eps - the linear eigensolver context | ||
| 304 | |||
| 305 | Output Parameter: | ||
| 306 | . nrest - the reset parameter | ||
| 307 | |||
| 308 | Level: advanced | ||
| 309 | |||
| 310 | .seealso: [](ch:eps), `EPSRQCG`, `EPSRQCGSetReset()` | ||
| 311 | @*/ | ||
| 312 | 10 | PetscErrorCode EPSRQCGGetReset(EPS eps,PetscInt *nrest) | |
| 313 | { | ||
| 314 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
10 | PetscFunctionBegin; |
| 315 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
10 | PetscValidHeaderSpecific(eps,EPS_CLASSID,1); |
| 316 |
2/8✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
10 | PetscAssertPointer(nrest,2); |
| 317 |
9/16✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ 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.
|
10 | PetscUseMethod(eps,"EPSRQCGGetReset_C",(EPS,PetscInt*),(eps,nrest)); |
| 318 |
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.
|
10 | PetscFunctionReturn(PETSC_SUCCESS); |
| 319 | } | ||
| 320 | |||
| 321 | 119 | static PetscErrorCode EPSReset_RQCG(EPS eps) | |
| 322 | { | ||
| 323 | 119 | EPS_RQCG *ctx = (EPS_RQCG*)eps->data; | |
| 324 | |||
| 325 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
119 | PetscFunctionBegin; |
| 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.
|
119 | PetscCall(BVDestroy(&ctx->AV)); |
| 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.
|
119 | PetscCall(BVDestroy(&ctx->W)); |
| 328 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
119 | PetscCall(BVDestroy(&ctx->P)); |
| 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.
|
119 | PetscCall(BVDestroy(&ctx->G)); |
| 330 | 119 | ctx->allocsize = 0; | |
| 331 |
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.
|
119 | PetscFunctionReturn(PETSC_SUCCESS); |
| 332 | } | ||
| 333 | |||
| 334 | 109 | static PetscErrorCode EPSSetFromOptions_RQCG(EPS eps,PetscOptionItems PetscOptionsObject) | |
| 335 | { | ||
| 336 | 109 | PetscBool flg; | |
| 337 | 109 | PetscInt nrest; | |
| 338 | |||
| 339 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
109 | PetscFunctionBegin; |
| 340 |
1/12✗ 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.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
109 | PetscOptionsHeadBegin(PetscOptionsObject,"EPS RQCG Options"); |
| 341 | |||
| 342 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
109 | PetscCall(PetscOptionsInt("-eps_rqcg_reset","Reset parameter","EPSRQCGSetReset",20,&nrest,&flg)); |
| 343 |
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.
|
109 | if (flg) PetscCall(EPSRQCGSetReset(eps,nrest)); |
| 344 | |||
| 345 |
1/14✗ Branch 0 not taken.
✓ Branch 1 taken 2 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.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
109 | PetscOptionsHeadEnd(); |
| 346 |
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.
|
21 | PetscFunctionReturn(PETSC_SUCCESS); |
| 347 | } | ||
| 348 | |||
| 349 | 119 | static PetscErrorCode EPSDestroy_RQCG(EPS eps) | |
| 350 | { | ||
| 351 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
119 | PetscFunctionBegin; |
| 352 |
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.
|
119 | PetscCall(PetscFree(eps->data)); |
| 353 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
119 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSRQCGSetReset_C",NULL)); |
| 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.
|
119 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSRQCGGetReset_C",NULL)); |
| 355 |
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.
|
23 | PetscFunctionReturn(PETSC_SUCCESS); |
| 356 | } | ||
| 357 | |||
| 358 | 10 | static PetscErrorCode EPSView_RQCG(EPS eps,PetscViewer viewer) | |
| 359 | { | ||
| 360 | 10 | EPS_RQCG *ctx = (EPS_RQCG*)eps->data; | |
| 361 | 10 | PetscBool isascii; | |
| 362 | |||
| 363 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
10 | PetscFunctionBegin; |
| 364 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii)); |
| 365 |
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.
|
10 | if (isascii) PetscCall(PetscViewerASCIIPrintf(viewer," reset every %" PetscInt_FMT " iterations\n",ctx->nrest)); |
| 366 |
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.
|
2 | PetscFunctionReturn(PETSC_SUCCESS); |
| 367 | } | ||
| 368 | |||
| 369 | /*MC | ||
| 370 | EPSRQCG - EPSRQCG = "rqcg" - The Rayleigh Quotient Conjugate Gradient method. | ||
| 371 | |||
| 372 | Notes: | ||
| 373 | This is a preconditioned eigensolver for computing leftmost | ||
| 374 | eigenvalues, similar to `EPSLOBPCG`, but usually less competitive. | ||
| 375 | |||
| 376 | The description of the method is in {cite:p}`Ber06` | ||
| 377 | |||
| 378 | The preconditioner is specified via the internal `ST` object and its | ||
| 379 | associated `KSP`. | ||
| 380 | |||
| 381 | Level: beginner | ||
| 382 | |||
| 383 | .seealso: [](ch:eps), `EPS`, `EPSType`, `EPSSetType()`, `EPSGetST()` | ||
| 384 | M*/ | ||
| 385 | 119 | SLEPC_EXTERN PetscErrorCode EPSCreate_RQCG(EPS eps) | |
| 386 | { | ||
| 387 | 119 | EPS_RQCG *rqcg; | |
| 388 | |||
| 389 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
119 | PetscFunctionBegin; |
| 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.
|
119 | PetscCall(PetscNew(&rqcg)); |
| 391 | 119 | eps->data = (void*)rqcg; | |
| 392 | |||
| 393 | 119 | eps->useds = PETSC_TRUE; | |
| 394 | 119 | eps->categ = EPS_CATEGORY_PRECOND; | |
| 395 | |||
| 396 | 119 | eps->ops->solve = EPSSolve_RQCG; | |
| 397 | 119 | eps->ops->setup = EPSSetUp_RQCG; | |
| 398 | 119 | eps->ops->setupsort = EPSSetUpSort_Default; | |
| 399 | 119 | eps->ops->setfromoptions = EPSSetFromOptions_RQCG; | |
| 400 | 119 | eps->ops->destroy = EPSDestroy_RQCG; | |
| 401 | 119 | eps->ops->reset = EPSReset_RQCG; | |
| 402 | 119 | eps->ops->view = EPSView_RQCG; | |
| 403 | 119 | eps->ops->backtransform = EPSBackTransform_Default; | |
| 404 | 119 | eps->ops->setdefaultst = EPSSetDefaultST_GMRES; | |
| 405 | |||
| 406 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
119 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSRQCGSetReset_C",EPSRQCGSetReset_RQCG)); |
| 407 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
119 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSRQCGGetReset_C",EPSRQCGGetReset_RQCG)); |
| 408 |
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.
|
23 | PetscFunctionReturn(PETSC_SUCCESS); |
| 409 | } | ||
| 410 |