LCOV - code coverage report
Current view: top level - src/magneticField - PolarizedSingleModeMagneticField.cpp (source / functions) Hit Total Coverage
Test: coverage.info.cleaned Lines: 15 32 46.9 %
Date: 2024-04-29 14:43:01 Functions: 2 2 100.0 %

          Line data    Source code
       1             : #include "crpropa/magneticField/PolarizedSingleModeMagneticField.h"
       2             : 
       3             : namespace crpropa {
       4             : 
       5           1 : PolarizedSingleModeMagneticField::PolarizedSingleModeMagneticField( const double &B_0, const double &wavelength, const double &sigma, const Vector3d &r_0, const Vector3d &e_1, const Vector3d &e_2, std::string flagAmplitudeRms, std::string flagPolarizationHelicity, std::string flagMode ) {
       6           1 :         if (flagMode == "elliptical") {
       7           1 :                 if (abs(sigma) > 1)
       8           0 :                         throw std::runtime_error("PolarizedSingleModeMagneticField: The value of the  polarization parameter has to lie in the range [-1;+1].");
       9             :         }
      10           0 :         else if (flagMode == "circular") {
      11           0 :                 if (abs(sigma) != 1)
      12           0 :                         throw std::runtime_error("PolarizedSingleModeMagneticField: For circular polarization the value of the polarization parameter has to be equal to -1 or +1.");
      13             :         }
      14           0 :         else if (flagMode == "linear") {
      15           0 :                 if (abs(sigma) != 0)
      16           0 :                         throw std::runtime_error("PolarizedSingleModeMagneticField: For linear polarization the value of the polarization parameter has to be equal to 0.");
      17             :         }
      18             :         else
      19           0 :                 throw std::runtime_error("PolarizedSingleModeMagneticField: Wrong value for flagMode. Please choose \"elliptical\" or \"circular\" or \"linear\".");
      20             : 
      21           1 :         if (e_1.dot(e_2) != 0)
      22           0 :                 throw std::runtime_error("PolarizedSingleModeMagneticField: e_1 and e_2 have to be orthogonal to each other.");
      23             : 
      24           1 :         if (e_1.getR() == 0)
      25           0 :                 throw std::runtime_error("PolarizedSingleModeMagneticField: Vector e_1 cannot be zero.");
      26             :         unitVector_1 = e_1 / e_1.getR();
      27             : 
      28           1 :         if (e_2.getR() == 0)
      29           0 :                 throw std::runtime_error("PolarizedSingleModeMagneticField: Vector e_2 cannot be zero.");
      30             :         unitVector_2 = e_2 / e_2.getR();
      31             : 
      32             :         wavevector = e_2.cross(e_1);
      33             : 
      34             :         //This check is necessary if a polarization with non-orthogonal spanning vectors is desired. This is not implemented in this version, so any corresponding modifications should be made with caution.
      35             :         //if (wavevector.getR() == 0)
      36             :         //        throw std::runtime_error("PolarizedSingleModeMagneticField: e_1 cannot be parallel to e_2.");
      37             : 
      38             :         wavevector = wavevector / wavevector.getR();
      39             : 
      40           1 :         if (wavelength == 0)
      41           0 :                 throw std::runtime_error("PolarizedSingleModeMagneticField: The correlation length cannot be zero.");
      42             :         wavevector = wavevector * 2 * M_PI / wavelength;
      43             : 
      44           2 :         if (!((flagPolarizationHelicity == "helicity") || (flagPolarizationHelicity == "polarization")))
      45           0 :                 throw std::runtime_error("PolarizedSingleModeMagneticField: Wrong value for flagPolarizationHelicity. Please choose \"polarization\" or \"helicity\".");
      46           1 :         if (flagPolarizationHelicity == "helicity" && abs(sigma) != 1)
      47           0 :                 throw std::runtime_error("PolarizedSingleModeMagneticField: In helicity mode only the maximum helicity case (sigma = +1 or sigma = -1) may be chosen.");
      48             : 
      49           1 :         if (flagAmplitudeRms == "amplitude")
      50           1 :                 B_max = B_0;
      51           0 :         else if (flagAmplitudeRms == "rms")
      52           0 :                 B_max = sqrt(2 / (1 + sigma * sigma)) * B_0;
      53             :         else
      54           0 :                 throw std::runtime_error("PolarizedSingleModeMagneticField: Wrong value for flagAmplitudeRms. Please choose \"amplitude\" or \"rms\".");
      55             : 
      56             :         this->r_0 = r_0;
      57           1 :         this->sigma = sigma;
      58           1 : }
      59             : 
      60           1 : Vector3d PolarizedSingleModeMagneticField::getField(const Vector3d &position) const {
      61             :         Vector3d delta_r = position - r_0;
      62             : 
      63           1 :         return B_max * (unitVector_1 * cos(wavevector.dot(delta_r)) + unitVector_2 * sigma * sin(wavevector.dot(delta_r)));
      64             : }
      65             : 
      66             : } //end namespace crpropa

Generated by: LCOV version 1.14