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

Last change on this file since 2322 was 2322, checked in by lguez, 9 years ago

Bug fix in alboc_cd (more than 11 years old). rmu0 must not be
modified in alboc_cd. The corresponding actual argument in subroutine
surf_ocean is an intent(in) argument of surf_ocean. It probably worked
before because the compiler made a copy of the argument but I would
say the behavior was in principle compiler-dependent and
optimization-level-dependent.

  • 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.6 KB
Line 
1! $Id: albedo.F90 2322 2015-07-07 16:01:01Z lguez $
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    ! ym#include "dimensions.h"
22    ! ym#include "dimphy.h"
23    include "YOMCST.h"
24    include "clesphys.h"
25
26    ! fmagic -> clesphys.h/.inc
27    ! REAL fmagic ! un facteur magique pour regler l'albedo
28    ! cc      PARAMETER (fmagic=0.7)
29    ! ccIM => a remplacer
30    ! PARAMETER (fmagic=1.32)
31    ! PARAMETER (fmagic=1.0)
32    ! PARAMETER (fmagic=0.7)
33    INTEGER npts ! il controle la precision de l'integration
34    PARAMETER (npts=120) ! 120 correspond a l'interval 6 minutes
35
36    REAL rlat(klon), rjour, albedo(klon)
37    REAL zdist, zlonsun, zpi, zdeclin
38    REAL rmu, alb, srmu, salb, fauxo, aa, bb
39    INTEGER i, k
40    ! ccIM
41    LOGICAL ancien_albedo
42    PARAMETER (ancien_albedo=.FALSE.)
43    ! SAVE albedo
44
45    IF (ancien_albedo) THEN
46
47       zpi = 4.*atan(1.)
48
49       ! Calculer la longitude vraie de l'orbite terrestre:
50       CALL orbite(rjour, zlonsun, zdist)
51
52       ! Calculer la declinaison du soleil (qui varie entre + et - R_incl):
53       zdeclin = asin(sin(zlonsun*zpi/180.0)*sin(r_incl*zpi/180.0))
54
55       DO i = 1, klon
56          aa = sin(rlat(i)*zpi/180.0)*sin(zdeclin)
57          bb = cos(rlat(i)*zpi/180.0)*cos(zdeclin)
58
59          ! Midi local (angle du temps = 0.0):
60          rmu = aa + bb*cos(0.0)
61          rmu = max(0.0, rmu)
62          fauxo = (1.47-acos(rmu))/.15
63          alb = 0.03 + 0.630/(1.+fauxo*fauxo)
64          srmu = rmu
65          salb = alb*rmu
66
67          ! Faire l'integration numerique de midi a minuit (le facteur 2
68          ! prend en compte l'autre moitie de la journee):
69          DO k = 1, npts
70             rmu = aa + bb*cos(real(k)/real(npts)*zpi)
71             rmu = max(0.0, rmu)
72             fauxo = (1.47-acos(rmu))/.15
73             alb = 0.03 + 0.630/(1.+fauxo*fauxo)
74             srmu = srmu + rmu*2.0
75             salb = salb + alb*rmu*2.0
76          END DO
77          IF (srmu/=0.0) THEN
78             albedo(i) = salb/srmu*fmagic + pmagic
79          ELSE ! nuit polaire (on peut prendre une valeur quelconque)
80             albedo(i) = fmagic
81          END IF
82       END DO
83
84       ! nouvel albedo
85
86    ELSE
87
88       zpi = 4.*atan(1.)
89
90       ! Calculer la longitude vraie de l'orbite terrestre:
91       CALL orbite(rjour, zlonsun, zdist)
92
93       ! Calculer la declinaison du soleil (qui varie entre + et - R_incl):
94       zdeclin = asin(sin(zlonsun*zpi/180.0)*sin(r_incl*zpi/180.0))
95
96       DO i = 1, klon
97          aa = sin(rlat(i)*zpi/180.0)*sin(zdeclin)
98          bb = cos(rlat(i)*zpi/180.0)*cos(zdeclin)
99
100          ! Midi local (angle du temps = 0.0):
101          rmu = aa + bb*cos(0.0)
102          rmu = max(0.0, rmu)
103          ! IM cf. PB  alb = 0.058/(rmu + 0.30)
104          ! alb = 0.058/(rmu + 0.30) * 1.5
105          alb = 0.058/(rmu+0.30)*1.2
106          ! alb = 0.058/(rmu + 0.30) * 1.3
107          srmu = rmu
108          salb = alb*rmu
109
110          ! Faire l'integration numerique de midi a minuit (le facteur 2
111          ! prend en compte l'autre moitie de la journee):
112          DO k = 1, npts
113             rmu = aa + bb*cos(real(k)/real(npts)*zpi)
114             rmu = max(0.0, rmu)
115             ! IM cf. PB      alb = 0.058/(rmu + 0.30)
116             ! alb = 0.058/(rmu + 0.30) * 1.5
117             alb = 0.058/(rmu+0.30)*1.2
118             ! alb = 0.058/(rmu + 0.30) * 1.3
119             srmu = srmu + rmu*2.0
120             salb = salb + alb*rmu*2.0
121          END DO
122          IF (srmu/=0.0) THEN
123             albedo(i) = salb/srmu*fmagic + pmagic
124          ELSE ! nuit polaire (on peut prendre une valeur quelconque)
125             albedo(i) = fmagic
126          END IF
127       END DO
128    END IF
129    RETURN
130  END SUBROUTINE alboc
131  ! =====================================================================
132  SUBROUTINE alboc_cd(rmu0, albedo)
133    USE dimphy
134
135    ! Auteur(s): Z.X. Li (LMD/CNRS)
136    ! date: 19940624
137    ! Calculer l'albedo sur l'ocean en fonction de l'angle zenithal moyen
138    ! Formule due a Larson and Barkstrom (1977) Proc. of the symposium
139    ! on radiation in the atmosphere, 19-28 August 1976, science Press,
140    ! 1977 pp 451-453, ou These de 3eme cycle de Sylvie Joussaume.
141
142    ! Arguments
143    ! rmu0    (in): cosinus de l'angle solaire zenithal
144    ! albedo (out): albedo de surface de l'ocean
145    ! ======================================================================
146    include "clesphys.h"
147    REAL, intent(in):: rmu0(klon)
148    real, intent(out):: albedo(klon)
149
150    ! REAL fmagic ! un facteur magique pour regler l'albedo
151    ! cc      PARAMETER (fmagic=0.7)
152    ! ccIM => a remplacer
153    ! PARAMETER (fmagic=1.32)
154    ! PARAMETER (fmagic=1.0)
155    ! PARAMETER (fmagic=0.7)
156
157    REAL fauxo
158    INTEGER i
159    LOGICAL ancien_albedo
160    PARAMETER (ancien_albedo=.FALSE.)
161
162    IF (ancien_albedo) THEN
163       DO i = 1, klon
164          fauxo = (1.47-acos(max(rmu0(i), 0.0)))/0.15
165          albedo(i) = fmagic*(.03+.630/(1.+fauxo*fauxo)) + pmagic
166          albedo(i) = max(min(albedo(i),0.60), 0.04)
167       END DO
168    ELSE
169       DO i = 1, klon
170          albedo(i) = fmagic*0.058/(max(rmu0(i), 0.0)+0.30) + pmagic
171          albedo(i) = max(min(albedo(i),0.60), 0.04)
172       END DO
173    END IF
174
175  END SUBROUTINE alboc_cd
176
177end module albedo
Note: See TracBrowser for help on using the repository browser.