int PreconditionerComposed::push_back (operatorPtr_Type& oper, const bool useInverse, const bool useTranspose ) { if (!M_prec.get() ) { M_prec.reset (new prec_Type (M_displayer.comm() ) ); } M_operVector.push_back (oper); LifeChrono chrono; epetraPrecPtr_Type prec; this->M_displayer.leaderPrint ( std::string ("ICP- Preconditioner type: ") + M_prec->Operator() [M_operVector.size() - 1]->preconditionerType() + std::string ("\n") ); this->M_displayer.leaderPrint ( "ICP- Computing preconditioner ... " ); chrono.start(); createPrec (oper, M_prec->OperatorView() [M_operVector.size() - 1]); chrono.stop(); this->M_displayer.leaderPrintMax ("done in ", chrono.diff() ); M_prec->replace (prec, useInverse, useTranspose); // \TODO to reset as push_back if ( M_prec->Operator().size() == M_operVector.size() ) { this->M_preconditionerCreated = true; } return EXIT_SUCCESS; }
int PreconditionerComposed::replace(operatorPtr_Type& oper, const UInt index, const bool useInverse, const bool useTranspose) { ASSERT(index <= M_operVector.size(), "PreconditionerComposed::replace: index too large"); M_operVector[index] = oper; LifeChrono chrono; //ifpack_prec_type prec; this->M_displayer.leaderPrint( std::string("ICP- Preconditioner type: ") + M_prec->Operator()[index]->preconditionerType() + std::string("\n") ); this->M_displayer.leaderPrint( "ICP- Computing preconditioner ... " ); chrono.start(); createPrec(oper, M_prec->OperatorView()[index]); chrono.stop(); this->M_displayer.leaderPrintMax("done in ", chrono.diff()); M_prec->replace(M_prec->Operator()[index], index, useInverse, useTranspose); return EXIT_SUCCESS; }