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