67#include "rheolef/field.h"
71template <
class T,
class M>
class __obranch;
72template <
class T,
class M>
class __iobranch;
73template <
class T,
class M>
class __branch_header;
74template <
class T,
class M>
class __const_branch_header;
75template <
class T,
class M>
class __const_branch_finalize;
82template <
class T,
class M = rheo_default_memory_model>
83class branch_basic :
public std::vector<std::pair<std::string,field_basic<T,M> > > {
87 typedef std::vector<std::pair<std::string,field_basic<T,M> > >
base;
97 template <
typename... Args>
117 template <
typename... Args>
119 template <
typename... Args>
137#ifdef _RHEOLEF_HAVE_MPI
158#ifdef _RHEOLEF_HAVE_MPI
176#ifdef _RHEOLEF_HAVE_MPI
196 template <
typename... Args>
197 void fill_field_names (
const std::string &field_name, Args... others);
198 void fill_field_names () {}
199 template <
typename... Args>
200 void fill_field_values (std::size_t i,
const field_basic<T,M>& ui, Args... uk);
201 void fill_field_values (std::size_t i) {}
222template <
class T,
class M>
225template <
class T,
class M>
235template <
class T,
class M>
239 _parameter_name (
"*unnamed*"),
240 _parameter_value(
std::numeric_limits<
T>::max()),
245 _header_in_done (false),
246 _header_out_done (false),
247 _finalize_out_done (false),
249 _u_range(
std::pair<
T,
T>(
std::numeric_limits<
T>::max(),
250 -
std::numeric_limits<
T>::max())),
251 _have_u_range(
std::pair<bool,bool>(false,false))
254template <
class T,
class M>
258 _parameter_name (x._parameter_name),
259 _parameter_value(x._parameter_value),
260 _n_value (x._n_value),
261 _count_value (x._count_value),
262 _p_data_out (x._p_data_out),
263 _p_ctrl_out (x._p_ctrl_out),
264 _header_in_done (x._header_in_done),
265 _header_out_done (x._header_out_done),
266 _finalize_out_done (x._finalize_out_done),
267 _to_clean (x._to_clean),
268 _u_range (x._u_range),
269 _have_u_range (x._have_u_range)
272template <
class T,
class M>
277 std::vector<std::pair<std::string,field_basic<T,M> > >::operator= (x);
292template <
class T,
class M>
293 template <
typename... Args>
296 _parameter_name (parameter_name),
297 _parameter_value(
std::numeric_limits<
Float>::max()),
302 _header_in_done (false),
303 _header_out_done (false),
304 _finalize_out_done (false),
306 _u_range(
std::pair<
T,
T>(
std::numeric_limits<
T>::max(),
307 -
std::numeric_limits<
T>::max())),
308 _have_u_range(
std::pair<bool,bool>(false,false))
311 fill_field_names (field_names...);
313template <
class T,
class M>
314template <
typename... Args>
316 check_macro (field_name.length() != 0,
"empty field name not allowed");
318 fill_field_names (others...);
323template <
class T,
class M>
328 return _parameter_value;
330template <
class T,
class M>
335 return _parameter_name;
337template <
class T,
class M>
344template <
class T,
class M>
354template <
class T,
class M>
359 _parameter_name = name;
361template <
class T,
class M>
366 _parameter_value = x;
368template <
class T,
class M>
374 _have_u_range = std::pair<bool,bool>(
false,
false);
379template <
class T,
class M>
386 h._b.put_header(out);
return out; }
391template <
class T,
class M>
397 h._b.put_header(out);
return out; }
401template <
class T,
class M>
408template <
class T,
class M>
418template <
class T,
class M>
423 h._b.put_finalize(out);
return out; }
427template <
class T,
class M>
437template <
class T,
class M>
441 : _put(
put), _x(x) {}
443 { m._put (os, m._x);
return os; }
448template <
class T,
class M>
451 template <
typename... Args>
458 : _put(
put), _get(get), _px(&x), _pt(&t), _pu()
460 std::size_t n =
sizeof...(Args)+1;
466 : _put(x._put), _get(x._get), _px(x._px), _pt(x._pt), _pu(x._pu) {}
467 template <
typename... Args>
474 template <
class T1,
class M1>
476 template <
class T1,
class M1>
484 std::vector<field_basic<T,M>*> _pu;
489template <
class T,
class M>
495template <
class T,
class M>
499 if (m._pt) { *m._pt = (*m._px).parameter(); }
500 for (std::size_t i = 0, n = (*m._px).size(); i < n; ++i) {
501 *(m._pu[i]) = (*m._px)[i].second;
505template <
class T,
class M>
506template <
typename... Args>
510 check_macro (base::size() >=
sizeof...(Args)+1,
"attempt to output a " << (
sizeof...(Args)+1) <<
"-field branch when a "
511 << base::size() <<
"-field one was supplied");
512 _parameter_value = t;
513 base::operator[](0).second = u0;
514 fill_field_values (1, uk...);
517template <
class T,
class M>
518template <
typename... Args>
522 check_macro (base::size() >=
sizeof...(Args)+1,
"attempt to output a " << (
sizeof...(Args)+1) <<
"-field branch when a "
523 << base::size() <<
"-field one was supplied");
524 _parameter_value = t;
525 base::operator[](0).second = u0;
526 fill_field_values (1, uk...);
529template <
class T,
class M>
530template <
typename... Args>
533 base::operator[](
id++).second = u_id;
534 fill_field_values(
id, uk...);
see the Float page for the full documentation
const branch_basic< T, M > & _b
__const_branch_finalize(const branch_basic< T, M > &b)
friend odiststream & operator<<(odiststream &out, __const_branch_finalize< T, M > h)
__iobranch(const __iobranch< T, M > &x)
friend odiststream & operator<<(odiststream &os, __iobranch< T1, M1 > m)
void fill_field_references(std::size_t i)
void fill_field_references(std::size_t i, field_basic< T, M > &ui, Args &... uk)
__iobranch(odiststream &(*put)(odiststream &, const branch_basic< T, M > &), idiststream &(*get)(idiststream &, branch_basic< T, M > &), branch_basic< T, M > &x, T &t, field_basic< T, M > &u0, Args &... uk)
friend idiststream & operator>>(idiststream &is, __iobranch< T1, M1 > m)
__obranch(odiststream &(*put)(odiststream &, const branch_basic< T, M > &), const branch_basic< T, M > &x)
friend odiststream & operator<<(odiststream &os, __obranch< T, M > m)
friend void put_finalize(odiststream &, const branch_basic< T1, distributed > &)
std::ostream * _p_ctrl_out
branch_basic(const branch_basic< T, M > &)
void set_range(const std::pair< T, T > &u_range)
friend void put_event(odiststream &, const branch_basic< T1, sequential > &)
void put_header_rheolef(odiststream &) const
friend void put_event_paraview(odiststream &, const branch_basic< T1, sequential > &)
friend void put_finalize_gnuplot(odiststream &, const branch_basic< T1, sequential > &)
friend void get_header(idiststream &, branch_basic< T1, sequential > &)
std::string _parameter_name
friend void put_event(odiststream &, const branch_basic< T1, distributed > &)
friend void put_finalize_vtk(odiststream &, const branch_basic< T1, sequential > &)
void put_finalize_rheolef(odiststream &) const
friend void get_event(idiststream &, branch_basic< T1, sequential > &)
friend void get_event_vtk(idiststream &, branch_basic< T1, sequential > &)
friend void put_header_gnuplot(odiststream &, const branch_basic< T1, sequential > &)
const T & parameter() const
__const_branch_header< T, M > header() const
void get_header_rheolef(idiststream &)
base::size_type size_type
friend void put_header_vtk(odiststream &, const branch_basic< T1, sequential > &)
std::ostream * _p_data_out
friend void put_finalize(odiststream &, const branch_basic< T1, sequential > &)
friend void put_finalize_paraview(odiststream &, const branch_basic< T1, sequential > &)
friend void get_header_vtk(idiststream &, branch_basic< T1, sequential > &)
friend void get_header(idiststream &, branch_basic< T1, distributed > &)
void get_event_rheolef(idiststream &)
__obranch< T, M > operator()(const T &t, const field_basic< T, M > &u0, Args... uk)
const std::string & parameter_name() const
std::vector< std::pair< std::string, field_basic< T, M > > > base
size_type n_value() const
friend void put_header(odiststream &, const branch_basic< T1, sequential > &)
friend void put_event_gnuplot(odiststream &, const branch_basic< T1, sequential > &)
std::pair< T, T > _u_range
friend void put_event_vtk_stream(odiststream &, const branch_basic< T1, sequential > &)
std::pair< bool, bool > _have_u_range
__const_branch_finalize< T, M > finalize() const
friend void put_header_paraview(odiststream &, const branch_basic< T1, sequential > &)
friend void put_header(odiststream &, const branch_basic< T1, distributed > &)
__branch_header< T, M > header()
friend void get_event(idiststream &, branch_basic< T1, distributed > &)
void put_event_rheolef(odiststream &) const
void set_parameter_name(const std::string &name)
branch_basic(const std::string ¶meter, Args... names)
void set_parameter(const T &value)
size_type n_field() const
branch_basic< T, M > & operator=(const branch_basic< T, M > &)
friend void put_event_vtk(odiststream &, const branch_basic< T1, sequential > &)
idiststream: see the diststream page for the full documentation
odiststream: see the diststream page for the full documentation
branch_basic< Float > branch
check_macro(expr1.have_homogeneous_space(Xh1), "dual(expr1,expr2); expr1 should have homogeneous space. HINT: use dual(interpolate(Xh, expr1),expr2)")
This file is part of Rheolef.
std::ostream & operator<<(std::ostream &os, const catchmark &m)
void get_header(idiststream &in, branch_basic< T, sequential > &b)
void put(std::ostream &out, std::string name, const tiny_matrix< T > &a)
std::istream & operator>>(std::istream &is, const catchmark &m)