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,
2605 eromero 31
  PetscInt mpd, PetscInt min_size_V, PetscInt bs,
2244 eromero 32
  PetscInt ini_size_V, PetscInt size_initV, PetscInt plusk,
2605 eromero 33
  HarmType_t harmMode, KSP ksp, InitType_t init, PetscBool allResiduals,
34
  orthoV_type_t orth, PetscInt cX_proj, PetscInt cX_impr)
1619 slepc 35
{
36
  PetscErrorCode ierr;
2023 eromero 37
  PetscInt       check_sum0, check_sum1;
1743 eromero 38
 
1619 slepc 39
  PetscFunctionBegin;
40
 
41
  ierr = PetscMemzero(b, sizeof(dvdBlackboard)); CHKERRQ(ierr);
42
  b->state = DVD_STATE_PRECONF;
43
 
1743 eromero 44
  for(check_sum0=-1,check_sum1=DVD_CHECKSUM(b); check_sum0 != check_sum1;
45
      check_sum0 = check_sum1, check_sum1 = DVD_CHECKSUM(b)) {
46
    b->own_vecs = b->own_scalars = 0;
1619 slepc 47
 
1743 eromero 48
    /* Setup basic management of V */
2605 eromero 49
    ierr = dvd_managementV_basic(d, b, bs, mpd, min_size_V, plusk,
2037 eromero 50
                               harmMode==DVD_HARM_NONE?PETSC_FALSE:PETSC_TRUE,
51
                               allResiduals);
2008 eromero 52
    CHKERRQ(ierr);
1743 eromero 53
 
1874 eromero 54
    /* Setup the initial subspace for V */
2454 eromero 55
    ierr = dvd_initV(d, b, ini_size_V, size_initV,
56
                     init==DVD_INITV_KRYLOV?PETSC_TRUE:PETSC_FALSE); CHKERRQ(ierr);
1743 eromero 57
 
1991 eromero 58
    /* Setup the convergence in order to use the SLEPc convergence test */
2008 eromero 59
    ierr = dvd_testconv_slepc(d, b);CHKERRQ(ierr);
1743 eromero 60
 
61
    /* Setup Raileigh-Ritz for selecting the best eigenpairs in V */
2605 eromero 62
    ierr = dvd_calcpairs_qz(d, b, orth, PETSC_NULL, cX_proj,
63
                harmMode==DVD_HARM_NONE?PETSC_FALSE:PETSC_TRUE); CHKERRQ(ierr);
2008 eromero 64
    if (harmMode != DVD_HARM_NONE) {
65
      ierr = dvd_harm_conf(d, b, harmMode, PETSC_FALSE, 0.0); CHKERRQ(ierr);
66
    }
1743 eromero 67
 
1867 eromero 68
    /* Setup the method for improving the eigenvectors */
2624 eromero 69
    ierr = dvd_improvex_jd(d, b, ksp, bs, cX_impr, PETSC_FALSE); CHKERRQ(ierr);
2605 eromero 70
    ierr = dvd_improvex_jd_proj_uv(d, b, DVD_PROJ_KZX); CHKERRQ(ierr);
2008 eromero 71
    ierr = dvd_improvex_jd_lit_const(d, b, 0, 0.0, 0.0); CHKERRQ(ierr);
1743 eromero 72
  }
1619 slepc 73
 
74
  PetscFunctionReturn(0);
75
}
76
 
1867 eromero 77
 
1735 eromero 78
#undef __FUNCT__  
79
#define __FUNCT__ "dvd_schm_basic_conf"
1619 slepc 80
PetscErrorCode dvd_schm_basic_conf(dvdDashboard *d, dvdBlackboard *b,
2605 eromero 81
  PetscInt mpd, PetscInt min_size_V, PetscInt bs,
2244 eromero 82
  PetscInt ini_size_V, PetscInt size_initV, PetscInt plusk,
2216 jroman 83
  IP ip, HarmType_t harmMode, PetscBool fixedTarget, PetscScalar t, KSP ksp,
2605 eromero 84
  PetscReal fix, InitType_t init, PetscBool allResiduals, orthoV_type_t orth,
2608 eromero 85
  PetscInt cX_proj, PetscInt cX_impr, PetscBool dynamic)
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 */
2605 eromero 101
  ierr = dvd_managementV_basic(d, b, bs, 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 */
2454 eromero 107
  ierr = dvd_initV(d, b, ini_size_V, size_initV,
108
                   init==DVD_INITV_KRYLOV?PETSC_TRUE:PETSC_FALSE); 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 */
2605 eromero 114
  ierr = dvd_calcpairs_qz(d, b, orth, ip, cX_proj,
115
                harmMode==DVD_HARM_NONE?PETSC_FALSE:PETSC_TRUE); CHKERRQ(ierr);
2008 eromero 116
  if (harmMode != DVD_HARM_NONE) {
117
    ierr = dvd_harm_conf(d, b, harmMode, fixedTarget, t); CHKERRQ(ierr);
118
  }
1619 slepc 119
 
1867 eromero 120
  /* Setup the method for improving the eigenvectors */
2624 eromero 121
  ierr = dvd_improvex_jd(d, b, ksp, bs, cX_impr, dynamic); CHKERRQ(ierr);
2605 eromero 122
  ierr = dvd_improvex_jd_proj_uv(d, b, DVD_PROJ_KZX);
2008 eromero 123
  CHKERRQ(ierr);
1980 eromero 124
  ierr = KSPGetTolerances(ksp, &tol, PETSC_NULL, PETSC_NULL, &maxits);
125
  CHKERRQ(ierr);
2008 eromero 126
  ierr = dvd_improvex_jd_lit_const(d, b, maxits, tol, fix); CHKERRQ(ierr);
1867 eromero 127
 
1976 eromero 128
  check_sum1 = DVD_CHECKSUM(b);
1633 slepc 129
  if ((check_sum0 != check_sum1) ||
1883 eromero 130
      (b->free_vecs - fv > b->own_vecs) ||
131
      (b->free_scalars - fs > b->own_scalars))
2214 jroman 132
    SETERRQ(PETSC_COMM_WORLD,1, "Something awful happened");
1619 slepc 133
 
134
  PetscFunctionReturn(0);
135
}