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