void assembleIRKState( const int stageIndex, const Teuchos::SerialDenseMatrix<int,Scalar> &A_in, const Scalar dt, const Thyra::VectorBase<Scalar> &x_base, const Thyra::ProductVectorBase<Scalar> &x_stage_bar, Teuchos::Ptr<Thyra::VectorBase<Scalar> > x_out_ptr ) { typedef ScalarTraits<Scalar> ST; const int numStages_in = A_in.numRows(); TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE( stageIndex, 0, numStages_in ); TEUCHOS_ASSERT_EQUALITY( A_in.numRows(), numStages_in ); TEUCHOS_ASSERT_EQUALITY( A_in.numCols(), numStages_in ); TEUCHOS_ASSERT_EQUALITY( x_stage_bar.productSpace()->numBlocks(), numStages_in ); Thyra::VectorBase<Scalar>& x_out = *x_out_ptr; V_V( outArg(x_out), x_base ); for ( int j = 0; j < numStages_in; ++j ) { Vp_StV( outArg(x_out), dt * A_in(stageIndex,j), *x_stage_bar.getVectorBlock(j) ); } }
void MatrixSymIdent::Vp_StMtV( VectorMutable* y, value_type a, BLAS_Cpp::Transp M_trans ,const Vector& x, value_type b ) const { AbstractLinAlgPack::Vp_MtV_assert_compatibility( y, *this, BLAS_Cpp::no_trans, x ); Vt_S(y,b); Vp_StV(y,a*scale_,x); }
void AbstractLinAlgPack::Vp_StV( VectorMutable* y, const value_type& a, const SpVectorSlice& sx ) { Vp_V_assert_compatibility(y,sx); if( sx.nz() ) { VectorSpace::vec_mut_ptr_t x = y->space().create_member(); x->set_sub_vector(sub_vec_view(sx)); Vp_StV( y, a, *x ); } }
bool MatrixSymDiagStd::Mp_StM( MatrixOp* M_lhs, value_type alpha, BLAS_Cpp::Transp trans_rhs) const { // ToDo: validate the vector spaces for the matrices! MultiVectorMutable *M_mv_lhs = dynamic_cast<MultiVectorMutable*>(M_lhs); if(!M_mv_lhs) return false; VectorSpace::vec_mut_ptr_t M_diag = M_mv_lhs->diag(0); if(!M_diag.get()) return false; // Access to the diagonal is not supported! Vp_StV( M_diag.get(), alpha, *diag_ ); return true; }
RCP<Thyra::VectorBase<Scalar> > computeArea( const Thyra::ModelEvaluator<Scalar>& me, const TimeRange<Scalar>& tr, const GaussQuadrature1D<Scalar>& gq ) { typedef Teuchos::ScalarTraits<Scalar> ST; RCP<Thyra::VectorBase<Scalar> > area = Thyra::createMember(me.get_x_space()); V_S(outArg(*area),ST::zero()); RCP<const TimeRange<Scalar> > sourceRange = gq.getRange(); RCP<const Array<Scalar> > sourcePts = gq.getPoints(); RCP<const Array<Scalar> > sourceWts = gq.getWeights(); Array<Scalar> destPts(*sourcePts); for (unsigned int i=0 ; i<sourcePts->size() ; ++i) { destPts[i] = translateTimeRange<Scalar>((*sourcePts)[i],*sourceRange,tr); } Scalar r = tr.length()/sourceRange->length(); for (unsigned int i=0 ; i<destPts.size() ; ++i) { RCP<Thyra::VectorBase<Scalar> > tmpVec = eval_f_t<Scalar>(me,destPts[i]); Vp_StV(outArg(*area),r*(*sourceWts)[i],*tmpVec); } return area; }
void assembleIRKSolution( const Teuchos::SerialDenseVector<int,Scalar> &b_in, const Scalar dt, const Thyra::VectorBase<Scalar> &x_base, const Thyra::ProductVectorBase<Scalar> &x_stage_bar, Teuchos::Ptr<Thyra::VectorBase<Scalar> > x_out_ptr ) { typedef ScalarTraits<Scalar> ST; const int numStages_in = b_in.length(); TEUCHOS_ASSERT_EQUALITY( b_in.length(), numStages_in ); TEUCHOS_ASSERT_EQUALITY( x_stage_bar.productSpace()->numBlocks(), numStages_in ); Thyra::VectorBase<Scalar>& x_out = *x_out_ptr; V_V( outArg(x_out), x_base ); for ( int j = 0; j < numStages_in; ++j ) { Vp_StV( outArg(x_out), dt * b_in(j), *x_stage_bar.getVectorBlock(j) ); } }