2
/// This file is part of Rheolef.
4
/// Copyright (C) 2000-2009 Pierre Saramito <Pierre.Saramito@imag.fr>
6
/// Rheolef is free software; you can redistribute it and/or modify
7
/// it under the terms of the GNU General Public License as published by
8
/// the Free Software Foundation; either version 2 of the License, or
9
/// (at your option) any later version.
11
/// Rheolef is sequential in the hope that it will be useful,
12
/// but WITHOUT ANY WARRANTY; without even the implied warranty of
13
/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
/// GNU General Public License for more details.
16
/// You should have received a copy of the GNU General Public License
17
/// along with Rheolef; if not, write to the Free Software
18
/// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
/// =========================================================================
22
#include "rheolef/geo_domain.h"
28
geo_rep<T,sequential>::build_from_domain (
29
const domain_indirect_rep<sequential>& indirect,
30
const geo_abstract_rep<T,sequential>& bgd_omega)
32
base::_name = bgd_omega.name() + "." + indirect.name();
33
base::_version = 1; // not yet connectivity
34
base::_dimension = bgd_omega.dimension();
35
base::_map_dimension = indirect.map_dimension();
36
size_type map_dim = base::_map_dimension;
37
// -------------------------------------
38
// part 1 : vertex compact re-numbering
39
// -------------------------------------
40
// 1.1 loop on elements and mark used vertices
41
array<size_type> bgd_iv_is_on_domain (bgd_omega.geo_element_ownership(0), 0); // logical, init to "false"
42
for (size_type ioige = 0, noige = indirect.size(); ioige < noige; ioige++) {
43
size_type ige = indirect.oige (ioige).index();
44
const geo_element& S = bgd_omega.get_geo_element (map_dim, ige);
45
for (size_type iloc = 0; iloc < S.size(); iloc++) {
46
size_type bgd_dis_iv = S[iloc];
47
bgd_iv_is_on_domain.dis_entry (bgd_dis_iv) = 1;
50
// 1.2 counting & distribution for dom_iv
52
for (size_type bgd_iv = 0, bgd_nv = bgd_omega.geo_element_ownership(0).size(); bgd_iv < bgd_nv; bgd_iv++) {
53
if (bgd_iv_is_on_domain[bgd_iv] != 0) dom_nv++ ;
55
// 1.3 numbering dom_iv & permutation: bgd_iv <--> dom_iv
56
array<size_type> bgd_iv2dom_iv (bgd_omega.geo_element_ownership(0), std::numeric_limits<size_type>::max());
57
array<size_type> dom_iv2bgd_iv (dom_nv, std::numeric_limits<size_type>::max());
58
for (size_type dom_iv = 0, bgd_iv = 0, bgd_nv = bgd_omega.geo_element_ownership(0).size(); bgd_iv < bgd_nv; bgd_iv++) {
59
if (bgd_iv_is_on_domain[bgd_iv] == 0) continue;
60
bgd_iv2dom_iv [bgd_iv] = dom_iv;
61
dom_iv2bgd_iv [dom_iv] = bgd_iv;
65
// 2) defines geo_element[0] and P.set_ios_dis_ie
67
base::_geo_element[0].resize (dom_nv);
68
for (size_type dom_iv = 0; dom_iv < dom_nv; dom_iv++) {
69
size_type bgd_iv = dom_iv2bgd_iv [dom_iv];
70
base::_geo_element[0][dom_iv] = geo_element_p (dom_iv);
71
geo_element& P = base::_geo_element[0][dom_iv];
72
P.set_ios_dis_ie (dom_iv);
73
P.set_dis_ie (dom_iv);
76
// 3) raw copy vertices
77
// TODO: use shallow copy & indirection in vertex(iv) access via bgd_omega.vertex(renum(iv))
79
base::_vertex.resize (dom_nv);
80
for (size_type dom_iv = 0; dom_iv < dom_nv; dom_iv++) {
81
size_type bgd_iv = dom_iv2bgd_iv [dom_iv];
82
base::_vertex [dom_iv] = bgd_omega.vertex (bgd_iv);
85
// 4) copy element with compact vertex numbering
88
base::_geo_element[map_dim].resize (indirect.ownership());
89
for (size_type ioige = 0, noige = indirect.size(); ioige < noige; ioige++) {
90
size_type ige = indirect.oige (ioige).index();
91
geo_element::intrusive_set (base::_geo_element[map_dim][ioige], bgd_omega.get_geo_element (map_dim, ige));
92
geo_element& S = base::_geo_element[map_dim][ioige];
93
// TODO: apply also orientation to S
94
for (size_type iloc = 0; iloc < S.size(); iloc++) {
95
size_type bgd_iv = S[iloc];
96
size_type dom_iv = bgd_iv2dom_iv [bgd_iv];
99
S.set_ios_dis_ie (ioige);
100
S.set_dis_ie (ioige);
106
base::reset_size_by();
108
// ----------------------------------------------------------------------------
109
// instanciation in library
110
// ----------------------------------------------------------------------------
111
template class geo_rep<Float,sequential>;
113
} // namespace rheolef