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