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. Every | ||
261 | nrest iterations, the solver performs a Rayleigh-Ritz projection step. | ||
262 | |||
263 | Logically Collective | ||
264 | |||
265 | Input Parameters: | ||
266 | + eps - the eigenproblem solver context | ||
267 | - nrest - the number of iterations between resets | ||
268 | |||
269 | Options Database Key: | ||
270 | . -eps_rqcg_reset - Sets the reset parameter | ||
271 | |||
272 | Level: advanced | ||
273 | |||
274 | .seealso: EPSRQCGGetReset() | ||
275 | @*/ | ||
276 | 20 | PetscErrorCode EPSRQCGSetReset(EPS eps,PetscInt nrest) | |
277 | { | ||
278 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
20 | PetscFunctionBegin; |
279 |
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); |
280 |
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); |
281 |
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)); |
282 |
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); |
283 | } | ||
284 | |||
285 | 10 | static PetscErrorCode EPSRQCGGetReset_RQCG(EPS eps,PetscInt *nrest) | |
286 | { | ||
287 | 10 | EPS_RQCG *ctx = (EPS_RQCG*)eps->data; | |
288 | |||
289 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
10 | PetscFunctionBegin; |
290 | 10 | *nrest = ctx->nrest; | |
291 |
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); |
292 | } | ||
293 | |||
294 | /*@ | ||
295 | EPSRQCGGetReset - Gets the reset parameter used in the RQCG method. | ||
296 | |||
297 | Not Collective | ||
298 | |||
299 | Input Parameter: | ||
300 | . eps - the eigenproblem solver context | ||
301 | |||
302 | Output Parameter: | ||
303 | . nrest - the reset parameter | ||
304 | |||
305 | Level: advanced | ||
306 | |||
307 | .seealso: EPSRQCGSetReset() | ||
308 | @*/ | ||
309 | 10 | PetscErrorCode EPSRQCGGetReset(EPS eps,PetscInt *nrest) | |
310 | { | ||
311 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
10 | PetscFunctionBegin; |
312 |
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); |
313 |
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); |
314 |
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)); |
315 |
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); |
316 | } | ||
317 | |||
318 | 119 | static PetscErrorCode EPSReset_RQCG(EPS eps) | |
319 | { | ||
320 | 119 | EPS_RQCG *ctx = (EPS_RQCG*)eps->data; | |
321 | |||
322 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
119 | PetscFunctionBegin; |
323 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
119 | PetscCall(BVDestroy(&ctx->AV)); |
324 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
119 | PetscCall(BVDestroy(&ctx->W)); |
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.
|
119 | PetscCall(BVDestroy(&ctx->P)); |
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->G)); |
327 | 119 | ctx->allocsize = 0; | |
328 |
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); |
329 | } | ||
330 | |||
331 | 109 | static PetscErrorCode EPSSetFromOptions_RQCG(EPS eps,PetscOptionItems PetscOptionsObject) | |
332 | { | ||
333 | 109 | PetscBool flg; | |
334 | 109 | PetscInt nrest; | |
335 | |||
336 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
109 | PetscFunctionBegin; |
337 |
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"); |
338 | |||
339 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
109 | PetscCall(PetscOptionsInt("-eps_rqcg_reset","Reset parameter","EPSRQCGSetReset",20,&nrest,&flg)); |
340 |
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)); |
341 | |||
342 |
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(); |
343 |
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); |
344 | } | ||
345 | |||
346 | 119 | static PetscErrorCode EPSDestroy_RQCG(EPS eps) | |
347 | { | ||
348 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
119 | PetscFunctionBegin; |
349 |
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)); |
350 |
4/6✓ Branch 0 taken 2 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)); |
351 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
119 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSRQCGGetReset_C",NULL)); |
352 |
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); |
353 | } | ||
354 | |||
355 | 10 | static PetscErrorCode EPSView_RQCG(EPS eps,PetscViewer viewer) | |
356 | { | ||
357 | 10 | EPS_RQCG *ctx = (EPS_RQCG*)eps->data; | |
358 | 10 | PetscBool isascii; | |
359 | |||
360 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
10 | PetscFunctionBegin; |
361 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii)); |
362 |
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)); |
363 |
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); |
364 | } | ||
365 | |||
366 | 119 | SLEPC_EXTERN PetscErrorCode EPSCreate_RQCG(EPS eps) | |
367 | { | ||
368 | 119 | EPS_RQCG *rqcg; | |
369 | |||
370 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
119 | PetscFunctionBegin; |
371 |
4/6✓ Branch 0 taken 2 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)); |
372 | 119 | eps->data = (void*)rqcg; | |
373 | |||
374 | 119 | eps->useds = PETSC_TRUE; | |
375 | 119 | eps->categ = EPS_CATEGORY_PRECOND; | |
376 | |||
377 | 119 | eps->ops->solve = EPSSolve_RQCG; | |
378 | 119 | eps->ops->setup = EPSSetUp_RQCG; | |
379 | 119 | eps->ops->setupsort = EPSSetUpSort_Default; | |
380 | 119 | eps->ops->setfromoptions = EPSSetFromOptions_RQCG; | |
381 | 119 | eps->ops->destroy = EPSDestroy_RQCG; | |
382 | 119 | eps->ops->reset = EPSReset_RQCG; | |
383 | 119 | eps->ops->view = EPSView_RQCG; | |
384 | 119 | eps->ops->backtransform = EPSBackTransform_Default; | |
385 | 119 | eps->ops->setdefaultst = EPSSetDefaultST_GMRES; | |
386 | |||
387 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
119 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSRQCGSetReset_C",EPSRQCGSetReset_RQCG)); |
388 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
119 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSRQCGGetReset_C",EPSRQCGGetReset_RQCG)); |
389 |
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); |
390 | } | ||
391 |