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 
203 class AcousticTriangle : public virtual BaseEntity
204 {
205 public:
208 
209  node_idx n[3];
210  string volume_id;
211  shared_ptr<AcousticMaterialBase> made_of;
212 };
213 
214 typedef std::deque<AcousticTriangle> triangle_pool_t;
215 typedef size_t triangle_idx;
216 
217 // -------------------
218 
223 {
224 public:
226  virtual Spectrum lwAdjustment(Vector direction, double distance) = 0;
227 };
228 
229 // -------------------
234 {
235 public:
237 
238  virtual Spectrum lwAdjustment(Vector direction, double distance)
239  {
240  return Spectrum(1.0);
241  }
242 };
243 
244 // -------------------
245 
250 {
251 public:
253  CommonFaceDirectivity(const Vector& support_normal_, double support_size_)
254  : BaseEntity(), support_normal(support_normal_), support_size(support_size_)
255  {
256  }
257 
259 
261  {
262  return support_normal;
263  }
264 
265  static void set_atmosphere(AtmosphericConditions* atmosphere_)
266  {
267  atmosphere = atmosphere_;
268  }
269 
270 protected:
272  double support_size;
273 
275 };
276 
281 {
282 public:
283  VolumeFaceDirectivity(const Vector& support_normal_, double support_size_)
284  : CommonFaceDirectivity(support_normal_, support_size_)
285  {
286  }
287 
289 
290  virtual Spectrum lwAdjustment(Vector direction, double distance);
291 
292 private:
293  static const double _tabRA[];
294  static const double _tabCor[];
295 
296  double calculC(double distance);
297 };
298 //
299 // ------------------
300 //
301 #ifdef NB_KA
302  #undef NB_KA
303  #define NB_KA 38
304 #else
305  #define NB_KA 38
306 #endif
307 
308 #ifdef NB_THETA
309  #undef NB_THETA
310  #define NB_THETA 21
311 #else
312  #define NB_THETA 21
313 #endif
318 {
319 public:
320  ChimneyFaceDirectivity(const Vector& support_normal_, double support_size_)
321  : CommonFaceDirectivity(support_normal_, support_size_)
322  {
323  }
324 
326  virtual Spectrum lwAdjustment(Vector direction,
327  double distance);
328 
329 private:
330  double compute_q(int ka_idx, int theta_idx, double ka, double theta);
331 
332  static const double _tabQ[NB_KA][NB_THETA];
333 };
334 //
335 // -------------------------
336 //
338 #ifdef NB_KA
339  #undef NB_KA
340  #define NB_KA 9
341 #else
342  #define NB_KA 9
343 #endif
344 
346 #ifdef NB_THETA
347  #undef NB_THETA
348  #define NB_THETA 41
349 #else
350  #define NB_THETA 41
351 #endif
352 
357 {
358 public:
359  BaffledFaceDirectivity(const Vector& support_normal_, double support_size_)
360  : CommonFaceDirectivity(support_normal_, support_size_)
361  {
362  }
363 
365  virtual Spectrum lwAdjustment(Vector direction,
366  double distance);
367 
368 private:
369  static const double _tabQ[NB_KA][NB_THETA];
370  static const double _tabKa[NB_KA];
371 
372  double compute_q(int indice_Ka, int indice_theta, double ka, double theta);
373 
374  int find_Ka_idx(double ka);
375 };
376 
380 class AcousticSource : public virtual BaseEntity
381 {
382 public:
384  AcousticSource(const Point& point_, const Spectrum& spectrum_, SourceDirectivityInterface* directivity);
385 
386  virtual ~AcousticSource(){};
387 
391  string volume_id;
392  string face_id;
393 };
394 
395 typedef std::deque<AcousticSource> source_pool_t;
396 typedef size_t source_idx;
397 
398 // -------------------
402 class AcousticReceptor : public virtual BaseEntity
403 {
404 public:
406  AcousticReceptor(const Point& position_);
407  virtual ~AcousticReceptor(){};
408 
410 };
411 
412 typedef std::deque<AcousticReceptor> receptor_pool_t;
413 typedef size_t receptor_idx;
414 
415 // -------------------
416 
420 class GlobalContribution : public virtual BaseEntity
421 {
422 public:
424  virtual ~GlobalContribution(){};
425 
426  // XXX Add some attrs?
427 };
428 
429 // -------------------
430 
435 {
436 public:
437  DirectivityCoefficient(double value_, double theta_, double phi_,
438  bool solid_angle_);
440 
441  double value;
442  double theta;
443  double phi;
444  // XXX not sure for the type below.
446 };
447 
448 Point ComputeAcousticCentroid(const source_pool_t& tabSources_);
449 
450 } /* namespace tympan */
451 
452 #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:403
AcousticReceptor(const Point &position_)
Constructor to build a receptor defined by the its position.
Definition: entities.cpp:1108
Point position
Destructor.
Definition: entities.hpp:407
Describes an acoustic source.
Definition: entities.hpp:381
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:391
SourceDirectivityInterface * directivity
Pointer to the source directivity.
Definition: entities.hpp:390
Spectrum spectrum
Associated spectrum.
Definition: entities.hpp:389
string face_id
Face id.
Definition: entities.hpp:392
Point position
Destructor.
Definition: entities.hpp:386
virtual ~AcousticSource()
Definition: entities.hpp:386
Describing a triangle.
Definition: entities.hpp:204
node_idx n[3]
Triangle vertexes.
Definition: entities.hpp:209
shared_ptr< AcousticMaterialBase > made_of
Pointer to the material.
Definition: entities.hpp:211
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:210
Directivity for a baffled face.
Definition: entities.hpp:357
static const double _tabKa[NB_KA]
Definition: entities.hpp:370
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:369
~BaffledFaceDirectivity()
Destructor.
Definition: entities.hpp:364
BaffledFaceDirectivity(const Vector &support_normal_, double support_size_)
Constructor.
Definition: entities.hpp:359
The base of all entity classes.
Directivity for a chimney face.
Definition: entities.hpp:318
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:332
ChimneyFaceDirectivity(const Vector &support_normal_, double support_size_)
Constructor.
Definition: entities.hpp:320
double compute_q(int ka_idx, int theta_idx, double ka, double theta)
Definition: entities.cpp:787
~ChimneyFaceDirectivity()
Destructor.
Definition: entities.hpp:325
BaseEntity class for directivity on face.
Definition: entities.hpp:250
static AtmosphericConditions * atmosphere
Characteristic size of support face.
Definition: entities.hpp:274
double support_size
Normal of support face.
Definition: entities.hpp:272
CommonFaceDirectivity(const Vector &support_normal_, double support_size_)
Constructor.
Definition: entities.hpp:253
static void set_atmosphere(AtmosphericConditions *atmosphere_)
Definition: entities.hpp:265
~CommonFaceDirectivity()
Destructor.
Definition: entities.hpp:258
Directivity coefficient.
Definition: entities.hpp:435
DirectivityCoefficient(double value_, double theta_, double phi_, bool solid_angle_)
Constructor.
Global contribution.
Definition: entities.hpp:421
Interface for source directivity classes (SphericalSourceDirectivity, CommonFaceDirectivity,...
Definition: entities.hpp:223
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:234
virtual Spectrum lwAdjustment(Vector direction, double distance)
Directivity of a spherical source.
Definition: entities.hpp:238
Directivity for a volume face.
Definition: entities.hpp:281
double calculC(double distance)
Compute directivity factor.
Definition: entities.cpp:540
~VolumeFaceDirectivity()
Destructor.
Definition: entities.hpp:288
VolumeFaceDirectivity(const Vector &support_normal_, double support_size_)
Constructor.
Definition: entities.hpp:283
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:293
static const double _tabCor[]
Correction factors.
Definition: entities.hpp:294
Common utilities and includes for all data models.
#define NB_KA
Number of KA values in the array.
Definition: entities.hpp:340
#define NB_THETA
Number of theta values in the array.
Definition: entities.hpp:348
std::complex< double > TYComplex
Definition: macros.h:25
OSpectreComplex ComplexSpectrum
std::deque< AcousticSource > source_pool_t
Array of sources.
Definition: entities.hpp:395
size_t triangle_idx
Definition: entities.hpp:215
size_t source_idx
Definition: entities.hpp:396
Point ComputeAcousticCentroid(const source_pool_t &tabSources_)
Definition: entities.cpp:1110
std::deque< AcousticReceptor > receptor_pool_t
Array of receptors.
Definition: entities.hpp:412
OSpectre Spectrum
size_t receptor_idx
Definition: entities.hpp:413
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:214
size_t node_idx