Sacado Package Browser (Single Doxygen Collection)  Version of the Day
Sacado_Fad_DFadTraits.hpp
Go to the documentation of this file.
1 // @HEADER
2 // ***********************************************************************
3 //
4 // Sacado Package
5 // Copyright (2006) Sandia Corporation
6 //
7 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
8 // the U.S. Government retains certain rights in this software.
9 //
10 // This library is free software; you can redistribute it and/or modify
11 // it under the terms of the GNU Lesser General Public License as
12 // published by the Free Software Foundation; either version 2.1 of the
13 // License, or (at your option) any later version.
14 //
15 // This library is distributed in the hope that it will be useful, but
16 // WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 // Lesser General Public License for more details.
19 //
20 // You should have received a copy of the GNU Lesser General Public
21 // License along with this library; if not, write to the Free Software
22 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
23 // USA
24 // Questions? Contact David M. Gay (dmgay@sandia.gov) or Eric T. Phipps
25 // (etphipp@sandia.gov).
26 //
27 // ***********************************************************************
28 //
29 // The forward-mode AD classes in Sacado are a derivative work of the
30 // expression template classes in the Fad package by Nicolas Di Cesare.
31 // The following banner is included in the original Fad source code:
32 //
33 // ************ DO NOT REMOVE THIS BANNER ****************
34 //
35 // Nicolas Di Cesare <Nicolas.Dicesare@ann.jussieu.fr>
36 // http://www.ann.jussieu.fr/~dicesare
37 //
38 // CEMRACS 98 : C++ courses,
39 // templates : new C++ techniques
40 // for scientific computing
41 //
42 //********************************************************
43 //
44 // NumericalTraits class to illustrate TRAITS
45 //
46 //********************************************************
47 // @HEADER
48 
49 #ifndef SACADO_FAD_DFADTRAITS_HPP
50 #define SACADO_FAD_DFADTRAITS_HPP
51 
52 #include "Sacado_ConfigDefs.h"
53 
54 #ifdef SACADO_NEW_FAD_DESIGN_IS_DEFAULT
55 
57 
58 #else
59 
60 #include "Sacado_Traits.hpp"
61 
62 // Forward declarations
63 namespace Sacado {
64  namespace Fad {
65  template <typename T> class DFad;
66  }
67 }
68 
69 namespace Sacado {
70 
73 
74 
75  template <typename ValueT>
76  struct ScalarType< Fad::DFad<ValueT> > {
77  typedef typename Fad::DFad<ValueT>::ScalarT type;
78  };
79 
81  template <typename ValueT>
82  struct ValueType< Fad::DFad<ValueT> > {
83  typedef ValueT type;
84  };
85 
87  template <typename ValueT>
88  struct IsADType< Fad::DFad<ValueT> > {
89  static const bool value = true;
90  };
91 
93  template <typename ValueT>
94  struct IsScalarType< Fad::DFad<ValueT> > {
95  static const bool value = false;
96  };
97 
99  template <typename ValueT>
100  struct IsSimdType< Fad::DFad<ValueT> > {
101  static const bool value = IsSimdType<ValueT>::value;
102  };
103 
105  template <typename ValueT>
106  struct Value< Fad::DFad<ValueT> > {
107  typedef typename ValueType< Fad::DFad<ValueT> >::type value_type;
109  static const value_type& eval(const Fad::DFad<ValueT>& x) {
110  return x.val(); }
111  };
112 
114  template <typename ValueT>
115  struct ScalarValue< Fad::DFad<ValueT> > {
116  typedef typename ValueType< Fad::DFad<ValueT> >::type value_type;
117  typedef typename ScalarType< Fad::DFad<ValueT> >::type scalar_type;
119  static const scalar_type& eval(const Fad::DFad<ValueT>& x) {
120  return ScalarValue<value_type>::eval(x.val()); }
121  };
122 
124  template <typename ValueT>
125  struct StringName< Fad::DFad<ValueT> > {
126  static std::string eval() {
127  return std::string("Sacado::Fad::DFad< ") +
128  StringName<ValueT>::eval() + " >"; }
129  };
130 
132  template <typename ValueT>
133  struct IsEqual< Fad::DFad<ValueT> > {
135  static bool eval(const Fad::DFad<ValueT>& x, const Fad::DFad<ValueT>& y) {
136  return x.isEqualTo(y);
137  }
138  };
139 
141  template <typename ValueT>
142  struct IsStaticallySized< Fad::DFad<ValueT> > {
143  static const bool value = false;
144  };
145 
147  template <typename ValueT>
148  struct IsStaticallySized< const Fad::DFad<ValueT> > {
149  static const bool value = false;
150  };
151 
152 } // namespace Sacado
153 
154 //
155 // Define Teuchos traits classes
156 //
157 
158 // Promotion traits
159 #ifdef HAVE_SACADO_TEUCHOSNUMERICS
160 #include "Teuchos_PromotionTraits.hpp"
161 namespace Teuchos {
162  template <typename ValueT>
163  struct PromotionTraits< Sacado::Fad::DFad<ValueT>,
164  Sacado::Fad::DFad<ValueT> > {
167  promote;
168  };
169 
170  template <typename ValueT, typename R>
171  struct PromotionTraits< Sacado::Fad::DFad<ValueT>, R > {
172  typedef typename Sacado::Promote< Sacado::Fad::DFad<ValueT>, R >::type
173  promote;
174  };
175 
176  template <typename L, typename ValueT>
177  struct PromotionTraits< L, Sacado::Fad::DFad<ValueT> > {
178  public:
179  typedef typename Sacado::Promote< L, Sacado::Fad::DFad<ValueT> >::type
180  promote;
181  };
182 }
183 #endif
184 
185 // Scalar traits
186 #ifdef HAVE_SACADO_TEUCHOSCORE
188 namespace Teuchos {
189  template <typename ValueT>
190  struct ScalarTraits< Sacado::Fad::DFad<ValueT> > :
191  public Sacado::Fad::ScalarTraitsImp< Sacado::Fad::DFad<ValueT> >
192  {};
193 }
194 #endif
195 
196 // Serialization traits
197 #ifdef HAVE_SACADO_TEUCHOSCOMM
199 namespace Teuchos {
200  template <typename Ordinal, typename ValueT>
201  struct SerializationTraits<Ordinal, Sacado::Fad::DFad<ValueT> > :
202  public Sacado::Fad::SerializationTraitsImp< Ordinal,
203  Sacado::Fad::DFad<ValueT> >
204  {};
205 
206  template <typename Ordinal, typename ValueT>
207  struct ValueTypeSerializer<Ordinal, Sacado::Fad::DFad<ValueT> > :
208  public Sacado::Fad::SerializerImp< Ordinal,
209  Sacado::Fad::DFad<ValueT>,
210  ValueTypeSerializer<Ordinal,ValueT> >
211  {
213  typedef ValueTypeSerializer<Ordinal,ValueT> ValueSerializer;
214  typedef Sacado::Fad::SerializerImp< Ordinal,FadType,ValueSerializer> Base;
215  ValueTypeSerializer(const Teuchos::RCP<const ValueSerializer>& vs,
216  Ordinal sz = 0) :
217  Base(vs, sz) {}
218  };
219 }
220 #endif
221 
222 // KokkosComm
223 #if defined(HAVE_SACADO_KOKKOSCORE) && defined(HAVE_SACADO_TEUCHOSKOKKOSCOMM) && defined(HAVE_SACADO_VIEW_SPEC) && !defined(SACADO_DISABLE_FAD_VIEW_SPEC)
224 #include "KokkosExp_View_Fad.hpp"
225 #endif
226 
227 #endif // SACADO_NEW_FAD_DESIGN_IS_DEFAULT
228 
229 #endif // SACADO_FAD_DFADTRAITS_HPP
int Ordinal
#define KOKKOS_INLINE_FUNCTION
#define SACADO_FAD_PROMOTE_SPEC(NS, FAD)
Sacado::Fad::DFad< double > FadType
GeneralFad< DynamicStorage< T > > DFad
Base template specification for IsADType.
static const bool value
static KOKKOS_INLINE_FUNCTION bool eval(const Fad::DFad< ValueT > &x, const Fad::DFad< ValueT > &y)
Base template specification for testing equivalence.
Base template specification for IsScalarType.
static const bool value
Base template specification for IsSimdType.
static const bool value
Base template specification for testing whether type is statically sized.
Base template specification for Promote.
Base template specification for ScalarType.
static KOKKOS_INLINE_FUNCTION const scalar_type & eval(const Fad::DFad< ValueT > &x)
ScalarType< Fad::DFad< ValueT > >::type scalar_type
ValueType< Fad::DFad< ValueT > >::type value_type
Base template specification for ScalarValue.
static KOKKOS_INLINE_FUNCTION const T & eval(const T &x)
Base template specification for string names of types.
static std::string eval()
Base template specification for ValueType.
ValueType< Fad::DFad< ValueT > >::type value_type
static KOKKOS_INLINE_FUNCTION const value_type & eval(const Fad::DFad< ValueT > &x)
Base template specification for Value.