GCC Code Coverage Report


Directory: ./
File: src/eps/impls/external/primme/primme.c
Date: 2025-10-04 04:19:13
Exec Total Coverage
Lines: 291 318 91.5%
Functions: 21 22 95.5%
Branches: 531 1095 48.5%

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 This file implements a wrapper to the PRIMME package
12 */
13
14 #include <slepc/private/epsimpl.h> /*I "slepceps.h" I*/
15
16 #include <primme.h>
17
18 #if defined(PETSC_USE_COMPLEX)
19 #if defined(PETSC_USE_REAL_SINGLE)
20 #define PRIMME_DRIVER cprimme
21 #else
22 #define PRIMME_DRIVER zprimme
23 #endif
24 #else
25 #if defined(PETSC_USE_REAL_SINGLE)
26 #define PRIMME_DRIVER sprimme
27 #else
28 #define PRIMME_DRIVER dprimme
29 #endif
30 #endif
31
32 #if defined(PRIMME_VERSION_MAJOR) && PRIMME_VERSION_MAJOR*100+PRIMME_VERSION_MINOR >= 202
33 #define SLEPC_HAVE_PRIMME2p2
34 #endif
35
36 typedef struct {
37 primme_params primme; /* param struct */
38 PetscInt bs; /* block size */
39 primme_preset_method method; /* primme method */
40 Mat A,B; /* problem matrices */
41 KSP ksp; /* linear solver and preconditioner */
42 Vec x,y; /* auxiliary vectors */
43 double target; /* a copy of eps's target */
44 } EPS_PRIMME;
45
46 5190 static void par_GlobalSumReal(void *sendBuf,void *recvBuf,int *count,primme_params *primme,int *ierr)
47 {
48
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
5190 if (sendBuf == recvBuf) {
49
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
10380 *ierr = MPI_Allreduce(MPI_IN_PLACE,recvBuf,*count,MPIU_REAL,MPIU_SUM,PetscObjectComm((PetscObject)primme->commInfo));
50 } else {
51 *ierr = MPI_Allreduce(sendBuf,recvBuf,*count,MPIU_REAL,MPIU_SUM,PetscObjectComm((PetscObject)primme->commInfo));
52 }
53 5190 }
54
55 #if defined(SLEPC_HAVE_PRIMME3)
56 13746 static void par_broadcastReal(void *buf,int *count,primme_params *primme,int *ierr)
57 {
58
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
13746 *ierr = MPI_Bcast(buf,*count,MPIU_REAL,0/*root*/,PetscObjectComm((PetscObject)primme->commInfo));
59 13746 }
60 #endif
61
62 #if defined(SLEPC_HAVE_PRIMME2p2)
63 55799 static void convTestFun(double *eval,void *evec,double *resNorm,int *isconv,primme_params *primme,int *err)
64 {
65 55799 PetscErrorCode ierr;
66 55799 EPS eps = (EPS)primme->commInfo;
67
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
55799 PetscScalar eigvr = eval?*eval:0.0;
68
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
55799 PetscReal r = resNorm?*resNorm:HUGE_VAL,errest;
69
70 55799 ierr = (*eps->converged)(eps,eigvr,0.0,r,&errest,eps->convergedctx);
71
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
55799 if (ierr) *err = 1;
72 else {
73 55799 *isconv = (errest<=eps->tol?1:0);
74 55799 *err = 0;
75 }
76 55799 }
77
78 50700 static void monitorFun(void *basisEvals,int *basisSize,int *basisFlags,int *iblock,int *blockSize,void *basisNorms,int *numConverged,void *lockedEvals,int *numLocked,int *lockedFlags,void *lockedNorms,int *inner_its,void *LSRes,
79 #if defined(SLEPC_HAVE_PRIMME3)
80 const char *msg,double *time,
81 #endif
82 primme_event *event,struct primme_params *primme,int *err)
83 {
84 50700 PetscErrorCode ierr = PETSC_SUCCESS;
85 50700 EPS eps = (EPS)primme->commInfo;
86 50700 PetscInt i,k,nerrest;
87
88
2/3
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
50700 switch (*event) {
89 5195 case primme_event_outer_iteration:
90 /* Update EPS */
91
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5195 PetscCallVoid(PetscIntCast(primme->stats.numOuterIterations,&eps->its));
92 5195 eps->nconv = primme->initSize;
93 5195 k=0;
94
4/6
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
9210 if (lockedEvals && numLocked) for (i=0; i<*numLocked && k<eps->ncv; i++) eps->eigr[k++] = ((PetscReal*)lockedEvals)[i];
95 5195 nerrest = k;
96
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
5195 if (iblock && blockSize) {
97
3/4
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
13617 for (i=0; i<*blockSize && k+iblock[i]<eps->ncv; i++) eps->errest[k+iblock[i]] = ((PetscReal*)basisNorms)[i];
98
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
5195 nerrest = k+(*blockSize>0?1+iblock[*blockSize-1]:0);
99 }
100
4/6
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
114338 if (basisEvals && basisSize) for (i=0; i<*basisSize && k<eps->ncv; i++) eps->eigr[k++] = ((PetscReal*)basisEvals)[i];
101 /* Show progress */
102
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
5195 ierr = EPSMonitor(eps,eps->its,numConverged?*numConverged:0,eps->eigr,eps->eigi,eps->errest,nerrest);
103 5195 break;
104 #if defined(SLEPC_HAVE_PRIMME3)
105 case primme_event_message:
106 /* Print PRIMME information messages */
107 ierr = PetscInfo(eps,"%s\n",msg);
108 break;
109 #endif
110 default:
111 break;
112 }
113 50700 *err = (ierr!=0)? 1: 0;
114 }
115 #endif /* SLEPC_HAVE_PRIMME2p2 */
116
117 46588 static void matrixMatvec_PRIMME(void *xa,PRIMME_INT *ldx,void *ya,PRIMME_INT *ldy,int *blockSize,struct primme_params *primme,int *ierr)
118 {
119 46588 PetscInt i;
120 46588 EPS_PRIMME *ops = (EPS_PRIMME*)primme->matrix;
121 46588 Vec x = ops->x,y = ops->y;
122 46588 Mat A = ops->A;
123
124
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
46588 PetscFunctionBegin;
125
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
105205 for (i=0;i<*blockSize;i++) {
126
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
58617 PetscCallAbort(PetscObjectComm((PetscObject)A),VecPlaceArray(x,(PetscScalar*)xa+(*ldx)*i));
127
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
58617 PetscCallAbort(PetscObjectComm((PetscObject)A),VecPlaceArray(y,(PetscScalar*)ya+(*ldy)*i));
128
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
58617 PetscCallAbort(PetscObjectComm((PetscObject)A),MatMult(A,x,y));
129
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
58617 PetscCallAbort(PetscObjectComm((PetscObject)A),VecResetArray(x));
130
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
58617 PetscCallAbort(PetscObjectComm((PetscObject)A),VecResetArray(y));
131 }
132
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.
46588 PetscFunctionReturnVoid();
133 }
134
135 #if defined(SLEPC_HAVE_PRIMME3)
136 55217 static void massMatrixMatvec_PRIMME(void *xa,PRIMME_INT *ldx,void *ya,PRIMME_INT *ldy,int *blockSize,struct primme_params *primme,int *ierr)
137 {
138 55217 PetscInt i;
139 55217 EPS_PRIMME *ops = (EPS_PRIMME*)primme->massMatrix;
140 55217 Vec x = ops->x,y = ops->y;
141 55217 Mat B = ops->B;
142
143
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
55217 PetscFunctionBegin;
144
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
110434 for (i=0;i<*blockSize;i++) {
145
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
55217 PetscCallAbort(PetscObjectComm((PetscObject)B),VecPlaceArray(x,(PetscScalar*)xa+(*ldx)*i));
146
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
55217 PetscCallAbort(PetscObjectComm((PetscObject)B),VecPlaceArray(y,(PetscScalar*)ya+(*ldy)*i));
147
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
55217 PetscCallAbort(PetscObjectComm((PetscObject)B),MatMult(B,x,y));
148
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
55217 PetscCallAbort(PetscObjectComm((PetscObject)B),VecResetArray(x));
149
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
55217 PetscCallAbort(PetscObjectComm((PetscObject)B),VecResetArray(y));
150 }
151
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.
55217 PetscFunctionReturnVoid();
152 }
153 #endif
154
155 42521 static void applyPreconditioner_PRIMME(void *xa,PRIMME_INT *ldx,void *ya,PRIMME_INT *ldy,int *blockSize,struct primme_params *primme,int *ierr)
156 {
157 42521 PetscInt i;
158 42521 EPS_PRIMME *ops = (EPS_PRIMME*)primme->matrix;
159 42521 Vec x = ops->x,y = ops->y;
160
161
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
42521 PetscFunctionBegin;
162
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
96009 for (i=0;i<*blockSize;i++) {
163
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
53488 PetscCallAbort(PetscObjectComm((PetscObject)ops->ksp),VecPlaceArray(x,(PetscScalar*)xa+(*ldx)*i));
164
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
53488 PetscCallAbort(PetscObjectComm((PetscObject)ops->ksp),VecPlaceArray(y,(PetscScalar*)ya+(*ldy)*i));
165
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
53488 PetscCallAbort(PetscObjectComm((PetscObject)ops->ksp),KSPSolve(ops->ksp,x,y));
166
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
53488 PetscCallAbort(PetscObjectComm((PetscObject)ops->ksp),VecResetArray(x));
167
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
53488 PetscCallAbort(PetscObjectComm((PetscObject)ops->ksp),VecResetArray(y));
168 }
169
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.
42521 PetscFunctionReturnVoid();
170 }
171
172 60 static PetscErrorCode EPSSetUp_PRIMME(EPS eps)
173 {
174 60 PetscMPIInt numProcs,procID;
175 60 EPS_PRIMME *ops = (EPS_PRIMME*)eps->data;
176 60 primme_params *primme = &ops->primme;
177 60 PetscBool flg;
178
179
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
60 PetscFunctionBegin;
180
4/10
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
60 EPSCheckHermitianDefinite(eps);
181
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
60 EPSCheckNotStructured(eps);
182
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
60 if (eps->nev==0) eps->nev = 1;
183
14/28
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 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.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
60 PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)eps),&numProcs));
184
14/28
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 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.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
60 PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)eps),&procID));
185
186 /* Check some constraints and set some default values */
187
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
60 if (eps->max_it==PETSC_DETERMINE) eps->max_it = PETSC_INT_MAX;
188
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
60 PetscCall(STGetMatrix(eps->st,0,&ops->A));
189
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
60 if (eps->isgeneralized) {
190 #if defined(SLEPC_HAVE_PRIMME3)
191
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6 PetscCall(STGetMatrix(eps->st,1,&ops->B));
192 #else
193 SETERRQ(PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"This version of PRIMME is not available for generalized problems");
194 #endif
195 }
196
8/18
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 4 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 6 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
60 EPSCheckUnsupported(eps,EPS_FEATURE_ARBITRARY | EPS_FEATURE_REGION | EPS_FEATURE_STOPPING);
197
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
60 EPSCheckIgnored(eps,EPS_FEATURE_BALANCE);
198
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
60 if (!eps->which) eps->which = EPS_LARGEST_REAL;
199 #if !defined(SLEPC_HAVE_PRIMME2p2)
200 if (eps->converged != EPSConvergedAbsolute) PetscCall(PetscInfo(eps,"Warning: using absolute convergence test\n"));
201 #else
202
6/8
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
60 EPSCheckIgnored(eps,EPS_FEATURE_CONVERGENCE);
203 #endif
204
205 /* Transfer SLEPc options to PRIMME options */
206 60 primme_free(primme);
207 60 primme_initialize(primme);
208 60 primme->n = (PRIMME_INT)eps->n;
209 60 primme->nLocal = (PRIMME_INT)eps->nloc;
210 60 primme->numEvals = (int)eps->nev;
211 60 primme->matrix = ops;
212 60 primme->matrixMatvec = matrixMatvec_PRIMME;
213 #if defined(SLEPC_HAVE_PRIMME3)
214
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
60 if (eps->isgeneralized) {
215 6 primme->massMatrix = ops;
216 6 primme->massMatrixMatvec = massMatrixMatvec_PRIMME;
217 }
218 #endif
219 60 primme->commInfo = eps;
220 60 primme->maxOuterIterations = (PRIMME_INT)eps->max_it;
221 #if !defined(SLEPC_HAVE_PRIMME2p2)
222 primme->eps = SlepcDefaultTol(eps->tol);
223 #endif
224 60 primme->numProcs = numProcs;
225 60 primme->procID = procID;
226 60 primme->printLevel = 1;
227 60 primme->correctionParams.precondition = 1;
228 60 primme->globalSumReal = par_GlobalSumReal;
229 #if defined(SLEPC_HAVE_PRIMME3)
230 60 primme->broadcastReal = par_broadcastReal;
231 #endif
232 #if defined(SLEPC_HAVE_PRIMME2p2)
233 60 primme->convTestFun = convTestFun;
234 60 primme->monitorFun = monitorFun;
235 #endif
236
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
60 if (ops->bs > 0) primme->maxBlockSize = (int)ops->bs;
237
238
5/6
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
60 switch (eps->which) {
239 18 case EPS_LARGEST_REAL:
240 18 primme->target = primme_largest;
241 18 break;
242 12 case EPS_SMALLEST_REAL:
243 12 primme->target = primme_smallest;
244 12 break;
245 6 case EPS_LARGEST_MAGNITUDE:
246 6 primme->target = primme_largest_abs;
247 6 ops->target = 0.0;
248 6 primme->numTargetShifts = 1;
249 6 primme->targetShifts = &ops->target;
250 6 break;
251 6 case EPS_SMALLEST_MAGNITUDE:
252 6 primme->target = primme_closest_abs;
253 6 ops->target = 0.0;
254 6 primme->numTargetShifts = 1;
255 6 primme->targetShifts = &ops->target;
256 6 break;
257 18 case EPS_TARGET_MAGNITUDE:
258 case EPS_TARGET_REAL:
259 18 primme->target = primme_closest_abs;
260 18 primme->numTargetShifts = 1;
261 18 ops->target = PetscRealPart(eps->target);
262 18 primme->targetShifts = &ops->target;
263 18 break;
264 default:
265 SETERRQ(PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"'which' value not supported by PRIMME");
266 }
267
268
3/4
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
60 switch (eps->extraction) {
269 42 case EPS_RITZ:
270 42 primme->projectionParams.projection = primme_proj_RR;
271 42 break;
272 6 case EPS_HARMONIC:
273 6 primme->projectionParams.projection = primme_proj_harmonic;
274 6 break;
275 12 case EPS_REFINED:
276 12 primme->projectionParams.projection = primme_proj_refined;
277 12 break;
278 default:
279 SETERRQ(PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"'extraction' value not supported by PRIMME");
280 }
281
282 /* If user sets mpd or ncv, maxBasisSize is modified */
283
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
60 if (eps->mpd!=PETSC_DETERMINE) {
284 6 primme->maxBasisSize = (int)eps->mpd;
285
5/8
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
6 if (eps->ncv!=PETSC_DETERMINE) PetscCall(PetscInfo(eps,"Warning: 'ncv' is ignored by PRIMME\n"));
286
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
54 } else if (eps->ncv!=PETSC_DETERMINE) primme->maxBasisSize = (int)eps->ncv;
287
288
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
60 PetscCheck(primme_set_method(ops->method,primme)>=0,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"PRIMME method not valid");
289
290 60 eps->mpd = (PetscInt)primme->maxBasisSize;
291
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
60 eps->ncv = (PetscInt)(primme->locking?eps->nev:0)+primme->maxBasisSize;
292 60 ops->bs = (PetscInt)primme->maxBlockSize;
293
294 /* Set workspace */
295
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
60 PetscCall(EPSAllocateSolution(eps,0));
296
297 /* Setup the preconditioner */
298
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
60 if (primme->correctionParams.precondition) {
299
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
60 PetscCall(STGetKSP(eps->st,&ops->ksp));
300
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
60 PetscCall(PetscObjectTypeCompare((PetscObject)ops->ksp,KSPPREONLY,&flg));
301
6/8
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
60 if (!flg) PetscCall(PetscInfo(eps,"Warning: ignoring KSP, should use KSPPREONLY\n"));
302 60 primme->preconditioner = NULL;
303 60 primme->applyPreconditioner = applyPreconditioner_PRIMME;
304 }
305
306 /* Prepare auxiliary vectors */
307
6/8
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
60 if (!ops->x) PetscCall(MatCreateVecsEmpty(ops->A,&ops->x,&ops->y));
308
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);
309 }
310
311 60 static PetscErrorCode EPSSolve_PRIMME(EPS eps)
312 {
313 60 EPS_PRIMME *ops = (EPS_PRIMME*)eps->data;
314 60 PetscScalar *a;
315 60 PetscInt i,ld,ierrprimme;
316 60 PetscReal *evals,*rnorms;
317
318
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
60 PetscFunctionBegin;
319 /* Reset some parameters left from previous runs */
320 #if defined(SLEPC_HAVE_PRIMME2p2)
321 60 ops->primme.aNorm = 0.0;
322 #else
323 /* Force PRIMME to stop by absolute error */
324 ops->primme.aNorm = 1.0;
325 #endif
326 60 ops->primme.initSize = (int)eps->nini;
327 60 ops->primme.iseed[0] = -1;
328 60 ops->primme.iseed[1] = -1;
329 60 ops->primme.iseed[2] = -1;
330 60 ops->primme.iseed[3] = -1;
331
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
60 PetscCall(BVGetLeadingDimension(eps->V,&ld));
332 60 ops->primme.ldevecs = (PRIMME_INT)ld;
333
334 /* Call PRIMME solver */
335
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
60 PetscCall(BVGetArray(eps->V,&a));
336
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
60 PetscCall(PetscMalloc2(eps->ncv,&evals,eps->ncv,&rnorms));
337 60 ierrprimme = PRIMME_DRIVER(evals,a,rnorms,&ops->primme);
338
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
1602 for (i=0;i<eps->ncv;i++) eps->eigr[i] = evals[i];
339
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
1542 for (i=0;i<eps->ncv;i++) eps->errest[i] = rnorms[i];
340
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
60 PetscCall(PetscFree2(evals,rnorms));
341
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
60 PetscCall(BVRestoreArray(eps->V,&a));
342
343 60 eps->nconv = ops->primme.initSize >= 0 ? (PetscInt)ops->primme.initSize : 0;
344
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
60 eps->reason = eps->nconv >= eps->nev ? EPS_CONVERGED_TOL: EPS_DIVERGED_ITS;
345
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
60 PetscCall(PetscIntCast(ops->primme.stats.numOuterIterations,&eps->its));
346
347 /* Process PRIMME error code */
348
1/4
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
60 switch (ierrprimme) {
349 case 0: /* no error */
350 break;
351 case -1:
352 SETERRQ(PetscObjectComm((PetscObject)eps),PETSC_ERR_LIB,"PRIMME library failed with error code=%" PetscInt_FMT ": unexpected error",ierrprimme);
353 case -2:
354 SETERRQ(PetscObjectComm((PetscObject)eps),PETSC_ERR_LIB,"PRIMME library failed with error code=%" PetscInt_FMT ": allocation error",ierrprimme);
355 case -3: /* stop due to maximum number of iterations or matvecs */
356 break;
357 default:
358 PetscCheck(ierrprimme<-39,PetscObjectComm((PetscObject)eps),PETSC_ERR_LIB,"PRIMME library failed with error code=%" PetscInt_FMT ": configuration error; check PRIMME's manual",ierrprimme);
359 PetscCheck(ierrprimme>=-39,PetscObjectComm((PetscObject)eps),PETSC_ERR_LIB,"PRIMME library failed with error code=%" PetscInt_FMT ": runtime error; check PRIMME's manual",ierrprimme);
360 }
361
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);
362 }
363
364 54 static PetscErrorCode EPSReset_PRIMME(EPS eps)
365 {
366 54 EPS_PRIMME *ops = (EPS_PRIMME*)eps->data;
367
368
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
54 PetscFunctionBegin;
369 54 primme_free(&ops->primme);
370
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54 PetscCall(VecDestroy(&ops->x));
371
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54 PetscCall(VecDestroy(&ops->y));
372
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
18 PetscFunctionReturn(PETSC_SUCCESS);
373 }
374
375 54 static PetscErrorCode EPSDestroy_PRIMME(EPS eps)
376 {
377
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
54 PetscFunctionBegin;
378
5/8
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
54 PetscCall(PetscFree(eps->data));
379
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54 PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSPRIMMESetBlockSize_C",NULL));
380
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54 PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSPRIMMESetMethod_C",NULL));
381
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54 PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSPRIMMEGetBlockSize_C",NULL));
382
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54 PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSPRIMMEGetMethod_C",NULL));
383
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
18 PetscFunctionReturn(PETSC_SUCCESS);
384 }
385
386 static PetscErrorCode EPSView_PRIMME(EPS eps,PetscViewer viewer)
387 {
388 PetscBool isascii;
389 EPS_PRIMME *ctx = (EPS_PRIMME*)eps->data;
390 PetscMPIInt rank;
391
392 PetscFunctionBegin;
393 PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii));
394 if (isascii) {
395 PetscCall(PetscViewerASCIIPrintf(viewer," block size=%" PetscInt_FMT "\n",ctx->bs));
396 PetscCall(PetscViewerASCIIPrintf(viewer," solver method: %s\n",EPSPRIMMEMethods[(EPSPRIMMEMethod)ctx->method]));
397
398 /* Display PRIMME params */
399 PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)eps),&rank));
400 if (!rank) primme_display_params(ctx->primme);
401 }
402 PetscFunctionReturn(PETSC_SUCCESS);
403 }
404
405 48 static PetscErrorCode EPSSetFromOptions_PRIMME(EPS eps,PetscOptionItems PetscOptionsObject)
406 {
407 48 EPS_PRIMME *ctx = (EPS_PRIMME*)eps->data;
408 48 PetscInt bs;
409 48 EPSPRIMMEMethod meth;
410 48 PetscBool flg;
411
412
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
48 PetscFunctionBegin;
413
1/12
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
48 PetscOptionsHeadBegin(PetscOptionsObject,"EPS PRIMME Options");
414
415
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
48 PetscCall(PetscOptionsInt("-eps_primme_blocksize","Maximum block size","EPSPRIMMESetBlockSize",ctx->bs,&bs,&flg));
416
6/8
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
48 if (flg) PetscCall(EPSPRIMMESetBlockSize(eps,bs));
417
418
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
48 PetscCall(PetscOptionsEnum("-eps_primme_method","Method for solving the eigenproblem","EPSPRIMMESetMethod",EPSPRIMMEMethods,(PetscEnum)ctx->method,(PetscEnum*)&meth,&flg));
419
6/8
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
48 if (flg) PetscCall(EPSPRIMMESetMethod(eps,meth));
420
421
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.
48 PetscOptionsHeadEnd();
422
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.
16 PetscFunctionReturn(PETSC_SUCCESS);
423 }
424
425 30 static PetscErrorCode EPSPRIMMESetBlockSize_PRIMME(EPS eps,PetscInt bs)
426 {
427 30 EPS_PRIMME *ops = (EPS_PRIMME*)eps->data;
428
429
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
30 PetscFunctionBegin;
430
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
30 if (bs == PETSC_DEFAULT || bs == PETSC_DECIDE) ops->bs = 0;
431 else {
432
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
30 PetscCheck(bs>0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"PRIMME: block size must be positive");
433 30 ops->bs = bs;
434 }
435
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);
436 }
437
438 /*@
439 EPSPRIMMESetBlockSize - The maximum block size that PRIMME will try to use.
440
441 Logically Collective
442
443 Input Parameters:
444 + eps - the eigenproblem solver context
445 - bs - block size
446
447 Options Database Key:
448 . -eps_primme_blocksize - Sets the max allowed block size value
449
450 Notes:
451 If the block size is not set, the value established by primme_initialize
452 is used.
453
454 The user should set the block size based on the architecture specifics
455 of the target computer, as well as any a priori knowledge of multiplicities.
456 The code does NOT require bs > 1 to find multiple eigenvalues. For some
457 methods, keeping bs = 1 yields the best overall performance.
458
459 Level: advanced
460
461 .seealso: EPSPRIMMEGetBlockSize()
462 @*/
463 30 PetscErrorCode EPSPRIMMESetBlockSize(EPS eps,PetscInt bs)
464 {
465
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
30 PetscFunctionBegin;
466
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.
30 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
467
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.
30 PetscValidLogicalCollectiveInt(eps,bs,2);
468
8/14
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 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.
30 PetscTryMethod(eps,"EPSPRIMMESetBlockSize_C",(EPS,PetscInt),(eps,bs));
469
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.
30 PetscFunctionReturn(PETSC_SUCCESS);
470 }
471
472 24 static PetscErrorCode EPSPRIMMEGetBlockSize_PRIMME(EPS eps,PetscInt *bs)
473 {
474 24 EPS_PRIMME *ops = (EPS_PRIMME*)eps->data;
475
476
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
24 PetscFunctionBegin;
477 24 *bs = ops->bs;
478
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.
24 PetscFunctionReturn(PETSC_SUCCESS);
479 }
480
481 /*@
482 EPSPRIMMEGetBlockSize - Get the maximum block size the code will try to use.
483
484 Not Collective
485
486 Input Parameter:
487 . eps - the eigenproblem solver context
488
489 Output Parameter:
490 . bs - returned block size
491
492 Level: advanced
493
494 .seealso: EPSPRIMMESetBlockSize()
495 @*/
496 24 PetscErrorCode EPSPRIMMEGetBlockSize(EPS eps,PetscInt *bs)
497 {
498
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
24 PetscFunctionBegin;
499
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.
24 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
500
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.
24 PetscAssertPointer(bs,2);
501
9/16
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 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.
24 PetscUseMethod(eps,"EPSPRIMMEGetBlockSize_C",(EPS,PetscInt*),(eps,bs));
502
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.
24 PetscFunctionReturn(PETSC_SUCCESS);
503 }
504
505 30 static PetscErrorCode EPSPRIMMESetMethod_PRIMME(EPS eps,EPSPRIMMEMethod method)
506 {
507 30 EPS_PRIMME *ops = (EPS_PRIMME*)eps->data;
508
509
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
30 PetscFunctionBegin;
510 30 ops->method = (primme_preset_method)method;
511
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.
30 PetscFunctionReturn(PETSC_SUCCESS);
512 }
513
514 /*@
515 EPSPRIMMESetMethod - Sets the method for the PRIMME library.
516
517 Logically Collective
518
519 Input Parameters:
520 + eps - the eigenproblem solver context
521 - method - method that will be used by PRIMME
522
523 Options Database Key:
524 . -eps_primme_method - Sets the method for the PRIMME library
525
526 Note:
527 If not set, the method defaults to EPS_PRIMME_DEFAULT_MIN_TIME.
528
529 Level: advanced
530
531 .seealso: EPSPRIMMEGetMethod(), EPSPRIMMEMethod
532 @*/
533 30 PetscErrorCode EPSPRIMMESetMethod(EPS eps,EPSPRIMMEMethod method)
534 {
535
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
30 PetscFunctionBegin;
536
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.
30 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
537
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.
30 PetscValidLogicalCollectiveEnum(eps,method,2);
538
8/14
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 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.
30 PetscTryMethod(eps,"EPSPRIMMESetMethod_C",(EPS,EPSPRIMMEMethod),(eps,method));
539
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.
30 PetscFunctionReturn(PETSC_SUCCESS);
540 }
541
542 24 static PetscErrorCode EPSPRIMMEGetMethod_PRIMME(EPS eps,EPSPRIMMEMethod *method)
543 {
544 24 EPS_PRIMME *ops = (EPS_PRIMME*)eps->data;
545
546
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
24 PetscFunctionBegin;
547 24 *method = (EPSPRIMMEMethod)ops->method;
548
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.
24 PetscFunctionReturn(PETSC_SUCCESS);
549 }
550
551 /*@
552 EPSPRIMMEGetMethod - Gets the method for the PRIMME library.
553
554 Not Collective
555
556 Input Parameter:
557 . eps - the eigenproblem solver context
558
559 Output Parameter:
560 . method - method that will be used by PRIMME
561
562 Level: advanced
563
564 .seealso: EPSPRIMMESetMethod(), EPSPRIMMEMethod
565 @*/
566 24 PetscErrorCode EPSPRIMMEGetMethod(EPS eps,EPSPRIMMEMethod *method)
567 {
568
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
24 PetscFunctionBegin;
569
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.
24 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
570
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.
24 PetscAssertPointer(method,2);
571
9/16
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 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.
24 PetscUseMethod(eps,"EPSPRIMMEGetMethod_C",(EPS,EPSPRIMMEMethod*),(eps,method));
572
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.
24 PetscFunctionReturn(PETSC_SUCCESS);
573 }
574
575 54 SLEPC_EXTERN PetscErrorCode EPSCreate_PRIMME(EPS eps)
576 {
577 54 EPS_PRIMME *primme;
578
579
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
54 PetscFunctionBegin;
580
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54 PetscCall(PetscNew(&primme));
581 54 eps->data = (void*)primme;
582
583 54 primme_initialize(&primme->primme);
584 54 primme->primme.globalSumReal = par_GlobalSumReal;
585 #if defined(SLEPC_HAVE_PRIMME3)
586 54 primme->primme.broadcastReal = par_broadcastReal;
587 #endif
588 #if defined(SLEPC_HAVE_PRIMME2p2)
589 54 primme->primme.convTestFun = convTestFun;
590 54 primme->primme.monitorFun = monitorFun;
591 #endif
592 54 primme->method = (primme_preset_method)EPS_PRIMME_DEFAULT_MIN_TIME;
593
594 54 eps->categ = EPS_CATEGORY_PRECOND;
595
596 54 eps->ops->solve = EPSSolve_PRIMME;
597 54 eps->ops->setup = EPSSetUp_PRIMME;
598 54 eps->ops->setupsort = EPSSetUpSort_Basic;
599 54 eps->ops->setfromoptions = EPSSetFromOptions_PRIMME;
600 54 eps->ops->destroy = EPSDestroy_PRIMME;
601 54 eps->ops->reset = EPSReset_PRIMME;
602 54 eps->ops->view = EPSView_PRIMME;
603 54 eps->ops->backtransform = EPSBackTransform_Default;
604 54 eps->ops->setdefaultst = EPSSetDefaultST_GMRES;
605
606
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54 PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSPRIMMESetBlockSize_C",EPSPRIMMESetBlockSize_PRIMME));
607
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54 PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSPRIMMESetMethod_C",EPSPRIMMESetMethod_PRIMME));
608
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54 PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSPRIMMEGetBlockSize_C",EPSPRIMMEGetBlockSize_PRIMME));
609
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54 PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSPRIMMEGetMethod_C",EPSPRIMMEGetMethod_PRIMME));
610
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
18 PetscFunctionReturn(PETSC_SUCCESS);
611 }
612