22 #include "rheolef/space.h"
23 #include "rheolef/space_numbering.h"
24 #include "rheolef/space_mult.h"
25 #include "rheolef/piola_util.h"
26 #include "rheolef/piola_on_pointset.h"
33 template <
class T,
class M>
39 (approx ==
"" || valued ==
"scalar") ? approx : valued+
"("+approx+
")"),
51 if (approx ==
"")
return;
57 template <
class T,
class M>
61 : _constit(omega_in,
b.
name()),
73 if (!
b.is_initialized())
return;
79 template <
class T,
class M>
93 _normal.resize (idof_ownership);
96 template <
class T,
class M>
100 _have_freezed(false),
112 template <
class T,
class M>
116 if (_constit.is_hierarchical()) {
117 trace_macro (
"init_xdof: hierarchical space: xdof undefined");
126 _xdof.resize (nod_ownership);
129 std::vector<size_type> dis_inod_tab;
130 for (
size_type ie = 0, ne = omega.size(); ie < ne; ie++) {
132 const Eigen::Matrix<piola<T>,Eigen::Dynamic,1>&
piola = pops.
get_piola (omega, K);
134 for (
size_type loc_inod = 0, loc_nnod =
piola.size(); loc_inod < loc_nnod; ++loc_inod) {
135 _xdof.dis_entry (dis_inod_tab[loc_inod]) =
piola [loc_inod].
F;
138 _xdof.dis_entry_assembly();
142 for (
size_type ie = 0, ne = omega.size(); ie < ne; ++ie) {
145 for (
size_type loc_inod = 0, loc_nnod = dis_inod_tab.size(); loc_inod < loc_nnod; ++loc_inod) {
152 _xdof.set_dis_indexes (dis_inod_set);
155 template <
class T,
class M>
159 _constit.neighbour_guard();
167 _idof2blk_dis_iub [idof].set_blocked (blocked_flag[idof]);
175 bool blk = _idof2blk_dis_iub [idof].is_blocked();
177 _idof2blk_dis_iub[idof].set_dis_iub (n_unknown);
180 _idof2blk_dis_iub[idof].set_dis_iub (n_blocked);
186 #ifdef _RHEOLEF_HAVE_MPI
188 dis_n_unknown = mpi::all_reduce (comm(), dis_n_unknown, std::plus<T>());
189 dis_n_blocked = mpi::all_reduce (comm(), dis_n_blocked, std::plus<T>());
192 _iu_ownership = distributor (dis_n_unknown, comm(), n_unknown);
193 _ib_ownership = distributor (dis_n_blocked, comm(), n_blocked);
198 template <
class T,
class M>
208 template <
class T,
class M>
212 return _constit.name();
227 template <
class T,
class M>
231 const std::string& dom_name
235 return build_indirect_array (Wh, bgd_gamma);
237 template <
class T,
class M>
245 const geo_basic<T,M>& bgd_gamma = bgd_gamma2.get_background_domain();
254 check_macro (dom_gamma.size() == bgd_gamma.size(),
"incompatible domains");
257 trace_macro(
"Vh="<<Vh.
name()<<
", Wh="<<Wh.
name()<<
", dom_idof2bgd_idof.size=Wh.size="<<dom_ownership.
size()<<
"...");
260 std::vector<size_type> dom_dis_idofs, bgd_dis_idofs;
262 for (
size_type ige = 0, nge = dom_gamma.size(); ige < nge; ige++) {
267 trace_macro(
"ige="<<ige<<
": dom_S="<<dom_S.
name()<<dom_S.
dis_ie()<<
", bgd_S="<<bgd_S.
name()<<bgd_S.
dis_ie()
268 <<
": dom_dis_idofs.size="<<dom_dis_idofs.size()
269 <<
", bgd_dis_idofs.size="<<bgd_dis_idofs.size());
270 for (
size_type loc_idof = 0, loc_ndof = dom_dis_idofs.size(); loc_idof < loc_ndof; loc_idof++) {
271 size_type dom_dis_idof = dom_dis_idofs [loc_idof];
272 size_type bgd_dis_idof = bgd_dis_idofs [loc_idof];
273 dom_idof2bgd_idof.dis_entry (dom_dis_idof) = bgd_dis_idof;
274 trace_macro(
"ige="<<ige<<
": dom_idof2bgd_idof["<<dom_dis_idof<<
"] = "<<bgd_dis_idof);
277 dom_idof2bgd_idof.dis_entry_assembly();
279 for (
size_type dom_idof = 0, dom_ndof = dom_idof2bgd_idof.size(); dom_idof < dom_ndof; dom_idof++) {
280 size_type bgd_dis_idof = dom_idof2bgd_idof [dom_idof];
281 size_type dom_dis_idof = dom_idof + first_dom_dis_idof;
282 check_macro (bgd_ownership.
is_owned (bgd_dis_idof),
"bgd_dis_idof="<<bgd_dis_idof<<
" is out of range ["<<first_bgd_dis_idof<<
":"<< bgd_ownership.
last_index()<<
"[");
283 size_type bgd_idof = bgd_dis_idof - first_bgd_dis_idof;
284 dom_idof2bgd_idof [dom_idof] = bgd_idof;
286 trace_macro(
"Vh="<<Vh.
name()<<
", Wh="<<Wh.
name()<<
", dom_idof2bgd_idof.size=Wh.size="<<dom_ownership.
size()<<
" done");
287 return dom_idof2bgd_idof;
289 #define _RHEOLEF_space_real(M) \
292 space_basic<T,M>::real() \
294 return space_basic<T,M> (geo_basic<T,M>(details::zero_dimension()), "P1"); \
297 #ifdef _RHEOLEF_HAVE_MPI
300 #undef _RHEOLEF_space_real
304 #define _RHEOLEF_instanciation(T,M) \
305 template class space_base_rep<T,M>; \
306 template space_basic<T,M> space_basic<T,M>::real();
309 #ifdef _RHEOLEF_HAVE_MPI
312 #undef _RHEOLEF_instanciation
field::size_type size_type
see the Float page for the full documentation
see the distributor page for the full documentation
size_type last_index(size_type iproc) const
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
bool is_owned(size_type dis_i, size_type iproc) const
true when dis_i in [first_index(iproc):last_index(iproc)[
see the geo_element page for the full documentation
void insert(size_type dis_i)
see the integrate_option page for the full documentation
void initialize(const basis_basic< T > &piola_basis, const quadrature< T > &quad, const integrate_option &iopt)
const Eigen::Matrix< piola< T >, Eigen::Dynamic, 1 > & get_piola(const geo_basic< T, M > &omega, const geo_element &K) const
disarray< point_basic< T >, M > _normal
void dis_idof(const geo_element &K, std::vector< size_type > &dis_idof) const
void base_freeze_body() const
disarray< size_type, M > build_indirect_array(const space_base_rep< T, M > &Wh, const std::string &dom_name) const
space_constitution< T, M > _constit
const geo_basic< T, M > & get_geo() const
disarray< int, M > _has_nt_basis
const distributor & ownership() const
space_pair_type::size_type size_type
void freeze_guard() const
disarray< space_pair_type, M > _idof2blk_dis_iub
const distributor & ownership() const
void get_geo(istream &in, my_geo &omega)
check_macro(expr1.have_homogeneous_space(Xh1), "dual(expr1,expr2); expr1 should have homogeneous space. HINT: use dual(interpolate(Xh, expr1),expr2)")
void dis_idof(const basis_basic< T > &b, const geo_size &gs, const geo_element &K, typename std::vector< size_type >::iterator dis_idof_tab)
void dis_inod(const basis_basic< T > &b, const geo_size &gs, const geo_element &K, typename std::vector< size_type >::iterator dis_inod_tab)
size_type nnod(const basis_basic< T > &b, const geo_size &gs, size_type map_dim)
size_type dis_nnod(const basis_basic< T > &b, const geo_size &gs, size_type map_dim)
size_type ndof(const basis_basic< T > &b, const geo_size &gs, size_type map_dim)
This file is part of Rheolef.
_RHEOLEF_space_real(sequential) _RHEOLEF_instanciation(Float
_RHEOLEF_instanciation(Float) _RHEOLEF_instanciation_evaluate(Float