#ifndef MEDUSA_BITS_APPROXIMATIONS_OPERATORS_HPP_ #define MEDUSA_BITS_APPROXIMATIONS_OPERATORS_HPP_ #include "Operators_fwd.hpp" #include "Monomials_fwd.hpp" #include "RBFBasis_fwd.hpp" /** * @file * Implementations of differential operator families. */ namespace mm { template template typename basis_t::scalar_t Operator::apply( const basis_t&, int, typename basis_t::vector_t, const std::vector&, typename basis_t::scalar_t) const { static_assert(!std::is_same::value, "Applying this operator to this basis not implemented."); } template template typename basis_t::scalar_t Operator::applyAt0( const basis_t& basis, int index, const std::vector& support, typename basis_t::scalar_t scale) const { return apply(basis, typename basis_t::vector_t(0.0), index, support, scale); } template std::array, dimension> Der1s::operators() { std::array, dim> ret; for (int d = 0; d < dim; ++d) { ret[d] = {d}; } return ret; } template std::array, dimension*(dimension+1)/2> Der2s::operators() { std::array, dim*(dim+1)/2> ret; int c = 0; for (int d2 = 0; d2 < dim; ++d2) { for (int d1 = 0; d1 <= d2; ++d1) { ret[c] = {d1, d2}; ++c; } } return ret; } /// Implementation details for analytical operators namespace operators_internal { /** * Convert variable index to its respective letter, 0 -> x, 1 -> y, etc. * For numbers more than 4, generic name x_i is printed. */ inline std::string idx_to_letter(int var) { if (var < 0 || var >= 4) return "x_" + std::to_string(var); return std::string(1, "xyzw"[var]); } } // namespace operators_internal template Der1::Der1(int var) : var(var) { assert_msg(0 <= var && var <= dim, "Variable %d should be in range [0, %d).", var, dim); } template std::string Der1::name() const { return format("Der1<%d> wrt. %s", dim, operators_internal::idx_to_letter(var)); } template Der2::Der2(int var1, int var2) : var1(var1), var2(var2) { assert_msg(0 <= var1 && var1 <= dim, "Variable %d should be in range [0, %d).", var1, dim); assert_msg(0 <= var2 && var2 <= dim, "Variable %d should be in range [0, %d).", var2, dim); assert_msg(var2 >= var1, "Second value provided %d should be higher or equal than the first %d", var2, var1); } template std::string Der2::name() const { return format("Der2<%d> wrt. %s and %s", dim, operators_internal::idx_to_letter(var1), operators_internal::idx_to_letter(var2)); } } // namespace mm #endif // MEDUSA_BITS_APPROXIMATIONS_OPERATORS_HPP_