--- /dev/null
+#pragma once
+
+#include <chrono>
+#include <complex>
+#include <random>
+
+#include <fftw3.h>
+
+#include "seafwd.h"
+
+#include "watersurfacefwd.h"
+
+class Sea
+{
+ public:
+ Sea(WaterSurfacePtr surface);
+ ~Sea();
+ Sea(const Sea&) = delete;
+ Sea& operator=(const Sea&) = delete;
+ void update();
+
+ private:
+ static const double PHILLIPS_CONSTANT;
+ static const double GRAVITATIONAL_CONSTANT;
+
+ WaterSurfacePtr m_surface;
+ double m_windDirection[2];
+ double m_windSpeed;
+ std::random_device m_randomDevice;
+ std::mt19937 m_randomGenerator;
+ std::normal_distribution<> m_normalDistribution;
+ std::vector<std::complex<double>> m_fourierAmplitudes;
+ fftw_complex *m_fftwIn, *m_fftwOut;
+ fftw_plan m_fftwPlan;
+ std::chrono::time_point<std::chrono::system_clock> m_startTime;
+
+ double phillipsSpectrum(double k_x, double k_y) const;
+ std::complex<double>& fourierAmplitudeAt(int n, int m);
+ void generateFourierAmplitudes();
+ double spatialFrequencyForIndex(int n) const;
+ double getRuntime() const;
+};