]> git.treefish.org Git - seamulator.git/blob - sea.h
20f5d638d33479fd21d5b8daf0626e591d9926ac
[seamulator.git] / sea.h
1 #pragma once
2
3 #include <chrono>
4 #include <complex>
5 #include <random>
6
7 #include <fftw3.h>
8
9 #include "seafwd.h"
10
11 #include "complexpair.h"
12 #include "watersurfacefwd.h"
13
14 class Sea
15 {
16  public:
17   Sea(WaterSurfacePtr surface);
18   ~Sea();
19   Sea(const Sea&) = delete;
20   Sea& operator=(const Sea&) = delete;
21   void update();
22
23  private:
24   static const double PHILLIPS_CONSTANT;
25   static const double GRAVITATIONAL_CONSTANT;
26
27   WaterSurfacePtr m_surface;
28   double m_windDirection[2];
29   double m_windSpeed;
30   std::random_device m_randomDevice;
31   std::mt19937 m_randomGenerator;
32   std::normal_distribution<> m_normalDistribution;
33   std::vector<ComplexPair> m_fourierAmplitudes;
34   fftw_complex *m_fftwIn, *m_fftwOut;
35   fftw_plan m_fftwPlan;
36   std::chrono::time_point<std::chrono::system_clock> m_startTime;
37
38   double phillipsSpectrum(double k_x, double k_y) const;
39   ComplexPair generateFourierAmplitude(double k_x, double k_y);
40   ComplexPair& fourierAmplitudeAt(int n, int m);
41   void generateFourierAmplitudes();
42   double spatialFrequencyForIndex(int n) const;
43   double getRuntime() const;
44 };