Line data Source code
1 : #ifndef CRPROPA_TURBULENTFIELD_H 2 : #define CRPROPA_TURBULENTFIELD_H 3 : 4 : #include "crpropa/magneticField/MagneticField.h" 5 : #include <cmath> 6 : 7 : namespace crpropa { 8 : /** 9 : * \addtogroup MagneticFields 10 : * @{ 11 : */ 12 : 13 : /** 14 : @class TurbulenceSpectrum 15 : @brief Defines the energy spectrum of turbulence parametrizied by A(k) ~ k^q /(1 + k^2)^{(s + q)/2 + 1} 16 : */ 17 : class TurbulenceSpectrum : public Referenced { 18 : private: 19 : const double Brms; /**< Brms value of the turbulent field (normalization) */ 20 : const double sIndex; /**< Spectral index for the inertial range, for example 21 : s=5/3 for Kolmogorov spectrum; in some parts of the code this 22 : parameter is referred by alpha which is the total 3D isotropic 23 : spectrum with additional k^2 and the minus sign, e.g., 24 : for Kolmogorov: alpha = -(s + 2) */ 25 : const double qIndex; /**< Spectral index for the injection range, for 26 : example q=4 for 3D homogeneous turbulence */ 27 : const double lBendover; /**< the bend-over scale */ 28 : const double lMin, lMax; /**< Min and Max scale of turbulence */ 29 : 30 : protected: 31 : /** 32 : Normalization for the below defined Lc 33 : */ 34 1 : double spectrumNormalization() const { 35 1 : return std::tgamma((sIndex + qIndex) / 2.0) / 36 1 : (2.0 * std::tgamma((sIndex - 1) / 2.0) * 37 1 : std::tgamma((qIndex + 1) / 2.0)); 38 : } 39 : 40 : public: 41 : /** 42 : * @param Brms root mean square field strength for generated field 43 : * @param lMin Minimum physical scale of the turbulence 44 : * @param lMax Maximum physical scale of the turbulence 45 : * @param lBendover the bend-over scale 46 : * @param sIndex Spectral index of the energy spectrum in the inertial range 47 : * @param qIndex Spectral index of the energy spectrum in the energy range 48 : */ 49 9 : TurbulenceSpectrum(double Brms, double lMin, double lMax, 50 : double lBendover = 1, double sIndex = (5. / 3.), 51 : double qIndex = 4) 52 9 : : Brms(Brms), lMin(lMin), lMax(lMax), lBendover(lBendover), 53 9 : sIndex(sIndex), qIndex(qIndex) { 54 9 : if (lMin > lMax) { 55 0 : throw std::runtime_error("TurbulenceSpectrum: lMin > lMax"); 56 : } 57 9 : if (lMin <= 0) { 58 0 : throw std::runtime_error("TurbulenceSpectrum: lMin <= 0"); 59 : } 60 9 : } 61 : 62 7 : ~TurbulenceSpectrum() {} 63 : 64 31 : double getBrms() const { return Brms; } 65 19 : double getLmin() const { return lMin; } 66 19 : double getLmax() const { return lMax; } 67 22 : double getLbendover() const { return lBendover; } 68 5 : double getSindex() const { return sIndex; } 69 2 : double getQindex() const { return qIndex; } 70 : 71 : /** 72 : General energy spectrum for synthetic turbulence models (not normalized!) 73 : with normalized ^k = k*lBendover 74 : */ 75 208128 : virtual double energySpectrum(double k) const { 76 208128 : double kHat = k * lBendover; 77 208128 : return std::pow(kHat, qIndex) / 78 208128 : std::pow(1.0 + kHat * kHat, 79 208128 : (sIndex + qIndex) / 2.0 + 1.0); 80 : } 81 : 82 : /** 83 : Computes the magnetic field coherence length 84 : Obtained from the definition of \f$l_c = 1/B_{\rm rms}^2 \int_0^\infty dr\langleB(0)B^*(r)\rangle \f$ 85 : Approximates the true value correctly as long as lBendover <= lMax/8 (~5% 86 : error) (for the true value the above integral should go from lMin to lMax) 87 : */ 88 0 : virtual double getCorrelationLength() const { 89 1 : return 4 * M_PI / ((sIndex + 2.0) * sIndex) * spectrumNormalization() * 90 1 : lBendover; 91 : } 92 : }; 93 : 94 : /** 95 : @class TurbulentField 96 : @brief An abstract base class for different models of turbulent magnetic fields 97 : 98 : This module provides common methods for all turbulent (synthetic) magnetic 99 : fields. Does not actually implement any turbulent field. 100 : */ 101 : class TurbulentField : public MagneticField { 102 : protected: 103 : const TurbulenceSpectrum &spectrum; 104 : 105 : public: 106 8 : TurbulentField(const TurbulenceSpectrum &spectrum) : spectrum(spectrum) {} 107 0 : virtual ~TurbulentField() {} 108 : 109 0 : double getBrms() const { return spectrum.getBrms(); } 110 0 : virtual double getCorrelationLength() const { 111 0 : return spectrum.getCorrelationLength(); 112 : } 113 : }; 114 : 115 : /** @}*/ 116 : 117 : } // namespace crpropa 118 : 119 : #endif // CRPROPA_TURBULENTFIELD_H