2 #include "rheolef/config.h"
4 #ifdef _RHEOLEF_HAVE_MPI
5 #include "rheolef/domain_indirect.h"
6 #include "rheolef/geo.h"
13 const std::string& name,
15 const communicator& comm,
16 const std::vector<size_type>& ie_list)
18 _ioige2ini_dis_ioige(),
19 _ini_ioige2dis_ioige()
24 array<size_type,distributed> ios_mark (ios_ownership, unset);
29 iter != last; iter++, dom_ie++) {
32 size_type dom_dis_ie = first_dom_dis_ie + dom_ie;
33 ios_mark.dis_entry (ios_dis_ie) = dom_dis_ie;
35 ios_mark.dis_entry_assembly();
37 for (
size_type ios_ie = 0, ios_ne = ios_mark.size(); ios_ie < ios_ne; ios_ie++) {
38 if (ios_mark [ios_ie] != unset) dom_ini_size++;
41 _ini_ioige2dis_ioige.resize (dom_ini_ownership, unset);
43 for (
size_type ios_ie = 0, ios_ne = ios_mark.size(); ios_ie < ios_ne; ios_ie++) {
44 if (ios_mark [ios_ie] == unset)
continue;
45 _ini_ioige2dis_ioige [dom_ini_ie] = ios_mark [ios_ie];
48 _ioige2ini_dis_ioige.resize (dom_ownership, unset);
49 _ini_ioige2dis_ioige.reverse_permutation (_ioige2ini_dis_ioige);
166 communicator comm = omega.comm();
168 ips.is().setstate (std::ios::badbit);
176 check_macro (version == 2,
"unsupported version="<<version<<
" domain format");
179 array<geo_element_indirect,distributed> ini_oige (ini_ioige_ownership);
180 ini_oige.get_values (ips);
181 distributor ios_ige_ownership = omega.geo_element_ios_ownership (base::_map_dim);
182 array<size_type> ios_owner (ini_ioige_ownership, unset);
183 for (
size_type ini_ioige = 0, ini_noige = ini_oige.size();
184 ini_ioige < ini_noige; ini_ioige++) {
185 size_type ios_ige = ini_oige [ini_ioige].index();
186 ios_owner [ini_ioige] = ios_ige_ownership.
find_owner (ios_ige);
188 array<geo_element_indirect> ios_oige;
189 array<size_type> ini_ioige2ios_dis_ioige;
190 array<size_type> ios_ioige2ini_dis_ioige;
191 ini_oige.repartition (
194 ios_ioige2ini_dis_ioige,
195 ini_ioige2ios_dis_ioige);
197 distributor ios_ioige_ownership = ios_oige.ownership();
198 array<geo_element_indirect> tmp_oige (ios_ioige_ownership);
199 for (
size_type ios_ioige = 0, ios_noige = ios_ioige_ownership.
size();
200 ios_ioige < ios_noige; ios_ioige++) {
202 size_type ios_dis_ige = ios_oige [ios_ioige].index();
204 size_type dis_ige = omega.ios_ige2dis_ige (base::_map_dim, ios_ige);
205 tmp_oige [ios_ioige].set (orient, dis_ige);
207 distributor ige_ownership = omega.geo_element_ownership (base::_map_dim);
208 array<size_type> partition (ios_ioige_ownership, unset);
209 for (
size_type ios_ioige = 0, ios_noige = ios_ioige_ownership.
size();
210 ios_ioige < ios_noige; ios_ioige++) {
211 size_type ige = tmp_oige [ios_ioige].index();
212 partition [ios_ioige] = ige_ownership.
find_owner (ige);
214 array<size_type> ios_ioige2dis_ioige;
215 array<size_type> ioige2ios_dis_ioige;
216 tmp_oige.repartition (
220 ios_ioige2dis_ioige);
222 distributor ioige_ownership = array<geo_element_indirect>::ownership();
223 for (
size_type ioige = 0, noige = ioige_ownership.
size(); ioige < noige; ioige++) {
224 size_type dis_ige = operator[] (ioige).index();
226 operator[] (ioige).set_index (ige);
228 _ini_ioige2dis_ioige.resize (ini_ioige_ownership, unset);
229 _ioige2ini_dis_ioige.resize ( ioige_ownership, unset);
230 for (
size_type ios_ioige = 0, ios_noige = ios_ioige_ownership.
size();
231 ios_ioige < ios_noige; ios_ioige++) {
232 size_type ini_dis_ioige = ios_ioige2ini_dis_ioige [ios_ioige];
233 size_type dis_ioige = ios_ioige2dis_ioige [ios_ioige];
234 _ini_ioige2dis_ioige.dis_entry (ini_dis_ioige) = dis_ioige;
235 _ioige2ini_dis_ioige.dis_entry (dis_ioige) = ini_dis_ioige;
237 _ioige2ini_dis_ioige.dis_entry_assembly();
238 _ini_ioige2dis_ioige.dis_entry_assembly();
249 ops <<
"domain" << endl
250 << base::_name << endl
251 <<
"2 " << base::_map_dim <<
" " << dis_size() << endl;
252 distributor ioige_ownership = array<geo_element_indirect>::ownership();
253 distributor ini_ioige_ownership = _ini_ioige2dis_ioige.ownership();
254 distributor ige_ownership = omega.geo_element_ownership (base::_map_dim);
255 array<geo_element_indirect> ini_oige (ini_ioige_ownership);
256 for (
size_type ioige = 0, noige = ioige_ownership.size(); ioige < noige; ioige++) {
257 size_type ini_dis_ioige = _ioige2ini_dis_ioige [ioige];
259 size_type ige = operator[] (ioige).index();
260 size_type ios_dis_ige = omega.ige2ios_dis_ige (base::_map_dim, ige);
263 ini_oige.dis_entry_assembly();
264 ini_oige.put_values (ops);
279 #define _RHEOLEF_instanciation(T,M) \
281 domain_indirect_rep<M>::domain_indirect_rep ( \
282 const geo_basic<T,M>& omega, \
283 const std::string& name, \
285 const communicator& comm, \
286 const std::vector<size_type>& ie_list);
291 #endif // _RHEOLEF_HAVE_MPI