NeoPZ
tinyfadtwenty.h
Go to the documentation of this file.
1 #ifndef _tinyfadtwenty_h_
2 #define _tinyfadtwenty_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<20,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  T dx14_;
33  T dx15_;
34  T dx16_;
35  T dx17_;
36  T dx18_;
37  T dx19_;
38 
39 
40 public:
41  void diff(const size_t ith, const size_t sz){
42  n = ith+1;
43  dx0_ = T(0.);
44  dx1_ = T(0.);
45  dx2_ = T(0.);
46  dx3_ = T(0.);
47  dx4_ = T(0.);
48  dx5_ = T(0.);
49  dx6_ = T(0.);
50  dx7_ = T(0.);
51  dx8_ = T(0.);
52  dx9_ = T(0.);
53  dx10_ = T(0.);
54  dx11_ = T(0.);
55  dx12_ = T(0.);
56  dx13_ = T(0.);
57  dx14_ = T(0.);
58  dx15_ = T(0.);
59  dx16_ = T(0.);
60  dx17_ = T(0.);
61  dx18_ = T(0.);
62  dx19_ = T(0.);
63 
64  switch(ith){
65  case 0 : dx0_ = T(1.);break;
66  case 1 : dx1_ = T(1.);break;
67  case 2 : dx2_ = T(1.);break;
68  case 3 : dx3_ = T(1.);break;
69  case 4 : dx4_ = T(1.);break;
70  case 5 : dx5_ = T(1.);break;
71  case 6 : dx6_ = T(1.);break;
72  case 7 : dx7_ = T(1.);break;
73  case 8 : dx8_ = T(1.);break;
74  case 9 : dx9_ = T(1.);break;
75  case 10 : dx10_ = T(1.);break;
76  case 11 : dx11_ = T(1.);break;
77  case 12 : dx12_ = T(1.);break;
78  case 13 : dx13_ = T(1.);break;
79  case 14 : dx14_ = T(1.);break;
80  case 15 : dx15_ = T(1.);break;
81  case 16 : dx16_ = T(1.);break;
82  case 17 : dx17_ = T(1.);break;
83  case 18 : dx18_ = T(1.);break;
84  case 19 : dx19_ = T(1.);break;
85  default : cout << "ith = " << ith << " out of definition set" << endl;exit(1);
86  }
87  }
88 
89  TinyFad(const T& ind, const int ini) : n(ini+1), val_(ind) {
90  dx0_ = T(0.);
91  dx1_ = T(0.);
92  dx2_ = T(0.);
93  dx3_ = T(0.);
94  dx4_ = T(0.);
95  dx5_ = T(0.);
96  dx6_ = T(0.);
97  dx7_ = T(0.);
98  dx8_ = T(0.);
99  dx9_ = T(0.);
100  dx10_ = T(0.);
101  dx11_ = T(0.);
102  dx12_ = T(0.);
103  dx13_ = T(0.);
104  dx14_ = T(0.);
105  dx15_ = T(0.);
106  dx16_ = T(0.);
107  dx17_ = T(0.);
108  dx18_ = T(0.);
109  dx19_ = T(0.);
110 
111  switch(ini){
112  case 0 : dx0_ = T(1.);break;
113  case 1 : dx1_ = T(1.);break;
114  case 2 : dx2_ = T(1.);break;
115  case 3 : dx3_ = T(1.);break;
116  case 4 : dx4_ = T(1.);break;
117  case 5 : dx5_ = T(1.);break;
118  case 6 : dx6_ = T(1.);break;
119  case 7 : dx7_ = T(1.);break;
120  case 8 : dx8_ = T(1.);break;
121  case 9 : dx9_ = T(1.);break;
122  case 10 : dx10_ = T(1.);break;
123  case 11 : dx11_ = T(1.);break;
124  case 12 : dx12_ = T(1.);break;
125  case 13 : dx13_ = T(1.);break;
126  case 14 : dx14_ = T(1.);break;
127  case 15 : dx15_ = T(1.);break;
128  case 16 : dx16_ = T(1.);break;
129  case 17 : dx17_ = T(1.);break;
130  case 18 : dx18_ = T(1.);break;
131  case 19 : dx19_ = T(1.);break;
132  default : cout << "ini = " << ini << " out of definition set" << endl;exit(1);
133  }
134  }
135  TinyFad() : n(0), val_(0.) {
136  dx0_ = T(0.);
137  dx1_ = T(0.);
138  dx2_ = T(0.);
139  dx3_ = T(0.);
140  dx4_ = T(0.);
141  dx5_ = T(0.);
142  dx6_ = T(0.);
143  dx7_ = T(0.);
144  dx8_ = T(0.);
145  dx9_ = T(0.);
146  dx10_ = T(0.);
147  dx11_ = T(0.);
148  dx12_ = T(0.);
149  dx13_ = T(0.);
150  dx14_ = T(0.);
151  dx15_ = T(0.);
152  dx16_ = T(0.);
153  dx17_ = T(0.);
154  dx18_ = T(0.);
155  dx19_ = T(0.);
156  }
157  TinyFad(const No_Initialization &): n(0) {}
158  TinyFad(const T& in) : n(0), val_(in) {
159  dx0_ = T(0.);
160  dx1_ = T(0.);
161  dx2_ = T(0.);
162  dx3_ = T(0.);
163  dx4_ = T(0.);
164  dx5_ = T(0.);
165  dx6_ = T(0.);
166  dx7_ = T(0.);
167  dx8_ = T(0.);
168  dx9_ = T(0.);
169  dx10_ = T(0.);
170  dx11_ = T(0.);
171  dx12_ = T(0.);
172  dx13_ = T(0.);
173  dx14_ = T(0.);
174  dx15_ = T(0.);
175  dx16_ = T(0.);
176  dx17_ = T(0.);
177  dx18_ = T(0.);
178  dx19_ = T(0.);
179  }
180  TinyFad(const TinyFad<20,T> & in) : n(0), val_(in.val_) {
181  dx0_ = in.dx0_;
182  dx1_ = in.dx1_;
183  dx2_ = in.dx2_;
184  dx3_ = in.dx3_;
185  dx4_ = in.dx4_;
186  dx5_ = in.dx5_;
187  dx6_ = in.dx6_;
188  dx7_ = in.dx7_;
189  dx8_ = in.dx8_;
190  dx9_ = in.dx9_;
191  dx10_ = in.dx10_;
192  dx11_ = in.dx11_;
193  dx12_ = in.dx12_;
194  dx13_ = in.dx13_;
195  dx14_ = in.dx14_;
196  dx15_ = in.dx15_;
197  dx16_ = in.dx16_;
198  dx17_ = in.dx17_;
199  dx18_ = in.dx18_;
200  dx19_ = in.dx19_;
201  }
202 
203  ~TinyFad() {}
204 
205  int N() const {return n-1;}
206 
207  const T& val() const { return val_;}
208  T& val() { return val_;}
209 
210  const T& d0() const { return dx0_;}
211  T& d0() { return dx0_;}
212 
213  const T& d1() const { return dx1_;}
214  T& d1() { return dx1_;}
215 
216  const T& d2() const { return dx2_;}
217  T& d2() { return dx2_;}
218 
219  const T& d3() const { return dx3_;}
220  T& d3() { return dx3_;}
221 
222  const T& d4() const { return dx4_;}
223  T& d4() { return dx4_;}
224 
225  const T& d5() const { return dx5_;}
226  T& d5() { return dx5_;}
227 
228  const T& d6() const { return dx6_;}
229  T& d6() { return dx6_;}
230 
231  const T& d7() const { return dx7_;}
232  T& d7() { return dx7_;}
233 
234  const T& d8() const { return dx8_;}
235  T& d8() { return dx8_;}
236 
237  const T& d9() const { return dx9_;}
238  T& d9() { return dx9_;}
239 
240  const T& d10() const { return dx10_;}
241  T& d10() { return dx10_;}
242 
243  const T& d11() const { return dx11_;}
244  T& d11() { return dx11_;}
245 
246  const T& d12() const { return dx12_;}
247  T& d12() { return dx12_;}
248 
249  const T& d13() const { return dx13_;}
250  T& d13() { return dx13_;}
251 
252  const T& d14() const { return dx14_;}
253  T& d14() { return dx14_;}
254 
255  const T& d15() const { return dx15_;}
256  T& d15() { return dx15_;}
257 
258  const T& d16() const { return dx16_;}
259  T& d16() { return dx16_;}
260 
261  const T& d17() const { return dx17_;}
262  T& d17() { return dx17_;}
263 
264  const T& d18() const { return dx18_;}
265  T& d18() { return dx18_;}
266 
267  const T& d19() const { return dx19_;}
268  T& d19() { return dx19_;}
269 
270  T& dx(int i){
271  switch(i){
272  case 0 : return dx0_;
273  case 1 : return dx1_;
274  case 2 : return dx2_;
275  case 3 : return dx3_;
276  case 4 : return dx4_;
277  case 5 : return dx5_;
278  case 6 : return dx6_;
279  case 7 : return dx7_;
280  case 8 : return dx8_;
281  case 9 : return dx9_;
282  case 10 : return dx10_;
283  case 11 : return dx11_;
284  case 12 : return dx12_;
285  case 13 : return dx13_;
286  case 14 : return dx14_;
287  case 15 : return dx15_;
288  case 16 : return dx16_;
289  case 17 : return dx17_;
290  case 18 : return dx18_;
291  case 19 : return dx19_;
292  default : cout << "i out of bounds" << endl;exit(1);
293  }
294  }
295  const T& dx(int i) const {
296  switch(i){
297  case 0 : return dx0_;
298  case 1 : return dx1_;
299  case 2 : return dx2_;
300  case 3 : return dx3_;
301  case 4 : return dx4_;
302  case 5 : return dx5_;
303  case 6 : return dx6_;
304  case 7 : return dx7_;
305  case 8 : return dx8_;
306  case 9 : return dx9_;
307  case 10 : return dx10_;
308  case 11 : return dx11_;
309  case 12 : return dx12_;
310  case 13 : return dx13_;
311  case 14 : return dx14_;
312  case 15 : return dx15_;
313  case 16 : return dx16_;
314  case 17 : return dx17_;
315  case 18 : return dx18_;
316  case 19 : return dx19_;
317  default : cout << "i out of bounds" << endl;exit(1);
318  }
319  }
320  T& d(int i){
321  switch(i){
322  case 0 : return dx0_;
323  case 1 : return dx1_;
324  case 2 : return dx2_;
325  case 3 : return dx3_;
326  case 4 : return dx4_;
327  case 5 : return dx5_;
328  case 6 : return dx6_;
329  case 7 : return dx7_;
330  case 8 : return dx8_;
331  case 9 : return dx9_;
332  case 10 : return dx10_;
333  case 11 : return dx11_;
334  case 12 : return dx12_;
335  case 13 : return dx13_;
336  case 14 : return dx14_;
337  case 15 : return dx15_;
338  case 16 : return dx16_;
339  case 17 : return dx17_;
340  case 18 : return dx18_;
341  case 19 : return dx19_;
342  default : cout << "i out of bounds" << endl;exit(1);
343  }
344  }
345  const T& d(int i) const {
346  switch(i){
347  case 0 : return dx0_;
348  case 1 : return dx1_;
349  case 2 : return dx2_;
350  case 3 : return dx3_;
351  case 4 : return dx4_;
352  case 5 : return dx5_;
353  case 6 : return dx6_;
354  case 7 : return dx7_;
355  case 8 : return dx8_;
356  case 9 : return dx9_;
357  case 10 : return dx10_;
358  case 11 : return dx11_;
359  case 12 : return dx12_;
360  case 13 : return dx13_;
361  case 14 : return dx14_;
362  case 15 : return dx15_;
363  case 16 : return dx16_;
364  case 17 : return dx17_;
365  case 18 : return dx18_;
366  case 19 : return dx19_;
367  default : cout << "i out of bounds" << endl;exit(1);
368  }
369  }
370 
372  val_ = in.val_;
373 
374  dx0_ = in.dx0_;
375  dx1_ = in.dx1_;
376  dx2_ = in.dx2_;
377  dx3_ = in.dx3_;
378  dx4_ = in.dx4_;
379  dx5_ = in.dx5_;
380  dx6_ = in.dx6_;
381  dx7_ = in.dx7_;
382  dx8_ = in.dx8_;
383  dx9_ = in.dx9_;
384  dx10_ = in.dx10_;
385  dx11_ = in.dx11_;
386  dx12_ = in.dx12_;
387  dx13_ = in.dx13_;
388  dx14_ = in.dx14_;
389  dx15_ = in.dx15_;
390  dx16_ = in.dx16_;
391  dx17_ = in.dx17_;
392  dx18_ = in.dx18_;
393  dx19_ = in.dx19_;
394 
395  return *this;
396  }
397 
398  TinyFad<20,T> & operator = (const T & in){
399  val_ = in;
400 
401  dx0_ = T(0.);
402  dx1_ = T(0.);
403  dx2_ = T(0.);
404  dx3_ = T(0.);
405  dx4_ = T(0.);
406  dx5_ = T(0.);
407  dx6_ = T(0.);
408  dx7_ = T(0.);
409  dx8_ = T(0.);
410  dx9_ = T(0.);
411  dx10_ = T(0.);
412  dx11_ = T(0.);
413  dx12_ = T(0.);
414  dx13_ = T(0.);
415  dx14_ = T(0.);
416  dx15_ = T(0.);
417  dx16_ = T(0.);
418  dx17_ = T(0.);
419  dx18_ = T(0.);
420  dx19_ = T(0.);
421 
422  return *this;
423  }
424 
426  dx0_ += in.dx0_;
427  dx1_ += in.dx1_;
428  dx2_ += in.dx2_;
429  dx3_ += in.dx3_;
430  dx4_ += in.dx4_;
431  dx5_ += in.dx5_;
432  dx6_ += in.dx6_;
433  dx7_ += in.dx7_;
434  dx8_ += in.dx8_;
435  dx9_ += in.dx9_;
436  dx10_ += in.dx10_;
437  dx11_ += in.dx11_;
438  dx12_ += in.dx12_;
439  dx13_ += in.dx13_;
440  dx14_ += in.dx14_;
441  dx15_ += in.dx15_;
442  dx16_ += in.dx16_;
443  dx17_ += in.dx17_;
444  dx18_ += in.dx18_;
445  dx19_ += in.dx19_;
446  val_ += in.val_;
447 
448 
449  return *this;
450  }
452  dx0_ -= in.dx0_;
453  dx1_ -= in.dx1_;
454  dx2_ -= in.dx2_;
455  dx3_ -= in.dx3_;
456  dx4_ -= in.dx4_;
457  dx5_ -= in.dx5_;
458  dx6_ -= in.dx6_;
459  dx7_ -= in.dx7_;
460  dx8_ -= in.dx8_;
461  dx9_ -= in.dx9_;
462  dx10_ -= in.dx10_;
463  dx11_ -= in.dx11_;
464  dx12_ -= in.dx12_;
465  dx13_ -= in.dx13_;
466  dx14_ -= in.dx14_;
467  dx15_ -= in.dx15_;
468  dx16_ -= in.dx16_;
469  dx17_ -= in.dx17_;
470  dx18_ -= in.dx18_;
471  dx19_ -= in.dx19_;
472  val_ -= in.val_;
473 
474  return *this;
475  }
477  dx0_ = dx0_ * in.val_ + val_ * in.dx0_;
478  dx1_ = dx1_ * in.val_ + val_ * in.dx1_;
479  dx2_ = dx2_ * in.val_ + val_ * in.dx2_;
480  dx3_ = dx3_ * in.val_ + val_ * in.dx3_;
481  dx4_ = dx4_ * in.val_ + val_ * in.dx4_;
482  dx5_ = dx5_ * in.val_ + val_ * in.dx5_;
483  dx6_ = dx6_ * in.val_ + val_ * in.dx6_;
484  dx7_ = dx7_ * in.val_ + val_ * in.dx7_;
485  dx8_ = dx8_ * in.val_ + val_ * in.dx8_;
486  dx9_ = dx9_ * in.val_ + val_ * in.dx9_;
487  dx10_ = dx10_ * in.val_ + val_ * in.dx10_;
488  dx11_ = dx11_ * in.val_ + val_ * in.dx11_;
489  dx12_ = dx12_ * in.val_ + val_ * in.dx12_;
490  dx13_ = dx13_ * in.val_ + val_ * in.dx13_;
491  dx14_ = dx14_ * in.val_ + val_ * in.dx14_;
492  dx15_ = dx15_ * in.val_ + val_ * in.dx15_;
493  dx16_ = dx16_ * in.val_ + val_ * in.dx16_;
494  dx17_ = dx17_ * in.val_ + val_ * in.dx17_;
495  dx18_ = dx18_ * in.val_ + val_ * in.dx18_;
496  dx19_ = dx19_ * in.val_ + val_ * in.dx19_;
497  val_ *= in.val_;
498 
499  return *this;
500  }
502  if (in.val_ == 0.) error("TinyFad & TinyFad::operator /= (const TinyFad & in), dividing by 0");
503  dx0_ = ( dx0_ * in.val_ - val_ * in.dx0_ ) / in.val_ / in.val_ ;
504  dx1_ = ( dx1_ * in.val_ - val_ * in.dx1_ ) / in.val_ / in.val_ ;
505  dx2_ = ( dx2_ * in.val_ - val_ * in.dx2_ ) / in.val_ / in.val_ ;
506  dx3_ = ( dx3_ * in.val_ - val_ * in.dx3_ ) / in.val_ / in.val_ ;
507  dx4_ = ( dx4_ * in.val_ - val_ * in.dx4_ ) / in.val_ / in.val_ ;
508  dx5_ = ( dx5_ * in.val_ - val_ * in.dx5_ ) / in.val_ / in.val_ ;
509  dx6_ = ( dx6_ * in.val_ - val_ * in.dx6_ ) / in.val_ / in.val_ ;
510  dx7_ = ( dx7_ * in.val_ - val_ * in.dx7_ ) / in.val_ / in.val_ ;
511  dx8_ = ( dx8_ * in.val_ - val_ * in.dx8_ ) / in.val_ / in.val_ ;
512  dx9_ = ( dx9_ * in.val_ - val_ * in.dx9_ ) / in.val_ / in.val_ ;
513  dx10_ = ( dx10_ * in.val_ - val_ * in.dx10_ ) / in.val_ / in.val_ ;
514  dx11_ = ( dx11_ * in.val_ - val_ * in.dx11_ ) / in.val_ / in.val_ ;
515  dx12_ = ( dx12_ * in.val_ - val_ * in.dx12_ ) / in.val_ / in.val_ ;
516  dx13_ = ( dx13_ * in.val_ - val_ * in.dx13_ ) / in.val_ / in.val_ ;
517  dx14_ = ( dx14_ * in.val_ - val_ * in.dx14_ ) / in.val_ / in.val_ ;
518  dx15_ = ( dx15_ * in.val_ - val_ * in.dx15_ ) / in.val_ / in.val_ ;
519  dx16_ = ( dx16_ * in.val_ - val_ * in.dx16_ ) / in.val_ / in.val_ ;
520  dx17_ = ( dx17_ * in.val_ - val_ * in.dx17_ ) / in.val_ / in.val_ ;
521  dx18_ = ( dx18_ * in.val_ - val_ * in.dx18_ ) / in.val_ / in.val_ ;
522  dx19_ = ( dx19_ * in.val_ - val_ * in.dx19_ ) / in.val_ / in.val_ ;
523  val_ /= in.val_;
524 
525  return *this;
526  }
527 
528  TinyFad<20,T> & operator += (const T & in){ val_ += in;
529 
530  return *this;
531  }
532  TinyFad<20,T> & operator -= (const T & in){ val_ -= in;
533 
534  return *this;
535  }
536  TinyFad<20,T> & operator *= (const T & in){
537  val_ *= in;
538 
539  dx0_ *= in;
540  dx1_ *= in;
541  dx2_ *= in;
542  dx3_ *= in;
543  dx4_ *= in;
544  dx5_ *= in;
545  dx6_ *= in;
546  dx7_ *= in;
547  dx8_ *= in;
548  dx9_ *= in;
549  dx10_ *= in;
550  dx11_ *= in;
551  dx12_ *= in;
552  dx13_ *= in;
553  dx14_ *= in;
554  dx15_ *= in;
555  dx16_ *= in;
556  dx17_ *= in;
557  dx18_ *= in;
558  dx19_ *= in;
559 
560  return *this;
561  }
562  TinyFad<20,T> & operator /= (const T & in){
563  if ( in == T(0.) ) error("TinyFad & TinyFad::operator /= (const T & in), dividing by 0");
564  val_ /= in;
565 
566  dx0_ /= in;
567  dx1_ /= in;
568  dx2_ /= in;
569  dx3_ /= in;
570  dx4_ /= in;
571  dx5_ /= in;
572  dx6_ /= in;
573  dx7_ /= in;
574  dx8_ /= in;
575  dx9_ /= in;
576  dx10_ /= in;
577  dx11_ /= in;
578  dx12_ /= in;
579  dx13_ /= in;
580  dx14_ /= in;
581  dx15_ /= in;
582  dx16_ /= in;
583  dx17_ /= in;
584  dx18_ /= in;
585  dx19_ /= in;
586 
587  return *this;
588  }
589 
591  TinyFad<20,T> tmp(*this);
592  tmp.val_++;
593  return tmp;
594  };
596  TinyFad<20,T> tmp(*this);
597  tmp.val_--;
598  return tmp;
599  };
601  return *this;
602  }
604  return *this;
605  }
606 };
607 
608 
609 template <class T> inline TinyFad<20,T> operator + (const TinyFad<20,T>& in)
610 {
611  return TinyFad<20,T>(in);
612 }
613 
614 template <class T> inline TinyFad<20,T> operator - (const TinyFad<20,T>& in)
615 {
617  tmp -= in;
618  return tmp;
619 }
620 
621 template <class L, class R> inline
623 operator +(const TinyFad<20,L>& un, const TinyFad<20,R>& deux) {
624 
625  typedef typename NumericalTraits<L,R>::promote value_type;
626 
627  No_Initialization nothing;
628  TinyFad<20,value_type> tmp( nothing );
629 
630  tmp.d0() = un.d0() + deux.d0();
631 
632  tmp.d1() = un.d1() + deux.d1();
633 
634  tmp.d2() = un.d2() + deux.d2();
635 
636  tmp.d3() = un.d3() + deux.d3();
637 
638  tmp.d4() = un.d4() + deux.d4();
639 
640  tmp.d5() = un.d5() + deux.d5();
641 
642  tmp.d6() = un.d6() + deux.d6();
643 
644  tmp.d7() = un.d7() + deux.d7();
645 
646  tmp.d8() = un.d8() + deux.d8();
647 
648  tmp.d9() = un.d9() + deux.d9();
649 
650  tmp.d10() = un.d10() + deux.d10();
651 
652  tmp.d11() = un.d11() + deux.d11();
653 
654  tmp.d12() = un.d12() + deux.d12();
655 
656  tmp.d13() = un.d13() + deux.d13();
657 
658  tmp.d14() = un.d14() + deux.d14();
659 
660  tmp.d15() = un.d15() + deux.d15();
661 
662  tmp.d16() = un.d16() + deux.d16();
663 
664  tmp.d17() = un.d17() + deux.d17();
665 
666  tmp.d18() = un.d18() + deux.d18();
667 
668  tmp.d19() = un.d19() + deux.d19();
669 
670  tmp.val() = un.val() + deux.val();
671 
672  return tmp;
673 }
674 
675 template <class L, class R> inline
677 operator +(const TinyFad<20,L>& un, const R& deux) {
678 
679  typedef typename NumericalTraits<L,R>::promote value_type;
680 
681  No_Initialization nothing;
682  TinyFad<20,value_type> tmp( nothing );
683 
684  tmp.d0() = un.d0();
685 
686  tmp.d1() = un.d1();
687 
688  tmp.d2() = un.d2();
689 
690  tmp.d3() = un.d3();
691 
692  tmp.d4() = un.d4();
693 
694  tmp.d5() = un.d5();
695 
696  tmp.d6() = un.d6();
697 
698  tmp.d7() = un.d7();
699 
700  tmp.d8() = un.d8();
701 
702  tmp.d9() = un.d9();
703 
704  tmp.d10() = un.d10();
705 
706  tmp.d11() = un.d11();
707 
708  tmp.d12() = un.d12();
709 
710  tmp.d13() = un.d13();
711 
712  tmp.d14() = un.d14();
713 
714  tmp.d15() = un.d15();
715 
716  tmp.d16() = un.d16();
717 
718  tmp.d17() = un.d17();
719 
720  tmp.d18() = un.d18();
721 
722  tmp.d19() = un.d19();
723 
724  tmp.val() = un.val() + deux;
725 
726  return tmp;
727 }
728 
729 template <class L, class R> inline
731 operator +(const L& un, const TinyFad<20,R>& deux) {
732  return operator +(deux,un);
733 }
734 
735 template <class L, class R> inline
737 operator *(const TinyFad<20,L>& un, const TinyFad<20,R>& deux) {
738 
739  typedef typename NumericalTraits<L,R>::promote value_type;
740 
741  No_Initialization nothing;
742  TinyFad<20,value_type> tmp( nothing );
743 
744  tmp.d0() = un.d0()*deux.val() + un.val() * deux.d0();
745 
746  tmp.d1() = un.d1()*deux.val() + un.val() * deux.d1();
747 
748  tmp.d2() = un.d2()*deux.val() + un.val() * deux.d2();
749 
750  tmp.d3() = un.d3()*deux.val() + un.val() * deux.d3();
751 
752  tmp.d4() = un.d4()*deux.val() + un.val() * deux.d4();
753 
754  tmp.d5() = un.d5()*deux.val() + un.val() * deux.d5();
755 
756  tmp.d6() = un.d6()*deux.val() + un.val() * deux.d6();
757 
758  tmp.d7() = un.d7()*deux.val() + un.val() * deux.d7();
759 
760  tmp.d8() = un.d8()*deux.val() + un.val() * deux.d8();
761 
762  tmp.d9() = un.d9()*deux.val() + un.val() * deux.d9();
763 
764  tmp.d10() = un.d10()*deux.val() + un.val() * deux.d10();
765 
766  tmp.d11() = un.d11()*deux.val() + un.val() * deux.d11();
767 
768  tmp.d12() = un.d12()*deux.val() + un.val() * deux.d12();
769 
770  tmp.d13() = un.d13()*deux.val() + un.val() * deux.d13();
771 
772  tmp.d14() = un.d14()*deux.val() + un.val() * deux.d14();
773 
774  tmp.d15() = un.d15()*deux.val() + un.val() * deux.d15();
775 
776  tmp.d16() = un.d16()*deux.val() + un.val() * deux.d16();
777 
778  tmp.d17() = un.d17()*deux.val() + un.val() * deux.d17();
779 
780  tmp.d18() = un.d18()*deux.val() + un.val() * deux.d18();
781 
782  tmp.d19() = un.d19()*deux.val() + un.val() * deux.d19();
783 
784  tmp.val() = un.val() * deux.val();
785 
786  return tmp;
787 }
788 
789 template <class L, class R> inline
791 operator *(const TinyFad<20,L>& un, const R& deux) {
792 
793  typedef typename NumericalTraits<L,R>::promote value_type;
794 
795  No_Initialization nothing;
796  TinyFad<20,value_type> tmp( nothing );
797 
798  tmp.d0() = un.d0()*deux;
799 
800  tmp.d1() = un.d1()*deux;
801 
802  tmp.d2() = un.d2()*deux;
803 
804  tmp.d3() = un.d3()*deux;
805 
806  tmp.d4() = un.d4()*deux;
807 
808  tmp.d5() = un.d5()*deux;
809 
810  tmp.d6() = un.d6()*deux;
811 
812  tmp.d7() = un.d7()*deux;
813 
814  tmp.d8() = un.d8()*deux;
815 
816  tmp.d9() = un.d9()*deux;
817 
818  tmp.d10() = un.d10()*deux;
819 
820  tmp.d11() = un.d11()*deux;
821 
822  tmp.d12() = un.d12()*deux;
823 
824  tmp.d13() = un.d13()*deux;
825 
826  tmp.d14() = un.d14()*deux;
827 
828  tmp.d15() = un.d15()*deux;
829 
830  tmp.d16() = un.d16()*deux;
831 
832  tmp.d17() = un.d17()*deux;
833 
834  tmp.d18() = un.d18()*deux;
835 
836  tmp.d19() = un.d19()*deux;
837 
838  tmp.val() = un.val() * deux;
839 
840  return tmp;
841 }
842 
843 template <class L, class R> inline
845 operator *(const L& un, const TinyFad<20,R>& deux) {
846 
847  return operator *(deux,un);
848 }
849 
850 
851 template <class L, class R> inline
853 operator -(const TinyFad<20,L> & un, const TinyFad<20,R> & deux) {
854 
855  typedef typename NumericalTraits<L,R>::promote value_type;
856 
857  No_Initialization nothing;
858  TinyFad<20,value_type> tmp( nothing );
859 
860  tmp.d0() = un.d0() - deux.d0();
861 
862  tmp.d1() = un.d1() - deux.d1();
863 
864  tmp.d2() = un.d2() - deux.d2();
865 
866  tmp.d3() = un.d3() - deux.d3();
867 
868  tmp.d4() = un.d4() - deux.d4();
869 
870  tmp.d5() = un.d5() - deux.d5();
871 
872  tmp.d6() = un.d6() - deux.d6();
873 
874  tmp.d7() = un.d7() - deux.d7();
875 
876  tmp.d8() = un.d8() - deux.d8();
877 
878  tmp.d9() = un.d9() - deux.d9();
879 
880  tmp.d10() = un.d10() - deux.d10();
881 
882  tmp.d11() = un.d11() - deux.d11();
883 
884  tmp.d12() = un.d12() - deux.d12();
885 
886  tmp.d13() = un.d13() - deux.d13();
887 
888  tmp.d14() = un.d14() - deux.d14();
889 
890  tmp.d15() = un.d15() - deux.d15();
891 
892  tmp.d16() = un.d16() - deux.d16();
893 
894  tmp.d17() = un.d17() - deux.d17();
895 
896  tmp.d18() = un.d18() - deux.d18();
897 
898  tmp.d19() = un.d19() - deux.d19();
899 
900  tmp.val() = un.val() - deux.val();
901 
902  return tmp;
903 }
904 
905 template <class L, class R> inline
907 operator -(const L & un, const TinyFad<20,R> & deux) {
908 
909  typedef typename NumericalTraits<L,R>::promote value_type;
910 
911  No_Initialization nothing;
912  TinyFad<20,value_type> tmp( nothing );
913 
914  tmp.d0() -= deux.d0();
915 
916  tmp.d1() -= deux.d1();
917 
918  tmp.d2() -= deux.d2();
919 
920  tmp.d3() -= deux.d3();
921 
922  tmp.d4() -= deux.d4();
923 
924  tmp.d5() -= deux.d5();
925 
926  tmp.d6() -= deux.d6();
927 
928  tmp.d7() -= deux.d7();
929 
930  tmp.d8() -= deux.d8();
931 
932  tmp.d9() -= deux.d9();
933 
934  tmp.d10() -= deux.d10();
935 
936  tmp.d11() -= deux.d11();
937 
938  tmp.d12() -= deux.d12();
939 
940  tmp.d13() -= deux.d13();
941 
942  tmp.d14() -= deux.d14();
943 
944  tmp.d15() -= deux.d15();
945 
946  tmp.d16() -= deux.d16();
947 
948  tmp.d17() -= deux.d17();
949 
950  tmp.d18() -= deux.d18();
951 
952  tmp.d19() -= deux.d19();
953 
954  tmp.val() = un - deux.val();
955 
956  return tmp;
957 }
958 
959 template <class L, class R> inline
961 operator -(const TinyFad<20,L> & un, const R & deux) {
962  typedef typename NumericalTraits<L,R>::promote value_type;
963 
964  No_Initialization nothing;
965  TinyFad<20,value_type> tmp( nothing );
966 
967  tmp.d0() = un.d0();
968 
969  tmp.d1() = un.d1();
970 
971  tmp.d2() = un.d2();
972 
973  tmp.d3() = un.d3();
974 
975  tmp.d4() = un.d4();
976 
977  tmp.d5() = un.d5();
978 
979  tmp.d6() = un.d6();
980 
981  tmp.d7() = un.d7();
982 
983  tmp.d8() = un.d8();
984 
985  tmp.d9() = un.d9();
986 
987  tmp.d10() = un.d10();
988 
989  tmp.d11() = un.d11();
990 
991  tmp.d12() = un.d12();
992 
993  tmp.d13() = un.d13();
994 
995  tmp.d14() = un.d14();
996 
997  tmp.d15() = un.d15();
998 
999  tmp.d16() = un.d16();
1000 
1001  tmp.d17() = un.d17();
1002 
1003  tmp.d18() = un.d18();
1004 
1005  tmp.d19() = un.d19();
1006 
1007  tmp.val() = un.val() - deux;
1008 
1009  return tmp;
1010 }
1011 
1012 template <class L, class R> inline
1014 operator /(const TinyFad<20,L> & un, const TinyFad<20,R> & deux) {
1015 
1016  typedef typename NumericalTraits<L,R>::promote value_type;
1017 
1018  if (deux.val() == 0.) error("TinyFad & TinyFad::operator /(const TinyFad<20,L> & un, const TinyFad<20,R> & deux), dividing by 0");
1019 
1020  No_Initialization nothing;
1021  TinyFad<20,value_type> tmp( nothing );
1022  value_type dval = deux.val();
1023 
1024  tmp.d0() = ( un.d0()* deux.val() - un.val() * deux.d0() ) / dval / dval ;
1025 
1026  tmp.d1() = ( un.d1()* deux.val() - un.val() * deux.d1() ) / dval / dval ;
1027 
1028  tmp.d2() = ( un.d2()* deux.val() - un.val() * deux.d2() ) / dval / dval ;
1029 
1030  tmp.d3() = ( un.d3()* deux.val() - un.val() * deux.d3() ) / dval / dval ;
1031 
1032  tmp.d4() = ( un.d4()* deux.val() - un.val() * deux.d4() ) / dval / dval ;
1033 
1034  tmp.d5() = ( un.d5()* deux.val() - un.val() * deux.d5() ) / dval / dval ;
1035 
1036  tmp.d6() = ( un.d6()* deux.val() - un.val() * deux.d6() ) / dval / dval ;
1037 
1038  tmp.d7() = ( un.d7()* deux.val() - un.val() * deux.d7() ) / dval / dval ;
1039 
1040  tmp.d8() = ( un.d8()* deux.val() - un.val() * deux.d8() ) / dval / dval ;
1041 
1042  tmp.d9() = ( un.d9()* deux.val() - un.val() * deux.d9() ) / dval / dval ;
1043 
1044  tmp.d10() = ( un.d10()* deux.val() - un.val() * deux.d10() ) / dval / dval ;
1045 
1046  tmp.d11() = ( un.d11()* deux.val() - un.val() * deux.d11() ) / dval / dval ;
1047 
1048  tmp.d12() = ( un.d12()* deux.val() - un.val() * deux.d12() ) / dval / dval ;
1049 
1050  tmp.d13() = ( un.d13()* deux.val() - un.val() * deux.d13() ) / dval / dval ;
1051 
1052  tmp.d14() = ( un.d14()* deux.val() - un.val() * deux.d14() ) / dval / dval ;
1053 
1054  tmp.d15() = ( un.d15()* deux.val() - un.val() * deux.d15() ) / dval / dval ;
1055 
1056  tmp.d16() = ( un.d16()* deux.val() - un.val() * deux.d16() ) / dval / dval ;
1057 
1058  tmp.d17() = ( un.d17()* deux.val() - un.val() * deux.d17() ) / dval / dval ;
1059 
1060  tmp.d18() = ( un.d18()* deux.val() - un.val() * deux.d18() ) / dval / dval ;
1061 
1062  tmp.d19() = ( un.d19()* deux.val() - un.val() * deux.d19() ) / dval / dval ;
1063 
1064  tmp.val() = un.val() / dval;
1065 
1066  return tmp;
1067 }
1068 
1069 template <class L, class R> inline
1071 operator /(const L & un, const TinyFad<20,R> & deux) {
1072 
1073  typedef typename NumericalTraits<L,R>::promote value_type;
1074 
1075  if (deux.val() == 0.) error("TinyFad & TinyFad::operator /(const L & un, const TinyFad<20,R> & deux), dividing by 0");
1076 
1077  No_Initialization nothing;
1078  TinyFad<20,value_type> tmp( nothing );
1079  value_type dval = deux.val();
1080 
1081  tmp.d0() = - un * deux.d0() / dval / dval ;
1082 
1083  tmp.d1() = - un * deux.d1() / dval / dval ;
1084 
1085  tmp.d2() = - un * deux.d2() / dval / dval ;
1086 
1087  tmp.d3() = - un * deux.d3() / dval / dval ;
1088 
1089  tmp.d4() = - un * deux.d4() / dval / dval ;
1090 
1091  tmp.d5() = - un * deux.d5() / dval / dval ;
1092 
1093  tmp.d6() = - un * deux.d6() / dval / dval ;
1094 
1095  tmp.d7() = - un * deux.d7() / dval / dval ;
1096 
1097  tmp.d8() = - un * deux.d8() / dval / dval ;
1098 
1099  tmp.d9() = - un * deux.d9() / dval / dval ;
1100 
1101  tmp.d10() = - un * deux.d10() / dval / dval ;
1102 
1103  tmp.d11() = - un * deux.d11() / dval / dval ;
1104 
1105  tmp.d12() = - un * deux.d12() / dval / dval ;
1106 
1107  tmp.d13() = - un * deux.d13() / dval / dval ;
1108 
1109  tmp.d14() = - un * deux.d14() / dval / dval ;
1110 
1111  tmp.d15() = - un * deux.d15() / dval / dval ;
1112 
1113  tmp.d16() = - un * deux.d16() / dval / dval ;
1114 
1115  tmp.d17() = - un * deux.d17() / dval / dval ;
1116 
1117  tmp.d18() = - un * deux.d18() / dval / dval ;
1118 
1119  tmp.d19() = - un * deux.d19() / dval / dval ;
1120 
1121  tmp.val() = un / dval;
1122 
1123  return tmp;
1124 }
1125 
1126 template <class L, class R> inline
1128 operator /(const TinyFad<20,L> & un, const R & deux) {
1129 
1130  typedef typename NumericalTraits<L,R>::promote value_type;
1131 
1132  if (deux == 0.) error("TinyFad & TinyFad::operator /(const TinyFad<20,L> & un, const R & deux), dividing by 0");
1133 
1134  No_Initialization nothing;
1135  TinyFad<20,value_type> tmp( nothing );
1136 
1137  tmp.d0() = un.d0() / deux;
1138 
1139  tmp.d1() = un.d1() / deux;
1140 
1141  tmp.d2() = un.d2() / deux;
1142 
1143  tmp.d3() = un.d3() / deux;
1144 
1145  tmp.d4() = un.d4() / deux;
1146 
1147  tmp.d5() = un.d5() / deux;
1148 
1149  tmp.d6() = un.d6() / deux;
1150 
1151  tmp.d7() = un.d7() / deux;
1152 
1153  tmp.d8() = un.d8() / deux;
1154 
1155  tmp.d9() = un.d9() / deux;
1156 
1157  tmp.d10() = un.d10() / deux;
1158 
1159  tmp.d11() = un.d11() / deux;
1160 
1161  tmp.d12() = un.d12() / deux;
1162 
1163  tmp.d13() = un.d13() / deux;
1164 
1165  tmp.d14() = un.d14() / deux;
1166 
1167  tmp.d15() = un.d15() / deux;
1168 
1169  tmp.d16() = un.d16() / deux;
1170 
1171  tmp.d17() = un.d17() / deux;
1172 
1173  tmp.d18() = un.d18() / deux;
1174 
1175  tmp.d19() = un.d19() / deux;
1176 
1177  tmp.val() = un.val() / deux;
1178 
1179  return tmp;
1180 }
1181 
1182 template <class T> TinyFad<20,T> exp (const TinyFad<20,T>& in)
1183 {
1184  TinyFad<20,T> tmp(exp(in.val()));
1185 
1186  tmp.d0() = in.d0()*exp(in.val());
1187  tmp.d1() = in.d1()*exp(in.val());
1188  tmp.d2() = in.d2()*exp(in.val());
1189  tmp.d3() = in.d3()*exp(in.val());
1190  tmp.d4() = in.d4()*exp(in.val());
1191  tmp.d5() = in.d5()*exp(in.val());
1192  tmp.d6() = in.d6()*exp(in.val());
1193  tmp.d7() = in.d7()*exp(in.val());
1194  tmp.d8() = in.d8()*exp(in.val());
1195  tmp.d9() = in.d9()*exp(in.val());
1196  tmp.d10() = in.d10()*exp(in.val());
1197  tmp.d11() = in.d11()*exp(in.val());
1198  tmp.d12() = in.d12()*exp(in.val());
1199  tmp.d13() = in.d13()*exp(in.val());
1200  tmp.d14() = in.d14()*exp(in.val());
1201  tmp.d15() = in.d15()*exp(in.val());
1202  tmp.d16() = in.d16()*exp(in.val());
1203  tmp.d17() = in.d17()*exp(in.val());
1204  tmp.d18() = in.d18()*exp(in.val());
1205  tmp.d19() = in.d19()*exp(in.val());
1206 
1207  return tmp;
1208 }
1209 
1210 template <class T> TinyFad<20,T> log (const TinyFad<20,T>& in)
1211 {
1212  if ( in.val() <= 0) error("TinyFad log (const TinyFad& in) : zero or negative value");
1213  TinyFad<20,T> tmp(log(in.val()));
1214 
1215  tmp.d0() = in.d0() / in.val();
1216  tmp.d1() = in.d1() / in.val();
1217  tmp.d2() = in.d2() / in.val();
1218  tmp.d3() = in.d3() / in.val();
1219  tmp.d4() = in.d4() / in.val();
1220  tmp.d5() = in.d5() / in.val();
1221  tmp.d6() = in.d6() / in.val();
1222  tmp.d7() = in.d7() / in.val();
1223  tmp.d8() = in.d8() / in.val();
1224  tmp.d9() = in.d9() / in.val();
1225  tmp.d10() = in.d10() / in.val();
1226  tmp.d11() = in.d11() / in.val();
1227  tmp.d12() = in.d12() / in.val();
1228  tmp.d13() = in.d13() / in.val();
1229  tmp.d14() = in.d14() / in.val();
1230  tmp.d15() = in.d15() / in.val();
1231  tmp.d16() = in.d16() / in.val();
1232  tmp.d17() = in.d17() / in.val();
1233  tmp.d18() = in.d18() / in.val();
1234  tmp.d19() = in.d19() / in.val();
1235 
1236  return tmp;
1237 }
1238 
1239 template <class T> TinyFad<20,T> sqrt (const TinyFad<20,T>& in)
1240 {
1241  if ( in.val() < 0. ) error("TinyFad<20,T> sqrt (const TinyFad& in) : negative value");
1242  TinyFad<20,T> tmp(sqrt(in.val()));
1243 
1244  bool test=true;
1245  if ( in.val() == T(0.) ){
1246  if ( in.d0() != T(0.) ) test = false;
1247 
1248  if ( in.d1() != T(0.) ) test = false;
1249 
1250  if ( in.d2() != T(0.) ) test = false;
1251 
1252  if ( in.d3() != T(0.) ) test = false;
1253 
1254  if ( in.d4() != T(0.) ) test = false;
1255 
1256  if ( in.d5() != T(0.) ) test = false;
1257 
1258  if ( in.d6() != T(0.) ) test = false;
1259 
1260  if ( in.d7() != T(0.) ) test = false;
1261 
1262  if ( in.d8() != T(0.) ) test = false;
1263 
1264  if ( in.d9() != T(0.) ) test = false;
1265 
1266  if ( in.d10() != T(0.) ) test = false;
1267 
1268  if ( in.d11() != T(0.) ) test = false;
1269 
1270  if ( in.d12() != T(0.) ) test = false;
1271 
1272  if ( in.d13() != T(0.) ) test = false;
1273 
1274  if ( in.d14() != T(0.) ) test = false;
1275 
1276  if ( in.d15() != T(0.) ) test = false;
1277 
1278  if ( in.d16() != T(0.) ) test = false;
1279 
1280  if ( in.d17() != T(0.) ) test = false;
1281 
1282  if ( in.d18() != T(0.) ) test = false;
1283 
1284  if ( in.d19() != T(0.) ) test = false;
1285 
1286  if ( !test )
1287  error("TinyFad<20,T> sqrt (const TinyFad& in) : null value");
1288  }
1289  else {
1290  tmp.d0() = in.d0() / sqrt(in.val()) / 2.;
1291  tmp.d1() = in.d1() / sqrt(in.val()) / 2.;
1292  tmp.d2() = in.d2() / sqrt(in.val()) / 2.;
1293  tmp.d3() = in.d3() / sqrt(in.val()) / 2.;
1294  tmp.d4() = in.d4() / sqrt(in.val()) / 2.;
1295  tmp.d5() = in.d5() / sqrt(in.val()) / 2.;
1296  tmp.d6() = in.d6() / sqrt(in.val()) / 2.;
1297  tmp.d7() = in.d7() / sqrt(in.val()) / 2.;
1298  tmp.d8() = in.d8() / sqrt(in.val()) / 2.;
1299  tmp.d9() = in.d9() / sqrt(in.val()) / 2.;
1300  tmp.d10() = in.d10() / sqrt(in.val()) / 2.;
1301  tmp.d11() = in.d11() / sqrt(in.val()) / 2.;
1302  tmp.d12() = in.d12() / sqrt(in.val()) / 2.;
1303  tmp.d13() = in.d13() / sqrt(in.val()) / 2.;
1304  tmp.d14() = in.d14() / sqrt(in.val()) / 2.;
1305  tmp.d15() = in.d15() / sqrt(in.val()) / 2.;
1306  tmp.d16() = in.d16() / sqrt(in.val()) / 2.;
1307  tmp.d17() = in.d17() / sqrt(in.val()) / 2.;
1308  tmp.d18() = in.d18() / sqrt(in.val()) / 2.;
1309  tmp.d19() = in.d19() / sqrt(in.val()) / 2.;
1310  }
1311 
1312  return tmp;
1313 }
1314 
1315 template <class T> TinyFad<20,T> sin (const TinyFad<20,T>& in)
1316 {
1317  TinyFad<20,T> tmp( sin(in.val()) );
1318 
1319  tmp.d0() = in.d0() * cos( in.val() );
1320  tmp.d1() = in.d1() * cos( in.val() );
1321  tmp.d2() = in.d2() * cos( in.val() );
1322  tmp.d3() = in.d3() * cos( in.val() );
1323  tmp.d4() = in.d4() * cos( in.val() );
1324  tmp.d5() = in.d5() * cos( in.val() );
1325  tmp.d6() = in.d6() * cos( in.val() );
1326  tmp.d7() = in.d7() * cos( in.val() );
1327  tmp.d8() = in.d8() * cos( in.val() );
1328  tmp.d9() = in.d9() * cos( in.val() );
1329  tmp.d10() = in.d10() * cos( in.val() );
1330  tmp.d11() = in.d11() * cos( in.val() );
1331  tmp.d12() = in.d12() * cos( in.val() );
1332  tmp.d13() = in.d13() * cos( in.val() );
1333  tmp.d14() = in.d14() * cos( in.val() );
1334  tmp.d15() = in.d15() * cos( in.val() );
1335  tmp.d16() = in.d16() * cos( in.val() );
1336  tmp.d17() = in.d17() * cos( in.val() );
1337  tmp.d18() = in.d18() * cos( in.val() );
1338  tmp.d19() = in.d19() * cos( in.val() );
1339 
1340  return tmp;
1341 }
1342 
1343 template <class T> TinyFad<20,T> cos (const TinyFad<20,T>& in)
1344 {
1345  TinyFad<20,T> tmp(cos(in.val()));
1346 
1347  tmp.d0() = - in.d0() * sin( in.val() );
1348  tmp.d1() = - in.d1() * sin( in.val() );
1349  tmp.d2() = - in.d2() * sin( in.val() );
1350  tmp.d3() = - in.d3() * sin( in.val() );
1351  tmp.d4() = - in.d4() * sin( in.val() );
1352  tmp.d5() = - in.d5() * sin( in.val() );
1353  tmp.d6() = - in.d6() * sin( in.val() );
1354  tmp.d7() = - in.d7() * sin( in.val() );
1355  tmp.d8() = - in.d8() * sin( in.val() );
1356  tmp.d9() = - in.d9() * sin( in.val() );
1357  tmp.d10() = - in.d10() * sin( in.val() );
1358  tmp.d11() = - in.d11() * sin( in.val() );
1359  tmp.d12() = - in.d12() * sin( in.val() );
1360  tmp.d13() = - in.d13() * sin( in.val() );
1361  tmp.d14() = - in.d14() * sin( in.val() );
1362  tmp.d15() = - in.d15() * sin( in.val() );
1363  tmp.d16() = - in.d16() * sin( in.val() );
1364  tmp.d17() = - in.d17() * sin( in.val() );
1365  tmp.d18() = - in.d18() * sin( in.val() );
1366  tmp.d19() = - in.d19() * sin( in.val() );
1367 
1368  return tmp;
1369 }
1370 
1371 template <class T> TinyFad<20,T> tan (const TinyFad<20,T>& in)
1372 {
1373  if ( in.val() == 0) error("TinyFad tan (const TinyFad& in) undiefined in 0.");
1374  TinyFad<20,T> tmp(tan(in.val()));
1375 
1376  T cosinus = cos(in.val());
1377  tmp.d0() = in.d0() / cosinus / cosinus;
1378  tmp.d1() = in.d1() / cosinus / cosinus;
1379  tmp.d2() = in.d2() / cosinus / cosinus;
1380  tmp.d3() = in.d3() / cosinus / cosinus;
1381  tmp.d4() = in.d4() / cosinus / cosinus;
1382  tmp.d5() = in.d5() / cosinus / cosinus;
1383  tmp.d6() = in.d6() / cosinus / cosinus;
1384  tmp.d7() = in.d7() / cosinus / cosinus;
1385  tmp.d8() = in.d8() / cosinus / cosinus;
1386  tmp.d9() = in.d9() / cosinus / cosinus;
1387  tmp.d10() = in.d10() / cosinus / cosinus;
1388  tmp.d11() = in.d11() / cosinus / cosinus;
1389  tmp.d12() = in.d12() / cosinus / cosinus;
1390  tmp.d13() = in.d13() / cosinus / cosinus;
1391  tmp.d14() = in.d14() / cosinus / cosinus;
1392  tmp.d15() = in.d15() / cosinus / cosinus;
1393  tmp.d16() = in.d16() / cosinus / cosinus;
1394  tmp.d17() = in.d17() / cosinus / cosinus;
1395  tmp.d18() = in.d18() / cosinus / cosinus;
1396  tmp.d19() = in.d19() / cosinus / cosinus;
1397 
1398  return tmp;
1399 }
1400 
1401 template <class T> TinyFad<20,T> pow (const TinyFad<20,T>& in, double e)
1402 {
1403  TinyFad<20,T> tmp(pow(in.val(), e));
1404 
1405  tmp.d0() = e*in.d0()*pow(in.val(), e-1);
1406  tmp.d1() = e*in.d1()*pow(in.val(), e-1);
1407  tmp.d2() = e*in.d2()*pow(in.val(), e-1);
1408  tmp.d3() = e*in.d3()*pow(in.val(), e-1);
1409  tmp.d4() = e*in.d4()*pow(in.val(), e-1);
1410  tmp.d5() = e*in.d5()*pow(in.val(), e-1);
1411  tmp.d6() = e*in.d6()*pow(in.val(), e-1);
1412  tmp.d7() = e*in.d7()*pow(in.val(), e-1);
1413  tmp.d8() = e*in.d8()*pow(in.val(), e-1);
1414  tmp.d9() = e*in.d9()*pow(in.val(), e-1);
1415  tmp.d10() = e*in.d10()*pow(in.val(), e-1);
1416  tmp.d11() = e*in.d11()*pow(in.val(), e-1);
1417  tmp.d12() = e*in.d12()*pow(in.val(), e-1);
1418  tmp.d13() = e*in.d13()*pow(in.val(), e-1);
1419  tmp.d14() = e*in.d14()*pow(in.val(), e-1);
1420  tmp.d15() = e*in.d15()*pow(in.val(), e-1);
1421  tmp.d16() = e*in.d16()*pow(in.val(), e-1);
1422  tmp.d17() = e*in.d17()*pow(in.val(), e-1);
1423  tmp.d18() = e*in.d18()*pow(in.val(), e-1);
1424  tmp.d19() = e*in.d19()*pow(in.val(), e-1);
1425 
1426  return tmp;
1427 }
1428 
1429 template <class T> TinyFad<20,T> pow (const TinyFad<20,T>& un, const TinyFad<20,T>& deux)
1430 {
1431  if (un.val() == 0) error("TinyFad pow (const TinyFad& un, const TinyFad& deux), un = 0. ");
1432  TinyFad<20,T> tmp(pow(un.val(), deux.val()));
1433 
1434  tmp.d0() = deux.d0() * log(un.val()) * pow(un.val(), deux.val())
1435  + deux.val() * un.d0() * pow(un.val(), deux.val()-1);
1436  tmp.d1() = deux.d1() * log(un.val()) * pow(un.val(), deux.val())
1437  + deux.val() * un.d1() * pow(un.val(), deux.val()-1);
1438  tmp.d2() = deux.d2() * log(un.val()) * pow(un.val(), deux.val())
1439  + deux.val() * un.d2() * pow(un.val(), deux.val()-1);
1440  tmp.d3() = deux.d3() * log(un.val()) * pow(un.val(), deux.val())
1441  + deux.val() * un.d3() * pow(un.val(), deux.val()-1);
1442  tmp.d4() = deux.d4() * log(un.val()) * pow(un.val(), deux.val())
1443  + deux.val() * un.d4() * pow(un.val(), deux.val()-1);
1444  tmp.d5() = deux.d5() * log(un.val()) * pow(un.val(), deux.val())
1445  + deux.val() * un.d5() * pow(un.val(), deux.val()-1);
1446  tmp.d6() = deux.d6() * log(un.val()) * pow(un.val(), deux.val())
1447  + deux.val() * un.d6() * pow(un.val(), deux.val()-1);
1448  tmp.d7() = deux.d7() * log(un.val()) * pow(un.val(), deux.val())
1449  + deux.val() * un.d7() * pow(un.val(), deux.val()-1);
1450  tmp.d8() = deux.d8() * log(un.val()) * pow(un.val(), deux.val())
1451  + deux.val() * un.d8() * pow(un.val(), deux.val()-1);
1452  tmp.d9() = deux.d9() * log(un.val()) * pow(un.val(), deux.val())
1453  + deux.val() * un.d9() * pow(un.val(), deux.val()-1);
1454  tmp.d10() = deux.d10() * log(un.val()) * pow(un.val(), deux.val())
1455  + deux.val() * un.d10() * pow(un.val(), deux.val()-1);
1456  tmp.d11() = deux.d11() * log(un.val()) * pow(un.val(), deux.val())
1457  + deux.val() * un.d11() * pow(un.val(), deux.val()-1);
1458  tmp.d12() = deux.d12() * log(un.val()) * pow(un.val(), deux.val())
1459  + deux.val() * un.d12() * pow(un.val(), deux.val()-1);
1460  tmp.d13() = deux.d13() * log(un.val()) * pow(un.val(), deux.val())
1461  + deux.val() * un.d13() * pow(un.val(), deux.val()-1);
1462  tmp.d14() = deux.d14() * log(un.val()) * pow(un.val(), deux.val())
1463  + deux.val() * un.d14() * pow(un.val(), deux.val()-1);
1464  tmp.d15() = deux.d15() * log(un.val()) * pow(un.val(), deux.val())
1465  + deux.val() * un.d15() * pow(un.val(), deux.val()-1);
1466  tmp.d16() = deux.d16() * log(un.val()) * pow(un.val(), deux.val())
1467  + deux.val() * un.d16() * pow(un.val(), deux.val()-1);
1468  tmp.d17() = deux.d17() * log(un.val()) * pow(un.val(), deux.val())
1469  + deux.val() * un.d17() * pow(un.val(), deux.val()-1);
1470  tmp.d18() = deux.d18() * log(un.val()) * pow(un.val(), deux.val())
1471  + deux.val() * un.d18() * pow(un.val(), deux.val()-1);
1472  tmp.d19() = deux.d19() * log(un.val()) * pow(un.val(), deux.val())
1473  + deux.val() * un.d19() * pow(un.val(), deux.val()-1);
1474 
1475  return tmp;
1476 }
1477 
1478 template <class T> TinyFad<20,T> pow (const TinyFad<20,T>& in, const int e)
1479 {
1480  TinyFad<20,T> tmp( pow((double)in.val(), (double)e) );
1481 
1482  tmp.d0() = e*in.d0()*pow((double)in.val(), (double)e-1);
1483  tmp.d1() = e*in.d1()*pow((double)in.val(), (double)e-1);
1484  tmp.d2() = e*in.d2()*pow((double)in.val(), (double)e-1);
1485  tmp.d3() = e*in.d3()*pow((double)in.val(), (double)e-1);
1486  tmp.d4() = e*in.d4()*pow((double)in.val(), (double)e-1);
1487  tmp.d5() = e*in.d5()*pow((double)in.val(), (double)e-1);
1488  tmp.d6() = e*in.d6()*pow((double)in.val(), (double)e-1);
1489  tmp.d7() = e*in.d7()*pow((double)in.val(), (double)e-1);
1490  tmp.d8() = e*in.d8()*pow((double)in.val(), (double)e-1);
1491  tmp.d9() = e*in.d9()*pow((double)in.val(), (double)e-1);
1492  tmp.d10() = e*in.d10()*pow((double)in.val(), (double)e-1);
1493  tmp.d11() = e*in.d11()*pow((double)in.val(), (double)e-1);
1494  tmp.d12() = e*in.d12()*pow((double)in.val(), (double)e-1);
1495  tmp.d13() = e*in.d13()*pow((double)in.val(), (double)e-1);
1496  tmp.d14() = e*in.d14()*pow((double)in.val(), (double)e-1);
1497  tmp.d15() = e*in.d15()*pow((double)in.val(), (double)e-1);
1498  tmp.d16() = e*in.d16()*pow((double)in.val(), (double)e-1);
1499  tmp.d17() = e*in.d17()*pow((double)in.val(), (double)e-1);
1500  tmp.d18() = e*in.d18()*pow((double)in.val(), (double)e-1);
1501  tmp.d19() = e*in.d19()*pow((double)in.val(), (double)e-1);
1502 
1503  return tmp;
1504 }
1505 
1506 template <class T> TinyFad<20,T> abs (const TinyFad<20,T>& in)
1507 {
1508  int sign = in.val() > 0? 1:0;
1509 
1510  if (sign) return in;
1511  else return (-in);
1512 }
1513 
1514 template <class T> std::ostream& operator << (std::ostream& os, const TinyFad<20,T>& a)
1515 {
1516  os.setf(std::ios::fixed,std::ios::scientific);
1517  os.width(12);
1518  os << a.val() << " [";
1519 
1520  os.width(12);
1521  os << a.d0();
1522  os.width(12);
1523  os << a.d1();
1524  os.width(12);
1525  os << a.d2();
1526  os.width(12);
1527  os << a.d3();
1528  os.width(12);
1529  os << a.d4();
1530  os.width(12);
1531  os << a.d5();
1532  os.width(12);
1533  os << a.d6();
1534  os.width(12);
1535  os << a.d7();
1536  os.width(12);
1537  os << a.d8();
1538  os.width(12);
1539  os << a.d9();
1540  os.width(12);
1541  os << a.d10();
1542  os.width(12);
1543  os << a.d11();
1544  os.width(12);
1545  os << a.d12();
1546  os.width(12);
1547  os << a.d13();
1548  os.width(12);
1549  os << a.d14();
1550  os.width(12);
1551  os << a.d15();
1552  os.width(12);
1553  os << a.d16();
1554  os.width(12);
1555  os << a.d17();
1556  os.width(12);
1557  os << a.d18();
1558  os.width(12);
1559  os << a.d19();
1560 
1561  os << "]";
1562 
1563  return os;
1564 }
1565 
1566 
1567 #endif
const T & d12() const
const T & d13() const
const T & d9() const
const T & d10() const
TinyFad< 20, typename NumericalTraits< L, R >::promote > operator*(const TinyFad< 20, L > &un, const TinyFad< 20, R > &deux)
TinyFad< 20, T > operator--(int)
const T & d15() const
TinyFad< 20, T > tan(const TinyFad< 20, T > &in)
TinyFad< Num, T > & operator-=(const TinyFad< Num, T > &in)
Definition: tinyfad.h:233
const T & d4() const
TinyFad< 20, T > exp(const TinyFad< 20, T > &in)
const T & d0() const
const T & d7() const
Definition: test.py:1
TinyFad< 20, T > cos(const TinyFad< 20, T > &in)
TinyFad< 20, T > operator+(const TinyFad< 20, T > &in)
TinyFad(const T &ind, const int ini)
Definition: tinyfadtwenty.h:89
TinyFad< 20, T > operator-(const TinyFad< 20, T > &in)
const T & dx(int i) const
TinyFad< 20, T > & operator++()
AutoPointerMutexArrayInit tmp
T val_
Definition: tinyfad.h:47
const T & d17() const
const T & d2() const
void diff(const size_t ith, const size_t sz)
Definition: tinyfadtwenty.h:41
void error(char *string)
Definition: testShape.cc:7
TinyFad< 20, T > operator++(int)
TinyFad(const T &in)
const T & d(int i) const
const T & d14() const
const T & d11() const
TinyFad< 20, T > abs(const TinyFad< 20, T > &in)
TinyFad< Num, T > & operator=(const TinyFad< Num, T > &in)
Definition: tinyfad.h:189
TinyFad< 20, typename NumericalTraits< L, R >::promote > operator/(const TinyFad< 20, L > &un, const TinyFad< 20, R > &deux)
const T & d16() const
TinyFad< 20, T > sqrt(const TinyFad< 20, T > &in)
TinyFad< Num, T > & operator+=(const TinyFad< Num, T > &in)
Definition: tinyfad.h:219
T value_type
Definition: tinyfad.h:53
const T & d3() const
const T & d5() const
TinyFad(const No_Initialization &)
TinyFad< Num, T > & operator*=(const TinyFad< Num, T > &in)
Definition: tinyfad.h:247
TinyFad< 20, T > pow(const TinyFad< 20, T > &in, double e)
TinyFad< 20, T > & operator--()
const T & d1() const
TinyFad< 20, T > sin(const TinyFad< 20, T > &in)
TinyFad< 20, T > log(const TinyFad< 20, T > &in)
const T & d19() const
TinyFad< Num, T > & operator/=(const TinyFad< Num, T > &in)
Definition: tinyfad.h:261
const T & d8() const
const T & val() const
TinyFad(const TinyFad< 20, T > &in)
const T & val() const
Definition: tinyfad.h:72
const T & d18() const
const T & d6() const