World Ocean Simulation System (WOSS) library
pressure-definitions.h
Go to the documentation of this file.
1/* WOSS - World Ocean Simulation System -
2 *
3 * Copyright (C) 2009 2025 Federico Guerra
4 * and regents of the SIGNET lab, University of Padova
5 *
6 * Author: Federico Guerra - WOSS@guerra-tlc.com
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation;
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21
22
33#ifndef PRESSURE_DEFINITIONS_H
34#define PRESSURE_DEFINITIONS_H
35
36
37#include <complex>
38#include <memory>
39#include <ostream>
40
41namespace woss {
42
43 class TimeArr;
44
52 class Pressure {
53
54 public:
55
61 Pressure( double real = 0.0, double imag = 0.0 );
62
67 Pressure( const std::complex<double>& complex_press );
68
73 explicit Pressure( const TimeArr& time_arr );
74
75 Pressure( const Pressure& copy ) = default;
76
77 Pressure( Pressure&& tmp ) = default;
78
79 virtual ~Pressure() = default;
80
87 virtual std::unique_ptr<Pressure> create( double real = 0.0, double imag = 0.0 ) const { return std::make_unique<Pressure>( real, imag ); }
88
94 virtual std::unique_ptr<Pressure> create( const std::complex<double>& complex_press ) const { return std::make_unique<Pressure>( complex_press ); }
95
101 virtual std::unique_ptr<Pressure> create( const TimeArr& time_arr ) const { return std::make_unique<Pressure>( time_arr ); }
102
107 virtual std::unique_ptr<Pressure> clone() const { return std::make_unique<Pressure>(*this); }
108
114 virtual std::unique_ptr<Pressure[]> createArray( unsigned int array_size ) const { return std::make_unique<Pressure[]>(array_size); }
115
120 operator std::complex<double>() const { return complex_pressure; }
121
126 static constexpr std::complex<double> createNotValid() { return( std::complex<double>( HUGE_VAL, HUGE_VAL ) ); }
127
128 void clear() { complex_pressure = {0.0, 0.0}; };
129
134 double real() const { return complex_pressure.real(); }
135
140 double imag() const { return complex_pressure.imag(); }
141
146 double abs() const { return std::abs( complex_pressure ); }
147
152 double phase() const { return std::arg( complex_pressure ); }
153
158 Pressure sqrt() const { return std::sqrt( complex_pressure ); }
159
164 virtual bool isValid() const { return( complex_pressure != std::complex<double>( HUGE_VAL, HUGE_VAL ) ); }
165
170 static constexpr double getTxLossDb( const std::complex<double>& val ) {
171 if ( val == std::complex<double>( HUGE_VAL, HUGE_VAL ) )
172 return -HUGE_VAL;
173 else if( val == std::complex<double>( 0.0, 0.0 ) )
174 return HUGE_VAL;
175 else
176 return( -20.0 * log10( std::abs(val) ) );
177 }
178
183 double getTxLossDb() const {
184 if (isValid() == false)
185 return -HUGE_VAL;
186 else if ( complex_pressure == std::complex<double>( 0.0, 0.0 ) )
187 return HUGE_VAL;
188 else
189 return ( -20.0 * log10( abs() ));
190 }
191
200 virtual bool checkAttenuation( double distance, double frequency );
201
206 static void setDebug( bool flag ) { debug = flag; }
207
208 Pressure& operator=( const Pressure& copy ) = default;
209
210 Pressure& operator=( Pressure&& tmp ) = default;
211
218 friend const Pressure operator+( const Pressure& left, const Pressure& right );
219
226 friend const Pressure operator-( const Pressure& left, const Pressure& right );
227
234 friend const Pressure operator/( const Pressure& left, const Pressure& right );
235
242 friend const Pressure operator*( const Pressure& left, const Pressure& right );
243
250 friend Pressure& operator+=( Pressure& left, const Pressure& right );
251
258 friend Pressure& operator-=( Pressure& left, const Pressure& right );
259
266 friend Pressure& operator/=( Pressure& left, const Pressure& right );
267
274 friend Pressure& operator*=( Pressure& left, const Pressure& right );
275
282 friend bool operator==( const Pressure& left, const Pressure& right );
283
290 friend bool operator!=( const Pressure& left, const Pressure& right );
291
298 friend std::ostream& operator<<( std::ostream& os, const Pressure& instance );
299
300 protected:
301
305 static bool debug;
306
310 std::complex< double > complex_pressure;
311
318 virtual double getAttenuation( double dist, double freq ) const;
319
325 constexpr double getThorpAtt( double frequency ) const;
326
327 };
328
329 //inline functions
331 inline bool operator==( const Pressure& left, const Pressure& right ) {
332 if ( &left == &right )
333 return true;
334 return( left.complex_pressure == right.complex_pressure );
335 }
336
337 inline bool operator!=( const Pressure& left, const Pressure& right ) {
338 if ( &left == &right )
339 return false;
340 return( left.complex_pressure != right.complex_pressure );
341 }
342
343 inline const Pressure operator+( const Pressure& left, const Pressure& right ) {
344 return( Pressure( left.complex_pressure + right.complex_pressure ) );
345 }
346
347 inline const Pressure operator-( const Pressure& left, const Pressure& right ) {
348 return( Pressure( left.complex_pressure - right.complex_pressure ) );
349 }
350
351 inline const Pressure operator/( const Pressure& left, const Pressure& right ) {
352 return( Pressure( left.complex_pressure / right.complex_pressure ) );
353 }
354
355 inline const Pressure operator*( const Pressure& left, const Pressure& right ) {
356 return( Pressure( left.complex_pressure * right.complex_pressure ) );
357 }
358
359
360 inline Pressure& operator+=( Pressure& left, const Pressure& right ) {
362 return left;
363 }
364
365 inline Pressure& operator-=( Pressure& left, const Pressure& right ) {
367 return left;
368 }
369
370 inline Pressure& operator/=( Pressure& left, const Pressure& right ) {
372 return left;
373 }
374
375 inline Pressure& operator*=( Pressure& left, const Pressure& right ) {
377 return left;
378 }
379
380 inline std::ostream& operator<<( std::ostream& os, const Pressure& instance ) {
381 os << instance.complex_pressure << " TL = " << instance.getTxLossDb() << " dB";
382 return os;
383 }
384
385}
386
387#endif /* PRESSURE_DEFINITIONS_H */
Complex attenuated pressure class.
Definition pressure-definitions.h:52
friend const Pressure operator+(const Pressure &left, const Pressure &right)
Definition pressure-definitions.h:343
friend std::ostream & operator<<(std::ostream &os, const Pressure &instance)
Definition pressure-definitions.h:380
Pressure & operator=(Pressure &&tmp)=default
friend const Pressure operator*(const Pressure &left, const Pressure &right)
Definition pressure-definitions.h:355
virtual std::unique_ptr< Pressure[]> createArray(unsigned int array_size) const
Definition pressure-definitions.h:114
friend Pressure & operator+=(Pressure &left, const Pressure &right)
Definition pressure-definitions.h:360
virtual std::unique_ptr< Pressure > create(double real=0.0, double imag=0.0) const
Definition pressure-definitions.h:87
static void setDebug(bool flag)
Definition pressure-definitions.h:206
static bool debug
Definition pressure-definitions.h:305
virtual std::unique_ptr< Pressure > create(const std::complex< double > &complex_press) const
Definition pressure-definitions.h:94
Pressure sqrt() const
Definition pressure-definitions.h:158
Pressure(Pressure &&tmp)=default
friend Pressure & operator/=(Pressure &left, const Pressure &right)
Definition pressure-definitions.h:370
std::complex< double > complex_pressure
Definition pressure-definitions.h:310
friend Pressure & operator*=(Pressure &left, const Pressure &right)
Definition pressure-definitions.h:375
static constexpr double getTxLossDb(const std::complex< double > &val)
Definition pressure-definitions.h:170
virtual bool isValid() const
Definition pressure-definitions.h:164
friend const Pressure operator-(const Pressure &left, const Pressure &right)
Definition pressure-definitions.h:347
friend bool operator!=(const Pressure &left, const Pressure &right)
Definition pressure-definitions.h:337
Pressure(const Pressure &copy)=default
constexpr double getThorpAtt(double frequency) const
Definition pressure-definitions.cpp:99
friend const Pressure operator/(const Pressure &left, const Pressure &right)
Definition pressure-definitions.h:351
double real() const
Definition pressure-definitions.h:134
double abs() const
Definition pressure-definitions.h:146
double phase() const
Definition pressure-definitions.h:152
virtual std::unique_ptr< Pressure > create(const TimeArr &time_arr) const
Definition pressure-definitions.h:101
virtual ~Pressure()=default
virtual bool checkAttenuation(double distance, double frequency)
Definition pressure-definitions.cpp:67
friend bool operator==(const Pressure &left, const Pressure &right)
Definition pressure-definitions.h:331
void clear()
Definition pressure-definitions.h:128
virtual double getAttenuation(double dist, double freq) const
Definition pressure-definitions.cpp:84
friend Pressure & operator-=(Pressure &left, const Pressure &right)
Definition pressure-definitions.h:365
double imag() const
Definition pressure-definitions.h:140
virtual std::unique_ptr< Pressure > clone() const
Definition pressure-definitions.h:107
double getTxLossDb() const
Definition pressure-definitions.h:183
Pressure & operator=(const Pressure &copy)=default
static constexpr std::complex< double > createNotValid()
Definition pressure-definitions.h:126
Channel power delay profile class.
Definition time-arrival-definitions.h:70
Definition ac-toolbox-arr-asc-reader.h:44
bool operator!=(const Altimetry &left, const Altimetry &right)
Definition altimetry-definitions.h:833
std::ostream & operator<<(std::ostream &os, const Altimetry &instance)
Definition altimetry-definitions.h:812
Altimetry & operator*=(Altimetry &left, double right)
Definition altimetry-definitions.cpp:346
const Altimetry operator/(const Altimetry &left, const double right)
Definition altimetry-definitions.cpp:264
bool operator==(const Altimetry &left, const Altimetry &right)
Definition altimetry-definitions.h:826
Altimetry & operator+=(Altimetry &left, const Altimetry &right)
Definition altimetry-definitions.cpp:306
const Altimetry operator+(const Altimetry &left, const Altimetry &right)
Definition altimetry-definitions.cpp:236
const Altimetry operator*(const Altimetry &left, const double right)
Definition altimetry-definitions.cpp:271
Altimetry & operator-=(Altimetry &left, const Altimetry &right)
Definition altimetry-definitions.cpp:314
const Altimetry operator-(const Altimetry &left, const Altimetry &right)
Definition altimetry-definitions.cpp:243
Altimetry & operator/=(Altimetry &left, double right)
Definition altimetry-definitions.cpp:338