CSR sun

Jump to: navigation, search

dayLength, noon, dawn, dusk

DayLength is calculated from the combination of latitude [0°..90°] and day number [1..365] (no account for leap years). Noon is set to 12.00 minus the time equation, however, for the benefit of comparability of models, the time equation in CSR's Sun is forced to zero. Dusk and dawn equal noon +/- half the day length.



The declination of the sun is the angle between the rays of the Sun and the plane of the Earth's equator. At the solstices, the declination reaches its maximum value of 23°26'. At the moment of each equinox, the center of the sun appears to pass through the celestial equator, and the declination is 0°. Declination.png

solar altitude

The solar altitude is the apparent angle between the horizon and the sun. It depends on the latitude, the declination and the time of the day.

sine of solar altitude
hourangle   = self.RADperHOUR * (time + self.equation - 12.)
return        (sin(self.declination) * sin(self.latitude)
             + cos(self.declination) * cos(self.latitude)
             * cos(hourangle))

Solar altitude annual.png

Solar altitude diurnal.png

atmospheric transmission factor

def getAtmosphericTransmissionFactor(self, measuredGlobalRadiation, time = NOON):
  Use measured global radiation to determine the atmospheric transmission factor.
  @param measuredGlobalRadiation: global radiation at the top of the canopy (J/m2.day)
  @return: fraction transmitted
  AVRAD   = measuredGlobalRadiation
  SINB    = self.sineOfSolarAltitude(time)
  ATMTR  = (AVRAD * (1. + 0.4 * SINB)) / (self.solarConstant * self._DSINBE)
  return ATMTR


ATMTR t.png

fraction diffuse light

The fraction of scattered light within the total radiation can be calculated in a SIMPLE way, following the straight line models by Goudriaan & Van Laar (1994: p. 32), of by curvilinear models. Of both types paramitrizations exist for daily and hourly calculations. The former (daily) mode is chosen when the time-parameter is left to default: FrDiff AtmTr.png

Of the hourly modes, the standard from ForGro seems ill-behaved: FrDiff hourly.png


The PAR is linear with global radiation and a sine function taking into account the solar altitude:

SINB    = self.sineOfSolarAltitude(time)
PARTOT  = 0.5*measuredGlobalRadiation * SINB*(1.+0.4*SINB)/self._DSINBE
return max(0.0, PARTOT)

PAR time.png


An important internal variable used in several of the sun's functions is the Daily integral of sine of solar height corrected for lower transmission at low elevation, in ancestorial models consequently called DSINBE. For it's calculation, the module SASTRO.F90 from Oryza2 (Van Kraalingen, 1996) has been incorporated. This module is by and by identical to ASTRO.FOR of earlier models, but can deal with the situation where declination + latitude surpasses 90°.

DSINBE integrates the solar altitude over a day and thus may be at odds with the independently calculated solar altitude. However, the diference should be minor.