44#ifndef OPTIPACK_DIAGONAL_QUADRATIC_RESPONSE_ONLY_MODEL_EVALUATOR_DEF_HPP
45#define OPTIPACK_DIAGONAL_QUADRATIC_RESPONSE_ONLY_MODEL_EVALUATOR_DEF_HPP
48#include "Thyra_DiagonalQuadraticResponseOnlyModelEvaluator_decl.hpp"
49#include "Thyra_DiagonalScalarProd.hpp"
50#include "Thyra_VectorStdOps.hpp"
51#include "Thyra_DefaultSpmdVectorSpace.hpp"
52#include "Thyra_DetachedSpmdVectorView.hpp"
53#include "Teuchos_DefaultComm.hpp"
54#include "Teuchos_CommHelpers.hpp"
55#include "Teuchos_Assert.hpp"
74 :Np_(1), Ng_(1), comm_(comm), localDim_(localDim),
75 nonlinearTermFactor_(0.0), g_offset_(0.0)
101 V_S(diag.
ptr(), ST::one());
107 V_S(s_bar.
ptr(), ST::one());
111 g_offset_ = ST::zero();
116template<
class Scalar>
120 ps_ = ps.assert_not_null();
124template<
class Scalar>
132template<
class Scalar>
141template<
class Scalar>
147 using Teuchos::rcp_dynamic_cast;
152 diag_bar_ = diag_bar.assert_not_null();
162 V_S( s_bar.
ptr(), ST::zero() );
167 rcp_dynamic_cast<Thyra::ScalarProdVectorSpaceBase<Scalar> >(p_space_,
true);
173template<
class Scalar>
175 const Scalar &nonlinearTermFactor)
177 nonlinearTermFactor_ = nonlinearTermFactor;
181template<
class Scalar>
183 const Scalar &g_offset)
185 g_offset_ = g_offset;
192template<
class Scalar>
199template<
class Scalar>
206template<
class Scalar>
219template<
class Scalar>
232template<
class Scalar>
237 MEB::InArgsSetup<Scalar> inArgs;
238 inArgs.setModelEvalDescription(this->
description());
247template<
class Scalar>
249DiagonalQuadraticResponseOnlyModelEvaluator<Scalar>::createOutArgsImpl()
const
252 MEB::OutArgsSetup<Scalar> outArgs;
253 outArgs.setModelEvalDescription(this->description());
254 outArgs.set_Np_Ng(Np_,Ng_);
255 outArgs.setSupports(MEB::OUT_ARG_DgDp, 0 ,0, MEB::DERIV_TRANS_MV_BY_ROW);
260template<
class Scalar>
261void DiagonalQuadraticResponseOnlyModelEvaluator<Scalar>::evalModelImpl(
268 using Teuchos::outArg;
275 const ConstDetachedSpmdVectorView<Scalar> p(inArgs.
get_p(0));
276 const ConstDetachedSpmdVectorView<Scalar> ps(ps_);
277 const ConstDetachedSpmdVectorView<Scalar> diag(diag_);
278 const ConstDetachedSpmdVectorView<Scalar> s_bar(s_bar_);
281 if (!is_null(outArgs.
get_g(0))) {
282 Scalar g_val = ST::zero();
283 for (
Ordinal i = 0; i < p.subDim(); ++i) {
284 const Scalar p_ps = p[i] - ps[i];
285 g_val += diag[i] * p_ps*p_ps;
286 if (nonlinearTermFactor_ != ST::zero()) {
287 g_val += nonlinearTermFactor_ * p_ps * p_ps * p_ps;
291 Teuchos::reduceAll<Ordinal, Scalar>(*comm_, Teuchos::REDUCE_SUM,
292 g_val, outArg(global_g_val) );
294 as<Scalar>(0.5) * global_g_val + g_offset_;
298 if (!outArgs.
get_DgDp(0,0).isEmpty()) {
300 get_mv<Scalar>(outArgs.
get_DgDp(0,0),
"DgDp^T", MEB::DERIV_TRANS_MV_BY_ROW);
303 const Scalar p_ps = p[i] - ps[i];
304 Scalar DgDp_grad_i = diag[i] * p_ps;
305 if (nonlinearTermFactor_ != ST::zero()) {
306 DgDp_grad_i += as<Scalar>(1.5) * nonlinearTermFactor_ * p_ps * p_ps;
308 DgDp_grad[i] = DgDp_grad_i / s_bar[i];
static Teuchos::RCP< const Comm< OrdinalType > > getComm()
virtual std::string description() const
Create an explicit detached non-mutable (const) view of all of the local elements on this process of ...
RCP< DefaultSpmdVectorSpace< Scalar > > defaultSpmdVectorSpace()
Nonmember consturctor that creats an uninitialized vector space.
RCP< DefaultSpmdVectorSpace< Scalar > > locallyReplicatedDefaultSpmdVectorSpace(const RCP< const Teuchos::Comm< Ordinal > > &comm, const Ordinal globalDim)
Nonmember consturctor function that creates a locally-replicated parallel vector space.
Create an explicit detached mutable (non-const) view of all of the local elements on this process of ...
void setDiagonalVector(const RCP< const VectorBase< Scalar > > &diag)
Set the diagonal vector diag.
void setSolutionVector(const RCP< const VectorBase< Scalar > > &ps)
Set the solution vector ps .
ModelEvaluatorBase::InArgs< Scalar > createInArgs() const
void setScalarOffset(const Scalar &g_offset)
Set offset scalar g_offset .
RCP< const VectorSpaceBase< Scalar > > get_g_space(int j) const
void setNonlinearTermFactor(const Scalar &nonlinearTermFactor)
Set nonlinear term factory.
DiagonalQuadraticResponseOnlyModelEvaluator(const int localDim, const RCP< const Teuchos::Comm< Ordinal > > &comm=Teuchos::null)
RCP< const VectorSpaceBase< Scalar > > get_p_space(int l) const
void setDiagonalBarVector(const RCP< const VectorBase< Scalar > > &diag_bar)
Set the diagonal vector diag_bar.
const RCP< const VectorBase< Scalar > > getSolutionVector() const
Get the solution vector ps .
RCP< DiagonalScalarProd< Scalar > > diagonalScalarProd(const RCP< const VectorBase< Scalar > > &s_diag)
Nonmember constructor.
Concrete aggregate class for all input arguments computable by a ModelEvaluator subclass object.
RCP< const VectorBase< Scalar > > get_p(int l) const
Get p(l) where 0 <= l && l < this->Np().
Concrete aggregate class for all output arguments computable by a ModelEvaluator subclass object.
Derivative< Scalar > get_DgDp(int j, int l) const
Precondition: supports(OUT_ARG_DgDp,j,l)==true.
Evaluation< VectorBase< Scalar > > get_g(int j) const
Precondition: supports(OUT_ARG_g)==true..
Base subclass for ModelEvaluator that defines some basic types.
Abstract interface for finite-dimensional dense vectors.
void ele_wise_divide(const Scalar &alpha, const VectorBase< Scalar > &x, const VectorBase< Scalar > &v, const Ptr< VectorBase< Scalar > > &y)
Element-wise division update: y(i) += alpha * x(i) / v(i), i = 0...y->space()->dim()-1.
void V_S(const Ptr< VectorBase< Scalar > > &y, const Scalar &alpha)
y(i) = alpha, i = 0...y->space()->dim()-1.
RCP< VectorBase< Scalar > > createMember(const RCP< const VectorSpaceBase< Scalar > > &vs, const std::string &label="")
Create a vector member from the vector space.
#define TEUCHOS_ASSERT(assertion_test)
#define TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(index, lower_inclusive, upper_exclusive)
Teuchos::Ordinal Ordinal
Type for the dimension of a vector space. `*.
TypeTo as(const TypeFrom &t)