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 BLZPACK 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
 
2293 jroman 24
#include <private/epsimpl.h>    /*I "slepceps.h" I*/
2298 jroman 25
#include <private/stimpl.h>     /*I "slepcst.h" I*/
2283 jroman 26
#include <../src/eps/impls/external/blzpack/blzpackp.h>
6 dsic.upv.es!jroman 27
 
1947 jroman 28
PetscErrorCode EPSSolve_BLZPACK(EPS);
29
 
114 dsic.upv.es!antodo 30
const char* blzpack_error[33] = {
31
  "",
32
  "illegal data, LFLAG ",
33
  "illegal data, dimension of (U), (V), (X) ",
34
  "illegal data, leading dimension of (U), (V), (X) ",
35
  "illegal data, leading dimension of (EIG) ",
36
  "illegal data, number of required eigenpairs ",
37
  "illegal data, Lanczos algorithm block size ",
38
  "illegal data, maximum number of steps ",
39
  "illegal data, number of starting vectors ",
40
  "illegal data, number of eigenpairs provided ",
41
  "illegal data, problem type flag ",
42
  "illegal data, spectrum slicing flag ",
43
  "illegal data, eigenvectors purification flag ",
44
  "illegal data, level of output ",
45
  "illegal data, output file unit ",
46
  "illegal data, LCOMM (MPI or PVM) ",
47
  "illegal data, dimension of ISTOR ",
48
  "illegal data, convergence threshold ",
49
  "illegal data, dimension of RSTOR ",
50
  "illegal data on at least one PE ",
51
  "ISTOR(3:14) must be equal on all PEs ",
52
  "RSTOR(1:3) must be equal on all PEs ",
53
  "not enough space in ISTOR to start eigensolution ",
54
  "not enough space in RSTOR to start eigensolution ",
55
  "illegal data, number of negative eigenvalues ",
56
  "illegal data, entries of V ",
57
  "illegal data, entries of X ",
58
  "failure in computational subinterval ",
59
  "file I/O error, blzpack.__.BQ ",
60
  "file I/O error, blzpack.__.BX ",
61
  "file I/O error, blzpack.__.Q ",
62
  "file I/O error, blzpack.__.X ",
63
  "parallel interface error "
64
};
65
 
6 dsic.upv.es!jroman 66
#undef __FUNCT__  
67
#define __FUNCT__ "EPSSetUp_BLZPACK"
476 dsic.upv.es!antodo 68
PetscErrorCode EPSSetUp_BLZPACK(EPS eps)
6 dsic.upv.es!jroman 69
{
476 dsic.upv.es!antodo 70
  PetscErrorCode ierr;
2331 jroman 71
  PetscInt       listor,lrstor,ncuv,k1,k2,k3,k4;
476 dsic.upv.es!antodo 72
  EPS_BLZPACK    *blz = (EPS_BLZPACK *)eps->data;
2216 jroman 73
  PetscBool      flg;
476 dsic.upv.es!antodo 74
  KSP            ksp;
75
  PC             pc;
6 dsic.upv.es!jroman 76
 
77
  PetscFunctionBegin;
260 dsic.upv.es!antodo 78
  if (eps->ncv) {
2331 jroman 79
    if (eps->ncv < PetscMin(eps->nev+10,eps->nev*2))
2214 jroman 80
      SETERRQ(((PetscObject)eps)->comm,0,"Warning: BLZpack recommends that ncv be larger than min(nev+10,nev*2)");
260 dsic.upv.es!antodo 81
  }
82
  else eps->ncv = PetscMin(eps->nev+10,eps->nev*2);
2499 jroman 83
  if (eps->mpd) { ierr = PetscInfo(eps,"Warning: parameter mpd ignored\n");CHKERRQ(ierr); }
1928 jroman 84
  if (!eps->max_it) eps->max_it = PetscMax(1000,eps->n);
260 dsic.upv.es!antodo 85
 
6 dsic.upv.es!jroman 86
  if (!eps->ishermitian)
2214 jroman 87
    SETERRQ(((PetscObject)eps)->comm,PETSC_ERR_SUP,"Requested method is only available for Hermitian problems");
1229 slepc 88
  if (blz->slice || eps->isgeneralized) {
2092 jroman 89
    ierr = PetscTypeCompare((PetscObject)eps->OP,STSINVERT,&flg);CHKERRQ(ierr);
420 dsic.upv.es!antodo 90
    if (!flg)
2214 jroman 91
      SETERRQ(((PetscObject)eps)->comm,PETSC_ERR_SUP,"Shift-and-invert ST is needed for generalized problems or spectrum slicing");
420 dsic.upv.es!antodo 92
    ierr = STGetKSP(eps->OP,&ksp);CHKERRQ(ierr);
93
    ierr = PetscTypeCompare((PetscObject)ksp,KSPPREONLY,&flg);CHKERRQ(ierr);
94
    if (!flg)
2214 jroman 95
      SETERRQ(((PetscObject)eps)->comm,PETSC_ERR_SUP,"Preonly KSP is needed for generalized problems or spectrum slicing");
420 dsic.upv.es!antodo 96
    ierr = KSPGetPC(ksp,&pc);CHKERRQ(ierr);
97
    ierr = PetscTypeCompare((PetscObject)pc,PCCHOLESKY,&flg);CHKERRQ(ierr);
98
    if (!flg)
2214 jroman 99
      SETERRQ(((PetscObject)eps)->comm,PETSC_ERR_SUP,"Cholesky PC is needed for generalized problems or spectrum slicing");
420 dsic.upv.es!antodo 100
  }
1942 jroman 101
  if (!eps->which) eps->which = EPS_SMALLEST_REAL;
92 dsic.upv.es!antodo 102
  if (eps->which!=EPS_SMALLEST_REAL)
2214 jroman 103
    SETERRQ(((PetscObject)eps)->comm,1,"Wrong value of eps->which");
6 dsic.upv.es!jroman 104
 
1928 jroman 105
  k1 = PetscMin(eps->n,180);
211 dsic.upv.es!antodo 106
  k2 = blz->block_size;
1928 jroman 107
  k4 = PetscMin(eps->ncv,eps->n);
6 dsic.upv.es!jroman 108
  k3 = 484+k1*(13+k1*2+k2+PetscMax(18,k2+2))+k2*k2*3+k4*2;
109
 
110
  listor = 123+k1*12;
1040 slepc 111
  ierr = PetscFree(blz->istor);CHKERRQ(ierr);
1509 slepc 112
  ierr = PetscMalloc((17+listor)*sizeof(PetscBLASInt),&blz->istor);CHKERRQ(ierr);
1649 slepc 113
  blz->istor[14] = PetscBLASIntCast(listor);
6 dsic.upv.es!jroman 114
 
1928 jroman 115
  if (blz->slice) lrstor = eps->nloc*(k2*4+k1*2+k4)+k3;
116
  else lrstor = eps->nloc*(k2*4+k1)+k3;
1040 slepc 117
  ierr = PetscFree(blz->rstor);CHKERRQ(ierr);
6 dsic.upv.es!jroman 118
  ierr = PetscMalloc((4+lrstor)*sizeof(PetscReal),&blz->rstor);CHKERRQ(ierr);
119
  blz->rstor[3] = lrstor;
120
 
121
  ncuv = PetscMax(3,blz->block_size);
1040 slepc 122
  ierr = PetscFree(blz->u);CHKERRQ(ierr);
1928 jroman 123
  ierr = PetscMalloc(ncuv*eps->nloc*sizeof(PetscScalar),&blz->u);CHKERRQ(ierr);
1040 slepc 124
  ierr = PetscFree(blz->v);CHKERRQ(ierr);
1928 jroman 125
  ierr = PetscMalloc(ncuv*eps->nloc*sizeof(PetscScalar),&blz->v);CHKERRQ(ierr);
6 dsic.upv.es!jroman 126
 
1040 slepc 127
  ierr = PetscFree(blz->eig);CHKERRQ(ierr);
6 dsic.upv.es!jroman 128
  ierr = PetscMalloc(2*eps->ncv*sizeof(PetscReal),&blz->eig);CHKERRQ(ierr);
129
 
2499 jroman 130
  if (eps->extraction) { ierr = PetscInfo(eps,"Warning: extraction type ignored\n");CHKERRQ(ierr); }
1426 slepc 131
 
1596 slepc 132
  ierr = EPSAllocateSolution(eps);CHKERRQ(ierr);
1947 jroman 133
 
134
  /* dispatch solve method */
2214 jroman 135
  if (eps->leftvecs) SETERRQ(((PetscObject)eps)->comm,PETSC_ERR_SUP,"Left vectors not supported in this solver");
1947 jroman 136
  eps->ops->solve = EPSSolve_BLZPACK;
6 dsic.upv.es!jroman 137
  PetscFunctionReturn(0);
138
}
139
 
140
#undef __FUNCT__  
141
#define __FUNCT__ "EPSSolve_BLZPACK"
476 dsic.upv.es!antodo 142
PetscErrorCode EPSSolve_BLZPACK(EPS eps)
6 dsic.upv.es!jroman 143
{
476 dsic.upv.es!antodo 144
  PetscErrorCode ierr;
1089 slepc 145
  EPS_BLZPACK    *blz = (EPS_BLZPACK *)eps->data;
1928 jroman 146
  PetscInt       nn;
2331 jroman 147
  PetscBLASInt   i,nneig,lflag,nvopu;      
148
  Vec            x,y;                          
476 dsic.upv.es!antodo 149
  PetscScalar    sigma,*pV;                      
150
  Mat            A;                              
151
  KSP            ksp;                            
152
  PC             pc;                            
6 dsic.upv.es!jroman 153
 
154
  PetscFunctionBegin;
1928 jroman 155
  ierr = VecCreateMPIWithArray(((PetscObject)eps)->comm,eps->nloc,PETSC_DECIDE,PETSC_NULL,&x);CHKERRQ(ierr);
156
  ierr = VecCreateMPIWithArray(((PetscObject)eps)->comm,eps->nloc,PETSC_DECIDE,PETSC_NULL,&y);CHKERRQ(ierr);
6 dsic.upv.es!jroman 157
  ierr = VecGetArray(eps->V[0],&pV);CHKERRQ(ierr);
158
 
1229 slepc 159
  if (eps->isgeneralized && !blz->slice) {
160
    ierr = STGetShift(eps->OP,&sigma);CHKERRQ(ierr); /* shift of origin */
161
    blz->rstor[0]  = sigma;        /* lower limit of eigenvalue interval */
162
    blz->rstor[1]  = sigma;        /* upper limit of eigenvalue interval */
163
  } else {
164
    sigma = 0.0;
165
    blz->rstor[0]  = blz->initial; /* lower limit of eigenvalue interval */
166
    blz->rstor[1]  = blz->final;   /* upper limit of eigenvalue interval */
167
  }
420 dsic.upv.es!antodo 168
  nneig = 0;                     /* no. of eigs less than sigma */
169
 
1928 jroman 170
  blz->istor[0]  = PetscBLASIntCast(eps->nloc); /* number of rows of U, V, X*/
171
  blz->istor[1]  = PetscBLASIntCast(eps->nloc); /* leading dimension of U, V, X */
1649 slepc 172
  blz->istor[2]  = PetscBLASIntCast(eps->nev); /* number of required eigenpairs */
173
  blz->istor[3]  = PetscBLASIntCast(eps->ncv); /* number of working eigenpairs */
6 dsic.upv.es!jroman 174
  blz->istor[4]  = blz->block_size;    /* number of vectors in a block */
422 dsic.upv.es!antodo 175
  blz->istor[5]  = blz->nsteps;  /* maximun number of steps per run */
6 dsic.upv.es!jroman 176
  blz->istor[6]  = 1;            /* number of starting vectors as input */
177
  blz->istor[7]  = 0;            /* number of eigenpairs given as input */
1229 slepc 178
  blz->istor[8]  = (blz->slice || eps->isgeneralized) ? 1 : 0;   /* problem type */
420 dsic.upv.es!antodo 179
  blz->istor[9]  = blz->slice;   /* spectrum slicing */
1229 slepc 180
  blz->istor[10] = eps->isgeneralized ? 1 : 0;   /* solutions refinement (purify) */
420 dsic.upv.es!antodo 181
  blz->istor[11] = 0;            /* level of printing */
6 dsic.upv.es!jroman 182
  blz->istor[12] = 6;            /* file unit for output */
1649 slepc 183
  blz->istor[13] = PetscBLASIntCast(MPI_Comm_c2f(((PetscObject)eps)->comm)); /* communicator */
6 dsic.upv.es!jroman 184
 
185
  blz->rstor[2]  = eps->tol;     /* threshold for convergence */
186
 
187
  lflag = 0;           /* reverse communication interface flag */
188
 
422 dsic.upv.es!antodo 189
  do {
2331 jroman 190
    BLZpack_(blz->istor,blz->rstor,&sigma,&nneig,blz->u,blz->v,&lflag,&nvopu,blz->eig,pV);
6 dsic.upv.es!jroman 191
 
422 dsic.upv.es!antodo 192
    switch (lflag) {
193
    case 1:
6 dsic.upv.es!jroman 194
      /* compute v = OP u */
195
      for (i=0;i<nvopu;i++) {
2331 jroman 196
        ierr = VecPlaceArray(x,blz->u+i*eps->nloc);CHKERRQ(ierr);
197
        ierr = VecPlaceArray(y,blz->v+i*eps->nloc);CHKERRQ(ierr);
1229 slepc 198
        if (blz->slice || eps->isgeneralized) {
2331 jroman 199
          ierr = STAssociatedKSPSolve(eps->OP,x,y);CHKERRQ(ierr);
2316 jroman 200
        } else {
2331 jroman 201
          ierr = STApply(eps->OP,x,y);CHKERRQ(ierr);
2316 jroman 202
        }
1755 antodo 203
        ierr = IPOrthogonalize(eps->ip,0,PETSC_NULL,eps->nds,PETSC_NULL,eps->DS,y,PETSC_NULL,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
850 dsic.upv.es!antodo 204
        ierr = VecResetArray(x);CHKERRQ(ierr);
2316 jroman 205
        ierr = VecResetArray(y);CHKERRQ(ierr);
6 dsic.upv.es!jroman 206
      }
422 dsic.upv.es!antodo 207
      /* monitor */
208
      eps->nconv  = BLZistorr_(blz->istor,"NTEIG",5);
2313 jroman 209
      ierr = EPSMonitor(eps,eps->its,eps->nconv,
422 dsic.upv.es!antodo 210
        blz->rstor+BLZistorr_(blz->istor,"IRITZ",5),
211
        eps->eigi,
212
        blz->rstor+BLZistorr_(blz->istor,"IRITZ",5)+BLZistorr_(blz->istor,"JT",2),
2313 jroman 213
        BLZistorr_(blz->istor,"NRITZ",5));CHKERRQ(ierr);
624 dsic.upv.es!antodo 214
      eps->its = eps->its + 1;
422 dsic.upv.es!antodo 215
      if (eps->its >= eps->max_it || eps->nconv >= eps->nev) lflag = 5;
216
      break;
217
    case 2:  
6 dsic.upv.es!jroman 218
      /* compute v = B u */
219
      for (i=0;i<nvopu;i++) {
2331 jroman 220
        ierr = VecPlaceArray(x,blz->u+i*eps->nloc);CHKERRQ(ierr);
221
        ierr = VecPlaceArray(y,blz->v+i*eps->nloc);CHKERRQ(ierr);
222
        ierr = IPApplyMatrix(eps->ip,x,y);CHKERRQ(ierr);
850 dsic.upv.es!antodo 223
        ierr = VecResetArray(x);CHKERRQ(ierr);
2316 jroman 224
        ierr = VecResetArray(y);CHKERRQ(ierr);
6 dsic.upv.es!jroman 225
      }
422 dsic.upv.es!antodo 226
      break;
227
    case 3:  
6 dsic.upv.es!jroman 228
      /* update shift */
2499 jroman 229
      ierr = PetscInfo1(eps,"Factorization update (sigma=%g)\n",sigma);CHKERRQ(ierr);
420 dsic.upv.es!antodo 230
      ierr = STSetShift(eps->OP,sigma);CHKERRQ(ierr);
231
      ierr = STGetKSP(eps->OP,&ksp);CHKERRQ(ierr);
232
      ierr = KSPGetPC(ksp,&pc);CHKERRQ(ierr);
1649 slepc 233
      ierr = PCFactorGetMatrix(pc,&A);CHKERRQ(ierr);
1089 slepc 234
      ierr = MatGetInertia(A,&nn,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
1649 slepc 235
      nneig = PetscBLASIntCast(nn);
422 dsic.upv.es!antodo 236
      break;
237
    case 4:  
6 dsic.upv.es!jroman 238
      /* copy the initial vector */
239
      ierr = VecPlaceArray(x,blz->v);CHKERRQ(ierr);
1229 slepc 240
      ierr = EPSGetStartVector(eps,0,x,PETSC_NULL);CHKERRQ(ierr);
850 dsic.upv.es!antodo 241
      ierr = VecResetArray(x);CHKERRQ(ierr);
422 dsic.upv.es!antodo 242
      break;
6 dsic.upv.es!jroman 243
    }
422 dsic.upv.es!antodo 244
 
245
  } while (lflag > 0);
6 dsic.upv.es!jroman 246
 
2331 jroman 247
  ierr = VecRestoreArray(eps->V[0],&pV);CHKERRQ(ierr);
6 dsic.upv.es!jroman 248
 
249
  eps->nconv  = BLZistorr_(blz->istor,"NTEIG",5);
250
  eps->reason = EPS_CONVERGED_TOL;
251
 
252
  for (i=0;i<eps->nconv;i++) {
253
    eps->eigr[i]=blz->eig[i];
254
  }
255
 
114 dsic.upv.es!antodo 256
  if (lflag!=0) {
257
    char msg[2048] = "";
258
    for (i = 0; i < 33; i++) {
2331 jroman 259
      if (blz->istor[15] & (1 << i)) PetscStrcat(msg,blzpack_error[i]);
114 dsic.upv.es!antodo 260
    }
2331 jroman 261
    SETERRQ2(((PetscObject)eps)->comm,PETSC_ERR_LIB,"Error in BLZPACK (code=%d): '%s'",blz->istor[15],msg);
114 dsic.upv.es!antodo 262
  }
2305 jroman 263
  ierr = VecDestroy(&x);CHKERRQ(ierr);
264
  ierr = VecDestroy(&y);CHKERRQ(ierr);
6 dsic.upv.es!jroman 265
  PetscFunctionReturn(0);
266
}
267
 
268
#undef __FUNCT__  
420 dsic.upv.es!antodo 269
#define __FUNCT__ "EPSBackTransform_BLZPACK"
476 dsic.upv.es!antodo 270
PetscErrorCode EPSBackTransform_BLZPACK(EPS eps)
420 dsic.upv.es!antodo 271
{
476 dsic.upv.es!antodo 272
  PetscErrorCode ierr;
273
  EPS_BLZPACK    *blz = (EPS_BLZPACK *)eps->data;
420 dsic.upv.es!antodo 274
 
275
  PetscFunctionBegin;
1229 slepc 276
  if (!blz->slice && !eps->isgeneralized) {
442 dsic.upv.es!antodo 277
    ierr = EPSBackTransform_Default(eps);CHKERRQ(ierr);
278
  }
420 dsic.upv.es!antodo 279
  PetscFunctionReturn(0);
280
}
281
 
282
#undef __FUNCT__  
2348 jroman 283
#define __FUNCT__ "EPSReset_BLZPACK"
284
PetscErrorCode EPSReset_BLZPACK(EPS eps)
6 dsic.upv.es!jroman 285
{
476 dsic.upv.es!antodo 286
  PetscErrorCode ierr;
287
  EPS_BLZPACK    *blz = (EPS_BLZPACK *)eps->data;
6 dsic.upv.es!jroman 288
 
289
  PetscFunctionBegin;
1040 slepc 290
  ierr = PetscFree(blz->istor);CHKERRQ(ierr);
291
  ierr = PetscFree(blz->rstor);CHKERRQ(ierr);
292
  ierr = PetscFree(blz->u);CHKERRQ(ierr);
293
  ierr = PetscFree(blz->v);CHKERRQ(ierr);
294
  ierr = PetscFree(blz->eig);CHKERRQ(ierr);
2348 jroman 295
  ierr = EPSFreeSolution(eps);CHKERRQ(ierr);
296
  PetscFunctionReturn(0);
297
}
298
 
299
#undef __FUNCT__  
300
#define __FUNCT__ "EPSDestroy_BLZPACK"
301
PetscErrorCode EPSDestroy_BLZPACK(EPS eps)
302
{
303
  PetscErrorCode ierr;
304
 
305
  PetscFunctionBegin;
1040 slepc 306
  ierr = PetscFree(eps->data);CHKERRQ(ierr);
1925 jroman 307
  ierr = PetscObjectComposeFunctionDynamic((PetscObject)eps,"EPSBlzpackSetBlockSize_C","",PETSC_NULL);CHKERRQ(ierr);
308
  ierr = PetscObjectComposeFunctionDynamic((PetscObject)eps,"EPSBlzpackSetInterval_C","",PETSC_NULL);CHKERRQ(ierr);
309
  ierr = PetscObjectComposeFunctionDynamic((PetscObject)eps,"EPSBlzpackSetNSteps_C","",PETSC_NULL);CHKERRQ(ierr);
6 dsic.upv.es!jroman 310
  PetscFunctionReturn(0);
311
}
312
 
313
#undef __FUNCT__  
314
#define __FUNCT__ "EPSView_BLZPACK"
476 dsic.upv.es!antodo 315
PetscErrorCode EPSView_BLZPACK(EPS eps,PetscViewer viewer)
6 dsic.upv.es!jroman 316
{
476 dsic.upv.es!antodo 317
  PetscErrorCode ierr;
2331 jroman 318
  EPS_BLZPACK    *blz = (EPS_BLZPACK*)eps->data;
2216 jroman 319
  PetscBool      isascii;
6 dsic.upv.es!jroman 320
 
321
  PetscFunctionBegin;
2215 jroman 322
  ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii);CHKERRQ(ierr);
6 dsic.upv.es!jroman 323
  if (!isascii) {
2214 jroman 324
    SETERRQ1(((PetscObject)eps)->comm,1,"Viewer type %s not supported for EPSBLZPACK",((PetscObject)viewer)->type_name);
6 dsic.upv.es!jroman 325
  }
2365 jroman 326
  ierr = PetscViewerASCIIPrintf(viewer,"  BLZPACK: block size=%d\n",blz->block_size);CHKERRQ(ierr);
327
  ierr = PetscViewerASCIIPrintf(viewer,"  BLZPACK: computational interval [%f,%f]\n",blz->initial,blz->final);CHKERRQ(ierr);
6 dsic.upv.es!jroman 328
  PetscFunctionReturn(0);
329
}
330
 
331
#undef __FUNCT__  
332
#define __FUNCT__ "EPSSetFromOptions_BLZPACK"
476 dsic.upv.es!antodo 333
PetscErrorCode EPSSetFromOptions_BLZPACK(EPS eps)
6 dsic.upv.es!jroman 334
{
476 dsic.upv.es!antodo 335
  PetscErrorCode ierr;
336
  EPS_BLZPACK    *blz = (EPS_BLZPACK *)eps->data;
1089 slepc 337
  PetscInt       bs,n;
476 dsic.upv.es!antodo 338
  PetscReal      interval[2];
2216 jroman 339
  PetscBool      flg;
476 dsic.upv.es!antodo 340
  KSP            ksp;
341
  PC             pc;
6 dsic.upv.es!jroman 342
 
343
  PetscFunctionBegin;
2384 jroman 344
  ierr = PetscOptionsHead("EPS BLZPACK Options");CHKERRQ(ierr);
6 dsic.upv.es!jroman 345
 
444 dsic.upv.es!antodo 346
  bs = blz->block_size;
347
  ierr = PetscOptionsInt("-eps_blzpack_block_size","Block size","EPSBlzpackSetBlockSize",bs,&bs,&flg);CHKERRQ(ierr);
348
  if (flg) {ierr = EPSBlzpackSetBlockSize(eps,bs);CHKERRQ(ierr);}
6 dsic.upv.es!jroman 349
 
444 dsic.upv.es!antodo 350
  n = blz->nsteps;
351
  ierr = PetscOptionsInt("-eps_blzpack_nsteps","Number of steps","EPSBlzpackSetNSteps",n,&n,&flg);CHKERRQ(ierr);
352
  if (flg) {ierr = EPSBlzpackSetNSteps(eps,n);CHKERRQ(ierr);}
422 dsic.upv.es!antodo 353
 
444 dsic.upv.es!antodo 354
  interval[0] = blz->initial;
355
  interval[1] = blz->final;
356
  n = 2;
357
  ierr = PetscOptionsRealArray("-eps_blzpack_interval","Computational interval","EPSBlzpackSetInterval",interval,&n,&flg);CHKERRQ(ierr);
358
  if (flg) {
359
    if (n==1) interval[1]=interval[0];
360
    ierr = EPSBlzpackSetInterval(eps,interval[0],interval[1]);CHKERRQ(ierr);
361
  }
6 dsic.upv.es!jroman 362
 
1229 slepc 363
  if (blz->slice || eps->isgeneralized) {
2092 jroman 364
    ierr = STSetType(eps->OP,STSINVERT);CHKERRQ(ierr);
444 dsic.upv.es!antodo 365
    ierr = STGetKSP(eps->OP,&ksp);CHKERRQ(ierr);
366
    ierr = KSPSetType(ksp,KSPPREONLY);CHKERRQ(ierr);
367
    ierr = KSPGetPC(ksp,&pc);CHKERRQ(ierr);
368
    ierr = PCSetType(pc,PCCHOLESKY);CHKERRQ(ierr);
369
  }
370
 
2384 jroman 371
  ierr = PetscOptionsTail();CHKERRQ(ierr);
6 dsic.upv.es!jroman 372
  PetscFunctionReturn(0);
373
}
374
 
375
EXTERN_C_BEGIN
376
#undef __FUNCT__  
377
#define __FUNCT__ "EPSBlzpackSetBlockSize_BLZPACK"
1509 slepc 378
PetscErrorCode EPSBlzpackSetBlockSize_BLZPACK(EPS eps,PetscInt bs)
6 dsic.upv.es!jroman 379
{
2331 jroman 380
  EPS_BLZPACK *blz = (EPS_BLZPACK*)eps->data;;
6 dsic.upv.es!jroman 381
 
382
  PetscFunctionBegin;
211 dsic.upv.es!antodo 383
  if (bs == PETSC_DEFAULT) blz->block_size = 3;
384
  else if (bs <= 0) {
2331 jroman 385
    SETERRQ(((PetscObject)eps)->comm,1,"Incorrect block size");
1649 slepc 386
  } else blz->block_size = PetscBLASIntCast(bs);
6 dsic.upv.es!jroman 387
  PetscFunctionReturn(0);
388
}
389
EXTERN_C_END
390
 
391
#undef __FUNCT__  
392
#define __FUNCT__ "EPSBlzpackSetBlockSize"
393
/*@
394
   EPSBlzpackSetBlockSize - Sets the block size for the BLZPACK package.
395
 
396
   Collective on EPS
397
 
398
   Input Parameters:
399
+  eps - the eigenproblem solver context
400
-  bs - block size
401
 
402
   Options Database Key:
403
.  -eps_blzpack_block_size - Sets the value of the block size
404
 
405
   Level: advanced
406
 
553 dsic.upv.es!jroman 407
.seealso: EPSBlzpackSetInterval()
6 dsic.upv.es!jroman 408
@*/
1509 slepc 409
PetscErrorCode EPSBlzpackSetBlockSize(EPS eps,PetscInt bs)
6 dsic.upv.es!jroman 410
{
2221 jroman 411
  PetscErrorCode ierr;
6 dsic.upv.es!jroman 412
 
413
  PetscFunctionBegin;
2213 jroman 414
  PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
2326 jroman 415
  PetscValidLogicalCollectiveInt(eps,bs,2);
2221 jroman 416
  ierr = PetscTryMethod(eps,"EPSBlzpackSetBlockSize_C",(EPS,PetscInt),(eps,bs));CHKERRQ(ierr);
6 dsic.upv.es!jroman 417
  PetscFunctionReturn(0);
418
}
419
 
420
EXTERN_C_BEGIN
421
#undef __FUNCT__  
422
#define __FUNCT__ "EPSBlzpackSetInterval_BLZPACK"
476 dsic.upv.es!antodo 423
PetscErrorCode EPSBlzpackSetInterval_BLZPACK(EPS eps,PetscReal initial,PetscReal final)
6 dsic.upv.es!jroman 424
{
1229 slepc 425
  PetscErrorCode ierr;
2331 jroman 426
  EPS_BLZPACK *blz = (EPS_BLZPACK*)eps->data;;
6 dsic.upv.es!jroman 427
 
428
  PetscFunctionBegin;
429
  blz->initial    = initial;
430
  blz->final      = final;
420 dsic.upv.es!antodo 431
  blz->slice      = 1;
1229 slepc 432
  ierr = STSetShift(eps->OP,initial);CHKERRQ(ierr);
6 dsic.upv.es!jroman 433
  PetscFunctionReturn(0);
434
}
435
EXTERN_C_END
436
 
437
#undef __FUNCT__  
438
#define __FUNCT__ "EPSBlzpackSetInterval"
439
/*@
440
   EPSBlzpackSetInterval - Sets the computational interval for the BLZPACK
441
   package.
442
 
443
   Collective on EPS
444
 
445
   Input Parameters:
446
+  eps     - the eigenproblem solver context
447
.  initial - lower bound of the interval
448
-  final   - upper bound of the interval
449
 
450
   Options Database Key:
451
.  -eps_blzpack_interval - Sets the bounds of the interval (two values
452
   separated by commas)
453
 
454
   Note:
455
   The following possibilities are accepted (see Blzpack user's guide for
456
   details).
457
     initial>final: start seeking for eigenpairs in the upper bound
458
     initial<final: start in the lower bound
459
     initial=final: run around a single value (no interval)
460
 
461
   Level: advanced
462
 
463
.seealso: EPSBlzpackSetBlockSize()
464
@*/
476 dsic.upv.es!antodo 465
PetscErrorCode EPSBlzpackSetInterval(EPS eps,PetscReal initial,PetscReal final)
6 dsic.upv.es!jroman 466
{
2221 jroman 467
  PetscErrorCode ierr;
6 dsic.upv.es!jroman 468
 
469
  PetscFunctionBegin;
2213 jroman 470
  PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
2326 jroman 471
  PetscValidLogicalCollectiveReal(eps,initial,2);
472
  PetscValidLogicalCollectiveReal(eps,final,3);
2221 jroman 473
  ierr = PetscTryMethod(eps,"EPSBlzpackSetInterval_C",(EPS,PetscReal,PetscReal),(eps,initial,final));CHKERRQ(ierr);
6 dsic.upv.es!jroman 474
  PetscFunctionReturn(0);
475
}
476
 
477
EXTERN_C_BEGIN
478
#undef __FUNCT__  
422 dsic.upv.es!antodo 479
#define __FUNCT__ "EPSBlzpackSetNSteps_BLZPACK"
1509 slepc 480
PetscErrorCode EPSBlzpackSetNSteps_BLZPACK(EPS eps,PetscInt nsteps)
422 dsic.upv.es!antodo 481
{
2331 jroman 482
  EPS_BLZPACK *blz = (EPS_BLZPACK*)eps->data;
422 dsic.upv.es!antodo 483
 
484
  PetscFunctionBegin;
1649 slepc 485
  if (nsteps == PETSC_DEFAULT) blz->nsteps = 0;
486
  else { blz->nsteps = PetscBLASIntCast(nsteps); }
422 dsic.upv.es!antodo 487
  PetscFunctionReturn(0);
488
}
489
EXTERN_C_END
490
 
491
#undef __FUNCT__  
492
#define __FUNCT__ "EPSBlzpackSetNSteps"
493
/*@
494
   EPSBlzpackSetNSteps - Sets the maximum number of steps per run for the BLZPACK
495
   package.
496
 
497
   Collective on EPS
498
 
499
   Input Parameters:
500
+  eps     - the eigenproblem solver context
501
-  nsteps  - maximum number of steps
502
 
503
   Options Database Key:
424 dsic.upv.es!antodo 504
.  -eps_blzpack_nsteps - Sets the maximum number of steps per run
422 dsic.upv.es!antodo 505
 
506
   Level: advanced
507
 
508
@*/
1509 slepc 509
PetscErrorCode EPSBlzpackSetNSteps(EPS eps,PetscInt nsteps)
422 dsic.upv.es!antodo 510
{
2221 jroman 511
  PetscErrorCode ierr;
422 dsic.upv.es!antodo 512
 
513
  PetscFunctionBegin;
2213 jroman 514
  PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
2326 jroman 515
  PetscValidLogicalCollectiveInt(eps,nsteps,2);
2221 jroman 516
  ierr = PetscTryMethod(eps,"EPSBlzpackSetNSteps_C",(EPS,PetscInt),(eps,nsteps));CHKERRQ(ierr);
422 dsic.upv.es!antodo 517
  PetscFunctionReturn(0);
518
}
519
 
520
EXTERN_C_BEGIN
521
#undef __FUNCT__  
6 dsic.upv.es!jroman 522
#define __FUNCT__ "EPSCreate_BLZPACK"
476 dsic.upv.es!antodo 523
PetscErrorCode EPSCreate_BLZPACK(EPS eps)
6 dsic.upv.es!jroman 524
{
476 dsic.upv.es!antodo 525
  PetscErrorCode ierr;
526
  EPS_BLZPACK    *blzpack;
6 dsic.upv.es!jroman 527
 
528
  PetscFunctionBegin;
2329 jroman 529
  ierr = PetscNewLog(eps,EPS_BLZPACK,&blzpack);CHKERRQ(ierr);
2331 jroman 530
  eps->data                      = (void*)blzpack;
6 dsic.upv.es!jroman 531
  eps->ops->setup                = EPSSetUp_BLZPACK;
503 dsic.upv.es!antodo 532
  eps->ops->setfromoptions       = EPSSetFromOptions_BLZPACK;
6 dsic.upv.es!jroman 533
  eps->ops->destroy              = EPSDestroy_BLZPACK;
2348 jroman 534
  eps->ops->reset                = EPSReset_BLZPACK;
6 dsic.upv.es!jroman 535
  eps->ops->view                 = EPSView_BLZPACK;
420 dsic.upv.es!antodo 536
  eps->ops->backtransform        = EPSBackTransform_BLZPACK;
503 dsic.upv.es!antodo 537
  eps->ops->computevectors       = EPSComputeVectors_Default;
6 dsic.upv.es!jroman 538
 
211 dsic.upv.es!antodo 539
  blzpack->block_size = 3;
6 dsic.upv.es!jroman 540
  blzpack->initial = 0.0;
541
  blzpack->final = 0.0;
420 dsic.upv.es!antodo 542
  blzpack->slice = 0;
422 dsic.upv.es!antodo 543
  blzpack->nsteps = 0;
544
 
545
  ierr = PetscObjectComposeFunctionDynamic((PetscObject)eps,"EPSBlzpackSetBlockSize_C","EPSBlzpackSetBlockSize_BLZPACK",EPSBlzpackSetBlockSize_BLZPACK);CHKERRQ(ierr);
6 dsic.upv.es!jroman 546
  ierr = PetscObjectComposeFunctionDynamic((PetscObject)eps,"EPSBlzpackSetInterval_C","EPSBlzpackSetInterval_BLZPACK",EPSBlzpackSetInterval_BLZPACK);CHKERRQ(ierr);
422 dsic.upv.es!antodo 547
  ierr = PetscObjectComposeFunctionDynamic((PetscObject)eps,"EPSBlzpackSetNSteps_C","EPSBlzpackSetNSteps_BLZPACK",EPSBlzpackSetNSteps_BLZPACK);CHKERRQ(ierr);
6 dsic.upv.es!jroman 548
  PetscFunctionReturn(0);
549
}
550
EXTERN_C_END