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