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