Thyra::ModelEvaluatorBase::InArgs<Scalar> Piro::NOXSolver<Scalar>::createInArgs() const { Thyra::ModelEvaluatorBase::InArgsSetup<Scalar> inArgs; inArgs.setModelEvalDescription(this->description()); inArgs.set_Np(num_p); return inArgs; }
Thyra::ModelEvaluatorBase::InArgs<Scalar> Piro::SteadyStateSolver<Scalar>::createInArgsImpl() const { Thyra::ModelEvaluatorBase::InArgsSetup<Scalar> result; result.setModelEvalDescription(this->description()); result.set_Np(num_p_); return result; }
Thyra::ModelEvaluatorBase::InArgs<Scalar> Piro::VelocityVerletSolver<Scalar, LocalOrdinal, GlobalOrdinal, Node>::createInArgs() const { Thyra::ModelEvaluatorBase::InArgsSetup<Scalar> inArgs; inArgs.setModelEvalDescription(this->description()); inArgs.set_Np(num_p); return inArgs; }
Thyra::ModelEvaluatorBase::InArgs<Scalar> Piro::RythmosSolver<Scalar>::createInArgs() const { //return underlyingME->createInArgs(); Thyra::ModelEvaluatorBase::InArgsSetup<Scalar> inArgs; inArgs.setModelEvalDescription(this->description()); inArgs.set_Np(num_p); // inArgs.setSupports(IN_ARG_x,true); return inArgs; }
Thyra::ModelEvaluatorBase::InArgs<ST> Albany::ModelEvaluatorT::createInArgsImpl() const { Thyra::ModelEvaluatorBase::InArgsSetup<ST> result; result.setModelEvalDescription(this->description()); result.setSupports(Thyra::ModelEvaluatorBase::IN_ARG_x, true); result.setSupports(Thyra::ModelEvaluatorBase::IN_ARG_x_dot, true); // AGS: x_dotdot time integrators not imlemented in Thyra ME yet //result.setSupports(Thyra::ModelEvaluatorBase::IN_ARG_x_dotdot, true); result.setSupports(Thyra::ModelEvaluatorBase::IN_ARG_t, true); result.setSupports(Thyra::ModelEvaluatorBase::IN_ARG_alpha, true); result.setSupports(Thyra::ModelEvaluatorBase::IN_ARG_beta, true); // AGS: x_dotdot time integrators not imlemented in Thyra ME yet //result.setSupports(Thyra::ModelEvaluatorBase::IN_ARG_omega, true); result.set_Np(num_param_vecs+num_dist_param_vecs); return result; }
void Piro::LOCAAdaptiveSolver<Scalar>::evalModelImpl( const Thyra::ModelEvaluatorBase::InArgs<Scalar>& inArgs, const Thyra::ModelEvaluatorBase::OutArgs<Scalar>& outArgs) const { const int l = 0; // TODO: Allow user to select parameter index const Teuchos::RCP<const Thyra::VectorBase<Scalar> > p_inargs = inArgs.get_p(l); // Forward parameter values to the LOCAAdaptive stepper { const Teuchos::RCP<const Thyra::VectorBase<Scalar> > p_inargs_or_nominal = Teuchos::nonnull(p_inargs) ? p_inargs : this->getNominalValues().get_p(l); const Thyra::ConstDetachedVectorView<Scalar> p_init_values(p_inargs_or_nominal); const Teuchos_Ordinal p_entry_count = p_init_values.subDim(); TEUCHOS_ASSERT(p_entry_count == Teuchos::as<Teuchos_Ordinal>(paramVector_.length())); for (Teuchos_Ordinal k = 0; k < p_entry_count; ++k) { paramVector_[k] = p_init_values[k]; } // solMgr_->getSolutionGroup()->setParams(paramVector_); Teuchos::rcp_dynamic_cast< ::Thyra::LOCAAdaptiveState >(solMgr_->getState()) ->getSolutionGroup()->setParams(paramVector_); } LOCA::Abstract::Iterator::IteratorStatus status; status = stepper_->run(); if (status == LOCA::Abstract::Iterator::Finished) { utils_.out() << "Continuation Stepper Finished.\n"; } else if (status == LOCA::Abstract::Iterator::NotFinished) { utils_.out() << "Continuation Stepper did not reach final value.\n"; } else { utils_.out() << "Nonlinear solver failed to converge.\n"; outArgs.setFailed(); } // The time spent globalData_->locaUtils->out() << std::endl << "#### Statistics ########" << std::endl; // Check number of steps int numSteps = stepper_->getStepNumber(); globalData_->locaUtils->out() << std::endl << " Number of continuation Steps = " << numSteps << std::endl; // Check number of failed steps int numFailedSteps = stepper_->getNumFailedSteps(); globalData_->locaUtils->out() << std::endl << " Number of failed continuation Steps = " << numFailedSteps << std::endl; globalData_->locaUtils->out() << std::endl; // Note: the last g is used to store the final solution. It can be null - if it is just // skip the store. If adaptation has occurred, g is not the correct size. const Teuchos::RCP<Thyra::VectorBase<Scalar> > x_outargs = outArgs.get_g(this->num_g()); Teuchos::RCP<Thyra::VectorBase<Scalar> > x_final; int x_args_dim = 0; int f_sol_dim = 0; // Pardon the nasty cast to resize the last g in outArgs - need to fit the solution Thyra::ModelEvaluatorBase::OutArgs<Scalar>* mutable_outArgsPtr = const_cast<Thyra::ModelEvaluatorBase::OutArgs<Scalar>* >(&outArgs); if(Teuchos::nonnull(x_outargs)){ // g has been allocated, calculate the sizes of g and the solution x_args_dim = x_outargs->space()->dim(); // f_sol_dim = solMgr_->getSolutionGroup()->getX().length(); f_sol_dim = Teuchos::rcp_dynamic_cast< ::Thyra::LOCAAdaptiveState >(solMgr_->getState()) ->getSolutionGroup()->getX().length(); } if(Teuchos::is_null(x_outargs) || (x_args_dim != f_sol_dim)){ // g is not the right size x_final = Thyra::createMember(this->get_g_space(this->num_g())); mutable_outArgsPtr->set_g(this->num_g(), x_final); } else { // g is OK, use it x_final = x_outargs; } { // Deep copy final solution from LOCA group NOX::Thyra::Vector finalSolution(x_final); // finalSolution = solMgr_->getSolutionGroup()->getX(); finalSolution = Teuchos::rcp_dynamic_cast< ::Thyra::LOCAAdaptiveState >(solMgr_->getState()) ->getSolutionGroup()->getX(); } // If the arrays need resizing if(x_args_dim != f_sol_dim){ const int parameterCount = this->Np(); for (int pc = 0; pc < parameterCount; ++pc) { const Thyra::ModelEvaluatorBase::DerivativeSupport dgdp_support = outArgs.supports(Thyra::ModelEvaluatorBase::OUT_ARG_DgDp, this->num_g(), pc); const Thyra::ModelEvaluatorBase::EDerivativeMultiVectorOrientation dgdp_orient = Thyra::ModelEvaluatorBase::DERIV_MV_JACOBIAN_FORM; if (dgdp_support.supports(dgdp_orient)) { const Thyra::ModelEvaluatorBase::DerivativeMultiVector<Scalar> dgdp = Thyra::create_DgDp_mv(*this, this->num_g(), pc, dgdp_orient); mutable_outArgsPtr->set_DgDp(this->num_g(), pc, dgdp); } } } // Compute responses for the final solution { Thyra::ModelEvaluatorBase::InArgs<Scalar> modelInArgs = this->getModel().createInArgs(); { modelInArgs.set_x(x_final); modelInArgs.set_p(l, p_inargs); } this->evalConvergedModel(modelInArgs, outArgs); // Save the final solution TODO: this needs to be redone Teuchos::RCP<Thyra::ModelEvaluatorBase::InArgs<Scalar> > fp = Teuchos::rcp_const_cast<Thyra::ModelEvaluatorBase::InArgs<Scalar> >(finalPoint_); Thyra::ModelEvaluatorBase::InArgsSetup<Scalar> ia; ia.setSupports(Thyra::ModelEvaluatorBase::IN_ARG_x, true); *fp = ia; fp->set_x(x_final); } }