Skip to content

File DipoleSource.h

File List > Intern > rayx-core > src > Shader > LightSources > DipoleSource.h

Go to the documentation of this file

#pragma once

#include <list>

#include "LightSource.h"
#include "Shader/Rand.h"

namespace rayx {

struct PsiAndStokes {
    glm::dvec4 stokes;
    double psi;
};

RAYX_API double get_factorCriticalEnergy();
RAYX_API double get_factorElectronEnergy();
RAYX_API double get_factorOmega();
RAYX_API RAYX_FN_ACC double dipoleBessel(double hnue, double zeta);
RAYX_API RAYX_FN_ACC glm::dvec4 getStokesSyn(double energy, double psi1, double psi2, double electronEnergy, double criticalEnergy,
                                             ElectronEnergyOrientation electronEnergyOrientation);
RAYX_API RAYX_FN_ACC PsiAndStokes calcDipoleFold(double psi, double photonEnergy, double sigpsi, double electronEnergy, double criticalEnergy,
                                                 ElectronEnergyOrientation electronEnergyOrientation, Rand& __restrict rand);
RAYX_API double calcMaxIntensity(double photonEnergy, double verDivergence, double electronEnergy, double criticalEnergy,
                                 ElectronEnergyOrientation electronEnergyOrientation, Rand& __restrict rand);
RAYX_API double calcVerDivergence(double energy, double sigv, double electronEnergy, double criticalEnergy);
RAYX_API RAYX_FN_ACC double getDipoleInterpolation(double energy);
RAYX_API RAYX_FN_ACC double schwinger(double energy, double gamma, double criticalEnergy);
RAYX_API double calcMaxFlux(double photonEnergy, double energySpread, double criticalEnergy, double gamma);
RAYX_API double calcGamma(double electronEnergy);

class RAYX_API DipoleSource : public LightSourceBase {
  public:
    DipoleSource(const DesignSource&);

    RAYX_FN_ACC detail::Ray genRay(const int rayPathIndex, const int sourceId, Rand& __restrict rand) const;

  private:
    // calculate Ray-Information
    RAYX_FN_ACC glm::dvec3 getXYZPosition(double, Rand& __restrict rand) const;
    RAYX_FN_ACC PsiAndStokes getPsiandStokes(double, Rand& __restrict rand) const;

    // support functions
    RAYX_FN_ACC double getNormalFromRange(double range, Rand& __restrict rand) const;
    RAYX_FN_ACC double getEnergy(Rand& __restrict rand) const;

    // Geometric Params
    double m_bendingRadius;
    ElectronEnergyOrientation m_electronEnergyOrientation;
    // SourcePulseType m_sourcePulseType;
    // double m_photonFlux;
    // EnergyDistribution m_energySpreadType;

    double m_sourceHeight;
    double m_sourceWidth;

    // double m_sigpsi;
    // glm::dvec4 m_stokes;
    double m_electronEnergy;
    double m_criticalEnergy;
    double m_photonEnergy;
    double m_verEbeamDivergence;
    // double m_flux;
    // double m_totalPower;
    // double m_bandwidth;
    // double m_magneticFieldStrength;
    double m_gamma;
    // double m_beta;
    // double m_photonWaveLength;
    // double m_sourcePulseLength;
    // double m_sourcePathLength;
    // double m_phaseJitter;
    // double m_horDivDegrees;
    // double m_horDivSeconds;
    double m_energySpread;
    // EnergySpreadUnit m_energySpreadUnit;
    // double m_photonFluxOrg;
    double m_maxFlux;
    double m_maxIntensity;
    double m_horDivergence;
    double m_verDivergence;
};

}  // namespace rayx