| Line 32... |
Line 32... |
PetscErrorCode ierr;
|
PetscErrorCode ierr;
|
|
|
PetscFunctionBegin;
|
PetscFunctionBegin;
|
PetscValidHeaderSpecific(qep,QEP_CLASSID,1);
|
PetscValidHeaderSpecific(qep,QEP_CLASSID,1);
|
ierr = PetscFree(qep->data);CHKERRQ(ierr);
|
ierr = PetscFree(qep->data);CHKERRQ(ierr);
|
|
|
/* free work vectors */
|
/* free work vectors */
|
ierr = QEPDefaultFreeWork(qep);CHKERRQ(ierr);
|
ierr = QEPDefaultFreeWork(qep);CHKERRQ(ierr);
|
PetscFunctionReturn(0);
|
PetscFunctionReturn(0);
|
}
|
}
|
|
|
| Line 49... |
Line 48... |
{
|
{
|
PetscErrorCode ierr;
|
PetscErrorCode ierr;
|
PetscInt i;
|
PetscInt i;
|
|
|
PetscFunctionBegin;
|
PetscFunctionBegin;
|
|
|
if (qep->nwork != nw) {
|
if (qep->nwork != nw) {
|
if (qep->nwork > 0) {
|
if (qep->nwork > 0) {
|
ierr = VecDestroyVecs(qep->nwork,&qep->work); CHKERRQ(ierr);
|
ierr = VecDestroyVecs(qep->nwork,&qep->work); CHKERRQ(ierr);
|
}
|
}
|
qep->nwork = nw;
|
qep->nwork = nw;
|
| Line 61... |
Line 59... |
for (i=0;i<nw;i++) {
|
for (i=0;i<nw;i++) {
|
ierr = MatGetVecs(qep->M,PETSC_NULL,qep->work+i); CHKERRQ(ierr);
|
ierr = MatGetVecs(qep->M,PETSC_NULL,qep->work+i); CHKERRQ(ierr);
|
}
|
}
|
ierr = PetscLogObjectParents(qep,nw,qep->work);
|
ierr = PetscLogObjectParents(qep,nw,qep->work);
|
}
|
}
|
|
|
PetscFunctionReturn(0);
|
PetscFunctionReturn(0);
|
}
|
}
|
|
|
#undef __FUNCT__
|
#undef __FUNCT__
|
#define __FUNCT__ "QEPDefaultFreeWork"
|
#define __FUNCT__ "QEPDefaultFreeWork"
|
| Line 90... |
Line 87... |
QEPDefaultConverged - Checks convergence relative to the eigenvalue.
|
QEPDefaultConverged - Checks convergence relative to the eigenvalue.
|
*/
|
*/
|
PetscErrorCode QEPDefaultConverged(QEP qep,PetscScalar eigr,PetscScalar eigi,PetscReal res,PetscReal *errest,void *ctx)
|
PetscErrorCode QEPDefaultConverged(QEP qep,PetscScalar eigr,PetscScalar eigi,PetscReal res,PetscReal *errest,void *ctx)
|
{
|
{
|
PetscReal w;
|
PetscReal w;
|
|
|
PetscFunctionBegin;
|
PetscFunctionBegin;
|
w = SlepcAbsEigenvalue(eigr,eigi);
|
w = SlepcAbsEigenvalue(eigr,eigi);
|
*errest = res;
|
*errest = res;
|
if (w > res) *errest = res / w;
|
if (w > res) *errest = res / w;
|
PetscFunctionReturn(0);
|
PetscFunctionReturn(0);
|
| Line 130... |
Line 128... |
PetscReal norm;
|
PetscReal norm;
|
|
|
PetscFunctionBegin;
|
PetscFunctionBegin;
|
ncv = PetscBLASIntCast(qep->ncv);
|
ncv = PetscBLASIntCast(qep->ncv);
|
nconv = PetscBLASIntCast(qep->nconv);
|
nconv = PetscBLASIntCast(qep->nconv);
|
|
|
ierr = PetscMalloc(nconv*nconv*sizeof(PetscScalar),&Z);CHKERRQ(ierr);
|
ierr = PetscMalloc(nconv*nconv*sizeof(PetscScalar),&Z);CHKERRQ(ierr);
|
ierr = PetscMalloc(3*nconv*sizeof(PetscScalar),&work);CHKERRQ(ierr);
|
ierr = PetscMalloc(3*nconv*sizeof(PetscScalar),&work);CHKERRQ(ierr);
|
#if defined(PETSC_USE_COMPLEX)
|
#if defined(PETSC_USE_COMPLEX)
|
ierr = PetscMalloc(nconv*sizeof(PetscReal),&rwork);CHKERRQ(ierr);
|
ierr = PetscMalloc(nconv*sizeof(PetscReal),&rwork);CHKERRQ(ierr);
|
#endif
|
#endif
|
| Line 217... |
Line 214... |
if (iscomplex) { qep->errest[k+1] = qep->errest[k]; k++; }
|
if (iscomplex) { qep->errest[k+1] = qep->errest[k]; k++; }
|
if (marker!=-1 && !qep->trackall) break;
|
if (marker!=-1 && !qep->trackall) break;
|
}
|
}
|
if (marker!=-1) k = marker;
|
if (marker!=-1) k = marker;
|
*kout = k;
|
*kout = k;
|
|
|
PetscFunctionReturn(0);
|
PetscFunctionReturn(0);
|
}
|
}
|
|
|
|
|
|
|