| */ |
| typedef struct { |
| Vec *userV; /* custom initial search subspace */ |
| PetscInt size_userV, /* size of userV */ |
| k; /* desired initial subspace size */ |
| void *old_initV_data; /* old initV data */ |
| #undef __FUNCT__ |
| #define __FUNCT__ "dvd_initV_user" |
| PetscErrorCode dvd_initV_user(dvdDashboard *d, dvdBlackboard *b, Vec *userV, |
| PetscErrorCode dvd_initV_user(dvdDashboard *d, dvdBlackboard *b, |
| PetscInt size_userV, PetscInt k) |
| { |
| PetscErrorCode ierr; |
| ierr = PetscMalloc(sizeof(dvdInitV_User), &data); CHKERRQ(ierr); |
| data->k = k; |
| data->size_userV = size_userV; |
| data->userV = userV; |
| data->old_initV_data = d->initV_data; |
| d->initV_data = data; |
| d->initV = dvd_initV_user_0; |
| PetscFunctionBegin; |
| /* The user vectors are already in V */ |
| i = PetscMin(data->size_userV,d->max_size_V); |
| /* Generate a set of random initial vectors and orthonormalize them */ |
| for (i=0; i<PetscMin(data->size_userV,d->max_size_V); i++) { |
| ierr = VecCopy(data->userV[i], d->V[i]); CHKERRQ(ierr); |
| } |
| for (; i<PetscMin(data->k,d->max_size_V); i++) { |
| ierr = SlepcVecSetRandom(d->V[i], d->eps->rand); CHKERRQ(ierr); |
| } |
| ierr = EPSDAVIDSONGetFix_DAVIDSON(eps, &fix); CHKERRQ(ierr); |
| /* Orthonormalize the DS */ |
| ierr = dvd_orthV(eps->ip, PETSC_NULL, 0, PETSC_NULL, 0, eps->DS, 0, eps->nds, |
| PETSC_NULL, 0, eps->rand); CHKERRQ(ierr); |
| ierr = dvd_orthV(eps->ip, PETSC_NULL, 0, PETSC_NULL, 0, eps->DS, 0, |
| PetscAbs(eps->nds), PETSC_NULL, 0, eps->rand); CHKERRQ(ierr); |
| /* Preconfigure dvd */ |
| ierr = dvd_schm_basic_preconf(dvd, &b, eps->ncv, eps->mpd, min_size_V, bs, |
| initv, eps->IS, |
| eps->nini, |
| initv, |
| PetscAbs(eps->nini), |
| plusk, pc, harm, |
| PETSC_NULL, init, eps->trackall); |
| CHKERRQ(ierr); |
| /* Configure dvd for a basic GD */ |
| ierr = dvd_schm_basic_conf(dvd, &b, eps->ncv, eps->mpd, min_size_V, bs, |
| initv, eps->IS, |
| eps->nini, plusk, pc, |
| initv, |
| PetscAbs(eps->nini), plusk, pc, |
| eps->ip, harm, dvd->withTarget, |
| eps->target, ksp, |
| fix, init, eps->trackall); |
| #define __FUNCT__ "dvd_schm_basic_preconf" |
| PetscErrorCode dvd_schm_basic_preconf(dvdDashboard *d, dvdBlackboard *b, |
| PetscInt max_size_V, PetscInt mpd, PetscInt min_size_V, PetscInt bs, |
| PetscInt ini_size_V, Vec *initV, PetscInt size_initV, PetscInt plusk, PC pc, |
| PetscInt ini_size_V, PetscInt size_initV, PetscInt plusk, PC pc, |
| HarmType_t harmMode, KSP ksp, InitType_t init, PetscTruth allResiduals) |
| { |
| PetscErrorCode ierr; |
| CHKERRQ(ierr); |
| /* Setup the initial subspace for V */ |
| if (initV) { |
| ierr = dvd_initV_user(d, b, initV, size_initV, ini_size_V); CHKERRQ(ierr); |
| if (size_initV) { |
| ierr = dvd_initV_user(d, b, size_initV, ini_size_V); CHKERRQ(ierr); |
| } else switch(init) { |
| case DVD_INITV_CLASSIC: |
| ierr = dvd_initV_classic(d, b, ini_size_V); CHKERRQ(ierr); break; |
| case DVD_INITV_KRYLOV: |
| ierr = dvd_initV_krylov(d, b, ini_size_V); CHKERRQ(ierr); break; |
| } |
| } |
| /* Setup the convergence in order to use the SLEPc convergence test */ |
| ierr = dvd_testconv_slepc(d, b);CHKERRQ(ierr); |
| #define __FUNCT__ "dvd_schm_basic_conf" |
| PetscErrorCode dvd_schm_basic_conf(dvdDashboard *d, dvdBlackboard *b, |
| PetscInt max_size_V, PetscInt mpd, PetscInt min_size_V, PetscInt bs, |
| PetscInt ini_size_V, Vec *initV, PetscInt size_initV, PetscInt plusk, PC pc, |
| PetscInt ini_size_V, PetscInt size_initV, PetscInt plusk, PC pc, |
| IP ip, HarmType_t harmMode, PetscTruth fixedTarget, PetscScalar t, KSP ksp, |
| PetscReal fix, InitType_t init, PetscTruth allResiduals) |
| { |
| CHKERRQ(ierr); |
| /* Setup the initial subspace for V */ |
| if (initV) { |
| ierr = dvd_initV_user(d, b, initV, size_initV, ini_size_V); CHKERRQ(ierr); |
| if (size_initV) { |
| ierr = dvd_initV_user(d, b, size_initV, ini_size_V); CHKERRQ(ierr); |
| } else switch(init) { |
| case DVD_INITV_CLASSIC: |
| ierr = dvd_initV_classic(d, b, ini_size_V); CHKERRQ(ierr); break; |
| /* Routines for initV step */ |
| PetscErrorCode dvd_initV_classic(dvdDashboard *d, dvdBlackboard *b, PetscInt k); |
| PetscErrorCode dvd_initV_user(dvdDashboard *d, dvdBlackboard *b, Vec *userV, |
| PetscErrorCode dvd_initV_user(dvdDashboard *d, dvdBlackboard *b, |
| PetscInt size_userV, PetscInt k); |
| PetscErrorCode dvd_initV_krylov(dvdDashboard *d, dvdBlackboard *b, PetscInt k); |
| /* Methods */ |
| PetscErrorCode dvd_schm_basic_preconf(dvdDashboard *d, dvdBlackboard *b, |
| PetscInt max_size_V, PetscInt mpd, PetscInt min_size_V, PetscInt bs, |
| PetscInt ini_size_V, Vec *initV, PetscInt size_initV, PetscInt plusk, PC pc, |
| PetscInt ini_size_V, PetscInt size_initV, PetscInt plusk, PC pc, |
| HarmType_t harmMode, KSP ksp, InitType_t init, PetscTruth allResiduals); |
| PetscErrorCode dvd_schm_basic_conf(dvdDashboard *d, dvdBlackboard *b, |
| PetscInt max_size_V, PetscInt mpd, PetscInt min_size_V, PetscInt bs, |
| PetscInt ini_size_V, Vec *initV, PetscInt size_initV, PetscInt plusk, PC pc, |
| PetscInt ini_size_V, PetscInt size_initV, PetscInt plusk, PC pc, |
| IP ip, HarmType_t harmMode, PetscTruth fixedTarget, PetscScalar t, KSP ksp, |
| PetscReal fix, InitType_t init, PetscTruth allResiduals); |