Subversion Repositories slepc-dev

Rev

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

Rev Author Line No. Line
1619 slepc 1
 
1985 eromero 2
#include "davidson.h"
1619 slepc 3
 
1743 eromero 4
#define DVD_CHECKSUM(b) \
5
  ( (b)->max_size_V + (b)->max_size_auxV + (b)->max_size_auxS + \
6
    (b)->own_vecs + (b)->own_scalars + (b)->max_size_oldX )
1619 slepc 7
 
8
#undef __FUNCT__  
1735 eromero 9
#define __FUNCT__ "dvd_schm_basic_preconf"
1619 slepc 10
PetscErrorCode dvd_schm_basic_preconf(dvdDashboard *d, dvdBlackboard *b,
2023 eromero 11
  PetscInt max_size_V, PetscInt mpd, PetscInt min_size_V, PetscInt bs,
12
  PetscInt ini_size_V, Vec *initV, PetscInt size_initV, PetscInt plusk, PC pc,
2037 eromero 13
  HarmType_t harmMode, KSP ksp, InitType_t init, PetscTruth allResiduals)
1619 slepc 14
{
15
  PetscErrorCode ierr;
2023 eromero 16
  PetscInt       check_sum0, check_sum1;
1743 eromero 17
 
1619 slepc 18
  PetscFunctionBegin;
19
 
20
  ierr = PetscMemzero(b, sizeof(dvdBlackboard)); CHKERRQ(ierr);
21
  b->state = DVD_STATE_PRECONF;
22
 
1743 eromero 23
  for(check_sum0=-1,check_sum1=DVD_CHECKSUM(b); check_sum0 != check_sum1;
24
      check_sum0 = check_sum1, check_sum1 = DVD_CHECKSUM(b)) {
25
    b->own_vecs = b->own_scalars = 0;
1619 slepc 26
 
1743 eromero 27
    /* Setup basic management of V */
2023 eromero 28
    ierr = dvd_managementV_basic(d, b, bs, max_size_V, mpd, min_size_V, plusk,
2037 eromero 29
                               harmMode==DVD_HARM_NONE?PETSC_FALSE:PETSC_TRUE,
30
                               allResiduals);
2008 eromero 31
    CHKERRQ(ierr);
1743 eromero 32
 
1874 eromero 33
    /* Setup the initial subspace for V */
2008 eromero 34
    if (initV) {
35
      ierr = dvd_initV_user(d, b, initV, size_initV, ini_size_V); CHKERRQ(ierr);
36
    } else switch(init) {
37
    case DVD_INITV_CLASSIC:
38
      ierr = dvd_initV_classic(d, b, ini_size_V); CHKERRQ(ierr); break;
39
    case DVD_INITV_KRYLOV:
40
      ierr = dvd_initV_krylov(d, b, ini_size_V); CHKERRQ(ierr); break;
1883 eromero 41
                }
1743 eromero 42
 
1991 eromero 43
    /* Setup the convergence in order to use the SLEPc convergence test */
2008 eromero 44
    ierr = dvd_testconv_slepc(d, b);CHKERRQ(ierr);
1743 eromero 45
 
46
    /* Setup Raileigh-Ritz for selecting the best eigenpairs in V */
2008 eromero 47
    ierr = dvd_calcpairs_qz(d, b, PETSC_NULL); CHKERRQ(ierr);
48
    if (harmMode != DVD_HARM_NONE) {
49
      ierr = dvd_harm_conf(d, b, harmMode, PETSC_FALSE, 0.0); CHKERRQ(ierr);
50
    }
1743 eromero 51
 
1867 eromero 52
    /* Setup the preconditioner */
2008 eromero 53
    ierr = dvd_static_precond_PC(d, b, pc); CHKERRQ(ierr);
1764 eromero 54
 
1867 eromero 55
    /* Setup the method for improving the eigenvectors */
2008 eromero 56
    ierr = dvd_improvex_jd(d, b, ksp, bs); CHKERRQ(ierr);
2012 eromero 57
    ierr = dvd_improvex_jd_proj_uv(d, b, DVD_PROJ_KBXX); CHKERRQ(ierr);
2008 eromero 58
    ierr = dvd_improvex_jd_lit_const(d, b, 0, 0.0, 0.0); CHKERRQ(ierr);
1992 eromero 59
 
60
    /* Setup the profiler */
2008 eromero 61
    ierr = dvd_profiler(d, b); CHKERRQ(ierr);
1743 eromero 62
  }
1619 slepc 63
 
64
  PetscFunctionReturn(0);
65
}
66
 
1867 eromero 67
 
1735 eromero 68
#undef __FUNCT__  
69
#define __FUNCT__ "dvd_schm_basic_conf"
1619 slepc 70
PetscErrorCode dvd_schm_basic_conf(dvdDashboard *d, dvdBlackboard *b,
2023 eromero 71
  PetscInt max_size_V, PetscInt mpd, PetscInt min_size_V, PetscInt bs,
72
  PetscInt ini_size_V, Vec *initV, PetscInt size_initV, PetscInt plusk, PC pc,
73
  IP ip, HarmType_t harmMode, PetscTruth fixedTarget, PetscScalar t, KSP ksp,
2037 eromero 74
  PetscReal fix, InitType_t init, PetscTruth allResiduals)
1619 slepc 75
{
1867 eromero 76
  PetscInt        check_sum0, check_sum1, maxits;
1633 slepc 77
  Vec             *fv;
78
  PetscScalar     *fs;
1867 eromero 79
  PetscReal       tol;
80
  PetscErrorCode  ierr;
1619 slepc 81
 
82
  PetscFunctionBegin;
83
 
84
  b->state = DVD_STATE_CONF;
1976 eromero 85
  check_sum0 = DVD_CHECKSUM(b);
1619 slepc 86
  b->own_vecs = 0; b->own_scalars = 0;
1633 slepc 87
  fv = b->free_vecs; fs = b->free_scalars;
1619 slepc 88
 
89
  /* Setup basic management of V */
2023 eromero 90
  ierr = dvd_managementV_basic(d, b, bs, max_size_V, mpd, min_size_V, plusk,
2037 eromero 91
                        harmMode==DVD_HARM_NONE?PETSC_FALSE:PETSC_TRUE,
92
                        allResiduals);
2008 eromero 93
  CHKERRQ(ierr);
1619 slepc 94
 
1874 eromero 95
  /* Setup the initial subspace for V */
2008 eromero 96
  if (initV) {
97
    ierr = dvd_initV_user(d, b, initV, size_initV, ini_size_V); CHKERRQ(ierr);
98
  } else switch(init) {
99
  case DVD_INITV_CLASSIC:
100
    ierr = dvd_initV_classic(d, b, ini_size_V); CHKERRQ(ierr); break;
101
  case DVD_INITV_KRYLOV:
102
    ierr = dvd_initV_krylov(d, b, ini_size_V); CHKERRQ(ierr); break;
1883 eromero 103
  }
1619 slepc 104
 
1991 eromero 105
  /* Setup the convergence in order to use the SLEPc convergence test */
2008 eromero 106
  ierr = dvd_testconv_slepc(d, b); CHKERRQ(ierr);
1619 slepc 107
 
108
  /* Setup Raileigh-Ritz for selecting the best eigenpairs in V */
2008 eromero 109
  ierr = dvd_calcpairs_qz(d, b, ip); CHKERRQ(ierr);
110
  if (harmMode != DVD_HARM_NONE) {
111
    ierr = dvd_harm_conf(d, b, harmMode, fixedTarget, t); CHKERRQ(ierr);
112
  }
1619 slepc 113
 
1867 eromero 114
  /* Setup the preconditioner */
2008 eromero 115
  ierr = dvd_static_precond_PC(d, b, pc); CHKERRQ(ierr);
1619 slepc 116
 
1867 eromero 117
  /* Setup the method for improving the eigenvectors */
2008 eromero 118
  ierr = dvd_improvex_jd(d, b, ksp, bs); CHKERRQ(ierr);
119
  ierr = dvd_improvex_jd_proj_uv(d, b, DVD_IS(d->sEP, DVD_EP_HERMITIAN)?
120
                                              DVD_PROJ_KBXZ:DVD_PROJ_KBXY);
121
  CHKERRQ(ierr);
1980 eromero 122
  ierr = KSPGetTolerances(ksp, &tol, PETSC_NULL, PETSC_NULL, &maxits);
123
  CHKERRQ(ierr);
2008 eromero 124
  ierr = dvd_improvex_jd_lit_const(d, b, maxits, tol, fix); CHKERRQ(ierr);
1867 eromero 125
 
1992 eromero 126
  /* Setup the profiler */
2008 eromero 127
  ierr = dvd_profiler(d, b); CHKERRQ(ierr);
1992 eromero 128
 
1976 eromero 129
  check_sum1 = DVD_CHECKSUM(b);
1633 slepc 130
  if ((check_sum0 != check_sum1) ||
1883 eromero 131
      (b->free_vecs - fv > b->own_vecs) ||
132
      (b->free_scalars - fs > b->own_scalars))
1619 slepc 133
    SETERRQ(1, "Something awful happened!");
134
 
135
  PetscFunctionReturn(0);
136
}