Line data Source code
1 : #ifndef CRPROPA_GRIDTURBULENCE_H 2 : #define CRPROPA_GRIDTURBULENCE_H 3 : 4 : #ifdef CRPROPA_HAVE_FFTW3F 5 : 6 : #include "crpropa/Grid.h" 7 : #include "crpropa/magneticField/turbulentField/TurbulentField.h" 8 : 9 : #include "fftw3.h" 10 : 11 : namespace crpropa { 12 : /** 13 : * \addtogroup MagneticFields 14 : * @{ 15 : */ 16 : 17 : /** 18 : @class GridTurbulence 19 : @brief Turbulent grid-based magnetic field with a general energy spectrum 20 : */ 21 6 : class GridTurbulence : public TurbulentField { 22 : protected: 23 : unsigned int seed; 24 : ref_ptr<Grid3f> gridPtr; 25 : 26 : void initGrid(const GridProperties &grid); 27 : void initTurbulence(); 28 : 29 : public: 30 : /** 31 : Create a random initialization of a turbulent field. 32 : @param spectrum TurbulenceSpectrum instance to define the spectrum of 33 : turbulence 34 : @param gridProp GridProperties instance to define the underlying grid 35 : @param seed Random seed 36 : */ 37 : GridTurbulence(const TurbulenceSpectrum &spectrum, 38 : const GridProperties &gridProp, unsigned int seed = 0); 39 : 40 : Vector3d getField(const Vector3d &pos) const; 41 : 42 : /** Return a const reference to the grid */ 43 : const ref_ptr<Grid3f> &getGrid() const; 44 : 45 : /* Helper functions for synthetic turbulent field models */ 46 : // Check the grid properties before the FFT procedure 47 : static void checkGridRequirements(ref_ptr<Grid3f> grid, double lMin, 48 : double lMax); 49 : // Execute inverse discrete FFT in-place for a 3D grid, from complex to real 50 : // space 51 : static void executeInverseFFTInplace(ref_ptr<Grid3f> grid, 52 : fftwf_complex *Bkx, fftwf_complex *Bky, 53 : fftwf_complex *Bkz); 54 : 55 : // Usefull checks for a grid field 56 : /** Evaluate the mean vector of all grid points */ 57 : Vector3f getMeanFieldVector() const; 58 : /** Evaluate the mean of all grid points */ 59 : double getMeanFieldStrength() const; 60 : /** Evaluate the RMS of all grid points */ 61 : double getRmsFieldStrength() const; 62 : /** Evaluate the RMS of all grid points per axis */ 63 : std::array<float, 3> getRmsFieldStrengthPerAxis() const; 64 : /** Evaluate generated power-spectrum */ 65 : std::vector<std::pair<int, float>> getPowerSpectrum() const; 66 : /** Dump a Grid3f to a binary file */ 67 : void dumpToFile(std::string filename) const; 68 : }; 69 : 70 : /** @}*/ 71 : } // namespace crpropa 72 : 73 : #endif // CRPROPA_HAVE_FFTW3F 74 : 75 : #endif // CRPROPA_GRIDTURBULENCE_H