World Ocean Simulation System (WOSS) library
woss-manager.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 WOSS_MANAGER_DEFINITIONS_H
33#define WOSS_MANAGER_DEFINITIONS_H
34
35#if defined (WOSS_MULTITHREAD)
36#include <set>
37#include <map>
38#include <thread>
39#include <mutex>
40#include <shared_mutex>
41#include <condition_variable>
42#endif // defined (WOSS_MULTITHREAD)
43#include <utility>
44#include <vector>
45#include <memory>
46#include <definitions-handler.h>
47#include "woss-creator.h"
48#include <woss-db-manager.h>
49
50
51namespace woss {
52
56 using CoordZPair = std::pair< CoordZ, CoordZ >;
57
61 using CoordZPairVect = std::vector< CoordZPair >;
62
66 using SimFreq = std::pair< double, double >;
67
71 using SimFreqVector = std::vector< SimFreq >;
72
76 using PressureVector = std::vector< std::unique_ptr<Pressure> >;
77
81 using TimeArrVector = std::vector< std::unique_ptr<TimeArr> >;
82
91
92 public:
93
98
99 virtual ~WossManager() = default;
100
109 virtual std::shared_ptr<Woss> getActiveWoss( const CoordZ& tx, const CoordZ& rx, double start_frequency, double end_frequency );
110
119 virtual WossManager& eraseActiveWoss( const CoordZ& tx, const CoordZ& rx, double start_frequency, double end_frequency ) = 0;
120
130 virtual std::unique_ptr<Pressure> getWossPressure( const CoordZ& tx_coordz, const CoordZ& rx_coordz, double start_frequency, double end_frequency, const Time& time_value ) = 0;
131
141 virtual std::unique_ptr<Pressure> getWossPressure( const CoordZ& tx_coordz, const CoordZ& rx_coordz, double start_frequency, double end_frequency, double time_value = 0.0 );
142
151 virtual PressureVector getWossPressure( const CoordZPairVect& coordinates, double start_frequency, double end_frequency, const Time& time_value );
152
161 virtual PressureVector getWossPressure( const CoordZPairVect& coordinates, double start_frequency, double end_frequency, double time_value = 0.0 );
162
172 virtual std::unique_ptr<TimeArr> getWossTimeArr( const CoordZ& tx_coordz, const CoordZ& rx_coordz, double start_frequency, double end_frequency, const Time& time_value ) = 0;
173
183 virtual std::unique_ptr<TimeArr> getWossTimeArr( const CoordZ& tx_coordz, const CoordZ& rx_coordz, double start_frequency, double end_frequency, double time_value = 0.0 );
184
193 virtual TimeArrVector getWossTimeArr( const CoordZPairVect& coordinates, double start_frequency, double end_frequency, const Time& time_value );
194
203 virtual TimeArrVector getWossTimeArr( const CoordZPairVect& coordinates, double start_frequency, double end_frequency, double time_value = 0.0 );
204
209 virtual bool reset() = 0;
210
216 virtual bool timeEvolve( const Time& time_value ) = 0;
217
223 WossManager& setWossCreator( const std::shared_ptr<WossCreator>& ptr ) { woss_creator = ptr; return *this; }
224
226
227 void setDebugFlag( bool flag ) { debug = flag; }
228
229 std::shared_ptr<WossCreator> getWossCreator() const { return woss_creator; }
230
232
233 bool getDebugFlag() const { return (bool)debug; }
234
235 protected:
236
238
242 std::shared_ptr<WossCreator> woss_creator;
243
247 bool debug;
248
250
259 virtual std::shared_ptr<Woss> getWoss( const CoordZ& tx, const CoordZ& rx, double start_frequency, double end_frequency ) = 0;
260
261 };
262
263
271
272 public:
273
275
276 virtual ~WossManagerResDb() override = default;
277
287 virtual std::unique_ptr<Pressure> getWossPressure( const CoordZ& tx_coordz, const CoordZ& rx_coordz, double start_frequency, double end_frequency, const Time& time_value ) override;
288
298 virtual std::unique_ptr<TimeArr> getWossTimeArr( const CoordZ& tx_coordz, const CoordZ& rx_coordz, double start_frequency, double end_frequency, const Time& time_value ) override;
299
305 WossManagerResDb& setWossDbManager( const std::shared_ptr<WossDbManager>& ptr ) { woss_db_manager = ptr; return *this; }
306
307 protected:
308
312 std::shared_ptr<WossDbManager> woss_db_manager;
313
323 std::unique_ptr<TimeArr> dbGetTimeArr( const CoordZ& tx, const CoordZ& rx, double frequency, const Time& time_value ) const;
324
333 void dbInsertTimeArr( const CoordZ& tx, const CoordZ& rx, double frequency, const Time& time_value, const TimeArr& channel ) const;
334
344 std::unique_ptr<Pressure> dbGetPressure( const CoordZ& tx, const CoordZ& rx, double frequency, const Time& time_value ) const;
345
354 void dbInsertPressure( const CoordZ& tx, const CoordZ& rx, double frequency, const Time& time_value, const Pressure& press ) const;
355
356 };
357
358 //inline functions
360 inline void WossManagerResDb::dbInsertTimeArr( const CoordZ& tx, const CoordZ& rx, double frequency, const Time& time_value, const TimeArr& channel ) const {
361 if ( woss_db_manager )
362 woss_db_manager->insertTimeArr( tx, rx, frequency, time_value, channel ) ;
363 }
364
365 inline std::unique_ptr<TimeArr> WossManagerResDb::dbGetTimeArr( const CoordZ& tx, const CoordZ& rx, double frequency, const Time& time_value ) const {
366 if ( woss_db_manager )
367 return( woss_db_manager->getTimeArr( tx, rx, frequency, time_value ) );
368 return( SDefHandler::instance().createTimeArr( TimeArr::createNotValid() ) );
369 }
370
371 inline void WossManagerResDb::dbInsertPressure( const CoordZ& tx, const CoordZ& rx, double frequency, const Time& time_value, const Pressure& press ) const {
372 if ( woss_db_manager )
373 woss_db_manager->insertPressure( tx, rx, frequency, time_value, press );
374 }
375
376 inline std::unique_ptr<Pressure> WossManagerResDb::dbGetPressure( const CoordZ& tx, const CoordZ& rx, double frequency, const Time& time_value ) const {
377 if ( woss_db_manager )
378 return( woss_db_manager->getPressure( tx, rx, frequency, time_value ) );
379 return(SDefHandler::instance().createPressure( Pressure::createNotValid()));
380 }
381
382#ifdef WOSS_MULTITHREAD
386 static constexpr inline int MAX_TOTAL_THREADS = 32;
387
398
399 public:
400
405
406 virtual ~WossManagerResDbMT() override = default;
407
417 virtual std::unique_ptr<Pressure> getWossPressure( const CoordZ& tx_coordz, const CoordZ& rx_coordz, double start_frequency, double end_frequency, const Time& time_value ) override;
418
428 virtual std::unique_ptr<Pressure> getWossPressure( const CoordZ& tx_coordz, const CoordZ& rx_coordz, double start_frequency, double end_frequency, double time_value ) override;
429
430
440 virtual std::unique_ptr<TimeArr> getWossTimeArr( const CoordZ& tx_coordz, const CoordZ& rx_coordz, double start_frequency, double end_frequency, const Time& time_value ) override;
441
451 virtual std::unique_ptr<TimeArr> getWossTimeArr( const CoordZ& tx_coordz, const CoordZ& rx_coordz, double start_frequency, double end_frequency, double time_value ) override;
452
453
462 virtual PressureVector getWossPressure( const CoordZPairVect& coordinates, double start_frequency, double end_frequency, const Time& time_value ) override;
463
472 virtual PressureVector getWossPressure( const CoordZPairVect& coordinates, double start_frequency, double end_frequency, double time_value ) override;
473
482 virtual TimeArrVector getWossTimeArr( const CoordZPairVect& coordinates, double start_frequency, double end_frequency, const Time& time_value ) override;
483
492 virtual TimeArrVector getWossTimeArr( const CoordZPairVect& coordinates, double start_frequency, double end_frequency, double time_value ) override;
493
499 void setConcurrentThreads( unsigned int number ) { concurrent_threads = number; checkConcurrentThreads(); }
500
505 unsigned int getConcurrentThreads() const { return concurrent_threads; }
506
512 void setUseThreadPoolFlag (bool flag ) { use_thread_pool = flag; }
513
520
521 protected:
522
528 std::mutex mutex;
529 std::condition_variable condition;
530 };
531
532 using ActiveWoss = std::map< std::shared_ptr<Woss>, std::unique_ptr<ThreadCondSignal> >;
533 using AWIter = ActiveWoss::iterator;
534 using AWRIter = ActiveWoss::reverse_iterator;
535 using AWCIter = ActiveWoss::const_iterator;
536 using AWCRIter = ActiveWoss::const_reverse_iterator;
537
541 unsigned int max_thread_number;
542
546 unsigned int concurrent_threads;
547
551 std::mutex request_mutex;
552
557
562
567 };
568
569#endif // WOSS_MULTITHREAD
570
571}
572
573#endif /* WOSS_MANAGER_DEFINITIONS_H */
3D-Coordinates (lat, long, depth) class definitions and functions library
Definition coordinates-definitions.h:384
Complex attenuated pressure class.
Definition pressure-definitions.h:52
static constexpr std::complex< double > createNotValid()
Definition pressure-definitions.h:126
static T & instance()
Definition singleton-definitions.h:90
Channel power delay profile class.
Definition time-arrival-definitions.h:70
static TimeArrMap & createNotValid()
Definition time-arrival-definitions.h:531
a class for time date manipulation
Definition time-definitions.h:83
Multi-threaded extension of WossManagerResDb.
Definition woss-manager.h:397
ActiveWoss active_woss
Definition woss-manager.h:556
void setConcurrentThreads(unsigned int number)
Definition woss-manager.h:499
ActiveWoss::const_iterator AWCIter
Definition woss-manager.h:535
unsigned int getConcurrentThreads() const
Definition woss-manager.h:505
ActiveWoss::reverse_iterator AWRIter
Definition woss-manager.h:534
void setUseThreadPoolFlag(bool flag)
Definition woss-manager.h:512
virtual std::unique_ptr< TimeArr > getWossTimeArr(const CoordZ &tx_coordz, const CoordZ &rx_coordz, double start_frequency, double end_frequency, const Time &time_value) override
Definition woss-manager.cpp:715
WossManagerResDbMT()
Definition woss-manager.cpp:388
bool getUseThreadPoolFlag()
Definition woss-manager.h:519
ActiveWoss::const_reverse_iterator AWCRIter
Definition woss-manager.h:536
std::mutex request_mutex
Definition woss-manager.h:551
std::map< std::shared_ptr< Woss >, std::unique_ptr< ThreadCondSignal > > ActiveWoss
Definition woss-manager.h:532
unsigned int concurrent_threads
Definition woss-manager.h:546
ActiveWoss::iterator AWIter
Definition woss-manager.h:533
virtual std::unique_ptr< Pressure > getWossPressure(const CoordZ &tx_coordz, const CoordZ &rx_coordz, double start_frequency, double end_frequency, const Time &time_value) override
Definition woss-manager.cpp:867
void checkConcurrentThreads()
Definition woss-manager.cpp:404
virtual ~WossManagerResDbMT() override=default
bool use_thread_pool
Definition woss-manager.h:561
unsigned int max_thread_number
Definition woss-manager.h:541
Abstract class that implements WossManager. It adds computed results dbs control.
Definition woss-manager.h:270
WossManagerResDb & setWossDbManager(const std::shared_ptr< WossDbManager > &ptr)
Definition woss-manager.h:305
void dbInsertTimeArr(const CoordZ &tx, const CoordZ &rx, double frequency, const Time &time_value, const TimeArr &channel) const
Definition woss-manager.h:360
std::shared_ptr< WossDbManager > woss_db_manager
Definition woss-manager.h:312
virtual std::unique_ptr< TimeArr > getWossTimeArr(const CoordZ &tx_coordz, const CoordZ &rx_coordz, double start_frequency, double end_frequency, const Time &time_value) override
Definition woss-manager.cpp:248
void dbInsertPressure(const CoordZ &tx, const CoordZ &rx, double frequency, const Time &time_value, const Pressure &press) const
Definition woss-manager.h:371
std::unique_ptr< Pressure > dbGetPressure(const CoordZ &tx, const CoordZ &rx, double frequency, const Time &time_value) const
Definition woss-manager.h:376
std::unique_ptr< TimeArr > dbGetTimeArr(const CoordZ &tx, const CoordZ &rx, double frequency, const Time &time_value) const
Definition woss-manager.h:365
virtual ~WossManagerResDb() override=default
WossManagerResDb()
Definition woss-manager.cpp:241
virtual std::unique_ptr< Pressure > getWossPressure(const CoordZ &tx_coordz, const CoordZ &rx_coordz, double start_frequency, double end_frequency, const Time &time_value) override
Definition woss-manager.cpp:325
Abstract class that interfaces Pressure or TimeArr requests from user layer.
Definition woss-manager.h:90
virtual ~WossManager()=default
virtual WossManager & eraseActiveWoss(const CoordZ &tx, const CoordZ &rx, double start_frequency, double end_frequency)=0
bool is_time_evolution_active
Definition woss-manager.h:249
void setDebugFlag(bool flag)
Definition woss-manager.h:227
WossManager()
Definition woss-manager.cpp:45
static const Time NO_EVOLUTION_TIME
Definition woss-manager.h:237
virtual bool timeEvolve(const Time &time_value)=0
bool getTimeEvolutionActiveFlag() const
Definition woss-manager.h:231
std::shared_ptr< WossCreator > getWossCreator() const
Definition woss-manager.h:229
virtual std::shared_ptr< Woss > getActiveWoss(const CoordZ &tx, const CoordZ &rx, double start_frequency, double end_frequency)
Definition woss-manager.cpp:235
virtual bool reset()=0
virtual std::unique_ptr< Pressure > getWossPressure(const CoordZ &tx_coordz, const CoordZ &rx_coordz, double start_frequency, double end_frequency, const Time &time_value)=0
Definition woss-manager.cpp:108
bool getDebugFlag() const
Definition woss-manager.h:233
virtual std::shared_ptr< Woss > getWoss(const CoordZ &tx, const CoordZ &rx, double start_frequency, double end_frequency)=0
std::shared_ptr< WossCreator > woss_creator
Definition woss-manager.h:242
virtual std::unique_ptr< TimeArr > getWossTimeArr(const CoordZ &tx_coordz, const CoordZ &rx_coordz, double start_frequency, double end_frequency, const Time &time_value)=0
Definition woss-manager.cpp:53
bool debug
Definition woss-manager.h:247
void setTimeEvolutionActiveFlag(bool flag)
Definition woss-manager.h:225
WossManager & setWossCreator(const std::shared_ptr< WossCreator > &ptr)
Definition woss-manager.h:223
Provides the interface for woss::DefHandler class.
Definition ac-toolbox-arr-asc-reader.h:44
std::vector< SimFreq > SimFreqVector
Definition woss-manager.h:71
std::pair< CoordZ, CoordZ > CoordZPair
Definition woss-manager.h:56
std::vector< CoordZPair > CoordZPairVect
Definition woss-manager.h:61
std::pair< double, double > SimFreq
Definition woss-manager.h:66
std::vector< std::unique_ptr< Pressure > > PressureVector
Definition woss-manager.h:76
std::vector< std::unique_ptr< TimeArr > > TimeArrVector
Definition woss-manager.h:81
Definition woss-manager.h:527
std::condition_variable condition
Definition woss-manager.h:529
std::mutex mutex
Definition woss-manager.h:528
Provides the interface for woss::WossCreator class.
Provides the interface for woss::WossDbManager class.