Tatooine
field_operations.h
Go to the documentation of this file.
1#ifndef TATOOINE_FIELD_OPERATIONS_H
2#define TATOOINE_FIELD_OPERATIONS_H
3//==============================================================================
5#include <tatooine/field.h>
7//==============================================================================
8namespace tatooine {
9//==============================================================================
10template <typename V0, typename V1, typename Real0, typename Real1,
11 std::size_t NumDimensions>
12requires(
13 V0::num_tensor_components() ==
14 V1::num_tensor_components()) constexpr auto dot(vectorfield<V0, Real0,
15 NumDimensions> const&
16 lhs,
18 V1, Real1,
19 NumDimensions> const&
20 rhs) {
22 lhs, rhs, [](auto const& lhs, auto const rhs) { return dot(lhs, rhs); });
23}
24//------------------------------------------------------------------------------
25template <typename V0, typename Real0, typename V1, typename Real1,
26 std::size_t N, typename Tensor>
27constexpr auto operator+(const field<V0, Real0, N, Tensor>& lhs,
28 const field<V1, Real1, N, Tensor>& rhs) {
30 lhs, rhs, [](auto const& lhs, auto const& rhs) { return lhs + rhs; });
31}
32//------------------------------------------------------------------------------
33template <typename Real0, typename Real1, std::size_t N, std::size_t TM,
34 std::size_t TN>
38 lhs, rhs, [](auto const& lhs, auto const& rhs) { return lhs * rhs; });
39}
40//------------------------------------------------------------------------------
41template <typename V0, typename Real0, typename V1, typename Real1,
42 std::size_t N, std::size_t TM, std::size_t TN>
46 lhs, rhs, [](auto const& lhs, auto const& rhs) { return lhs * rhs; });
47}
48//------------------------------------------------------------------------------
49template <typename V0, typename Real0, typename V1, typename Real1,
50 std::size_t N, typename Tensor>
51constexpr auto operator*(const field<V0, Real0, N, Tensor>& lhs,
52 const field<V1, Real1, N, Tensor>& rhs) {
54 lhs, rhs, [](auto const& lhs, auto const& rhs) { return lhs * rhs; });
55}
56//------------------------------------------------------------------------------
57template <typename V, typename VReal, std::size_t N, typename Tensor>
58constexpr auto operator*(field<V, VReal, N, Tensor> const& f,
59 arithmetic auto const scalar) {
60 return V{f.as_derived()} | [scalar](auto const& t) { return t * scalar; };
61}
62//------------------------------------------------------------------------------
63template <typename V, arithmetic VReal, std::size_t N, typename Tensor>
64constexpr auto operator*(arithmetic auto const scalar,
66 return V{f.as_derived()} | [scalar](auto const& t) { return t * scalar; };
67}
68//------------------------------------------------------------------------------
69template <typename V, typename VReal, std::size_t N,
70 arithmetic_or_complex ScalarReal, typename Tensor>
71constexpr auto operator/(field<V, VReal, N, Tensor> const& f,
72 ScalarReal const scalar) {
73 return V{f.as_derived()} | [scalar](auto const& t) { return t / scalar; };
74}
75// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
76template <typename V, typename VReal, std::size_t N,
77 arithmetic_or_complex ScalarReal, typename Tensor>
78constexpr auto operator/(ScalarReal const scalar,
80 return V{f.as_derived()} | [scalar](auto const& t) { return scalar / t; };
81}
82//------------------------------------------------------------------------------
83// template <typename lhs_tensor_type, typename Real0,
84// typename rhs_tensor_type, typename Real1,
85// std::size_t... Dims>
86// constexpr auto operator-(
87// const base_tensor<lhs_tensor_type, Real0, Dims...>& lhs,
88// const base_tensor<rhs_tensor_type, Real1, Dims...>& rhs) {
89// return binary_operation(std::minus<common_type<Real0, Real1>>{}, lhs,
90// rhs);
91//}
92//
93//------------------------------------------------------------------------------
95// template <typename lhs_tensor_type, typename Real0,
96// typename rhs_tensor_type, typename Real1, std::size_t M, std::size_t
97// N>
98// constexpr auto operator*(const base_tensor<lhs_tensor_type, Real0, M, N>&
99// lhs,
100// const base_tensor<rhs_tensor_type, Real1, N>& rhs) {
101// tensor<common_type<Real0, Real1>, M> product;
102// for (std::size_t i = 0; i < M; ++i) {
103// product(i) = dot(lhs.template slice<0>(i), rhs);
104// }
105// return product;
106//}
107template <typename V, typename VReal, std::size_t N>
110 v, [](auto const& v) { return squared_euclidean_length(v); }};
111}
112template <typename V, typename VReal, std::size_t N>
115 std::move(v), [](auto const& v) { return squared_euclidean_length(v); }};
116}
117template <typename V, typename VReal, std::size_t N>
120 v, [](auto const& v) { return euclidean_length(v); }};
121}
122template <typename V, typename VReal, std::size_t N>
125 std::move(v), [](auto const& v) { return euclidean_length(v); }};
126}
127//==============================================================================
128} // namespace tatooine
129//==============================================================================
130#include <tatooine/Q_field.h>
132#endif
Definition: concepts.h:33
Definition: algorithm.h:6
constexpr auto squared_euclidean_length(base_tensor< Tensor, T, N > const &t_in)
Definition: length.h:7
constexpr auto make_binary_operation_field(const field< LHSInternalField, LHSReal, N, LHSTensor > &lhs, const field< RHSInternalField, RHSReal, N, RHSTensor > &rhs, const Op &op)
Definition: binary_operation_field.h:119
auto constexpr operator/(Lhs const &lhs, Rhs const &rhs)
component-wise division
Definition: operator_overloads.h:103
tensor< real_number, Dimensions... > Tensor
Definition: tensor.h:184
constexpr auto operator*(diag_static_tensor< TensorA, M, N > const &A, static_vec auto const &b) -> vec< common_type< tatooine::value_type< TensorA >, tatooine::value_type< decltype(b)> >, M > requires(N==decltype(b)::dimension(0))
Definition: diag_tensor.h:141
constexpr auto euclidean_length(base_tensor< Tensor, T, N > const &t_in) -> T
Definition: length.h:12
constexpr auto dot(base_tensor< Tensor0, T0, N > const &lhs, base_tensor< Tensor1, T1, N > const &rhs)
Definition: tensor_operations.h:120
auto constexpr operator+(static_tensor auto const &lhs, arithmetic_or_complex auto const scalar)
Definition: operator_overloads.h:35
Definition: field.h:134
auto as_derived() -> auto &
Definition: field.h:161
Definition: field.h:13
Definition: unary_operation_field.h:15