Sacado Package Browser (Single Doxygen Collection) Version of the Day
Loading...
Searching...
No Matches
Sacado_cmath.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// @HEADER
29
30#ifndef SACADO_CMATH_HPP
31#define SACADO_CMATH_HPP
32
33#include <cmath> // for most math functions
34#include "Sacado_ConfigDefs.h"
35
36// Define some math functions that aren't usually in cmath
37#if !( (defined(_GLIBCXX_USE_C99_MATH_TR1) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || defined(HAVE_SACADO_CXX11) || defined(HAS_C99_TR1_CMATH) || defined(USER_DISABLE_SACADO_TR1_CMATH) )
38namespace std {
39 inline float acosh(float x) {
40 return std::log(x + std::sqrt(x*x - float(1.0))); }
41 inline float asinh(float x) {
42 return std::log(x + std::sqrt(x*x + float(1.0))); }
43 inline float atanh(float x) {
44 return float(0.5)*std::log((float(1.0)+x)/(float(1.0)-x)); }
45
46 inline double acosh(double x) {
47 return std::log(x + std::sqrt(x*x - double(1.0))); }
48 inline double asinh(double x) {
49 return std::log(x + std::sqrt(x*x + double(1.0))); }
50 inline double atanh(double x) {
51 return double(0.5)*std::log((double(1.0)+x)/(double(1.0)-x)); }
52}
53#endif // HAS_C99_TR1_CMATH
54
55namespace Sacado {
56
57 // Replacement for ternary operator, for scalar types that don't implement
58 // logical operations that return bool, e.g., a simd scalar type that returns
59 // a simd bool. Sacado overloaded operators use this internally when ever
60 // the ternary operator would be used. It can also be used by client code.
61 template <typename Cond, typename T>
63 T if_then_else(const Cond cond, const T& a, const T& b) {
64 return cond ? a : b;
65 }
66
67 // Special version of sqrt(x) that avoids the NaN if x==0 in the derivative.
68 // The default implementation just calls the standard sqrt(x).
69 template <typename T>
71 T safe_sqrt(const T& x) {
72 using std::sqrt;
73 return sqrt(x);
74 }
75
76}
77
78#endif // SACADO_CMATH_HPP
#define SACADO_INLINE_FUNCTION
asinh(expr.val())
if_then_else(expr.val() >=0, expr.dx(i), value_type(-expr.dx(i)))
acosh(expr.val())
sqrt(expr.val())
atanh(expr.val())
#define T
Definition: Sacado_rad.hpp:573
SACADO_INLINE_FUNCTION T safe_sqrt(const T &x)