| 1376 |
slepc |
1 |
/*
|
|
|
2 |
This file implements a wrapper to the ARPACK package
|
| 6 |
dsic.upv.es!jroman |
3 |
|
| 1376 |
slepc |
4 |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
| 1672 |
slepc |
5 |
SLEPc - Scalable Library for Eigenvalue Problem Computations
|
| 2575 |
eromero |
6 |
Copyright (c) 2002-2011, Universitat Politecnica de Valencia, Spain
|
| 1376 |
slepc |
7 |
|
| 1672 |
slepc |
8 |
This file is part of SLEPc.
|
|
|
9 |
|
|
|
10 |
SLEPc is free software: you can redistribute it and/or modify it under the
|
|
|
11 |
terms of version 3 of the GNU Lesser General Public License as published by
|
|
|
12 |
the Free Software Foundation.
|
|
|
13 |
|
|
|
14 |
SLEPc is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
|
15 |
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
|
16 |
FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
|
|
|
17 |
more details.
|
|
|
18 |
|
|
|
19 |
You should have received a copy of the GNU Lesser General Public License
|
|
|
20 |
along with SLEPc. If not, see <http://www.gnu.org/licenses/>.
|
| 1376 |
slepc |
21 |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
| 6 |
dsic.upv.es!jroman |
22 |
*/
|
| 1376 |
slepc |
23 |
|
| 2729 |
jroman |
24 |
#include <slepc-private/epsimpl.h> /*I "slepceps.h" I*/
|
|
|
25 |
#include <slepc-private/stimpl.h> /*I "slepcst.h" I*/
|
| 2283 |
jroman |
26 |
#include <../src/eps/impls/external/arpack/arpackp.h>
|
| 6 |
dsic.upv.es!jroman |
27 |
|
| 1947 |
jroman |
28 |
PetscErrorCode EPSSolve_ARPACK(EPS);
|
|
|
29 |
|
| 6 |
dsic.upv.es!jroman |
30 |
#undef __FUNCT__
|
|
|
31 |
#define __FUNCT__ "EPSSetUp_ARPACK"
|
| 476 |
dsic.upv.es!antodo |
32 |
PetscErrorCode EPSSetUp_ARPACK(EPS eps)
|
| 6 |
dsic.upv.es!jroman |
33 |
{
|
| 476 |
dsic.upv.es!antodo |
34 |
PetscErrorCode ierr;
|
| 1509 |
slepc |
35 |
PetscInt ncv;
|
| 476 |
dsic.upv.es!antodo |
36 |
EPS_ARPACK *ar = (EPS_ARPACK *)eps->data;
|
| 6 |
dsic.upv.es!jroman |
37 |
|
|
|
38 |
PetscFunctionBegin;
|
| 260 |
dsic.upv.es!antodo |
39 |
if (eps->ncv) {
|
| 2214 |
jroman |
40 |
if (eps->ncv<eps->nev+2) SETERRQ(((PetscObject)eps)->comm,1,"The value of ncv must be at least nev+2");
|
| 1220 |
slepc |
41 |
} else /* set default value of ncv */
|
| 1928 |
jroman |
42 |
eps->ncv = PetscMin(PetscMax(20,2*eps->nev+1),eps->n);
|
| 2499 |
jroman |
43 |
if (eps->mpd) { ierr = PetscInfo(eps,"Warning: parameter mpd ignored\n");CHKERRQ(ierr); }
|
| 1928 |
jroman |
44 |
if (!eps->max_it) eps->max_it = PetscMax(300,(PetscInt)(2*eps->n/eps->ncv));
|
| 1942 |
jroman |
45 |
if (!eps->which) eps->which = EPS_LARGEST_MAGNITUDE;
|
| 260 |
dsic.upv.es!antodo |
46 |
|
| 6 |
dsic.upv.es!jroman |
47 |
ncv = eps->ncv;
|
|
|
48 |
#if defined(PETSC_USE_COMPLEX)
|
| 1040 |
slepc |
49 |
ierr = PetscFree(ar->rwork);CHKERRQ(ierr);
|
| 6 |
dsic.upv.es!jroman |
50 |
ierr = PetscMalloc(ncv*sizeof(PetscReal),&ar->rwork);CHKERRQ(ierr);
|
| 1645 |
slepc |
51 |
ar->lworkl = PetscBLASIntCast(3*ncv*ncv+5*ncv);
|
| 1040 |
slepc |
52 |
ierr = PetscFree(ar->workev);CHKERRQ(ierr);
|
| 6 |
dsic.upv.es!jroman |
53 |
ierr = PetscMalloc(3*ncv*sizeof(PetscScalar),&ar->workev);CHKERRQ(ierr);
|
|
|
54 |
#else
|
| 2331 |
jroman |
55 |
if (eps->ishermitian) {
|
| 1645 |
slepc |
56 |
ar->lworkl = PetscBLASIntCast(ncv*(ncv+8));
|
| 1220 |
slepc |
57 |
} else {
|
| 1645 |
slepc |
58 |
ar->lworkl = PetscBLASIntCast(3*ncv*ncv+6*ncv);
|
| 1040 |
slepc |
59 |
ierr = PetscFree(ar->workev);CHKERRQ(ierr);
|
| 6 |
dsic.upv.es!jroman |
60 |
ierr = PetscMalloc(3*ncv*sizeof(PetscScalar),&ar->workev);CHKERRQ(ierr);
|
|
|
61 |
}
|
|
|
62 |
#endif
|
| 1040 |
slepc |
63 |
ierr = PetscFree(ar->workl);CHKERRQ(ierr);
|
| 6 |
dsic.upv.es!jroman |
64 |
ierr = PetscMalloc(ar->lworkl*sizeof(PetscScalar),&ar->workl);CHKERRQ(ierr);
|
| 1040 |
slepc |
65 |
ierr = PetscFree(ar->select);CHKERRQ(ierr);
|
| 2216 |
jroman |
66 |
ierr = PetscMalloc(ncv*sizeof(PetscBool),&ar->select);CHKERRQ(ierr);
|
| 1040 |
slepc |
67 |
ierr = PetscFree(ar->workd);CHKERRQ(ierr);
|
| 1928 |
jroman |
68 |
ierr = PetscMalloc(3*eps->nloc*sizeof(PetscScalar),&ar->workd);CHKERRQ(ierr);
|
| 6 |
dsic.upv.es!jroman |
69 |
|
| 2499 |
jroman |
70 |
if (eps->extraction) { ierr = PetscInfo(eps,"Warning: extraction type ignored\n");CHKERRQ(ierr); }
|
| 1426 |
slepc |
71 |
|
| 1940 |
jroman |
72 |
if (eps->balance!=EPS_BALANCE_NONE)
|
| 2214 |
jroman |
73 |
SETERRQ(((PetscObject)eps)->comm,PETSC_ERR_SUP,"Balancing not supported in the Arpack interface");
|
| 1819 |
jroman |
74 |
|
| 1941 |
jroman |
75 |
ierr = EPSAllocateSolution(eps);CHKERRQ(ierr);
|
| 1231 |
slepc |
76 |
ierr = EPSDefaultGetWork(eps,2);CHKERRQ(ierr);
|
| 6 |
dsic.upv.es!jroman |
77 |
|
| 1947 |
jroman |
78 |
/* dispatch solve method */
|
| 2214 |
jroman |
79 |
if (eps->leftvecs) SETERRQ(((PetscObject)eps)->comm,PETSC_ERR_SUP,"Left vectors not supported in this solver");
|
| 1947 |
jroman |
80 |
eps->ops->solve = EPSSolve_ARPACK;
|
| 6 |
dsic.upv.es!jroman |
81 |
PetscFunctionReturn(0);
|
|
|
82 |
}
|
|
|
83 |
|
|
|
84 |
#undef __FUNCT__
|
|
|
85 |
#define __FUNCT__ "EPSSolve_ARPACK"
|
| 476 |
dsic.upv.es!antodo |
86 |
PetscErrorCode EPSSolve_ARPACK(EPS eps)
|
| 6 |
dsic.upv.es!jroman |
87 |
{
|
| 1089 |
slepc |
88 |
PetscErrorCode ierr;
|
| 2316 |
jroman |
89 |
EPS_ARPACK *ar = (EPS_ARPACK *)eps->data;
|
| 2331 |
jroman |
90 |
char bmat[1],howmny[] = "A";
|
| 2316 |
jroman |
91 |
const char *which;
|
| 2331 |
jroman |
92 |
PetscBLASInt n,iparam[11],ipntr[14],ido,info,nev,ncv,fcomm;
|
|
|
93 |
PetscScalar sigmar,*pV,*resid;
|
|
|
94 |
Vec x,y,w = eps->work[0];
|
| 2316 |
jroman |
95 |
Mat A;
|
| 2331 |
jroman |
96 |
PetscBool isSinv,isShift,rvec;
|
| 1229 |
slepc |
97 |
#if !defined(PETSC_USE_COMPLEX)
|
|
|
98 |
PetscScalar sigmai = 0.0;
|
|
|
99 |
#endif
|
| 2316 |
jroman |
100 |
|
| 6 |
dsic.upv.es!jroman |
101 |
PetscFunctionBegin;
|
| 1645 |
slepc |
102 |
nev = PetscBLASIntCast(eps->nev);
|
|
|
103 |
ncv = PetscBLASIntCast(eps->ncv);
|
| 1515 |
slepc |
104 |
fcomm = PetscBLASIntCast(MPI_Comm_c2f(((PetscObject)eps)->comm));
|
| 1928 |
jroman |
105 |
n = PetscBLASIntCast(eps->nloc);
|
| 2761 |
jroman |
106 |
ierr = VecCreateMPIWithArray(((PetscObject)eps)->comm,1,eps->nloc,PETSC_DECIDE,PETSC_NULL,&x);CHKERRQ(ierr);
|
|
|
107 |
ierr = VecCreateMPIWithArray(((PetscObject)eps)->comm,1,eps->nloc,PETSC_DECIDE,PETSC_NULL,&y);CHKERRQ(ierr);
|
| 6 |
dsic.upv.es!jroman |
108 |
ierr = VecGetArray(eps->V[0],&pV);CHKERRQ(ierr);
|
| 1941 |
jroman |
109 |
ierr = EPSGetStartVector(eps,0,eps->work[1],PETSC_NULL);CHKERRQ(ierr);
|
| 1231 |
slepc |
110 |
ierr = VecGetArray(eps->work[1],&resid);CHKERRQ(ierr);
|
| 6 |
dsic.upv.es!jroman |
111 |
|
|
|
112 |
ido = 0; /* first call to reverse communication interface */
|
|
|
113 |
info = 1; /* indicates a initial vector is provided */
|
|
|
114 |
iparam[0] = 1; /* use exact shifts */
|
| 1645 |
slepc |
115 |
iparam[2] = PetscBLASIntCast(eps->max_it); /* maximum number of Arnoldi update iterations */
|
| 6 |
dsic.upv.es!jroman |
116 |
iparam[3] = 1; /* blocksize */
|
|
|
117 |
iparam[4] = 0; /* number of converged Ritz values */
|
|
|
118 |
|
|
|
119 |
/*
|
|
|
120 |
Computational modes ([]=not supported):
|
|
|
121 |
symmetric non-symmetric complex
|
|
|
122 |
1 1 'I' 1 'I' 1 'I'
|
|
|
123 |
2 3 'I' 3 'I' 3 'I'
|
|
|
124 |
3 2 'G' 2 'G' 2 'G'
|
|
|
125 |
4 3 'G' 3 'G' 3 'G'
|
|
|
126 |
5 [ 4 'G' ] [ 3 'G' ]
|
|
|
127 |
6 [ 5 'G' ] [ 4 'G' ]
|
|
|
128 |
*/
|
| 2823 |
jroman |
129 |
ierr = PetscObjectTypeCompare((PetscObject)eps->OP,STSINVERT,&isSinv);CHKERRQ(ierr);
|
|
|
130 |
ierr = PetscObjectTypeCompare((PetscObject)eps->OP,STSHIFT,&isShift);CHKERRQ(ierr);
|
| 1229 |
slepc |
131 |
ierr = STGetShift(eps->OP,&sigmar);CHKERRQ(ierr);
|
|
|
132 |
ierr = STGetOperators(eps->OP,&A,PETSC_NULL);CHKERRQ(ierr);
|
|
|
133 |
|
|
|
134 |
if (isSinv) {
|
|
|
135 |
/* shift-and-invert mode */
|
|
|
136 |
iparam[6] = 3;
|
| 1358 |
slepc |
137 |
if (eps->ispositive) bmat[0] = 'G';
|
| 1229 |
slepc |
138 |
else bmat[0] = 'I';
|
| 1358 |
slepc |
139 |
} else if (isShift && eps->ispositive) {
|
| 1229 |
slepc |
140 |
/* generalized shift mode with B positive definite */
|
|
|
141 |
iparam[6] = 2;
|
|
|
142 |
bmat[0] = 'G';
|
|
|
143 |
} else {
|
|
|
144 |
/* regular mode */
|
|
|
145 |
if (eps->ishermitian && eps->isgeneralized)
|
| 2214 |
jroman |
146 |
SETERRQ(((PetscObject)eps)->comm,PETSC_ERR_SUP,"Spectral transformation not supported by ARPACK hermitian solver");
|
| 1229 |
slepc |
147 |
iparam[6] = 1;
|
|
|
148 |
bmat[0] = 'I';
|
| 6 |
dsic.upv.es!jroman |
149 |
}
|
|
|
150 |
|
|
|
151 |
#if !defined(PETSC_USE_COMPLEX)
|
|
|
152 |
if (eps->ishermitian) {
|
| 91 |
dsic.upv.es!antodo |
153 |
switch(eps->which) {
|
| 2161 |
jroman |
154 |
case EPS_TARGET_MAGNITUDE:
|
| 91 |
dsic.upv.es!antodo |
155 |
case EPS_LARGEST_MAGNITUDE: which = "LM"; break;
|
|
|
156 |
case EPS_SMALLEST_MAGNITUDE: which = "SM"; break;
|
| 2161 |
jroman |
157 |
case EPS_TARGET_REAL:
|
| 91 |
dsic.upv.es!antodo |
158 |
case EPS_LARGEST_REAL: which = "LA"; break;
|
|
|
159 |
case EPS_SMALLEST_REAL: which = "SA"; break;
|
| 2214 |
jroman |
160 |
default: SETERRQ(((PetscObject)eps)->comm,1,"Wrong value of eps->which");
|
| 91 |
dsic.upv.es!antodo |
161 |
}
|
| 176 |
dsic.upv.es!antodo |
162 |
} else {
|
|
|
163 |
#endif
|
| 91 |
dsic.upv.es!antodo |
164 |
switch(eps->which) {
|
| 2161 |
jroman |
165 |
case EPS_TARGET_MAGNITUDE:
|
| 91 |
dsic.upv.es!antodo |
166 |
case EPS_LARGEST_MAGNITUDE: which = "LM"; break;
|
|
|
167 |
case EPS_SMALLEST_MAGNITUDE: which = "SM"; break;
|
| 2161 |
jroman |
168 |
case EPS_TARGET_REAL:
|
| 91 |
dsic.upv.es!antodo |
169 |
case EPS_LARGEST_REAL: which = "LR"; break;
|
|
|
170 |
case EPS_SMALLEST_REAL: which = "SR"; break;
|
| 2161 |
jroman |
171 |
case EPS_TARGET_IMAGINARY:
|
| 91 |
dsic.upv.es!antodo |
172 |
case EPS_LARGEST_IMAGINARY: which = "LI"; break;
|
|
|
173 |
case EPS_SMALLEST_IMAGINARY: which = "SI"; break;
|
| 2214 |
jroman |
174 |
default: SETERRQ(((PetscObject)eps)->comm,1,"Wrong value of eps->which");
|
| 91 |
dsic.upv.es!antodo |
175 |
}
|
| 176 |
dsic.upv.es!antodo |
176 |
#if !defined(PETSC_USE_COMPLEX)
|
|
|
177 |
}
|
|
|
178 |
#endif
|
|
|
179 |
|
| 740 |
dsic.upv.es!antodo |
180 |
do {
|
| 176 |
dsic.upv.es!antodo |
181 |
|
|
|
182 |
#if !defined(PETSC_USE_COMPLEX)
|
|
|
183 |
if (eps->ishermitian) {
|
| 2331 |
jroman |
184 |
ARsaupd_(&fcomm,&ido,bmat,&n,which,&nev,&eps->tol,
|
|
|
185 |
resid,&ncv,pV,&n,iparam,ipntr,ar->workd,
|
|
|
186 |
ar->workl,&ar->lworkl,&info,1,2);
|
| 176 |
dsic.upv.es!antodo |
187 |
}
|
|
|
188 |
else {
|
| 2331 |
jroman |
189 |
ARnaupd_(&fcomm,&ido,bmat,&n,which,&nev,&eps->tol,
|
|
|
190 |
resid,&ncv,pV,&n,iparam,ipntr,ar->workd,
|
|
|
191 |
ar->workl,&ar->lworkl,&info,1,2);
|
| 6 |
dsic.upv.es!jroman |
192 |
}
|
|
|
193 |
#else
|
| 2331 |
jroman |
194 |
ARnaupd_(&fcomm,&ido,bmat,&n,which,&nev,&eps->tol,
|
|
|
195 |
resid,&ncv,pV,&n,iparam,ipntr,ar->workd,
|
|
|
196 |
ar->workl,&ar->lworkl,ar->rwork,&info,1,2);
|
| 6 |
dsic.upv.es!jroman |
197 |
#endif
|
| 571 |
dsic.upv.es!antodo |
198 |
|
| 1229 |
slepc |
199 |
if (ido == -1 || ido == 1 || ido == 2) {
|
|
|
200 |
if (ido == 1 && iparam[6] == 3 && bmat[0] == 'G') {
|
|
|
201 |
/* special case for shift-and-invert with B semi-positive definite*/
|
| 2330 |
jroman |
202 |
ierr = VecPlaceArray(x,&ar->workd[ipntr[2]-1]);CHKERRQ(ierr);
|
| 1229 |
slepc |
203 |
} else {
|
| 2330 |
jroman |
204 |
ierr = VecPlaceArray(x,&ar->workd[ipntr[0]-1]);CHKERRQ(ierr);
|
| 1229 |
slepc |
205 |
}
|
| 2330 |
jroman |
206 |
ierr = VecPlaceArray(y,&ar->workd[ipntr[1]-1]);CHKERRQ(ierr);
|
| 1229 |
slepc |
207 |
|
|
|
208 |
if (ido == -1) {
|
|
|
209 |
/* Y = OP * X for for the initialization phase to
|
| 2316 |
jroman |
210 |
force the starting vector into the range of OP */
|
| 2330 |
jroman |
211 |
ierr = STApply(eps->OP,x,y);CHKERRQ(ierr);
|
| 1229 |
slepc |
212 |
} else if (ido == 2) {
|
|
|
213 |
/* Y = B * X */
|
| 2330 |
jroman |
214 |
ierr = IPApplyMatrix(eps->ip,x,y);CHKERRQ(ierr);
|
| 1229 |
slepc |
215 |
} else { /* ido == 1 */
|
|
|
216 |
if (iparam[6] == 3 && bmat[0] == 'G') {
|
|
|
217 |
/* Y = OP * X for shift-and-invert with B semi-positive definite */
|
| 2316 |
jroman |
218 |
ierr = STAssociatedKSPSolve(eps->OP,x,y);CHKERRQ(ierr);
|
|
|
219 |
} else if (iparam[6] == 2) {
|
| 1229 |
slepc |
220 |
/* X=A*X Y=B^-1*X for shift with B positive definite */
|
| 2316 |
jroman |
221 |
ierr = MatMult(A,x,y);CHKERRQ(ierr);
|
|
|
222 |
if (sigmar != 0.0) {
|
|
|
223 |
ierr = IPApplyMatrix(eps->ip,x,w);CHKERRQ(ierr);
|
| 1229 |
slepc |
224 |
ierr = VecAXPY(y,sigmar,w);CHKERRQ(ierr);
|
| 2316 |
jroman |
225 |
}
|
| 2330 |
jroman |
226 |
ierr = VecCopy(y,x);CHKERRQ(ierr);
|
| 1229 |
slepc |
227 |
ierr = STAssociatedKSPSolve(eps->OP,x,y);CHKERRQ(ierr);
|
| 2316 |
jroman |
228 |
} else {
|
| 1229 |
slepc |
229 |
/* Y = OP * X */
|
| 2330 |
jroman |
230 |
ierr = STApply(eps->OP,x,y);CHKERRQ(ierr);
|
| 2316 |
jroman |
231 |
}
|
| 1755 |
antodo |
232 |
ierr = IPOrthogonalize(eps->ip,0,PETSC_NULL,eps->nds,PETSC_NULL,eps->DS,y,PETSC_NULL,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
|
| 6 |
dsic.upv.es!jroman |
233 |
}
|
| 1229 |
slepc |
234 |
|
| 2330 |
jroman |
235 |
ierr = VecResetArray(x);CHKERRQ(ierr);
|
|
|
236 |
ierr = VecResetArray(y);CHKERRQ(ierr);
|
| 2762 |
jroman |
237 |
} else if (ido != 99) SETERRQ1(((PetscObject)eps)->comm,1,"Internal error in ARPACK reverse comunication interface (ido=%d)\n",ido);
|
| 740 |
dsic.upv.es!antodo |
238 |
|
|
|
239 |
} while (ido != 99);
|
| 6 |
dsic.upv.es!jroman |
240 |
|
|
|
241 |
eps->nconv = iparam[4];
|
| 1223 |
slepc |
242 |
eps->its = iparam[2];
|
| 6 |
dsic.upv.es!jroman |
243 |
|
| 2762 |
jroman |
244 |
if (info==3) SETERRQ(((PetscObject)eps)->comm,1,"No shift could be applied in xxAUPD.\nTry increasing the size of NCV relative to NEV.");
|
|
|
245 |
else if (info!=0 && info!=1) SETERRQ1(((PetscObject)eps)->comm,PETSC_ERR_LIB,"Error reported by ARPACK subroutine xxAUPD (%d)",info);
|
| 6 |
dsic.upv.es!jroman |
246 |
|
| 393 |
dsic.upv.es!antodo |
247 |
rvec = PETSC_TRUE;
|
| 6 |
dsic.upv.es!jroman |
248 |
|
| 740 |
dsic.upv.es!antodo |
249 |
if (eps->nconv > 0) {
|
| 6 |
dsic.upv.es!jroman |
250 |
#if !defined(PETSC_USE_COMPLEX)
|
| 740 |
dsic.upv.es!antodo |
251 |
if (eps->ishermitian) {
|
| 2313 |
jroman |
252 |
ierr = EPSMonitor(eps,iparam[2],iparam[4],&ar->workl[ipntr[5]-1],eps->eigi,&ar->workl[ipntr[6]-1],eps->ncv);CHKERRQ(ierr);
|
| 2331 |
jroman |
253 |
ARseupd_ (&fcomm,&rvec,howmny,ar->select,eps->eigr,
|
|
|
254 |
pV,&n,&sigmar,
|
|
|
255 |
bmat,&n,which,&nev,&eps->tol,
|
|
|
256 |
resid,&ncv,pV,&n,iparam,ipntr,ar->workd,
|
|
|
257 |
ar->workl,&ar->lworkl,&info,1,1,2);
|
| 740 |
dsic.upv.es!antodo |
258 |
}
|
|
|
259 |
else {
|
| 2313 |
jroman |
260 |
ierr = EPSMonitor(eps,iparam[2],iparam[4],&ar->workl[ipntr[5]-1],&ar->workl[ipntr[6]-1],&ar->workl[ipntr[7]-1],eps->ncv);CHKERRQ(ierr);
|
| 2331 |
jroman |
261 |
ARneupd_ (&fcomm,&rvec,howmny,ar->select,eps->eigr,eps->eigi,
|
|
|
262 |
pV,&n,&sigmar,&sigmai,ar->workev,
|
|
|
263 |
bmat,&n,which,&nev,&eps->tol,
|
|
|
264 |
resid,&ncv,pV,&n,iparam,ipntr,ar->workd,
|
|
|
265 |
ar->workl,&ar->lworkl,&info,1,1,2);
|
| 740 |
dsic.upv.es!antodo |
266 |
}
|
|
|
267 |
#else
|
| 2313 |
jroman |
268 |
ierr = EPSMonitor(eps,eps->its,iparam[4],&ar->workl[ipntr[5]-1],eps->eigi,(PetscReal*)&ar->workl[ipntr[7]-1],eps->ncv);CHKERRQ(ierr);
|
| 2331 |
jroman |
269 |
ARneupd_ (&fcomm,&rvec,howmny,ar->select,eps->eigr,
|
|
|
270 |
pV,&n,&sigmar,ar->workev,
|
|
|
271 |
bmat,&n,which,&nev,&eps->tol,
|
|
|
272 |
resid,&ncv,pV,&n,iparam,ipntr,ar->workd,
|
|
|
273 |
ar->workl,&ar->lworkl,ar->rwork,&info,1,1,2);
|
| 6 |
dsic.upv.es!jroman |
274 |
#endif
|
| 2762 |
jroman |
275 |
if (info!=0) SETERRQ1(((PetscObject)eps)->comm,PETSC_ERR_LIB,"Error reported by ARPACK subroutine xxEUPD (%d)",info);
|
| 740 |
dsic.upv.es!antodo |
276 |
}
|
| 6 |
dsic.upv.es!jroman |
277 |
|
| 2331 |
jroman |
278 |
ierr = VecRestoreArray(eps->V[0],&pV);CHKERRQ(ierr);
|
|
|
279 |
ierr = VecRestoreArray(eps->work[1],&resid);CHKERRQ(ierr);
|
|
|
280 |
if (eps->nconv >= eps->nev) eps->reason = EPS_CONVERGED_TOL;
|
| 740 |
dsic.upv.es!antodo |
281 |
else eps->reason = EPS_DIVERGED_ITS;
|
| 6 |
dsic.upv.es!jroman |
282 |
|
|
|
283 |
if (eps->ishermitian) {
|
|
|
284 |
ierr = PetscMemcpy(eps->errest,&ar->workl[ipntr[8]-1],eps->nconv);CHKERRQ(ierr);
|
|
|
285 |
} else {
|
|
|
286 |
ierr = PetscMemcpy(eps->errest,&ar->workl[ipntr[10]-1],eps->nconv);CHKERRQ(ierr);
|
|
|
287 |
}
|
|
|
288 |
|
| 2305 |
jroman |
289 |
ierr = VecDestroy(&x);CHKERRQ(ierr);
|
|
|
290 |
ierr = VecDestroy(&y);CHKERRQ(ierr);
|
| 6 |
dsic.upv.es!jroman |
291 |
PetscFunctionReturn(0);
|
|
|
292 |
}
|
|
|
293 |
|
|
|
294 |
#undef __FUNCT__
|
| 176 |
dsic.upv.es!antodo |
295 |
#define __FUNCT__ "EPSBackTransform_ARPACK"
|
| 476 |
dsic.upv.es!antodo |
296 |
PetscErrorCode EPSBackTransform_ARPACK(EPS eps)
|
| 176 |
dsic.upv.es!antodo |
297 |
{
|
| 476 |
dsic.upv.es!antodo |
298 |
PetscErrorCode ierr;
|
| 2216 |
jroman |
299 |
PetscBool isSinv;
|
| 176 |
dsic.upv.es!antodo |
300 |
|
|
|
301 |
PetscFunctionBegin;
|
| 2823 |
jroman |
302 |
ierr = PetscObjectTypeCompare((PetscObject)eps->OP,STSINVERT,&isSinv);CHKERRQ(ierr);
|
| 1229 |
slepc |
303 |
if (!isSinv) {
|
|
|
304 |
ierr = EPSBackTransform_Default(eps);CHKERRQ(ierr);
|
| 442 |
dsic.upv.es!antodo |
305 |
}
|
| 176 |
dsic.upv.es!antodo |
306 |
PetscFunctionReturn(0);
|
|
|
307 |
}
|
|
|
308 |
|
|
|
309 |
#undef __FUNCT__
|
| 2348 |
jroman |
310 |
#define __FUNCT__ "EPSReset_ARPACK"
|
|
|
311 |
PetscErrorCode EPSReset_ARPACK(EPS eps)
|
| 6 |
dsic.upv.es!jroman |
312 |
{
|
| 476 |
dsic.upv.es!antodo |
313 |
PetscErrorCode ierr;
|
|
|
314 |
EPS_ARPACK *ar = (EPS_ARPACK *)eps->data;
|
| 6 |
dsic.upv.es!jroman |
315 |
|
|
|
316 |
PetscFunctionBegin;
|
| 1040 |
slepc |
317 |
ierr = PetscFree(ar->workev);CHKERRQ(ierr);
|
|
|
318 |
ierr = PetscFree(ar->workl);CHKERRQ(ierr);
|
|
|
319 |
ierr = PetscFree(ar->select);CHKERRQ(ierr);
|
|
|
320 |
ierr = PetscFree(ar->workd);CHKERRQ(ierr);
|
| 6 |
dsic.upv.es!jroman |
321 |
#if defined(PETSC_USE_COMPLEX)
|
| 1040 |
slepc |
322 |
ierr = PetscFree(ar->rwork);CHKERRQ(ierr);
|
| 6 |
dsic.upv.es!jroman |
323 |
#endif
|
| 260 |
dsic.upv.es!antodo |
324 |
ierr = EPSDefaultFreeWork(eps);CHKERRQ(ierr);
|
| 1596 |
slepc |
325 |
ierr = EPSFreeSolution(eps);CHKERRQ(ierr);
|
| 6 |
dsic.upv.es!jroman |
326 |
PetscFunctionReturn(0);
|
|
|
327 |
}
|
|
|
328 |
|
| 2348 |
jroman |
329 |
#undef __FUNCT__
|
|
|
330 |
#define __FUNCT__ "EPSDestroy_ARPACK"
|
|
|
331 |
PetscErrorCode EPSDestroy_ARPACK(EPS eps)
|
|
|
332 |
{
|
|
|
333 |
PetscErrorCode ierr;
|
|
|
334 |
|
|
|
335 |
PetscFunctionBegin;
|
|
|
336 |
ierr = PetscFree(eps->data);CHKERRQ(ierr);
|
|
|
337 |
PetscFunctionReturn(0);
|
|
|
338 |
}
|
|
|
339 |
|
| 6 |
dsic.upv.es!jroman |
340 |
EXTERN_C_BEGIN
|
|
|
341 |
#undef __FUNCT__
|
|
|
342 |
#define __FUNCT__ "EPSCreate_ARPACK"
|
| 476 |
dsic.upv.es!antodo |
343 |
PetscErrorCode EPSCreate_ARPACK(EPS eps)
|
| 6 |
dsic.upv.es!jroman |
344 |
{
|
| 476 |
dsic.upv.es!antodo |
345 |
PetscErrorCode ierr;
|
| 6 |
dsic.upv.es!jroman |
346 |
|
|
|
347 |
PetscFunctionBegin;
|
| 2329 |
jroman |
348 |
ierr = PetscNewLog(eps,EPS_ARPACK,&eps->data);CHKERRQ(ierr);
|
| 503 |
dsic.upv.es!antodo |
349 |
eps->ops->setup = EPSSetUp_ARPACK;
|
| 6 |
dsic.upv.es!jroman |
350 |
eps->ops->destroy = EPSDestroy_ARPACK;
|
| 2348 |
jroman |
351 |
eps->ops->reset = EPSReset_ARPACK;
|
| 176 |
dsic.upv.es!antodo |
352 |
eps->ops->backtransform = EPSBackTransform_ARPACK;
|
| 503 |
dsic.upv.es!antodo |
353 |
eps->ops->computevectors = EPSComputeVectors_Default;
|
| 6 |
dsic.upv.es!jroman |
354 |
PetscFunctionReturn(0);
|
|
|
355 |
}
|
|
|
356 |
EXTERN_C_END
|