/** \file Declaration of HumidAirRayleighModel, a model to estimate molecular scattering and attenuation using the dispersion and height dependence of the index of refraction of air and the Rayleigh scattering cross section. \author M. Will \version $Id: HumidAirRayleighModel.h,v 1.1 2003/09/22 11:56:12 prado Exp $ \date 25 Mar 2009 */ #ifndef _atm_HumidAirRayleighModel_h_ #define _atm_HumidAirRayleighModel_h_ #include #include namespace atm { class ScatteringResult; class AttenuationResult; /** \class HumidAirRayleighModel HumidAirRayleighModel.h "atm/HumidAirRayleighModel.h" \brief Model for Rayleigh scattering and attenuation in a humid atmosphere \date 25 Mar 2009 \ingroup atm_models */ class HumidAirRayleighModel : public atm::VRayleighModel { public: HumidAirRayleighModel(); virtual ~HumidAirRayleighModel() { } atm::ScatteringResult EvaluateRayleighScattering( const utl::Point& xA, const utl::Point& xB, const double angle, const double distance, const std::vector& wLength) const; atm::ScatteringResult EvaluateRayleighScattering( const utl::Point& xA, const utl::Point& xB, const double angle, const double distance, const AttenuationResult& raylAtt) const; atm::AttenuationResult EvaluateRayleighAttenuation( const utl::Point& xInit, const utl::Point& xFinal, const std::vector& wLength) const; double EvaluateRayleighScattering(const utl::Point& xA, const utl::Point& xB, const double angle, const double distance, double wLength) const; double EvaluateRayleighScattering(const utl::Point& xA, const utl::Point& xB, const double angle, const double distance, const double raylAtt, double wLength) const; double EvaluateRayleighAttenuation(const utl::Point& xInit, const utl::Point& xFinal, double wLength) const; /// Attenuation in units of length [1/scattering coefficient] double GetAttenuationLength(const utl::Point& p, const double wLength) const; double EvaluateScatteringAngle(const utl::Point& p, const double angle, const double wLength) const; bool HasData() const { return true; } void Init(); private: double fIntegrationStepWidth; double KingFactor(const double wl, const double pressure, const double vaporPressure) const; double RayleighCrossSection(const double wl, const double refIndex, const double temperature, const double pressure, const double vaporPressure) const; REGISTER_MODEL(atm::VRayleighModel, "HumidAir", HumidAirRayleighModel); }; } // atm #endif // _atm_HumidAirRayleighModel_h_