1 #include "rheolef/domain_indirect.h"
22 #include "rheolef/geo.h"
23 #include "rheolef/rheostream.h"
33 const std::string&
name,
35 const communicator& comm,
36 const std::vector<size_type>& ie_list)
43 for (std::vector<size_type>::const_iterator iter = ie_list.begin(),
45 iter != last; iter++, oige_iter++) {
46 (*oige_iter).set (1, *iter);
60 "union: domains "<<
a._name<<
" and " <<
b._name <<
" have incompatible dimensions");
61 _name =
a._name +
"+" +
b._name;
62 _map_dim =
a._map_dim;
64 std::map<size_type,geo_element_indirect> c_map;
66 iter =
a.begin(), last =
a.end(); iter != last; ++iter) {
71 iter =
b.begin(), last =
b.end(); iter != last; ++iter) {
78 for (
typename std::map<size_type,geo_element_indirect>::const_iterator
79 iter = c_map.begin(), last = c_map.end(); iter != last; ++iter, ++oige_iter) {
80 *oige_iter = (*iter).second;
89 ops <<
"domain" << endl
90 << base::_name << endl
91 <<
"2 " << base::_map_dim <<
" " << size() << endl;
101 const std::vector<index_set>& ball,
106 if (S.
size() == 0)
return;
107 contains_S = ball[S[0]];
108 for (
size_type i = 1; i < S.size(); i++) {
120 std::vector<index_set> *ball)
122 std::istream& is = ips.is();
123 if (!
scatch(is,
"\ndomain")) {
124 is.setstate (std::ios::badbit);
128 is >> base::_name >>
version >> base::_map_dim >> n_side;
130 if (
version == 2 || base::_map_dim == 0) {
136 for (
size_type ioige = 0, noige = size(); ioige < noige; ioige++) {
138 const geo_element& S = omega.get_geo_element (base::_map_dim, ige);
139 check_macro (prev_variant <= S.
variant(),
"elements should be sorted by increasing variant order");
146 check_macro (base::_map_dim <= omega.dimension(),
"unexpected domain dimension="
147 <<base::_map_dim<<
" > geometry dimension = " << omega.dimension());
157 disarray_t d_tmp (n_side, elem_init);
158 d_tmp.get_values (ips);
159 build_from_data (omega, d_tmp, ball);
168 std::vector<index_set>* ball)
174 if (d_tmp.size() == 0)
return;
175 base::_map_dim = d_tmp[0].dimension();
177 if (ball [base::_map_dim].size() == 0) {
178 ball [base::_map_dim].resize (omega.n_vertex());
179 for (
size_type ige = 0, nge = omega.geo_element_ownership(base::_map_dim).size(); ige < nge; ige++) {
180 const geo_element& E = omega.get_geo_element (base::_map_dim,ige);
182 ball [base::_map_dim] [E[iloc]] += ige;
186 disarray_t::const_iterator q = d_tmp.begin();
188 for (
iterator_ioige p = ioige_begin(), last = ioige_end();
p != last; ++
p, ++q) {
190 check_macro (prev_variant <= S.
variant(),
"elements should be sorted by increasing variant order");
194 check_macro (contains_S.size() >= 1,
"domain element not in mesh: S.dis_ie=" << S.
dis_ie());
195 check_macro (contains_S.size() <= 1,
"problem with domain element: S.dis_ie=" << S.
dis_ie());
197 size_type i_side = *(contains_S.begin());
198 const geo_element& S_orig = omega.get_geo_element (base::_map_dim, i_side);
202 "problem with domain element: S.dis_ie=" << S.
dis_ie());
203 (*p).set (orient, i_side, shift);
211 std::vector<index_set>* ball)
215 "build a domain for a geo_domain: not yet");
217 data().build_from_data (omega_data, d_tmp, ball);
227 std::vector<index_set> *ball);
235 std::vector<index_set>* ball);
242 std::vector<index_set>* ball);
244 #define _RHEOLEF_instanciation(M) \
245 template class domain_indirect_base_rep<M>; \
248 #ifdef _RHEOLEF_HAVE_MPI
250 #endif // _RHEOLEF_HAVE_MPI