//////////////////////////////////////////////////////////////////////// // // Implementation of oscillations of neutrinos in matter in a // three-neutrino framework. // // jcoelho\@apc.in2p3.fr //////////////////////////////////////////////////////////////////////// #include #include "PMNS_Iter.h" using namespace OscProb; //...................................................................... /// /// Constructor. \sa PMNS_Fast::PMNS_Fast /// /// This class is restricted to 3 neutrino flavours. /// PMNS_Iter::PMNS_Iter() : PMNS_Fast(), fPrec(0.1) {} //...................................................................... /// /// Nothing to clean. /// PMNS_Iter::~PMNS_Iter(){} //...................................................................... /// /// Propagate neutrino through matter component. /// void PMNS_Iter::SetExpVL(NuPath p) { double kr2GNe = kK2*M_SQRT2*kGf; kr2GNe *= p.density * p.zoa; // Matter potential in eV fVL = kr2GNe * kKm2eV * p.length; fExpVL = complexD(cos(fVL), -sin(fVL)); if(fIsNuBar) fExpVL = conj(fExpVL); } //...................................................................... /// /// Propagate neutrino through matter component. /// void PMNS_Iter::PropMatter() { fNuState[0] *= fExpVL; } //...................................................................... /// /// Just use the vacuum Hamiltonian to start. /// void PMNS_Iter::SolveHam() { if(fGotES) return; // Do vacuum oscillation in low density SetVacuumEigensystem(); fGotES = true; return; } //...................................................................... /// /// Set iterator precision /// void PMNS_Iter::SetPrec(double prec) { fPrec = prec; if(fPrec<=0) fPrec = 1e-3; } //...................................................................... /// /// Propagate neutrino state through split path /// void PMNS_Iter::PropagatePath(NuPath p) { SetExpVL(p); double dm = 0; for(int i=0; i