Files
FESADev/src/fesa/math/jet_arithmetic.h
T

40 lines
1.7 KiB
C++

#ifndef FESA_SRC_FESA_MATH_JET_ARITHMETIC_H_
#define FESA_SRC_FESA_MATH_JET_ARITHMETIC_H_
#include <array>
#include <cstddef>
#include <utility>
namespace fesa::math_internal {
/// @brief Multiplies fixed Jet matrices in row/column/index order.
/// @note The caller retains its Jet precision, derivative storage, product rule
/// and constant provenance. Each result starts at its actual constant zero.
template <class Jet, class Constant>
std::array<std::array<Jet, 3>, 3> MultiplyJetMatrix(
const std::array<std::array<Jet, 3>, 3>& left,
const std::array<std::array<Jet, 3>, 3>& right, Constant constant) {
std::array<std::array<Jet, 3>, 3> result{};
for (std::size_t row = 0; row < 3; ++row)
for (std::size_t column = 0; column < 3; ++column) {
result[row][column] = constant(0.0);
for (std::size_t index = 0; index < 3; ++index)
result[row][column] = std::move(result[row][column]) +
left[row][index] * right[index][column];
}
return result;
}
/// @brief Multiplies a fixed Jet matrix and actual vector RHS in row order.
/// @note The zero-start component accumulation matches both Jet consumers.
template <class Jet, class Constant>
std::array<Jet, 3> MultiplyJetMatrixVector(
const std::array<std::array<Jet, 3>, 3>& matrix,
const std::array<Jet, 3>& vector, Constant constant) {
std::array<Jet, 3> result{constant(0.0),constant(0.0),constant(0.0)};
for (std::size_t row = 0; row < 3; ++row)
for (std::size_t column = 0; column < 3; ++column)
result[row] = std::move(result[row]) + matrix[row][column] * vector[column];
return result;
}
} // namespace fesa::math_internal
#endif // FESA_SRC_FESA_MATH_JET_ARITHMETIC_H_