Code_TYMPAN  4.4.0
Industrial site acoustic simulation
entities.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) <2012-2024> <EDF-DTG> <FRANCE>
3  * This file is part of Code_TYMPAN (R).
4  * Code_TYMPAN (R) is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  * Code_TYMPAN (R) is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11  * See the GNU General Public License for more details.
12  * You should have received a copy of the GNU General Public License along
13  * with Code_TYMPAN (R). If not, see <https://www.gnu.org/licenses/>.
14  */
15 
25 #ifndef TYMPAN__ENTITIES_H__INCLUDED
26 #define TYMPAN__ENTITIES_H__INCLUDED
27 
28 #include "data_model_common.hpp"
30 
31 namespace tympan
32 {
36 class AcousticMaterialBase : public virtual BaseEntity
37 {
38 public:
40  AcousticMaterialBase(const string& name_);
42  virtual ComplexSpectrum get_absorption(double incidence_angle, double length)
43  {
44  return ComplexSpectrum();
45  }
46  virtual double get_ISO9613_G()
47  {
48  return 0.0;
49  }
50  string name;
51 
52 }; // class AcousticMaterialBase
53 
54 // TODO Or use boost pointers container ?
55 typedef shared_ptr<AcousticMaterialBase> material_ptr_t;
56 typedef std::deque<material_ptr_t> material_pool_t;
57 
58 // -------------------
59 
64 {
65 public:
67  AcousticBuildingMaterial(const string& name_, const ComplexSpectrum& spectrum);
70 
75  virtual ComplexSpectrum get_absorption(double incidence_angle, double length)
76  {
77  return spectrum;
78  }
79 
80  ComplexSpectrum asEyring() const;
81 
83 };
84 
85 // -------------------
86 
91 {
92 public:
94  AcousticGroundMaterial(const string& name_, double resistivity_, double deviation_, double length_,
95  double factor_g_);
98 
106  virtual ComplexSpectrum get_absorption(double incidence_angle, double length);
107 
108  const ComplexSpectrum& get_Zc() const
109  {
110  return Zc;
111  }
112  const ComplexSpectrum& get_K() const
113  {
114  return K;
115  }
116 
117  void set_thickness(double thickness_)
118  {
119  thickness = thickness_;
120  }
121  void set_deviation(double deviation_)
122  {
123  deviation = deviation_;
124  }
125  void set_length(double length_)
126  {
127  length = length_;
128  }
129  double get_ISO9613_G();
130 
131  static void set_atmosphere(AtmosphericConditions* atmosphere_)
132  {
133  atmosphere = atmosphere_;
134  }
135 
146  bool compare(const string& name, double resistivity, double deviation, double length, double factor_g);
147 
148 protected:
149  void computeZc();
150  void computeK();
151  void computeZs(double angle, ComplexSpectrum Z,
152  ComplexSpectrum& spectrum);
153  void computeZf(double angle, ComplexSpectrum Zs);
154  void computeRp(double angle, const ComplexSpectrum& Zs,
155  ComplexSpectrum& Rp);
156  void computeW(double angle, double length, const ComplexSpectrum& Zs,
157  ComplexSpectrum& W);
158  void computeFw(ComplexSpectrum localW, ComplexSpectrum& Fw);
159  void computeQ(double angle, ComplexSpectrum& Rp, ComplexSpectrum& Fw,
160  ComplexSpectrum& Q);
161 
163 
164 private:
165  void init();
166 
170  TYComplex erfcCas1(const TYComplex& wValue) const;
171  TYComplex erfcCas2(const TYComplex& wValue) const;
172  TYComplex erfcCas3(const TYComplex& wValue) const;
173 
177  TYComplex sgnReIm(const TYComplex& W, const TYComplex& G) const;
178 
179  void limit_W_values(ComplexSpectrum& localW);
180  void erfc_G_computation(const ComplexSpectrum& localW, ComplexSpectrum& G);
181  void sgn_G_computation(const ComplexSpectrum& localW, ComplexSpectrum& G);
182  double gaussianSpectrum(double const k, double const sigma, double const lc);
183  double trapz(std::vector<double> u, std::vector<double> integrande);
184 
185 protected:
187  double resistivity;
188  double thickness;
189  double deviation;
190  double length;
191  double factor_g;
192 
196 };
197 
198 // -------------------
199 
204 {
205  double a;
206  double h;
208 };
209 
210 // -------------------
211 
215 class AcousticTriangle : public virtual BaseEntity
216 {
217 public:
220 
221  node_idx n[3];
222  string volume_id;
223  shared_ptr<AcousticMaterialBase> made_of;
224  boost::shared_ptr<AcousticFaceGeomData> pFaceGeomData;
225 };
226 
227 typedef std::deque<AcousticTriangle> triangle_pool_t;
228 typedef size_t triangle_idx;
229 
230 // -------------------
231 
236 {
237 public:
239  virtual Spectrum lwAdjustment(Vector direction, double distance) = 0;
240 };
241 
242 // -------------------
247 {
248 public:
250 
251  virtual Spectrum lwAdjustment(Vector direction, double distance)
252  {
253  return Spectrum(1.0);
254  }
255 };
256 
257 // -------------------
258 
263 {
264 public:
266  CommonFaceDirectivity(const Vector& support_normal_, double support_size_)
267  : BaseEntity(), support_normal(support_normal_), support_size(support_size_)
268  {
269  }
270 
272 
274  {
275  return support_normal;
276  }
277 
278  static void set_atmosphere(AtmosphericConditions* atmosphere_)
279  {
280  atmosphere = atmosphere_;
281  }
282 
283 protected:
285  double support_size;
286 
288 };
289 
294 {
295 public:
296  VolumeFaceDirectivity(const Vector& support_normal_, double support_size_)
297  : CommonFaceDirectivity(support_normal_, support_size_)
298  {
299  }
300 
302 
303  virtual Spectrum lwAdjustment(Vector direction, double distance);
304 
305 private:
306  static const double _tabRA[];
307  static const double _tabCor[];
308 
309  double calculC(double distance);
310 };
311 //
312 // ------------------
313 //
314 #ifdef NB_KA
315  #undef NB_KA
316  #define NB_KA 38
317 #else
318  #define NB_KA 38
319 #endif
320 
321 #ifdef NB_THETA
322  #undef NB_THETA
323  #define NB_THETA 21
324 #else
325  #define NB_THETA 21
326 #endif
331 {
332 public:
333  ChimneyFaceDirectivity(const Vector& support_normal_, double support_size_)
334  : CommonFaceDirectivity(support_normal_, support_size_)
335  {
336  }
337 
339  virtual Spectrum lwAdjustment(Vector direction,
340  double distance);
341 
342 private:
343  double compute_q(int ka_idx, int theta_idx, double ka, double theta);
344 
345  static const double _tabQ[NB_KA][NB_THETA];
346 };
347 //
348 // -------------------------
349 //
351 #ifdef NB_KA
352  #undef NB_KA
353  #define NB_KA 9
354 #else
355  #define NB_KA 9
356 #endif
357 
359 #ifdef NB_THETA
360  #undef NB_THETA
361  #define NB_THETA 41
362 #else
363  #define NB_THETA 41
364 #endif
365 
370 {
371 public:
372  BaffledFaceDirectivity(const Vector& support_normal_, double support_size_)
373  : CommonFaceDirectivity(support_normal_, support_size_)
374  {
375  }
376 
378  virtual Spectrum lwAdjustment(Vector direction,
379  double distance);
380 
381 private:
382  static const double _tabQ[NB_KA][NB_THETA];
383  static const double _tabKa[NB_KA];
384 
385  double compute_q(int indice_Ka, int indice_theta, double ka, double theta);
386 
387  int find_Ka_idx(double ka);
388 };
389 
393 class AcousticSource : public virtual BaseEntity
394 {
395 public:
397  AcousticSource(const Point& point_, const Spectrum& spectrum_, SourceDirectivityInterface* directivity);
398 
399  virtual ~AcousticSource(){};
400 
404  string volume_id;
405  string face_id;
406 };
407 
408 typedef std::deque<AcousticSource> source_pool_t;
409 typedef size_t source_idx;
410 
411 // -------------------
415 class AcousticReceptor : public virtual BaseEntity
416 {
417 public:
419  AcousticReceptor(const Point& position_);
420  virtual ~AcousticReceptor(){};
421 
423 };
424 
425 typedef std::deque<AcousticReceptor> receptor_pool_t;
426 typedef size_t receptor_idx;
427 
428 // -------------------
429 
433 class GlobalContribution : public virtual BaseEntity
434 {
435 public:
437  virtual ~GlobalContribution(){};
438 
439  // XXX Add some attrs?
440 };
441 
442 // -------------------
443 
448 {
449 public:
450  DirectivityCoefficient(double value_, double theta_, double phi_,
451  bool solid_angle_);
453 
454  double value;
455  double theta;
456  double phi;
457  // XXX not sure for the type below.
459 };
460 
461 Point ComputeAcousticCentroid(const source_pool_t& tabSources_);
462 
463 } /* namespace tympan */
464 
465 #endif /* TYMPAN__ENTITIES_H__INCLUDED */
Class for the definition of atmospheric conditions.
The 3D point class.
Definition: 3d.h:487
The 3D vector class.
Definition: 3d.h:298
Describes building material.
Definition: entities.hpp:64
AcousticBuildingMaterial(const string &name_, const ComplexSpectrum &spectrum)
Constructor.
Definition: entities.cpp:38
virtual ~AcousticBuildingMaterial()
Destructor.
Definition: entities.hpp:69
ComplexSpectrum asEyring() const
Returns a spectrum with Eyring formulae.
Definition: entities.cpp:43
virtual ComplexSpectrum get_absorption(double incidence_angle, double length)
: Get material absorption at reflection point
Definition: entities.hpp:75
ComplexSpectrum spectrum
Spectrum to store acoustic values at different frequencies.
Definition: entities.hpp:82
Describes the ground material, a specific AcousticBuildingMaterial.
Definition: entities.hpp:91
double get_ISO9613_G()
Absorption given by ISO9613.
Definition: entities.cpp:90
ComplexSpectrum K
Wave number.
Definition: entities.hpp:194
void sgn_G_computation(const ComplexSpectrum &localW, ComplexSpectrum &G)
Definition: entities.cpp:366
void computeW(double angle, double length, const ComplexSpectrum &Zs, ComplexSpectrum &W)
Compute numeric distance.
Definition: entities.cpp:267
void set_length(double length_)
Set wave length.
Definition: entities.hpp:125
void computeZs(double angle, ComplexSpectrum Z, ComplexSpectrum &spectrum)
Compute specific impedance.
Definition: entities.cpp:130
void set_deviation(double deviation_)
Set deviation.
Definition: entities.hpp:121
TYComplex erfcCas1(const TYComplex &wValue) const
: Functions used in Fw computation
Definition: entities.cpp:428
void computeZc()
Compute characteristic impedance.
Definition: entities.cpp:95
static AtmosphericConditions * atmosphere
Pointer to current atmosphere.
Definition: entities.hpp:162
void limit_W_values(ComplexSpectrum &localW)
Definition: entities.cpp:318
ComplexSpectrum Zf
Effective impedance.
Definition: entities.hpp:195
double trapz(std::vector< double > u, std::vector< double > integrande)
Definition: entities.cpp:241
double gaussianSpectrum(double const k, double const sigma, double const lc)
Definition: entities.cpp:236
virtual ~AcousticGroundMaterial()
Destructor.
Definition: entities.hpp:97
TYComplex erfcCas2(const TYComplex &wValue) const
Definition: entities.cpp:497
AcousticGroundMaterial(const string &name_, double resistivity_, double deviation_, double length_, double factor_g_)
Constructor.
Definition: entities.cpp:51
void set_thickness(double thickness_)
Set thickness.
Definition: entities.hpp:117
static void set_atmosphere(AtmosphericConditions *atmosphere_)
Set pointer to current atmosphere.
Definition: entities.hpp:131
const ComplexSpectrum & get_K() const
Get wave number.
Definition: entities.hpp:112
virtual ComplexSpectrum get_absorption(double incidence_angle, double length)
Get material absorption at reflection point.
Definition: entities.cpp:74
void computeK()
Compute wave number.
Definition: entities.cpp:111
ComplexSpectrum Zc
Characteristic impedance.
Definition: entities.hpp:193
TYComplex erfcCas3(const TYComplex &wValue) const
Definition: entities.cpp:508
TYComplex sgnReIm(const TYComplex &W, const TYComplex &G) const
: function used in G computation
Definition: entities.cpp:519
void computeFw(ComplexSpectrum localW, ComplexSpectrum &Fw)
Compute function of numeric distance.
Definition: entities.cpp:290
const ComplexSpectrum & get_Zc() const
Get characteristic impedance.
Definition: entities.hpp:108
void erfc_G_computation(const ComplexSpectrum &localW, ComplexSpectrum &G)
Definition: entities.cpp:337
void computeZf(double angle, ComplexSpectrum Zs)
Compute effective impedance in rough ground.
Definition: entities.cpp:153
void computeRp(double angle, const ComplexSpectrum &Zs, ComplexSpectrum &Rp)
Compute reflection coefficient for plane waves.
Definition: entities.cpp:250
void computeQ(double angle, ComplexSpectrum &Rp, ComplexSpectrum &Fw, ComplexSpectrum &Q)
Compute reflection coefficient.
Definition: entities.cpp:411
bool compare(const string &name, double resistivity, double deviation, double length, double factor_g)
Compare this AcousticGroundMaterial to another one.
Definition: entities.cpp:65
Base class for material.
Definition: entities.hpp:37
string name
Material name.
Definition: entities.hpp:50
AcousticMaterialBase(const string &name_)
Constructor.
Definition: entities.cpp:33
virtual double get_ISO9613_G()
Definition: entities.hpp:46
virtual ComplexSpectrum get_absorption(double incidence_angle, double length)
Virtual method to return material absorption at reflection point.
Definition: entities.hpp:42
Describes an acoustic receptor.
Definition: entities.hpp:416
AcousticReceptor(const Point &position_)
Constructor to build a receptor defined by the its position.
Definition: entities.cpp:1108
Point position
Destructor.
Definition: entities.hpp:420
Describes an acoustic source.
Definition: entities.hpp:394
AcousticSource(const Point &point_, const Spectrum &spectrum_, SourceDirectivityInterface *directivity)
Constructor to build a source defined by a point, spectrum, directivity.
Definition: entities.cpp:1100
string volume_id
Volume id.
Definition: entities.hpp:404
SourceDirectivityInterface * directivity
Pointer to the source directivity.
Definition: entities.hpp:403
Spectrum spectrum
Associated spectrum.
Definition: entities.hpp:402
string face_id
Face id.
Definition: entities.hpp:405
Point position
Destructor.
Definition: entities.hpp:399
virtual ~AcousticSource()
Definition: entities.hpp:399
Describing a triangle.
Definition: entities.hpp:216
node_idx n[3]
Triangle vertexes.
Definition: entities.hpp:221
shared_ptr< AcousticMaterialBase > made_of
Pointer to the material.
Definition: entities.hpp:223
boost::shared_ptr< AcousticFaceGeomData > pFaceGeomData
Definition: entities.hpp:224
AcousticTriangle(node_idx n1, node_idx n2, node_idx n3)
Constructor with the 3 vertexes of the triangle.
string volume_id
Volume id.
Definition: entities.hpp:222
Directivity for a baffled face.
Definition: entities.hpp:370
static const double _tabKa[NB_KA]
Definition: entities.hpp:383
virtual Spectrum lwAdjustment(Vector direction, double distance)
Directivity of a baffled face source.
Definition: entities.cpp:1030
double compute_q(int indice_Ka, int indice_theta, double ka, double theta)
Definition: entities.cpp:1066
static const double _tabQ[NB_KA][NB_THETA]
Definition: entities.hpp:382
~BaffledFaceDirectivity()
Destructor.
Definition: entities.hpp:377
BaffledFaceDirectivity(const Vector &support_normal_, double support_size_)
Constructor.
Definition: entities.hpp:372
The base of all entity classes.
Directivity for a chimney face.
Definition: entities.hpp:331
virtual Spectrum lwAdjustment(Vector direction, double distance)
Directivity of a chimney face source.
Definition: entities.cpp:754
static const double _tabQ[NB_KA][NB_THETA]
Definition: entities.hpp:345
ChimneyFaceDirectivity(const Vector &support_normal_, double support_size_)
Constructor.
Definition: entities.hpp:333
double compute_q(int ka_idx, int theta_idx, double ka, double theta)
Definition: entities.cpp:787
~ChimneyFaceDirectivity()
Destructor.
Definition: entities.hpp:338
BaseEntity class for directivity on face.
Definition: entities.hpp:263
static AtmosphericConditions * atmosphere
Characteristic size of support face.
Definition: entities.hpp:287
double support_size
Normal of support face.
Definition: entities.hpp:285
CommonFaceDirectivity(const Vector &support_normal_, double support_size_)
Constructor.
Definition: entities.hpp:266
static void set_atmosphere(AtmosphericConditions *atmosphere_)
Definition: entities.hpp:278
~CommonFaceDirectivity()
Destructor.
Definition: entities.hpp:271
Directivity coefficient.
Definition: entities.hpp:448
DirectivityCoefficient(double value_, double theta_, double phi_, bool solid_angle_)
Constructor.
Global contribution.
Definition: entities.hpp:434
Interface for source directivity classes (SphericalSourceDirectivity, CommonFaceDirectivity,...
Definition: entities.hpp:236
virtual Spectrum lwAdjustment(Vector direction, double distance)=0
< Pure virtual method to return directivity of the Source
Directivity for a spherical source.
Definition: entities.hpp:247
virtual Spectrum lwAdjustment(Vector direction, double distance)
Directivity of a spherical source.
Definition: entities.hpp:251
Directivity for a volume face.
Definition: entities.hpp:294
double calculC(double distance)
Compute directivity factor.
Definition: entities.cpp:540
~VolumeFaceDirectivity()
Destructor.
Definition: entities.hpp:301
VolumeFaceDirectivity(const Vector &support_normal_, double support_size_)
Constructor.
Definition: entities.hpp:296
virtual Spectrum lwAdjustment(Vector direction, double distance)
Directivity of a volume face.
Definition: entities.cpp:563
static const double _tabRA[]
RA form factor.
Definition: entities.hpp:306
static const double _tabCor[]
Correction factors.
Definition: entities.hpp:307
Common utilities and includes for all data models.
#define NB_KA
Number of KA values in the array.
Definition: entities.hpp:353
#define NB_THETA
Number of theta values in the array.
Definition: entities.hpp:361
std::complex< double > TYComplex
Definition: macros.h:25
OSpectreComplex ComplexSpectrum
std::deque< AcousticSource > source_pool_t
Array of sources.
Definition: entities.hpp:408
size_t triangle_idx
Definition: entities.hpp:228
size_t source_idx
Definition: entities.hpp:409
Point ComputeAcousticCentroid(const source_pool_t &tabSources_)
Definition: entities.cpp:1110
std::deque< AcousticReceptor > receptor_pool_t
Array of receptors.
Definition: entities.hpp:425
OSpectre Spectrum
size_t receptor_idx
Definition: entities.hpp:426
std::deque< material_ptr_t > material_pool_t
Definition: entities.hpp:56
shared_ptr< AcousticMaterialBase > material_ptr_t
Definition: entities.hpp:55
std::deque< AcousticTriangle > triangle_pool_t
Array of AcousticTriangle.
Definition: entities.hpp:227
size_t node_idx
Data structure to store geometrical data of the surface from which comes a triangle.
Definition: entities.hpp:204
double h
Vertical extension of the surface.
Definition: entities.hpp:206
double a
Horizontal extension of the surface.
Definition: entities.hpp:205
OVector3D n
Normal to the surface.
Definition: entities.hpp:207