NeoPZ
tinyfadtwelve.h
Go to the documentation of this file.
1 #ifndef _tinyfadtwelve_h_
2 #define _tinyfadtwelve_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<12,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  T dx2_;
21  T dx3_;
22  T dx4_;
23  T dx5_;
24  T dx6_;
25  T dx7_;
26  T dx8_;
27  T dx9_;
28  T dx10_;
29  T dx11_;
30 
31 
32 public:
33  void diff(const size_t ith, const size_t sz){
34  n = ith+1;
35  dx0_ = T(0.);
36  dx1_ = T(0.);
37  dx2_ = T(0.);
38  dx3_ = T(0.);
39  dx4_ = T(0.);
40  dx5_ = T(0.);
41  dx6_ = T(0.);
42  dx7_ = T(0.);
43  dx8_ = T(0.);
44  dx9_ = T(0.);
45  dx10_ = T(0.);
46  dx11_ = T(0.);
47 
48  switch(ith){
49  case 0 : dx0_ = T(1.);break;
50  case 1 : dx1_ = T(1.);break;
51  case 2 : dx2_ = T(1.);break;
52  case 3 : dx3_ = T(1.);break;
53  case 4 : dx4_ = T(1.);break;
54  case 5 : dx5_ = T(1.);break;
55  case 6 : dx6_ = T(1.);break;
56  case 7 : dx7_ = T(1.);break;
57  case 8 : dx8_ = T(1.);break;
58  case 9 : dx9_ = T(1.);break;
59  case 10 : dx10_ = T(1.);break;
60  case 11 : dx11_ = T(1.);break;
61  default : cout << "ith = " << ith << " out of definition set" << endl;exit(1);
62  }
63  }
64 
65  TinyFad(const T& ind, const int ini) : n(ini+1), val_(ind) {
66  dx0_ = T(0.);
67  dx1_ = T(0.);
68  dx2_ = T(0.);
69  dx3_ = T(0.);
70  dx4_ = T(0.);
71  dx5_ = T(0.);
72  dx6_ = T(0.);
73  dx7_ = T(0.);
74  dx8_ = T(0.);
75  dx9_ = T(0.);
76  dx10_ = T(0.);
77  dx11_ = T(0.);
78 
79  switch(ini){
80  case 0 : dx0_ = T(1.);break;
81  case 1 : dx1_ = T(1.);break;
82  case 2 : dx2_ = T(1.);break;
83  case 3 : dx3_ = T(1.);break;
84  case 4 : dx4_ = T(1.);break;
85  case 5 : dx5_ = T(1.);break;
86  case 6 : dx6_ = T(1.);break;
87  case 7 : dx7_ = T(1.);break;
88  case 8 : dx8_ = T(1.);break;
89  case 9 : dx9_ = T(1.);break;
90  case 10 : dx10_ = T(1.);break;
91  case 11 : dx11_ = T(1.);break;
92  default : cout << "ini = " << ini << " out of definition set" << endl;exit(1);
93  }
94  }
95  TinyFad() : n(0), val_(0.) {
96  dx0_ = T(0.);
97  dx1_ = T(0.);
98  dx2_ = T(0.);
99  dx3_ = T(0.);
100  dx4_ = T(0.);
101  dx5_ = T(0.);
102  dx6_ = T(0.);
103  dx7_ = T(0.);
104  dx8_ = T(0.);
105  dx9_ = T(0.);
106  dx10_ = T(0.);
107  dx11_ = T(0.);
108  }
109  TinyFad(const No_Initialization &): n(0) {}
110  TinyFad(const T& in) : n(0), val_(in) {
111  dx0_ = T(0.);
112  dx1_ = T(0.);
113  dx2_ = T(0.);
114  dx3_ = T(0.);
115  dx4_ = T(0.);
116  dx5_ = T(0.);
117  dx6_ = T(0.);
118  dx7_ = T(0.);
119  dx8_ = T(0.);
120  dx9_ = T(0.);
121  dx10_ = T(0.);
122  dx11_ = T(0.);
123  }
124  TinyFad(const TinyFad<12,T> & in) : n(0), val_(in.val_) {
125  dx0_ = in.dx0_;
126  dx1_ = in.dx1_;
127  dx2_ = in.dx2_;
128  dx3_ = in.dx3_;
129  dx4_ = in.dx4_;
130  dx5_ = in.dx5_;
131  dx6_ = in.dx6_;
132  dx7_ = in.dx7_;
133  dx8_ = in.dx8_;
134  dx9_ = in.dx9_;
135  dx10_ = in.dx10_;
136  dx11_ = in.dx11_;
137  }
138 
139  ~TinyFad() {}
140 
141  int N() const {return n-1;}
142 
143  const T& val() const { return val_;}
144  T& val() { return val_;}
145 
146  const T& d0() const { return dx0_;}
147  T& d0() { return dx0_;}
148 
149  const T& d1() const { return dx1_;}
150  T& d1() { return dx1_;}
151 
152  const T& d2() const { return dx2_;}
153  T& d2() { return dx2_;}
154 
155  const T& d3() const { return dx3_;}
156  T& d3() { return dx3_;}
157 
158  const T& d4() const { return dx4_;}
159  T& d4() { return dx4_;}
160 
161  const T& d5() const { return dx5_;}
162  T& d5() { return dx5_;}
163 
164  const T& d6() const { return dx6_;}
165  T& d6() { return dx6_;}
166 
167  const T& d7() const { return dx7_;}
168  T& d7() { return dx7_;}
169 
170  const T& d8() const { return dx8_;}
171  T& d8() { return dx8_;}
172 
173  const T& d9() const { return dx9_;}
174  T& d9() { return dx9_;}
175 
176  const T& d10() const { return dx10_;}
177  T& d10() { return dx10_;}
178 
179  const T& d11() const { return dx11_;}
180  T& d11() { return dx11_;}
181 
182  T& dx(int i){
183  switch(i){
184  case 0 : return dx0_;
185  case 1 : return dx1_;
186  case 2 : return dx2_;
187  case 3 : return dx3_;
188  case 4 : return dx4_;
189  case 5 : return dx5_;
190  case 6 : return dx6_;
191  case 7 : return dx7_;
192  case 8 : return dx8_;
193  case 9 : return dx9_;
194  case 10 : return dx10_;
195  case 11 : return dx11_;
196  default : cout << "i out of bounds" << endl;exit(1);
197  }
198  }
199  const T& dx(int i) const {
200  switch(i){
201  case 0 : return dx0_;
202  case 1 : return dx1_;
203  case 2 : return dx2_;
204  case 3 : return dx3_;
205  case 4 : return dx4_;
206  case 5 : return dx5_;
207  case 6 : return dx6_;
208  case 7 : return dx7_;
209  case 8 : return dx8_;
210  case 9 : return dx9_;
211  case 10 : return dx10_;
212  case 11 : return dx11_;
213  default : cout << "i out of bounds" << endl;exit(1);
214  }
215  }
216  T& d(int i){
217  switch(i){
218  case 0 : return dx0_;
219  case 1 : return dx1_;
220  case 2 : return dx2_;
221  case 3 : return dx3_;
222  case 4 : return dx4_;
223  case 5 : return dx5_;
224  case 6 : return dx6_;
225  case 7 : return dx7_;
226  case 8 : return dx8_;
227  case 9 : return dx9_;
228  case 10 : return dx10_;
229  case 11 : return dx11_;
230  default : cout << "i out of bounds" << endl;exit(1);
231  }
232  }
233  const T& d(int i) const {
234  switch(i){
235  case 0 : return dx0_;
236  case 1 : return dx1_;
237  case 2 : return dx2_;
238  case 3 : return dx3_;
239  case 4 : return dx4_;
240  case 5 : return dx5_;
241  case 6 : return dx6_;
242  case 7 : return dx7_;
243  case 8 : return dx8_;
244  case 9 : return dx9_;
245  case 10 : return dx10_;
246  case 11 : return dx11_;
247  default : cout << "i out of bounds" << endl;exit(1);
248  }
249  }
250 
252  val_ = in.val_;
253 
254  dx0_ = in.dx0_;
255  dx1_ = in.dx1_;
256  dx2_ = in.dx2_;
257  dx3_ = in.dx3_;
258  dx4_ = in.dx4_;
259  dx5_ = in.dx5_;
260  dx6_ = in.dx6_;
261  dx7_ = in.dx7_;
262  dx8_ = in.dx8_;
263  dx9_ = in.dx9_;
264  dx10_ = in.dx10_;
265  dx11_ = in.dx11_;
266 
267  return *this;
268  }
269 
270  TinyFad<12,T> & operator = (const T & in){
271  val_ = in;
272 
273  dx0_ = T(0.);
274  dx1_ = T(0.);
275  dx2_ = T(0.);
276  dx3_ = T(0.);
277  dx4_ = T(0.);
278  dx5_ = T(0.);
279  dx6_ = T(0.);
280  dx7_ = T(0.);
281  dx8_ = T(0.);
282  dx9_ = T(0.);
283  dx10_ = T(0.);
284  dx11_ = T(0.);
285 
286  return *this;
287  }
288 
290  dx0_ += in.dx0_;
291  dx1_ += in.dx1_;
292  dx2_ += in.dx2_;
293  dx3_ += in.dx3_;
294  dx4_ += in.dx4_;
295  dx5_ += in.dx5_;
296  dx6_ += in.dx6_;
297  dx7_ += in.dx7_;
298  dx8_ += in.dx8_;
299  dx9_ += in.dx9_;
300  dx10_ += in.dx10_;
301  dx11_ += in.dx11_;
302  val_ += in.val_;
303 
304 
305  return *this;
306  }
308  dx0_ -= in.dx0_;
309  dx1_ -= in.dx1_;
310  dx2_ -= in.dx2_;
311  dx3_ -= in.dx3_;
312  dx4_ -= in.dx4_;
313  dx5_ -= in.dx5_;
314  dx6_ -= in.dx6_;
315  dx7_ -= in.dx7_;
316  dx8_ -= in.dx8_;
317  dx9_ -= in.dx9_;
318  dx10_ -= in.dx10_;
319  dx11_ -= in.dx11_;
320  val_ -= in.val_;
321 
322  return *this;
323  }
325  dx0_ = dx0_ * in.val_ + val_ * in.dx0_;
326  dx1_ = dx1_ * in.val_ + val_ * in.dx1_;
327  dx2_ = dx2_ * in.val_ + val_ * in.dx2_;
328  dx3_ = dx3_ * in.val_ + val_ * in.dx3_;
329  dx4_ = dx4_ * in.val_ + val_ * in.dx4_;
330  dx5_ = dx5_ * in.val_ + val_ * in.dx5_;
331  dx6_ = dx6_ * in.val_ + val_ * in.dx6_;
332  dx7_ = dx7_ * in.val_ + val_ * in.dx7_;
333  dx8_ = dx8_ * in.val_ + val_ * in.dx8_;
334  dx9_ = dx9_ * in.val_ + val_ * in.dx9_;
335  dx10_ = dx10_ * in.val_ + val_ * in.dx10_;
336  dx11_ = dx11_ * in.val_ + val_ * in.dx11_;
337  val_ *= in.val_;
338 
339  return *this;
340  }
342  if (in.val_ == 0.) error("TinyFad & TinyFad::operator /= (const TinyFad & in), dividing by 0");
343  dx0_ = ( dx0_ * in.val_ - val_ * in.dx0_ ) / in.val_ / in.val_ ;
344  dx1_ = ( dx1_ * in.val_ - val_ * in.dx1_ ) / in.val_ / in.val_ ;
345  dx2_ = ( dx2_ * in.val_ - val_ * in.dx2_ ) / in.val_ / in.val_ ;
346  dx3_ = ( dx3_ * in.val_ - val_ * in.dx3_ ) / in.val_ / in.val_ ;
347  dx4_ = ( dx4_ * in.val_ - val_ * in.dx4_ ) / in.val_ / in.val_ ;
348  dx5_ = ( dx5_ * in.val_ - val_ * in.dx5_ ) / in.val_ / in.val_ ;
349  dx6_ = ( dx6_ * in.val_ - val_ * in.dx6_ ) / in.val_ / in.val_ ;
350  dx7_ = ( dx7_ * in.val_ - val_ * in.dx7_ ) / in.val_ / in.val_ ;
351  dx8_ = ( dx8_ * in.val_ - val_ * in.dx8_ ) / in.val_ / in.val_ ;
352  dx9_ = ( dx9_ * in.val_ - val_ * in.dx9_ ) / in.val_ / in.val_ ;
353  dx10_ = ( dx10_ * in.val_ - val_ * in.dx10_ ) / in.val_ / in.val_ ;
354  dx11_ = ( dx11_ * in.val_ - val_ * in.dx11_ ) / in.val_ / in.val_ ;
355  val_ /= in.val_;
356 
357  return *this;
358  }
359 
360  TinyFad<12,T> & operator += (const T & in){ val_ += in;
361 
362  return *this;
363  }
364  TinyFad<12,T> & operator -= (const T & in){ val_ -= in;
365 
366  return *this;
367  }
368  TinyFad<12,T> & operator *= (const T & in){
369  val_ *= in;
370 
371  dx0_ *= in;
372  dx1_ *= in;
373  dx2_ *= in;
374  dx3_ *= in;
375  dx4_ *= in;
376  dx5_ *= in;
377  dx6_ *= in;
378  dx7_ *= in;
379  dx8_ *= in;
380  dx9_ *= in;
381  dx10_ *= in;
382  dx11_ *= in;
383 
384  return *this;
385  }
386  TinyFad<12,T> & operator /= (const T & in){
387  if ( in == T(0.) ) error("TinyFad & TinyFad::operator /= (const T & in), dividing by 0");
388  val_ /= in;
389 
390  dx0_ /= in;
391  dx1_ /= in;
392  dx2_ /= in;
393  dx3_ /= in;
394  dx4_ /= in;
395  dx5_ /= in;
396  dx6_ /= in;
397  dx7_ /= in;
398  dx8_ /= in;
399  dx9_ /= in;
400  dx10_ /= in;
401  dx11_ /= in;
402 
403  return *this;
404  }
405 
407  TinyFad<12,T> tmp(*this);
408  tmp.val_++;
409  return tmp;
410  };
412  TinyFad<12,T> tmp(*this);
413  tmp.val_--;
414  return tmp;
415  };
417  return *this;
418  }
420  return *this;
421  }
422 };
423 
424 
425 template <class T> inline TinyFad<12,T> operator + (const TinyFad<12,T>& in)
426 {
427  return TinyFad<12,T>(in);
428 }
429 
430 template <class T> inline TinyFad<12,T> operator - (const TinyFad<12,T>& in)
431 {
433  tmp -= in;
434  return tmp;
435 }
436 
437 template <class L, class R> inline
439 operator +(const TinyFad<12,L>& un, const TinyFad<12,R>& deux) {
440 
441  typedef typename NumericalTraits<L,R>::promote value_type;
442 
443  No_Initialization nothing;
444  TinyFad<12,value_type> tmp( nothing );
445 
446  tmp.d0() = un.d0() + deux.d0();
447 
448  tmp.d1() = un.d1() + deux.d1();
449 
450  tmp.d2() = un.d2() + deux.d2();
451 
452  tmp.d3() = un.d3() + deux.d3();
453 
454  tmp.d4() = un.d4() + deux.d4();
455 
456  tmp.d5() = un.d5() + deux.d5();
457 
458  tmp.d6() = un.d6() + deux.d6();
459 
460  tmp.d7() = un.d7() + deux.d7();
461 
462  tmp.d8() = un.d8() + deux.d8();
463 
464  tmp.d9() = un.d9() + deux.d9();
465 
466  tmp.d10() = un.d10() + deux.d10();
467 
468  tmp.d11() = un.d11() + deux.d11();
469 
470  tmp.val() = un.val() + deux.val();
471 
472  return tmp;
473 }
474 
475 template <class L, class R> inline
477 operator +(const TinyFad<12,L>& un, const R& deux) {
478 
479  typedef typename NumericalTraits<L,R>::promote value_type;
480 
481  No_Initialization nothing;
482  TinyFad<12,value_type> tmp( nothing );
483 
484  tmp.d0() = un.d0();
485 
486  tmp.d1() = un.d1();
487 
488  tmp.d2() = un.d2();
489 
490  tmp.d3() = un.d3();
491 
492  tmp.d4() = un.d4();
493 
494  tmp.d5() = un.d5();
495 
496  tmp.d6() = un.d6();
497 
498  tmp.d7() = un.d7();
499 
500  tmp.d8() = un.d8();
501 
502  tmp.d9() = un.d9();
503 
504  tmp.d10() = un.d10();
505 
506  tmp.d11() = un.d11();
507 
508  tmp.val() = un.val() + deux;
509 
510  return tmp;
511 }
512 
513 template <class L, class R> inline
515 operator +(const L& un, const TinyFad<12,R>& deux) {
516  return operator +(deux,un);
517 }
518 
519 template <class L, class R> inline
521 operator *(const TinyFad<12,L>& un, const TinyFad<12,R>& deux) {
522 
523  typedef typename NumericalTraits<L,R>::promote value_type;
524 
525  No_Initialization nothing;
526  TinyFad<12,value_type> tmp( nothing );
527 
528  tmp.d0() = un.d0()*deux.val() + un.val() * deux.d0();
529 
530  tmp.d1() = un.d1()*deux.val() + un.val() * deux.d1();
531 
532  tmp.d2() = un.d2()*deux.val() + un.val() * deux.d2();
533 
534  tmp.d3() = un.d3()*deux.val() + un.val() * deux.d3();
535 
536  tmp.d4() = un.d4()*deux.val() + un.val() * deux.d4();
537 
538  tmp.d5() = un.d5()*deux.val() + un.val() * deux.d5();
539 
540  tmp.d6() = un.d6()*deux.val() + un.val() * deux.d6();
541 
542  tmp.d7() = un.d7()*deux.val() + un.val() * deux.d7();
543 
544  tmp.d8() = un.d8()*deux.val() + un.val() * deux.d8();
545 
546  tmp.d9() = un.d9()*deux.val() + un.val() * deux.d9();
547 
548  tmp.d10() = un.d10()*deux.val() + un.val() * deux.d10();
549 
550  tmp.d11() = un.d11()*deux.val() + un.val() * deux.d11();
551 
552  tmp.val() = un.val() * deux.val();
553 
554  return tmp;
555 }
556 
557 template <class L, class R> inline
559 operator *(const TinyFad<12,L>& un, const R& deux) {
560 
561  typedef typename NumericalTraits<L,R>::promote value_type;
562 
563  No_Initialization nothing;
564  TinyFad<12,value_type> tmp( nothing );
565 
566  tmp.d0() = un.d0()*deux;
567 
568  tmp.d1() = un.d1()*deux;
569 
570  tmp.d2() = un.d2()*deux;
571 
572  tmp.d3() = un.d3()*deux;
573 
574  tmp.d4() = un.d4()*deux;
575 
576  tmp.d5() = un.d5()*deux;
577 
578  tmp.d6() = un.d6()*deux;
579 
580  tmp.d7() = un.d7()*deux;
581 
582  tmp.d8() = un.d8()*deux;
583 
584  tmp.d9() = un.d9()*deux;
585 
586  tmp.d10() = un.d10()*deux;
587 
588  tmp.d11() = un.d11()*deux;
589 
590  tmp.val() = un.val() * deux;
591 
592  return tmp;
593 }
594 
595 template <class L, class R> inline
597 operator *(const L& un, const TinyFad<12,R>& deux) {
598 
599  return operator *(deux,un);
600 }
601 
602 
603 template <class L, class R> inline
605 operator -(const TinyFad<12,L> & un, const TinyFad<12,R> & deux) {
606 
607  typedef typename NumericalTraits<L,R>::promote value_type;
608 
609  No_Initialization nothing;
610  TinyFad<12,value_type> tmp( nothing );
611 
612  tmp.d0() = un.d0() - deux.d0();
613 
614  tmp.d1() = un.d1() - deux.d1();
615 
616  tmp.d2() = un.d2() - deux.d2();
617 
618  tmp.d3() = un.d3() - deux.d3();
619 
620  tmp.d4() = un.d4() - deux.d4();
621 
622  tmp.d5() = un.d5() - deux.d5();
623 
624  tmp.d6() = un.d6() - deux.d6();
625 
626  tmp.d7() = un.d7() - deux.d7();
627 
628  tmp.d8() = un.d8() - deux.d8();
629 
630  tmp.d9() = un.d9() - deux.d9();
631 
632  tmp.d10() = un.d10() - deux.d10();
633 
634  tmp.d11() = un.d11() - deux.d11();
635 
636  tmp.val() = un.val() - deux.val();
637 
638  return tmp;
639 }
640 
641 template <class L, class R> inline
643 operator -(const L & un, const TinyFad<12,R> & deux) {
644 
645  typedef typename NumericalTraits<L,R>::promote value_type;
646 
647  No_Initialization nothing;
648  TinyFad<12,value_type> tmp( nothing );
649 
650  tmp.d0() -= deux.d0();
651 
652  tmp.d1() -= deux.d1();
653 
654  tmp.d2() -= deux.d2();
655 
656  tmp.d3() -= deux.d3();
657 
658  tmp.d4() -= deux.d4();
659 
660  tmp.d5() -= deux.d5();
661 
662  tmp.d6() -= deux.d6();
663 
664  tmp.d7() -= deux.d7();
665 
666  tmp.d8() -= deux.d8();
667 
668  tmp.d9() -= deux.d9();
669 
670  tmp.d10() -= deux.d10();
671 
672  tmp.d11() -= deux.d11();
673 
674  tmp.val() = un - deux.val();
675 
676  return tmp;
677 }
678 
679 template <class L, class R> inline
681 operator -(const TinyFad<12,L> & un, const R & deux) {
682  typedef typename NumericalTraits<L,R>::promote value_type;
683 
684  No_Initialization nothing;
685  TinyFad<12,value_type> tmp( nothing );
686 
687  tmp.d0() = un.d0();
688 
689  tmp.d1() = un.d1();
690 
691  tmp.d2() = un.d2();
692 
693  tmp.d3() = un.d3();
694 
695  tmp.d4() = un.d4();
696 
697  tmp.d5() = un.d5();
698 
699  tmp.d6() = un.d6();
700 
701  tmp.d7() = un.d7();
702 
703  tmp.d8() = un.d8();
704 
705  tmp.d9() = un.d9();
706 
707  tmp.d10() = un.d10();
708 
709  tmp.d11() = un.d11();
710 
711  tmp.val() = un.val() - deux;
712 
713  return tmp;
714 }
715 
716 template <class L, class R> inline
718 operator /(const TinyFad<12,L> & un, const TinyFad<12,R> & deux) {
719 
720  typedef typename NumericalTraits<L,R>::promote value_type;
721 
722  if (deux.val() == 0.) error("TinyFad & TinyFad::operator /(const TinyFad<12,L> & un, const TinyFad<12,R> & deux), dividing by 0");
723 
724  No_Initialization nothing;
725  TinyFad<12,value_type> tmp( nothing );
726  value_type dval = deux.val();
727 
728  tmp.d0() = ( un.d0()* deux.val() - un.val() * deux.d0() ) / dval / dval ;
729 
730  tmp.d1() = ( un.d1()* deux.val() - un.val() * deux.d1() ) / dval / dval ;
731 
732  tmp.d2() = ( un.d2()* deux.val() - un.val() * deux.d2() ) / dval / dval ;
733 
734  tmp.d3() = ( un.d3()* deux.val() - un.val() * deux.d3() ) / dval / dval ;
735 
736  tmp.d4() = ( un.d4()* deux.val() - un.val() * deux.d4() ) / dval / dval ;
737 
738  tmp.d5() = ( un.d5()* deux.val() - un.val() * deux.d5() ) / dval / dval ;
739 
740  tmp.d6() = ( un.d6()* deux.val() - un.val() * deux.d6() ) / dval / dval ;
741 
742  tmp.d7() = ( un.d7()* deux.val() - un.val() * deux.d7() ) / dval / dval ;
743 
744  tmp.d8() = ( un.d8()* deux.val() - un.val() * deux.d8() ) / dval / dval ;
745 
746  tmp.d9() = ( un.d9()* deux.val() - un.val() * deux.d9() ) / dval / dval ;
747 
748  tmp.d10() = ( un.d10()* deux.val() - un.val() * deux.d10() ) / dval / dval ;
749 
750  tmp.d11() = ( un.d11()* deux.val() - un.val() * deux.d11() ) / dval / dval ;
751 
752  tmp.val() = un.val() / dval;
753 
754  return tmp;
755 }
756 
757 template <class L, class R> inline
759 operator /(const L & un, const TinyFad<12,R> & deux) {
760 
761  typedef typename NumericalTraits<L,R>::promote value_type;
762 
763  if (deux.val() == 0.) error("TinyFad & TinyFad::operator /(const L & un, const TinyFad<12,R> & deux), dividing by 0");
764 
765  No_Initialization nothing;
766  TinyFad<12,value_type> tmp( nothing );
767  value_type dval = deux.val();
768 
769  tmp.d0() = - un * deux.d0() / dval / dval ;
770 
771  tmp.d1() = - un * deux.d1() / dval / dval ;
772 
773  tmp.d2() = - un * deux.d2() / dval / dval ;
774 
775  tmp.d3() = - un * deux.d3() / dval / dval ;
776 
777  tmp.d4() = - un * deux.d4() / dval / dval ;
778 
779  tmp.d5() = - un * deux.d5() / dval / dval ;
780 
781  tmp.d6() = - un * deux.d6() / dval / dval ;
782 
783  tmp.d7() = - un * deux.d7() / dval / dval ;
784 
785  tmp.d8() = - un * deux.d8() / dval / dval ;
786 
787  tmp.d9() = - un * deux.d9() / dval / dval ;
788 
789  tmp.d10() = - un * deux.d10() / dval / dval ;
790 
791  tmp.d11() = - un * deux.d11() / dval / dval ;
792 
793  tmp.val() = un / dval;
794 
795  return tmp;
796 }
797 
798 template <class L, class R> inline
800 operator /(const TinyFad<12,L> & un, const R & deux) {
801 
802  typedef typename NumericalTraits<L,R>::promote value_type;
803 
804  if (deux == 0.) error("TinyFad & TinyFad::operator /(const TinyFad<12,L> & un, const R & deux), dividing by 0");
805 
806  No_Initialization nothing;
807  TinyFad<12,value_type> tmp( nothing );
808 
809  tmp.d0() = un.d0() / deux;
810 
811  tmp.d1() = un.d1() / deux;
812 
813  tmp.d2() = un.d2() / deux;
814 
815  tmp.d3() = un.d3() / deux;
816 
817  tmp.d4() = un.d4() / deux;
818 
819  tmp.d5() = un.d5() / deux;
820 
821  tmp.d6() = un.d6() / deux;
822 
823  tmp.d7() = un.d7() / deux;
824 
825  tmp.d8() = un.d8() / deux;
826 
827  tmp.d9() = un.d9() / deux;
828 
829  tmp.d10() = un.d10() / deux;
830 
831  tmp.d11() = un.d11() / deux;
832 
833  tmp.val() = un.val() / deux;
834 
835  return tmp;
836 }
837 
838 template <class T> TinyFad<12,T> exp (const TinyFad<12,T>& in)
839 {
840  TinyFad<12,T> tmp(exp(in.val()));
841 
842  tmp.d0() = in.d0()*exp(in.val());
843  tmp.d1() = in.d1()*exp(in.val());
844  tmp.d2() = in.d2()*exp(in.val());
845  tmp.d3() = in.d3()*exp(in.val());
846  tmp.d4() = in.d4()*exp(in.val());
847  tmp.d5() = in.d5()*exp(in.val());
848  tmp.d6() = in.d6()*exp(in.val());
849  tmp.d7() = in.d7()*exp(in.val());
850  tmp.d8() = in.d8()*exp(in.val());
851  tmp.d9() = in.d9()*exp(in.val());
852  tmp.d10() = in.d10()*exp(in.val());
853  tmp.d11() = in.d11()*exp(in.val());
854 
855  return tmp;
856 }
857 
858 template <class T> TinyFad<12,T> log (const TinyFad<12,T>& in)
859 {
860  if ( in.val() <= 0) error("TinyFad log (const TinyFad& in) : zero or negative value");
861  TinyFad<12,T> tmp(log(in.val()));
862 
863  tmp.d0() = in.d0() / in.val();
864  tmp.d1() = in.d1() / in.val();
865  tmp.d2() = in.d2() / in.val();
866  tmp.d3() = in.d3() / in.val();
867  tmp.d4() = in.d4() / in.val();
868  tmp.d5() = in.d5() / in.val();
869  tmp.d6() = in.d6() / in.val();
870  tmp.d7() = in.d7() / in.val();
871  tmp.d8() = in.d8() / in.val();
872  tmp.d9() = in.d9() / in.val();
873  tmp.d10() = in.d10() / in.val();
874  tmp.d11() = in.d11() / in.val();
875 
876  return tmp;
877 }
878 
879 template <class T> TinyFad<12,T> sqrt (const TinyFad<12,T>& in)
880 {
881  if ( in.val() < 0. ) error("TinyFad<12,T> sqrt (const TinyFad& in) : negative value");
882  TinyFad<12,T> tmp(sqrt(in.val()));
883 
884  bool test=true;
885  if ( in.val() == T(0.) ){
886  if ( in.d0() != T(0.) ) test = false;
887 
888  if ( in.d1() != T(0.) ) test = false;
889 
890  if ( in.d2() != T(0.) ) test = false;
891 
892  if ( in.d3() != T(0.) ) test = false;
893 
894  if ( in.d4() != T(0.) ) test = false;
895 
896  if ( in.d5() != T(0.) ) test = false;
897 
898  if ( in.d6() != T(0.) ) test = false;
899 
900  if ( in.d7() != T(0.) ) test = false;
901 
902  if ( in.d8() != T(0.) ) test = false;
903 
904  if ( in.d9() != T(0.) ) test = false;
905 
906  if ( in.d10() != T(0.) ) test = false;
907 
908  if ( in.d11() != T(0.) ) test = false;
909 
910  if ( !test )
911  error("TinyFad<12,T> sqrt (const TinyFad& in) : null value");
912  }
913  else {
914  tmp.d0() = in.d0() / sqrt(in.val()) / 2.;
915  tmp.d1() = in.d1() / sqrt(in.val()) / 2.;
916  tmp.d2() = in.d2() / sqrt(in.val()) / 2.;
917  tmp.d3() = in.d3() / sqrt(in.val()) / 2.;
918  tmp.d4() = in.d4() / sqrt(in.val()) / 2.;
919  tmp.d5() = in.d5() / sqrt(in.val()) / 2.;
920  tmp.d6() = in.d6() / sqrt(in.val()) / 2.;
921  tmp.d7() = in.d7() / sqrt(in.val()) / 2.;
922  tmp.d8() = in.d8() / sqrt(in.val()) / 2.;
923  tmp.d9() = in.d9() / sqrt(in.val()) / 2.;
924  tmp.d10() = in.d10() / sqrt(in.val()) / 2.;
925  tmp.d11() = in.d11() / sqrt(in.val()) / 2.;
926  }
927 
928  return tmp;
929 }
930 
931 template <class T> TinyFad<12,T> sin (const TinyFad<12,T>& in)
932 {
933  TinyFad<12,T> tmp( sin(in.val()) );
934 
935  tmp.d0() = in.d0() * cos( in.val() );
936  tmp.d1() = in.d1() * cos( in.val() );
937  tmp.d2() = in.d2() * cos( in.val() );
938  tmp.d3() = in.d3() * cos( in.val() );
939  tmp.d4() = in.d4() * cos( in.val() );
940  tmp.d5() = in.d5() * cos( in.val() );
941  tmp.d6() = in.d6() * cos( in.val() );
942  tmp.d7() = in.d7() * cos( in.val() );
943  tmp.d8() = in.d8() * cos( in.val() );
944  tmp.d9() = in.d9() * cos( in.val() );
945  tmp.d10() = in.d10() * cos( in.val() );
946  tmp.d11() = in.d11() * cos( in.val() );
947 
948  return tmp;
949 }
950 
951 template <class T> TinyFad<12,T> cos (const TinyFad<12,T>& in)
952 {
953  TinyFad<12,T> tmp(cos(in.val()));
954 
955  tmp.d0() = - in.d0() * sin( in.val() );
956  tmp.d1() = - in.d1() * sin( in.val() );
957  tmp.d2() = - in.d2() * sin( in.val() );
958  tmp.d3() = - in.d3() * sin( in.val() );
959  tmp.d4() = - in.d4() * sin( in.val() );
960  tmp.d5() = - in.d5() * sin( in.val() );
961  tmp.d6() = - in.d6() * sin( in.val() );
962  tmp.d7() = - in.d7() * sin( in.val() );
963  tmp.d8() = - in.d8() * sin( in.val() );
964  tmp.d9() = - in.d9() * sin( in.val() );
965  tmp.d10() = - in.d10() * sin( in.val() );
966  tmp.d11() = - in.d11() * sin( in.val() );
967 
968  return tmp;
969 }
970 
971 template <class T> TinyFad<12,T> tan (const TinyFad<12,T>& in)
972 {
973  if ( in.val() == 0) error("TinyFad tan (const TinyFad& in) undiefined in 0.");
974  TinyFad<12,T> tmp(tan(in.val()));
975 
976  T cosinus = cos(in.val());
977  tmp.d0() = in.d0() / cosinus / cosinus;
978  tmp.d1() = in.d1() / cosinus / cosinus;
979  tmp.d2() = in.d2() / cosinus / cosinus;
980  tmp.d3() = in.d3() / cosinus / cosinus;
981  tmp.d4() = in.d4() / cosinus / cosinus;
982  tmp.d5() = in.d5() / cosinus / cosinus;
983  tmp.d6() = in.d6() / cosinus / cosinus;
984  tmp.d7() = in.d7() / cosinus / cosinus;
985  tmp.d8() = in.d8() / cosinus / cosinus;
986  tmp.d9() = in.d9() / cosinus / cosinus;
987  tmp.d10() = in.d10() / cosinus / cosinus;
988  tmp.d11() = in.d11() / cosinus / cosinus;
989 
990  return tmp;
991 }
992 
993 template <class T> TinyFad<12,T> pow (const TinyFad<12,T>& in, double e)
994 {
995  TinyFad<12,T> tmp(pow(in.val(), e));
996 
997  tmp.d0() = e*in.d0()*pow(in.val(), e-1);
998  tmp.d1() = e*in.d1()*pow(in.val(), e-1);
999  tmp.d2() = e*in.d2()*pow(in.val(), e-1);
1000  tmp.d3() = e*in.d3()*pow(in.val(), e-1);
1001  tmp.d4() = e*in.d4()*pow(in.val(), e-1);
1002  tmp.d5() = e*in.d5()*pow(in.val(), e-1);
1003  tmp.d6() = e*in.d6()*pow(in.val(), e-1);
1004  tmp.d7() = e*in.d7()*pow(in.val(), e-1);
1005  tmp.d8() = e*in.d8()*pow(in.val(), e-1);
1006  tmp.d9() = e*in.d9()*pow(in.val(), e-1);
1007  tmp.d10() = e*in.d10()*pow(in.val(), e-1);
1008  tmp.d11() = e*in.d11()*pow(in.val(), e-1);
1009 
1010  return tmp;
1011 }
1012 
1013 template <class T> TinyFad<12,T> pow (const TinyFad<12,T>& un, const TinyFad<12,T>& deux)
1014 {
1015  if (un.val() == 0) error("TinyFad pow (const TinyFad& un, const TinyFad& deux), un = 0. ");
1016  TinyFad<12,T> tmp(pow(un.val(), deux.val()));
1017 
1018  tmp.d0() = deux.d0() * log(un.val()) * pow(un.val(), deux.val())
1019  + deux.val() * un.d0() * pow(un.val(), deux.val()-1);
1020  tmp.d1() = deux.d1() * log(un.val()) * pow(un.val(), deux.val())
1021  + deux.val() * un.d1() * pow(un.val(), deux.val()-1);
1022  tmp.d2() = deux.d2() * log(un.val()) * pow(un.val(), deux.val())
1023  + deux.val() * un.d2() * pow(un.val(), deux.val()-1);
1024  tmp.d3() = deux.d3() * log(un.val()) * pow(un.val(), deux.val())
1025  + deux.val() * un.d3() * pow(un.val(), deux.val()-1);
1026  tmp.d4() = deux.d4() * log(un.val()) * pow(un.val(), deux.val())
1027  + deux.val() * un.d4() * pow(un.val(), deux.val()-1);
1028  tmp.d5() = deux.d5() * log(un.val()) * pow(un.val(), deux.val())
1029  + deux.val() * un.d5() * pow(un.val(), deux.val()-1);
1030  tmp.d6() = deux.d6() * log(un.val()) * pow(un.val(), deux.val())
1031  + deux.val() * un.d6() * pow(un.val(), deux.val()-1);
1032  tmp.d7() = deux.d7() * log(un.val()) * pow(un.val(), deux.val())
1033  + deux.val() * un.d7() * pow(un.val(), deux.val()-1);
1034  tmp.d8() = deux.d8() * log(un.val()) * pow(un.val(), deux.val())
1035  + deux.val() * un.d8() * pow(un.val(), deux.val()-1);
1036  tmp.d9() = deux.d9() * log(un.val()) * pow(un.val(), deux.val())
1037  + deux.val() * un.d9() * pow(un.val(), deux.val()-1);
1038  tmp.d10() = deux.d10() * log(un.val()) * pow(un.val(), deux.val())
1039  + deux.val() * un.d10() * pow(un.val(), deux.val()-1);
1040  tmp.d11() = deux.d11() * log(un.val()) * pow(un.val(), deux.val())
1041  + deux.val() * un.d11() * pow(un.val(), deux.val()-1);
1042 
1043  return tmp;
1044 }
1045 
1046 template <class T> TinyFad<12,T> pow (const TinyFad<12,T>& in, const int e)
1047 {
1048  TinyFad<12,T> tmp( pow((double)in.val(), (double)e) );
1049 
1050  tmp.d0() = e*in.d0()*pow((double)in.val(), (double)e-1);
1051  tmp.d1() = e*in.d1()*pow((double)in.val(), (double)e-1);
1052  tmp.d2() = e*in.d2()*pow((double)in.val(), (double)e-1);
1053  tmp.d3() = e*in.d3()*pow((double)in.val(), (double)e-1);
1054  tmp.d4() = e*in.d4()*pow((double)in.val(), (double)e-1);
1055  tmp.d5() = e*in.d5()*pow((double)in.val(), (double)e-1);
1056  tmp.d6() = e*in.d6()*pow((double)in.val(), (double)e-1);
1057  tmp.d7() = e*in.d7()*pow((double)in.val(), (double)e-1);
1058  tmp.d8() = e*in.d8()*pow((double)in.val(), (double)e-1);
1059  tmp.d9() = e*in.d9()*pow((double)in.val(), (double)e-1);
1060  tmp.d10() = e*in.d10()*pow((double)in.val(), (double)e-1);
1061  tmp.d11() = e*in.d11()*pow((double)in.val(), (double)e-1);
1062 
1063  return tmp;
1064 }
1065 
1066 template <class T> TinyFad<12,T> abs (const TinyFad<12,T>& in)
1067 {
1068  int sign = in.val() > 0? 1:0;
1069 
1070  if (sign) return in;
1071  else return (-in);
1072 }
1073 
1074 template <class T> std::ostream& operator << (std::ostream& os, const TinyFad<12,T>& a)
1075 {
1076  os.setf(std::ios::fixed,std::ios::scientific);
1077  os.width(12);
1078  os << a.val() << " [";
1079 
1080  os.width(12);
1081  os << a.d0();
1082  os.width(12);
1083  os << a.d1();
1084  os.width(12);
1085  os << a.d2();
1086  os.width(12);
1087  os << a.d3();
1088  os.width(12);
1089  os << a.d4();
1090  os.width(12);
1091  os << a.d5();
1092  os.width(12);
1093  os << a.d6();
1094  os.width(12);
1095  os << a.d7();
1096  os.width(12);
1097  os << a.d8();
1098  os.width(12);
1099  os << a.d9();
1100  os.width(12);
1101  os << a.d10();
1102  os.width(12);
1103  os << a.d11();
1104 
1105  os << "]";
1106 
1107  return os;
1108 }
1109 
1110 
1111 #endif
TinyFad< 12, T > & operator++()
TinyFad(const T &in)
TinyFad< 12, T > exp(const TinyFad< 12, T > &in)
TinyFad< Num, T > & operator-=(const TinyFad< Num, T > &in)
Definition: tinyfad.h:233
const T & d(int i) const
const T & d6() const
Definition: test.py:1
AutoPointerMutexArrayInit tmp
TinyFad< 12, T > sqrt(const TinyFad< 12, T > &in)
T val_
Definition: tinyfad.h:47
void error(char *string)
Definition: testShape.cc:7
TinyFad< 12, T > operator--(int)
TinyFad< 12, T > abs(const TinyFad< 12, T > &in)
TinyFad< 12, T > tan(const TinyFad< 12, T > &in)
TinyFad< 12, T > cos(const TinyFad< 12, T > &in)
const T & d7() const
const T & d5() const
TinyFad< 12, T > operator-(const TinyFad< 12, T > &in)
TinyFad< 12, T > log(const TinyFad< 12, T > &in)
const T & d10() const
const T & d3() const
TinyFad< Num, T > & operator=(const TinyFad< Num, T > &in)
Definition: tinyfad.h:189
const T & d4() const
TinyFad< 12, T > operator++(int)
const T & val() const
TinyFad< 12, typename NumericalTraits< L, R >::promote > operator*(const TinyFad< 12, L > &un, const TinyFad< 12, R > &deux)
TinyFad< 12, T > operator+(const TinyFad< 12, T > &in)
TinyFad< Num, T > & operator+=(const TinyFad< Num, T > &in)
Definition: tinyfad.h:219
T value_type
Definition: tinyfad.h:53
TinyFad< Num, T > & operator*=(const TinyFad< Num, T > &in)
Definition: tinyfad.h:247
TinyFad< 12, T > pow(const TinyFad< 12, T > &in, double e)
TinyFad< 12, T > & operator--()
TinyFad< 12, T > sin(const TinyFad< 12, T > &in)
TinyFad(const T &ind, const int ini)
Definition: tinyfadtwelve.h:65
const T & d9() const
const T & d2() const
const T & dx(int i) const
TinyFad< Num, T > & operator/=(const TinyFad< Num, T > &in)
Definition: tinyfad.h:261
const T & d8() const
TinyFad(const No_Initialization &)
const T & d11() const
void diff(const size_t ith, const size_t sz)
Definition: tinyfadtwelve.h:33
const T & val() const
Definition: tinyfad.h:72
const T & d1() const
TinyFad(const TinyFad< 12, T > &in)
TinyFad< 12, typename NumericalTraits< L, R >::promote > operator/(const TinyFad< 12, L > &un, const TinyFad< 12, R > &deux)
const T & d0() const