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
38
typedef
enum
{
scalar
,
vector_scalar
,
field
}
variant_type
;
39
40
// allocators:
41
42
template
<
class
U,
43
class
Sfinae
44
=
typename
std::enable_if<
45
is_rheolef_arithmetic<U>::value
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
;
63
field_basic<T,M>
f
;
64
variant_type
variant
;
65
};
66
67
template
<
class
T,
class
M>
68
class
field_concat
{
69
public
:
70
71
// typedef:
72
73
typedef
typename
field_basic<T,M>::size_type
size_type
;
74
typedef
field_concat_value<T,M>
value_type
;
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
}
93
field_basic<T,M>
build_field
()
const
;
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);
111
field_basic<T,M>::operator=
(vc.
build_field
());
112
}
113
template
<
class
T,
class
M>
114
inline
115
field_basic<T,M>
&
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);
119
field_basic<T,M>::operator=
(vc.
build_field
());
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