void DiagonalROME<Scalar>::setDiagonalBarVector( const RCP<const Thyra::VectorBase<Scalar> > &diag_bar) { typedef Teuchos::ScalarTraits<Scalar> ST; using Teuchos::rcp_dynamic_cast; using Thyra::createMember; using Thyra::ele_wise_divide; using Thyra::V_S; diag_bar_ = diag_bar.assert_not_null(); // Reset the scalar product for p_space! RCP<Thyra::VectorBase<Scalar> > s_bar = createMember<Scalar>(p_space_); // s_bar[i] = diag[i] / diag_bar[i] V_S( s_bar.ptr(), ST::zero() ); ele_wise_divide( ST::one(), *diag_, *diag_bar_, s_bar.ptr() ); s_bar_ = s_bar; const RCP<Thyra::ScalarProdVectorSpaceBase<Scalar> > sp_p_space = rcp_dynamic_cast<Thyra::ScalarProdVectorSpaceBase<Scalar> >(p_space_, true); //sp_p_space->setScalarProd(diagonalScalarProd<Scalar>(s_bar_)); }
DiagonalROME<Scalar>::DiagonalROME( const int localDim, const RCP<const Teuchos::Comm<Thyra::Ordinal> > &comm ) :Np_(1), Ng_(1), comm_(comm), localDim_(localDim), nonlinearTermFactor_(0.0), g_offset_(0.0) { typedef Teuchos::ScalarTraits<Scalar> ST; using Thyra::createMember; TEUCHOS_ASSERT( localDim > 0 ); // Get the comm if (is_null(comm_)) { comm_ = Teuchos::DefaultComm<Thyra::Ordinal>::getComm(); } // Locally replicated space for g g_space_ = Thyra::locallyReplicatedDefaultSpmdVectorSpace<Scalar>(comm_, 1); // Distributed space for p p_space_ = Thyra::defaultSpmdVectorSpace<Scalar>(comm_, localDim, -1); // Default solution const RCP<Thyra::VectorBase<Scalar> > ps = createMember<Scalar>(p_space_); V_S(ps.ptr(), ST::zero()); ps_ = ps; // Default diagonal const RCP<Thyra::VectorBase<Scalar> > diag = createMember<Scalar>(p_space_); V_S(diag.ptr(), ST::one()); diag_ = diag; diag_bar_ = diag; // Default inner product const RCP<Thyra::VectorBase<Scalar> > s_bar = createMember<Scalar>(p_space_); V_S(s_bar.ptr(), ST::one()); s_bar_ = s_bar; // Default response offset g_offset_ = ST::zero(); }