Subversion Repositories slepc-dev

Rev

Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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