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

Last change on this file since 2352 was 2322, checked in by lguez, 9 years ago

Bug fix in alboc_cd (more than 11 years old). rmu0 must not be
modified in alboc_cd. The corresponding actual argument in subroutine
surf_ocean is an intent(in) argument of surf_ocean. It probably worked
before because the compiler made a copy of the argument but I would
say the behavior was in principle compiler-dependent and
optimization-level-dependent.

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