NM_Status IMLSolver :: solve(SparseMtrx &A, FloatArray &b, FloatArray &x) { int result; if ( x.giveSize() != b.giveSize() ) { OOFEM_ERROR("size mismatch"); } // check preconditioner if ( M ) { if ( ( precondInit ) || ( Lhs != &A ) || ( this->lhsVersion != A.giveVersion() ) ) { M->init(A); } } else { OOFEM_ERROR("preconditioner creation error"); } Lhs = &A; this->lhsVersion = A.giveVersion(); #ifdef TIME_REPORT Timer timer; timer.startTimer(); #endif if ( solverType == IML_ST_CG ) { int mi = this->maxite; double t = this->tol; result = CG(* Lhs, x, b, * M, mi, t); OOFEM_LOG_INFO("CG(%s): flag=%d, nite %d, achieved tol. %g\n", M->giveClassName(), result, mi, t); } else if ( solverType == IML_ST_GMRES ) { int mi = this->maxite, restart = 100; double t = this->tol; FloatMatrix H(restart + 1, restart); // storage for upper Hesenberg result = GMRES(* Lhs, x, b, * M, H, restart, mi, t); OOFEM_LOG_INFO("GMRES(%s): flag=%d, nite %d, achieved tol. %g\n", M->giveClassName(), result, mi, t); } else { OOFEM_ERROR("unknown lsover type"); } #ifdef TIME_REPORT timer.stopTimer(); OOFEM_LOG_INFO( "IMLSolver info: user time consumed by solution: %.2fs\n", timer.getUtime() ); #endif //solved = 1; return NM_Success; }
void NRSolver :: applyConstraintsToStiffness(SparseMtrx &k) { if ( this->smConstraintVersion == k.giveVersion() ) { return; } #ifdef __PETSC_MODULE PetscSparseMtrx *lhs = dynamic_cast< PetscSparseMtrx * >(&k); if ( lhs ) { Vec diag; PetscScalar *ptr; int eq; lhs->createVecGlobal(& diag); MatGetDiagonal(* lhs->giveMtrx(), diag); VecGetArray(diag, & ptr); for ( int i = 1; i <= numberOfPrescribedDofs; i++ ) { eq = prescribedEqs.at(i) - 1; MatSetValue(* ( lhs->giveMtrx() ), eq, eq, ptr [ eq ] * 1.e6, INSERT_VALUES); } MatAssemblyBegin(* lhs->giveMtrx(), MAT_FINAL_ASSEMBLY); MatAssemblyEnd(* lhs->giveMtrx(), MAT_FINAL_ASSEMBLY); VecRestoreArray(diag, & ptr); VecDestroy(& diag); if ( numberOfPrescribedDofs ) { this->smConstraintVersion = k.giveVersion(); } return; } #endif // __PETSC_MODULE for ( int i = 1; i <= numberOfPrescribedDofs; i++ ) { k.at( prescribedEqs.at(i), prescribedEqs.at(i) ) *= 1.e6; } if ( numberOfPrescribedDofs ) { this->smConstraintVersion = k.giveVersion(); } }