Flow123d  jenkins-Flow123d-windows-release-multijob-285
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  // Can not make deallocation here since then resize of
94  // vectors of elements deallocates what should be keeped.
95 }
96 
97 
98 /**
99  * SET THE "METRICS" FIELD IN STRUCT ELEMENT
100  */
101 double Element::measure() const {
102  switch (dim()) {
103  case 0:
104  return 1.0;
105  break;
106  case 1:
107  return arma::norm(*(node[ 1 ]) - *(node[ 0 ]) , 2);
108  break;
109  case 2:
110  return
111  arma::norm(
112  arma::cross(*(node[1]) - *(node[0]), *(node[2]) - *(node[0])),
113  2
114  ) / 2.0 ;
115  break;
116  case 3:
117  return fabs(
118  arma::dot(
119  arma::cross(*node[1] - *node[0], *node[2] - *node[0]),
120  *node[3] - *node[0] )
121  ) / 6.0;
122  break;
123  }
124  return 1.0;
125 }
126 
127 
128 /**
129  * SET THE "CENTRE[]" FIELD IN STRUCT ELEMENT
130  */
131 
133  unsigned int li;
134 
136  centre.zeros();
137 
138  FOR_ELEMENT_NODES(this, li) {
139  centre += node[ li ]->point();
140  }
141  centre /= (double) n_nodes();
142  return centre;
143 }
144 
145 /**
146  * Count element sides of the space dimension @p side_dim.
147  */
148 
149 unsigned int Element::n_sides_by_dim(unsigned int side_dim)
150 {
151  if (side_dim == dim()) return 1;
152 
153  unsigned int n = 0;
154  for (unsigned int i=0; i<n_sides(); i++)
155  if (side(i)->dim() == side_dim) n++;
156  return n;
157 }
158 
159 
161 {
162  return mesh_->element_accessor( mesh_->element.index(this) );
163 }
164 
165 
166 
168  return Region( region_idx_, mesh_->region_db());
169 }
170 
171 
172 unsigned int Element::id() const {
173  return mesh_->element.get_id(this);
174 }
175 
177  if (dim_==3) {
178  double sum_faces=0;
179  double face[4];
180  for(unsigned int i=0;i<4;i++) sum_faces+=( face[i]=side(i)->measure());
181 
182  double sum_pairs=0;
183  for(unsigned int i=0;i<3;i++)
184  for(unsigned int j=i+1;j<4;j++) {
185  unsigned int i_line = RefElement<3>::line_between_faces(i,j);
186  arma::vec line = *node[RefElement<3>::line_nodes[i_line][1]] - *node[RefElement<3>::line_nodes[i_line][0]];
187  sum_pairs += face[i]*face[j]*arma::dot(line, line);
188  }
189  double regular = (2.0*sqrt(2.0/3.0)/9.0); // regular tetrahedron
190  return fabs( measure()
191  * pow( sum_faces/sum_pairs, 3.0/4.0))/ regular;
192 
193  }
194  if (dim_==2) {
195  return fabs(
196  measure()/
197  pow(
198  arma::norm(*node[1] - *node[0], 2)
199  *arma::norm(*node[2] - *node[1], 2)
200  *arma::norm(*node[0] - *node[2], 2)
201  , 2.0/3.0)
202  ) / ( sqrt(3.0) / 4.0 ); // regular triangle
203  }
204  return 1.0;
205 }
206 
207 
208 void Element::get_bounding_box(BoundingBox &bounding_box) const
209 {
210  bounding_box = BoundingBox( this->node[0]->point() );
211 
212  for (unsigned int i=1; i<n_nodes(); i++)
213  bounding_box.expand( this->node[i]->point() );
214 }
215 
216 //-----------------------------------------------------------------------------
217 // vim: set cindent:
Bounding box in 3d ambient space.
Definition: bounding_box.hh:55
double measure() const
Definition: elements.cc:101
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:111
???
void expand(const Point &point)
Definition: mesh.h:109
#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:172
const RegionDB & region_db() const
Definition: mesh.h:155
ElementAccessor< 3 > element_accessor(unsigned int idx, bool boundary=false)
Definition: mesh.cc:670
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:167
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:208
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:132
unsigned int n_neighs_vb
Definition: elements.h:127
double quality_measure_smooth()
Definition: elements.cc:176
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:160
unsigned int n_sides_by_dim(unsigned int side_dim)
Definition: elements.cc:149
arma::vec3 & point()
Definition: nodes.hh:80
ElementVector element
Vector of elements of the mesh.
Definition: mesh.h:205