1
#ifndef _RHEOLEF_GEO_CONNECTIVITY_H
2
#define _RHEOLEF_GEO_CONNECTIVITY_H
4
/// This file is part of Rheolef.
6
/// Copyright (C) 2000-2009 Pierre Saramito <Pierre.Saramito@imag.fr>
8
/// Rheolef is free software; you can redistribute it and/or modify
9
/// it under the terms of the GNU General Public License as published by
10
/// the Free Software Foundation; either version 2 of the License, or
11
/// (at your option) any later version.
13
/// Rheolef is distributed in the hope that it will be useful,
14
/// but WITHOUT ANY WARRANTY; without even the implied warranty of
15
/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
/// GNU General Public License for more details.
18
/// You should have received a copy of the GNU General Public License
19
/// along with Rheolef; if not, write to the Free Software
20
/// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22
/// =========================================================================
24
// ============================================================================
25
// connectivity manipulations
26
// ============================================================================
28
#include "rheolef/config.h"
33
// NOTE: could be in O(a.size + b.size) since a and b are sorted
37
in_place_set_intersection (Set& a, const Set& b)
41
set_intersection (a.begin(), a.end(), b.begin(), b.end(),
42
inserter(c, c.end()));
45
a.erase (a.begin(), a.end());
46
copy (c.begin(), c.end(), inserter(a, a.end()));
49
// NOTE: could be in O(a.size + b.size) since a and b are sorted
53
in_place_set_union (Set& a, const Set& b)
57
set_union (a.begin(), a.end(), b.begin(), b.end(),
58
inserter(c, c.end()));
61
a.erase(a.begin(), a.end());
62
copy (c.begin(), c.end(), inserter(a, a.end()));
64
template<class Iterator, class SetRandomIterator>
67
build_point_to_element_sets (
69
Iterator iter, // elements
72
SetRandomIterator ball) // point-to-element-set
74
typedef typename geo_element::size_type size_type;
76
for (size_type idx = 0; iter != last; iter++, idx++) {
77
const geo_element& E = *iter;
78
for (size_type i = 0; i < E.size(); i++) {
79
ball [E[i]].insert (ball [E[i]].end(), idx);
83
/// @brief builds a set of elements that all contain S.
84
template<class Element, class SetRandomIterator, class Set>
86
build_set_that_contains_S (
88
SetRandomIterator ball,
91
typedef geo_element::size_type size_type;
93
contains_S.erase (contains_S.begin(), contains_S.end());
97
copy (ball[S[0]].begin(), ball[S[0]].end(),
98
inserter (contains_S, contains_S.end()));
100
for (size_type i = 1; i < S.size(); i++) {
101
in_place_set_intersection (contains_S, ball[S[i]]);
105
}// namespace rheolef
106
#endif // _RHEOLEF_GEO_CONNECTIVITY_H