NeoPZ
tinyfadone.h
Go to the documentation of this file.
1 #ifndef _tinyfadone_h_
2 #define _tinyfadone_h_
3 
4 //*********************************************************
5 // This file is generated by generate.cc.
6 // Use this file for any modification
7 //*********************************************************
8 
9 template <class T> class TinyFad<1,T> {
10 public:
11  typedef T value_type;
12  typedef T grad_type;
13 protected:
14 
15  int n;
16  T val_;
17 
18  T dx0_;
19 
20 
21 public:
22  void diff(const size_t ith, const size_t sz){
23  n = ith+1;
24  dx0_ = T(0.);
25 
26  switch(ith){
27  case 0 : dx0_ = T(1.);break;
28  default : cout << "ith = " << ith << " out of definition set" << endl;exit(1);
29  }
30  }
31 
32  TinyFad(const T& ind, const int ini) : n(ini+1), val_(ind) {
33  dx0_ = T(0.);
34 
35  switch(ini){
36  case 0 : dx0_ = T(1.);break;
37  default : cout << "ini = " << ini << " out of definition set" << endl;exit(1);
38  }
39  }
40  TinyFad() : n(0), val_(0.) {
41  dx0_ = T(0.);
42  }
43  TinyFad(const No_Initialization &): n(0) {}
44  TinyFad(const T& in) : n(0), val_(in) {
45  dx0_ = T(0.);
46  }
47  TinyFad(const TinyFad<1,T> & in) : n(0), val_(in.val_) {
48  dx0_ = in.dx0_;
49  }
50 
51  ~TinyFad() {}
52 
53  int N() const {return n-1;}
54 
55  const T& val() const { return val_;}
56  T& val() { return val_;}
57 
58  const T& d0() const { return dx0_;}
59  T& d0() { return dx0_;}
60 
61  T& dx(int i){
62  switch(i){
63  case 0 : return dx0_;
64  default : cout << "i out of bounds" << endl;exit(1);
65  }
66  }
67  const T& dx(int i) const {
68  switch(i){
69  case 0 : return dx0_;
70  default : cout << "i out of bounds" << endl;exit(1);
71  }
72  }
73  T& d(int i){
74  switch(i){
75  case 0 : return dx0_;
76  default : cout << "i out of bounds" << endl;exit(1);
77  }
78  }
79  const T& d(int i) const {
80  switch(i){
81  case 0 : return dx0_;
82  default : cout << "i out of bounds" << endl;exit(1);
83  }
84  }
85 
87  val_ = in.val_;
88 
89  dx0_ = in.dx0_;
90 
91  return *this;
92  }
93 
94  TinyFad<1,T> & operator = (const T & in){
95  val_ = in;
96 
97  dx0_ = T(0.);
98 
99  return *this;
100  }
101 
103  dx0_ += in.dx0_;
104  val_ += in.val_;
105 
106 
107  return *this;
108  }
110  dx0_ -= in.dx0_;
111  val_ -= in.val_;
112 
113  return *this;
114  }
116  dx0_ = dx0_ * in.val_ + val_ * in.dx0_;
117  val_ *= in.val_;
118 
119  return *this;
120  }
122  if (in.val_ == 0.) error("TinyFad & TinyFad::operator /= (const TinyFad & in), dividing by 0");
123  dx0_ = ( dx0_ * in.val_ - val_ * in.dx0_ ) / in.val_ / in.val_ ;
124  val_ /= in.val_;
125 
126  return *this;
127  }
128 
129  TinyFad<1,T> & operator += (const T & in){ val_ += in;
130 
131  return *this;
132  }
133  TinyFad<1,T> & operator -= (const T & in){ val_ -= in;
134 
135  return *this;
136  }
137  TinyFad<1,T> & operator *= (const T & in){
138  val_ *= in;
139 
140  dx0_ *= in;
141 
142  return *this;
143  }
144  TinyFad<1,T> & operator /= (const T & in){
145  if ( in == T(0.) ) error("TinyFad & TinyFad::operator /= (const T & in), dividing by 0");
146  val_ /= in;
147 
148  dx0_ /= in;
149 
150  return *this;
151  }
152 
154  TinyFad<1,T> tmp(*this);
155  tmp.val_++;
156  return tmp;
157  };
159  TinyFad<1,T> tmp(*this);
160  tmp.val_--;
161  return tmp;
162  };
164  return *this;
165  }
167  return *this;
168  }
169 };
170 
171 
172 template <class T> inline TinyFad<1,T> operator + (const TinyFad<1,T>& in)
173 {
174  return TinyFad<1,T>(in);
175 }
176 
177 template <class T> inline TinyFad<1,T> operator - (const TinyFad<1,T>& in)
178 {
180  tmp -= in;
181  return tmp;
182 }
183 
184 template <class L, class R> inline
186 operator +(const TinyFad<1,L>& un, const TinyFad<1,R>& deux) {
187 
188  typedef typename NumericalTraits<L,R>::promote value_type;
189 
190  No_Initialization nothing;
191  TinyFad<1,value_type> tmp( nothing );
192 
193  tmp.d0() = un.d0() + deux.d0();
194 
195  tmp.val() = un.val() + deux.val();
196 
197  return tmp;
198 }
199 
200 template <class L, class R> inline
202 operator +(const TinyFad<1,L>& un, const R& deux) {
203 
204  typedef typename NumericalTraits<L,R>::promote value_type;
205 
206  No_Initialization nothing;
207  TinyFad<1,value_type> tmp( nothing );
208 
209  tmp.d0() = un.d0();
210 
211  tmp.val() = un.val() + deux;
212 
213  return tmp;
214 }
215 
216 template <class L, class R> inline
218 operator +(const L& un, const TinyFad<1,R>& deux) {
219  return operator +(deux,un);
220 }
221 
222 template <class L, class R> inline
224 operator *(const TinyFad<1,L>& un, const TinyFad<1,R>& deux) {
225 
226  typedef typename NumericalTraits<L,R>::promote value_type;
227 
228  No_Initialization nothing;
229  TinyFad<1,value_type> tmp( nothing );
230 
231  tmp.d0() = un.d0()*deux.val() + un.val() * deux.d0();
232 
233  tmp.val() = un.val() * deux.val();
234 
235  return tmp;
236 }
237 
238 template <class L, class R> inline
240 operator *(const TinyFad<1,L>& un, const R& deux) {
241 
242  typedef typename NumericalTraits<L,R>::promote value_type;
243 
244  No_Initialization nothing;
245  TinyFad<1,value_type> tmp( nothing );
246 
247  tmp.d0() = un.d0()*deux;
248 
249  tmp.val() = un.val() * deux;
250 
251  return tmp;
252 }
253 
254 template <class L, class R> inline
256 operator *(const L& un, const TinyFad<1,R>& deux) {
257 
258  return operator *(deux,un);
259 }
260 
261 
262 template <class L, class R> inline
264 operator -(const TinyFad<1,L> & un, const TinyFad<1,R> & deux) {
265 
266  typedef typename NumericalTraits<L,R>::promote value_type;
267 
268  No_Initialization nothing;
269  TinyFad<1,value_type> tmp( nothing );
270 
271  tmp.d0() = un.d0() - deux.d0();
272 
273  tmp.val() = un.val() - deux.val();
274 
275  return tmp;
276 }
277 
278 template <class L, class R> inline
280 operator -(const L & un, const TinyFad<1,R> & deux) {
281 
282  typedef typename NumericalTraits<L,R>::promote value_type;
283 
284  No_Initialization nothing;
285  TinyFad<1,value_type> tmp( nothing );
286 
287  tmp.d0() -= deux.d0();
288 
289  tmp.val() = un - deux.val();
290 
291  return tmp;
292 }
293 
294 template <class L, class R> inline
296 operator -(const TinyFad<1,L> & un, const R & deux) {
297  typedef typename NumericalTraits<L,R>::promote value_type;
298 
299  No_Initialization nothing;
300  TinyFad<1,value_type> tmp( nothing );
301 
302  tmp.d0() = un.d0();
303 
304  tmp.val() = un.val() - deux;
305 
306  return tmp;
307 }
308 
309 template <class L, class R> inline
311 operator /(const TinyFad<1,L> & un, const TinyFad<1,R> & deux) {
312 
313  typedef typename NumericalTraits<L,R>::promote value_type;
314 
315  if (deux.val() == 0.) error("TinyFad & TinyFad::operator /(const TinyFad<1,L> & un, const TinyFad<1,R> & deux), dividing by 0");
316 
317  No_Initialization nothing;
318  TinyFad<1,value_type> tmp( nothing );
319  value_type dval = deux.val();
320 
321  tmp.d0() = ( un.d0()* deux.val() - un.val() * deux.d0() ) / dval / dval ;
322 
323  tmp.val() = un.val() / dval;
324 
325  return tmp;
326 }
327 
328 template <class L, class R> inline
330 operator /(const L & un, const TinyFad<1,R> & deux) {
331 
332  typedef typename NumericalTraits<L,R>::promote value_type;
333 
334  if (deux.val() == 0.) error("TinyFad & TinyFad::operator /(const L & un, const TinyFad<1,R> & deux), dividing by 0");
335 
336  No_Initialization nothing;
337  TinyFad<1,value_type> tmp( nothing );
338  value_type dval = deux.val();
339 
340  tmp.d0() = - un * deux.d0() / dval / dval ;
341 
342  tmp.val() = un / dval;
343 
344  return tmp;
345 }
346 
347 template <class L, class R> inline
349 operator /(const TinyFad<1,L> & un, const R & deux) {
350 
351  typedef typename NumericalTraits<L,R>::promote value_type;
352 
353  if (deux == 0.) error("TinyFad & TinyFad::operator /(const TinyFad<1,L> & un, const R & deux), dividing by 0");
354 
355  No_Initialization nothing;
356  TinyFad<1,value_type> tmp( nothing );
357 
358  tmp.d0() = un.d0() / deux;
359 
360  tmp.val() = un.val() / deux;
361 
362  return tmp;
363 }
364 
365 template <class T> TinyFad<1,T> exp (const TinyFad<1,T>& in)
366 {
367  TinyFad<1,T> tmp(exp(in.val()));
368 
369  tmp.d0() = in.d0()*exp(in.val());
370 
371  return tmp;
372 }
373 
374 template <class T> TinyFad<1,T> log (const TinyFad<1,T>& in)
375 {
376  if ( in.val() <= 0) error("TinyFad log (const TinyFad& in) : zero or negative value");
377  TinyFad<1,T> tmp(log(in.val()));
378 
379  tmp.d0() = in.d0() / in.val();
380 
381  return tmp;
382 }
383 
384 template <class T> TinyFad<1,T> sqrt (const TinyFad<1,T>& in)
385 {
386  if ( in.val() < 0. ) error("TinyFad<1,T> sqrt (const TinyFad& in) : negative value");
387  TinyFad<1,T> tmp(sqrt(in.val()));
388 
389  bool test=true;
390  if ( in.val() == T(0.) ){
391  if ( in.d0() != T(0.) ) test = false;
392 
393  if ( !test )
394  error("TinyFad<1,T> sqrt (const TinyFad& in) : null value");
395  }
396  else {
397  tmp.d0() = in.d0() / sqrt(in.val()) / 2.;
398  }
399 
400  return tmp;
401 }
402 
403 template <class T> TinyFad<1,T> sin (const TinyFad<1,T>& in)
404 {
405  TinyFad<1,T> tmp( sin(in.val()) );
406 
407  tmp.d0() = in.d0() * cos( in.val() );
408 
409  return tmp;
410 }
411 
412 template <class T> TinyFad<1,T> cos (const TinyFad<1,T>& in)
413 {
414  TinyFad<1,T> tmp(cos(in.val()));
415 
416  tmp.d0() = - in.d0() * sin( in.val() );
417 
418  return tmp;
419 }
420 
421 template <class T> TinyFad<1,T> tan (const TinyFad<1,T>& in)
422 {
423  if ( in.val() == 0) error("TinyFad tan (const TinyFad& in) undiefined in 0.");
424  TinyFad<1,T> tmp(tan(in.val()));
425 
426  T cosinus = cos(in.val());
427  tmp.d0() = in.d0() / cosinus / cosinus;
428 
429  return tmp;
430 }
431 
432 template <class T> TinyFad<1,T> pow (const TinyFad<1,T>& in, double e)
433 {
434  TinyFad<1,T> tmp(pow(in.val(), e));
435 
436  tmp.d0() = e*in.d0()*pow(in.val(), e-1);
437 
438  return tmp;
439 }
440 
441 template <class T> TinyFad<1,T> pow (const TinyFad<1,T>& un, const TinyFad<1,T>& deux)
442 {
443  if (un.val() == 0) error("TinyFad pow (const TinyFad& un, const TinyFad& deux), un = 0. ");
444  TinyFad<1,T> tmp(pow(un.val(), deux.val()));
445 
446  tmp.d0() = deux.d0() * log(un.val()) * pow(un.val(), deux.val())
447  + deux.val() * un.d0() * pow(un.val(), deux.val()-1);
448 
449  return tmp;
450 }
451 
452 template <class T> TinyFad<1,T> pow (const TinyFad<1,T>& in, const int e)
453 {
454  TinyFad<1,T> tmp( pow((double)in.val(), (double)e) );
455 
456  tmp.d0() = e*in.d0()*pow((double)in.val(), (double)e-1);
457 
458  return tmp;
459 }
460 
461 template <class T> TinyFad<1,T> abs (const TinyFad<1,T>& in)
462 {
463  int sign = in.val() > 0? 1:0;
464 
465  if (sign) return in;
466  else return (-in);
467 }
468 
469 template <class T> std::ostream& operator << (std::ostream& os, const TinyFad<1,T>& a)
470 {
471  os.setf(std::ios::fixed,std::ios::scientific);
472  os.width(12);
473  os << a.val() << " [";
474 
475  os.width(12);
476  os << a.d0();
477 
478  os << "]";
479 
480  return os;
481 }
482 
483 
484 #endif
TinyFad< Num, T > & operator-=(const TinyFad< Num, T > &in)
Definition: tinyfad.h:233
T & d(int i)
Definition: tinyfadone.h:73
TinyFad< 1, typename NumericalTraits< L, R >::promote > operator*(const TinyFad< 1, L > &un, const TinyFad< 1, R > &deux)
Definition: tinyfadone.h:224
TinyFad< 1, T > sin(const TinyFad< 1, T > &in)
Definition: tinyfadone.h:403
void diff(const size_t ith, const size_t sz)
Definition: tinyfadone.h:22
const T & d(int i) const
Definition: tinyfadone.h:79
Definition: test.py:1
TinyFad< 1, T > sqrt(const TinyFad< 1, T > &in)
Definition: tinyfadone.h:384
AutoPointerMutexArrayInit tmp
TinyFad< 1, T > cos(const TinyFad< 1, T > &in)
Definition: tinyfadone.h:412
T val_
Definition: tinyfad.h:47
TinyFad< 1, typename NumericalTraits< L, R >::promote > operator/(const TinyFad< 1, L > &un, const TinyFad< 1, R > &deux)
Definition: tinyfadone.h:311
void error(char *string)
Definition: testShape.cc:7
TinyFad(const T &ind, const int ini)
Definition: tinyfadone.h:32
TinyFad< 1, T > log(const TinyFad< 1, T > &in)
Definition: tinyfadone.h:374
TinyFad(const T &in)
Definition: tinyfadone.h:44
TinyFad< 1, T > tan(const TinyFad< 1, T > &in)
Definition: tinyfadone.h:421
int N() const
Definition: tinyfadone.h:53
const T & val() const
Definition: tinyfadone.h:55
TinyFad< Num, T > & operator=(const TinyFad< Num, T > &in)
Definition: tinyfad.h:189
TinyFad< 1, T > exp(const TinyFad< 1, T > &in)
Definition: tinyfadone.h:365
TinyFad< Num, T > & operator+=(const TinyFad< Num, T > &in)
Definition: tinyfad.h:219
const T & d0() const
Definition: tinyfadone.h:58
T value_type
Definition: tinyfad.h:53
T & dx(int i)
Definition: tinyfadone.h:61
const T & dx(int i) const
Definition: tinyfadone.h:67
TinyFad< 1, T > & operator++()
Definition: tinyfadone.h:163
TinyFad< Num, T > & operator*=(const TinyFad< Num, T > &in)
Definition: tinyfad.h:247
TinyFad(const No_Initialization &)
Definition: tinyfadone.h:43
TinyFad< 1, T > abs(const TinyFad< 1, T > &in)
Definition: tinyfadone.h:461
TinyFad(const TinyFad< 1, T > &in)
Definition: tinyfadone.h:47
TinyFad< 1, T > & operator--()
Definition: tinyfadone.h:166
TinyFad< 1, T > operator++(int)
Definition: tinyfadone.h:153
TinyFad< Num, T > & operator/=(const TinyFad< Num, T > &in)
Definition: tinyfad.h:261
TinyFad< 1, T > operator--(int)
Definition: tinyfadone.h:158
TinyFad< 1, T > operator+(const TinyFad< 1, T > &in)
Definition: tinyfadone.h:172
TinyFad< 1, T > operator-(const TinyFad< 1, T > &in)
Definition: tinyfadone.h:177
const T & val() const
Definition: tinyfad.h:72
TinyFad< 1, T > pow(const TinyFad< 1, T > &in, double e)
Definition: tinyfadone.h:432