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 ARPACK package | ||
12 | */ | ||
13 | |||
14 | #include <slepc/private/epsimpl.h> | ||
15 | #include "arpack.h" | ||
16 | |||
17 | 38 | static PetscErrorCode EPSSetUp_ARPACK(EPS eps) | |
18 | { | ||
19 | 38 | PetscInt ncv; | |
20 | 38 | EPS_ARPACK *ar = (EPS_ARPACK*)eps->data; | |
21 | |||
22 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
38 | PetscFunctionBegin; |
23 |
3/8✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
38 | EPSCheckDefinite(eps); |
24 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
38 | EPSCheckNotStructured(eps); |
25 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
|
38 | if (eps->nev==0) eps->nev = 1; |
26 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
38 | if (eps->ncv!=PETSC_DETERMINE) { |
27 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
15 | PetscCheck(eps->ncv>=eps->nev+2,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The value of ncv must be at least nev+2"); |
28 |
3/4✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 3 times.
|
23 | } else eps->ncv = PetscMin(PetscMax(20,2*eps->nev+1),eps->n); /* set default value of ncv */ |
29 |
1/8✗ Branch 0 not taken.
✓ Branch 1 taken 5 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.
|
38 | if (eps->mpd!=PETSC_DETERMINE) PetscCall(PetscInfo(eps,"Warning: parameter mpd ignored\n")); |
30 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
38 | if (eps->max_it==PETSC_DETERMINE) eps->max_it = PetscMax(300,(PetscInt)(2*eps->n/eps->ncv)); |
31 |
6/8✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
38 | if (!eps->which) PetscCall(EPSSetWhichEigenpairs_Default(eps)); |
32 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
38 | PetscCheck(eps->which!=EPS_ALL,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"This solver does not support computing all eigenvalues"); |
33 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
38 | PetscCheck(eps->which!=EPS_WHICH_USER,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"This solver does not support user-defined ordering of eigenvalues"); |
34 |
11/30✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 3 times.
✓ Branch 10 taken 2 times.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 5 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 5 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 5 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
|
38 | EPSCheckUnsupported(eps,EPS_FEATURE_BALANCE | EPS_FEATURE_ARBITRARY | EPS_FEATURE_REGION | EPS_FEATURE_CONVERGENCE | EPS_FEATURE_STOPPING | EPS_FEATURE_TWOSIDED); |
35 |
1/8✗ Branch 0 not taken.
✓ Branch 1 taken 5 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.
|
38 | EPSCheckIgnored(eps,EPS_FEATURE_EXTRACTION); |
36 | |||
37 | 38 | ncv = eps->ncv; | |
38 | #if defined(PETSC_USE_COMPLEX) | ||
39 |
5/8✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
|
14 | PetscCall(PetscFree(ar->rwork)); |
40 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
14 | PetscCall(PetscMalloc1(ncv,&ar->rwork)); |
41 | 14 | ar->lworkl = 3*ncv*ncv+5*ncv; | |
42 |
5/8✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
|
14 | PetscCall(PetscFree(ar->workev)); |
43 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
14 | PetscCall(PetscMalloc1(3*ncv,&ar->workev)); |
44 | #else | ||
45 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
|
24 | if (eps->ishermitian) { |
46 | 18 | ar->lworkl = ncv*(ncv+8); | |
47 | } else { | ||
48 | 6 | ar->lworkl = 3*ncv*ncv+6*ncv; | |
49 |
5/8✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
|
6 | PetscCall(PetscFree(ar->workev)); |
50 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
6 | PetscCall(PetscMalloc1(3*ncv,&ar->workev)); |
51 | } | ||
52 | #endif | ||
53 |
5/8✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
38 | PetscCall(PetscFree(ar->workl)); |
54 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
38 | PetscCall(PetscMalloc1(ar->lworkl,&ar->workl)); |
55 |
5/8✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
38 | PetscCall(PetscFree(ar->select)); |
56 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
38 | PetscCall(PetscMalloc1(ncv,&ar->select)); |
57 |
5/8✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
38 | PetscCall(PetscFree(ar->workd)); |
58 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
38 | PetscCall(PetscMalloc1(3*eps->nloc,&ar->workd)); |
59 | |||
60 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
38 | PetscCall(EPSAllocateSolution(eps,0)); |
61 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
38 | PetscCall(EPS_SetInnerProduct(eps)); |
62 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
38 | PetscCall(EPSSetWorkVecs(eps,2)); |
63 |
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.
|
15 | PetscFunctionReturn(PETSC_SUCCESS); |
64 | } | ||
65 | |||
66 | 38 | static PetscErrorCode EPSSolve_ARPACK(EPS eps) | |
67 | { | ||
68 | 38 | EPS_ARPACK *ar = (EPS_ARPACK*)eps->data; | |
69 | 38 | char bmat[1],howmny[] = "A"; | |
70 | 38 | const char *which; | |
71 | 38 | PetscInt n,ld,iparam[11],ipntr[14],ido,info,nev,ncv,rvec; | |
72 | #if !defined(PETSC_HAVE_MPIUNI) && !defined(PETSC_HAVE_MSMPI) | ||
73 | 38 | MPI_Fint fcomm; | |
74 | #endif | ||
75 | 38 | PetscScalar sigmar,*pV,*resid; | |
76 | 38 | Vec x,y,w = eps->work[0]; | |
77 | 38 | Mat A; | |
78 | 38 | PetscBool isSinv,isShift; | |
79 | #if !defined(PETSC_USE_COMPLEX) | ||
80 | 24 | PetscScalar sigmai = 0.0; | |
81 | #endif | ||
82 | |||
83 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
38 | PetscFunctionBegin; |
84 | 38 | nev = eps->nev; | |
85 | 38 | ncv = eps->ncv; | |
86 | #if !defined(PETSC_HAVE_MPIUNI) && !defined(PETSC_HAVE_MSMPI) | ||
87 | 38 | fcomm = MPI_Comm_c2f(PetscObjectComm((PetscObject)eps)); | |
88 | #endif | ||
89 | 38 | n = eps->nloc; | |
90 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
38 | PetscCall(EPSGetStartVector(eps,0,NULL)); |
91 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
38 | PetscCall(BVSetActiveColumns(eps->V,0,0)); /* just for deflation space */ |
92 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
38 | PetscCall(BVCopyVec(eps->V,0,eps->work[1])); |
93 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
38 | PetscCall(BVGetLeadingDimension(eps->V,&ld)); |
94 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
38 | PetscCall(BVGetArray(eps->V,&pV)); |
95 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
38 | PetscCall(VecGetArray(eps->work[1],&resid)); |
96 | |||
97 | 38 | ido = 0; /* first call to reverse communication interface */ | |
98 | 38 | info = 1; /* indicates an initial vector is provided */ | |
99 | 38 | iparam[0] = 1; /* use exact shifts */ | |
100 | 38 | iparam[2] = eps->max_it; /* max Arnoldi iterations */ | |
101 | 38 | iparam[3] = 1; /* blocksize */ | |
102 | 38 | iparam[4] = 0; /* number of converged Ritz values */ | |
103 | |||
104 | /* | ||
105 | Computational modes ([]=not supported): | ||
106 | symmetric non-symmetric complex | ||
107 | 1 1 'I' 1 'I' 1 'I' | ||
108 | 2 3 'I' 3 'I' 3 'I' | ||
109 | 3 2 'G' 2 'G' 2 'G' | ||
110 | 4 3 'G' 3 'G' 3 'G' | ||
111 | 5 [ 4 'G' ] [ 3 'G' ] | ||
112 | 6 [ 5 'G' ] [ 4 'G' ] | ||
113 | */ | ||
114 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
38 | PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STSINVERT,&isSinv)); |
115 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
38 | PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STSHIFT,&isShift)); |
116 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
38 | PetscCall(STGetShift(eps->st,&sigmar)); |
117 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
38 | PetscCall(STGetMatrix(eps->st,0,&A)); |
118 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
38 | PetscCall(MatCreateVecsEmpty(A,&x,&y)); |
119 | |||
120 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
38 | if (isSinv) { |
121 | /* shift-and-invert mode */ | ||
122 | 5 | iparam[6] = 3; | |
123 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
|
5 | if (eps->ispositive) bmat[0] = 'G'; |
124 | 5 | else bmat[0] = 'I'; | |
125 |
3/4✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
|
33 | } else if (isShift && eps->ispositive) { |
126 | /* generalized shift mode with B positive definite */ | ||
127 | 5 | iparam[6] = 2; | |
128 | 5 | bmat[0] = 'G'; | |
129 | } else { | ||
130 | /* regular mode */ | ||
131 |
2/6✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
28 | PetscCheck(!eps->ishermitian || !eps->isgeneralized,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Spectral transformation not supported by ARPACK hermitian solver"); |
132 | 28 | iparam[6] = 1; | |
133 | 28 | bmat[0] = 'I'; | |
134 | } | ||
135 | |||
136 | #if !defined(PETSC_USE_COMPLEX) | ||
137 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
|
24 | if (eps->ishermitian) { |
138 |
2/5✗ Branch 0 not taken.
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
|
18 | switch (eps->which) { |
139 | case EPS_TARGET_MAGNITUDE: | ||
140 | 24 | case EPS_LARGEST_MAGNITUDE: which = "LM"; break; | |
141 | ✗ | case EPS_SMALLEST_MAGNITUDE: which = "SM"; break; | |
142 | ✗ | case EPS_TARGET_REAL: | |
143 | ✗ | case EPS_LARGEST_REAL: which = "LA"; break; | |
144 | 6 | case EPS_SMALLEST_REAL: which = "SA"; break; | |
145 | ✗ | default: SETERRQ(PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONG,"Wrong value of eps->which"); | |
146 | } | ||
147 | } else { | ||
148 | #endif | ||
149 |
3/7✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 5 times.
|
20 | switch (eps->which) { |
150 | case EPS_TARGET_MAGNITUDE: | ||
151 | 14 | case EPS_LARGEST_MAGNITUDE: which = "LM"; break; | |
152 | ✗ | case EPS_SMALLEST_MAGNITUDE: which = "SM"; break; | |
153 | 3 | case EPS_TARGET_REAL: | |
154 | 3 | case EPS_LARGEST_REAL: which = "LR"; break; | |
155 | 4 | case EPS_SMALLEST_REAL: which = "SR"; break; | |
156 | ✗ | case EPS_TARGET_IMAGINARY: | |
157 | ✗ | case EPS_LARGEST_IMAGINARY: which = "LI"; break; | |
158 | ✗ | case EPS_SMALLEST_IMAGINARY: which = "SI"; break; | |
159 | ✗ | default: SETERRQ(PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONG,"Wrong value of eps->which"); | |
160 | } | ||
161 | #if !defined(PETSC_USE_COMPLEX) | ||
162 | } | ||
163 | #endif | ||
164 | |||
165 | 7163 | do { | |
166 | |||
167 | #if !defined(PETSC_USE_COMPLEX) | ||
168 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
|
4403 | if (eps->ishermitian) { |
169 |
10/20✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
2024 | PetscStackCallExternalVoid("ARPACKsaupd",ARPACKsaupd_(&fcomm,&ido,bmat,&n,which,&nev,&eps->tol,resid,&ncv,pV,&ld,iparam,ipntr,ar->workd,ar->workl,&ar->lworkl,&info)); |
170 | } else { | ||
171 |
10/20✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
2379 | PetscStackCallExternalVoid("ARPACKnaupd",ARPACKnaupd_(&fcomm,&ido,bmat,&n,which,&nev,&eps->tol,resid,&ncv,pV,&ld,iparam,ipntr,ar->workd,ar->workl,&ar->lworkl,&info)); |
172 | } | ||
173 | #else | ||
174 |
10/20✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
2760 | PetscStackCallExternalVoid("ARPACKnaupd",ARPACKnaupd_(&fcomm,&ido,bmat,&n,which,&nev,&eps->tol,resid,&ncv,pV,&ld,iparam,ipntr,ar->workd,ar->workl,&ar->lworkl,ar->rwork,&info)); |
175 | #endif | ||
176 | |||
177 |
4/4✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
|
7163 | if (ido == -1 || ido == 1 || ido == 2) { |
178 |
5/12✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
7125 | if (ido == 1 && iparam[6] == 3 && bmat[0] == 'G') PetscCall(VecPlaceArray(x,&ar->workd[ipntr[2]-1])); /* special case for shift-and-invert with B semi-positive definite*/ |
179 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7125 | else PetscCall(VecPlaceArray(x,&ar->workd[ipntr[0]-1])); |
180 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7125 | PetscCall(VecPlaceArray(y,&ar->workd[ipntr[1]-1])); |
181 | |||
182 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
7125 | if (ido == -1) { |
183 | /* Y = OP * X for the initialization phase to | ||
184 | force the starting vector into the range of OP */ | ||
185 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5 | PetscCall(STApply(eps->st,x,y)); |
186 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
7120 | } else if (ido == 2) { |
187 | /* Y = B * X */ | ||
188 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2773 | PetscCall(BVApplyMatrix(eps->V,x,y)); |
189 | } else { /* ido == 1 */ | ||
190 |
3/4✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
|
4347 | if (iparam[6] == 3 && bmat[0] == 'G') { |
191 | /* Y = OP * X for shift-and-invert with B semi-positive definite */ | ||
192 | ✗ | PetscCall(STMatSolve(eps->st,x,y)); | |
193 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
4347 | } else if (iparam[6] == 2) { |
194 | /* X=A*X Y=B^-1*X for shift with B positive definite */ | ||
195 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
925 | PetscCall(MatMult(A,x,y)); |
196 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
|
925 | if (sigmar != 0.0) { |
197 | ✗ | PetscCall(BVApplyMatrix(eps->V,x,w)); | |
198 | ✗ | PetscCall(VecAXPY(y,sigmar,w)); | |
199 | } | ||
200 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
925 | PetscCall(VecCopy(y,x)); |
201 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
925 | PetscCall(STMatSolve(eps->st,x,y)); |
202 | } else { | ||
203 | /* Y = OP * X */ | ||
204 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3422 | PetscCall(STApply(eps->st,x,y)); |
205 | } | ||
206 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
4347 | PetscCall(BVOrthogonalizeVec(eps->V,y,NULL,NULL,NULL)); |
207 | } | ||
208 | |||
209 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7125 | PetscCall(VecResetArray(x)); |
210 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7125 | PetscCall(VecResetArray(y)); |
211 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
38 | } else PetscCheck(ido==99,PetscObjectComm((PetscObject)eps),PETSC_ERR_LIB,"Internal error in ARPACK reverse communication interface (ido=%" PetscInt_FMT ")",ido); |
212 | |||
213 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
7163 | } while (ido != 99); |
214 | |||
215 | 38 | eps->nconv = iparam[4]; | |
216 | 38 | eps->its = iparam[2]; | |
217 | |||
218 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
38 | PetscCheck(info!=3,PetscObjectComm((PetscObject)eps),PETSC_ERR_LIB,"No shift could be applied in xxAUPD. Try increasing the size of NCV relative to NEV"); |
219 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
38 | PetscCheck(info==0 || info==1,PetscObjectComm((PetscObject)eps),PETSC_ERR_LIB,"Error reported by ARPACK subroutine xxAUPD (%" PetscInt_FMT ")",info); |
220 | |||
221 | 38 | rvec = PETSC_TRUE; | |
222 | |||
223 |
1/2✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
|
38 | if (eps->nconv > 0) { |
224 | #if !defined(PETSC_USE_COMPLEX) | ||
225 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
|
24 | if (eps->ishermitian) { |
226 |
10/20✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
18 | PetscStackCallExternalVoid("ARPACKseupd",ARPACKseupd_(&fcomm,&rvec,howmny,ar->select,eps->eigr,pV,&ld,&sigmar,bmat,&n,which,&nev,&eps->tol,resid,&ncv,pV,&ld,iparam,ipntr,ar->workd,ar->workl,&ar->lworkl,&info)); |
227 | } else { | ||
228 |
10/20✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
6 | PetscStackCallExternalVoid("ARPACKneupd",ARPACKneupd_(&fcomm,&rvec,howmny,ar->select,eps->eigr,eps->eigi,pV,&ld,&sigmar,&sigmai,ar->workev,bmat,&n,which,&nev,&eps->tol,resid,&ncv,pV,&ld,iparam,ipntr,ar->workd,ar->workl,&ar->lworkl,&info)); |
229 | } | ||
230 | #else | ||
231 |
10/20✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
14 | PetscStackCallExternalVoid("ARPACKneupd",ARPACKneupd_(&fcomm,&rvec,howmny,ar->select,eps->eigr,pV,&ld,&sigmar,ar->workev,bmat,&n,which,&nev,&eps->tol,resid,&ncv,pV,&ld,iparam,ipntr,ar->workd,ar->workl,&ar->lworkl,ar->rwork,&info)); |
232 | #endif | ||
233 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
38 | PetscCheck(info==0,PetscObjectComm((PetscObject)eps),PETSC_ERR_LIB,"Error reported by ARPACK subroutine xxEUPD (%" PetscInt_FMT ")",info); |
234 | } | ||
235 | |||
236 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
38 | PetscCall(BVRestoreArray(eps->V,&pV)); |
237 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
38 | PetscCall(VecRestoreArray(eps->work[1],&resid)); |
238 |
1/2✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
|
38 | if (eps->nconv >= eps->nev) eps->reason = EPS_CONVERGED_TOL; |
239 | ✗ | else eps->reason = EPS_DIVERGED_ITS; | |
240 | |||
241 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
38 | PetscCall(VecDestroy(&x)); |
242 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
38 | PetscCall(VecDestroy(&y)); |
243 |
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.
|
15 | PetscFunctionReturn(PETSC_SUCCESS); |
244 | } | ||
245 | |||
246 | 38 | static PetscErrorCode EPSBackTransform_ARPACK(EPS eps) | |
247 | { | ||
248 | 38 | PetscBool isSinv; | |
249 | |||
250 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
38 | PetscFunctionBegin; |
251 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
38 | PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STSINVERT,&isSinv)); |
252 |
6/8✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
38 | if (!isSinv) PetscCall(EPSBackTransform_Default(eps)); |
253 |
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.
|
15 | PetscFunctionReturn(PETSC_SUCCESS); |
254 | } | ||
255 | |||
256 | 33 | static PetscErrorCode EPSReset_ARPACK(EPS eps) | |
257 | { | ||
258 | 33 | EPS_ARPACK *ar = (EPS_ARPACK*)eps->data; | |
259 | |||
260 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
33 | PetscFunctionBegin; |
261 |
5/8✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
33 | PetscCall(PetscFree(ar->workev)); |
262 |
5/8✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
33 | PetscCall(PetscFree(ar->workl)); |
263 |
5/8✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
33 | PetscCall(PetscFree(ar->select)); |
264 |
5/8✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
33 | PetscCall(PetscFree(ar->workd)); |
265 | #if defined(PETSC_USE_COMPLEX) | ||
266 |
5/8✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
|
12 | PetscCall(PetscFree(ar->rwork)); |
267 | #endif | ||
268 |
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.
|
13 | PetscFunctionReturn(PETSC_SUCCESS); |
269 | } | ||
270 | |||
271 | 33 | static PetscErrorCode EPSDestroy_ARPACK(EPS eps) | |
272 | { | ||
273 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
33 | PetscFunctionBegin; |
274 |
5/8✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
33 | PetscCall(PetscFree(eps->data)); |
275 |
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.
|
13 | PetscFunctionReturn(PETSC_SUCCESS); |
276 | } | ||
277 | |||
278 | 33 | SLEPC_EXTERN PetscErrorCode EPSCreate_ARPACK(EPS eps) | |
279 | { | ||
280 | 33 | EPS_ARPACK *ctx; | |
281 | |||
282 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
33 | PetscFunctionBegin; |
283 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
33 | PetscCall(PetscNew(&ctx)); |
284 | 33 | eps->data = (void*)ctx; | |
285 | |||
286 | 33 | eps->ops->solve = EPSSolve_ARPACK; | |
287 | 33 | eps->ops->setup = EPSSetUp_ARPACK; | |
288 | 33 | eps->ops->setupsort = EPSSetUpSort_Basic; | |
289 | 33 | eps->ops->destroy = EPSDestroy_ARPACK; | |
290 | 33 | eps->ops->reset = EPSReset_ARPACK; | |
291 | 33 | eps->ops->backtransform = EPSBackTransform_ARPACK; | |
292 |
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.
|
33 | PetscFunctionReturn(PETSC_SUCCESS); |
293 | } | ||
294 |