Subversion Repositories slepc-dev

Rev

Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
535 dsic.upv.es!jroman 1
/*                      
6 dsic.upv.es!jroman 2
 
535 dsic.upv.es!jroman 3
   SLEPc eigensolver: "subspace"
4
 
5
   Method: Subspace Iteration
6
 
7
   Algorithm:
8
 
953 dsic.upv.es!jroman 9
       Subspace iteration with Rayleigh-Ritz projection and locking,
10
       based on the SRRIT implementation.
535 dsic.upv.es!jroman 11
 
12
   References:
13
 
953 dsic.upv.es!jroman 14
       [1] "Subspace Iteration in SLEPc", SLEPc Technical Report STR-3,
15
           available at http://www.grycap.upv.es/slepc.
535 dsic.upv.es!jroman 16
 
1673 slepc 17
   Last update: Feb 2009
535 dsic.upv.es!jroman 18
 
1376 slepc 19
   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1672 slepc 20
   SLEPc - Scalable Library for Eigenvalue Problem Computations
2575 eromero 21
   Copyright (c) 2002-2011, Universitat Politecnica de Valencia, Spain
1376 slepc 22
 
1672 slepc 23
   This file is part of SLEPc.
24
 
25
   SLEPc is free software: you can redistribute it and/or modify it under  the
26
   terms of version 3 of the GNU Lesser General Public License as published by
27
   the Free Software Foundation.
28
 
29
   SLEPc  is  distributed in the hope that it will be useful, but WITHOUT  ANY
30
   WARRANTY;  without even the implied warranty of MERCHANTABILITY or  FITNESS
31
   FOR  A  PARTICULAR PURPOSE. See the GNU Lesser General Public  License  for
32
   more details.
33
 
34
   You  should have received a copy of the GNU Lesser General  Public  License
35
   along with SLEPc. If not, see <http://www.gnu.org/licenses/>.
1376 slepc 36
   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
535 dsic.upv.es!jroman 37
*/
1376 slepc 38
 
2729 jroman 39
#include <slepc-private/epsimpl.h>                /*I "slepceps.h" I*/
2283 jroman 40
#include <slepcblaslapack.h>
6 dsic.upv.es!jroman 41
 
2324 jroman 42
PetscErrorCode EPSSolve_Subspace(EPS);
1947 jroman 43
 
1953 jroman 44
typedef struct {
45
  Vec *AV;
46
} EPS_SUBSPACE;
47
 
6 dsic.upv.es!jroman 48
#undef __FUNCT__  
2324 jroman 49
#define __FUNCT__ "EPSSetUp_Subspace"
50
PetscErrorCode EPSSetUp_Subspace(EPS eps)
6 dsic.upv.es!jroman 51
{
476 dsic.upv.es!antodo 52
  PetscErrorCode ierr;
2766 jroman 53
  EPS_SUBSPACE   *ctx = (EPS_SUBSPACE*)eps->data;
6 dsic.upv.es!jroman 54
 
55
  PetscFunctionBegin;
1583 slepc 56
  if (eps->ncv) { /* ncv set */
2214 jroman 57
    if (eps->ncv<eps->nev) SETERRQ(((PetscObject)eps)->comm,1,"The value of ncv must be at least nev");
6 dsic.upv.es!jroman 58
  }
1583 slepc 59
  else if (eps->mpd) { /* mpd set */
1928 jroman 60
    eps->ncv = PetscMin(eps->n,eps->nev+eps->mpd);
1583 slepc 61
  }
62
  else { /* neither set: defaults depend on nev being small or large */
1928 jroman 63
    if (eps->nev<500) eps->ncv = PetscMin(eps->n,PetscMax(2*eps->nev,eps->nev+15));
64
    else { eps->mpd = 500; eps->ncv = PetscMin(eps->n,eps->nev+eps->mpd); }
1583 slepc 65
  }
66
  if (!eps->mpd) eps->mpd = eps->ncv;
1928 jroman 67
  if (!eps->max_it) eps->max_it = PetscMax(100,2*eps->n/eps->ncv);
2613 jroman 68
  if (!eps->which) { ierr = EPSDefaultSetWhich(eps);CHKERRQ(ierr); }
2762 jroman 69
  if (eps->which!=EPS_LARGEST_MAGNITUDE && eps->which!=EPS_TARGET_MAGNITUDE) SETERRQ(((PetscObject)eps)->comm,1,"Wrong value of eps->which");
1560 slepc 70
  if (!eps->extraction) {
71
    ierr = EPSSetExtraction(eps,EPS_RITZ);CHKERRQ(ierr);
2762 jroman 72
  } else if (eps->extraction!=EPS_RITZ) SETERRQ(((PetscObject)eps)->comm,PETSC_ERR_SUP,"Unsupported extraction type\n");
1426 slepc 73
 
259 dsic.upv.es!antodo 74
  ierr = EPSAllocateSolution(eps);CHKERRQ(ierr);
2410 jroman 75
  ierr = VecDuplicateVecs(eps->t,eps->ncv,&ctx->AV);CHKERRQ(ierr);
2783 jroman 76
  if (eps->ishermitian) {
77
    ierr = PSSetType(eps->ps,PSHEP);CHKERRQ(ierr);
78
  } else {
79
    ierr = PSSetType(eps->ps,PSNHEP);CHKERRQ(ierr);
80
  }
2758 jroman 81
  ierr = PSAllocate(eps->ps,eps->ncv);CHKERRQ(ierr);
1755 antodo 82
  ierr = EPSDefaultGetWork(eps,1);CHKERRQ(ierr);
1947 jroman 83
 
84
  /* dispatch solve method */
2214 jroman 85
  if (eps->leftvecs) SETERRQ(((PetscObject)eps)->comm,PETSC_ERR_SUP,"Left vectors not supported in this solver");
2324 jroman 86
  eps->ops->solve = EPSSolve_Subspace;
6 dsic.upv.es!jroman 87
  PetscFunctionReturn(0);
88
}
89
 
90
#undef __FUNCT__  
2763 jroman 91
#define __FUNCT__ "EPSSubspaceFindGroup"
535 dsic.upv.es!jroman 92
/*
2763 jroman 93
   EPSSubspaceFindGroup - Find a group of nearly equimodular eigenvalues, provided
535 dsic.upv.es!jroman 94
   in arrays wr and wi, according to the tolerance grptol. Also the 2-norms
2763 jroman 95
   of the residuals must be passed in (rsd). Arrays are processed from index
535 dsic.upv.es!jroman 96
   l to index m only. The output information is:
97
 
98
   ngrp - number of entries of the group
893 dsic.upv.es!jroman 99
   ctr  - (w(l)+w(l+ngrp-1))/2
535 dsic.upv.es!jroman 100
   ae   - average of wr(l),...,wr(l+ngrp-1)
101
   arsd - average of rsd(l),...,rsd(l+ngrp-1)
102
*/
2763 jroman 103
static PetscErrorCode EPSSubspaceFindGroup(PetscInt l,PetscInt m,PetscScalar *wr,PetscScalar *wi,PetscReal *rsd,PetscReal grptol,PetscInt *ngrp,PetscReal *ctr,PetscReal *ae,PetscReal *arsd)
470 dsic.upv.es!antodo 104
{
1509 slepc 105
  PetscInt  i;
470 dsic.upv.es!antodo 106
  PetscReal rmod,rmod1;
6 dsic.upv.es!jroman 107
 
470 dsic.upv.es!antodo 108
  PetscFunctionBegin;
109
  *ngrp = 0;
110
  *ctr = 0;
504 dsic.upv.es!antodo 111
  rmod = SlepcAbsEigenvalue(wr[l],wi[l]);
6 dsic.upv.es!jroman 112
 
470 dsic.upv.es!antodo 113
  for (i=l;i<m;) {
504 dsic.upv.es!antodo 114
    rmod1 = SlepcAbsEigenvalue(wr[i],wi[i]);
470 dsic.upv.es!antodo 115
    if (PetscAbsReal(rmod-rmod1) > grptol*(rmod+rmod1)) break;
116
    *ctr = (rmod+rmod1)/2.0;
117
    if (wi[i] != 0.0) {
118
      (*ngrp)+=2;
119
      i+=2;
120
    } else {
121
      (*ngrp)++;
122
      i++;
6 dsic.upv.es!jroman 123
    }
470 dsic.upv.es!antodo 124
  }
6 dsic.upv.es!jroman 125
 
470 dsic.upv.es!antodo 126
  *ae = 0;
127
  *arsd = 0;
128
  if (*ngrp) {
129
    for (i=l;i<l+*ngrp;i++) {
130
      (*ae) += PetscRealPart(wr[i]);
131
      (*arsd) += rsd[i]*rsd[i];
6 dsic.upv.es!jroman 132
    }
470 dsic.upv.es!antodo 133
    *ae = *ae / *ngrp;
134
    *arsd = PetscSqrtScalar(*arsd / *ngrp);
6 dsic.upv.es!jroman 135
  }
136
  PetscFunctionReturn(0);
137
}
138
 
139
#undef __FUNCT__  
2763 jroman 140
#define __FUNCT__ "EPSSubspaceResidualNorms"
535 dsic.upv.es!jroman 141
/*
2763 jroman 142
   EPSSubspaceResidualNorms - Computes the column norms of residual vectors
1495 slepc 143
   OP*V(1:n,l:m) - V*T(1:m,l:m), where, on entry, OP*V has been computed and
535 dsic.upv.es!jroman 144
   stored in AV. ldt is the leading dimension of T. On exit, rsd(l) to
145
   rsd(m) contain the computed norms.
146
*/
2765 jroman 147
static PetscErrorCode EPSSubspaceResidualNorms(Vec *V,Vec *AV,PetscScalar *T,PetscInt l,PetscInt m,PetscInt ldt,Vec w,PetscReal *rsd)
6 dsic.upv.es!jroman 148
{
476 dsic.upv.es!antodo 149
  PetscErrorCode ierr;
1509 slepc 150
  PetscInt       i,k;
476 dsic.upv.es!antodo 151
  PetscScalar    t;
6 dsic.upv.es!jroman 152
 
153
  PetscFunctionBegin;
470 dsic.upv.es!antodo 154
  for (i=l;i<m;i++) {
2766 jroman 155
    if (i==m-1 || T[i+1+ldt*i]==0.0) k=i+1;
156
    else k=i+2;
2765 jroman 157
    ierr = VecCopy(AV[i],w);CHKERRQ(ierr);
158
    ierr = SlepcVecMAXPBY(w,1.0,-1.0,k,T+ldt*i,V);CHKERRQ(ierr);
159
    ierr = VecDot(w,w,&t);CHKERRQ(ierr);
470 dsic.upv.es!antodo 160
    rsd[i] = PetscRealPart(t);
6 dsic.upv.es!jroman 161
  }
470 dsic.upv.es!antodo 162
  for (i=l;i<m;i++) {
163
    if (i == m-1) {
2473 jroman 164
      rsd[i] = PetscSqrtReal(rsd[i]);  
470 dsic.upv.es!antodo 165
    } else if (T[i+1+(ldt*i)]==0.0) {
2473 jroman 166
      rsd[i] = PetscSqrtReal(rsd[i]);
470 dsic.upv.es!antodo 167
    } else {
2473 jroman 168
      rsd[i] = PetscSqrtReal((rsd[i]+rsd[i+1])/2.0);
470 dsic.upv.es!antodo 169
      rsd[i+1] = rsd[i];
170
      i++;
171
    }
172
  }
6 dsic.upv.es!jroman 173
  PetscFunctionReturn(0);
174
}
175
 
176
#undef __FUNCT__  
2324 jroman 177
#define __FUNCT__ "EPSSolve_Subspace"
178
PetscErrorCode EPSSolve_Subspace(EPS eps)
6 dsic.upv.es!jroman 179
{
476 dsic.upv.es!antodo 180
  PetscErrorCode ierr;
2766 jroman 181
  EPS_SUBSPACE   *ctx = (EPS_SUBSPACE*)eps->data;
2767 jroman 182
  PetscInt       i,k,ld,ngrp,nogrp,*itrsd,*itrsdold,
1583 slepc 183
                 nxtsrr,idsrr,idort,nxtort,nv,ncv = eps->ncv,its;
2766 jroman 184
  PetscScalar    *T,*U;
2028 jroman 185
  PetscReal      arsd,oarsd,ctr,octr,ae,oae,*rsd,norm,tcond=1.0;
2216 jroman 186
  PetscBool      breakdown;
470 dsic.upv.es!antodo 187
  /* Parameters */
1509 slepc 188
  PetscInt       init = 5;        /* Number of initial iterations */
535 dsic.upv.es!jroman 189
  PetscReal      stpfac = 1.5,    /* Max num of iter before next SRR step */
893 dsic.upv.es!jroman 190
                 alpha = 1.0,     /* Used to predict convergence of next residual */
191
                 beta = 1.1,      /* Used to predict convergence of next residual */
2763 jroman 192
                 grptol = 1e-8,   /* Tolerance for EPSSubspaceFindGroup */
535 dsic.upv.es!jroman 193
                 cnvtol = 1e-6;   /* Convergence criterion for cnv */
1509 slepc 194
  PetscInt       orttol = 2;      /* Number of decimal digits whose loss
535 dsic.upv.es!jroman 195
                                     can be tolerated in orthogonalization */
6 dsic.upv.es!jroman 196
 
197
  PetscFunctionBegin;
1220 slepc 198
  its = 0;
664 dsic.upv.es!antodo 199
  ierr = PetscMalloc(sizeof(PetscReal)*ncv,&rsd);CHKERRQ(ierr);
1509 slepc 200
  ierr = PetscMalloc(sizeof(PetscInt)*ncv,&itrsd);CHKERRQ(ierr);
201
  ierr = PetscMalloc(sizeof(PetscInt)*ncv,&itrsdold);CHKERRQ(ierr);
2769 jroman 202
  ierr = PSGetLeadingDimension(eps->ps,&ld);CHKERRQ(ierr);
535 dsic.upv.es!jroman 203
 
1598 slepc 204
  for (i=0;i<ncv;i++) {
664 dsic.upv.es!antodo 205
    rsd[i] = 0.0;
470 dsic.upv.es!antodo 206
    itrsd[i] = -1;
207
  }
208
 
1954 jroman 209
  /* Complete the initial basis with random vectors and orthonormalize them */
210
  k = eps->nini;
211
  while (k<ncv) {
2027 jroman 212
    ierr = SlepcVecSetRandom(eps->V[k],eps->rand);CHKERRQ(ierr);
1954 jroman 213
    ierr = IPOrthogonalize(eps->ip,eps->nds,eps->DS,k,PETSC_NULL,eps->V,eps->V[k],PETSC_NULL,&norm,&breakdown);CHKERRQ(ierr);
214
    if (norm>0.0 && !breakdown) {
215
      ierr = VecScale(eps->V[k],1.0/norm);CHKERRQ(ierr);
216
      k++;
217
    }
218
  }
219
 
470 dsic.upv.es!antodo 220
  while (eps->its<eps->max_it) {
1220 slepc 221
    eps->its++;
1583 slepc 222
    nv = PetscMin(eps->nconv+eps->mpd,ncv);
2763 jroman 223
    ierr = PSSetDimensions(eps->ps,nv,eps->nconv,0);CHKERRQ(ierr);
1220 slepc 224
 
535 dsic.upv.es!jroman 225
    /* Find group in previously computed eigenvalues */
2763 jroman 226
    ierr = EPSSubspaceFindGroup(eps->nconv,nv,eps->eigr,eps->eigi,rsd,grptol,&nogrp,&octr,&oae,&oarsd);CHKERRQ(ierr);
470 dsic.upv.es!antodo 227
 
2763 jroman 228
    /* AV(:,idx) = OP * V(:,idx) */
1583 slepc 229
    for (i=eps->nconv;i<nv;i++) {
1953 jroman 230
      ierr = STApply(eps->OP,eps->V[i],ctx->AV[i]);CHKERRQ(ierr);
231 dsic.upv.es!jroman 231
    }
6 dsic.upv.es!jroman 232
 
2763 jroman 233
    /* T(:,idx) = V' * AV(:,idx) */
234
    ierr = PSGetArray(eps->ps,PS_MAT_A,&T);CHKERRQ(ierr);
1583 slepc 235
    for (i=eps->nconv;i<nv;i++) {
2767 jroman 236
      ierr = VecMDot(ctx->AV[i],nv,eps->V,T+i*ld);CHKERRQ(ierr);
470 dsic.upv.es!antodo 237
    }
2763 jroman 238
    ierr = PSRestoreArray(eps->ps,PS_MAT_A,&T);CHKERRQ(ierr);
239
    ierr = PSSetState(eps->ps,PS_STATE_RAW);CHKERRQ(ierr);
6 dsic.upv.es!jroman 240
 
2763 jroman 241
    /* Solve projected problem */
242
    ierr = PSSolve(eps->ps,eps->eigr,eps->eigi);CHKERRQ(ierr);
243
    ierr = PSSort(eps->ps,eps->eigr,eps->eigi,eps->which_func,eps->which_ctx);CHKERRQ(ierr);
470 dsic.upv.es!antodo 244
 
2763 jroman 245
    /* Update vectors V(:,idx) = V * U(:,idx) */
246
    ierr = PSGetArray(eps->ps,PS_MAT_Q,&U);CHKERRQ(ierr);
2767 jroman 247
    ierr = SlepcUpdateVectors(nv,ctx->AV,eps->nconv,nv,U,ld,PETSC_FALSE);CHKERRQ(ierr);
248
    ierr = SlepcUpdateVectors(nv,eps->V,eps->nconv,nv,U,ld,PETSC_FALSE);CHKERRQ(ierr);
2763 jroman 249
    ierr = PSRestoreArray(eps->ps,PS_MAT_Q,&U);CHKERRQ(ierr);
470 dsic.upv.es!antodo 250
 
2028 jroman 251
    /* Convergence check */
2763 jroman 252
    ierr = PSGetArray(eps->ps,PS_MAT_A,&T);CHKERRQ(ierr);
2767 jroman 253
    ierr = EPSSubspaceResidualNorms(eps->V,ctx->AV,T,eps->nconv,nv,ld,eps->work[0],rsd);CHKERRQ(ierr);
2763 jroman 254
    ierr = PSRestoreArray(eps->ps,PS_MAT_A,&T);CHKERRQ(ierr);
6 dsic.upv.es!jroman 255
 
2028 jroman 256
    for (i=eps->nconv;i<nv;i++) {
257
      itrsdold[i] = itrsd[i];
258
      itrsd[i] = its;
259
      eps->errest[i] = rsd[i];
664 dsic.upv.es!antodo 260
    }
470 dsic.upv.es!antodo 261
 
262
    for (;;) {
535 dsic.upv.es!jroman 263
      /* Find group in currently computed eigenvalues */
2763 jroman 264
      ierr = EPSSubspaceFindGroup(eps->nconv,nv,eps->eigr,eps->eigi,eps->errest,grptol,&ngrp,&ctr,&ae,&arsd);CHKERRQ(ierr);
470 dsic.upv.es!antodo 265
      if (ngrp!=nogrp) break;
266
      if (ngrp==0) break;
267
      if (PetscAbsScalar(ae-oae)>ctr*cnvtol*(itrsd[eps->nconv]-itrsdold[eps->nconv])) break;
268
      if (arsd>ctr*eps->tol) break;
269
      eps->nconv = eps->nconv + ngrp;
1583 slepc 270
      if (eps->nconv>=nv) break;
470 dsic.upv.es!antodo 271
    }
272
 
2313 jroman 273
    ierr = EPSMonitor(eps,eps->its,eps->nconv,eps->eigr,eps->eigi,eps->errest,nv);CHKERRQ(ierr);
470 dsic.upv.es!antodo 274
    if (eps->nconv>=eps->nev) break;
275
 
535 dsic.upv.es!jroman 276
    /* Compute nxtsrr (iteration of next projection step) */
2331 jroman 277
    nxtsrr = PetscMin(eps->max_it,PetscMax((PetscInt)floor(stpfac*its),init));
470 dsic.upv.es!antodo 278
 
279
    if (ngrp!=nogrp || ngrp==0 || arsd>=oarsd) {
1220 slepc 280
      idsrr = nxtsrr - its;
470 dsic.upv.es!antodo 281
    } else {
1509 slepc 282
      idsrr = (PetscInt)floor(alpha+beta*(itrsdold[eps->nconv]-itrsd[eps->nconv])*log(arsd/eps->tol)/log(arsd/oarsd));
470 dsic.upv.es!antodo 283
      idsrr = PetscMax(1,idsrr);
284
    }
1220 slepc 285
    nxtsrr = PetscMin(nxtsrr,its+idsrr);
6 dsic.upv.es!jroman 286
 
535 dsic.upv.es!jroman 287
    /* Compute nxtort (iteration of next orthogonalization step) */
2766 jroman 288
    ierr = PSCond(eps->ps,&tcond);CHKERRQ(ierr);
1509 slepc 289
    idort = PetscMax(1,(PetscInt)floor(orttol/PetscMax(1,log10(tcond))));    
2331 jroman 290
    nxtort = PetscMin(its+idort,nxtsrr);
6 dsic.upv.es!jroman 291
 
470 dsic.upv.es!antodo 292
    /* V(:,idx) = AV(:,idx) */
1583 slepc 293
    for (i=eps->nconv;i<nv;i++) {
1953 jroman 294
      ierr = VecCopy(ctx->AV[i],eps->V[i]);CHKERRQ(ierr);
470 dsic.upv.es!antodo 295
    }
1220 slepc 296
    its++;
6 dsic.upv.es!jroman 297
 
535 dsic.upv.es!jroman 298
    /* Orthogonalization loop */
470 dsic.upv.es!antodo 299
    do {
1220 slepc 300
      while (its<nxtort) {
470 dsic.upv.es!antodo 301
 
535 dsic.upv.es!jroman 302
        /* AV(:,idx) = OP * V(:,idx) */
1583 slepc 303
        for (i=eps->nconv;i<nv;i++) {
1953 jroman 304
          ierr = STApply(eps->OP,eps->V[i],ctx->AV[i]);CHKERRQ(ierr);
470 dsic.upv.es!antodo 305
        }
306
 
535 dsic.upv.es!jroman 307
        /* V(:,idx) = AV(:,idx) with normalization */
1583 slepc 308
        for (i=eps->nconv;i<nv;i++) {
1953 jroman 309
          ierr = VecCopy(ctx->AV[i],eps->V[i]);CHKERRQ(ierr);
470 dsic.upv.es!antodo 310
          ierr = VecNorm(eps->V[i],NORM_INFINITY,&norm);CHKERRQ(ierr);
828 dsic.upv.es!antodo 311
          ierr = VecScale(eps->V[i],1/norm);CHKERRQ(ierr);
470 dsic.upv.es!antodo 312
        }
1220 slepc 313
        its++;
470 dsic.upv.es!antodo 314
      }
535 dsic.upv.es!jroman 315
      /* Orthonormalize vectors */
1583 slepc 316
      for (i=eps->nconv;i<nv;i++) {
1755 antodo 317
        ierr = IPOrthogonalize(eps->ip,eps->nds,eps->DS,i,PETSC_NULL,eps->V,eps->V[i],PETSC_NULL,&norm,&breakdown);CHKERRQ(ierr);
550 dsic.upv.es!antodo 318
        if (breakdown) {
2027 jroman 319
          ierr = SlepcVecSetRandom(eps->V[i],eps->rand);CHKERRQ(ierr);
1755 antodo 320
          ierr = IPOrthogonalize(eps->ip,eps->nds,eps->DS,i,PETSC_NULL,eps->V,eps->V[i],PETSC_NULL,&norm,&breakdown);CHKERRQ(ierr);
550 dsic.upv.es!antodo 321
        }
828 dsic.upv.es!antodo 322
        ierr = VecScale(eps->V[i],1/norm);CHKERRQ(ierr);
470 dsic.upv.es!antodo 323
      }
1220 slepc 324
      nxtort = PetscMin(its+idort,nxtsrr);
325
    } while (its<nxtsrr);
470 dsic.upv.es!antodo 326
  }
6 dsic.upv.es!jroman 327
 
664 dsic.upv.es!antodo 328
  ierr = PetscFree(rsd);CHKERRQ(ierr);
470 dsic.upv.es!antodo 329
  ierr = PetscFree(itrsd);CHKERRQ(ierr);
330
  ierr = PetscFree(itrsdold);CHKERRQ(ierr);
6 dsic.upv.es!jroman 331
 
2331 jroman 332
  if (eps->nconv == eps->nev) eps->reason = EPS_CONVERGED_TOL;
470 dsic.upv.es!antodo 333
  else eps->reason = EPS_DIVERGED_ITS;
2835 jroman 334
  /* truncate Schur decomposition and change the state to raw so that
335
     PSVectors() computes eigenvectors from scratch */
336
  ierr = PSSetDimensions(eps->ps,eps->nconv,0,0);CHKERRQ(ierr);
337
  ierr = PSSetState(eps->ps,PS_STATE_RAW);CHKERRQ(ierr);
470 dsic.upv.es!antodo 338
  PetscFunctionReturn(0);
339
}
340
 
1598 slepc 341
#undef __FUNCT__  
2348 jroman 342
#define __FUNCT__ "EPSReset_Subspace"
343
PetscErrorCode EPSReset_Subspace(EPS eps)
1598 slepc 344
{
345
  PetscErrorCode ierr;
2766 jroman 346
  EPS_SUBSPACE   *ctx = (EPS_SUBSPACE*)eps->data;
1598 slepc 347
 
348
  PetscFunctionBegin;
2410 jroman 349
  ierr = VecDestroyVecs(eps->ncv,&ctx->AV);CHKERRQ(ierr);
2348 jroman 350
  ierr = EPSReset_Default(eps);CHKERRQ(ierr);
1598 slepc 351
  PetscFunctionReturn(0);
352
}
353
 
2348 jroman 354
#undef __FUNCT__  
355
#define __FUNCT__ "EPSDestroy_Subspace"
356
PetscErrorCode EPSDestroy_Subspace(EPS eps)
357
{
358
  PetscErrorCode ierr;
359
 
360
  PetscFunctionBegin;
361
  ierr = PetscFree(eps->data);CHKERRQ(ierr);
362
  PetscFunctionReturn(0);
363
}
364
 
6 dsic.upv.es!jroman 365
EXTERN_C_BEGIN
366
#undef __FUNCT__  
2324 jroman 367
#define __FUNCT__ "EPSCreate_Subspace"
368
PetscErrorCode EPSCreate_Subspace(EPS eps)
6 dsic.upv.es!jroman 369
{
1953 jroman 370
  PetscErrorCode ierr;
371
 
6 dsic.upv.es!jroman 372
  PetscFunctionBegin;
2329 jroman 373
  ierr = PetscNewLog(eps,EPS_SUBSPACE,&eps->data);CHKERRQ(ierr);
2324 jroman 374
  eps->ops->setup                = EPSSetUp_Subspace;
375
  eps->ops->destroy              = EPSDestroy_Subspace;
2348 jroman 376
  eps->ops->reset                = EPSReset_Subspace;
176 dsic.upv.es!antodo 377
  eps->ops->backtransform        = EPSBackTransform_Default;
508 dsic.upv.es!antodo 378
  eps->ops->computevectors       = EPSComputeVectors_Schur;
6 dsic.upv.es!jroman 379
  PetscFunctionReturn(0);
380
}
381
EXTERN_C_END
382