Line data Source code
1 : #include "crpropa/magneticField/ArchimedeanSpiralField.h" 2 : 3 : namespace crpropa { 4 : 5 0 : ArchimedeanSpiralField::ArchimedeanSpiralField(double B_0, double R_0, double Omega, double V_w) { 6 0 : setB0(B_0); 7 0 : setR0(R_0); 8 0 : setOmega(Omega); 9 0 : setVw(V_w); 10 0 : } 11 : 12 0 : Vector3d ArchimedeanSpiralField::getField(const Vector3d &pos) const { 13 : 14 : double r = pos.getR(); 15 0 : double theta = pos.getTheta(); 16 0 : double phi =pos.getPhi(); 17 : 18 0 : double cos_phi = cos(phi); 19 0 : double sin_phi = sin(phi); 20 0 : double cos_theta = cos(theta); 21 0 : double sin_theta = sin(theta); 22 : 23 : Vector3d B(0.); 24 : 25 : // radial direction 26 0 : double C1 = R_0*R_0/r/r; 27 0 : B.x += C1 * cos_phi * sin_theta; 28 0 : B.y += C1 * sin_phi * sin_theta; 29 0 : B.z += C1 * cos_theta; 30 : 31 : // azimuthal direction 32 0 : double C2 = - (Omega*R_0*R_0*sin_theta) / (r*V_w); 33 0 : B.x += C2 * (-sin_phi); 34 0 : B.y += C2 * cos_phi; 35 : 36 : // magnetic field switch at z = 0 37 0 : if (pos.z<0.) { 38 : B *= -1; 39 : } 40 : 41 : // overall scaling 42 : B *= B_0; 43 : 44 : 45 0 : return B; 46 : } 47 : 48 0 : void ArchimedeanSpiralField::setR0(double R) { 49 0 : R_0 = R; 50 0 : return; 51 : } 52 : 53 0 : void ArchimedeanSpiralField::setB0(double B) { 54 0 : B_0 = B; 55 0 : return; 56 : } 57 : 58 0 : void ArchimedeanSpiralField::setOmega(double Om) { 59 0 : Omega = Om; 60 0 : return; 61 : } 62 : 63 0 : void ArchimedeanSpiralField::setVw(double v) { 64 0 : V_w = v; 65 0 : return; 66 : } 67 : 68 : 69 0 : double ArchimedeanSpiralField::getR0() const { 70 0 : return R_0; 71 : } 72 : 73 0 : double ArchimedeanSpiralField::getB0() const{ 74 0 : return B_0; 75 : } 76 : 77 0 : double ArchimedeanSpiralField::getOmega() const{ 78 0 : return Omega; 79 : } 80 : 81 0 : double ArchimedeanSpiralField::getVw() const { 82 0 : return V_w; 83 : } 84 : 85 : 86 : } //end namespace crpropa