22 #include "rheolef/config.h"
24 #ifdef _RHEOLEF_HAVE_MPI
25 #include "rheolef/domain_indirect.h"
26 #include "rheolef/geo.h"
42 const size_type unset = std::numeric_limits<size_type>::max();
49 iter != last; iter++, dom_ie++) {
52 size_type dom_dis_ie = first_dom_dis_ie + dom_ie;
53 ios_mark.dis_entry (ios_dis_ie) = dom_dis_ie;
55 ios_mark.dis_entry_assembly();
60 for (
size_type ios_ie = 0, ios_ne = ios_mark.size(); ios_ie < ios_ne; ios_ie++) {
61 if (ios_mark [ios_ie] != unset) dom_ini_size++;
67 _ini_ioige2dis_ioige.resize (dom_ini_ownership, unset);
69 for (
size_type ios_ie = 0, ios_ne = ios_mark.size(); ios_ie < ios_ne; ios_ie++) {
70 if (ios_mark [ios_ie] == unset)
continue;
71 _ini_ioige2dis_ioige [dom_ini_ie] = ios_mark [ios_ie];
77 _ioige2ini_dis_ioige.resize (dom_ownership, unset);
78 _ini_ioige2dis_ioige.reverse_permutation (_ioige2ini_dis_ioige);
197 const size_type unset = std::numeric_limits<size_type>::max();
202 communicator comm = omega.comm();
204 ips.
is().setstate (std::ios::badbit);
217 ini_oige.get_values (ips);
222 distributor ios_ige_ownership = omega.geo_element_ios_ownership (base::_map_dim);
224 for (
size_type ini_ioige = 0, ini_noige = ini_oige.size();
225 ini_ioige < ini_noige; ini_ioige++) {
226 size_type ios_ige = ini_oige [ini_ioige].index();
227 ios_owner [ini_ioige] = ios_ige_ownership.
find_owner (ios_ige);
233 ini_oige.repartition (
236 ios_ioige2ini_dis_ioige,
237 ini_ioige2ios_dis_ioige);
243 distributor ios_ioige_ownership = ios_oige.ownership();
245 for (
size_type ios_ioige = 0, ios_noige = ios_ioige_ownership.
size();
246 ios_ioige < ios_noige; ios_ioige++) {
248 size_type ios_dis_ige = ios_oige [ios_ioige].index();
250 size_type dis_ige = omega.ios_ige2dis_ige (base::_map_dim, ios_ige);
251 tmp_oige [ios_ioige].set (orient, dis_ige);
254 distributor ige_ownership = omega.geo_element_ownership (base::_map_dim);
256 for (
size_type ios_ioige = 0, ios_noige = ios_ioige_ownership.
size();
257 ios_ioige < ios_noige; ios_ioige++) {
258 size_type ige = tmp_oige [ios_ioige].index();
259 partition [ios_ioige] = ige_ownership.
find_owner (ige);
264 tmp_oige.repartition (
268 ios_ioige2dis_ioige);
272 for (
size_type ioige = 0, noige = ioige_ownership.
size(); ioige < noige; ioige++) {
273 size_type dis_ige = operator[] (ioige).index();
275 operator[] (ioige).set_index (ige);
280 _ini_ioige2dis_ioige.resize (ini_ioige_ownership, unset);
281 _ioige2ini_dis_ioige.resize ( ioige_ownership, unset);
282 for (
size_type ios_ioige = 0, ios_noige = ios_ioige_ownership.
size();
283 ios_ioige < ios_noige; ios_ioige++) {
284 size_type ini_dis_ioige = ios_ioige2ini_dis_ioige [ios_ioige];
285 size_type dis_ioige = ios_ioige2dis_ioige [ios_ioige];
286 _ini_ioige2dis_ioige.dis_entry (ini_dis_ioige) = dis_ioige;
287 _ioige2ini_dis_ioige.dis_entry (dis_ioige) = ini_dis_ioige;
289 _ioige2ini_dis_ioige.dis_entry_assembly();
290 _ini_ioige2dis_ioige.dis_entry_assembly();
301 ops <<
"domain" << endl
302 << base::_name << endl
303 <<
"2 " << base::_map_dim <<
" " << dis_size() << endl;
305 distributor ini_ioige_ownership = _ini_ioige2dis_ioige.ownership();
306 distributor ige_ownership = omega.geo_element_ownership (base::_map_dim);
308 for (
size_type ioige = 0, noige = ioige_ownership.
size(); ioige < noige; ioige++) {
309 size_type ini_dis_ioige = _ioige2ini_dis_ioige [ioige];
311 size_type ige = operator[] (ioige).index();
312 size_type ios_dis_ige = omega.ige2ios_dis_ige (base::_map_dim, ige);
315 ini_oige.dis_entry_assembly();
316 ini_oige.put_values (ops);
334 #define _RHEOLEF_instanciation(T,M) \
337 domain_indirect_rep<M>::init_ios (const geo_abstract_rep<T,M>&); \
see the Float page for the full documentation
see the disarray page for the full documentation
rep::base::size_type size_type
see the distributor page for the full documentation
size_type find_owner(size_type dis_i) const
find iproc associated to a global index dis_i: CPU=log(nproc)
size_type size(size_type iproc) const
size_type first_index(size_type iproc) const
global index range and local size owned by ip-th process
static const size_type decide
base::const_iterator_ioige const_iterator_ioige
base::size_type size_type
base::orientation_type orientation_type
virtual const geo_size & ios_sizes() const =0
virtual size_type ige2ios_dis_ige(size_type dim, size_type ige) const =0
sequential mesh representation
idiststream: see the diststream page for the full documentation
odiststream: see the diststream page for the full documentation
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.
void put(std::ostream &out, std::string name, const tiny_matrix< T > &a)
bool dis_scatch(idiststream &ips, const communicator &comm, std::string ch)
distributed version of scatch(istream&,string)
_RHEOLEF_instanciation(Float, sequential, std::allocator< Float >) _RHEOLEF_instanciation(Float
distributor ownership_by_dimension[4]