Memosa-FVM  0.2
Tangent.h
Go to the documentation of this file.
1 // This file os part of FVM
2 // Copyright (c) 2012 FVM Authors
3 // See LICENSE file for terms.
4 
5 #ifndef _TANGENT_H_
6 #define _TANGENT_H_
7 
8 #include "NumType.h"
9 
10 #include "misc.h"
11 
12 class Tangent
13 {
14 public:
15 
16  typedef Tangent This_T;
17  typedef Tangent T_Scalar;
19 
20  static string getTypeName()
21  {
22  return "Tangent";
23  }
24 
25  // no initialization for empty ctor - consistent with builtins
27  {}
28 
29 
30 
31  Tangent(const double v, const double dv) :
32  _v(v),
33  _dv(dv)
34  {}
35 
36  explicit Tangent(const double v) :
37  _v(v),
38  _dv(NumTypeTraits<double>::getZero())
39  {}
40 
41 
42  //to allow statements like T x(0)
43  explicit Tangent(const int v) :
44  _v(double(v)),
45  _dv(NumTypeTraits<double>::getZero())
46  {}
47 
48  Tangent(const Tangent& o) :
49  _v(o._v),
50  _dv(o._dv)
51  {}
52 
54  {}
55 
56 
58  {
59  if (this == &o)
60  return *this;
61  _v = o._v;
62  _dv = o._dv;
63  return *this;
64  }
65 
66  Tangent& operator=(const double& f)
67  {
68  _v = f;
70  return *this;
71  }
72 
73  // to allow statements like x = 0;
74  Tangent& operator=(const int& i)
75  {
76  _v = double(i);
78  return *this;
79  }
80 
82  {
83  _v += o._v;
84  _dv += o._dv;
85  return *this;
86  }
87 
89  {
90  _v -= o._v;
91  _dv -= o._dv;
92  return *this;
93  }
94 
96  {
97  _dv = _dv*o._v + _v*o._dv;
98  _v *= o._v;
99  return *this;
100  }
101 
103  {
104  _dv = (_dv*o._v - _v*o._dv)/(o._v*o._v);
105  _v /= o._v;
106  return *this;
107  }
108 
109  Tangent& operator+=(const double& o)
110  {
111  _v += o;
112  return *this;
113  }
114 
115  Tangent& operator-=(const double& o)
116  {
117  _v -= o;
118  return *this;
119  }
120 
121  Tangent& operator*=(const double& o)
122  {
123  _v *= o;
124  _dv *= o;
125  return *this;
126  }
127 
128  Tangent& operator/=(const double& o)
129  {
130  _v /= o;
131  _dv /= o;
132  return *this;
133  }
134 
135  Tangent& operator+=(const int& i)
136  {
137  _v += double(i);
138  return *this;
139  }
140 
141  Tangent& operator-=(const int& i)
142  {
143  _v -= double(i);
144  return *this;
145  }
146 
147  Tangent& operator*=(const int& i)
148  {
149  _v *= double(i);
150  _dv *= double(i);
151  return *this;
152  }
153 
154  Tangent& operator/=(const int& i)
155  {
156  _v /= double(i);
157  _dv /= double(i);
158  return *this;
159  }
160 
161 #define TANGENT_RELATIONAL_OPS(opname,_op_) \
162  bool opname(const Tangent& o) const \
163  { \
164  return (_v _op_ o._v); \
165  } \
166  bool opname(const double& o) const \
167  { \
168  return (_v _op_ o); \
169  } \
170  bool opname(const int& o) const \
171  { \
172  return (_v _op_ double(o)); \
173  }
174 
175  TANGENT_RELATIONAL_OPS(operator>,>);
176  TANGENT_RELATIONAL_OPS(operator>=,>=);
177  TANGENT_RELATIONAL_OPS(operator<,<);
178  TANGENT_RELATIONAL_OPS(operator<=,<=);
179  TANGENT_RELATIONAL_OPS(operator==,==);
180  TANGENT_RELATIONAL_OPS(operator!=,!=);
181 
182 #undef TANGENT_RELATIONAL_OPS
183 
184  void print(ostream &os) const
185  {
186  os << "< " << _v << " , " << _dv << ">";
187  }
188 
189  static Tangent getZero()
190  {
191  double zero = NumTypeTraits<double>::getZero();
192  return Tangent(zero,zero);
193  }
194 
195  static Tangent getUnity()
196  {
199  }
200 
202  {
205  }
206 
207  static double doubleMeasure(const Tangent& x)
208  {
210  }
211 
212  static void setFloat(Tangent& t, const int i, const double& val)
213  {
214  if (i == 0)
215  t._v = val;
216  else
217  t._dv = val;
218  }
219  static double getFloat(const Tangent& t, const int i)
220  {
221  if (i==0)
222  return t._v;
223  else
224  return t._dv;
225  }
226 
227 
228  // only printing the value and not the derivative
229  static void write(FILE* fp, const Tangent& x) {fprintf(fp,"%f",x._v);}
230 
232 
233  static void getShape(int *shp) { *shp = 2; NumTypeTraits<double>::getShape(shp+1);}
234 
235  static int getDataSize()
236  {
238  }
239 
240  Tangent fabs() const
241  {
242  return Tangent(::fabs(_v), (_v > 0 ? _dv : -_dv));
243  }
244 
245 
246  static void accumulateOneNorm(Tangent& sum, const Tangent& v) { sum += v.fabs();}
247 
248  static void accumulateDotProduct(Tangent& sum, const Tangent& v0, const Tangent& v1)
249  {
250  sum._v += v0._v*v1._v;
251  sum._dv += v0._v*v1._dv + v0._dv*v1._v;
252  }
253 
254  static void reduceSum(Tangent& sum, const Tangent& x) {sum+=x;}
255 
256  static void safeDivide(Tangent& x, const Tangent& y) {if (y._v!=0) x/=y;}
257  static void setMax(Tangent& x, const Tangent& y) {if (y._v>x._v) x=y;}
258 
259  double _v;
260  double _dv;
261 };
262 
263 
264 #define TANGENT_BINARY_OP(opname,_op_) \
265  Tangent opname(const Tangent& a, const Tangent& b) \
266  { \
267  return Tangent(a) _op_ b; \
268  } \
269  Tangent opname(const Tangent& a, const double& b) \
270  { \
271  return Tangent(a) _op_ b; \
272  } \
273  Tangent opname(const double& a, const Tangent& b) \
274  { \
275  return Tangent(a) _op_ b; \
276  } \
277  Tangent opname(const Tangent& a, const int& b) \
278  { \
279  return Tangent(a) _op_ b; \
280  } \
281  Tangent opname(const int& a, const Tangent& b) \
282  { \
283  return Tangent(a) _op_ b; \
284  } \
285 
286 TANGENT_BINARY_OP(operator+,+=);
287 TANGENT_BINARY_OP(operator-,-=);
288 TANGENT_BINARY_OP(operator*,*=);
289 TANGENT_BINARY_OP(operator/,/=);
290 
292 {
293  return a;
294 }
295 
297 {
298  return Tangent(-a._v,-a._dv);
299 }
300 
301 inline ostream &operator<<(ostream &os, const Tangent &a)
302 {
303  a.print(os);
304  return os;
305 }
306 
307 Tangent sin(const Tangent& a)
308 {
309  return Tangent(sin(a._v), a._dv*cos(a._v));
310 }
311 
313 {
314  return Tangent(fabs(a._v), (a._v > 0 ? a._dv : -a._dv));
315 }
316 
318 {
319  double sqv = sqrt(a._v);
320  return Tangent(sqv, sqv==0.0 ? 0 : 0.5*a._dv/sqv);
321 }
322 
323 
324 #endif
Tangent & operator/=(const Tangent &o)
Definition: Tangent.h:102
static void setFloat(Tangent &t, const int i, const double &val)
Definition: Tangent.h:212
Tangent & operator=(const double &f)
Definition: Tangent.h:66
Tangent & operator-=(const int &i)
Definition: Tangent.h:141
TANGENT_RELATIONAL_OPS(operator<,<)
static void setMax(Tangent &x, const Tangent &y)
Definition: Tangent.h:257
Tangent & operator=(const Tangent &o)
Definition: Tangent.h:57
static double doubleMeasure(const Tangent &x)
Definition: Tangent.h:207
Tangent & operator/=(const double &o)
Definition: Tangent.h:128
Tangent & operator-=(const double &o)
Definition: Tangent.h:115
Tangent(const int v)
Definition: Tangent.h:43
~Tangent()
Definition: Tangent.h:53
static void accumulateOneNorm(Tangent &sum, const Tangent &v)
Definition: Tangent.h:246
#define TANGENT_BINARY_OP(opname, _op_)
Definition: Tangent.h:264
Tangent(const Tangent &o)
Definition: Tangent.h:48
static void reduceSum(Tangent &sum, const Tangent &x)
Definition: Tangent.h:254
Tangent(const double v, const double dv)
Definition: Tangent.h:31
Tangent & operator+=(const int &i)
Definition: Tangent.h:135
ostream & operator<<(ostream &os, const Tangent &a)
Definition: Tangent.h:301
static void write(FILE *fp, const Tangent &x)
Definition: Tangent.h:229
static void getShape(int *shp)
Definition: Tangent.h:233
static Tangent getNegativeUnity()
Definition: Tangent.h:201
Tangent & operator*=(const int &i)
Definition: Tangent.h:147
Tangent sqrt(const Tangent &a)
Definition: Tangent.h:317
static string getTypeName()
Definition: Tangent.h:20
Tangent()
Definition: Tangent.h:26
double _dv
Definition: Tangent.h:260
Tangent & operator*=(const double &o)
Definition: Tangent.h:121
Tangent operator+(const Tangent &a)
Definition: Tangent.h:291
Tangent fabs() const
Definition: Tangent.h:240
Tangent & operator/=(const int &i)
Definition: Tangent.h:154
static int getDimension()
Definition: Tangent.h:231
Tangent sin(const Tangent &a)
Definition: Tangent.h:307
Tangent & operator=(const int &i)
Definition: Tangent.h:74
static int getDataSize()
Definition: Tangent.h:235
Tangent & operator+=(const double &o)
Definition: Tangent.h:109
Tangent This_T
Definition: Tangent.h:16
Tangent & operator-=(const Tangent &o)
Definition: Tangent.h:88
Tangent T_Scalar
Definition: Tangent.h:17
double _v
Definition: Tangent.h:259
Tangent fabs(const Tangent &a)
Definition: Tangent.h:312
static void safeDivide(Tangent &x, const Tangent &y)
Definition: Tangent.h:256
static void accumulateDotProduct(Tangent &sum, const Tangent &v0, const Tangent &v1)
Definition: Tangent.h:248
Tangent & operator*=(const Tangent &o)
Definition: Tangent.h:95
Tangent & operator+=(const Tangent &o)
Definition: Tangent.h:81
Tangent operator-(const Tangent &a)
Definition: Tangent.h:296
static double getFloat(const Tangent &t, const int i)
Definition: Tangent.h:219
static Tangent getZero()
Definition: Tangent.h:189
Tangent(const double v)
Definition: Tangent.h:36
NumTypeTraits< double >::T_BuiltIn T_BuiltIn
Definition: Tangent.h:18
static Tangent getUnity()
Definition: Tangent.h:195
void print(ostream &os) const
Definition: Tangent.h:184