| Line 162... |
Line 162... |
if (b->state >= DVD_STATE_CONF) {
|
if (b->state >= DVD_STATE_CONF) {
|
ierr = PetscMalloc(sizeof(dvdImprovex_jd), &data); CHKERRQ(ierr);
|
ierr = PetscMalloc(sizeof(dvdImprovex_jd), &data); CHKERRQ(ierr);
|
data->dynamic = dynamic;
|
data->dynamic = dynamic;
|
data->size_real_KZ = size_P;
|
data->size_real_KZ = size_P;
|
data->real_KZ = b->free_vecs; b->free_vecs+= data->size_real_KZ;
|
data->real_KZ = b->free_vecs; b->free_vecs+= data->size_real_KZ;
|
d->max_size_cX_in_impr = cX_impr;
|
d->max_cX_in_impr = cX_impr;
|
data->XKZ = b->free_scalars; b->free_scalars+= size_P*size_P;
|
data->XKZ = b->free_scalars; b->free_scalars+= size_P*size_P;
|
data->ldXKZ = size_P;
|
data->ldXKZ = size_P;
|
data->size_X = b->max_size_X;
|
data->size_X = b->max_size_X;
|
data->old_improveX_data = d->improveX_data;
|
data->old_improveX_data = d->improveX_data;
|
d->improveX_data = data;
|
d->improveX_data = data;
|
| Line 570... |
Line 570... |
kr <- K^{-1}*(A-eig*B)*X, being X <- V*pX[i_s..i_e-1], Y <- W*pY[i_s..i_e-1]
|
kr <- K^{-1}*(A-eig*B)*X, being X <- V*pX[i_s..i_e-1], Y <- W*pY[i_s..i_e-1]
|
where
|
where
|
auxV, 4*(i_e-i_s) auxiliar global vectors
|
auxV, 4*(i_e-i_s) auxiliar global vectors
|
pX,pY, the right and left eigenvectors of the projected system
|
pX,pY, the right and left eigenvectors of the projected system
|
ld, the leading dimension of pX and pY
|
ld, the leading dimension of pX and pY
|
auxS: max(8*bs*max_size_cX_in_proj,size_V*size_V)
|
auxS: max(8*bs*max_cX_in_proj,size_V*size_V)
|
*/
|
*/
|
PetscErrorCode dvd_improvex_jd_proj_cuv(dvdDashboard *d, PetscInt i_s,
|
PetscErrorCode dvd_improvex_jd_proj_cuv(dvdDashboard *d, PetscInt i_s,
|
PetscInt i_e, Vec **u, Vec **v, Vec *kr, Vec **auxV, PetscScalar **auxS,
|
PetscInt i_e, Vec **u, Vec **v, Vec *kr, Vec **auxV, PetscScalar **auxS,
|
PetscScalar *theta, PetscScalar *thetai, PetscScalar *pX, PetscScalar *pY,
|
PetscScalar *theta, PetscScalar *thetai, PetscScalar *pX, PetscScalar *pY,
|
PetscInt ld)
|
PetscInt ld)
|
| Line 590... |
Line 590... |
/* Check consistency */
|
/* Check consistency */
|
V_new = d->size_cX - data->size_cX;
|
V_new = d->size_cX - data->size_cX;
|
if (V_new > data->old_size_X) { SETERRQ(PETSC_COMM_SELF,1, "Consistency broken!"); }
|
if (V_new > data->old_size_X) { SETERRQ(PETSC_COMM_SELF,1, "Consistency broken!"); }
|
data->old_size_X = n;
|
data->old_size_X = n;
|
|
|
/* KZ <- KZ(rm:) */
|
/* KZ <- KZ(rm:rm+max_cX-1) */
|
rm = PetscMax(V_new+data->size_KZ-d->max_size_cX_in_impr, 0);
|
rm = PetscMax(V_new+data->size_KZ-d->max_cX_in_impr, 0);
|
if (rm > 0) for (i=rm; i<data->size_KZ+V_new; i++) {
|
for (i=0; i<d->max_cX_in_impr; i++) {
|
ierr = VecCopy(data->KZ[i], data->KZ[i-rm]);CHKERRQ(ierr);
|
ierr = VecCopy(data->KZ[i+rm], data->KZ[i]);CHKERRQ(ierr);
|
}
|
}
|
data->size_KZ+= V_new-rm;
|
|
data->size_cX = d->size_cX;
|
data->size_cX = d->size_cX;
|
|
|
/* XKZ <- XKZ(rm:,rm:) */
|
/* XKZ <- XKZ(rm:rm+max_cX-1,rm:rm+max_cX-1) */
|
if (rm > 0) for (i=rm; i<data->size_KZ+V_new; i++) {
|
for (i=0; i<d->max_cX_in_impr; i++) {
|
ierr = SlepcDenseCopy(&data->XKZ[i*data->ldXKZ+i], data->ldXKZ, &data->XKZ[(i-rm)*data->ldXKZ+i-rm], data->ldXKZ, data->size_KZ, 1);CHKERRQ(ierr);
|
ierr = SlepcDenseCopy(&data->XKZ[i*data->ldXKZ+i], data->ldXKZ, &data->XKZ[(i+rm)*data->ldXKZ+i+rm], data->ldXKZ, data->size_KZ, 1);CHKERRQ(ierr);
|
}
|
}
|
|
data->size_KZ = PetscMin(d->max_cX_in_impr, data->size_KZ+V_new);
|
|
|
/* Compute X, KZ and KR */
|
/* Compute X, KZ and KR */
|
*u = *auxV; *auxV+= n;
|
*u = *auxV; *auxV+= n;
|
*v = &data->KZ[data->size_KZ];
|
*v = &data->KZ[data->size_KZ];
|
ierr = d->improvex_jd_proj_uv(d, i_s, i_e, *u, *v, kr, *auxV, theta, thetai,
|
ierr = d->improvex_jd_proj_uv(d, i_s, i_e, *u, *v, kr, *auxV, theta, thetai,
|