Rheolef  7.1
an efficient C++ finite element environment
field_concat.cc
Go to the documentation of this file.
1 // build field from initializer lists
22 //
23 #include "rheolef/field_concat.h"
24 #include "rheolef/field_component.h"
25 #include "rheolef/field_expr.h"
26 #include "rheolef/space_mult.h"
27 
28 namespace rheolef { namespace details {
29 
30 template <class T, class M>
31 field_basic<T,M>
33 {
34  // ------------------------------------
35  // first pass: compute the field size
36  // ------------------------------------
39  for (typename std::list<value_type>::const_iterator iter = _l.begin(); iter != _l.end(); ++iter) {
40  const field_concat_value<T,M>& x = *iter;
41  switch (x.variant) {
42  case value_type::scalar: {
43  sml *= IR;
44  break;
45  }
46  case value_type::vector_scalar: {
47  size_t n = x.vs.size();
48  space_basic<T,M> IRn = pow(IR,n);
49  sml *= IRn;
50  break;
51  }
52  case value_type::field: {
53  sml *= x.f.get_space();
54  break;
55  }
56  default: error_macro("field initializer list: unexpected element");
57  }
58  }
59  space_basic<T,M> Yh (sml);
60  // ------------------------
61  // second pass: copy values
62  // ------------------------
63  field_basic<T,M> yh (Yh);
64  size_type i_comp = 0;
65  for(typename std::list<value_type>::const_iterator iter = _l.begin(); iter != _l.end(); ++iter, i_comp++) {
66  const field_concat_value<T,M>& x = *iter;
67  switch (x.variant) {
68  case value_type::scalar: {
69  field_basic<T,M> zh (IR, 0); // TODO: accept/check non-zero values ?
70  yh [i_comp] = zh;
71  break;
72  }
73  case value_type::vector_scalar: {
74  size_t n = x.vs.size();
75  space_basic<T,M> IRn = pow(IR,n);
76  field_basic<T,M> zh (IRn, 0); // TODO: accept/check non-zero values ?
77  yh [i_comp] = zh;
78  break;
79  }
80  case value_type::field: {
81  yh [i_comp] = x.f;
82  break;
83  }
84  default: error_macro("field initializer list: unexpected element");
85  }
86  }
87  return yh;
88 }
89 // ----------------------------------------------------------------------------
90 // instanciation in library
91 // ----------------------------------------------------------------------------
92 #define _RHEOLEF_instanciation(T,M) \
93 template class field_concat<T,M>;
94 
95 _RHEOLEF_instanciation(Float,sequential)
96 #ifdef _RHEOLEF_HAVE_MPI
97 _RHEOLEF_instanciation(Float,distributed)
98 #endif // _RHEOLEF_HAVE_MPI
99 
100 }} // namespace rheolef::details
see the Float page for the full documentation
field_basic< T, M > build_field() const
Definition: field_concat.cc:32
field_basic< T, M >::size_type size_type
Definition: field_concat.h:73
const space_type & get_space() const
Definition: field.h:300
This file is part of Rheolef.
_RHEOLEF_instanciation(Float) _RHEOLEF_instanciation_evaluate(Float
space_mult_list< T, M > pow(const space_basic< T, M > &X, size_t n)
Definition: space_mult.h:120