28#include "rheolef/geo.h"
29#include "rheolef/space.h"
40 const std::vector<size_t>& new_dis_inod,
42 hack_array<geo_element_hack,M>& ge,
46 typedef point_basic<size_type> ilat;
50 ge[ie][0] = new_dis_inod[loc_inod0];
51 ge[ie][1] = new_dis_inod[loc_inod1];
59 const std::vector<size_t>& new_dis_inod,
63 std::array<size_t, reference_element::max_variant>&
68 size_t& ie = count_by_variant[t];
69 size_t& e_ie = count_by_variant[e];
71 typedef point_basic<size_type> ilat;
78 ge[t][ie][0] = new_dis_inod[loc_inod00];
79 ge[t][ie][1] = new_dis_inod[loc_inod10];
80 ge[t][ie][2] = new_dis_inod[loc_inod01];
82 if (i+j+1 >= nsub)
continue;
84 ge[t][ie][0] = new_dis_inod[loc_inod10];
85 ge[t][ie][1] = new_dis_inod[loc_inod11];
86 ge[t][ie][2] = new_dis_inod[loc_inod01];
89 ge[e][e_ie][0] = new_dis_inod[loc_inod10];
90 ge[e][e_ie][1] = new_dis_inod[loc_inod11];
92 ge[e][e_ie][0] = new_dis_inod[loc_inod11];
93 ge[e][e_ie][1] = new_dis_inod[loc_inod01];
95 ge[e][e_ie][0] = new_dis_inod[loc_inod01];
96 ge[e][e_ie][1] = new_dis_inod[loc_inod10];
105 const reference_element& hat_K,
106 const std::vector<size_t>& new_dis_inod,
110 std::array<size_t, reference_element::max_variant>&
113 switch (hat_K.variant()) {
118 build_triangle (new_dis_inod, nsub, ge, count_by_variant);
127template <
class T,
class M>
138 new_omega._version = 4;
139 new_omega._have_connectivity =
true;
140 new_omega._name = old_omega.name() +
"-P" + std::to_string(nsub);
141 new_omega._dimension = old_omega.dimension();
142 new_omega._gs._map_dimension = old_omega.map_dimension();
143 new_omega._sys_coord = old_omega.coordinate_system();
144 new_omega._serial_number = 0;
152 new_omega._node = old_Xh_sub.get_xdofs();
153 new_omega._gs.ownership_by_variant[0]
154 = new_omega._gs.ownership_by_dimension[0]
155 = new_omega._gs.node_ownership
156 = new_omega._node.ownership();
160 size_type map_d = old_omega.map_dimension();
161 communicator comm = old_omega.comm();
162 std::array<size_type, reference_element::max_variant> size_by_variant;
163 std::fill (size_by_variant.begin(), size_by_variant.end(), 0);
168 size_type old_nge = old_omega.sizes().ownership_by_variant [variant].size();
169 size_by_variant[variant] = loc_nge*old_nge;
183 new_omega._gs.ownership_by_variant [variant].resize (
distributor::decide, comm, size_by_variant[variant]);
184 new_omega._geo_element [variant].resize (new_omega._gs.ownership_by_variant [variant], param);
185 ne += size_by_variant[variant];
192 std::array<size_type, reference_element::max_variant> count_by_variant;
193 std::fill (count_by_variant.begin(), count_by_variant.end(), 0);
194 std::vector<size_type> dis_inod;
196 for (
size_type ie = 0, ne = old_omega.size(
d); ie < ne; ++ie) {
197 const geo_element& old_K = old_omega.get_geo_element (
d, ie);
198 old_Xh_sub.dis_idof (old_K, dis_inod);
200 build_element (old_K, dis_inod, nsub, new_omega._geo_element, count_by_variant);
207 new_omega._geo_element [
reference_element::p].resize (new_omega._gs.ownership_by_dimension[0], param);
208 size_type first_iv = new_omega._gs.ownership_by_dimension[0].first_index();
211 for (
auto iter = new_omega.begin(0), last = new_omega.end(0); iter != last; iter++, iv++) {
213 P[0] = first_iv + iv;
221 if (new_omega._gs._map_dimension > 0) {
223 for (
size_type side_dim = new_omega._gs._map_dimension - 1; side_dim >= 1; side_dim--) {
225 size_type nsid = new_omega._gs.ownership_by_dimension[side_dim].dis_size();
226 new_omega._gs.ownership_by_dimension [side_dim] =
distributor (nsid, new_omega.comm(), nsid);
229 for (
typename geo_rep<T,M>::iterator iter = new_omega.begin(side_dim), last = new_omega.end(side_dim); iter != last; iter++, isid++) {
240 size_type first_dis_ie = new_omega._gs.ownership_by_dimension[
d].first_index();
241 for (
size_type ie = 0, ne = new_omega.size(
d); ie < ne; ++ie) {
252 vector<index_set> ball [4];
253 domain_indirect_basic<sequential> dom;
254 while (dom.get (ips, *
this, ball)) {
255 base::_domains.push_back (dom);
261 new_omega.set_element_side_index (1);
262 new_omega.set_element_side_index (2);
266 new_omega.compute_bbox();
268#define _RHEOLEF_geo_build_by_subdividing(M) \
271geo_rep<T,M>::build_by_subdividing (const geo_basic<T,M>& omega, size_type nsub) \
273 geo_build_by_subdividing (*this, omega, nsub); \
276#ifdef _RHEOLEF_HAVE_MPI
279#undef _RHEOLEF_geo_build_by_subdividing
283#define _RHEOLEF_instanciate(T,M) \
284template void geo_rep<Float,M>::build_by_subdividing ( \
285 const geo_basic<Float,M>& omega, size_t nsub);
287#ifdef _RHEOLEF_HAVE_MPI
290#undef _RHEOLEF_instanciate
field::size_type size_type
see the Float page for the full documentation
see the distributor page for the full documentation
static const size_type decide
generic mesh with rerefence counting
see the geo_element page for the full documentation
void set_ios_dis_ie(size_type ios_dis_ie)
variant_type variant() const
void set_dis_ie(size_type dis_ie)
sequential mesh representation
std::vector< T, A >::size_type size_type
static size_type ilat2loc_inod(size_type order, const point_basic< size_type > &ilat)
static size_type ilat2loc_inod(size_type order, const point_basic< size_type > &ilat)
static const variant_type e
static const variant_type max_variant
static variant_type last_variant_by_dimension(size_type dim)
static variant_type first_variant_by_dimension(size_type dim)
static const variant_type p
static const variant_type t
rheolef::space_base_rep< T, M > t
#define _RHEOLEF_instanciate(T)
#define error_macro(message)
#define _RHEOLEF_geo_build_by_subdividing(M)
This file is part of Rheolef.
void geo_build_by_subdividing(geo_rep< T, M > &new_omega, const geo_basic< T, M > &old_omega, typename geo_rep< T, M >::size_type k)
space_mult_list< T, M > pow(const space_basic< T, M > &X, size_t n)