1 # ifndef _RHEOLEF_DISTSTREAM_H
2 # define _RHEOLEF_DISTSTREAM_H
118 #include "rheolef/communicator.h"
119 #include "rheolef/dis_macros.h"
120 #include "rheolef/catchmark.h"
126 #include "rheolef/iorheo.h"
127 #include "rheolef/point.h"
128 #include "rheolef/tensor.h"
129 #include "rheolef/tensor3.h"
130 #include "rheolef/tensor4.h"
144 odiststream (std::string filename, std::string suffix =
"",
148 odiststream (std::string filename, std::string suffix,
const communicator&
comm);
155 void open (std::string filename, std::string suffix =
"",
157 void open (std::string filename,
159 void open (std::string filename, std::string suffix,
160 const communicator&
comm);
161 void open (std::string filename,
const communicator&
comm);
169 operator bool()
const {
return good(); }
195 : _ptr_os(0), _use_alloc(false), _comm()
200 : _ptr_os(0), _use_alloc(false), _comm()
202 open (filename, suffix, mode,
comm);
206 : _ptr_os(0), _use_alloc(false), _comm()
212 : _ptr_os(0), _use_alloc(false), _comm()
218 : _ptr_os(0), _use_alloc(false), _comm()
224 : _ptr_os(&os), _use_alloc(false), _comm(comm)
231 open (filename, std::string(
""), mode,
comm);
251 #ifndef _RHEOLEF_HAVE_MPI
260 # define _RHEOLEF_define_sequential_odiststream_raw_macro(arg) \
263 operator << (odiststream& s, arg) { \
264 if (s.nop()) return s; \
268 # define _RHEOLEF_define_sequential_odiststream_macro(T) \
269 _RHEOLEF_define_sequential_odiststream_raw_macro(const T& x)
281 #ifdef _RHEOLEF_HAVE_FLOAT128
286 #undef _RHEOLEF_define_sequential_odiststream_macro
295 template<
class T,
class Sfinae =
void>
296 struct is_omanip : std::false_type {};
299 struct is_omanip <
T,typename
std::enable_if<
300 std::is_pointer<decltype(static_cast<std::ostream& (*)(std::ostream&, const T&)>
301 (operator<<))>::value>::type>
307 struct is_omanip <T,typename std::enable_if<
308 std::is_pointer<decltype(static_cast<std::ostream& (*)(std::ostream&, T)>
309 (operator<<))>::value>::type>
315 struct is_omanip <typename std::function<decltype(std::setprecision)>::result_type>
321 typename std::enable_if<
322 details::is_omanip<T>::value
325 operator<< (odiststream& s, const T& x)
327 if (s.nop()) return s;
338 typedef std::size_t size_type;
343 idiststream (std::istream& is, const communicator& comm = communicator());
344 idiststream (std::string filename, std::string suffix = "",
345 const communicator& comm = communicator());
350 void open (std::string filename, std::string suffix = "",
351 const communicator& comm = communicator());
356 const communicator& comm() const { return _comm; }
358 operator bool() const { return good(); }
359 static size_type io_proc();
370 std::istream* _ptr_is;
374 idiststream(const idiststream&);
375 idiststream& operator= (const idiststream&);
383 idiststream::idiststream()
384 : _ptr_is(0), _use_alloc(false), _comm()
388 idiststream::idiststream (std::istream& is, const communicator& comm)
389 : _ptr_is(&is), _use_alloc(false), _comm(comm)
393 idiststream::idiststream (std::string filename, std::string suffix, const communicator& comm)
394 : _ptr_is(0), _use_alloc(false), _comm()
396 open (filename, suffix, comm);
402 check_macro (_ptr_is != 0, "try to use an uninitialized idiststream");
405 #ifndef _RHEOLEF_HAVE_MPI
406 inline bool idiststream::nop() { return false; }
407 inline bool idiststream::do_load() { return true; }
409 inline bool idiststream::nop() { return size_type(_comm.rank()) != io_proc(); }
410 inline bool idiststream::do_load() { return size_type(_comm.rank()) == io_proc(); }
416 #ifdef _RHEOLEF_HAVE_MPI
417 # define _RHEOLEF_define_sequential_idiststream_macro(T) \
420 operator>> (idiststream& s, T& x) \
422 if (s.do_load()) { (s.is()) >> x; } \
423 mpi::broadcast (mpi::communicator(), x, s.io_proc()); \
427 # define _RHEOLEF_define_sequential_idiststream_macro(T) \
430 operator>> (idiststream& s, T& x) \
446 #ifdef _RHEOLEF_HAVE_FLOAT128
450 #undef _RHEOLEF_define_sequential_idiststream_macro
455 operator>> (idiststream& s, std::istream& (*x)(std::istream&))
486 if (ids.
nop())
return ids;
487 ids.
is() >> setmark(
m.mark());
488 std::string label =
"#" +
m.mark();
490 bool verbose = iorheo::getverbose(ids.
is());
499 if (ods.
nop())
return ods;
500 ods.
os() << setmark(
m.mark())
501 <<
"#" <<
m.mark() << std::endl;
field::size_type size_type
see the communicator page for the full documentation
see the catchmark page for the full documentation
idiststream: see the diststream page for the full documentation
const communicator & comm() const
odiststream: see the diststream page for the full documentation
void open(std::string filename, std::string suffix="", io::mode_type mode=io::out, const communicator &comm=communicator())
This routine opens a physical output file.
const communicator & comm() const
static size_type io_proc()
idiststream din(cin)
see the diststream page for the full documentation
odiststream dlog(clog)
see the diststream page for the full documentation
odiststream dout(cout)
see the diststream page for the full documentation
odiststream derr(cerr)
see the diststream page for the full documentation
#define warning_macro(message)
#define _RHEOLEF_define_sequential_odiststream_raw_macro(arg)
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::istream & operator>>(std::istream &is, const catchmark &m)
bool scatch(std::istream &in, const std::string &ch, bool full_match=true)
scatch: see the rheostream page for the full documentation
int dis_system(const std::string &command, const communicator &comm)
bool dis_scatch(idiststream &ips, const communicator &comm, std::string ch)
distributed version of scatch(istream&,string)
bool dis_file_exists(const std::string &filename, const communicator &comm)
std::ostream & operator<<(std::ostream &os, const catchmark &m)
_RHEOLEF_define_sequential_odiststream_macro(char) _RHEOLEF_define_sequential_odiststream_macro(int) _RHEOLEF_define_sequential_odiststream_macro(unsigned int) _RHEOLEF_define_sequential_odiststream_macro(long int) _RHEOLEF_define_sequential_odiststream_macro(long unsigned int) _RHEOLEF_define_sequential_odiststream_macro(float) _RHEOLEF_define_sequential_odiststream_macro(double) _RHEOLEF_define_sequential_odiststream_macro(long double) _RHEOLEF_define_sequential_odiststream_macro(char *const) _RHEOLEF_define_sequential_odiststream_macro(std
_RHEOLEF_define_sequential_idiststream_macro(char) _RHEOLEF_define_sequential_idiststream_macro(int) _RHEOLEF_define_sequential_idiststream_macro(long int) _RHEOLEF_define_sequential_idiststream_macro(unsigned int) _RHEOLEF_define_sequential_idiststream_macro(long unsigned int) _RHEOLEF_define_sequential_idiststream_macro(float) _RHEOLEF_define_sequential_idiststream_macro(double) _RHEOLEF_define_sequential_idiststream_macro(long double) _RHEOLEF_define_sequential_idiststream_macro(std