source: LMDZ5/trunk/libf/phylmd/albedo.F90 @ 5451

Last change on this file since 5451 was 2413, checked in by oboucher, 9 years ago

limiting iflag_rrtm=0 to NSW=2 case (NSW=4 and 6 were possible with slightly different averaging procedures)
limiting iflag_rrtm choices to 0 and 1
limiting iflag_albedo choices to 0 and 1
cleaning up surface ocean albedo parametrisations
fmagic and pmagic corrections are now done in surf_ocean_albedo.F90
fmagic and pmagic corrections also possible for iflag_rrtm=1 now

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.0 KB
Line 
1! $Id: albedo.F90 2413 2015-12-18 19:27:39Z fhourdin $
2module albedo
3
4  IMPLICIT NONE
5
6contains
7
8  SUBROUTINE alboc(rjour, rlat, albedo)
9    USE dimphy
10    ! ======================================================================
11    ! Auteur(s): Z.X. Li (LMD/CNRS) (adaptation du GCM du LMD)
12    ! Date: le 16 mars 1995
13    ! Objet: Calculer l'albedo sur l'ocean
14    ! Methode: Integrer numeriquement l'albedo pendant une journee
15
16    ! Arguments;
17    ! rjour (in,R)  : jour dans l'annee (a compter du 1 janvier)
18    ! rlat (in,R)   : latitude en degre
19    ! albedo (out,R): albedo obtenu (de 0 a 1)
20    ! ======================================================================
21    include "YOMCST.h"
22    include "clesphys.h"
23
24    INTEGER npts ! il controle la precision de l'integration
25    PARAMETER (npts=120) ! 120 correspond a l'interval 6 minutes
26
27    REAL rlat(klon), rjour, albedo(klon)
28    REAL zdist, zlonsun, zpi, zdeclin
29    REAL rmu, alb, srmu, salb, fauxo, aa, bb
30    INTEGER i, k
31    ! ccIM
32    LOGICAL ancien_albedo
33    PARAMETER (ancien_albedo=.FALSE.)
34    ! SAVE albedo
35
36    IF (ancien_albedo) THEN
37
38       zpi = 4.*atan(1.)
39
40       ! Calculer la longitude vraie de l'orbite terrestre:
41       CALL orbite(rjour, zlonsun, zdist)
42
43       ! Calculer la declinaison du soleil (qui varie entre + et - R_incl):
44       zdeclin = asin(sin(zlonsun*zpi/180.0)*sin(r_incl*zpi/180.0))
45
46       DO i = 1, klon
47          aa = sin(rlat(i)*zpi/180.0)*sin(zdeclin)
48          bb = cos(rlat(i)*zpi/180.0)*cos(zdeclin)
49
50          ! Midi local (angle du temps = 0.0):
51          rmu = aa + bb*cos(0.0)
52          rmu = max(0.0, rmu)
53          fauxo = (1.47-acos(rmu))/.15
54          alb = 0.03 + 0.630/(1.+fauxo*fauxo)
55          srmu = rmu
56          salb = alb*rmu
57
58          ! Faire l'integration numerique de midi a minuit (le facteur 2
59          ! prend en compte l'autre moitie de la journee):
60          DO k = 1, npts
61             rmu = aa + bb*cos(real(k)/real(npts)*zpi)
62             rmu = max(0.0, rmu)
63             fauxo = (1.47-acos(rmu))/.15
64             alb = 0.03 + 0.630/(1.+fauxo*fauxo)
65             srmu = srmu + rmu*2.0
66             salb = salb + alb*rmu*2.0
67          END DO
68          IF (srmu/=0.0) THEN
69             albedo(i) = salb/srmu
70          ELSE ! nuit polaire (on peut prendre une valeur quelconque)
71             albedo(i) = 1.0
72          END IF
73       END DO
74
75       ! nouvel albedo
76
77    ELSE
78
79       zpi = 4.*atan(1.)
80
81       ! Calculer la longitude vraie de l'orbite terrestre:
82       CALL orbite(rjour, zlonsun, zdist)
83
84       ! Calculer la declinaison du soleil (qui varie entre + et - R_incl):
85       zdeclin = asin(sin(zlonsun*zpi/180.0)*sin(r_incl*zpi/180.0))
86
87       DO i = 1, klon
88          aa = sin(rlat(i)*zpi/180.0)*sin(zdeclin)
89          bb = cos(rlat(i)*zpi/180.0)*cos(zdeclin)
90
91          ! Midi local (angle du temps = 0.0):
92          rmu = aa + bb*cos(0.0)
93          rmu = max(0.0, rmu)
94          ! IM cf. PB  alb = 0.058/(rmu + 0.30)
95          ! alb = 0.058/(rmu + 0.30) * 1.5
96          alb = 0.058/(rmu+0.30)*1.2
97          ! alb = 0.058/(rmu + 0.30) * 1.3
98          srmu = rmu
99          salb = alb*rmu
100
101          ! Faire l'integration numerique de midi a minuit (le facteur 2
102          ! prend en compte l'autre moitie de la journee):
103          DO k = 1, npts
104             rmu = aa + bb*cos(real(k)/real(npts)*zpi)
105             rmu = max(0.0, rmu)
106             ! IM cf. PB      alb = 0.058/(rmu + 0.30)
107             ! alb = 0.058/(rmu + 0.30) * 1.5
108             alb = 0.058/(rmu+0.30)*1.2
109             ! alb = 0.058/(rmu + 0.30) * 1.3
110             srmu = srmu + rmu*2.0
111             salb = salb + alb*rmu*2.0
112          END DO
113          IF (srmu/=0.0) THEN
114             albedo(i) = salb/srmu
115          ELSE ! nuit polaire (on peut prendre une valeur quelconque)
116             albedo(i) = 1.0
117          END IF
118       END DO
119    END IF
120    RETURN
121  END SUBROUTINE alboc
122  ! =====================================================================
123  SUBROUTINE alboc_cd(rmu0, albedo)
124    USE dimphy
125
126    ! Auteur(s): Z.X. Li (LMD/CNRS)
127    ! date: 19940624
128    ! Calculer l'albedo sur l'ocean en fonction de l'angle zenithal moyen
129    ! Formule due a Larson and Barkstrom (1977) Proc. of the symposium
130    ! on radiation in the atmosphere, 19-28 August 1976, science Press,
131    ! 1977 pp 451-453, ou These de 3eme cycle de Sylvie Joussaume.
132
133    ! Arguments
134    ! rmu0    (in): cosinus de l'angle solaire zenithal
135    ! albedo (out): albedo de surface de l'ocean
136    ! ======================================================================
137    include "clesphys.h"
138    REAL, intent(in):: rmu0(klon)
139    real, intent(out):: albedo(klon)
140
141    REAL fauxo
142    INTEGER i
143    LOGICAL ancien_albedo
144    PARAMETER (ancien_albedo=.FALSE.)
145
146    IF (ancien_albedo) THEN
147       DO i = 1, klon
148          fauxo = (1.47-acos(max(rmu0(i), 0.0)))/0.15
149          albedo(i) = 0.03+.630/(1.+fauxo*fauxo)
150          albedo(i) = max(min(albedo(i),0.60), 0.04)
151       END DO
152    ELSE
153       DO i = 1, klon
154          albedo(i) = 0.058/(max(rmu0(i), 0.0)+0.30)
155          albedo(i) = max(min(albedo(i),0.60), 0.04)
156       END DO
157    END IF
158
159  END SUBROUTINE alboc_cd
160
161end module albedo
Note: See TracBrowser for help on using the repository browser.