GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: phylmd/ocean_albedo.F90 Lines: 53 61 86.9 %
Date: 2023-06-30 12:51:15 Branches: 74 90 82.2 %

Line Branch Exec Source
1
!
2
! $Id$
3
!
4
5
576
SUBROUTINE ocean_albedo(knon,zrmu0,knindex,pwind,SFRWL,alb_dir_new,alb_dif_new)
6
!!
7
!!****  *ALBEDO_RS14*
8
!!
9
!!    PURPOSE
10
!!    -------
11
!!     computes the direct & diffuse albedo over open water
12
!!
13
!!**  METHOD
14
!!    ------
15
!!
16
!!    EXTERNAL
17
!!    --------
18
!!
19
!!    IMPLICIT ARGUMENTS
20
!!    ------------------
21
!!
22
!!    REFERENCE
23
!!    ---------
24
!!
25
!!    AUTHOR
26
!!    ------
27
!!	R. Séférian           * Meteo-France *
28
!!
29
!!    MODIFICATIONS
30
!!    -------------
31
!!      Original    03/2014
32
!!                  05/2014 R. Séférian & B. Decharme :: Adaptation to spectral
33
!!                  computation for diffuse and direct albedo
34
!!                  08/2014 S. Baek :: for wider wavelength range 200-4000nm and
35
!!                  adaptation to LMDZ + whitecap effect by Koepke + chrolophyll
36
!!                  map from climatology file
37
!!                  10/2016 O. Boucher :: some optimisation following R.
38
!!                  Seferian's work in the CNRM Model
39
!!
40
!-------------------------------------------------------------------------------
41
!
42
!*           DECLARATIONS
43
!            ------------
44
!
45
USE ocean_albedo_para
46
USE dimphy
47
USE phys_state_var_mod, ONLY : chl_con
48
!
49
!
50
IMPLICIT NONE
51
!
52
!*      0.1    declarations of arguments
53
!              -------------------------
54
!
55
include "clesphys.h"
56
!
57
INTEGER, INTENT(IN) :: knon
58
INTEGER, DIMENSION(klon), INTENT(IN) :: knindex
59
REAL, DIMENSION(klon), INTENT(IN) :: zrmu0         !--cos(SZA) on full vector
60
REAL, DIMENSION(klon), INTENT(IN) :: pwind         !--wind speed on compressed vector
61
REAL, DIMENSION(6),INTENT(IN) :: SFRWL
62
REAL, DIMENSION(klon,nsw), INTENT(OUT) :: alb_dir_new, alb_dif_new
63
!
64
!*      0.2    declarations of local variables
65
!              -------------------------
66
!
67
576
REAL, DIMENSION(klon)           :: ZCHL        ! surface chlorophyll
68
576
REAL, DIMENSION(klon)           :: ZCOSZEN     ! Cosine of the zenith solar angle
69
!
70
INTEGER                         :: JWL, INU    ! indexes
71
INTEGER                         :: JI
72
REAL                            :: ZWL         ! input parameter: wavelength and diffuse/direct fraction of light
73
REAL:: ZCHLABS, ZAW, ZBW, ZREFM, ZYLMD, ZUE, ZUE2 ! scalar computation variables
74
!
75
576
REAL, DIMENSION(klon) :: ZAP, ZXX2, ZR00, ZRR0, ZRRR               ! computation variables
76
576
REAL, DIMENSION(klon) :: ZR22, ZR11DF                              ! computation variables
77
576
REAL, DIMENSION(klon) :: ZBBP, ZNU, ZHB                            ! computation variables
78
576
REAL, DIMENSION(klon) :: ZR11, ZRW, ZRWDF, ZRDF                    ! 4 components of the OSA
79
REAL, DIMENSION(klon) :: ZSIG, ZFWC, ZWORK1, ZWORK2, ZWORK3
80
!
81
!--initialisations-------------
82
!
83
84
288
IF (knon==0) RETURN ! A verifier pourquoi on en a besoin...
85
86

1719648
alb_dir_new(:,:) = 0.
87

1719648
alb_dif_new(:,:) = 0.
88
!
89
! Initialisation of chlorophyll content
90
! ZCHL(:) = CHL_CON!0.05 ! averaged global values for surface chlorophyll
91
288
IF (ok_chlorophyll) THEN
92
  ZCHL(1:knon)=CHL_CON(knindex(1:knon))
93
ELSE
94
218016
  ZCHL(1:knon) = 0.05
95
ENDIF
96
97
! variables that do not depend on wavelengths
98
! loop over the grid points
99
! functions of chlorophyll content
100
218016
ZWORK1(1:knon)= EXP(LOG(ZCHL(1:knon))*0.65)
101
218016
ZWORK2(1:knon)= 0.416 * EXP(LOG(ZCHL(1:knon))*0.766)
102
218016
ZWORK3(1:knon)= LOG10(ZCHL(1:knon))
103
! store the cosine of the solar zenith angle
104
218016
ZCOSZEN(1:knon) = zrmu0(knindex(1:knon))
105
! Compute sigma derived from wind speed (Cox & Munk reflectance model)
106
218016
ZSIG(1:knon)=SQRT(0.003+0.00512*PWIND(1:knon))
107
! original : correction for foam (Eq 16-17)
108
! has to be update once we have information from wave model (discussion with G. Madec)
109
218016
ZFWC(1:knon)=3.97e-4*PWIND(1:knon)**1.59 ! Salisbury 2014 eq(2) at 37GHz, value in fraction
110
!
111
110016
DO JWL=1,NNWL           ! loop over the wavelengths
112
  !
113
  !---------------------------------------------------------------------------------
114
  ! 0- Compute baseline values
115
  !---------------------------------------------------------------------------------
116
117
  ! Get refractive index for the correspoding wavelength
118
109728
  ZWL=XAKWL(JWL)      !!!--------- wavelength value
119
109728
  ZREFM= XAKREFM(JWL) !!!--------- refraction index value
120
121
  !---------------------------------------------------------------------------------
122
  ! 1- Compute direct surface albedo (ZR11)
123
  !---------------------------------------------------------------------------------
124
  !
125
83064096
  ZXX2(1:knon)=SQRT(1.0-(1.0-ZCOSZEN(1:knon)**2)/ZREFM**2)
126
  ZRR0(1:knon)=0.50*(((ZXX2(1:knon)-ZREFM*ZCOSZEN(1:knon))/(ZXX2(1:knon)+ZREFM*ZCOSZEN(1:knon)))**2 +  &
127
83064096
               ((ZCOSZEN(1:knon)-ZREFM*ZXX2(1:knon))/(ZCOSZEN(1:knon)+ZREFM*ZXX2(1:knon)))**2)
128
  ZRRR(1:knon)=0.50*(((ZXX2(1:knon)-1.34*ZCOSZEN(1:knon))/(ZXX2(1:knon)+1.34*ZCOSZEN(1:knon)))**2 + &
129
83064096
               ((ZCOSZEN(1:knon)-1.34*ZXX2(1:knon))/(ZCOSZEN(1:knon)+1.34*ZXX2(1:knon)))**2)
130
  ZR11(1:knon)=ZRR0(1:knon)-(0.0152-1.7873*ZCOSZEN(1:knon)+6.8972*ZCOSZEN(1:knon)**2-8.5778*ZCOSZEN(1:knon)**3+ &
131
               4.071*ZSIG(1:knon)-7.6446*ZCOSZEN(1:knon)*ZSIG(1:knon)) *  &
132
               EXP(0.1643-7.8409*ZCOSZEN(1:knon)-3.5639*ZCOSZEN(1:knon)**2-2.3588*ZSIG(1:knon)+ &
133
83064096
               10.0538*ZCOSZEN(1:knon)*ZSIG(1:knon))*ZRR0(1:knon)/ZRRR(1:knon)
134
  !
135
  !---------------------------------------------------------------------------------
136
  ! 2- Compute surface diffuse albedo (ZRDF)
137
  !---------------------------------------------------------------------------------
138
  ! Diffuse albedo from Jin et al., 2006 + estimation from diffuse fraction of
139
  ! light (relying later on AOD). CNRM model has opted for Eq 5b
140
83064096
  ZRDF(1:knon)=-0.1482-0.012*ZSIG(1:knon)+0.1609*ZREFM-0.0244*ZSIG(1:knon)*ZREFM ! surface diffuse (Eq 5a)
141
  !!ZRDF(1:knon)=-0.1479+0.1502*ZREFM-0.0176*ZSIG(1:knon)*ZREFM   ! surface diffuse (Eq 5b)
142
143
  !---------------------------------------------------------------------------------
144
  ! *- Determine absorption and backscattering
145
  ! coefficients to determine reflectance below the surface (Ro) once for all
146
  !
147
  ! *.1- Absorption by chlorophyll
148
109728
  ZCHLABS= XAKACHL(JWL)
149
  ! *.2- Absorption by seawater
150
109728
  ZAW= XAKAW3(JWL)
151
  ! *.3- Backscattering by seawater
152
109728
  ZBW= XAKBW(JWL)
153
  ! *.4- Backscattering by chlorophyll
154
109728
  ZYLMD = EXP(0.014*(440.0-ZWL))
155
83064096
  ZAP(1:knon) = 0.06*ZCHLABS*ZWORK1(1:knon) +0.2*(XAW440+0.06*ZWORK1(1:knon))*ZYLMD
156
157
!!  WHERE ( ZCHL(1:knon) > 0.02 )
158
!!    ZNU(:)=MIN(0.0,0.5*(ZWORK3(:)-0.3))
159
!!    ZBBP(:)=(0.002+0.01*(0.5-0.25*ZWORK3(:))*(ZWL/550.)**ZNU(:))*ZWORK2(:)
160
!!  ELSEWHERE
161
!!    ZBBP(:)=0.019*(550./ZWL)*ZWORK2(:)       !ZBBPf=0.0113 at chl<=0.02
162
!!  ENDWHERE
163
164
83064096
    do JI = 1, knon
165
83064096
      IF (ZCHL(JI) > 0.02) THEN
166
82954368
        ZNU(JI)=MIN(0.0,0.5*(ZWORK3(JI)-0.3))
167
        ZBBP(JI)=(0.002+0.01*(0.5-0.25*ZWORK3(JI))*(ZWL/550.)**ZNU(JI)) &
168
82954368
                  *ZWORK2(JI)
169
      ELSE
170
        ZBBP(JI)=0.019*(550./ZWL)*ZWORK2(JI)       !ZBBPf=0.0113 at chl<=0.02
171
      ENDIF
172
    ENDDO
173
174
  ! Morel-Gentili(1991), Eq (12)
175
  ! ZHB=h/(h+2*ZBBPf*(1.-h))
176
83064096
  ZHB(1:knon)=0.5*ZBW/(0.5*ZBW+ZBBP(1:knon))
177
178
  !---------------------------------------------------------------------------------
179
  ! 3- Compute direct water-leaving albedo (ZRW)
180
  !---------------------------------------------------------------------------------
181
  ! Based on Morel & Gentilli 1991 parametrization
182
83064096
  ZR22(1:knon)=0.48168549-0.014894708*ZSIG(1:knon)-0.20703885*ZSIG(1:knon)**2
183
184
  ! Use Morel 91 formula to compute the direct reflectance
185
  ! below the surface
186
  ZR00(1:knon)=(0.5*ZBW+ZBBP(1:knon))/(ZAW+ZAP(1:knon)) *  &
187
               (0.6279-0.2227*ZHB(1:knon)-0.0513*ZHB(1:knon)**2 + &
188
83064096
               (-0.3119+0.2465*ZHB(1:knon))*ZCOSZEN(1:knon))
189
83064096
  ZRW(1:knon)=ZR00(1:knon)*(1.-ZR22(1:knon))/(1.-ZR00(1:knon)*ZR22(1:knon))
190
191
  !---------------------------------------------------------------------------------
192
  ! 4- Compute diffuse water-leaving albedo (ZRWDF)
193
  !---------------------------------------------------------------------------------
194
  ! as previous water-leaving computation but assumes a uniform incidence of
195
  ! shortwave at surface (ue)
196
  ZUE=0.676               ! equivalent u_unif for diffuse incidence
197
109728
  ZUE2=SQRT(1.0-(1.0-ZUE**2)/ZREFM**2)
198
83064096
  ZRR0(1:knon)=0.50*(((ZUE2-ZREFM*ZUE)/(ZUE2+ZREFM*ZUE))**2 +((ZUE-ZREFM*ZUE2)/(ZUE+ZREFM*ZUE2))**2)
199
83064096
  ZRRR(1:knon)=0.50*(((ZUE2-1.34*ZUE)/(ZUE2+1.34*ZUE))**2 +((ZUE-1.34*ZUE2)/(ZUE+1.34*ZUE2))**2)
200
  ZR11DF(1:knon)=ZRR0(1:knon)-(0.0152-1.7873*ZUE+6.8972*ZUE**2-8.5778*ZUE**3+4.071*ZSIG(1:knon)-7.6446*ZUE*ZSIG(1:knon)) * &
201
83064096
                 EXP(0.1643-7.8409*ZUE-3.5639*ZUE**2-2.3588*ZSIG(1:knon)+10.0538*ZUE*ZSIG(1:knon))*ZRR0(1:knon)/ZRRR(1:knon)
202
203
  ! Use Morel 91 formula to compute the diffuse
204
  ! reflectance below the surface
205
  ZR00(1:knon) = (0.5*ZBW+ZBBP(1:knon)) / (ZAW+ZAP(1:knon)) &
206
       * (0.6279-0.2227*ZHB(1:knon)-0.0513*ZHB(1:knon)**2 &
207
83064096
       + (-0.3119+0.2465*ZHB(1:knon))*ZUE)
208
83064096
  ZRWDF(1:knon)=ZR00(1:knon)*(1.-ZR22(1:knon))*(1.-ZR11DF(1:knon))/(1.-ZR00(1:knon)*ZR22(1:knon))
209
210
  ! get waveband index inu for each nsw band
211
  SELECT CASE(nsw)
212
  CASE(2)
213
    IF (JWL.LE.49) THEN       ! from 200  to 680 nm
214
     inu=1
215
    ELSE                      ! from 690  to 4000 nm
216
     inu=2
217
    ENDIF
218
  CASE(4)
219
    IF (JWL.LE.49) THEN       ! from 200  to 680 nm
220
     inu=1
221
    ELSE IF (JWL.LE.99) THEN  ! from 690  to 1180 nm
222
     inu=2
223
    ELSE IF (JWL.LE.218) THEN ! from 1190 to 2370 nm
224
     inu=3
225
    ELSE                      ! from 2380 to 4000 nm
226
     inu=4
227
    ENDIF
228
  CASE(6)
229

109728
    IF (JWL.LE.5) THEN        ! from 200  to 240 nm
230
     inu=1
231
108288
    ELSE IF (JWL.LE.24) THEN  ! from 250  to 430 nm
232
     inu=2
233
102816
    ELSE IF (JWL.LE.49) THEN  ! from 440  to 680 nm
234
     inu=3
235
95616
    ELSE IF (JWL.LE.99) THEN  ! from 690  to 1180 nm
236
     inu=4
237
81216
    ELSE IF (JWL.LE.218) THEN ! from 1190 to 2370 nm
238
     inu=5
239
    ELSE                      ! from 2380 to 4000 nm
240
     inu=6
241
    ENDIF
242
  END SELECT
243
244
  ! partitionning direct and diffuse albedo
245
  ! excluding diffuse albedo ZRW on ZDIR_ALB
246
247
  !--direct
248
  alb_dir_new(1:knon,inu)=alb_dir_new(1:knon,inu) + &
249
83064096
                          ( XFRWL(JWL) * ((1.-ZFWC(1:knon)) * (ZR11(1:knon)+ZRW(1:knon))   + ZFWC(1:knon)*XRWC(JWL)) )/SFRWL(inu)
250
  !--diffuse
251
  alb_dif_new(1:knon,inu)=alb_dif_new(1:knon,inu) + &
252
83064384
                          ( XFRWL(JWL) * ((1.-ZFWC(1:knon)) * (ZRDF(1:knon)+ZRWDF(1:knon)) + ZFWC(1:knon)*XRWC(JWL)) )/SFRWL(inu)
253
254
ENDDO ! ending loop over wavelengths
255
256
288
END SUBROUTINE ocean_albedo