source: LMDZ5/trunk/libf/phylmd/surf_ocean_mod.F90 @ 2254

Last change on this file since 2254 was 2254, checked in by fhourdin, 9 years ago

Modification du calcul des flux air/mer
1) Introduction d'un facteur f_qsat_oce=0.98 devant qsat dans le calcul
de l'évaporation sur océan pour tenir compte de la moindre évaporation
de l'eau salée.
2) Introduction d'une différentiation entre z0 pour le sensible, z0h,
et le latent, z0q, imposé constant z0q=f_z0qh_oce*z0h

Modification of air/sea fluxes computation
1) Introduction of a correcting factor f_qsat_oce=0.98 on qsat
to account for the weaker evaporation of salty water.
2) Introduction of z0q=f_z0qh_oce*z0h

  • 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:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 8.6 KB
Line 
1!
2MODULE surf_ocean_mod
3
4  IMPLICIT NONE
5
6CONTAINS
7!
8!******************************************************************************
9!
10  SUBROUTINE surf_ocean(rlon, rlat, swnet, lwnet, alb1, &
11       windsp, rmu0, fder, tsurf_in, &
12       itime, dtime, jour, knon, knindex, &
13       p1lay, z1lay, cdragh, cdragm, precip_rain, precip_snow, temp_air, spechum, &
14       AcoefH, AcoefQ, BcoefH, BcoefQ, &
15       AcoefU, AcoefV, BcoefU, BcoefV, &
16       ps, u1, v1, gustiness, rugoro, pctsrf, &
17       snow, qsurf, agesno, &
18       z0m, z0h, SFRWL, alb_dir_new, alb_dif_new, evap, fluxsens, fluxlat, &
19       tsurf_new, dflux_s, dflux_l, lmt_bils, &
20       flux_u1, flux_v1)
21
22  USE dimphy
23  USE surface_data, ONLY     : type_ocean
24  USE ocean_forced_mod, ONLY : ocean_forced_noice
25  USE ocean_slab_mod, ONLY   : ocean_slab_noice
26  USE ocean_cpl_mod, ONLY    : ocean_cpl_noice
27  USE indice_sol_mod
28!
29! This subroutine will make a call to ocean_XXX_noice according to the ocean mode (force,
30! slab or couple). The calculations of albedo and rugosity for the ocean surface are
31! done in here because they are identical for the different modes of ocean.
32
33
34    INCLUDE "YOMCST.h"
35
36    include "clesphys.h"
37    ! for cycle_diurne
38
39! Input variables
40!******************************************************************************
41    INTEGER, INTENT(IN)                      :: itime, jour, knon
42    INTEGER, DIMENSION(klon), INTENT(IN)     :: knindex
43    REAL, INTENT(IN)                         :: dtime
44    REAL, DIMENSION(klon), INTENT(IN)        :: rlon, rlat
45    REAL, DIMENSION(klon), INTENT(IN)        :: swnet  ! net shortwave radiation at surface 
46    REAL, DIMENSION(klon), INTENT(IN)        :: lwnet  ! net longwave radiation at surface 
47    REAL, DIMENSION(klon), INTENT(IN)        :: alb1   ! albedo in visible SW interval
48    REAL, DIMENSION(klon), INTENT(IN)        :: windsp
49    REAL, DIMENSION(klon), INTENT(IN)        :: rmu0 
50    REAL, DIMENSION(klon), INTENT(IN)        :: fder
51    REAL, DIMENSION(klon), INTENT(IN)        :: tsurf_in
52    REAL, DIMENSION(klon), INTENT(IN)        :: p1lay,z1lay ! pression (Pa) et altitude (m) du premier niveau
53    REAL, DIMENSION(klon), INTENT(IN)        :: cdragh
54    REAL, DIMENSION(klon), INTENT(IN)        :: cdragm
55    REAL, DIMENSION(klon), INTENT(IN)        :: precip_rain, precip_snow
56    REAL, DIMENSION(klon), INTENT(IN)        :: temp_air, spechum
57    REAL, DIMENSION(klon), INTENT(IN)        :: AcoefH, AcoefQ, BcoefH, BcoefQ
58    REAL, DIMENSION(klon), INTENT(IN)        :: AcoefU, AcoefV, BcoefU, BcoefV
59    REAL, DIMENSION(klon), INTENT(IN)        :: ps
60    REAL, DIMENSION(klon), INTENT(IN)        :: u1, v1, gustiness
61    REAL, DIMENSION(klon), INTENT(IN)        :: rugoro
62    REAL, DIMENSION(klon,nbsrf), INTENT(IN)  :: pctsrf
63
64! In/Output variables
65!******************************************************************************
66    REAL, DIMENSION(klon), INTENT(INOUT)     :: snow
67    REAL, DIMENSION(klon), INTENT(INOUT)     :: qsurf
68    REAL, DIMENSION(klon), INTENT(INOUT)     :: agesno
69
70! Output variables
71!******************************************************************************
72    REAL, DIMENSION(klon), INTENT(OUT)       :: z0m, z0h
73!albedo SB >>>
74!    REAL, DIMENSION(klon), INTENT(OUT)       :: alb1_new  ! new albedo in visible SW interval
75!    REAL, DIMENSION(klon), INTENT(OUT)       :: alb2_new  ! new albedo in near IR interval
76    REAL, DIMENSION(6), INTENT(IN)          :: SFRWL
77    REAL, DIMENSION(klon,nsw), INTENT(OUT)       :: alb_dir_new,alb_dif_new
78!albedo SB <<<     
79    REAL, DIMENSION(klon), INTENT(OUT)       :: evap, fluxsens, fluxlat
80    REAL, DIMENSION(klon), INTENT(OUT)       :: tsurf_new
81    REAL, DIMENSION(klon), INTENT(OUT)       :: dflux_s, dflux_l     
82    REAL, DIMENSION(klon), INTENT(OUT)       :: lmt_bils
83    REAL, DIMENSION(klon), INTENT(OUT)       :: flux_u1, flux_v1
84
85! Local variables
86!******************************************************************************
87    INTEGER               :: i, k
88    REAL                  :: tmp
89    REAL, PARAMETER       :: cepdu2=(0.1)**2
90    REAL, DIMENSION(klon) :: alb_eau
91    REAL, DIMENSION(klon) :: radsol
92    REAL, DIMENSION(klon) :: cdragq ! Cdrag pour l'evaporation
93
94! End definition
95!******************************************************************************
96
97
98!******************************************************************************
99! Calculate total net radiance at surface
100!
101!******************************************************************************
102    radsol(:) = 0.0
103    radsol(1:knon) = swnet(1:knon) + lwnet(1:knon)
104
105!******************************************************************************
106! Cdragq computed from cdrag
107! The difference comes only from a factor (f_z0qh_oce) on z0, so that
108! it can be computed inside surf_ocean
109! More complicated appraches may require the propagation through
110! pbl_surface of an independant cdragq variable.
111!******************************************************************************
112
113    IF ( f_z0qh_oce .ne. 1.) THEN
114       cdragq(:)=cdragh(:)*                                      &
115       log(z1lay(:)/z0h(:))/log(z1lay(:)/(f_z0qh_oce*z0h(:)))
116    ELSE
117       cdragq(:)=cdragh(:)
118    ENDIF
119
120!******************************************************************************
121! Switch according to type of ocean (couple, slab or forced)
122!******************************************************************************
123    SELECT CASE(type_ocean)
124    CASE('couple')
125       CALL ocean_cpl_noice( &
126            swnet, lwnet, alb1, &
127            windsp, fder, &
128            itime, dtime, knon, knindex, &
129            p1lay, cdragh, cdragq, cdragm, precip_rain, precip_snow,temp_air,spechum,&
130            AcoefH, AcoefQ, BcoefH, BcoefQ, &
131            AcoefU, AcoefV, BcoefU, BcoefV, &
132            ps, u1, v1, gustiness, &
133            radsol, snow, agesno, &
134            qsurf, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
135            tsurf_new, dflux_s, dflux_l)
136
137    CASE('slab')
138       CALL ocean_slab_noice( &
139            itime, dtime, jour, knon, knindex, &
140            p1lay, cdragh, cdragq, cdragm, precip_rain, precip_snow, temp_air, spechum,&
141            AcoefH, AcoefQ, BcoefH, BcoefQ, &
142            AcoefU, AcoefV, BcoefU, BcoefV, &
143            ps, u1, v1, gustiness, tsurf_in, &
144            radsol, snow, &
145            qsurf, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
146            tsurf_new, dflux_s, dflux_l, lmt_bils)
147       
148    CASE('force')
149       CALL ocean_forced_noice( &
150            itime, dtime, jour, knon, knindex, &
151            p1lay, cdragh, cdragq, cdragm, precip_rain, precip_snow, &
152            temp_air, spechum, &
153            AcoefH, AcoefQ, BcoefH, BcoefQ, &
154            AcoefU, AcoefV, BcoefU, BcoefV, &
155            ps, u1, v1, gustiness, &
156            radsol, snow, agesno, &
157            qsurf, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
158            tsurf_new, dflux_s, dflux_l)
159    END SELECT
160
161!******************************************************************************
162! fcodron: compute lmt_bils  forced case (same as wfbils_oce / 1.-contfracatm)
163!******************************************************************************
164    IF (type_ocean.NE.'slab') THEN
165        lmt_bils(:)=0.
166        DO i=1,knon
167           lmt_bils(knindex(i))=(swnet(i)+lwnet(i)+fluxsens(i)+fluxlat(i)) &
168           *pctsrf(knindex(i),is_oce)/(1.-zmasq(knindex(i)))
169        END DO
170    END IF
171
172!******************************************************************************
173! Calculate albedo
174!******************************************************************************
175!albedo SB >>>
176  if(iflag_albedo==1)then
177    call ocean_albedo(knon,rmu0,knindex,windsp,SFRWL,alb_dir_new,alb_dif_new)
178  else
179    IF (cycle_diurne) THEN
180       CALL alboc_cd(rmu0,alb_eau)
181    ELSE
182       CALL alboc(REAL(jour),rlat,alb_eau)
183    ENDIF
184
185    DO i =1, knon
186      do  k=1,nsw
187       alb_dir_new(i,k) = alb_eau(knindex(i))
188      enddo
189    ENDDO
190     alb_dif_new=0.05 !alb_dir_new
191endif
192
193!albedo SB <<<
194
195!******************************************************************************
196! Calculate the rugosity
197!******************************************************************************
198IF (iflag_z0_oce==0) THEN
199    DO i = 1, knon
200       tmp = MAX(cepdu2,u1(i)**2+v1(i)**2)
201       z0m(i) = 0.018*cdragm(i) * (u1(i)**2+v1(i)**2)/RG  &
202            +  0.11*14e-6 / SQRT(cdragm(i) * tmp)
203       z0m(i) = MAX(1.5e-05,z0m(i))
204    ENDDO   
205    z0h(1:knon)=z0m(1:knon) ! En attendant mieux
206
207ELSE
208       STOP'Alina, au boulot :)'
209ENDIF
210!
211!******************************************************************************
212  END SUBROUTINE surf_ocean
213!******************************************************************************
214!
215END MODULE surf_ocean_mod
Note: See TracBrowser for help on using the repository browser.