Jpp  18.1.0
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
JAcousticsSupportkit.hh
Go to the documentation of this file.
1 #ifndef __JACOUSTICS__JACOUSTICSSUPPORTKIT__
2 #define __JACOUSTICS__JACOUSTICSSUPPORTKIT__
3 
4 #include <istream>
5 #include <ostream>
6 #include <cmath>
7 
8 
9 /**
10  * \file
11  *
12  * Acoustics support kit.
13  * \author mdejong
14  */
15 namespace JACOUSTICS {}
16 namespace JPP { using namespace JACOUSTICS; }
17 
18 namespace JACOUSTICS {
19 
20  static const double TOAMIN_S = 0.0000000; //!< Minimal allowed time-of-arrival [s]
21  static const double TOAMAX_S = 0.6310912; //!< Maximal allowed time-of-arrival [s]
22 
23 
24  /**
25  * Auxiliary data structure for calculation of attenuation length.
26  *
27  * Attenuation according to Ainslie and McColm, J. Acoust. Soc. AM. 103 (3) 1671 1998.\n
28  * See also http://resource.npl.co.uk/acoustics/techguides/seaabsorption/physics.html for numerical values.
29  */
31  /**
32  * Constructor.
33  *
34  * \param T temperature [C]
35  * \param S salinity [pm]
36  * \param pH pH
37  */
38  JAttenuationLength(const double T,
39  const double S,
40  const double pH) :
41  T (T),
42  S (S),
43  pH(pH)
44  {}
45 
46 
47  /**
48  * Get attentuation length for given frequency at given depth.
49  *
50  * \param D_m depth [m]
51  * \param f_kHz frequency [kHz]
52  * \return attenuation length [m]
53  */
54  double operator()(const double D_m,
55  const double f_kHz) const
56  {
57  const double z = D_m * 1.0e-3;
58  const double f1 = 0.78 * sqrt(S/35.0) * exp(T/26.0);
59  const double f2 = 42.0 * exp(T/17.0);
60  const double a1 = 0.106 * f1*(f_kHz*f_kHz) / (f_kHz*f_kHz + f1*f1) * exp((pH-8.0)/0.56);
61  const double a2 = 0.52 * (1.0 + T/43.0) * (S/35.0) * f2 * f_kHz*f_kHz / (f_kHz*f_kHz + f2*f2) * exp(-z/6.0);
62  const double a0 = 0.00049 * exp(-T/27.0 + z/17.0) * f_kHz*f_kHz;
63  const double A = a0 + a1 + a2; // dB/km
64 
65  return 10.0e3 / (A*log(10.0));
66  }
67 
68  double T;
69  double S;
70  double pH;
71  };
72 
73 
74  /**
75  * Function object to calculate attenutation length.
76  */
77  static const JAttenuationLength getAttenuationLength(13.2, // temperature [deg]
78  38.0, // salinity [pm]
79  8.0); // pH
80 
81 
82 
83 
84  /**
85  * Get relative quality for given frequency at given distance.
86  *
87  * \param D_m depth [m]
88  * \param f_kHz frequency [kHz]
89  * \param d_m distance [m]
90  * \return quality
91  */
92  inline double getQ(const double D_m,
93  const double f_kHz,
94  const double d_m)
95  {
96  return exp(-0.5 * d_m / getAttenuationLength(D_m, f_kHz)) / d_m;
97  }
98 
99 
100  /**
101  * Utility class for emitter power and frequency.
102  */
103  struct JWaveform {
104  /**
105  * Default constructor.
106  */
108  Q0 (0.0),
109  f_kHz(0.0)
110  {}
111 
112 
113  /**
114  * Constructor.
115  *
116  * Note that the power corresponds to the minimal distance (see method JWaveform::getDmin()).
117  *
118  * \param Q0 power [quality]
119  * \param f_kHz frequency [kHz]
120  */
121  JWaveform(const double Q0,
122  const double f_kHz) :
123  Q0 (Q0),
124  f_kHz(f_kHz)
125  {}
126 
127 
128  /**
129  * Get minimal distance.
130  *
131  * \return distance [m]
132  */
133  static double getDmin()
134  {
135  return 1.0;
136  }
137 
138 
139  /**
140  * Get quality at given distance.
141  *
142  * \param D_m depth [m]
143  * \param d_m distance [m]
144  * \return quality
145  */
146  double getQ(const double D_m,
147  const double d_m) const
148  {
149  if (d_m > getDmin())
150  return Q0 * JPP::getQ(D_m, this->f_kHz, d_m) / JPP::getQ(D_m, this->f_kHz, getDmin());
151  else
152  return Q0;
153  }
154 
155 
156  /**
157  * Read waveform from input stream.
158  *
159  * \param in input stream
160  * \param waveform waveform
161  * \return input stream
162  */
163  friend inline std::istream& operator>>(std::istream& in, JWaveform& waveform)
164  {
165  return in >> waveform.Q0 >> waveform.f_kHz;
166  }
167 
168 
169  /**
170  * Write waveform to output stream.
171  *
172  * \param out output stream
173  * \param waveform waveform
174  * \return output stream
175  */
176  friend inline std::ostream& operator<<(std::ostream& out, const JWaveform& waveform)
177  {
178  return out << waveform.Q0 << ' ' << waveform.f_kHz;
179  }
180 
181  double Q0;
182  double f_kHz;
183  };
184 }
185 
186 #endif
double operator()(const double D_m, const double f_kHz) const
Get attentuation length for given frequency at given depth.
JWaveform()
Default constructor.
static const double TOAMIN_S
Minimal allowed time-of-arrival [s].
const JPolynome f1(1.0, 2.0, 3.0)
Function.
static const double TOAMAX_S
Maximal allowed time-of-arrival [s].
JAttenuationLength(const double T, const double S, const double pH)
Constructor.
friend std::istream & operator>>(std::istream &in, JWaveform &waveform)
Read waveform from input stream.
static const JAttenuationLength getAttenuationLength(13.2, 38.0, 8.0)
Function object to calculate attenutation length.
double getQ(const double D_m, const double d_m) const
Get quality at given distance.
double getQ(const double D_m, const double f_kHz, const double d_m)
Get relative quality for given frequency at given distance.
then set_variable DIR else fatal Wrong number of arguments fi for INPUT_FILE in ls rt $DIR stage * log
Auxiliary data structure for calculation of attenuation length.
static double getDmin()
Get minimal distance.
then fatal Wrong number of arguments fi set_variable DETECTOR $argv[1] set_variable INPUT_FILE $argv[2] eval JPrintDetector a $DETECTOR O IDENTIFIER eval JPrintDetector a $DETECTOR O SUMMARY JAcoustics sh $DETECTOR_ID source JAcousticsToolkit sh CHECK_EXIT_CODE typeset A EMITTERS get_tripods $WORKDIR tripod txt EMITTERS get_transmitters $WORKDIR transmitter txt EMITTERS for EMITTER in
Definition: JCanberra.sh:46
source $JPP_DIR setenv csh $JPP_DIR &dev null eval JShellParser o a A
JWaveform(const double Q0, const double f_kHz)
Constructor.
then fatal Wrong number of arguments fi set_variable DETECTOR $argv[1] set_variable STRING $argv[2] set_array QUANTILES set_variable FORMULA *[0] exp(-0.5 *(x-[1])*(x-[1])/([2]*[2]))" set_variable MODULE `getModule -a $DETECTOR -L "$STRING 0"` source JAcousticsToolkit.sh typeset -A TRIPODS get_tripods $WORKDIR/tripod.txt TRIPODS XMEAN
Utility class for emitter power and frequency.
friend std::ostream & operator<<(std::ostream &out, const JWaveform &waveform)
Write waveform to output stream.