GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: phylmd/albedo.F90 Lines: 0 26 0.0 %
Date: 2023-06-30 12:56:34 Branches: 0 8 0.0 %

Line Branch Exec Source
1
! $Id: albedo.F90 2413 2015-12-18 19:27:39Z oboucher $
2
module albedo
3
4
  IMPLICIT NONE
5
6
contains
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
161
end module albedo