source: branches/ORCHIDEE_EXT/ORCHIDEE/src_global/solar.f90 @ 257

Last change on this file since 257 was 257, checked in by didier.solyga, 13 years ago

Externalized version merged with the trunk

File size: 6.2 KB
Line 
1!! This module define solar
2!!
3!! @call sechiba_main
4!! @Version : $Revision: 1.1 $, $Date: 2010/04/06 14:26:07 $
5!! @Version : $Revision: 42 $, $Date: 2011-01-01 21:15:03 +0100 (Sat, 01 Jan 2011) $
6!!
7!! $Header: /home/ssipsl/CVSREP/ORCHIDEE/src_global/solar.f90,v 1.1 2010/04/06 14:26:07 ssipsl Exp $
8!
9!< $HeadURL: http://forge.ipsl.jussieu.fr/orchidee/svn/trunk/ORCHIDEE/src_global/solar.f90 $
10!< $Date: 2011-01-01 21:15:03 +0100 (Sat, 01 Jan 2011) $
11!< $Author: mmaipsl $
12!< $Revision: 42 $
13!!
14!! @author Marie-Alice Foujols, Jan Polcher and Martial Mancip
15!!
16!!
17MODULE solar
18
19  USE defprec
20  USE constantes
21  USE parallel
22
23  IMPLICIT NONE
24
25
26
27CONTAINS
28  !
29  !f90doc CONTAINS
30  !
31  !
32  !
33  !-
34  !=====================================================================
35  SUBROUTINE solarang (julian, julian0, iim, jjm, lon, lat, csang)
36    !---------------------------------------------------------------------
37    !- This subroutine computes the solar angle according to the method
38    !- used by GSWP and developed by J.C. Morill.
39    !- See for further details :
40    !- http://www.atmo.arizona.edu/~morrill/swrad.html
41    !---------------------------------------------------------------------
42    !
43    USE calendar
44    !
45    IMPLICIT NONE
46    !-
47    INTEGER,INTENT(in) :: iim, jjm
48    REAL,INTENT(in)  :: julian
49    REAL,INTENT(in)  :: julian0
50    REAL,DIMENSION(iim,jjm), INTENT(in)  :: lon, lat
51    REAL,DIMENSION(iim,jjm), INTENT(out) :: csang
52    !-
53    REAL ::  gamma, dec, decd
54    REAL :: et, gmt, le, ls, lcorr, latime, omega, omegad
55    REAL :: llatd, llat
56    INTEGER :: igmt, ilon, ilat
57    INTEGER,SAVE,ALLOCATABLE :: zone(:), lhour(:)
58    !
59    LOGICAL :: check = .FALSE.
60    !---------------------------------------------------------------------
61    !
62    IF (check) WRITE(numout,*) 'We get the right calendar information'
63    !-
64    !- 1) Day angle gamma
65    !-
66    !   gamma = 2.*pi*MOD(julian,one_year)/one_year
67    gamma = 2.*pi*(julian-julian0)/one_year
68    !-
69    !- 2) Solar declination (assumed constant for a 24 hour period)  page 7
70    !-    in radians
71    !-
72    IF (check) WRITE(numout,*) 'Solar declination'
73    !
74    dec = ( 0.006918-0.399912*COS(gamma)+0.070257*SIN(gamma) &
75         &       -0.006758*COS(2*gamma)+0.000907*SIN(2*gamma)      &
76         &       -0.002697*COS(3*gamma)+0.00148*SIN(3*gamma))
77    decd = dec*(180/pi)
78    !-
79    !- maximum error 0.0006 rad (<3'), leads to error
80    !- of less than 1/2 degree in zenith angle
81    !-
82    IF (check) WRITE(numout,*) 'Equation of time'
83    !- 3)  Equation of time  page 11
84    !-
85    et = ( 0.000075+0.001868*COS(gamma)-0.032077*SIN(gamma)&
86         &      -0.014615*COS(2*gamma)-0.04089*SIN(2*gamma))*229.18
87    !-
88    !- Get the time zones for the current time
89    !-
90    gmt = 24.*(julian-INT(julian))
91    IF (.NOT.ALLOCATED(zone))  ALLOCATE(zone(iim))
92    IF (.NOT.ALLOCATED(lhour)) ALLOCATE(lhour(iim))
93    !-
94    igmt = NINT(gmt)
95    IF (check) WRITE(numout,*) 'Get time zone'
96    CALL time_zone(igmt, iim, jjm, lon, zone, lhour)
97    !-
98    !- Start a loop through the grid
99    !-
100    IF (check) WRITE(numout,*) 'Start a loop through the grid'
101    DO ilon=1,iim
102       !---
103       !--- 4) Local apparent time  page 13
104       !---
105       !--- ls     standard longitude (nearest 15 degree meridian)
106       !--- le     local longtitude
107       !--- lhour  local standard time
108       !--- latime local apparent time
109       !--- lcorr  longitudunal correction (minutes)
110       !---
111       le = lon(ilon,1)
112       ls = ((zone(ilon)-1)*15)-180.
113       lcorr = 4.*(ls-le)*(-1)
114       latime = lhour(ilon)+lcorr/60.+et/60.
115       IF (latime <  0.) latime = latime+24
116       IF (latime > 24.) latime = latime-24
117       !---
118       !--- 5) Hour angle omega  page 15
119       !---
120       !--- hour angle is zero at noon, positive in the morning
121       !--- It ranges from 180 to -180
122       !---
123       !--- omegad is omega in degrees, omega is in radians
124       !---
125       omegad = (latime-12.)*(-15.)
126       omega  = omegad*pi/180.
127       !---
128       DO ilat=1,jjm
129          !-----
130          !----- 6)  Zenith angle  page 15
131          !-----
132          !----- csang cosine of zenith angle (radians)
133          !----- llatd =  local latitude in degrees
134          !----- llat  =  local latitude in radians
135          !-----
136          llatd = lat(1,ilat)
137          llat  = llatd*pi/180.
138          csang(ilon,ilat) = &
139               &  MAX(zero,SIN(dec)*SIN(llat)+COS(dec)*COS(llat)*COS(omega))
140       ENDDO
141    ENDDO
142    !----------------------
143  END SUBROUTINE solarang
144  !-
145  !=====================================================================
146  SUBROUTINE time_zone (gmt, iim, jjm, lon, zone, lhour)
147    !---------------------------------------------------------------------
148    !
149    IMPLICIT NONE
150    !
151    INTEGER :: gmt, iim, jjm, zone(iim), lhour(iim)
152    REAL :: lon(iim,jjm)
153    !-
154    INTEGER :: deg
155    !!??   REAL :: deg
156    INTEGER :: i, ilon, change
157    !---------------------------------------------------------------------
158    DO ilon=1,iim
159       !---
160       !--- Convert longitude index to longtitude in degrees
161       !---
162       deg = lon(ilon,1)
163       !---
164       !--- Determine into which time zone (15 degree interval) the
165       !--- longitude falls.
166       !---
167       DO i=1,25
168          IF (deg < (-187.5+(15*i))) THEN
169             zone(ilon) = i
170             IF (zone(ilon) == 25)   zone(ilon) = 1
171             EXIT
172          ENDIF
173       ENDDO
174       !---
175       !--- Calculate change (in number of hours) from GMT time to
176       !--- local hour.  Change will be negative for zones < 13 and
177       !--- positive for zones > 13.
178       !---
179       !--- There is also a correction for lhour < 0 and lhour > 23
180       !--- to lhour between 0 and 23.
181       !---
182       IF (zone(ilon) < 13) THEN
183          change = zone(ilon)-13
184          lhour(ilon) = gmt+change
185       ENDIF
186       !---
187       IF (zone(ilon) == 13) THEN
188          lhour(ilon) = gmt
189       ENDIF
190       !---
191       IF (zone(ilon) > 13) THEN
192          change = zone(ilon)-13
193          lhour(ilon) = gmt+change
194       ENDIF
195       IF (lhour(ilon) <  0) lhour(ilon) = lhour(ilon)+24
196       IF (lhour(ilon) > 23) lhour(ilon) = lhour(ilon)-24
197       !---
198    ENDDO
199    !-----------------------
200  END SUBROUTINE time_zone
201
202!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
203 
204END MODULE solar
Note: See TracBrowser for help on using the repository browser.