Rheolef  7.2
an efficient C++ finite element environment
 
Loading...
Searching...
No Matches
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// ----------------------------------------------------------------------------
30namespace rheolef { namespace details {
31
32template <class T, class M>
34public:
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) {}
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:
60public:
62 std::vector<T> vs;
65};
66
67template <class T, class M>
69public:
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:
96protected:
97 std::list<value_type> _l;
98};
99
100} // namespace details
101
102// ----------------------------------------------------------------------------
103// 2) field member functions
104// ----------------------------------------------------------------------------
105template <class T, class M>
106inline
107field_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}
113template <class T, class M>
114inline
116field_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)
friend std::ostream & operator<<(std::ostream &o, const field_concat_value< T, M > &x)
field_concat_value(const field_basic< T, M > &x)
field_basic< T, M > build_field() const
field_concat(const std::initializer_list< value_type > &il)
std::list< value_type > _l
field_concat_value< T, M > value_type
std::initializer_list< value_type >::const_iterator const_iterator
field_basic< T, M >::size_type size_type
friend std::ostream & operator<<(std::ostream &o, const field_concat< T, M > &x)
field_basic< T, M > & operator=(const field_basic< T, M > &)
Definition field.h:894
std::size_t size_type
Definition field.h:225
Expr1::float_type T
Definition field_expr.h:230
This file is part of Rheolef.
Definition cavity_dg.h:29