// ***************************************************************** // ***************************************************************** bool NOX::Epetra::ModelEvaluatorInterface:: computePreconditioner(const Epetra_Vector& x, Epetra_Operator& M, Teuchos::ParameterList* precParams) { EpetraExt::ModelEvaluator::OutArgs outargs = model_->createOutArgs(); inargs_.set_x( Teuchos::rcp(&x, false) ); outargs.set_WPrec( Teuchos::rcp(&M, false) ); model_->evalModel(inargs_, outargs); inargs_.set_x(Teuchos::null); return true; }
// ***************************************************************** // ***************************************************************** bool LOCA::Epetra::ModelEvaluatorInterface:: computePreconditioner(const Epetra_Vector& x, Epetra_Operator& M, Teuchos::ParameterList* precParams) { // Create inargs EpetraExt::ModelEvaluator::InArgs inargs = model_->createInArgs(); inargs.set_x(Teuchos::rcp(&x, false)); // alpha and beta are stored from previous matrix computation // which might have been computeJacobian or computeShiftedMatrix // This is a state-full hack, but needed since this function // does not take alpha and beta as arguments. [AGS 01/10] if (inargs.supports(EpetraExt::ModelEvaluator::IN_ARG_alpha)) inargs.set_alpha(alpha_prev); if (inargs.supports(EpetraExt::ModelEvaluator::IN_ARG_beta)) inargs.set_beta(beta_prev); inargs.set_p(0, Teuchos::rcp(¶m_vec, false)); if (inargs.supports(EpetraExt::ModelEvaluator::IN_ARG_x_dot)) { // Create x_dot, filled with zeros if (x_dot == NULL) x_dot = new Epetra_Vector(x.Map()); inargs.set_x_dot(Teuchos::rcp(x_dot, false)); } // Create outargs EpetraExt::ModelEvaluator::OutArgs outargs = model_->createOutArgs(); EpetraExt::ModelEvaluator::Evaluation<Epetra_Vector> eval_f; eval_f.reset(Teuchos::null, EpetraExt::ModelEvaluator::EVAL_TYPE_VERY_APPROX_DERIV); outargs.set_f(eval_f); outargs.set_WPrec(Teuchos::rcp(&M, false)); model_->evalModel(inargs, outargs); return true; }