World Ocean Simulation System (WOSS) library
time-arrival-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
32#ifndef TIME_ARRIVAL_DEFINITIONS_H
33#define TIME_ARRIVAL_DEFINITIONS_H
34
35
36#include <cassert>
37#include <climits>
38#include <map>
39#include <memory>
42
43
44namespace woss {
45
49 using TimeArrMap = std::map < PDouble , std::complex<double> >;
50 using TimeArrIt = TimeArrMap::iterator;
51 using TimeArrCIt = TimeArrMap::const_iterator;
52 using TimeArrRIt = TimeArrMap::reverse_iterator;
53 using TimeArrCRIt = TimeArrMap::const_reverse_iterator;
54
58 static constexpr inline double TIMEARR_CUSTOM_DELAY_PRECISION = (1.0e-7);
62 static constexpr inline int TIMEARR_PRESSURE_CONVERSION_DELAY = (-INT_MAX);
63
70 class TimeArr {
71
72 public:
73
78 TimeArr( long double custom_delay_prec = TIMEARR_CUSTOM_DELAY_PRECISION );
79
85 TimeArr( TimeArrMap& map, long double custom_delay_prec = TIMEARR_CUSTOM_DELAY_PRECISION );
86
93 explicit TimeArr( const Pressure& pressure, double delay = TIMEARR_PRESSURE_CONVERSION_DELAY, long double custom_delay_prec = TIMEARR_CUSTOM_DELAY_PRECISION );
94
95 TimeArr( const TimeArr& copy ) = default;
96
97 TimeArr( TimeArr&& tmp ) = default;
98
99 virtual ~TimeArr() = default;
100
105 virtual operator std::complex<double>() const;
106
112 virtual std::unique_ptr<TimeArr> create( long double custom_delay_prec = TIMEARR_CUSTOM_DELAY_PRECISION ) const { return std::make_unique<TimeArr>(custom_delay_prec); }
113
120 virtual std::unique_ptr<TimeArr> create( TimeArrMap& map, long double custom_delay_prec = TIMEARR_CUSTOM_DELAY_PRECISION ) const {
121 return std::make_unique<TimeArr>( map, custom_delay_prec); }
122
130 virtual std::unique_ptr<TimeArr> create( const Pressure& pressure, double delay = TIMEARR_PRESSURE_CONVERSION_DELAY, long double custom_delay_prec = TIMEARR_CUSTOM_DELAY_PRECISION ) const {
131 return std::make_unique<TimeArr>(pressure, delay, custom_delay_prec ); }
132
137 virtual std::unique_ptr<TimeArr> clone() const { return std::make_unique<TimeArr>(*this); }
138
144 virtual std::unique_ptr<TimeArr[]> createArray( unsigned int array_size ) const { return std::make_unique<TimeArr[]>(array_size); }
145
150 static TimeArrMap& createNotValid();
151
156 static TimeArrMap& createImpulse();
157
164 TimeArr& insertValue( double delay, const Pressure& pressure );
165
171 void sumValue( double delay, const Pressure& pressure );
172
178 TimeArrCIt findValue( double delay ) const { return( time_arr_map.find(delay) ); }
179
185 TimeArr& eraseValue( double delay ) { time_arr_map.erase(delay); return *this; }
186
193 virtual std::unique_ptr<TimeArr> coherentSumSample( double time_delay ) const;
194
201 virtual std::unique_ptr<TimeArr> incoherentSumSample( double time_delay ) const;
202
210 virtual std::unique_ptr<TimeArr> crop( double time_start, double time_end ) const;
211
219 virtual bool checkPressureAttenuation( double distance, double frequency );
220
225 TimeArrCIt begin() const { return time_arr_map.begin(); }
226
231 TimeArrCIt end() const { return time_arr_map.end(); }
232
237 TimeArrCRIt rbegin() const { return time_arr_map.rbegin(); }
238
243 TimeArrCRIt rend() const { return time_arr_map.rend(); }
244
250 TimeArrCIt at( const int i ) const ;
251
257 TimeArrCIt lowerBoundTxLoss( double threshold_db ) const;
258
263 int size() const { return time_arr_map.size(); }
264
269 bool empty() const { return time_arr_map.empty(); }
270
274 void clear() { time_arr_map.clear(); }
275
282 TimeArr& setDelayPrecision( long double precision );
283
288 static void setDebug( bool flag ) { debug = flag; }
289
294 double getMaxDelayValue() const { return( time_arr_map.rbegin()->first ); }
295
300 double getMinDelayValue() const { return( time_arr_map.begin()->first ); }
301
306 long double getDelayPrecision() const { return delay_precision; }
307
312 virtual bool isValid() const;
313
318 virtual bool isConvertedFromPressure() const { return( time_arr_map.size() == 1 && ( time_arr_map.begin()->first == PDouble(TIMEARR_PRESSURE_CONVERSION_DELAY) ) ); }
319
320 TimeArr& operator=( const TimeArr& copy ) = default;
321
322 TimeArr& operator=( TimeArr&& tmp ) = default;
323
330 friend bool operator==( const TimeArr& left, const TimeArr& right );
331
338 friend bool operator!=( const TimeArr& left, const TimeArr& right );
339
346 friend const TimeArr operator+( const TimeArr& left, const TimeArr& right );
347
354 friend const TimeArr operator-( const TimeArr& left, const TimeArr& right );
355
362 friend const TimeArr operator+( const TimeArr& left, const double right );
363
370 friend const TimeArr operator-( const TimeArr& left, const double right );
371
378 friend const TimeArr operator/( const TimeArr& left, const double right );
379
386 friend const TimeArr operator*( const TimeArr& left, const double right );
387
394 friend const TimeArr operator+( const double left, const TimeArr& right );
395
402 friend const TimeArr operator-( const double left, const TimeArr& right );
403
410 friend const TimeArr operator/( const double left, const TimeArr& right );
411
418 friend const TimeArr operator*( const double left, const TimeArr& right );
419
426 friend TimeArr& operator+=( TimeArr& left, const TimeArr& right );
427
434 friend TimeArr& operator-=( TimeArr& left, const TimeArr& right );
435
442 friend TimeArr& operator+=( TimeArr& left, double right );
443
450 friend TimeArr& operator-=( TimeArr& left, double right );
451
458 friend TimeArr& operator/=( TimeArr& left, double right );
459
466 friend TimeArr& operator*=( TimeArr& left, double right );
467
474 friend std::ostream& operator<<( std::ostream& os, const TimeArr& instance );
475
476 protected:
477
481 static bool debug;
482
486 long double delay_precision;
487
492
493 };
494
495 //non-inline operator declarations
497 const TimeArr operator+( const TimeArr& left, const TimeArr& right );
498
499 const TimeArr operator-( const TimeArr& left, const TimeArr& right );
500
501 const TimeArr operator+( const TimeArr& left, const double right );
502
503 const TimeArr operator-( const TimeArr& left, const double right );
504
505 const TimeArr operator/( const TimeArr& left, const double right );
506
507 const TimeArr operator*( const TimeArr& left, const double right );
508
509 const TimeArr operator+( const double left, const TimeArr& right );
510
511 const TimeArr operator-( const double left, const TimeArr& right );
512
513 const TimeArr operator/( const double left, const TimeArr& right );
514
515 const TimeArr operator*( const double left, const TimeArr& right );
516
517 TimeArr& operator+=( TimeArr& left, const TimeArr& right );
518
519 TimeArr& operator-=( TimeArr& left, const TimeArr& right );
520
521 TimeArr& operator+=( TimeArr& left, double right );
522
523 TimeArr& operator-=( TimeArr& left, double right );
524
525 TimeArr& operator/=( TimeArr& left, double right );
526
527 TimeArr& operator*=( TimeArr& left, double right );
528
530 //inline functions
537
540 time_arr_map.clear();
541 time_arr_map[0.0] = std::complex<double> (1.0 , 0.0);
542 return time_arr_map;
543 }
544
545 inline TimeArr& TimeArr::insertValue( double delay, const Pressure& pressure ) {
546 assert( pressure.isValid() );
547 assert( delay >= 0.0 );
548
549 time_arr_map.emplace( std::make_pair( delay, pressure ) );
550
551 return *this;
552 }
553
554 inline void TimeArr::sumValue( double delay, const Pressure& pressure ) {
555 assert( pressure.isValid() );
556 assert( delay >= 0.0 );
557
558 TimeArrIt it = time_arr_map.find( delay );
559 if ( it == time_arr_map.end() )
560 time_arr_map.emplace( std::make_pair( delay, pressure ) );
561 else
562 it->second += std::complex<double>( pressure );
563 }
564
565 inline std::ostream& operator<<( std::ostream& os, const TimeArr& instance ) {
566 os << "size = " << instance.time_arr_map.size() << "; min time_arr = " << instance.time_arr_map.begin()->first
567 << "; pressure db = " << Pressure::getTxLossDb(instance.begin()->second)
568 << "; max time_arr = " << instance.time_arr_map.rbegin()->first
569 << "; pressure db = " << Pressure::getTxLossDb(instance.time_arr_map.rbegin()->second);
570 return os;
571 }
572
573 inline bool operator==( const TimeArr& left, const TimeArr& right ) {
574 if ( &left == &right )
575 return true;
576 return( left.time_arr_map == right.time_arr_map );
577 }
578
579 inline bool operator!=( const TimeArr& left, const TimeArr& right ) {
580 if ( &left == &right )
581 return false;
582 return( left.time_arr_map != right.time_arr_map );
583 }
584
585}
586
587#endif /* TIME_ARRIVAL_DEFINITIONS_H */
588
Custom precision long double class.
Definition custom-precision-double.h:58
Complex attenuated pressure class.
Definition pressure-definitions.h:52
virtual bool isValid() const
Definition pressure-definitions.h:164
double getTxLossDb() const
Definition pressure-definitions.h:183
static constexpr std::complex< double > createNotValid()
Definition pressure-definitions.h:126
Channel power delay profile class.
Definition time-arrival-definitions.h:70
friend const TimeArr operator-(const double left, const TimeArr &right)
friend const TimeArr operator+(const TimeArr &left, const TimeArr &right)
TimeArrCIt findValue(double delay) const
Definition time-arrival-definitions.h:178
TimeArrCIt begin() const
Definition time-arrival-definitions.h:225
TimeArrCIt end() const
Definition time-arrival-definitions.h:231
TimeArr(const TimeArr &copy)=default
TimeArrCIt lowerBoundTxLoss(double threshold_db) const
Definition time-arrival-definitions.cpp:99
TimeArr & insertValue(double delay, const Pressure &pressure)
Definition time-arrival-definitions.h:545
friend TimeArr & operator+=(TimeArr &left, const TimeArr &right)
friend const TimeArr operator*(const double left, const TimeArr &right)
TimeArrCRIt rend() const
Definition time-arrival-definitions.h:243
friend const TimeArr operator+(const TimeArr &left, const double right)
double getMaxDelayValue() const
Definition time-arrival-definitions.h:294
virtual std::unique_ptr< TimeArr > create(TimeArrMap &map, long double custom_delay_prec=TIMEARR_CUSTOM_DELAY_PRECISION) const
Definition time-arrival-definitions.h:120
friend TimeArr & operator-=(TimeArr &left, double right)
virtual std::unique_ptr< TimeArr > create(long double custom_delay_prec=TIMEARR_CUSTOM_DELAY_PRECISION) const
Definition time-arrival-definitions.h:112
TimeArrCIt at(const int i) const
Definition time-arrival-definitions.cpp:86
friend const TimeArr operator-(const TimeArr &left, const TimeArr &right)
static TimeArrMap & createNotValid()
Definition time-arrival-definitions.h:531
friend TimeArr & operator/=(TimeArr &left, double right)
TimeArr & setDelayPrecision(long double precision)
Definition time-arrival-definitions.cpp:117
virtual bool isConvertedFromPressure() const
Definition time-arrival-definitions.h:318
virtual ~TimeArr()=default
friend const TimeArr operator-(const TimeArr &left, const double right)
virtual std::unique_ptr< TimeArr[]> createArray(unsigned int array_size) const
Definition time-arrival-definitions.h:144
double getMinDelayValue() const
Definition time-arrival-definitions.h:300
TimeArr & eraseValue(double delay)
Definition time-arrival-definitions.h:185
friend TimeArr & operator+=(TimeArr &left, double right)
virtual bool isValid() const
Definition time-arrival-definitions.cpp:77
virtual std::unique_ptr< TimeArr > create(const Pressure &pressure, double delay=TIMEARR_PRESSURE_CONVERSION_DELAY, long double custom_delay_prec=TIMEARR_CUSTOM_DELAY_PRECISION) const
Definition time-arrival-definitions.h:130
friend const TimeArr operator/(const double left, const TimeArr &right)
static void setDebug(bool flag)
Definition time-arrival-definitions.h:288
friend bool operator!=(const TimeArr &left, const TimeArr &right)
Definition time-arrival-definitions.h:579
virtual std::unique_ptr< TimeArr > crop(double time_start, double time_end) const
Definition time-arrival-definitions.cpp:172
static bool debug
Definition time-arrival-definitions.h:481
long double delay_precision
Definition time-arrival-definitions.h:486
friend const TimeArr operator*(const TimeArr &left, const double right)
TimeArr & operator=(const TimeArr &copy)=default
friend TimeArr & operator-=(TimeArr &left, const TimeArr &right)
friend const TimeArr operator+(const double left, const TimeArr &right)
friend std::ostream & operator<<(std::ostream &os, const TimeArr &instance)
Definition time-arrival-definitions.h:565
static TimeArrMap & createImpulse()
Definition time-arrival-definitions.h:538
virtual std::unique_ptr< TimeArr > incoherentSumSample(double time_delay) const
Definition time-arrival-definitions.cpp:155
virtual std::unique_ptr< TimeArr > clone() const
Definition time-arrival-definitions.h:137
TimeArr(TimeArr &&tmp)=default
friend const TimeArr operator/(const TimeArr &left, const double right)
TimeArrCRIt rbegin() const
Definition time-arrival-definitions.h:237
friend TimeArr & operator*=(TimeArr &left, double right)
virtual bool checkPressureAttenuation(double distance, double frequency)
Definition time-arrival-definitions.cpp:129
bool empty() const
Definition time-arrival-definitions.h:269
virtual std::unique_ptr< TimeArr > coherentSumSample(double time_delay) const
Definition time-arrival-definitions.cpp:142
int size() const
Definition time-arrival-definitions.h:263
void clear()
Definition time-arrival-definitions.h:274
long double getDelayPrecision() const
Definition time-arrival-definitions.h:306
friend bool operator==(const TimeArr &left, const TimeArr &right)
Definition time-arrival-definitions.h:573
TimeArrMap time_arr_map
Definition time-arrival-definitions.h:491
TimeArr & operator=(TimeArr &&tmp)=default
void sumValue(double delay, const Pressure &pressure)
Definition time-arrival-definitions.h:554
Provides the interface for the woss::PDouble class.
Definition ac-toolbox-arr-asc-reader.h:44
TimeArrMap::reverse_iterator TimeArrRIt
Definition time-arrival-definitions.h:52
bool operator!=(const Altimetry &left, const Altimetry &right)
Definition altimetry-definitions.h:833
TimeArrMap::iterator TimeArrIt
Definition time-arrival-definitions.h:50
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
std::map< PDouble, std::complex< double > > TimeArrMap
Definition time-arrival-definitions.h:49
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
TimeArrMap::const_iterator TimeArrCIt
Definition time-arrival-definitions.h:51
Altimetry & operator+=(Altimetry &left, const Altimetry &right)
Definition altimetry-definitions.cpp:306
TimeArrMap::const_reverse_iterator TimeArrCRIt
Definition time-arrival-definitions.h:53
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
Definitions and library for woss::Pressure class.