Line data Source code
1 : #ifndef CRPROPA_GALACTICMAGNETICFIELD_H 2 : #define CRPROPA_GALACTICMAGNETICFIELD_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 ToroidalHaloField 15 : @brief Galactic halo field model from Prouza & Smida 2003 and Sun et al. 2008 16 : */ 17 : class ToroidalHaloField: public MagneticField { 18 : double b0; // halo field strength 19 : double z0; // vertical position 20 : double z1; // vertical scale 21 : double r0; // radial scale 22 : 23 : public: 24 : /** 25 : * Constructor 26 : * @param b0 halo field strength 27 : * @param z0 vertical position 28 : * @param z1 vertical scale 29 : * @param r0 radial scale 30 : */ 31 1 : ToroidalHaloField(double b0 = 1., double z0 = 1., double z1 = 1., double r0 = 1.) { 32 : setParameters(b0, z0, z1, r0); 33 : } 34 : 35 : void setParameters(double b0, double z0, double z1, double r0) { 36 1 : this->b0 = b0; 37 1 : this->z0 = z0; 38 1 : this->z1 = z1; 39 1 : this->r0 = r0; 40 : } 41 : 42 2 : Vector3d getField(Vector3d pos) { 43 2 : double r = sqrt(pos.x * pos.x + pos.y * pos.y) / r0; // in-plane radius in units of the radial scale 44 2 : double b = b0 / (1 + pow((std::fabs(pos.z) - z0) / z1, 2)) * r * exp(1 - r); 45 2 : double phi = pos.getPhi(); // azimuth 46 2 : return Vector3d(cos(phi), sin(phi), 0) * b; 47 : } 48 : }; 49 : /** @} */ 50 : 51 : /** 52 : * \addtogroup MagneticFields 53 : * @{ 54 : */ 55 : 56 : /** 57 : @class LogarithmicSpiralField 58 : @brief Galactic disk field model of axisymmetric (ASS) or bisymmetric (BSS) logarithmic spiral shape 59 : */ 60 : class LogarithmicSpiralField: public MagneticField { 61 : private: 62 : bool isBSS; // true for BSS, false for ASS 63 : double b0; // field strength 64 : double pitch; // pitch angle [rad] 65 : double rsol; // distance of sun to galactic center 66 : double rc; // radius of central region with constant field strength 67 : double d; // distance to the first field reversal 68 : double z0; // vertical attenuation length 69 : 70 : double phase; // phase of the spiral arms 71 : double cosPhase; 72 : double sinPitch; 73 : double cosPitch; 74 : double tanPitch; 75 : 76 1 : void updatePitchAngle() { 77 1 : sinPitch = sin(pitch); 78 1 : cosPitch = cos(pitch); 79 1 : tanPitch = tan(pitch); 80 1 : } 81 : 82 1 : void updatePhase() { 83 1 : phase = log(1 + d / rsol) / tanPitch - M_PI / 2; 84 1 : cosPhase = cos(phase); 85 1 : } 86 : 87 : public: 88 : /** 89 : * Constructor 90 : * @param isBSS switch for the magnetic field model 91 : * true for BSS, false for ASS 92 : * @param b0 magnetic field strength 93 : * @param pitch pitch angle [rad] 94 : * @param rsol distance of sun from Galactic center 95 : * @param rc radius of central region with constant field 96 : * @param d distance to first field reversal 97 : * @param z0 vertical attenuation length 98 : */ 99 : LogarithmicSpiralField(bool isBSS = true, double b0 = 1., double pitch = M_1_PI/4., 100 1 : double rsol = 8.5*kpc, double rc = 3*kpc, double d = 5*kpc, double z0 = 3*kpc) { 101 : setParameters(isBSS, b0, pitch, rsol, rc, d, z0); 102 : } 103 : 104 : void setParameters(bool isBSS, double b0, double pitch, double rsol, 105 : double rc, double d, double z0) { 106 1 : this->isBSS = isBSS; 107 1 : this->b0 = b0; 108 1 : this->pitch = pitch; 109 1 : this->rsol = rsol; 110 1 : this->rc = rc; 111 1 : this->d = d; 112 1 : this->z0 = z0; 113 1 : updatePitchAngle(); 114 1 : updatePhase(); 115 : } 116 : 117 1 : Vector3d getField(Vector3d pos) const { 118 1 : double r = sqrt(pos.x * pos.x + pos.y * pos.y); // in-plane radius 119 1 : double b = b0 / cosPhase * rsol / std::max(r, rc); 120 : 121 1 : double phi = pos.getPhi(); 122 1 : double c = cos(phi - log(r / rsol) / tanPitch + phase); 123 1 : if (isBSS) 124 1 : c = std::fabs(c); 125 1 : b *= c * exp(-std::fabs(pos.z) / z0); 126 : 127 1 : return Vector3d(cosPitch * cos(phi), sinPitch * sin(phi), 0) * b; 128 : } 129 : }; 130 : /** @} */ 131 : 132 : }// namespace crpropa 133 : 134 : #endif // CRPROPA_GALACTICMAGNETICFIELD_H