15#ifndef dealii_differentiation_ad_sacado_number_types_h
16#define dealii_differentiation_ad_sacado_number_types_h
26#ifdef DEAL_II_TRILINOS_WITH_SACADO
31# include <Sacado_Fad_DFad.hpp>
32# include <Sacado_trad.hpp>
52 template <
typename NumberType,
typename =
void>
62 template <
typename NumberType,
typename =
void>
72 template <
typename NumberType,
typename =
void>
81#ifdef DEAL_II_TRILINOS_WITH_SACADO
96 template <
typename SacadoNumber,
typename =
void>
139 template <
typename SacadoNumber>
140 struct SacadoNumberInfo<
143 std::is_same_v<SacadoNumber,
144 Sacado::Fad::DFad<typename SacadoNumber::value_type>>>>
146 using ad_type = SacadoNumber;
147 using scalar_type =
typename ad_type::scalar_type;
148 using value_type =
typename ad_type::value_type;
149 using derivative_type =
typename ad_type::value_type;
151 static const unsigned int n_supported_derivative_levels =
152 1 + SacadoNumberInfo<derivative_type>::n_supported_derivative_levels;
159 template <
typename SacadoNumber>
160 struct SacadoNumberInfo<
162 std::enable_if_t<std::is_same_v<
164 Sacado::Rad::ADvar<typename SacadoNumber::value_type>>>>
166 using ad_type = SacadoNumber;
167 using scalar_type =
typename ad_type::ADVari::scalar_type;
168 using value_type =
typename ad_type::ADVari::value_type;
169 using derivative_type =
typename ad_type::ADVari::value_type;
171 static const unsigned int n_supported_derivative_levels =
172 1 + SacadoNumberInfo<derivative_type>::n_supported_derivative_levels;
182 template <
typename Number>
183 struct SacadoNumberInfo<
185 std::enable_if_t<std::is_arithmetic_v<std::decay_t<Number>>>>
187 static const unsigned int n_supported_derivative_levels = 0;
195 template <
typename ScalarType>
196 struct ADNumberInfoFromEnum<
199 std::enable_if_t<std::is_floating_point_v<ScalarType>>>
201 static const bool is_taped =
false;
202 using real_type = Sacado::Fad::DFad<ScalarType>;
203 using derivative_type =
204 typename SacadoNumberInfo<real_type>::derivative_type;
205 static const unsigned int n_supported_derivative_levels =
206 SacadoNumberInfo<real_type>::n_supported_derivative_levels;
214 template <
typename ScalarType>
215 struct ADNumberInfoFromEnum<
218 std::enable_if_t<std::is_floating_point_v<ScalarType>>>
220 static const bool is_taped =
false;
221 using real_type = Sacado::Fad::DFad<Sacado::Fad::DFad<ScalarType>>;
222 using derivative_type =
223 typename SacadoNumberInfo<real_type>::derivative_type;
224 static const unsigned int n_supported_derivative_levels =
225 SacadoNumberInfo<real_type>::n_supported_derivative_levels;
233 template <
typename ScalarType>
234 struct ADNumberInfoFromEnum<
237 std::enable_if_t<std::is_floating_point_v<ScalarType>>>
239 static const bool is_taped =
false;
240 using real_type = Sacado::Rad::ADvar<ScalarType>;
241 using derivative_type =
242 typename SacadoNumberInfo<real_type>::derivative_type;
243 static const unsigned int n_supported_derivative_levels =
244 SacadoNumberInfo<real_type>::n_supported_derivative_levels;
252 template <
typename ScalarType>
253 struct ADNumberInfoFromEnum<
256 std::enable_if_t<std::is_floating_point_v<ScalarType>>>
258 static const bool is_taped =
false;
259 using real_type = Sacado::Rad::ADvar<Sacado::Fad::DFad<ScalarType>>;
260 using derivative_type =
261 typename SacadoNumberInfo<real_type>::derivative_type;
262 static const unsigned int n_supported_derivative_levels =
263 SacadoNumberInfo<real_type>::n_supported_derivative_levels;
271 template <
typename NumberType>
272 struct Marking<Sacado::Fad::DFad<NumberType>>
275 typename SacadoNumberInfo<Sacado::Fad::DFad<NumberType>>::ad_type;
276 using derivative_type =
typename SacadoNumberInfo<
277 Sacado::Fad::DFad<NumberType>>::derivative_type;
279 typename SacadoNumberInfo<Sacado::Fad::DFad<NumberType>>::scalar_type;
285 independent_variable(
const scalar_type &in,
286 const unsigned int index,
287 const unsigned int n_independent_variables,
292 out = ad_type(n_independent_variables, index, in);
295 Marking<derivative_type>::independent_variable(
296 in, index, n_independent_variables, out.val());
303 dependent_variable(ad_type &out,
const ad_type &func)
314 template <
typename NumberType>
315 struct Marking<Sacado::Rad::ADvar<NumberType>>
318 typename SacadoNumberInfo<Sacado::Rad::ADvar<NumberType>>::ad_type;
319 using derivative_type =
typename SacadoNumberInfo<
320 Sacado::Rad::ADvar<NumberType>>::derivative_type;
321 using scalar_type =
typename SacadoNumberInfo<
322 Sacado::Rad::ADvar<NumberType>>::scalar_type;
328 independent_variable(
const scalar_type &in,
329 const unsigned int index,
330 const unsigned int n_independent_variables,
339 derivative_type derivative_initializer;
340 Marking<derivative_type>::independent_variable(
341 in, index, n_independent_variables, derivative_initializer);
344 out = derivative_initializer;
351 dependent_variable(ad_type &out,
const ad_type &func)
363 template <
typename NumberType>
364 struct ExtractData<Sacado::Fad::DFad<NumberType>>
366 using derivative_type =
typename SacadoNumberInfo<
367 Sacado::Fad::DFad<NumberType>>::derivative_type;
369 typename SacadoNumberInfo<Sacado::Fad::DFad<NumberType>>::scalar_type;
371 typename SacadoNumberInfo<Sacado::Fad::DFad<NumberType>>::value_type;
377 value(
const Sacado::Fad::DFad<NumberType> &x)
379 return ExtractData<value_type>::value(x.val());
387 n_directional_derivatives(
const Sacado::Fad::DFad<NumberType> &x)
396 static derivative_type
397 directional_derivative(
const Sacado::Fad::DFad<NumberType> &x,
398 const unsigned int direction)
400 if (x.hasFastAccess())
401 return x.fastAccessDx(direction);
403 return x.dx(direction);
413 template <
typename NumberType>
414 struct ExtractData<Sacado::Rad::ADvar<NumberType>>
416 using derivative_type =
typename SacadoNumberInfo<
417 Sacado::Rad::ADvar<NumberType>>::derivative_type;
418 using scalar_type =
typename SacadoNumberInfo<
419 Sacado::Rad::ADvar<NumberType>>::scalar_type;
421 typename SacadoNumberInfo<Sacado::Rad::ADvar<NumberType>>::value_type;
427 value(
const Sacado::Rad::ADvar<NumberType> &x)
429 return ExtractData<value_type>::value(x.val());
437 n_directional_derivatives(
const Sacado::Rad::ADvar<NumberType> &)
453 static derivative_type
454 directional_derivative(
const Sacado::Rad::ADvar<NumberType> &x,
473 template <
typename ADNumberType>
474 struct ADNumberTraits<
477 std::is_same_v<ADNumberType,
478 Sacado::Fad::DFad<typename ADNumberType::scalar_type>>>>
479 : NumberTraits<typename ADNumberType::scalar_type,
480 NumberTypes::sacado_dfad>
490 template <
typename ADNumberType>
491 struct ADNumberTraits<
494 std::is_same_v<ADNumberType,
495 std::complex<Sacado::Fad::DFad<
496 typename ADNumberType::value_type::scalar_type>>>>>
498 std::complex<typename ADNumberType::value_type::scalar_type>,
499 NumberTypes::sacado_dfad>
510 typename ADNumberTraits<Sacado::Fad::DFad<float>>::scalar_type,
511 NumberTypes::sacado_dfad>
520 struct NumberTraits<
std::complex<Sacado::Fad::DFad<float>>,
522 : NumberTraits<typename ADNumberTraits<
523 std::complex<Sacado::Fad::DFad<float>>>::scalar_type,
524 NumberTypes::sacado_dfad>
535 typename ADNumberTraits<Sacado::Fad::DFad<double>>::scalar_type,
536 NumberTypes::sacado_dfad>
545 struct NumberTraits<
std::complex<Sacado::Fad::DFad<double>>,
547 : NumberTraits<typename ADNumberTraits<
548 std::complex<Sacado::Fad::DFad<double>>>::scalar_type,
549 NumberTypes::sacado_dfad>
562 template <
typename ADNumberType>
563 struct ADNumberTraits<
565 std::enable_if_t<std::is_same_v<
567 Sacado::Rad::ADvar<typename ADNumberType::ADVari::scalar_type>>>>
568 : NumberTraits<typename ADNumberType::ADVari::scalar_type,
569 NumberTypes::sacado_rad>
580 typename ADNumberTraits<Sacado::Rad::ADvar<float>>::scalar_type,
581 NumberTypes::sacado_rad>
592 typename ADNumberTraits<Sacado::Rad::ADvar<double>>::scalar_type,
593 NumberTypes::sacado_rad>
597# ifdef DEAL_II_TRILINOS_CXX_SUPPORTS_SACADO_COMPLEX_RAD
606 template <
typename ADNumberType>
607 struct ADNumberTraits<
609 std::enable_if_t<std::is_same_v<
611 std::complex<Sacado::Rad::ADvar<
612 typename ADNumberType::value_type::ADVari::scalar_type>>>>>
614 std::complex<typename ADNumberType::value_type::ADVari::scalar_type>,
615 NumberTypes::sacado_rad>
624 struct NumberTraits<
std::complex<Sacado::Rad::ADvar<float>>,
626 : NumberTraits<typename ADNumberTraits<
627 std::complex<Sacado::Rad::ADvar<float>>>::scalar_type,
628 NumberTypes::sacado_rad>
637 struct NumberTraits<
std::complex<Sacado::Rad::ADvar<double>>,
639 : NumberTraits<typename ADNumberTraits<
640 std::complex<Sacado::Rad::ADvar<double>>>::scalar_type,
641 NumberTypes::sacado_rad>
657 template <
typename ADNumberType>
658 struct ADNumberTraits<
660 std::enable_if_t<std::is_same_v<ADNumberType,
661 Sacado::Fad::DFad<Sacado::Fad::DFad<
662 typename ADNumberType::scalar_type>>>>>
663 : NumberTraits<typename ADNumberType::scalar_type,
664 NumberTypes::sacado_dfad_dfad>
675 template <
typename ADNumberType>
676 struct ADNumberTraits<
679 std::is_same_v<ADNumberType,
680 std::complex<Sacado::Fad::DFad<Sacado::Fad::DFad<
681 typename ADNumberType::value_type::scalar_type>>>>>>
683 std::complex<typename ADNumberType::value_type::scalar_type>,
684 NumberTypes::sacado_dfad_dfad>
693 struct NumberTraits<Sacado::Fad::DFad<Sacado::Fad::DFad<float>>,
695 : NumberTraits<typename ADNumberTraits<Sacado::Fad::DFad<
696 Sacado::Fad::DFad<float>>>::scalar_type,
697 NumberTypes::sacado_dfad_dfad>
707 std::complex<Sacado::Fad::DFad<Sacado::Fad::DFad<float>>>,
709 : NumberTraits<typename ADNumberTraits<std::complex<Sacado::Fad::DFad<
710 Sacado::Fad::DFad<float>>>>::scalar_type,
711 NumberTypes::sacado_dfad_dfad>
720 struct NumberTraits<Sacado::Fad::DFad<Sacado::Fad::DFad<double>>,
722 : NumberTraits<typename ADNumberTraits<Sacado::Fad::DFad<
723 Sacado::Fad::DFad<double>>>::scalar_type,
724 NumberTypes::sacado_dfad_dfad>
734 std::complex<Sacado::Fad::DFad<Sacado::Fad::DFad<double>>>,
736 : NumberTraits<typename ADNumberTraits<std::complex<Sacado::Fad::DFad<
737 Sacado::Fad::DFad<double>>>>::scalar_type,
738 NumberTypes::sacado_dfad_dfad>
751 template <
typename ADNumberType>
752 struct ADNumberTraits<ADNumberType,
753 std::enable_if_t<std::is_same_v<
755 Sacado::Rad::ADvar<Sacado::Fad::DFad<
756 typename ADNumberType::ADVari::scalar_type>>>>>
757 : NumberTraits<typename ADNumberType::ADVari::scalar_type,
758 NumberTypes::sacado_rad_dfad>
767 struct NumberTraits<Sacado::Rad::ADvar<Sacado::Fad::DFad<float>>,
769 : NumberTraits<typename ADNumberTraits<Sacado::Rad::ADvar<
770 Sacado::Fad::DFad<float>>>::scalar_type,
771 NumberTypes::sacado_rad_dfad>
780 struct NumberTraits<Sacado::Rad::ADvar<Sacado::Fad::DFad<double>>,
782 : NumberTraits<typename ADNumberTraits<Sacado::Rad::ADvar<
783 Sacado::Fad::DFad<double>>>::scalar_type,
784 NumberTypes::sacado_rad_dfad>
788# ifdef DEAL_II_TRILINOS_CXX_SUPPORTS_SACADO_COMPLEX_RAD
798 template <
typename ADNumberType>
799 struct ADNumberTraits<
801 std::enable_if_t<std::is_same_v<
803 std::complex<Sacado::Rad::ADvar<Sacado::Fad::DFad<
804 typename ADNumberType::value_type::ADVari::scalar_type>>>>>>
806 std::complex<typename ADNumberType::value_type::ADVari::scalar_type>,
807 NumberTypes::sacado_rad_dfad>
817 std::complex<Sacado::Rad::ADvar<Sacado::Fad::DFad<float>>>,
819 : NumberTraits<typename ADNumberTraits<std::complex<Sacado::Rad::ADvar<
820 Sacado::Fad::DFad<float>>>>::scalar_type,
821 NumberTypes::sacado_rad_dfad>
831 std::complex<Sacado::Rad::ADvar<Sacado::Fad::DFad<double>>>,
833 : NumberTraits<typename ADNumberTraits<std::complex<Sacado::Rad::ADvar<
834 Sacado::Fad::DFad<double>>>>::scalar_type,
835 NumberTypes::sacado_rad_dfad>
845 template <
typename NumberType>
846 struct is_sacado_dfad_number<
848 std::enable_if_t<ADNumberTraits<std::decay_t<NumberType>>::type_code ==
849 NumberTypes::sacado_dfad ||
850 ADNumberTraits<std::decay_t<NumberType>>::type_code ==
851 NumberTypes::sacado_dfad_dfad>> : std::true_type
855 template <
typename NumberType>
856 struct is_sacado_dfad_number<
859 std::is_same_v<NumberType,
860 Sacado::Fad::Expr<typename NumberType::value_type>>>>
865 template <
typename NumberType>
866 struct is_sacado_rad_number<
868 std::enable_if_t<ADNumberTraits<std::decay_t<NumberType>>::type_code ==
869 NumberTypes::sacado_rad ||
870 ADNumberTraits<std::decay_t<NumberType>>::type_code ==
871 NumberTypes::sacado_rad_dfad>> : std::true_type
875 template <
typename NumberType>
876 struct is_sacado_rad_number<
879 std::is_same_v<NumberType,
880 Sacado::Rad::ADvari<Sacado::Fad::DFad<
881 typename NumberType::ADVari::scalar_type>>>>>
886 template <
typename NumberType>
887 struct is_sacado_number<
889 std::enable_if_t<is_sacado_dfad_number<NumberType>::value ||
890 is_sacado_rad_number<NumberType>::value>>
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE