38 std::vector<bool> &is_isolated,
39 std::vector<Facet_ID > *b,
40 int ghost_level)
throw(
int) {
41 if ( _pane.dimension() == 2) {
43 int *ng_ptr = ghost_level ? &ng : (
int*)NULL;
46 _pm->get_borders( is_border, is_isolated, b, ng_ptr);
50 get_borders( is_border, is_isolated, b, ng_ptr);
54 determine_border_nodes_3( is_border, b, ghost_level);
55 determine_isolated_nodes( is_isolated, ghost_level);
81 std::vector< Corners2Face_Map > &c2f_vec,
82 int &num_external_face,
int &counter) {
86 std::sort( &sorted_ns[0], &sorted_ns[4]);
90 Corners2Face_Map &c2f = c2f_vec[sorted_ns[1]-1];
92 std::pair<Corners2Face_Map::iterator, bool>
93 ans = c2f.insert( std::make_pair(sorted_ns, fid));
98 c2f.erase( ans.first);
102 else ++num_external_face;
107 std::vector<Facet_ID > *b,
108 int ghost_level )
throw(
int) {
111 if (ghost_level == 0){
112 num_nodes=_pane.size_of_real_nodes();
113 num_elmts=_pane.size_of_real_elements();
117 num_nodes=_pane.size_of_nodes();
118 num_elmts=_pane.size_of_elements();
122 is_border.clear(); is_border.resize( num_nodes,
false);
125 if ( _pane.is_structured()) {
127 const int ni=_pane.size_i(),
nj=_pane.size_j(),
nk=_pane.size_k();
135 int buffer = _pane.size_of_ghost_layers() - ghost_level;
136 buffer = buffer < 0 ? 0 : buffer;
138 int t = ni*nj*(
nk-1);
139 int h = buffer*ni + buffer;
140 int w = ni - 2*buffer;
143 for (
int j=s*(buffer) + h, j_end = s*(1+buffer) - ni*buffer;
j< j_end;
j +=
ni){
144 std::fill_n( is_border.begin() +
j, w,
true);
147 for (
int j= t+h-s*buffer, end = s*
nk - s*buffer- ni*buffer;
j< end;
j +=
ni){
148 std::fill_n( is_border.begin() +
j, w,
true);
152 for (
int j= s*(1+buffer)+h, stop = t-s*buffer+h;
j< stop;
j += ni*
nj){
153 std::fill_n( is_border.begin() +
j, w,
true);
154 std::fill_n( is_border.begin() +
j + ni*((nj-1) - 2*buffer), w,
true);
158 for (
int j= s*(1+buffer)+h;
j< t-s*buffer+h;
j += ni*
nj){
159 for (
int k=ni, k_end = ni*(nj-(1+2*buffer));
k< k_end;
k +=
ni){
160 is_border[
j+
k] =
true;
161 is_border[
j+
k + (ni - (2*buffer+ 1)) ] =
true;
169 std::vector< Corners2Face_Map> c2f_vec(num_nodes);
170 int num_external_face=0;
192 { b->clear(); b->reserve( num_external_face); }
194 std::vector<int> nodes; nodes.reserve(9);
197 Corners2Face_Map::const_iterator vit = c2f_vec[
i].begin();
198 Corners2Face_Map::const_iterator v_end = c2f_vec[
i].end();
200 for ( ; vit != v_end; ++vit) {
207 for (
int i=0,
n=nodes.size();
i<
n; ++
i)
208 is_border[ nodes[
i] - 1 ] =
true;
210 if (b) b->push_back( fid);
218 int ghost_level)
throw(
int) {
222 int nnodes = ghost_level ?
223 _pane.size_of_nodes() : _pane.size_of_real_nodes();
225 if ( _pane.is_structured()) {
227 is_isolated.resize( nnodes,
false);
231 is_isolated.resize( nnodes,
true);
235 int nelems = ghost_level ?
236 _pane.size_of_elements() : _pane.size_of_real_elements();
237 for (
int i=0,size=nelems;
i<size; ++
i, ene.
next()) {
239 is_isolated[ ene[
j]-1] =
false;
247 const COM::Attribute *attr = _pane.attribute(
COM::COM_NC);
249 double sql = HUGE_VAL;
253 std::vector<Facet_ID >::const_iterator it;
254 for ( it=be.begin(); it!=be.end(); ++it) {
260 for (
int j=0;
j<fne.size_of_edges(); ++
j) {
261 int n1 = fne[
j], n2 = fne[(
j+1)%ne];
262 const double *x1 = (
const double*)attr->get_addr( n1-1, 0);
263 const double *x2 = (
const double*)attr->get_addr( n2-1, 0);
266 if ( attr->stride() >= 3) {
272 sqdiff=
square(x1[0]-x2[0]);
273 for (
int i=1,
d=attr->size_of_components();
i<
d; ++
i) {
274 sqdiff +=
square((
const double*)attr->get_addr( n1-1,
i)-
275 (
const double*)attr->get_addr( n2-1,
i));
287 COM::Attribute *isborder,
292 "Border-list must have integer type");
294 "Border-list must have integer type");
296 std::vector<COM::Pane*> panes;
297 isborder->window()->panes( panes);
299 for (
int i=0,
n=panes.size();
i<
n; ++
i) {
301 COM::Attribute *bdl_pane = panes[
i]->attribute(isborder->id());
303 std::vector<bool> is_border_bitmap, is_isolated;
307 int *ptr = (
int *)bdl_pane->pointer();
309 if (ghost_level == 0)
310 nj=panes[
i]->size_of_real_nodes();
313 nj=panes[
i]->size_of_nodes();
315 for (
int j=0;
j<
nj; ++
j) {
316 ptr[
j] = is_border_bitmap[
j];
bool operator<(const Four_tuple &x) const
#define MAP_END_NAMESPACE
A structure used to represent element faces.
An adaptor for enumerating node IDs of an element.
int size_of_corners() const
#define COM_assertion_msg(EX, msg)
void get_nodes(std::vector< int > &nodes, bool quad_ret)
char lid() const
Local edge ID of the halfedge within its element.
int size_of_nodes() const
const int & operator[](int i) const
Adaptor for enumerating node IDs of a facet of an element.
int eid() const
Element ID of the halfedge.
std::map< Four_tuple, Facet_ID > Corners2Face_Map
void determine_border_nodes(std::vector< bool > &is_border, std::vector< bool > &is_isolated, std::vector< Facet_ID > *b=NULL, int ghost_level=0)
Determine the border nodes (excluding isolated nodes)
static void check_face_unique(const Four_tuple &face_corners, const Facet_ID &fid, std::vector< Corners2Face_Map > &c2f_vec, int &num_external_face, int &counter)
int size_of_edges() const
int COM_compatible_types(COM_Type type1, COM_Type type2)
void determine_isolated_nodes(std::vector< bool > &is_isolated, int ghost_level)
Determine the isolated nodes (i.e. not belonging to any element)
Four_tuple(int a, int b, int c, int d)
Provides a data structure accessing nodes, elements, and edges in a pane, in a manner similar to the ...
void determine_border_nodes_3(std::vector< bool > &is_border, std::vector< Facet_ID > *b, int ghost_level)
Determine the border nodes for a 3-D mesh.
Vector_n min(const Array_n_const &v1, const Array_n_const &v2)
static void determine_borders(const COM::Attribute *mesh, COM::Attribute *isborder, int ghost_level=0)
Determine the nodes at pane boundaries of a given mesh.
int size_of_faces() const
Number of faces per element.
The ID of a facet (edge in 2D and face in 3D) encodes an element ID and the local facet's ID internal...
#define MAP_BEGIN_NAMESPACE
double min_squared_edge_len(const std::vector< Facet_ID > &)
Compute the minimum squared edge length of given edges.
void next()
Go to the next element within the connectivity tables of a pane.
void int int REAL REAL REAL *z blockDim dim * ni
Optimized version for unstructured meshes.
Utility for detecting boundaries of a pane.