Rheolef  7.1
an efficient C++ finite element environment
field_concat.h
Go to the documentation of this file.
1 #ifndef _RHEOLEF_FIELD_CONCAT_H
2 #define _RHEOLEF_FIELD_CONCAT_H
3 // build field from initializer lists
24 //
25 #include "rheolef/field.h"
26 
27 // ----------------------------------------------------------------------------
28 // 1) field initializer handler
29 // ----------------------------------------------------------------------------
30 namespace rheolef { namespace details {
31 
32 template <class T, class M>
33 class field_concat_value {
34 public:
35 
36 // typedef:
37 
39 
40 // allocators:
41 
42  template <class U,
43  class Sfinae
44  = typename std::enable_if<
46  ,void
47  >::type
48  >
49  field_concat_value (const U& x) : s(x), vs(), f(), variant(scalar) {}
50  field_concat_value (const std::vector<T>& x) : s(), vs(x), f(), variant(vector_scalar) {}
51  field_concat_value (const field_basic<T,M>& x) : s(), vs(), f(x), variant(field) {}
52 
53 // io/debug:
54  friend std::ostream& operator<< (std::ostream& o, const field_concat_value<T,M>& x) {
55  if (x.variant == scalar) return o << "s";
56  if (x.variant == vector_scalar) return o << "vs";
57  else return o << "f";
58  }
59 // data:
60 public:
61  T s;
62  std::vector<T> vs;
65 };
66 
67 template <class T, class M>
68 class field_concat {
69 public:
70 
71 // typedef:
72 
75  typedef typename std::initializer_list<value_type>::const_iterator const_iterator;
76 
77 // allocators:
78 
79  field_concat () : _l() {}
80 
81  field_concat (const std::initializer_list<value_type>& il) : _l() {
82  for(const_iterator iter = il.begin(); iter != il.end(); ++iter) {
83  _l.push_back(*iter);
84  }
85  }
86  friend std::ostream& operator<< (std::ostream& o, const field_concat<T,M>& x) {
87  std::cout << "{";
88  for(typename std::list<value_type>::const_iterator iter = x._l.begin(); iter != x._l.end(); ++iter) {
89  std::cout << *iter << " ";
90  }
91  return std::cout << "}";
92  }
94 
95 // data:
96 protected:
97  std::list<value_type> _l;
98 };
99 
100 } // namespace details
101 
102 // ----------------------------------------------------------------------------
103 // 2) field member functions
104 // ----------------------------------------------------------------------------
105 template <class T, class M>
106 inline
107 field_basic<T,M>::field_basic (const std::initializer_list<details::field_concat_value<T,M> >& init_list)
108  : _V(), _u(), _b(), _dis_dof_indexes_requires_update(true), _dis_dof_assembly_requires_update(true)
109 {
110  details::field_concat<T,M> vc (init_list);
112 }
113 template <class T, class M>
114 inline
116 field_basic<T,M>::operator= (const std::initializer_list<details::field_concat_value<T,M> >& init_list)
117 {
118  details::field_concat<T,M> vc (init_list);
120  return *this;
121 }
122 
123 } // namespace rheolef
124 #endif // _RHEOLEF_FIELD_CONCAT_H
rheolef::details::field_concat_value::vector_scalar
@ vector_scalar
Definition: field_concat.h:38
rheolef::details::field_concat_value::field_concat_value
field_concat_value(const U &x)
Definition: field_concat.h:49
field
see the field page for the full documentation
rheolef::details::field_concat::build_field
field_basic< T, M > build_field() const
Definition: field_concat.cc:32
rheolef::details::field_concat_value::f
field_basic< T, M > f
Definition: field_concat.h:63
rheolef::field_basic::field_basic
field_basic()
Definition: field.h:608
rheolef::details::field_concat::operator<<
friend std::ostream & operator<<(std::ostream &o, const field_concat< T, M > &x)
Definition: field_concat.h:86
rheolef::details::field_concat_value::field_concat_value
field_concat_value(const std::vector< T > &x)
Definition: field_concat.h:50
rheolef::type
rheolef::std type
rheolef::details::field_concat::field_concat
field_concat()
Definition: field_concat.h:79
rheolef::details::field_concat::field_concat
field_concat(const std::initializer_list< value_type > &il)
Definition: field_concat.h:81
rheolef::details::field_concat_value::variant_type
variant_type
Definition: field_concat.h:38
rheolef::field_basic
Definition: field_expr_utilities.h:38
rheolef::details::field_concat::_l
std::list< value_type > _l
Definition: field_concat.h:97
rheolef
This file is part of Rheolef.
Definition: compiler_eigen.h:37
rheolef::details::field_concat::const_iterator
std::initializer_list< value_type >::const_iterator const_iterator
Definition: field_concat.h:75
rheolef::details::field_concat_value::variant
variant_type variant
Definition: field_concat.h:64
rheolef::details::field_concat
Definition: field_concat.h:68
rheolef::details::field_concat_value::s
T s
Definition: field_concat.h:61
rheolef::details::field_concat_value
Definition: field.h:210
rheolef::details::field_concat_value::operator<<
friend std::ostream & operator<<(std::ostream &o, const field_concat_value< T, M > &x)
Definition: field_concat.h:54
rheolef::details::field_concat_value::field_concat_value
field_concat_value(const field_basic< T, M > &x)
Definition: field_concat.h:51
rheolef::details::is_rheolef_arithmetic
Definition: Float.h:150
rheolef::details::field_concat::size_type
field_basic< T, M >::size_type size_type
Definition: field_concat.h:73
f
Definition: cavity_dg.h:29
rheolef::details::field_concat_value::vs
std::vector< T > vs
Definition: field_concat.h:62
rheolef::field_basic::size_type
std::size_t size_type
Definition: field.h:239
T
Expr1::float_type T
Definition: field_expr.h:218
rheolef::details::field_concat_value::scalar
@ scalar
Definition: field_concat.h:38
rheolef::details::field_concat::value_type
field_concat_value< T, M > value_type
Definition: field_concat.h:74