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
23 // 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>
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
see the field page for the full documentation
field_concat_value(const std::vector< T > &x)
Definition: field_concat.h:50
field_concat_value(const field_basic< T, M > &x)
Definition: field_concat.h:51
friend std::ostream & operator<<(std::ostream &o, const field_concat_value< T, M > &x)
Definition: field_concat.h:54
field_basic< T, M > build_field() const
Definition: field_concat.cc:32
field_concat(const std::initializer_list< value_type > &il)
Definition: field_concat.h:81
std::list< value_type > _l
Definition: field_concat.h:97
field_concat_value< T, M > value_type
Definition: field_concat.h:74
std::initializer_list< value_type >::const_iterator const_iterator
Definition: field_concat.h:75
field_basic< T, M >::size_type size_type
Definition: field_concat.h:73
friend std::ostream & operator<<(std::ostream &o, const field_concat< T, M > &x)
Definition: field_concat.h:86
field_basic< T, M > & operator=(const field_basic< T, M > &)
Definition: field.h:619
rheolef::std type
Expr1::float_type T
Definition: field_expr.h:261
This file is part of Rheolef.
Definition: cavity_dg.h:29