Program Listing for File UF23Field.h

Return to documentation for file (include/crpropa/magneticField/UF23Field.h)

#ifndef _UF23Field_h_
#define _UF23Field_h_

#include <vector>
#include "crpropa/magneticField/MagneticField.h"

namespace crpropa {
class UF23Field : public MagneticField  {
public:
  enum ModelType {
    base,
    neCL,
    expX,
    spur,
    cre10,
    synCG,
    twistX,
    nebCor
  };


public:
  UF23Field(const ModelType mt);
  UF23Field() = delete;

  Vector3d getField(const Vector3d& pos) const;

private:

  Vector3d operator()(const Vector3d& posInKpc) const;

  enum EPar {
    eDiskB1 = 0,
    eDiskB2,
    eDiskB3,
    eDiskH,
    eDiskPhase1,
    eDiskPhase2,
    eDiskPhase3,
    eDiskPitch,
    eDiskW,
    ePoloidalA,
    ePoloidalB,
    ePoloidalP,
    ePoloidalR,
    ePoloidalW,
    ePoloidalZ,
    ePoloidalXi,
    eSpurCenter,
    eSpurLength,
    eSpurWidth,
    eStriation,
    eToroidalBN,
    eToroidalBS,
    eToroidalR,
    eToroidalW,
    eToroidalZ,
    eTwistingTime,
    eNpar
  };

  const ModelType fModelType;
  const double fMaxRadiusSquared;

  // parameters are stored in array
  double fParameters[eNpar] = { 0 };
  // references to parameters for convience
  double& fDiskB1       = fParameters[eDiskB1];
  double& fDiskB2       = fParameters[eDiskB2];
  double& fDiskB3       = fParameters[eDiskB3];
  double& fDiskH        = fParameters[eDiskH];
  double& fDiskPhase1   = fParameters[eDiskPhase1];
  double& fDiskPhase2   = fParameters[eDiskPhase2];
  double& fDiskPhase3   = fParameters[eDiskPhase3];
  double& fDiskPitch    = fParameters[eDiskPitch];
  double& fDiskW        = fParameters[eDiskW];
  double& fPoloidalA    = fParameters[ePoloidalA];
  double& fPoloidalB    = fParameters[ePoloidalB];
  double& fPoloidalP    = fParameters[ePoloidalP];
  double& fPoloidalR    = fParameters[ePoloidalR];
  double& fPoloidalW    = fParameters[ePoloidalW];
  double& fPoloidalZ    = fParameters[ePoloidalZ];
  double& fPoloidalXi   = fParameters[ePoloidalXi];
  double& fSpurCenter   = fParameters[eSpurCenter];
  double& fSpurLength   = fParameters[eSpurLength];
  double& fSpurWidth    = fParameters[eSpurWidth];
  double& fStriation    = fParameters[eStriation];
  double& fToroidalBN   = fParameters[eToroidalBN];
  double& fToroidalBS   = fParameters[eToroidalBS];
  double& fToroidalR    = fParameters[eToroidalR];
  double& fToroidalW    = fParameters[eToroidalW];
  double& fToroidalZ    = fParameters[eToroidalZ];
  double& fTwistingTime = fParameters[eTwistingTime];

  // some pre-calculated derived parameter values
  double fSinPitch  = 0;
  double fCosPitch  = 0;
  double fTanPitch  = 0;

  Vector3d getDiskField(const Vector3d& pos) const;
  Vector3d getHaloField(const Vector3d& pos) const;

  Vector3d getSpiralField(const double x, const double y, const double z) const;
  Vector3d getSpurField(const double x, const double y, const double z) const;
  Vector3d getToroidalHaloField(const double x, const double y, const double z) const;
  Vector3d getPoloidalHaloField(const double x, const double y, const double z) const;
  Vector3d getTwistedHaloField(const double x, const double y, const double z) const;

};
} // namespace crpropa
#endif