source: LMDZ6/branches/Amaury_dev/libf/phylmd/albedo.F90 @ 5151

Last change on this file since 5151 was 5144, checked in by abarral, 7 weeks ago

Put YOMCST.h into modules

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