13#ifndef dealii_differentiation_ad_sacado_number_types_h
14#define dealii_differentiation_ad_sacado_number_types_h
24#ifdef DEAL_II_TRILINOS_WITH_SACADO
29# include <Sacado_Fad_DFad.hpp>
30# include <Sacado_trad.hpp>
50 template <
typename NumberType,
typename =
void>
60 template <
typename NumberType,
typename =
void>
70 template <
typename NumberType,
typename =
void>
79#ifdef DEAL_II_TRILINOS_WITH_SACADO
94 template <
typename SacadoNumber,
typename =
void>
137 template <
typename SacadoNumber>
138 struct SacadoNumberInfo<
141 std::is_same_v<SacadoNumber,
142 Sacado::Fad::DFad<typename SacadoNumber::value_type>>>>
144 using ad_type = SacadoNumber;
145 using scalar_type =
typename ad_type::scalar_type;
146 using value_type =
typename ad_type::value_type;
147 using derivative_type =
typename ad_type::value_type;
149 static const unsigned int n_supported_derivative_levels =
150 1 + SacadoNumberInfo<derivative_type>::n_supported_derivative_levels;
157 template <
typename SacadoNumber>
158 struct SacadoNumberInfo<
160 std::enable_if_t<std::is_same_v<
162 Sacado::Rad::ADvar<typename SacadoNumber::value_type>>>>
164 using ad_type = SacadoNumber;
165 using scalar_type =
typename ad_type::ADVari::scalar_type;
166 using value_type =
typename ad_type::ADVari::value_type;
167 using derivative_type =
typename ad_type::ADVari::value_type;
169 static const unsigned int n_supported_derivative_levels =
170 1 + SacadoNumberInfo<derivative_type>::n_supported_derivative_levels;
180 template <
typename Number>
181 struct SacadoNumberInfo<
183 std::enable_if_t<std::is_arithmetic_v<std::decay_t<Number>>>>
185 static const unsigned int n_supported_derivative_levels = 0;
193 template <
typename ScalarType>
194 struct ADNumberInfoFromEnum<
197 std::enable_if_t<std::is_floating_point_v<ScalarType>>>
199 static const bool is_taped =
false;
200 using real_type = Sacado::Fad::DFad<ScalarType>;
201 using derivative_type =
202 typename SacadoNumberInfo<real_type>::derivative_type;
203 static const unsigned int n_supported_derivative_levels =
204 SacadoNumberInfo<real_type>::n_supported_derivative_levels;
212 template <
typename ScalarType>
213 struct ADNumberInfoFromEnum<
216 std::enable_if_t<std::is_floating_point_v<ScalarType>>>
218 static const bool is_taped =
false;
219 using real_type = Sacado::Fad::DFad<Sacado::Fad::DFad<ScalarType>>;
220 using derivative_type =
221 typename SacadoNumberInfo<real_type>::derivative_type;
222 static const unsigned int n_supported_derivative_levels =
223 SacadoNumberInfo<real_type>::n_supported_derivative_levels;
231 template <
typename ScalarType>
232 struct ADNumberInfoFromEnum<
235 std::enable_if_t<std::is_floating_point_v<ScalarType>>>
237 static const bool is_taped =
false;
238 using real_type = Sacado::Rad::ADvar<ScalarType>;
239 using derivative_type =
240 typename SacadoNumberInfo<real_type>::derivative_type;
241 static const unsigned int n_supported_derivative_levels =
242 SacadoNumberInfo<real_type>::n_supported_derivative_levels;
250 template <
typename ScalarType>
251 struct ADNumberInfoFromEnum<
254 std::enable_if_t<std::is_floating_point_v<ScalarType>>>
256 static const bool is_taped =
false;
257 using real_type = Sacado::Rad::ADvar<Sacado::Fad::DFad<ScalarType>>;
258 using derivative_type =
259 typename SacadoNumberInfo<real_type>::derivative_type;
260 static const unsigned int n_supported_derivative_levels =
261 SacadoNumberInfo<real_type>::n_supported_derivative_levels;
269 template <
typename NumberType>
270 struct Marking<Sacado::Fad::DFad<NumberType>>
273 typename SacadoNumberInfo<Sacado::Fad::DFad<NumberType>>::ad_type;
274 using derivative_type =
typename SacadoNumberInfo<
275 Sacado::Fad::DFad<NumberType>>::derivative_type;
277 typename SacadoNumberInfo<Sacado::Fad::DFad<NumberType>>::scalar_type;
283 independent_variable(
const scalar_type &in,
284 const unsigned int index,
285 const unsigned int n_independent_variables,
290 out = ad_type(n_independent_variables, index, in);
293 Marking<derivative_type>::independent_variable(
294 in, index, n_independent_variables, out.val());
301 dependent_variable(ad_type &out,
const ad_type &func)
312 template <
typename NumberType>
313 struct Marking<Sacado::Rad::ADvar<NumberType>>
316 typename SacadoNumberInfo<Sacado::Rad::ADvar<NumberType>>::ad_type;
317 using derivative_type =
typename SacadoNumberInfo<
318 Sacado::Rad::ADvar<NumberType>>::derivative_type;
319 using scalar_type =
typename SacadoNumberInfo<
320 Sacado::Rad::ADvar<NumberType>>::scalar_type;
326 independent_variable(
const scalar_type &in,
327 const unsigned int index,
328 const unsigned int n_independent_variables,
337 derivative_type derivative_initializer;
338 Marking<derivative_type>::independent_variable(
339 in, index, n_independent_variables, derivative_initializer);
342 out = derivative_initializer;
349 dependent_variable(ad_type &out,
const ad_type &func)
361 template <
typename NumberType>
362 struct ExtractData<Sacado::Fad::DFad<NumberType>>
364 using derivative_type =
typename SacadoNumberInfo<
365 Sacado::Fad::DFad<NumberType>>::derivative_type;
367 typename SacadoNumberInfo<Sacado::Fad::DFad<NumberType>>::scalar_type;
369 typename SacadoNumberInfo<Sacado::Fad::DFad<NumberType>>
::value_type;
375 value(
const Sacado::Fad::DFad<NumberType> &x)
377 return ExtractData<value_type>::value(x.val());
385 n_directional_derivatives(
const Sacado::Fad::DFad<NumberType> &x)
394 static derivative_type
395 directional_derivative(
const Sacado::Fad::DFad<NumberType> &x,
396 const unsigned int direction)
398 if (x.hasFastAccess())
399 return x.fastAccessDx(direction);
401 return x.dx(direction);
411 template <
typename NumberType>
412 struct ExtractData<Sacado::Rad::ADvar<NumberType>>
414 using derivative_type =
typename SacadoNumberInfo<
415 Sacado::Rad::ADvar<NumberType>>::derivative_type;
416 using scalar_type =
typename SacadoNumberInfo<
417 Sacado::Rad::ADvar<NumberType>>::scalar_type;
419 typename SacadoNumberInfo<Sacado::Rad::ADvar<NumberType>>
::value_type;
425 value(
const Sacado::Rad::ADvar<NumberType> &x)
427 return ExtractData<value_type>::value(x.val());
435 n_directional_derivatives(
const Sacado::Rad::ADvar<NumberType> &)
451 static derivative_type
452 directional_derivative(
const Sacado::Rad::ADvar<NumberType> &x,
471 template <
typename ADNumberType>
472 struct ADNumberTraits<
475 std::is_same_v<ADNumberType,
476 Sacado::Fad::DFad<typename ADNumberType::scalar_type>>>>
477 : NumberTraits<typename ADNumberType::scalar_type,
478 NumberTypes::sacado_dfad>
488 template <
typename ADNumberType>
489 struct ADNumberTraits<
492 std::is_same_v<ADNumberType,
493 std::complex<Sacado::Fad::DFad<
494 typename ADNumberType::value_type::scalar_type>>>>>
496 std::complex<typename ADNumberType::value_type::scalar_type>,
497 NumberTypes::sacado_dfad>
508 typename ADNumberTraits<Sacado::Fad::DFad<float>>::scalar_type,
509 NumberTypes::sacado_dfad>
518 struct NumberTraits<
std::complex<Sacado::Fad::DFad<float>>,
520 : NumberTraits<typename ADNumberTraits<
521 std::complex<Sacado::Fad::DFad<float>>>::scalar_type,
522 NumberTypes::sacado_dfad>
533 typename ADNumberTraits<Sacado::Fad::DFad<double>>::scalar_type,
534 NumberTypes::sacado_dfad>
543 struct NumberTraits<
std::complex<Sacado::Fad::DFad<double>>,
545 : NumberTraits<typename ADNumberTraits<
546 std::complex<Sacado::Fad::DFad<double>>>::scalar_type,
547 NumberTypes::sacado_dfad>
560 template <
typename ADNumberType>
561 struct ADNumberTraits<
563 std::enable_if_t<std::is_same_v<
565 Sacado::Rad::ADvar<typename ADNumberType::ADVari::scalar_type>>>>
566 : NumberTraits<typename ADNumberType::ADVari::scalar_type,
567 NumberTypes::sacado_rad>
578 typename ADNumberTraits<Sacado::Rad::ADvar<float>>::scalar_type,
579 NumberTypes::sacado_rad>
590 typename ADNumberTraits<Sacado::Rad::ADvar<double>>::scalar_type,
591 NumberTypes::sacado_rad>
595# ifdef DEAL_II_TRILINOS_CXX_SUPPORTS_SACADO_COMPLEX_RAD
604 template <
typename ADNumberType>
605 struct ADNumberTraits<
607 std::enable_if_t<std::is_same_v<
609 std::complex<Sacado::Rad::ADvar<
610 typename ADNumberType::value_type::ADVari::scalar_type>>>>>
612 std::complex<typename ADNumberType::value_type::ADVari::scalar_type>,
613 NumberTypes::sacado_rad>
622 struct NumberTraits<
std::complex<Sacado::Rad::ADvar<float>>,
624 : NumberTraits<typename ADNumberTraits<
625 std::complex<Sacado::Rad::ADvar<float>>>::scalar_type,
626 NumberTypes::sacado_rad>
635 struct NumberTraits<
std::complex<Sacado::Rad::ADvar<double>>,
637 : NumberTraits<typename ADNumberTraits<
638 std::complex<Sacado::Rad::ADvar<double>>>::scalar_type,
639 NumberTypes::sacado_rad>
655 template <
typename ADNumberType>
656 struct ADNumberTraits<
658 std::enable_if_t<std::is_same_v<ADNumberType,
659 Sacado::Fad::DFad<Sacado::Fad::DFad<
660 typename ADNumberType::scalar_type>>>>>
661 : NumberTraits<typename ADNumberType::scalar_type,
662 NumberTypes::sacado_dfad_dfad>
673 template <
typename ADNumberType>
674 struct ADNumberTraits<
677 std::is_same_v<ADNumberType,
678 std::complex<Sacado::Fad::DFad<Sacado::Fad::DFad<
679 typename ADNumberType::value_type::scalar_type>>>>>>
681 std::complex<typename ADNumberType::value_type::scalar_type>,
682 NumberTypes::sacado_dfad_dfad>
691 struct NumberTraits<Sacado::Fad::DFad<Sacado::Fad::DFad<float>>,
693 : NumberTraits<typename ADNumberTraits<Sacado::Fad::DFad<
694 Sacado::Fad::DFad<float>>>::scalar_type,
695 NumberTypes::sacado_dfad_dfad>
705 std::complex<Sacado::Fad::DFad<Sacado::Fad::DFad<float>>>,
707 : NumberTraits<typename ADNumberTraits<std::complex<Sacado::Fad::DFad<
708 Sacado::Fad::DFad<float>>>>::scalar_type,
709 NumberTypes::sacado_dfad_dfad>
718 struct NumberTraits<Sacado::Fad::DFad<Sacado::Fad::DFad<double>>,
720 : NumberTraits<typename ADNumberTraits<Sacado::Fad::DFad<
721 Sacado::Fad::DFad<double>>>::scalar_type,
722 NumberTypes::sacado_dfad_dfad>
732 std::complex<Sacado::Fad::DFad<Sacado::Fad::DFad<double>>>,
734 : NumberTraits<typename ADNumberTraits<std::complex<Sacado::Fad::DFad<
735 Sacado::Fad::DFad<double>>>>::scalar_type,
736 NumberTypes::sacado_dfad_dfad>
749 template <
typename ADNumberType>
750 struct ADNumberTraits<ADNumberType,
751 std::enable_if_t<std::is_same_v<
753 Sacado::Rad::ADvar<Sacado::Fad::DFad<
754 typename ADNumberType::ADVari::scalar_type>>>>>
755 : NumberTraits<typename ADNumberType::ADVari::scalar_type,
756 NumberTypes::sacado_rad_dfad>
765 struct NumberTraits<Sacado::Rad::ADvar<Sacado::Fad::DFad<float>>,
767 : NumberTraits<typename ADNumberTraits<Sacado::Rad::ADvar<
768 Sacado::Fad::DFad<float>>>::scalar_type,
769 NumberTypes::sacado_rad_dfad>
778 struct NumberTraits<Sacado::Rad::ADvar<Sacado::Fad::DFad<double>>,
780 : NumberTraits<typename ADNumberTraits<Sacado::Rad::ADvar<
781 Sacado::Fad::DFad<double>>>::scalar_type,
782 NumberTypes::sacado_rad_dfad>
786# ifdef DEAL_II_TRILINOS_CXX_SUPPORTS_SACADO_COMPLEX_RAD
796 template <
typename ADNumberType>
797 struct ADNumberTraits<
799 std::enable_if_t<std::is_same_v<
801 std::complex<Sacado::Rad::ADvar<Sacado::Fad::DFad<
802 typename ADNumberType::value_type::ADVari::scalar_type>>>>>>
804 std::complex<typename ADNumberType::value_type::ADVari::scalar_type>,
805 NumberTypes::sacado_rad_dfad>
815 std::complex<Sacado::Rad::ADvar<Sacado::Fad::DFad<float>>>,
817 : NumberTraits<typename ADNumberTraits<std::complex<Sacado::Rad::ADvar<
818 Sacado::Fad::DFad<float>>>>::scalar_type,
819 NumberTypes::sacado_rad_dfad>
829 std::complex<Sacado::Rad::ADvar<Sacado::Fad::DFad<double>>>,
831 : NumberTraits<typename ADNumberTraits<std::complex<Sacado::Rad::ADvar<
832 Sacado::Fad::DFad<double>>>>::scalar_type,
833 NumberTypes::sacado_rad_dfad>
843 template <
typename NumberType>
844 struct is_sacado_dfad_number<
846 std::enable_if_t<ADNumberTraits<std::decay_t<NumberType>>::type_code ==
847 NumberTypes::sacado_dfad ||
848 ADNumberTraits<std::decay_t<NumberType>>::type_code ==
849 NumberTypes::sacado_dfad_dfad>> : std::true_type
853 template <
typename NumberType>
854 struct is_sacado_dfad_number<
857 std::is_same_v<NumberType,
858 Sacado::Fad::Expr<typename NumberType::value_type>>>>
863 template <
typename NumberType>
864 struct is_sacado_rad_number<
866 std::enable_if_t<ADNumberTraits<std::decay_t<NumberType>>::type_code ==
867 NumberTypes::sacado_rad ||
868 ADNumberTraits<std::decay_t<NumberType>>::type_code ==
869 NumberTypes::sacado_rad_dfad>> : std::true_type
873 template <
typename NumberType>
874 struct is_sacado_rad_number<
877 std::is_same_v<NumberType,
878 Sacado::Rad::ADvari<Sacado::Fad::DFad<
879 typename NumberType::ADVari::scalar_type>>>>>
884 template <
typename NumberType>
885 struct is_sacado_number<
887 std::enable_if_t<is_sacado_dfad_number<NumberType>::value ||
888 is_sacado_rad_number<NumberType>::value>>
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
* * * RotationFunction< dim, Number >::RotationFunction Number(dim)