annotate src/func.cpp @ 30:d22bce6382d7

Finalise removal of all namespaces, one namespace to rule them all.
author Jordi Gutiérrez Hermoso <jordigh@gmail.com>
date Wed, 03 Feb 2010 19:30:20 -0600
parents 0af772242000
children 7f31f9e2d196
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
1 #include "include/func.hpp"
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
2 #include "include/error.hpp"
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
3 #include <gsl/gsl_deriv.h>
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
4 #include <cmath>
4
9d4fda54a41d Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents: 0
diff changeset
5 #include <limits>
0
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
6
30
d22bce6382d7 Finalise removal of all namespaces, one namespace to rule them all.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 28
diff changeset
7 namespace kwantxi{
0
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
8
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
9 //The static variables...
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
10 double realfunc::eps = 0;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
11 double realfunc::sqrteps = 0;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
12 double realfunc::root3eps = 0;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
13 bool realfunc::initialised = false;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
14
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
15 //Static variables
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
16 point gsl_function_wrapper::x;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
17 size_t gsl_function_wrapper::index = 1;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
18 realfunc gsl_function_wrapper::myfunc(0);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
19 gsl_function* gsl_function_wrapper::f = 0;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
20
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
21 //******************* Wrapper functions *****************************
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
22 gsl_function_wrapper::gsl_function_wrapper( const realfunc &thefunc,
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
23 point p, size_t idx){
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
24 myfunc = thefunc;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
25 x = p;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
26 index = idx;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
27 f -> function = &takemyaddress;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
28 f -> params = 0;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
29
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
30 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
31
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
32 void gsl_function_wrapper::set_params(const realfunc &thefunc,
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
33 point p, size_t idx){
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
34 myfunc = thefunc;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
35 x = p;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
36 index = idx;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
37 f -> function = &takemyaddress;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
38 f -> params = 0;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
39 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
40
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
41 gsl_function* gsl_function_wrapper::get_gsl_function() const{
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
42 return f;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
43 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
44
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
45 double gsl_function_wrapper::takemyaddress(double xi, void* nothing){
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
46 x(index) = xi;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
47 nothing = 0;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
48 return myfunc(x);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
49 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
50
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
51 // **************** realfunc functions *********************************
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
52 realfunc::realfunc() : myfunc(0){
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
53 if(!initialised){
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
54 eps = std::numeric_limits<double>::epsilon();
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
55 sqrteps = sqrt(eps);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
56 root3eps = pow(eps,1/3.0);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
57 initialised = true;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
58 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
59 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
60
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
61 realfunc::realfunc( double(*f)(const point&)) : myfunc(f) {
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
62 if(!initialised){
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
63 eps = std::numeric_limits<double>::epsilon();
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
64 sqrteps = sqrt(eps);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
65 root3eps = pow(eps,1/3.0);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
66 initialised = true;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
67 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
68 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
69
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
70 void realfunc::set_function_ptr(double (f_in)(const point &p)){
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
71 myfunc = f_in;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
72 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
73
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
74 double realfunc::operator()(const point& p) const{
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
75 return at(p);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
76 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
77 double realfunc::at(const point& p) const{
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
78 if(myfunc == 0){
15
5144dd3c5468 Almost completed adding all Doxygen docstrings.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 4
diff changeset
79 throw no_init(__LINE__,__FILE__);
0
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
80 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
81
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
82 return myfunc(p);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
83 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
84
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
85 double realfunc::d(const point& p, size_t k) const{
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
86 gsl_function_wrapper gfw(*this,p,k);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
87 double result, abserror;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
88 double x = p(1);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
89 double typx = (1 > log(x) ? 1 : log(x));
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
90 double h = sqrteps*( fabs(x) > typx ? fabs(x) : typx);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
91
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
92 gsl_deriv_central(gfw.get_gsl_function(), x, h, &result, &abserror);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
93 return result;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
94 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
95
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
96 double realfunc::d2(const point& p, size_t k1, size_t k2) const{
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
97 //FIXME
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
98 //Figure this out later.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
99 k1 = k2;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
100 p.size();
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
101 return 0;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
102 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
103
30
d22bce6382d7 Finalise removal of all namespaces, one namespace to rule them all.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 28
diff changeset
104 kwantxi::badArgument
15
5144dd3c5468 Almost completed adding all Doxygen docstrings.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 4
diff changeset
105 realfunc::no_init(int line, string file) const{
30
d22bce6382d7 Finalise removal of all namespaces, one namespace to rule them all.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 28
diff changeset
106 kwantxi::badArgument exc;
0
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
107 exc.line = line;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
108 exc.file = file;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
109 exc.reason = "Did not assign a function pointer to a realfunc object.";
15
5144dd3c5468 Almost completed adding all Doxygen docstrings.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 4
diff changeset
110 return exc;
0
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
111 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
112 }