VCCC  2024.05
VisualCamp Common C++ library
partial_diff.hpp
Go to the documentation of this file.
1 # /*
2 # * Created by YongGyu Lee on 2020/12/08.
3 # */
4 #
5 # ifndef VCCC_MATH_PARTIAL_DIFF_HPP
6 # define VCCC_MATH_PARTIAL_DIFF_HPP
7 #
8 # include <limits>
9 #
11 # include "vccc/__math/epsilon.hpp"
12 # include "vccc/__math/matrix.hpp"
13 
14 namespace vccc {
15 
16 //struct differential_rk_4 {};
17 
18 //constexpr differential_newtonian_t differential_newtonian;
19 //constexpr differential_symmetric_t differential_symmetric;
20 
23 
24 
25 
26 //template<std::size_t i, typename MatExpr, typename Epsilon>
27 //inline constexpr decltype(auto)
28 //addEpsilon(MatrixBase<MatExpr> vars, Epsilon epsilon) {
29 // at<i>(vars) += at<i>(vars) == 0 ? epsilon : at<i>(vars) * epsilon;
30 // return vars;
31 //}
32 //
33 //template<typename MatExpr, typename Epsilon>
34 //constexpr decltype(auto)
35 //addEpsilon(std::size_t i, MatrixBase<MatExpr> vars, Epsilon epsilon) {
36 // vars(i) += vars(i) == 0 ? epsilon : vars(i) * epsilon;
37 // return vars;
38 //}
39 
43 
70 template<typename T, std::size_t I,
71  typename Func, typename VarTuple, typename ...Args>
72 auto partialDiff(differential_symmetric_t, Func f, VarTuple vars, Args&&... args) {
73  auto x1 = addEpsilon<I>(vars, epsilon<T>());
74  auto x2 = addEpsilon<I>(vars, -epsilon<T>());
75  auto dx = std::get<I>(x1) - std::get<I>(x2);
76 
77  auto fx1 = internal::math::applyTupleAndVariadics(f, x1, args...);
78  auto fx2 = internal::math::applyTupleAndVariadics(f, x2, args...);
79  return (fx1 - fx2) / dx;
80 }
81 
95 template<typename T, std::size_t I,
96  typename Func, typename VarTuple, typename ...Args>
97 auto
98 partialDiff(differential_newtonian_t, Func f, VarTuple vars, Args&&... args)
99 {
100  auto x1 = addEpsilon<I>(vars, epsilon<T>());
101  auto x2 = vars;
102  auto dx = std::get<I>(x1) - std::get<I>(x2);
103 
104  auto fx1 = internal::math::applyTupleAndVariadics(f, x1, args...);
105  auto fx2 = internal::math::applyTupleAndVariadics(f, x2, args...);
106  return (fx1 - fx2) / dx;
107 }
108 
121 template<typename T, std::size_t I,
122  typename Func, typename VarTuple, typename ...Args>
123 auto
124 partialDiff(differential_five_point_stencil_t, Func f, VarTuple vars, Args&&... args)
125 {
126  auto x1 = addEpsilon<I>(vars, 2 * epsilon<T>());
127  auto x2 = addEpsilon<I>(vars, epsilon<T>());
128  auto x3 = addEpsilon<I>(vars, - epsilon<T>());
129  auto x4 = addEpsilon<I>(vars, -2 * epsilon<T>());
130 
131  auto fx1 = internal::math::applyTupleAndVariadics(f, x1, args...);
132  auto fx2 = internal::math::applyTupleAndVariadics(f, x2, args...);
133  auto fx3 = internal::math::applyTupleAndVariadics(f, x3, args...);
134  auto fx4 = internal::math::applyTupleAndVariadics(f, x4, args...);
135 
136  // TODO: get real dx
137  auto fsum = -fx1 + 8*fx2 - 8*fx3 + fx4;
138  if(std::get<I>(vars) == 0)
139  return fsum / (epsilon<T>() * 12);
140  return fsum / (std::get<I>(vars) * (epsilon<T>() * 12));
141 }
142 
144 
146 
147 //template<typename T, std::size_t I,
148 // typename Func, typename VarTuple, typename ...Args>
149 //auto
150 //partialDiff(differential_rk_4, Func f, VarTuple vars, Args&&... args){
151 // auto x1 = addEpsilon<I>(vars, 2 * epsilon<T>());
152 // auto x2 = addEpsilon<I>(vars, epsilon<T>());
153 // auto x3 = addEpsilon<I>(vars, - epsilon<T>());
154 // auto x4 = addEpsilon<I>(vars, -2 * epsilon<T>());
155 //
156 // auto fx1 = internal::math::applyTupleAndVariadics(f, x1, args...);
157 // auto fx2 = internal::math::applyTupleAndVariadics(f, x2, args...);
158 // auto fx3 = internal::math::applyTupleAndVariadics(f, x3, args...);
159 // auto fx4 = internal::math::applyTupleAndVariadics(f, x4, args...);
160 //
161 // auto fsum = -fx1 + 8*fx2 - 8*fx3 + fx4;
162 // if(std::get<I>(vars) == 0)
163 // return fsum / (epsilon<T>() * 12);
164 // return fsum / (std::get<I>(vars) * (epsilon<T>() * 12));
165 //}
166 
167 } // namespace vccc
168 
169 # endif // VCCC_MATH_PARTIAL_DIFF_HPP
auto partialDiff(differential_symmetric_t, Func f, VarTuple vars, Args &&... args)
get partial differential value using symmetric method
Definition: partial_diff.hpp:72
Definition: directory.h:12
Definition: partial_diff.hpp:42
Definition: partial_diff.hpp:40
Definition: partial_diff.hpp:41