Rheolef  7.1
an efficient C++ finite element environment
geo_mpi_put.cc
Go to the documentation of this file.
1 #include "rheolef/config.h"
22 #ifdef _RHEOLEF_HAVE_MPI
23 #include "rheolef/geo.h"
24 #include "rheolef/geo_domain.h"
25 #include "rheolef/dis_macros.h"
26 #include "rheolef/rheostream.h"
27 #include "rheolef/iorheo.h"
28 #include "rheolef/index_set.h"
29 
30 namespace rheolef {
31 
32 // ----------------------------------------------------------------------------
33 // output
34 // ----------------------------------------------------------------------------
36 struct permutation_proxy {
38  permutation_proxy (const hack_array<geo_element_hack>& elts, size_type first_dis_v = 0)
39  : _elts(elts), _first_dis_v(first_dis_v) {}
40  size_type size() const { return _elts.size(); }
41  size_type operator[] (size_type ie) const {
42  const geo_element& K = _elts [ie];
43  return K.ios_dis_ie() - _first_dis_v;
44  }
45  const permutation_proxy& data() const { return *this; }
46 // data:
47  const hack_array<geo_element_hack>& _elts;
48  size_type _first_dis_v;
49 };
50 template <class T>
51 odiststream&
53 {
54  using namespace std;
55  iorheo::flag_type format = iorheo::flags(ops.os()) & iorheo::format_field;
56  check_macro (format[iorheo::rheo], "geo distributed: unsupported geo output file format=" << format);
57 
58  communicator comm = base::_geo_element[reference_element::p].ownership().comm();
59  size_type io_proc = odiststream::io_proc();
60  size_type my_proc = comm.rank();
61  size_type nproc = comm.size();
62  size_type dis_nnod = base::_node.dis_size ();
63  size_type dis_nv = base::_geo_element[reference_element::p].dis_size ();
64  //
65  // 1) put header
66  //
67  ops << setprecision(numeric_limits<Float>::digits10)
68  << "#!geo" << endl
69  << endl
70  << "mesh" << endl
71  << base::_version;
72 
73  geo_header h;
74  h.dimension = base::_dimension;
75  h.sys_coord = base::_sys_coord;
76  h.order = base::order();
77  h.dis_size_by_variant [0] = base::_node.dis_size();
79  h.dis_size_by_variant [variant] = base::_geo_element [variant].dis_size();
80  }
81  ops << endl << h << endl;
82  //
83  // 2) put nodes
84  //
85  if (base::_dimension > 0) {
86  T rounding_prec = iorheo::getrounding_precision(ops.os());
87  if (rounding_prec == 0) {
88  base::_node.permuted_put_values (ops,
89  _inod2ios_dis_inod,
90  _point_put<T>(base::_dimension));
91  } else {
92  base::_node.permuted_put_values (ops,
93  _inod2ios_dis_inod,
94  _round_point_put<T>(base::_dimension, rounding_prec));
95  }
96  ops << endl;
97  }
98  //
99  // 3) build a node permutation disarray on io_proc
100  //
101  // elements are permuted back to original order and may
102  // refer to original node numbering
103  // TODO: disarray node_perm = merge_array_on_proc (_inod2ios_dis_inod , io_proc);
104  std::vector<size_type> node_perm ((my_proc == io_proc) ? dis_nnod : 0);
105  size_type tag_gather = distributor::get_new_tag();
106  if (my_proc == io_proc) {
107  size_type i_start = _inod2ios_dis_inod.ownership().first_index(my_proc);
108  size_type i_size = _inod2ios_dis_inod.ownership().size (my_proc);
109  for (size_type i = 0; i < i_size; i++) {
110  node_perm [i_start + i] = _inod2ios_dis_inod [i];
111  }
112  for (size_type iproc = 0; iproc < nproc; iproc++) {
113  if (iproc == my_proc) continue;
114  size_type i_start = _inod2ios_dis_inod.ownership().first_index(iproc);
115  size_type i_size = _inod2ios_dis_inod.ownership().size (iproc);
116  comm.recv (iproc, tag_gather, node_perm.begin().operator->() + i_start, i_size);
117  }
118  } else {
119  comm.send (0, tag_gather, _inod2ios_dis_inod.begin().operator->(), _inod2ios_dis_inod.size());
120  }
121  //
122  // 4) put elements, faces & edges
123  //
124  geo_element_permuted_put put_element (node_perm);
125  for (size_type dim = base::_gs._map_dimension; dim > 0; dim--) {
126  size_type first_dis_v = 0;
129 
130  if (base::_gs.ownership_by_variant[variant].dis_size() == 0) continue;
131  permutation_proxy perm (base::_geo_element [variant], first_dis_v);
132  base::_geo_element [variant].permuted_put_values (ops, perm, put_element);
133  first_dis_v += base::_gs.ownership_by_variant[variant].dis_size();
134  }
135  ops << endl;
136  }
137  //
138  // 6) put domains
139  //
141  iter = base::_domains.begin(),
142  last = base::_domains.end();
143  iter != last; ++iter) {
144  ops << endl;
145  (*iter).put (ops, *this);
146  }
147  return ops;
148 }
149 template <class T>
150 void
152 {
153  fatal_macro ("dump: not yet");
154 #ifdef TODO
155  base::_node.dump (name + "-node");
156  base::_geo_element[variant].dump(name + "-elem-"+ref::name(variant));
157 #endif // TODO
158 }
159 // ----------------------------------------------------------------------------
160 // instanciation in library
161 // ----------------------------------------------------------------------------
162 template class geo_rep<Float,distributed>;
163 
164 } // namespace rheolef
165 #endif // _RHEOLEF_HAVE_MPI
rheolef::reference_element::last_variant_by_dimension
static variant_type last_variant_by_dimension(size_type dim)
Definition: reference_element.h:150
rheolef::distributor::get_new_tag
static tag_type get_new_tag()
returns a new tag
Definition: distributor.cc:133
rheolef::geo_element_permuted_put
Definition: geo_element.h:526
put
void put(idiststream &in, odiststream &out, bool do_proj, bool do_lumped_mass, bool def_fill_opt, size_type extract_id, const Float &scale_value, const std::pair< Float, Float > &u_range, render_type render)
Definition: branch.cc:500
check_macro
check_macro(expr1.have_homogeneous_space(Xh1), "dual(expr1,expr2); expr1 should have homogeneous space. HINT: use dual(interpolate(Xh, expr1),expr2)")
mkgeo_contraction.h
h
Definition: mkgeo_contraction.sh:179
rheolef::geo_abstract_base_rep::size_type
geo_element_hack::size_type size_type
Definition: geo.h:260
dump
verbose clean transpose logscale grid shrink ball stereo iso volume skipvtk deformation fastfieldload lattice reader_on_stdin color format format format format format format format format format format format format format format format format format format dump
Definition: iorheo-members.h:119
mkgeo_ball.order
order
Definition: mkgeo_ball.sh:343
rheolef::geo_rep
sequential mesh representation
Definition: domain_indirect.h:63
rheolef::odiststream::os
std::ostream & os()
Definition: diststream.h:236
rheolef::size_type
size_t size_type
Definition: basis_get.cc:76
rheolef::reference_element::first_variant_by_dimension
static variant_type first_variant_by_dimension(size_type dim)
Definition: reference_element.h:148
rheolef::domain_indirect_basic< distributed >
Definition: domain_indirect.h:559
mkgeo_ball.variant
variant
Definition: mkgeo_ball.sh:149
rheolef::odiststream::io_proc
static size_type io_proc()
Definition: diststream.cc:78
rheolef::geo_element::size_type
reference_element::size_type size_type
Definition: geo_element.h:125
rheolef::space_numbering::dis_nnod
size_type dis_nnod(const basis_basic< T > &b, const geo_size &gs, size_type map_dim)
Definition: space_numbering.cc:67
fatal_macro
#define fatal_macro(message)
Definition: dis_macros.h:33
rheolef::geo_iterator
geo iterator
Definition: geo.h:193
rheolef
This file is part of Rheolef.
Definition: compiler_eigen.h:37
rheolef::odiststream
odiststream: see the diststream page for the full documentation
Definition: diststream.h:126
rheolef::reference_element::max_variant
static const variant_type max_variant
Definition: reference_element.h:82
rheolef::reference_element::p
static const variant_type p
Definition: reference_element.h:75
rheolef::space_constant::vector
Definition: space_constant.h:137
rheolef::_point_put
point output helper
Definition: geo.h:163
size_type
field::size_type size_type
Definition: branch.cc:425
rheolef::_round_point_put
point output helper, with rounding feature
Definition: geo.h:171
rheo
verbose clean transpose logscale grid shrink ball stereo iso volume skipvtk deformation fastfieldload lattice reader_on_stdin color rheo
Definition: iorheo-members.h:65
mkgeo_ball.dim
dim
Definition: mkgeo_ball.sh:307
rheolef::std
Definition: vec_expr_v2.h:391
rheolef::geo_header
Definition: geo_header.h:32
mkgeo_contraction.name
name
Definition: mkgeo_contraction.sh:133
T
Expr1::float_type T
Definition: field_expr.h:218