source: LMDZ5/branches/testing/libf/phylmd/ocean_forced_mod.F90 @ 2314

Last change on this file since 2314 was 2298, checked in by Laurent Fairhead, 9 years ago

Merged trunk changes -r2237:2291 into testing branch

  • 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: 11.5 KB
RevLine 
[781]1!
2MODULE ocean_forced_mod
3!
4! This module is used for both the sub-surfaces ocean and sea-ice for the case of a
5! forced ocean,  "ocean=force".
6!
7  IMPLICIT NONE
8
9CONTAINS
10!
11!****************************************************************************************
12!
[1067]13  SUBROUTINE ocean_forced_noice( &
14       itime, dtime, jour, knon, knindex, &
[2298]15       p1lay, cdragh, cdragq, cdragm, precip_rain, precip_snow, &
[781]16       temp_air, spechum, &
[1067]17       AcoefH, AcoefQ, BcoefH, BcoefQ, &
18       AcoefU, AcoefV, BcoefU, BcoefV, &
[2298]19       ps, u1, v1, gustiness, &
[888]20       radsol, snow, agesno, &
[1067]21       qsurf, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
[996]22       tsurf_new, dflux_s, dflux_l)
[781]23!
24! This subroutine treats the "open ocean", all grid points that are not entierly covered
25! by ice.
[996]26! The routine receives data from climatologie file limit.nc and does some calculations at the
[781]27! surface.
28!
[1067]29    USE dimphy
30    USE calcul_fluxs_mod
[996]31    USE limit_read_mod
[1999]32    USE mod_grid_phy_lmdz
[1795]33    USE indice_sol_mod
[793]34    INCLUDE "YOMCST.h"
[2298]35    INCLUDE "clesphys.h"
[781]36
[2298]37
[781]38! Input arguments
39!****************************************************************************************
40    INTEGER, INTENT(IN)                      :: itime, jour, knon
41    INTEGER, DIMENSION(klon), INTENT(IN)     :: knindex
42    REAL, INTENT(IN)                         :: dtime
43    REAL, DIMENSION(klon), INTENT(IN)        :: p1lay
[2298]44    REAL, DIMENSION(klon), INTENT(IN)        :: cdragh, cdragq, cdragm
[781]45    REAL, DIMENSION(klon), INTENT(IN)        :: precip_rain, precip_snow
46    REAL, DIMENSION(klon), INTENT(IN)        :: temp_air, spechum
[1067]47    REAL, DIMENSION(klon), INTENT(IN)        :: AcoefH, AcoefQ, BcoefH, BcoefQ
48    REAL, DIMENSION(klon), INTENT(IN)        :: AcoefU, AcoefV, BcoefU, BcoefV
[781]49    REAL, DIMENSION(klon), INTENT(IN)        :: ps
[2298]50    REAL, DIMENSION(klon), INTENT(IN)        :: u1, v1, gustiness
[781]51
52! In/Output arguments
53!****************************************************************************************
54    REAL, DIMENSION(klon), INTENT(INOUT)     :: radsol
55    REAL, DIMENSION(klon), INTENT(INOUT)     :: snow
56    REAL, DIMENSION(klon), INTENT(INOUT)     :: agesno !? put to 0 in ocean
57 
58! Output arguments
59!****************************************************************************************
60    REAL, DIMENSION(klon), INTENT(OUT)       :: qsurf
61    REAL, DIMENSION(klon), INTENT(OUT)       :: evap, fluxsens, fluxlat
[1067]62    REAL, DIMENSION(klon), INTENT(OUT)       :: flux_u1, flux_v1
[781]63    REAL, DIMENSION(klon), INTENT(OUT)       :: tsurf_new
64    REAL, DIMENSION(klon), INTENT(OUT)       :: dflux_s, dflux_l
65
66! Local variables
67!****************************************************************************************
68    INTEGER                     :: i
69    REAL, DIMENSION(klon)       :: cal, beta, dif_grnd
70    REAL, DIMENSION(klon)       :: alb_neig, tsurf_lim, zx_sl
[1067]71    REAL, DIMENSION(klon)       :: u0, v0
72    REAL, DIMENSION(klon)       :: u1_lay, v1_lay
[781]73    LOGICAL                     :: check=.FALSE.
74
75!****************************************************************************************
76! Start calculation
77!****************************************************************************************
78    IF (check) WRITE(*,*)' Entering ocean_forced_noice'
[1067]79   
[781]80!****************************************************************************************
81! 1)   
[996]82! Read sea-surface temperature from file limit.nc
[781]83!
84!****************************************************************************************
[1999]85!--sb:
86!!jyg    if (knon.eq.1) then ! single-column model
87    if (klon_glo.eq.1) then ! single-column model
88      CALL read_tsurf1d(knon,tsurf_lim) ! new
89    else ! GCM
90      CALL limit_read_sst(knon,knindex,tsurf_lim)
91    endif ! knon
92!sb--
[996]93
[781]94!****************************************************************************************
95! 2)
96! Flux calculation
97!
98!****************************************************************************************
99! Set some variables for calcul_fluxs
100    cal = 0.
101    beta = 1.
102    dif_grnd = 0.
103    alb_neig(:) = 0.
104    agesno(:) = 0.
[1067]105! Suppose zero surface speed
106    u0(:)=0.0
107    v0(:)=0.0
108    u1_lay(:) = u1(:) - u0(:)
109    v1_lay(:) = v1(:) - v0(:)
110
[781]111! Calcul de tsurf_new, evap, fluxlat, fluxsens, dflux_s, dflux_l and qsurf
112    CALL calcul_fluxs(knon, is_oce, dtime, &
[2298]113         tsurf_lim, p1lay, cal, beta, cdragh, cdragq, ps, &
[781]114         precip_rain, precip_snow, snow, qsurf,  &
[2298]115         radsol, dif_grnd, temp_air, spechum, u1_lay, v1_lay, gustiness, &
116         f_qsat_oce,AcoefH, AcoefQ, BcoefH, BcoefQ, &
[781]117         tsurf_new, evap, fluxlat, fluxsens, dflux_s, dflux_l)
118
[1067]119! - Flux calculation at first modele level for U and V
120    CALL calcul_flux_wind(knon, dtime, &
[2298]121         u0, v0, u1, v1, gustiness, cdragm, &
[1067]122         AcoefU, AcoefV, BcoefU, BcoefV, &
123         p1lay, temp_air, &
124         flux_u1, flux_v1) 
[781]125
126  END SUBROUTINE ocean_forced_noice
127!
[1067]128!***************************************************************************************
[781]129!
[1067]130  SUBROUTINE ocean_forced_ice( &
131       itime, dtime, jour, knon, knindex, &
132       tsurf_in, p1lay, cdragh, cdragm, precip_rain, precip_snow, temp_air, spechum, &
133       AcoefH, AcoefQ, BcoefH, BcoefQ, &
134       AcoefU, AcoefV, BcoefU, BcoefV, &
[2298]135       ps, u1, v1, gustiness, &
[888]136       radsol, snow, qsol, agesno, tsoil, &
[1067]137       qsurf, alb1_new, alb2_new, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
[996]138       tsurf_new, dflux_s, dflux_l)
[781]139!
140! This subroutine treats the ocean where there is ice.
141! The routine reads data from climatologie file and does flux calculations at the
142! surface.
[996]143!
[1067]144    USE dimphy
145    USE calcul_fluxs_mod
146    USE surface_data,     ONLY : calice, calsno, tau_gl
[996]147    USE limit_read_mod
[1067]148    USE fonte_neige_mod,  ONLY : fonte_neige
[1795]149    USE indice_sol_mod
[996]150
[1999]151!    INCLUDE "indicesol.h"
[781]152    INCLUDE "dimsoil.h"
[793]153    INCLUDE "YOMCST.h"
154    INCLUDE "clesphys.h"
[781]155
156! Input arguments
157!****************************************************************************************
158    INTEGER, INTENT(IN)                  :: itime, jour, knon
159    INTEGER, DIMENSION(klon), INTENT(IN) :: knindex
160    REAL, INTENT(IN)                     :: dtime
161    REAL, DIMENSION(klon), INTENT(IN)    :: tsurf_in
162    REAL, DIMENSION(klon), INTENT(IN)    :: p1lay
[1067]163    REAL, DIMENSION(klon), INTENT(IN)    :: cdragh, cdragm
[781]164    REAL, DIMENSION(klon), INTENT(IN)    :: precip_rain, precip_snow
165    REAL, DIMENSION(klon), INTENT(IN)    :: temp_air, spechum
[1067]166    REAL, DIMENSION(klon), INTENT(IN)    :: AcoefH, AcoefQ, BcoefH, BcoefQ
167    REAL, DIMENSION(klon), INTENT(IN)    :: AcoefU, AcoefV, BcoefU, BcoefV
[781]168    REAL, DIMENSION(klon), INTENT(IN)    :: ps
[2298]169    REAL, DIMENSION(klon), INTENT(IN)    :: u1, v1, gustiness
[781]170
171! In/Output arguments
172!****************************************************************************************
173    REAL, DIMENSION(klon), INTENT(INOUT)          :: radsol
174    REAL, DIMENSION(klon), INTENT(INOUT)          :: snow, qsol
175    REAL, DIMENSION(klon), INTENT(INOUT)          :: agesno
176    REAL, DIMENSION(klon, nsoilmx), INTENT(INOUT) :: tsoil
177
178! Output arguments
179!****************************************************************************************
180    REAL, DIMENSION(klon), INTENT(OUT)            :: qsurf
[888]181    REAL, DIMENSION(klon), INTENT(OUT)            :: alb1_new  ! new albedo in visible SW interval
182    REAL, DIMENSION(klon), INTENT(OUT)            :: alb2_new  ! new albedo in near IR interval
[781]183    REAL, DIMENSION(klon), INTENT(OUT)            :: evap, fluxsens, fluxlat
[1067]184    REAL, DIMENSION(klon), INTENT(OUT)            :: flux_u1, flux_v1
[888]185    REAL, DIMENSION(klon), INTENT(OUT)            :: tsurf_new
[781]186    REAL, DIMENSION(klon), INTENT(OUT)            :: dflux_s, dflux_l     
187
188! Local variables
189!****************************************************************************************
190    LOGICAL                     :: check=.FALSE.
191    INTEGER                     :: i
192    REAL                        :: zfra
193    REAL, PARAMETER             :: t_grnd=271.35
194    REAL, DIMENSION(klon)       :: cal, beta, dif_grnd, capsol
195    REAL, DIMENSION(klon)       :: alb_neig, tsurf_tmp
196    REAL, DIMENSION(klon)       :: soilcap, soilflux
[1067]197    REAL, DIMENSION(klon)       :: u0, v0
198    REAL, DIMENSION(klon)       :: u1_lay, v1_lay
[781]199
200!****************************************************************************************
201! Start calculation
202!****************************************************************************************
203    IF (check) WRITE(*,*)'Entering surface_seaice, knon=',knon
204
205!****************************************************************************************
[996]206! 1)
[1067]207! Flux calculation : tsurf_new, evap, fluxlat, fluxsens, flux_u1, flux_v1
[781]208!                    dflux_s, dflux_l and qsurf
209!****************************************************************************************
[996]210    tsurf_tmp(:) = tsurf_in(:)
[781]211
212! calculate the parameters cal, beta, capsol and dif_grnd
[996]213    CALL calbeta(dtime, is_sic, knon, snow, qsol, beta, capsol, dif_grnd)
[781]214
215   
216    IF (soil_model) THEN
217! update tsoil and calculate soilcap and soilflux
[996]218       CALL soil(dtime, is_sic, knon, snow, tsurf_tmp, tsoil,soilcap, soilflux)
[781]219       cal(1:knon) = RCPD / soilcap(1:knon)
220       radsol(1:knon) = radsol(1:knon)  + soilflux(1:knon)
221       dif_grnd = 1.0 / tau_gl
222    ELSE
223       dif_grnd = 1.0 / tau_gl
224       cal = RCPD * calice
225       WHERE (snow > 0.0) cal = RCPD * calsno
226    ENDIF
227
228    beta = 1.0
[1067]229! Suppose zero surface speed
230    u0(:)=0.0
231    v0(:)=0.0
232    u1_lay(:) = u1(:) - u0(:)
233    v1_lay(:) = v1(:) - v0(:)
[781]234    CALL calcul_fluxs(knon, is_sic, dtime, &
[2298]235         tsurf_tmp, p1lay, cal, beta, cdragh, cdragh, ps, &
[781]236         precip_rain, precip_snow, snow, qsurf,  &
[2298]237         radsol, dif_grnd, temp_air, spechum, u1_lay, v1_lay, gustiness, &
238         f_qsat_oce,AcoefH, AcoefQ, BcoefH, BcoefQ, &
[781]239         tsurf_new, evap, fluxlat, fluxsens, dflux_s, dflux_l)
240
[1067]241! - Flux calculation at first modele level for U and V
242    CALL calcul_flux_wind(knon, dtime, &
[2298]243         u0, v0, u1, v1, gustiness, cdragm, &
[1067]244         AcoefU, AcoefV, BcoefU, BcoefV, &
245         p1lay, temp_air, &
246         flux_u1, flux_v1) 
247
[781]248!****************************************************************************************
[996]249! 2)
[781]250! Calculations due to snow and runoff
251!
252!****************************************************************************************
253    CALL fonte_neige( knon, is_sic, knindex, dtime, &
254         tsurf_tmp, precip_rain, precip_snow, &
255         snow, qsol, tsurf_new, evap)
256   
257! Calculation of albedo at snow (alb_neig) and update the age of snow (agesno)
258!
259    CALL albsno(klon, knon, dtime, agesno(:), alb_neig(:), precip_snow(:)) 
260
261    WHERE (snow(1:knon) .LT. 0.0001) agesno(1:knon) = 0.
262
[888]263    alb1_new(:) = 0.0
[781]264    DO i=1, knon
265       zfra = MAX(0.0,MIN(1.0,snow(i)/(snow(i)+10.0)))
[888]266       alb1_new(i) = alb_neig(i) * zfra +  0.6 * (1.0-zfra)
[781]267    ENDDO
268
[888]269    alb2_new(:) = alb1_new(:)
270
[781]271  END SUBROUTINE ocean_forced_ice
[1999]272
273!************************************************************************
274! 1D case
275!************************************************************************
276  SUBROUTINE read_tsurf1d(knon,sst_out)
277
278! This subroutine specifies the surface temperature to be used in 1D simulations
279
280      USE dimphy, ONLY : klon
281
282      INTEGER, INTENT(IN)                  :: knon     ! nomber of points on compressed grid
283      REAL, DIMENSION(klon), INTENT(OUT)   :: sst_out  ! tsurf used to force the single-column model
284
285       INTEGER :: i
286! COMMON defined in lmdz1d.F:
287       real ts_cur
288       common /sst_forcing/ts_cur
289
290       DO i = 1, knon
291        sst_out(i) = ts_cur
292       ENDDO
293
294      END SUBROUTINE read_tsurf1d
295
[781]296!
[1999]297!************************************************************************
[781]298!
299END MODULE ocean_forced_mod
300
301
302
303
304
305
Note: See TracBrowser for help on using the repository browser.