Rheolef  7.1
an efficient C++ finite element environment
basis_symbolic.h
Go to the documentation of this file.
1 #ifndef _RHEO_BASIS_SYMBOLIC_H
2 #define _RHEO_BASIS_SYMBOLIC_H
3 
24 #include <ginac/ginac.h>
25 #include "rheolef/point.h"
26 #include "rheolef/reference_element.h"
27 namespace rheolef {
28 
30 public:
31 
32 // allocator:
33 
34  basis_symbols() : x("x"), y("y"), z("z") {}
35 
36 // data:
37  GiNaC::symbol x, y, z;
38 };
40 public:
41 
42 // typedefs:
43 
45  typedef GiNaC::ex polynom_type;
46  typedef GiNaC::ex value_type;
47  struct end_type {};
48 
49 // allocators:
50 
52  : basis_symbols(), _name("unnamed"),
53  _hat_K(), _node(0), _poly(0),
54  _basis(), _grad_basis() {}
55 
56 // accessors:
57 
58  size_type size() const { return _node.size(); }
59  size_type dimension() const { return _hat_K.dimension(); }
60  const reference_element& hat_K() const { return _hat_K; }
61  std::string name() const { return _name; }
62  const point_basic<GiNaC::ex>& node (size_type i) const { return _node[i]; }
63  const polynom_type& polynom (size_type i) const { return _poly[i]; }
64 
65 // modifiers:
66 
67  void set_name(std::string str) { _name = str; }
69  _hat_K.set_variant(t); }
71  polynom_type& polynom (size_type i) { return _poly[i]; }
72 
73  void resize(size_type n) {
74  _node.resize(n); _poly.resize(n);
75  _basis.resize(n); _grad_basis.resize(n); }
76 
77  void add_polynom (const polynom_type& p) { _poly.push_back(p); }
79  add_polynom (p); return *this; }
80 
81  void add_node (const point_basic<GiNaC::ex>& x) { _node.push_back(x); }
82  void add_node (const Float& x0, const Float& x1=0, const Float& x2=0) {
83  add_node(point_basic<GiNaC::ex>(x0,x1,x2)); }
85  add_node (x); return *this; }
86 
87  void make_node_basis ();
89  make_node_basis(); return *this; }
90 
91 // method:
92 
93  value_type eval (const polynom_type& p,
94  const point_basic<polynom_type>& x, size_type d = 3) const;
95  GiNaC::matrix vandermonde_matrix (
96  const std::vector<polynom_type>& p, size_type d = 3) const;
97 
98 // outputs:
99 
100  void put_cxx_header (std::ostream& out) const;
101  void put_cxx_body (std::ostream& out) const;
102 
103 // utility:
104 
105  polynom_type indexed_symbol (const polynom_type& expr0) const;
106 
107 // data:
108 
109 protected:
110  std::string _name;
112  std::vector<point_basic<GiNaC::ex> > _node;
113  std::vector<polynom_type> _poly;
114  std::vector<polynom_type> _basis;
115  std::vector<point_basic<polynom_type> > _grad_basis;
116 };
118  : public basis_symbols, public std::vector<basis_symbolic_nodal_on_geo> {
119 public:
120 
121 // typedefs:
122 
126 
127 // allocators:
128 
129  basis_symbolic_nodal(std::string nam, size_type deg)
130  : basis_symbols(),
132  _name(nam),
133  _family_name(),
134  _degree(deg),
135  _have_index_parameter(false),
137  {
138  GiNaC::Digits = 2*std::numeric_limits<Float>::digits10;
139  for (size_type i = 0; i < reference_element::max_variant; i++) {
140  operator[](i).x = x;
141  operator[](i).y = y;
142  operator[](i).z = z;
143  operator[](i).set_hat_K(reference_element::variant_type(i));
144  operator[](i).set_name(nam);
145  }
146  }
147 
148 // accessors:
149 
150  size_type degree() const { return _degree; }
153 
156  return operator[] (t);
157  }
160  return operator[] (t);
161  }
163  reference_element hat_K;
164  hat_K.set_name(t);
165  return operator[] (hat_K.variant()); }
166 
167  std::string name() const { return _name; }
168  std::string family_name() const { return _family_name; }
169 
170 // modifiers:
171 
172  void set_name(std::string str) { _name = str; }
173  void set_degree_parameter (bool dp = true) { _have_index_parameter = dp; }
174  void set_continuous_feature (bool cf = true) { _have_continuous_feature = cf; }
175 
176 // syntax helpers:
177 
178  static polynom_type poly (const polynom_type& p) { return p; }
180  return x; }
182  const GiNaC::ex& x0, const GiNaC::ex& x1=0, const GiNaC::ex& x2=0) {
183  return point_basic<GiNaC::ex>(x0,x1,x2); }
184  static end_type end () { return end_type(); }
185 
186 // outputs:
187 
188  void put_cxx_header(std::ostream& out) const;
189  void put_cxx_body (std::ostream& out) const;
190  void put_cxx_main (int argc, char **argv) const;
191 
192 // data:
193 protected:
194  std::string _name;
195  std::string _family_name;
199 };
200 }// namespace rheolef
201 #endif // _RHEO_BASIS_SYMBOLIC_H
rheolef::basis_symbolic_nodal_on_geo::_poly
std::vector< polynom_type > _poly
Definition: basis_symbolic.h:113
rheolef::basis_symbolic_nodal_on_geo::name
std::string name() const
Definition: basis_symbolic.h:61
rheolef::io::out
Definition: rheostream.h:167
rheolef::basis_symbolic_nodal_on_geo::add_node
void add_node(const point_basic< GiNaC::ex > &x)
Definition: basis_symbolic.h:81
rheolef::basis_symbolic_nodal_on_geo::make_node_basis
void make_node_basis()
Definition: basis_symbolic.cc:80
rheolef::point_basic
Definition: point.h:87
rheolef::basis_symbolic_nodal_on_geo::_hat_K
reference_element _hat_K
Definition: basis_symbolic.h:111
rheolef::basis_symbolic_nodal::_have_index_parameter
bool _have_index_parameter
Definition: basis_symbolic.h:197
rheolef::basis_symbolic_nodal_on_geo::eval
value_type eval(const polynom_type &p, const point_basic< polynom_type > &x, size_type d=3) const
Definition: basis_symbolic.cc:28
rheolef::basis_symbolic_nodal::on
basis_symbolic_nodal_on_geo & on(reference_element::variant_type t)
Definition: basis_symbolic.h:158
rheolef::basis_symbolic_nodal::have_index_parameter
bool have_index_parameter() const
Definition: basis_symbolic.h:151
rheolef::basis_symbolic_nodal_on_geo::set_hat_K
void set_hat_K(reference_element::variant_type t)
Definition: basis_symbolic.h:68
rheolef::basis_symbolic_nodal_on_geo::polynom_type
GiNaC::ex polynom_type
Definition: basis_symbolic.h:45
rheolef::basis_symbolic_nodal::end
static end_type end()
Definition: basis_symbolic.h:184
rheolef::basis_symbolic_nodal_on_geo::vandermonde_matrix
GiNaC::matrix vandermonde_matrix(const std::vector< polynom_type > &p, size_type d=3) const
Definition: basis_symbolic.cc:40
rheolef::basis_symbolic_nodal_on_geo::set_name
void set_name(std::string str)
Definition: basis_symbolic.h:67
rheolef::basis_symbolic_nodal_on_geo::add_node
void add_node(const Float &x0, const Float &x1=0, const Float &x2=0)
Definition: basis_symbolic.h:82
rheolef::basis_symbolic_nodal::polynom_type
basis_symbolic_nodal_on_geo::polynom_type polynom_type
Definition: basis_symbolic.h:124
rheolef::basis_symbolic_nodal_on_geo::polynom
polynom_type & polynom(size_type i)
Definition: basis_symbolic.h:71
rheolef::basis_symbolic_nodal::name
std::string name() const
Definition: basis_symbolic.h:167
rheolef::basis_symbolic_nodal::size_type
basis_symbolic_nodal_on_geo::size_type size_type
Definition: basis_symbolic.h:123
p
Definition: sphere.icc:25
rheolef::reference_element
see the reference_element page for the full documentation
Definition: reference_element.h:66
rheolef::basis_symbolic_nodal::poly
static polynom_type poly(const polynom_type &p)
Definition: basis_symbolic.h:178
rheolef::basis_symbolic_nodal_on_geo::_basis
std::vector< polynom_type > _basis
Definition: basis_symbolic.h:114
rheolef::basis_symbolic_nodal_on_geo::_grad_basis
std::vector< point_basic< polynom_type > > _grad_basis
Definition: basis_symbolic.h:115
rheolef::basis_symbolic_nodal::on
const basis_symbolic_nodal_on_geo & on(reference_element::variant_type t) const
Definition: basis_symbolic.h:154
rheolef::reference_element::variant_type
size_type variant_type
Definition: reference_element.h:72
rheolef::basis_symbolic_nodal_on_geo::operator<<
basis_symbolic_nodal_on_geo & operator<<(const polynom_type &p)
Definition: basis_symbolic.h:78
rheolef::basis_symbols::z
GiNaC::symbol z
Definition: basis_symbolic.h:37
rheolef::basis_symbolic_nodal_on_geo
Definition: basis_symbolic.h:39
rheolef::basis_symbolic_nodal::put_cxx_body
void put_cxx_body(std::ostream &out) const
Definition: basis_symbolic_cxx.cc:225
rheolef::basis_symbolic_nodal_on_geo::_name
std::string _name
Definition: basis_symbolic.h:110
rheolef::reference_element::variant
variant_type variant() const
Definition: reference_element.h:99
rheolef::basis_symbolic_nodal_on_geo::resize
void resize(size_type n)
Definition: basis_symbolic.h:73
rheolef::basis_symbolic_nodal_on_geo::put_cxx_header
void put_cxx_header(std::ostream &out) const
Definition: basis_symbolic_cxx.cc:69
rheolef::basis_symbolic_nodal::have_continuous_feature
bool have_continuous_feature() const
Definition: basis_symbolic.h:152
rheolef::basis_symbolic_nodal_on_geo::dimension
size_type dimension() const
Definition: basis_symbolic.h:59
rheolef::basis_symbols::x
GiNaC::symbol x
Definition: basis_symbolic.h:37
rheolef::basis_symbolic_nodal::node
static point_basic< GiNaC::ex > node(const GiNaC::ex &x0, const GiNaC::ex &x1=0, const GiNaC::ex &x2=0)
Definition: basis_symbolic.h:181
rheolef
This file is part of Rheolef.
Definition: compiler_eigen.h:37
rheolef::basis_symbolic_nodal_on_geo::polynom
const polynom_type & polynom(size_type i) const
Definition: basis_symbolic.h:63
rheolef::basis_symbolic_nodal_on_geo::hat_K
const reference_element & hat_K() const
Definition: basis_symbolic.h:60
rheolef::basis_symbols::y
GiNaC::symbol y
Definition: basis_symbolic.h:37
rheolef::basis_symbolic_nodal::end_type
basis_symbolic_nodal_on_geo::end_type end_type
Definition: basis_symbolic.h:125
rheolef::basis_symbolic_nodal::basis_symbolic_nodal
basis_symbolic_nodal(std::string nam, size_type deg)
Definition: basis_symbolic.h:129
Float
see the Float page for the full documentation
rheolef::basis_symbolic_nodal::on
basis_symbolic_nodal_on_geo & on(char t)
Definition: basis_symbolic.h:162
rheolef::reference_element::max_variant
static const variant_type max_variant
Definition: reference_element.h:82
rheolef::basis_symbolic_nodal::set_name
void set_name(std::string str)
Definition: basis_symbolic.h:172
rheolef::basis_symbolic_nodal_on_geo::indexed_symbol
polynom_type indexed_symbol(const polynom_type &expr0) const
Definition: basis_symbolic_cxx.cc:54
mkgeo_ball.d
d
Definition: mkgeo_ball.sh:154
rheolef::reference_element::dimension
size_type dimension() const
Definition: reference_element.h:101
rheolef::reference_element::set_name
void set_name(char name)
Definition: reference_element.cc:59
rheolef::basis_symbolic_nodal_on_geo::add_polynom
void add_polynom(const polynom_type &p)
Definition: basis_symbolic.h:77
rheolef::basis_symbolic_nodal::_degree
size_type _degree
Definition: basis_symbolic.h:196
rheolef::basis_symbolic_nodal::family_name
std::string family_name() const
Definition: basis_symbolic.h:168
rheolef::basis_symbolic_nodal::node
static point_basic< GiNaC::ex > node(const point_basic< GiNaC::ex > &x)
Definition: basis_symbolic.h:179
rheolef::basis_symbolic_nodal::set_continuous_feature
void set_continuous_feature(bool cf=true)
Definition: basis_symbolic.h:174
rheolef::basis_symbols
Definition: basis_symbolic.h:29
rheolef::space_constant::vector
Definition: space_constant.h:137
mkgeo_ball.n
n
Definition: mkgeo_ball.sh:150
rheolef::basis_symbolic_nodal::set_degree_parameter
void set_degree_parameter(bool dp=true)
Definition: basis_symbolic.h:173
rheolef::reference_element::set_variant
void set_variant(variant_type x)
Definition: reference_element.h:93
size_type
field::size_type size_type
Definition: branch.cc:425
rheolef::basis_symbolic_nodal::_name
std::string _name
Definition: basis_symbolic.h:194
rheolef::basis_symbolic_nodal::_have_continuous_feature
bool _have_continuous_feature
Definition: basis_symbolic.h:198
rheolef::basis_symbolic_nodal::put_cxx_main
void put_cxx_main(int argc, char **argv) const
Definition: basis_symbolic_cxx.cc:421
rheolef::basis_symbolic_nodal_on_geo::put_cxx_body
void put_cxx_body(std::ostream &out) const
Definition: basis_symbolic_cxx.cc:85
rheolef::basis_symbolic_nodal_on_geo::node
point_basic< GiNaC::ex > & node(size_type i)
Definition: basis_symbolic.h:70
rheolef::basis_symbolic_nodal::put_cxx_header
void put_cxx_header(std::ostream &out) const
Definition: basis_symbolic_cxx.cc:148
rheolef::basis_symbolic_nodal_on_geo::node
const point_basic< GiNaC::ex > & node(size_type i) const
Definition: basis_symbolic.h:62
rheolef::basis_symbolic_nodal::_family_name
std::string _family_name
Definition: basis_symbolic.h:195
rheolef::basis_symbolic_nodal_on_geo::size_type
std::vector< int >::size_type size_type
Definition: basis_symbolic.h:44
rheolef::basis_symbolic_nodal
Definition: basis_symbolic.h:117
rheolef::std
Definition: vec_expr_v2.h:391
rheolef::basis_symbolic_nodal_on_geo::basis_symbolic_nodal_on_geo
basis_symbolic_nodal_on_geo()
Definition: basis_symbolic.h:51
rheolef::basis_symbolic_nodal::degree
size_type degree() const
Definition: basis_symbolic.h:150
rheolef::basis_symbols::basis_symbols
basis_symbols()
Definition: basis_symbolic.h:34
rheolef::basis_symbolic_nodal_on_geo::value_type
GiNaC::ex value_type
Definition: basis_symbolic.h:46
rheolef::basis_symbolic_nodal_on_geo::end_type
Definition: basis_symbolic.h:47
rheolef::basis_symbolic_nodal_on_geo::_node
std::vector< point_basic< GiNaC::ex > > _node
Definition: basis_symbolic.h:112
rheolef::basis_symbolic_nodal_on_geo::size
size_type size() const
Definition: basis_symbolic.h:58