source: LMDZ6/branches/LMDZ-COSP/libf/phylmd/albedo.f90 @ 5926

Last change on this file since 5926 was 5894, checked in by Sebastien Nguyen, 2 weeks ago

rephase LMDZISO with 5864 version of phylmd + bug fixes in physiq_mod + other bugs in isoverif sections. Code now compiles and runs with -debug -isotopes true -isoverif. There are still isoverif error messages for Dexcess getting greater than 1000 on some points at some moments.

  • 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 5894 2025-11-28 16:34:54Z lebasn $
2MODULE albedo
3
4  USE clesphys_mod_h
5  USE yomcst_mod_h
6  IMPLICIT NONE
7
8CONTAINS
9
10  SUBROUTINE alboc(rjour, rlat, albedo)
11    USE dimphy
12    USE clesphys_mod_h
13    USE orbite_mod, ONLY: orbite
14    ! ======================================================================
15    ! Auteur(s): Z.X. Li (LMD/CNRS) (adaptation du GCM du LMD)
16    ! Date: le 16 mars 1995
17    ! Objet: Calculer l'albedo sur l'ocean
18    ! Methode: Integrer numeriquement l'albedo pendant une journee
19
20    ! Arguments;
21    ! rjour (in,R)  : jour dans l'annee (a compter du 1 janvier)
22    ! rlat (in,R)   : latitude en degre
23    ! albedo (out,R): albedo obtenu (de 0 a 1)
24    ! ======================================================================
25
26    INTEGER npts ! il controle la precision de l'integration
27    PARAMETER (npts=120) ! 120 correspond a l'interval 6 minutes
28
29    REAL rlat(klon), rjour, albedo(klon)
30    REAL zdist, zlonsun, zpi, zdeclin
31    REAL rmu, alb, srmu, salb, fauxo, aa, bb
32    INTEGER i, k
33    ! ccIM
34    LOGICAL ancien_albedo
35    PARAMETER (ancien_albedo=.FALSE.)
36    ! SAVE albedo
37
38    IF (ancien_albedo) THEN
39
40       zpi = 4.*atan(1.)
41
42       ! Calculer la longitude vraie de l'orbite terrestre:
43       CALL orbite(rjour, zlonsun, zdist)
44
45       ! Calculer la declinaison du soleil (qui varie entre + et - R_incl):
46       zdeclin = asin(sin(zlonsun*zpi/180.0)*sin(r_incl*zpi/180.0))
47
48       DO i = 1, klon
49          aa = sin(rlat(i)*zpi/180.0)*sin(zdeclin)
50          bb = cos(rlat(i)*zpi/180.0)*cos(zdeclin)
51
52          ! Midi local (angle du temps = 0.0):
53          rmu = aa + bb*cos(0.0)
54          rmu = max(0.0, rmu)
55          fauxo = (1.47-acos(rmu))/.15
56          alb = 0.03 + 0.630/(1.+fauxo*fauxo)
57          srmu = rmu
58          salb = alb*rmu
59
60          ! Faire l'integration numerique de midi a minuit (le facteur 2
61          ! prend en compte l'autre moitie de la journee):
62          DO k = 1, npts
63             rmu = aa + bb*cos(real(k)/real(npts)*zpi)
64             rmu = max(0.0, rmu)
65             fauxo = (1.47-acos(rmu))/.15
66             alb = 0.03 + 0.630/(1.+fauxo*fauxo)
67             srmu = srmu + rmu*2.0
68             salb = salb + alb*rmu*2.0
69          END DO
70          IF (srmu/=0.0) THEN
71             albedo(i) = salb/srmu
72          ELSE ! nuit polaire (on peut prendre une valeur quelconque)
73             albedo(i) = 1.0
74          END IF
75       END DO
76
77       ! nouvel albedo
78
79    ELSE
80
81       zpi = 4.*atan(1.)
82
83       ! Calculer la longitude vraie de l'orbite terrestre:
84       CALL orbite(rjour, zlonsun, zdist)
85
86       ! Calculer la declinaison du soleil (qui varie entre + et - R_incl):
87       zdeclin = asin(sin(zlonsun*zpi/180.0)*sin(r_incl*zpi/180.0))
88
89       DO i = 1, klon
90          aa = sin(rlat(i)*zpi/180.0)*sin(zdeclin)
91          bb = cos(rlat(i)*zpi/180.0)*cos(zdeclin)
92
93          ! Midi local (angle du temps = 0.0):
94          rmu = aa + bb*cos(0.0)
95          rmu = max(0.0, rmu)
96          ! IM cf. PB  alb = 0.058/(rmu + 0.30)
97          ! alb = 0.058/(rmu + 0.30) * 1.5
98          alb = 0.058/(rmu+0.30)*1.2
99          ! alb = 0.058/(rmu + 0.30) * 1.3
100          srmu = rmu
101          salb = alb*rmu
102
103          ! Faire l'integration numerique de midi a minuit (le facteur 2
104          ! prend en compte l'autre moitie de la journee):
105          DO k = 1, npts
106             rmu = aa + bb*cos(real(k)/real(npts)*zpi)
107             rmu = max(0.0, rmu)
108             ! IM cf. PB      alb = 0.058/(rmu + 0.30)
109             ! alb = 0.058/(rmu + 0.30) * 1.5
110             alb = 0.058/(rmu+0.30)*1.2
111             ! alb = 0.058/(rmu + 0.30) * 1.3
112             srmu = srmu + rmu*2.0
113             salb = salb + alb*rmu*2.0
114          END DO
115          IF (srmu/=0.0) THEN
116             albedo(i) = salb/srmu
117          ELSE ! nuit polaire (on peut prendre une valeur quelconque)
118             albedo(i) = 1.0
119          END IF
120       END DO
121    END IF
122    RETURN
123  END SUBROUTINE alboc
124  ! =====================================================================
125  SUBROUTINE alboc_cd(rmu0, albedo)
126    USE dimphy
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.