Greens-code
A modular quantum transport code
math_parser.hpp
1 #ifndef MATHPARSER_HPP
2 #define MATHPARSER_HPP
3 
4 #include <string>
5 #include <list>
6 #include <vector>
7 #include <complex>
8 #include "shared_ptr.hpp"
9 
10 class loadable_Object;
11 typedef STD_TR1::shared_ptr<const loadable_Object> loadable_Object_const_ref;
12 
13 typedef std::complex<double> complex;
14 
15 //Base object, supports multiple parameters and complex numbers
17 public:
18  typedef STD_TR1::shared_ptr<ncexpression> ref;
19  typedef STD_TR1::shared_ptr<const ncexpression> const_ref;
20 
21  typedef STD_TR1::shared_ptr<std::vector<double> > parameters;
22  typedef STD_TR1::shared_ptr<std::vector<std::string> > parameternames;
23 
24  virtual ~ncexpression(){};
25 
26  static ref parse(const std::string&,parameternames);
27  static ref parse(const std::string&,parameternames,loadable_Object_const_ref);
28 
29  static complex evaluate(const std::string&,
30  loadable_Object_const_ref,
31  parameternames,
32  parameters);
33 
34  static void replace_variables(std::string&, loadable_Object_const_ref);
35 
36  static void replace_strings(std::string&, loadable_Object_const_ref);
37 
38  complex value(parameters p) const;
39  void code(std::ostream& ofs) const;
40 
41 
42 protected:
43  ncexpression(){};
44 
45 private:
46  virtual complex value_(parameters p) const = 0;
47  virtual void code_(std::ostream& ofs) const = 0;
48 
49 
50 };
51 
52 //Wrapper object, takes 1 parameter and supports complex numbers
53 class cexpression {
54 public:
55  typedef STD_TR1::shared_ptr<cexpression> ref;
56  typedef STD_TR1::shared_ptr<const cexpression> const_ref;
57 
58 
59 
60  cexpression(ncexpression::ref new_nex) : nex(new_nex){};
61 
62  static cexpression::ref parse(const std::string& s)
63  {
64  ncexpression::parameternames pnames(new std::vector<std::string>(1,"x"));
65 
66  return cexpression::ref(new cexpression(ncexpression::parse(s,pnames)));
67  }
68 
69  static cexpression::ref parse(const std::string& s,
70  loadable_Object_const_ref obj,
71  char var_char = 'x')
72  {
73  std::string vs("");
74  vs += var_char;
75  ncexpression::parameternames pnames(new std::vector<std::string>(1,vs));
76  return cexpression::ref(new cexpression(ncexpression::parse(s,pnames,obj)));
77  }
78 
79  static complex evaluate(const std::string& s,
80  loadable_Object_const_ref obj,
81  double x)
82  {
83  ncexpression::parameters p(new std::vector<double>(1,x));
84  ncexpression::parameternames pnames(new std::vector<std::string>(1,"x"));
85  return real(ncexpression::evaluate(s,obj,pnames,p));
86  }
87 
88 
89  complex value(double x) const
90  {
91  ncexpression::parameters p(new std::vector<double>(1,x));
92  return nex->value(p);
93  }
94 
95 protected:
96  cexpression(){};
97 
98 private:
99  ncexpression::ref nex;
100 
101 };
102 
103 //Wrapper object, takes one parameter and gives back a double number. Identical to cexpression, exists
104 //for backward compatibility
105 class expression {
106 public:
107  typedef STD_TR1::shared_ptr<expression> ref;
108  typedef STD_TR1::shared_ptr<const expression> const_ref;
109 
110 
111 
112  expression(ncexpression::ref new_nex) : nex(new_nex) {};
113 
114  static expression::ref parse(const std::string& s)
115  {
116  ncexpression::parameternames pnames(new std::vector<std::string>(1,"x"));
117 
118  return expression::ref(new expression(ncexpression::parse(s,pnames)));
119  }
120 
121  static expression::ref parse(const std::string& s,
122  loadable_Object_const_ref obj,
123  char var_char = 'x')
124  {
125  std::string vs("");
126  vs += var_char;
127  ncexpression::parameternames pnames(new std::vector<std::string>(1,vs));
128  return expression::ref(new expression(ncexpression::parse(s,pnames,obj)));
129  }
130 
131  static double evaluate(const std::string& s,
132  loadable_Object_const_ref obj,
133  double x)
134  {
135  ncexpression::parameters p(new std::vector<double>(1,x));
136  ncexpression::parameternames pnames(new std::vector<std::string>(1,"x"));
137  return real(ncexpression::evaluate(s,obj,pnames,p));
138  }
139 
140 
141  double value(double x) const ;
142 
143 private:
144  expression(){};
145  expression(const expression&){};
146 
147 private:
148  ncexpression::ref nex;
149 
150 };
151 
152 #endif
Definition: math_parser.hpp:16
Definition: math_parser.hpp:105
An abstract base class supporting xml_file_reading of input parameters.
Definition: input_file.hpp:79
Definition: math_parser.hpp:53