]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Add support and implement ProductType for Trilinos Sacado::Rad numbers
authorJean-Paul Pelteret <jppelteret@gmail.com>
Fri, 3 Nov 2017 18:56:01 +0000 (19:56 +0100)
committerJean-Paul Pelteret <jppelteret@gmail.com>
Wed, 8 Nov 2017 16:01:03 +0000 (17:01 +0100)
cmake/configure/configure_2_trilinos.cmake
include/deal.II/differentiation/ad/sacado_product_types.h

index f409ba96d2eebf0020bd68982cf1cfd4e752ef9b..5c252d69a5038b9a122099d12ba9149629096b66 100644 (file)
@@ -198,7 +198,11 @@ MACRO(FEATURE_TRILINOS_CONFIGURE_EXTERNAL)
       "Sacado::Fad::DFad<double>"
       "Sacado::Fad::DFad<float>"
       "Sacado::Fad::DFad<Sacado::Fad::DFad<double>>"
-      "Sacado::Fad::DFad<Sacado::Fad::DFad<float>>")
+      "Sacado::Fad::DFad<Sacado::Fad::DFad<float>>"
+      "Sacado::Rad::ADvar<double>"
+      "Sacado::Rad::ADvar<float>"
+      "Sacado::Rad::ADvar<Sacado::Fad::DFad<double>>"
+      "Sacado::Rad::ADvar<Sacado::Fad::DFad<float>>")
 
   IF (TRILINOS_WITH_MPI)
     SET(DEAL_II_EXPAND_EPETRA_VECTOR "LinearAlgebra::EpetraWrappers::Vector")
index 0ff6ce32fcbb7e4404088e9cd5aaeca9cabd6ccc..f5b0cf8d5feb61a99ed00099770b086c35e52697 100644 (file)
@@ -1,6 +1,6 @@
 // ---------------------------------------------------------------------
 //
-// Copyright (C) 2015 by the deal.II authors
+// Copyright (C) 2015, 2017 by the deal.II authors
 //
 // This file is part of the deal.II library.
 //
 
 DEAL_II_DISABLE_EXTRA_DIAGNOSTICS
 #  include <Sacado.hpp>
+// It appears that some versions of Trilinos do not directly or indirectly
+// include all the headers for all forward and reverse Sacado AD types.
+// So we directly include these both here as a precaution.
+// Standard forward AD classes (templated)
+#  include <Sacado_Fad_DFad.hpp>
+// Reverse AD classes (templated)
+#  include <Sacado_trad.hpp>
 DEAL_II_ENABLE_EXTRA_DIAGNOSTICS
 
 DEAL_II_NAMESPACE_OPEN
 
+
+/* -------------- Sacado::Fad::DFad (Differentiation::AD::NumberTypes::[sacado_fad/sacado_fad_fad]) -------------- */
+
+
 namespace internal
 {
 
@@ -71,11 +82,12 @@ namespace internal
   template <typename T, typename U>
   struct ProductTypeImpl<Sacado::Fad::DFad<T>, Sacado::Fad::DFad<U> >
   {
-    typedef Sacado::Fad::DFad<typename ProductType<T,U>::type > type;
+    typedef Sacado::Fad::DFad<typename ProductType<T,U>::type> type;
   };
 
 }
 
+
 template <typename T>
 struct EnableIfScalar<Sacado::Fad::DFad<T> >
 {
@@ -83,6 +95,129 @@ struct EnableIfScalar<Sacado::Fad::DFad<T> >
 };
 
 
+/* -------------- Sacado::Rad::ADvar (Differentiation::AD::NumberTypes::[sacado_rad/sacado_rad_fad]) -------------- */
+
+
+namespace internal
+{
+
+  template <typename T>
+  struct ProductTypeImpl<Sacado::Rad::ADvar<T>, float>
+  {
+    typedef Sacado::Rad::ADvar<T> type;
+  };
+
+  template <typename T>
+  struct ProductTypeImpl<float, Sacado::Rad::ADvar<T> >
+  {
+    typedef Sacado::Rad::ADvar<T> type;
+  };
+
+  template <typename T>
+  struct ProductTypeImpl<Sacado::Rad::ADvar<T>, double>
+  {
+    typedef Sacado::Rad::ADvar<T> type;
+  };
+
+  template <typename T>
+  struct ProductTypeImpl<double, Sacado::Rad::ADvar<T> >
+  {
+    typedef Sacado::Rad::ADvar<T> type;
+  };
+
+  template <typename T>
+  struct ProductTypeImpl<Sacado::Rad::ADvar<T>, int>
+  {
+    typedef Sacado::Rad::ADvar<T> type;
+  };
+
+  template <typename T>
+  struct ProductTypeImpl<int, Sacado::Rad::ADvar<T> >
+  {
+    typedef Sacado::Rad::ADvar<T> type;
+  };
+
+  template <typename T, typename U>
+  struct ProductTypeImpl<Sacado::Rad::ADvar<T>, Sacado::Rad::ADvar<U> >
+  {
+    typedef Sacado::Rad::ADvar<typename ProductType<T,U>::type> type;
+  };
+
+  /* --- Sacado::Rad::ADvar: Temporary type --- */
+
+  template <typename T>
+  struct ProductTypeImpl<Sacado::Rad::ADvari<T>, float>
+  {
+    typedef Sacado::Rad::ADvari<T> type;
+  };
+
+  template <typename T>
+  struct ProductTypeImpl<float, Sacado::Rad::ADvari<T> >
+  {
+    typedef Sacado::Rad::ADvari<T> type;
+  };
+
+  template <typename T>
+  struct ProductTypeImpl<Sacado::Rad::ADvari<T>, double>
+  {
+    typedef Sacado::Rad::ADvari<T> type;
+  };
+
+  template <typename T>
+  struct ProductTypeImpl<double, Sacado::Rad::ADvari<T> >
+  {
+    typedef Sacado::Rad::ADvari<T> type;
+  };
+
+  template <typename T>
+  struct ProductTypeImpl<Sacado::Rad::ADvari<T>, int>
+  {
+    typedef Sacado::Rad::ADvari<T> type;
+  };
+
+  template <typename T>
+  struct ProductTypeImpl<int, Sacado::Rad::ADvari<T> >
+  {
+    typedef Sacado::Rad::ADvari<T> type;
+  };
+
+  template <typename T, typename U>
+  struct ProductTypeImpl<Sacado::Rad::ADvari<T>, Sacado::Rad::ADvari<U> >
+  {
+    typedef Sacado::Rad::ADvari<typename ProductType<T,U>::type> type;
+  };
+
+  /* --- Sacado::Rad::ADvar: Main and temporary type --- */
+
+  template <typename T, typename U>
+  struct ProductTypeImpl<Sacado::Rad::ADvar<T>, Sacado::Rad::ADvari<U> >
+  {
+    typedef Sacado::Rad::ADvar<typename ProductType<T,U>::type> type;
+  };
+
+  template <typename T, typename U>
+  struct ProductTypeImpl<Sacado::Rad::ADvari<T>, Sacado::Rad::ADvar<U> >
+  {
+    typedef Sacado::Rad::ADvar<typename ProductType<T,U>::type> type;
+  };
+
+}
+
+
+template <typename T>
+struct EnableIfScalar<Sacado::Rad::ADvar<T> >
+{
+  typedef Sacado::Rad::ADvar<T> type;
+};
+
+
+template <typename T>
+struct EnableIfScalar<Sacado::Rad::ADvari<T> >
+{
+  typedef Sacado::Rad::ADvari<T> type;
+};
+
+
 
 /**
  * Compute the scalar product $a:b=\sum_{i,j} a_{ij}b_{ij}$ between two

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.