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
2116 eromero 4
   Copyright (c) 2002-2010, Universidad 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,
2189 eromero 32
  PetscInt ini_size_V, PetscInt size_initV, PetscInt plusk, PC pc,
2037 eromero 33
  HarmType_t harmMode, KSP ksp, InitType_t init, PetscTruth 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 */
2442 eromero 54
    ierr = dvd_initV(d, b, ini_size_V, size_initV, init == DVD_INITV_KRYLOV);
55
    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 preconditioner */
2008 eromero 67
    ierr = dvd_static_precond_PC(d, b, pc); CHKERRQ(ierr);
1764 eromero 68
 
1867 eromero 69
    /* Setup the method for improving the eigenvectors */
2008 eromero 70
    ierr = dvd_improvex_jd(d, b, ksp, bs); CHKERRQ(ierr);
2012 eromero 71
    ierr = dvd_improvex_jd_proj_uv(d, b, DVD_PROJ_KBXX); CHKERRQ(ierr);
2008 eromero 72
    ierr = dvd_improvex_jd_lit_const(d, b, 0, 0.0, 0.0); CHKERRQ(ierr);
1743 eromero 73
  }
1619 slepc 74
 
75
  PetscFunctionReturn(0);
76
}
77
 
1867 eromero 78
 
1735 eromero 79
#undef __FUNCT__  
80
#define __FUNCT__ "dvd_schm_basic_conf"
1619 slepc 81
PetscErrorCode dvd_schm_basic_conf(dvdDashboard *d, dvdBlackboard *b,
2023 eromero 82
  PetscInt max_size_V, PetscInt mpd, PetscInt min_size_V, PetscInt bs,
2189 eromero 83
  PetscInt ini_size_V, PetscInt size_initV, PetscInt plusk, PC pc,
2023 eromero 84
  IP ip, HarmType_t harmMode, PetscTruth fixedTarget, PetscScalar t, KSP ksp,
2037 eromero 85
  PetscReal fix, InitType_t init, PetscTruth allResiduals)
1619 slepc 86
{
1867 eromero 87
  PetscInt        check_sum0, check_sum1, maxits;
1633 slepc 88
  Vec             *fv;
89
  PetscScalar     *fs;
1867 eromero 90
  PetscReal       tol;
91
  PetscErrorCode  ierr;
1619 slepc 92
 
93
  PetscFunctionBegin;
94
 
95
  b->state = DVD_STATE_CONF;
1976 eromero 96
  check_sum0 = DVD_CHECKSUM(b);
1619 slepc 97
  b->own_vecs = 0; b->own_scalars = 0;
1633 slepc 98
  fv = b->free_vecs; fs = b->free_scalars;
1619 slepc 99
 
100
  /* Setup basic management of V */
2023 eromero 101
  ierr = dvd_managementV_basic(d, b, bs, max_size_V, mpd, min_size_V, plusk,
2037 eromero 102
                        harmMode==DVD_HARM_NONE?PETSC_FALSE:PETSC_TRUE,
103
                        allResiduals);
2008 eromero 104
  CHKERRQ(ierr);
1619 slepc 105
 
1874 eromero 106
  /* Setup the initial subspace for V */
2442 eromero 107
  ierr = dvd_initV(d, b, ini_size_V, size_initV, init == DVD_INITV_KRYLOV);
108
  CHKERRQ(ierr);
1619 slepc 109
 
1991 eromero 110
  /* Setup the convergence in order to use the SLEPc convergence test */
2008 eromero 111
  ierr = dvd_testconv_slepc(d, b); CHKERRQ(ierr);
1619 slepc 112
 
113
  /* Setup Raileigh-Ritz for selecting the best eigenpairs in V */
2008 eromero 114
  ierr = dvd_calcpairs_qz(d, b, ip); CHKERRQ(ierr);
115
  if (harmMode != DVD_HARM_NONE) {
116
    ierr = dvd_harm_conf(d, b, harmMode, fixedTarget, t); CHKERRQ(ierr);
117
  }
1619 slepc 118
 
1867 eromero 119
  /* Setup the preconditioner */
2008 eromero 120
  ierr = dvd_static_precond_PC(d, b, pc); CHKERRQ(ierr);
1619 slepc 121
 
1867 eromero 122
  /* Setup the method for improving the eigenvectors */
2008 eromero 123
  ierr = dvd_improvex_jd(d, b, ksp, bs); CHKERRQ(ierr);
124
  ierr = dvd_improvex_jd_proj_uv(d, b, DVD_IS(d->sEP, DVD_EP_HERMITIAN)?
125
                                              DVD_PROJ_KBXZ:DVD_PROJ_KBXY);
126
  CHKERRQ(ierr);
1980 eromero 127
  ierr = KSPGetTolerances(ksp, &tol, PETSC_NULL, PETSC_NULL, &maxits);
128
  CHKERRQ(ierr);
2008 eromero 129
  ierr = dvd_improvex_jd_lit_const(d, b, maxits, tol, fix); CHKERRQ(ierr);
1867 eromero 130
 
1976 eromero 131
  check_sum1 = DVD_CHECKSUM(b);
1633 slepc 132
  if ((check_sum0 != check_sum1) ||
1883 eromero 133
      (b->free_vecs - fv > b->own_vecs) ||
134
      (b->free_scalars - fs > b->own_scalars))
1619 slepc 135
    SETERRQ(1, "Something awful happened!");
136
 
137
  PetscFunctionReturn(0);
138
}