source: LMDZ6/trunk/libf/phylmd/albedo.f90 @ 5282

Last change on this file since 5282 was 5282, checked in by abarral, 6 hours ago

Turn iniprint.h clesphys.h into modules
Remove unused description.h

  • 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.8 KB
Line 
1! $Id: albedo.f90 5282 2024-10-28 12:11:48Z abarral $
2module albedo
3
4  USE clesphys_mod_h
5    USE yomcst_mod_h, ONLY: RPI, RCLUM, RHPLA, RKBOL, RNAVO                   &
6          , RDAY, REA, REPSM, RSIYEA, RSIDAY, ROMEGA                  &
7          , R_ecc, R_peri, R_incl                                      &
8          , RA, RG, R1SA                                         &
9          , RSIGMA                                                     &
10          , R, RMD, RMV, RD, RV, RCPD                    &
11          , RMO3, RMCO2, RMC, RMCH4, RMN2O, RMCFC11, RMCFC12        &
12          , RCPV, RCVD, RCVV, RKAPPA, RETV, eps_w                    &
13          , RCW, RCS                                                 &
14          , RLVTT, RLSTT, RLMLT, RTT, RATM                           &
15          , RESTT, RALPW, RBETW, RGAMW, RALPS, RBETS, RGAMS            &
16          , RALPD, RBETD, RGAMD
17IMPLICIT NONE
18
19contains
20
21  SUBROUTINE alboc(rjour, rlat, albedo)
22    USE dimphy
23    USE clesphys_mod_h
24    ! ======================================================================
25    ! Auteur(s): Z.X. Li (LMD/CNRS) (adaptation du GCM du LMD)
26    ! Date: le 16 mars 1995
27    ! Objet: Calculer l'albedo sur l'ocean
28    ! Methode: Integrer numeriquement l'albedo pendant une journee
29
30    ! Arguments;
31    ! rjour (in,R)  : jour dans l'annee (a compter du 1 janvier)
32    ! rlat (in,R)   : latitude en degre
33    ! albedo (out,R): albedo obtenu (de 0 a 1)
34    ! ======================================================================
35
36    INTEGER npts ! il controle la precision de l'integration
37    PARAMETER (npts=120) ! 120 correspond a l'interval 6 minutes
38
39    REAL rlat(klon), rjour, albedo(klon)
40    REAL zdist, zlonsun, zpi, zdeclin
41    REAL rmu, alb, srmu, salb, fauxo, aa, bb
42    INTEGER i, k
43    ! ccIM
44    LOGICAL ancien_albedo
45    PARAMETER (ancien_albedo=.FALSE.)
46    ! SAVE albedo
47
48    IF (ancien_albedo) THEN
49
50       zpi = 4.*atan(1.)
51
52       ! Calculer la longitude vraie de l'orbite terrestre:
53       CALL orbite(rjour, zlonsun, zdist)
54
55       ! Calculer la declinaison du soleil (qui varie entre + et - R_incl):
56       zdeclin = asin(sin(zlonsun*zpi/180.0)*sin(r_incl*zpi/180.0))
57
58       DO i = 1, klon
59          aa = sin(rlat(i)*zpi/180.0)*sin(zdeclin)
60          bb = cos(rlat(i)*zpi/180.0)*cos(zdeclin)
61
62          ! Midi local (angle du temps = 0.0):
63          rmu = aa + bb*cos(0.0)
64          rmu = max(0.0, rmu)
65          fauxo = (1.47-acos(rmu))/.15
66          alb = 0.03 + 0.630/(1.+fauxo*fauxo)
67          srmu = rmu
68          salb = alb*rmu
69
70          ! Faire l'integration numerique de midi a minuit (le facteur 2
71          ! prend en compte l'autre moitie de la journee):
72          DO k = 1, npts
73             rmu = aa + bb*cos(real(k)/real(npts)*zpi)
74             rmu = max(0.0, rmu)
75             fauxo = (1.47-acos(rmu))/.15
76             alb = 0.03 + 0.630/(1.+fauxo*fauxo)
77             srmu = srmu + rmu*2.0
78             salb = salb + alb*rmu*2.0
79          END DO
80          IF (srmu/=0.0) THEN
81             albedo(i) = salb/srmu
82          ELSE ! nuit polaire (on peut prendre une valeur quelconque)
83             albedo(i) = 1.0
84          END IF
85       END DO
86
87       ! nouvel albedo
88
89    ELSE
90
91       zpi = 4.*atan(1.)
92
93       ! Calculer la longitude vraie de l'orbite terrestre:
94       CALL orbite(rjour, zlonsun, zdist)
95
96       ! Calculer la declinaison du soleil (qui varie entre + et - R_incl):
97       zdeclin = asin(sin(zlonsun*zpi/180.0)*sin(r_incl*zpi/180.0))
98
99       DO i = 1, klon
100          aa = sin(rlat(i)*zpi/180.0)*sin(zdeclin)
101          bb = cos(rlat(i)*zpi/180.0)*cos(zdeclin)
102
103          ! Midi local (angle du temps = 0.0):
104          rmu = aa + bb*cos(0.0)
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 = rmu
111          salb = alb*rmu
112
113          ! Faire l'integration numerique de midi a minuit (le facteur 2
114          ! prend en compte l'autre moitie de la journee):
115          DO k = 1, npts
116             rmu = aa + bb*cos(real(k)/real(npts)*zpi)
117             rmu = max(0.0, rmu)
118             ! IM cf. PB      alb = 0.058/(rmu + 0.30)
119             ! alb = 0.058/(rmu + 0.30) * 1.5
120             alb = 0.058/(rmu+0.30)*1.2
121             ! alb = 0.058/(rmu + 0.30) * 1.3
122             srmu = srmu + rmu*2.0
123             salb = salb + alb*rmu*2.0
124          END DO
125          IF (srmu/=0.0) THEN
126             albedo(i) = salb/srmu
127          ELSE ! nuit polaire (on peut prendre une valeur quelconque)
128             albedo(i) = 1.0
129          END IF
130       END DO
131    END IF
132    RETURN
133  END SUBROUTINE alboc
134  ! =====================================================================
135  SUBROUTINE alboc_cd(rmu0, albedo)
136    USE dimphy
137
138    ! Auteur(s): Z.X. Li (LMD/CNRS)
139    ! date: 19940624
140    ! Calculer l'albedo sur l'ocean en fonction de l'angle zenithal moyen
141    ! Formule due a Larson and Barkstrom (1977) Proc. of the symposium
142    ! on radiation in the atmosphere, 19-28 August 1976, science Press,
143    ! 1977 pp 451-453, ou These de 3eme cycle de Sylvie Joussaume.
144
145    ! Arguments
146    ! rmu0    (in): cosinus de l'angle solaire zenithal
147    ! albedo (out): albedo de surface de l'ocean
148    ! ======================================================================
149    REAL, intent(in):: rmu0(klon)
150    real, intent(out):: albedo(klon)
151
152    REAL fauxo
153    INTEGER i
154    LOGICAL ancien_albedo
155    PARAMETER (ancien_albedo=.FALSE.)
156
157    IF (ancien_albedo) THEN
158       DO i = 1, klon
159          fauxo = (1.47-acos(max(rmu0(i), 0.0)))/0.15
160          albedo(i) = 0.03+.630/(1.+fauxo*fauxo)
161          albedo(i) = max(min(albedo(i),0.60), 0.04)
162       END DO
163    ELSE
164       DO i = 1, klon
165          albedo(i) = 0.058/(max(rmu0(i), 0.0)+0.30)
166          albedo(i) = max(min(albedo(i),0.60), 0.04)
167       END DO
168    END IF
169
170  END SUBROUTINE alboc_cd
171
172end module albedo
Note: See TracBrowser for help on using the repository browser.