source: tags/ORCHIDEE_1_9_5_2/ORCHIDEE/src_global/solar.f90 @ 3637

Last change on this file since 3637 was 42, checked in by mmaipsl, 14 years ago

MM: Replace all 0.0 by 'zero' and 1.0 by 'un',

and all 86400. by 'one_day' in the code to reduce explicit constants.

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