MeteoIODoc  2.10.0
Suntrajectory.h
Go to the documentation of this file.
1 // SPDX-License-Identifier: LGPL-3.0-or-later
2 /***********************************************************************************/
3 /* Copyright 2009 WSL Institute for Snow and Avalanche Research SLF-DAVOS */
4 /***********************************************************************************/
5 /* This file is part of MeteoIO.
6  MeteoIO is free software: you can redistribute it and/or modify
7  it under the terms of the GNU Lesser General Public License as published by
8  the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  MeteoIO is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU Lesser General Public License for more details.
15 
16  You should have received a copy of the GNU Lesser General Public License
17  along with MeteoIO. If not, see <http://www.gnu.org/licenses/>.
18 */
19 #ifndef SUNTAJECTORY_H
20 #define SUNTAJECTORY_H
21 
22 namespace mio {
23 
33  public:
34  SunTrajectory();
35  SunTrajectory(const double& i_latitude, const double& i_longitude);
36 
37  virtual ~SunTrajectory() {}
38 
44  virtual void setDate(const double& i_julian, const double& i_TZ=0.)=0;
45  virtual void setLatLon(const double& i_latitude, const double& i_longitude)=0;
46  virtual void setAll(const double& i_latitude, const double& i_longitude, const double& i_julian, const double& i_TZ=0.)=0;
47  virtual void reset()=0;
48 
51  virtual double getSolarElevation() const=0;
52  virtual void getHorizontalCoordinates(double& azimuth, double& elevation) const=0;
53  virtual void getHorizontalCoordinates(double& azimuth, double& elevation, double& eccentricity) const=0;
54  virtual void getDaylight(double& sunrise, double& sunset, double& daylight)=0;
55  virtual double getSolarTime() const;
56  virtual double getSolarTimeOfDay() const;
57  static void getEaster(const int& year, int &month, int &day);
58 
60  virtual void getEquatorialCoordinates(double& right_ascension, double& declination)=0;
61 
63  double getAngleOfIncidence(const double& slope_azi, const double& slope_elev) const;
64  double getRadiationOnHorizontal(const double& radiation) const;
65  double getRadiationOnSlope(const double& slope_azi, const double& slope_elev, const double& radiation) const;
66  double getHorizontalOnSlope(const double& slope_azi, const double& slope_elev, const double& H_radiation, const double& elev_threshold=5.) const;
67 
69  static double getAngleOfIncidence(const double& sun_azi, const double& sun_elev,
70  const double& slope_azi, const double& slope_elev);
71  static double projectHorizontalToSlope(const double& sun_azi, const double& sun_elev,
72  const double& slope_azi, const double& slope_elev, const double& H_radiation, const double& elev_threshold=5.);
73  static double projectSlopeToHorizontal(const double& sun_azi, const double& sun_elev,
74  const double& slope_azi, const double& slope_elev, const double& S_radiation);
75  static double projectHorizontalToBeam(const double& sun_elev, const double& H_radiation);
76 
77  const std::string toString() const;
78 
79  protected:
80  virtual void update()=0;
81 
82  protected:
83  double julian_gmt, TZ;
89  double HourAngle;
90  static const double nodata;
91 };
92 
106 class SunMeeus : public SunTrajectory {
107  public:
108  SunMeeus();
110  SunMeeus(const double& i_latitude, const double& i_longitude);
111  SunMeeus(const double& i_latitude, const double& i_longitude, const double& i_julian, const double& i_TZ=0.);
112 
113  void setDate(const double& i_julian, const double& i_TZ=0.);
114  void setLatLon(const double& i_latitude, const double& i_longitude);
115  void setAll(const double& i_latitude, const double& i_longitude, const double& i_julian, const double& i_TZ=0.);
116  void reset();
117 
118  double getSolarElevation() const;
119  void getHorizontalCoordinates(double& azimuth, double& elevation) const;
120  void getHorizontalCoordinates(double& azimuth, double& elevation, double& eccentricity) const;
121  void getDaylight(double& sunrise, double& sunset, double& MeeusDaylight);
122  void getEquatorialSunVector(double& sunx, double& suny, double& sunz);
123  void getEquatorialCoordinates(double& right_ascension, double& declination);
124 
125  static double SideralToLocal(const double& JD);
126  private:
127  void private_init();
128  void update();
129 
130  private:
131  double SolarElevationAtm;
132 
133 };
134 
135 } //end namespace
136 
137 #endif
Calculate the Sun's position based on the Meeus algorithm. See J. Meeus, "Astronomical Algorithms",...
Definition: Suntrajectory.h:106
SunMeeus()
Definition: Suntrajectory.cc:269
~SunMeeus()
Definition: Suntrajectory.h:109
double getSolarElevation() const
Definition: Suntrajectory.cc:325
void setAll(const double &i_latitude, const double &i_longitude, const double &i_julian, const double &i_TZ=0.)
Definition: Suntrajectory.cc:310
void setLatLon(const double &i_latitude, const double &i_longitude)
Definition: Suntrajectory.cc:300
void getDaylight(double &sunrise, double &sunset, double &MeeusDaylight)
Definition: Suntrajectory.cc:354
static double SideralToLocal(const double &JD)
Definition: Suntrajectory.cc:395
void getHorizontalCoordinates(double &azimuth, double &elevation) const
Definition: Suntrajectory.cc:336
void getEquatorialSunVector(double &sunx, double &suny, double &sunz)
Definition: Suntrajectory.cc:379
void getEquatorialCoordinates(double &right_ascension, double &declination)
(http://en.wikipedia.org/wiki/Equatorial_coordinate_system)
Definition: Suntrajectory.cc:367
void setDate(const double &i_julian, const double &i_TZ=0.)
Set the date and time if no timezone is specified, GMT is assumed.
Definition: Suntrajectory.cc:290
void reset()
Definition: Suntrajectory.cc:319
A class to calculate the Sun's position This class is purely virtual.
Definition: Suntrajectory.h:32
static const double nodata
Definition: Suntrajectory.h:90
double longitude
Definition: Suntrajectory.h:84
SunTrajectory()
Definition: Suntrajectory.cc:33
virtual void getDaylight(double &sunrise, double &sunset, double &daylight)=0
virtual void reset()=0
virtual double getSolarTime() const
Return the current solar time. Since the Sun reaches its zenith at a time different than the local no...
Definition: Suntrajectory.cc:183
double TZ
Definition: Suntrajectory.h:83
double SolarElevation
Definition: Suntrajectory.h:85
virtual double getSolarTimeOfDay() const
Return the current solar time of day. Since the Sun reaches its zenith at a time different than the l...
Definition: Suntrajectory.cc:198
double SunRise
Definition: Suntrajectory.h:87
virtual void update()=0
virtual void setDate(const double &i_julian, const double &i_TZ=0.)=0
Set the date and time if no timezone is specified, GMT is assumed.
virtual void setLatLon(const double &i_latitude, const double &i_longitude)=0
double SunlightDuration
Definition: Suntrajectory.h:87
static void getEaster(const int &year, int &month, int &day)
Return the date of easter for the given year.
Definition: Suntrajectory.cc:221
double eccentricityEarth
>this is the TRUE solar elevation, not the apparent one
Definition: Suntrajectory.h:86
virtual void getEquatorialCoordinates(double &right_ascension, double &declination)=0
(http://en.wikipedia.org/wiki/Equatorial_coordinate_system)
double latitude
Definition: Suntrajectory.h:84
double SolarNoon
Definition: Suntrajectory.h:87
double getHorizontalOnSlope(const double &slope_azi, const double &slope_elev, const double &H_radiation, const double &elev_threshold=5.) const
Project a given horizontal radiation to a given slope. The sun position is the current one,...
Definition: Suntrajectory.cc:108
static double projectSlopeToHorizontal(const double &sun_azi, const double &sun_elev, const double &slope_azi, const double &slope_elev, const double &S_radiation)
Definition: Suntrajectory.cc:143
double SolarAzimuthAngle
Definition: Suntrajectory.h:85
double getRadiationOnSlope(const double &slope_azi, const double &slope_elev, const double &radiation) const
Definition: Suntrajectory.cc:84
static double projectHorizontalToSlope(const double &sun_azi, const double &sun_elev, const double &slope_azi, const double &slope_elev, const double &H_radiation, const double &elev_threshold=5.)
Definition: Suntrajectory.cc:124
double SunSet
Definition: Suntrajectory.h:87
virtual ~SunTrajectory()
Definition: Suntrajectory.h:37
static double projectHorizontalToBeam(const double &sun_elev, const double &H_radiation)
Definition: Suntrajectory.cc:160
double HourAngle
Definition: Suntrajectory.h:89
virtual void setAll(const double &i_latitude, const double &i_longitude, const double &i_julian, const double &i_TZ=0.)=0
const std::string toString() const
Definition: Suntrajectory.cc:242
double SunDeclination
Definition: Suntrajectory.h:88
double julian_gmt
Definition: Suntrajectory.h:83
virtual void getHorizontalCoordinates(double &azimuth, double &elevation, double &eccentricity) const =0
virtual void getHorizontalCoordinates(double &azimuth, double &elevation) const =0
virtual double getSolarElevation() const =0
double getRadiationOnHorizontal(const double &radiation) const
Definition: Suntrajectory.cc:73
double SunRightAscension
Definition: Suntrajectory.h:88
double getAngleOfIncidence(const double &slope_azi, const double &slope_elev) const
radiation projection methods
Definition: Suntrajectory.cc:54
Definition: Config.cc:30