Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #ifdef SPECTRE_AUTODIFF
7 :
8 : #include <autodiff/common/numbertraits.hpp>
9 : #include <autodiff/forward/dual.hpp>
10 : #include <autodiff/reverse/var.hpp>
11 :
12 : #include "Utilities/MakeWithValue.hpp"
13 : #include "Utilities/Simd/Simd.hpp"
14 :
15 0 : namespace autodiff {
16 0 : using BatchType = simd::batch<double>;
17 0 : using SecondOrderDual = autodiff::HigherOrderDual<2, BatchType>;
18 0 : using SecondOrderDualNum = autodiff::HigherOrderDual<2, double>;
19 :
20 : namespace detail {
21 : /// Template specialization for simd::batch<double> to treat it as arithmetic.
22 : // The major difficulty we have with DataVector working with autodiff is
23 : // DataVector does not have a scalar broadcast constructor, which is expected
24 : // in the seed function for autodiff dual type.
25 : template <>
26 : struct ArithmeticTraits<simd::batch<double>> {
27 : static constexpr bool isArithmetic = true;
28 : };
29 : } // namespace detail
30 : } // namespace autodiff
31 :
32 : namespace MakeWithValueImpls {
33 : template <typename T>
34 0 : struct MakeWithValueImpl<autodiff::HigherOrderDual<2, double>, T> {
35 0 : static SPECTRE_ALWAYS_INLINE autodiff::HigherOrderDual<2, double> apply(
36 : const T& /* input */, const double value) {
37 : return {value};
38 : }
39 : };
40 :
41 : template <typename T>
42 0 : struct MakeWithValueImpl<autodiff::HigherOrderDual<2, simd::batch<double>>, T> {
43 : static SPECTRE_ALWAYS_INLINE autodiff::HigherOrderDual<2, simd::batch<double>>
44 0 : apply(const T& /* input */, const double value) {
45 : return {simd::batch<double>::broadcast(value)};
46 : }
47 : };
48 : } // namespace MakeWithValueImpls
49 :
50 : #endif // SPECTRE_AUTODIFF
|