Flow123d  jenkins-Flow123d-windows32-release-multijob-51
elements.cc
Go to the documentation of this file.
1 /*!
2  *
3  * Copyright (C) 2007 Technical University of Liberec. All rights reserved.
4  *
5  * Please make a following refer to Flow123d on your project site if you use the program for any purpose,
6  * especially for academic research:
7  * Flow123d, Research Centre: Advanced Remedial Technologies, Technical University of Liberec, Czech Republic
8  *
9  * This program is free software; you can redistribute it and/or modify it under the terms
10  * of the GNU General Public License version 3 as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
13  * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  * See the GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License along with this program; if not,
17  * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 021110-1307, USA.
18  *
19  *
20  * $Id$
21  * $Revision$
22  * $LastChangedBy$
23  * $LastChangedDate$
24  *
25  * @file
26  * @brief Various element oriented stuff, should be restricted to purely geometric functions
27  * @ingroup mesh
28  *
29  */
30 
31 #include <vector>
32 #include <string>
33 
34 #include "system/system.hh"
35 #include "mesh/mesh.h"
36 #include "mesh/ref_element.hh"
37 #include "element_impls.hh"
38 
39 // following deps. should be removed
40 #include "mesh/boundaries.h"
41 //#include "materials.hh"
42 #include "mesh/accessors.hh"
43 
44 
45 
47 : pid(0),
48 
49  node(NULL),
50 
51 // material(NULL),
52  edge_idx_(NULL),
53  boundary_idx_(NULL),
54  permutation_idx_(NULL),
55 
56  n_neighs_vb(0),
57  neigh_vb(NULL),
58 
59  dim_(0)
60 
61 {
62 }
63 
64 
65 Element::Element(unsigned int dim, Mesh *mesh_in, RegionIdx reg)
66 {
67  init(dim, mesh_in, reg);
68 }
69 
70 
71 
72 void Element::init(unsigned int dim, Mesh *mesh_in, RegionIdx reg) {
73  pid=0;
74  n_neighs_vb=0;
75  neigh_vb=NULL;
76  dim_=dim;
77  mesh_=mesh_in;
78  region_idx_=reg;
79 
80  node = new Node * [ n_nodes()];
81  edge_idx_ = new unsigned int [ n_sides()];
82  boundary_idx_ = NULL;
83  permutation_idx_ = new unsigned int[n_sides()];
84 
85  FOR_ELEMENT_SIDES(this, si) {
88  }
89 }
90 
91 
93 }
94 
95 
96 /**
97  * SET THE "METRICS" FIELD IN STRUCT ELEMENT
98  */
99 double Element::measure() const {
100  switch (dim()) {
101  case 0:
102  return 1.0;
103  break;
104  case 1:
105  return arma::norm(*(node[ 1 ]) - *(node[ 0 ]) , 2);
106  break;
107  case 2:
108  return
109  arma::norm(
110  arma::cross(*(node[1]) - *(node[0]), *(node[2]) - *(node[0])),
111  2
112  ) / 2.0 ;
113  break;
114  case 3:
115  return fabs(
116  arma::dot(
117  arma::cross(*node[1] - *node[0], *node[2] - *node[0]),
118  *node[3] - *node[0] )
119  ) / 6.0;
120  break;
121  }
122  return 1.0;
123 }
124 
125 
126 /**
127  * SET THE "CENTRE[]" FIELD IN STRUCT ELEMENT
128  */
129 
131  unsigned int li;
132 
134  centre.zeros();
135 
136  FOR_ELEMENT_NODES(this, li) {
137  centre += node[ li ]->point();
138  }
139  centre /= (double) n_nodes();
140  return centre;
141 }
142 
143 /**
144  * Count element sides of the space dimension @p side_dim.
145  */
146 
147 unsigned int Element::n_sides_by_dim(unsigned int side_dim)
148 {
149  if (side_dim == dim()) return 1;
150 
151  unsigned int n = 0;
152  for (unsigned int i=0; i<n_sides(); i++)
153  if (side(i)->dim() == side_dim) n++;
154  return n;
155 }
156 
157 
159 {
160  return mesh_->element_accessor( mesh_->element.index(this) );
161 }
162 
163 
164 
166  return Region( region_idx_, mesh_->region_db());
167 }
168 
169 
170 unsigned int Element::id() const {
171  return mesh_->element.get_id(this);
172 }
173 
175  if (dim_==3) {
176  double sum_faces=0;
177  double face[4];
178  for(unsigned int i=0;i<4;i++) sum_faces+=( face[i]=side(i)->measure());
179 
180  double sum_pairs=0;
181  for(unsigned int i=0;i<3;i++)
182  for(unsigned int j=i+1;j<4;j++) {
183  unsigned int i_line = RefElement<3>::line_between_faces(i,j);
184  arma::vec line = *node[RefElement<3>::line_nodes[i_line][1]] - *node[RefElement<3>::line_nodes[i_line][0]];
185  sum_pairs += face[i]*face[j]*arma::dot(line, line);
186  }
187  double regular = (2.0*sqrt(2.0/3.0)/9.0); // regular tetrahedron
188  return fabs( measure()
189  * pow( sum_faces/sum_pairs, 3.0/4.0))/ regular;
190 
191  }
192  if (dim_==2) {
193  return fabs(
194  measure()/
195  pow(
196  arma::norm(*node[1] - *node[0], 2)
197  *arma::norm(*node[2] - *node[1], 2)
198  *arma::norm(*node[0] - *node[2], 2)
199  , 2.0/3.0)
200  ) / ( sqrt(3.0) / 4.0 ); // regular triangle
201  }
202  return 1.0;
203 }
204 
205 
206 void Element::get_bounding_box(BoundingBox &bounding_box) const
207 {
208  bounding_box = BoundingBox( this->node[0]->point() );
209 
210  for (unsigned int i=1; i<n_nodes(); i++)
211  bounding_box.expand( this->node[i]->point() );
212 }
213 
214 //-----------------------------------------------------------------------------
215 // vim: set cindent:
Bounding box in 3d ambient space.
Definition: bounding_box.hh:55
double measure() const
Definition: elements.cc:99
unsigned int n_nodes() const
#define FOR_ELEMENT_NODES(i, j)
Definition: elements.h:150
unsigned int * boundary_idx_
Definition: elements.h:94
int get_id(const T *it) const
Definition: sys_vector.hh:468
Definition: nodes.hh:44
int pid
Definition: elements.h:87
unsigned int * permutation_idx_
Definition: elements.h:103
static const unsigned int undef_idx
Definition: mesh.h:110
???
void expand(const Point &point)
Definition: mesh.h:108
#define FOR_ELEMENT_SIDES(i, j)
Definition: elements.h:151
static unsigned int line_between_faces(unsigned int f1, unsigned int f2)
Node ** node
Definition: elements.h:90
unsigned int id() const
Definition: elements.cc:170
const RegionDB & region_db() const
Definition: mesh.h:148
ElementAccessor< 3 > element_accessor(unsigned int idx, bool boundary=false)
Definition: mesh.cc:638
Element()
Definition: elements.cc:46
unsigned int dim() const
unsigned int * edge_idx_
Definition: elements.h:93
unsigned int dim() const
Definition: side_impl.hh:26
~Element()
Definition: elements.cc:92
Neighbour ** neigh_vb
Definition: elements.h:129
Region region() const
Definition: elements.cc:165
unsigned int n_sides() const
unsigned int index(const T *pointer) const
Definition: sys_vector.hh:383
void get_bounding_box(BoundingBox &bounding_box) const
Definition: elements.cc:206
SideIter side(const unsigned int loc_index)
unsigned int dim_
Definition: elements.h:138
void init(unsigned int dim, Mesh *mesh_in, RegionIdx reg)
Definition: elements.cc:72
Mesh * mesh_
Definition: elements.h:132
RegionIdx region_idx_
Definition: elements.h:137
arma::vec3 centre() const
Definition: elements.cc:130
unsigned int n_neighs_vb
Definition: elements.h:127
double quality_measure_smooth()
Definition: elements.cc:174
Class RefElement defines numbering of vertices, sides, calculation of normal vectors etc...
ElementAccessor< 3 > element_accessor() const
Gets ElementAccessor of this element.
Definition: elements.cc:158
unsigned int n_sides_by_dim(unsigned int side_dim)
Definition: elements.cc:147
arma::vec3 & point()
Definition: nodes.hh:80
ElementVector element
Vector of elements of the mesh.
Definition: mesh.h:198