minitensor::Vector<T, N> gradient(minitensor::Vector<T, N> const& x) { // Firewalls. minitensor::Index const dimension = x.get_dimension(); ALBANY_EXPECT(dimension == Base::DIMENSION); // Variables that potentially have Albany::Traits sensitivity // information need to be handled by the peel functor so that // proper conversions take place. T const K = peel<EvalT, T, N>()(K_); T const smag = peel<EvalT, T, N>()(smag_); T const mubar = peel<EvalT, T, N>()(mubar_); T const Y = peel<EvalT, T, N>()(Y_); // This is the actual computation of the gradient. minitensor::Vector<T, N> r(dimension); T const& X = x(0); T const alpha = eqps_old_ + SQ23 * X; T const H = K * alpha + sat_mod_ * (1.0 - std::exp(-sat_exp_ * alpha)); T const R = smag - (2.0 * mubar * X + SQ23 * (Y + H)); r(0) = R; return r; }
void MiniTensorVector<T, N>:: axpy(T const alpha, Vector<T> const & x) { minitensor::Vector<T, N> const xval = MTfromROL<T, N>(x); auto const dim = xval.get_dimension(); assert(vector_.get_dimension() == dim); for (minitensor::Index i{0}; i < dim; ++i) { vector_(i) += alpha * xval(i); } }