Subversion Repositories slepc-dev

Rev

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

Rev Author Line No. Line
2110 jroman 1
/*
2
   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3
   SLEPc - Scalable Library for Eigenvalue Problem Computations
2575 eromero 4
   Copyright (c) 2002-2011, Universitat Politecnica de Valencia, Spain
1619 slepc 5
 
2110 jroman 6
   This file is part of SLEPc.
7
 
8
   SLEPc is free software: you can redistribute it and/or modify it under  the
9
   terms of version 3 of the GNU Lesser General Public License as published by
10
   the Free Software Foundation.
11
 
12
   SLEPc  is  distributed in the hope that it will be useful, but WITHOUT  ANY
13
   WARRANTY;  without even the implied warranty of MERCHANTABILITY or  FITNESS
14
   FOR  A  PARTICULAR PURPOSE. See the GNU Lesser General Public  License  for
15
   more details.
16
 
17
   You  should have received a copy of the GNU Lesser General  Public  License
18
   along with SLEPc. If not, see <http://www.gnu.org/licenses/>.
19
   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
20
*/
21
 
1985 eromero 22
#include "davidson.h"
1619 slepc 23
 
1743 eromero 24
#define DVD_CHECKSUM(b) \
25
  ( (b)->max_size_V + (b)->max_size_auxV + (b)->max_size_auxS + \
26
    (b)->own_vecs + (b)->own_scalars + (b)->max_size_oldX )
1619 slepc 27
 
28
#undef __FUNCT__  
1735 eromero 29
#define __FUNCT__ "dvd_schm_basic_preconf"
1619 slepc 30
PetscErrorCode dvd_schm_basic_preconf(dvdDashboard *d, dvdBlackboard *b,
2023 eromero 31
  PetscInt max_size_V, PetscInt mpd, PetscInt min_size_V, PetscInt bs,
2244 eromero 32
  PetscInt ini_size_V, PetscInt size_initV, PetscInt plusk,
2216 jroman 33
  HarmType_t harmMode, KSP ksp, InitType_t init, PetscBool allResiduals)
1619 slepc 34
{
35
  PetscErrorCode ierr;
2023 eromero 36
  PetscInt       check_sum0, check_sum1;
1743 eromero 37
 
1619 slepc 38
  PetscFunctionBegin;
39
 
40
  ierr = PetscMemzero(b, sizeof(dvdBlackboard)); CHKERRQ(ierr);
41
  b->state = DVD_STATE_PRECONF;
42
 
1743 eromero 43
  for(check_sum0=-1,check_sum1=DVD_CHECKSUM(b); check_sum0 != check_sum1;
44
      check_sum0 = check_sum1, check_sum1 = DVD_CHECKSUM(b)) {
45
    b->own_vecs = b->own_scalars = 0;
1619 slepc 46
 
1743 eromero 47
    /* Setup basic management of V */
2023 eromero 48
    ierr = dvd_managementV_basic(d, b, bs, max_size_V, mpd, min_size_V, plusk,
2037 eromero 49
                               harmMode==DVD_HARM_NONE?PETSC_FALSE:PETSC_TRUE,
50
                               allResiduals);
2008 eromero 51
    CHKERRQ(ierr);
1743 eromero 52
 
1874 eromero 53
    /* Setup the initial subspace for V */
2454 eromero 54
    ierr = dvd_initV(d, b, ini_size_V, size_initV,
55
                     init==DVD_INITV_KRYLOV?PETSC_TRUE:PETSC_FALSE); CHKERRQ(ierr);
1743 eromero 56
 
1991 eromero 57
    /* Setup the convergence in order to use the SLEPc convergence test */
2008 eromero 58
    ierr = dvd_testconv_slepc(d, b);CHKERRQ(ierr);
1743 eromero 59
 
60
    /* Setup Raileigh-Ritz for selecting the best eigenpairs in V */
2008 eromero 61
    ierr = dvd_calcpairs_qz(d, b, PETSC_NULL); CHKERRQ(ierr);
62
    if (harmMode != DVD_HARM_NONE) {
63
      ierr = dvd_harm_conf(d, b, harmMode, PETSC_FALSE, 0.0); CHKERRQ(ierr);
64
    }
1743 eromero 65
 
1867 eromero 66
    /* Setup the method for improving the eigenvectors */
2008 eromero 67
    ierr = dvd_improvex_jd(d, b, ksp, bs); CHKERRQ(ierr);
2012 eromero 68
    ierr = dvd_improvex_jd_proj_uv(d, b, DVD_PROJ_KBXX); CHKERRQ(ierr);
2008 eromero 69
    ierr = dvd_improvex_jd_lit_const(d, b, 0, 0.0, 0.0); CHKERRQ(ierr);
1743 eromero 70
  }
1619 slepc 71
 
72
  PetscFunctionReturn(0);
73
}
74
 
1867 eromero 75
 
1735 eromero 76
#undef __FUNCT__  
77
#define __FUNCT__ "dvd_schm_basic_conf"
1619 slepc 78
PetscErrorCode dvd_schm_basic_conf(dvdDashboard *d, dvdBlackboard *b,
2023 eromero 79
  PetscInt max_size_V, PetscInt mpd, PetscInt min_size_V, PetscInt bs,
2244 eromero 80
  PetscInt ini_size_V, PetscInt size_initV, PetscInt plusk,
2216 jroman 81
  IP ip, HarmType_t harmMode, PetscBool fixedTarget, PetscScalar t, KSP ksp,
82
  PetscReal fix, InitType_t init, PetscBool allResiduals)
1619 slepc 83
{
1867 eromero 84
  PetscInt        check_sum0, check_sum1, maxits;
1633 slepc 85
  Vec             *fv;
86
  PetscScalar     *fs;
1867 eromero 87
  PetscReal       tol;
88
  PetscErrorCode  ierr;
1619 slepc 89
 
90
  PetscFunctionBegin;
91
 
92
  b->state = DVD_STATE_CONF;
1976 eromero 93
  check_sum0 = DVD_CHECKSUM(b);
1619 slepc 94
  b->own_vecs = 0; b->own_scalars = 0;
1633 slepc 95
  fv = b->free_vecs; fs = b->free_scalars;
1619 slepc 96
 
97
  /* Setup basic management of V */
2023 eromero 98
  ierr = dvd_managementV_basic(d, b, bs, max_size_V, mpd, min_size_V, plusk,
2037 eromero 99
                        harmMode==DVD_HARM_NONE?PETSC_FALSE:PETSC_TRUE,
100
                        allResiduals);
2008 eromero 101
  CHKERRQ(ierr);
1619 slepc 102
 
1874 eromero 103
  /* Setup the initial subspace for V */
2454 eromero 104
  ierr = dvd_initV(d, b, ini_size_V, size_initV,
105
                   init==DVD_INITV_KRYLOV?PETSC_TRUE:PETSC_FALSE); CHKERRQ(ierr);
1619 slepc 106
 
1991 eromero 107
  /* Setup the convergence in order to use the SLEPc convergence test */
2008 eromero 108
  ierr = dvd_testconv_slepc(d, b); CHKERRQ(ierr);
1619 slepc 109
 
110
  /* Setup Raileigh-Ritz for selecting the best eigenpairs in V */
2008 eromero 111
  ierr = dvd_calcpairs_qz(d, b, ip); CHKERRQ(ierr);
112
  if (harmMode != DVD_HARM_NONE) {
113
    ierr = dvd_harm_conf(d, b, harmMode, fixedTarget, t); CHKERRQ(ierr);
114
  }
1619 slepc 115
 
1867 eromero 116
  /* Setup the method for improving the eigenvectors */
2008 eromero 117
  ierr = dvd_improvex_jd(d, b, ksp, bs); CHKERRQ(ierr);
118
  ierr = dvd_improvex_jd_proj_uv(d, b, DVD_IS(d->sEP, DVD_EP_HERMITIAN)?
119
                                              DVD_PROJ_KBXZ:DVD_PROJ_KBXY);
120
  CHKERRQ(ierr);
1980 eromero 121
  ierr = KSPGetTolerances(ksp, &tol, PETSC_NULL, PETSC_NULL, &maxits);
122
  CHKERRQ(ierr);
2008 eromero 123
  ierr = dvd_improvex_jd_lit_const(d, b, maxits, tol, fix); CHKERRQ(ierr);
1867 eromero 124
 
1976 eromero 125
  check_sum1 = DVD_CHECKSUM(b);
1633 slepc 126
  if ((check_sum0 != check_sum1) ||
1883 eromero 127
      (b->free_vecs - fv > b->own_vecs) ||
128
      (b->free_scalars - fs > b->own_scalars))
2214 jroman 129
    SETERRQ(PETSC_COMM_WORLD,1, "Something awful happened");
1619 slepc 130
 
131
  PetscFunctionReturn(0);
132
}