| } |
| /* Check consistency */ |
| if (d->size_V != d->V_new_e || d->size_V != d->size_H || |
| if (d->size_V != d->V_new_e || d->size_V+d->cX_in_H != d->size_H || |
| d->size_V != d->size_AV || d->cX_in_H != d->cX_in_AV || |
| (DVD_ISNOT(d->sEP, DVD_EP_STD) && ( |
| d->size_V != d->size_G || d->cX_in_H != d->cX_in_G || |
| d->size_V+d->cX_in_G != d->size_G || d->cX_in_H != d->cX_in_G || |
| d->size_H != d->size_G || (d->BV && ( |
| d->size_V != d->size_BV || d->cX_in_H != d->cX_in_BV)))) || |
| (d->W && d->size_W != d->size_V)) { |
| *max_size_BV-= d->V_tra_s; |
| *size_BV = d->V_tra_e - d->V_tra_s; |
| if (size_cBV) *size_cBV = *BV - real_BV; |
| if (cX_in_proj) *cX_in_proj = *BV - real_BV; |
| } else { /* !BV_shift */ |
| /* BV <- BV*MTX(V_tra_s:) */ |
| ierr = SlepcUpdateVectorsZ(*BV, 0.0, 1.0, *BV, *size_BV, |
| npreconv = PetscMax(PetscMin(d->nev - d->nconv, npreconv), 0); |
| #endif |
| if (d->npreconv == 0) { PetscFunctionReturn(0); } |
| if (npreconv <= d->cX_in_H) { PetscFunctionReturn(0); } |
| #if !defined(PETSC_USE_COMPLEX) |
| /* Correct the order of the conjugate eigenpairs */ |
| if (d->T) for (i=0; i<npreconv; i++) if (d->eigi[i] != 0.0) { |
| if (d->T) for (i=0; i<npreconv-d->cX_in_H; i++) if (d->eigi[i] != 0.0) { |
| if (d->eigi[i] < 0.0) { |
| d->eigi[i]*= -1.0; |
| d->eigi[i+1]*= -1.0; |
| for (j=0; j<d->size_H; j++) d->pX[j+(i+1)*d->ldpX]*= -1.0; |
| for (j=0; j<d->size_H; j++) d->S[j+(i+1)*d->ldS]*= -1.0; |
| for (j=0; j<d->size_H; j++) d->T[j+(i+1)*d->ldT]*= -1.0; |
| for (j=0; j<d->size_H; j++) d->pX[j+(d->cX_in_H+i+1)*d->ldpX]*= -1.0; |
| for (j=0; j<d->size_H; j++) d->S[j+(d->cX_in_H+i+1)*d->ldS]*= -1.0; |
| for (j=0; j<d->size_H; j++) d->T[j+(d->cX_in_H+i+1)*d->ldT]*= -1.0; |
| } |
| i++; |
| } |
| d->MTY = PETSC_NULL; |
| /* Lock the converged pairs */ |
| d->eigr+= npreconv; |
| d->eigr+= npreconv-d->cX_in_H; |
| #if !defined(PETSC_USE_COMPLEX) |
| if (d->eigi) d->eigi+= npreconv; |
| if (d->eigi) d->eigi+= npreconv-d->cX_in_H; |
| #endif |
| d->nconv+= npreconv; |
| d->errest+= npreconv; |
| d->nconv+= npreconv-d->cX_in_H; |
| d->errest+= npreconv-d->cX_in_H; |
| /* Notify the changes in V and update the other subspaces */ |
| d->V_tra_s = npreconv; d->V_tra_e = d->size_H; |
| } |
| /* Fill V with D */ |
| ierr = d->improveX(d, d->V+d->size_V, d->max_size_V-d->size_V, 0, size_D, |
| &size_D); CHKERRQ(ierr); |
| ierr = d->improveX(d, d->V+d->size_V, d->max_size_V-d->size_V, d->cX_in_H, size_D+d->cX_in_H, &size_D); CHKERRQ(ierr); |
| /* If D is empty, exit */ |
| d->size_D = size_D; |
| if (size_D == 0) { PetscFunctionReturn(0); } |
| /* Get the converged pairs */ |
| ierr = dvd_updateV_testConv(d, 0, size_D, |
| data->allResiduals?d->size_V:size_D, d->auxV, d->auxS, |
| ierr = dvd_updateV_testConv(d, d->cX_in_H, size_D+d->cX_in_H, |
| data->allResiduals?d->size_V:size_D+d->cX_in_H, d->auxV, d->auxS, |
| &d->npreconv); CHKERRQ(ierr); |
| /* Notify the changes in V */ |
| PetscFunctionBegin; |
| /* u <- X(i) */ |
| ierr = SlepcUpdateVectorsZ(u, 0.0, 1.0, d->V, d->size_V, pX, ld, |
| d->size_H, n); CHKERRQ(ierr); |
| ierr = SlepcUpdateVectorsZ(u, 0.0, 1.0, d->V-d->cX_in_H, d->size_V+d->cX_in_H, pX, ld, d->size_H, n); CHKERRQ(ierr); |
| /* nX(i) <- ||X(i)|| */ |
| if (d->correctXnorm) { |
| for (i=0; i<n; i++) { |
| Bx = kr; |
| for(i=i_s; i<i_e; i++) d->nX[i] = 1.0; |
| if (d->BV) { |
| ierr = SlepcUpdateVectorsZ(Bx, 0.0, 1.0, d->BV, d->size_BV, pX, ld, |
| d->size_H, n); CHKERRQ(ierr); |
| ierr = SlepcUpdateVectorsZ(Bx, 0.0, 1.0, d->BV-d->cX_in_H, d->size_BV+d->cX_in_H, pX, ld, d->size_H, n); CHKERRQ(ierr); |
| } else { |
| for(i=0; i<n; i++) { |
| if (d->B) { |
| /* Ax <- A*X(i) */ |
| Ax = r; |
| ierr = SlepcUpdateVectorsZ(Ax, 0.0, 1.0, d->AV, d->size_AV, pX, ld, |
| d->size_H, n); CHKERRQ(ierr); |
| ierr = SlepcUpdateVectorsZ(Ax, 0.0, 1.0, d->AV-d->cX_in_H, d->size_AV+d->cX_in_H, pX, ld, d->size_H, n); CHKERRQ(ierr); |
| /* v <- Y(i) */ |
| ierr = SlepcUpdateVectorsZ(v, 0.0, 1.0, d->W?d->W:d->V, d->size_V, pY, ld, |
| d->size_H, n); CHKERRQ(ierr); |
| ierr = SlepcUpdateVectorsZ(v, 0.0, 1.0, (d->W?d->W:d->V)-d->cX_in_H, d->size_V+d->cX_in_H, pY, ld, d->size_H, n); CHKERRQ(ierr); |
| /* Recompute the eigenvalue */ |
| DVD_COMPUTE_N_RR(d->eps, i, i_s, n, d->eigr, d->eigi, v, Ax, Bx, b, ierr); |
| PetscFunctionBegin; |
| /* [v u] <- X(i) Y(i) */ |
| ierr = SlepcUpdateVectorsZ(v, 0.0, 1.0, d->V, d->size_V, pX, ld, |
| d->size_H, n); CHKERRQ(ierr); |
| ierr = SlepcUpdateVectorsZ(u, 0.0, 1.0, d->W?d->W:d->V, d->size_V, pY, ld, |
| d->size_H, n); CHKERRQ(ierr); |
| ierr = SlepcUpdateVectorsZ(v, 0.0, 1.0, d->V-d->cX_in_H, d->size_V+d->cX_in_H, pX, ld, d->size_H, n); CHKERRQ(ierr); |
| ierr = SlepcUpdateVectorsZ(u, 0.0, 1.0, (d->W?d->W:d->V)-d->cX_in_H, d->size_V+d->cX_in_H, pY, ld, d->size_H, n); CHKERRQ(ierr); |
| /* Bx <- B*X(i) */ |
| Bx = kr; |
| for(i=i_s; i<i_e; i++) d->nX[i] = 1.0; |
| if (d->BV) { |
| ierr = SlepcUpdateVectorsZ(Bx, 0.0, 1.0, d->BV, d->size_BV, pX, ld, |
| d->size_H, n); CHKERRQ(ierr); |
| ierr = SlepcUpdateVectorsZ(Bx, 0.0, 1.0, d->BV-d->cX_in_H, d->size_BV+d->cX_in_H, pX, ld, d->size_H, n); CHKERRQ(ierr); |
| } else { |
| if (d->B) { |
| for(i=0; i<n; i++) { |
| /* Ax <- A*X(i) */ |
| Ax = r; |
| ierr = SlepcUpdateVectorsZ(Ax, 0.0, 1.0, d->AV, d->size_AV, pX, ld, |
| d->size_H, n); CHKERRQ(ierr); |
| ierr = SlepcUpdateVectorsZ(Ax, 0.0, 1.0, d->AV-d->cX_in_H, d->size_AV+d->cX_in_H, pX, ld, d->size_H, n); CHKERRQ(ierr); |
| /* Recompute the eigenvalue */ |
| DVD_COMPUTE_N_RR(d->eps, i, i_s, n, d->eigr, d->eigi, u, Ax, Bx, b, ierr); |
| PetscAbs(eps->nini), |
| plusk,harm, |
| ksp,init,eps->trackall, |
| ipB?DVD_ORTHOV_BOneMV:DVD_ORTHOV_I,0,0); |
| ipB?DVD_ORTHOV_BOneMV:DVD_ORTHOV_I,1,0); |
| CHKERRQ(ierr); |
| /* Allocate memory */ |
| eps->ip,harm,dvd->withTarget, |
| target,ksp, |
| fix,init,eps->trackall, |
| ipB?DVD_ORTHOV_BOneMV:DVD_ORTHOV_I,0,0); |
| ipB?DVD_ORTHOV_BOneMV:DVD_ORTHOV_I,1,0); |
| CHKERRQ(ierr); |
| /* Associate the eigenvalues to the EPS */ |