26 namespace TelescopeSimulatorLX {
45 const double sinTheta1,
46 const double thickness,
47 const double wavelength)
49 return GetXtance<GetReflectance2>(nIndex1, nIndex2, nIndex3,
50 sinTheta1, thickness, wavelength);
58 const double sinTheta1,
59 const double thickness,
60 const double wavelength)
62 return GetXtance<GetTransmittance2>(nIndex1, nIndex2, nIndex3,
63 sinTheta1, thickness, wavelength);
71 const double sinTheta1,
72 const double thickness,
73 const double wavelength)
75 return GetXtance<GetAbsorptance2>(nIndex1, nIndex2, nIndex3,
76 sinTheta1, thickness, wavelength);
80 std::pair<double, double>
84 const double sinTheta1,
85 const double thickness,
86 const double wavelength)
88 const double n1sinTheta1 = nIndex1 * sinTheta1;
90 GetPhase(nIndex2, n1sinTheta1, thickness, wavelength);
92 const std::pair<dcomplex, dcomplex> bcS =
95 const std::pair<dcomplex, dcomplex> bcP =
105 template<
double Xtance(const Etas&, const dcomplex&)>
110 const double nIndex3,
111 const double sinTheta1,
112 const double thickness,
113 const double wavelength)
115 const double n1sinTheta1 = nIndex1 * sinTheta1;
117 GetPhase(nIndex2, n1sinTheta1, thickness, wavelength);
118 const Etas etasS =
GetAllEtasS(nIndex1, nIndex2, nIndex3, n1sinTheta1);
119 const Etas etasP =
GetAllEtasP(nIndex1, nIndex2, nIndex3, n1sinTheta1);
120 return 0.5 * (Xtance(etasS, phase2) + Xtance(etasP, phase2));
125 {
return std::sqrt(nIndex*nIndex - n1sinTheta1*n1sinTheta1); }
128 static T
GetEtaS(
const T& nIndex,
const double n1sinTheta1)
132 static T
GetEtaP(
const T& nIndex,
const double n1sinTheta1)
133 {
return nIndex*nIndex /
GetEtaS(nIndex, n1sinTheta1); }
139 const double nIndex3,
140 const double n1sinTheta1)
143 GetEtaS<double>(nIndex1, n1sinTheta1),
144 GetEtaS<dcomplex>(nIndex2, n1sinTheta1),
145 GetEtaS<dcomplex>(nIndex3, n1sinTheta1)
154 const double nIndex3,
155 const double n1sinTheta1)
158 GetEtaP<double>(nIndex1, n1sinTheta1),
159 GetEtaP<dcomplex>(nIndex2, n1sinTheta1),
160 GetEtaP<dcomplex>(nIndex3, n1sinTheta1)
168 const double thickness,
const double wavelength)
170 return (2*M_PI) * thickness / wavelength *
175 std::pair<dcomplex, dcomplex>
178 const dcomplex cosPhase = std::cos(phase);
180 return std::make_pair(cosPhase + isinPhase * etas.
fEta3 / etas.
fEta2,
181 isinPhase * etas.
fEta2 + cosPhase * etas.
fEta3);
197 const dcomplex rho = (eta1b - bc.second) / (eta1b + bc.second);
223 return 4 * etas.
fEta1 *
224 std::real(bc.first * conj(bc.second) - etas.
fEta3) /
std::norm(x);
static T GetEtaP(const T &nIndex, const double n1sinTheta1)
static std::pair< double, double > GetReflectanceAbsorptance(const double nIndex1, const dcomplex &nIndex2, const double nIndex3, const double sinTheta1, const double thickness, const double wavelength)
static double GetTransmittance2(const Etas &etas, const dcomplex &phase)
static double GetAbsorptance2(const Etas &etas, const dcomplex &phase)
static double GetReflectance2(const Etas &etas, const dcomplex &phase)
static std::pair< dcomplex, dcomplex > GetNormalizedFields(const Etas &etas, const dcomplex &phase)
static Etas GetAllEtasP(const double nIndex1, const dcomplex &nIndex2, const double nIndex3, const double n1sinTheta1)
static double GetAbsorptance(const double nIndex1, const dcomplex &nIndex2, const double nIndex3, const double sinTheta1, const double thickness, const double wavelength)
static double GetReflectance3(const Etas &etas, const std::pair< dcomplex, dcomplex > &bc)
static double GetTransmittance(const double nIndex1, const dcomplex &nIndex2, const double nIndex3, const double sinTheta1, const double thickness, const double wavelength)
static double GetXtance(const double nIndex1, const dcomplex &nIndex2, const double nIndex3, const double sinTheta1, const double thickness, const double wavelength)
std::complex< double > dcomplex
static double GetReflectance(const double nIndex1, const dcomplex &nIndex2, const double nIndex3, const double sinTheta1, const double thickness, const double wavelength)
static Etas GetAllEtasS(const double nIndex1, const dcomplex &nIndex2, const double nIndex3, const double n1sinTheta1)
static T GetEtaS(const T &nIndex, const double n1sinTheta1)
static double GetAbsorptance3(const Etas &etas, const std::pair< dcomplex, dcomplex > &bc)
static T GetSnellNCosTheta(const T &nIndex, const double n1sinTheta1)
static dcomplex GetPhase(const dcomplex &nIndex, const double n1sinTheta1, const double thickness, const double wavelength)