source: LMDZ4/trunk/libf/phylmd/surf_ocean_mod.F90 @ 1142

Last change on this file since 1142 was 1067, checked in by Laurent Fairhead, 16 years ago
  • Modifications lie au premier niveau du modele pour la diffusion turbulent

du vent.

  • Preparation pour un couplage des courrant oceaniques.

JG

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 7.1 KB
RevLine 
[781]1!
2MODULE surf_ocean_mod
3
4  IMPLICIT NONE
5
6CONTAINS
7!
8!****************************************************************************************
9!
[888]10  SUBROUTINE surf_ocean(rlon, rlat, swnet, lwnet, alb1, &
[996]11       rugos, windsp, rmu0, fder, tsurf_in, &
[781]12       itime, dtime, jour, knon, knindex, &
[1067]13       p1lay, cdragh, cdragm, precip_rain, precip_snow, temp_air, spechum, &
14       AcoefH, AcoefQ, BcoefH, BcoefQ, &
15       AcoefU, AcoefV, BcoefU, BcoefV, &
16       ps, u1, v1, rugoro, pctsrf, &
[888]17       snow, qsurf, agesno, &
18       z0_new, alb1_new, alb2_new, evap, fluxsens, fluxlat, &
[1067]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
[781]27!
28! This subroutine will make a call to ocean_XXX_noice according to the ocean mode (force,
29! slab or couple). The calculations of albedo and rugosity for the ocean surface are
30! done in here because they are identical for the different modes of ocean.
31!
[793]32    INCLUDE "indicesol.h"
33    INCLUDE "YOMCST.h"
[781]34
35! Input variables
36!****************************************************************************************
37    INTEGER, INTENT(IN)                      :: itime, jour, knon
38    INTEGER, DIMENSION(klon), INTENT(IN)     :: knindex
39    REAL, INTENT(IN)                         :: dtime
40    REAL, DIMENSION(klon), INTENT(IN)        :: rlon, rlat
[888]41    REAL, DIMENSION(klon), INTENT(IN)        :: swnet  ! net shortwave radiation at surface 
42    REAL, DIMENSION(klon), INTENT(IN)        :: lwnet  ! net longwave radiation at surface 
43    REAL, DIMENSION(klon), INTENT(IN)        :: alb1   ! albedo in visible SW interval
[781]44    REAL, DIMENSION(klon), INTENT(IN)        :: rugos
45    REAL, DIMENSION(klon), INTENT(IN)        :: windsp
46    REAL, DIMENSION(klon), INTENT(IN)        :: rmu0 
47    REAL, DIMENSION(klon), INTENT(IN)        :: fder
[996]48    REAL, DIMENSION(klon), INTENT(IN)        :: tsurf_in
[781]49    REAL, DIMENSION(klon), INTENT(IN)        :: p1lay
[1067]50    REAL, DIMENSION(klon), INTENT(IN)        :: cdragh
51    REAL, DIMENSION(klon), INTENT(IN)        :: cdragm
[781]52    REAL, DIMENSION(klon), INTENT(IN)        :: precip_rain, precip_snow
53    REAL, DIMENSION(klon), INTENT(IN)        :: temp_air, spechum
[1067]54    REAL, DIMENSION(klon), INTENT(IN)        :: AcoefH, AcoefQ, BcoefH, BcoefQ
55    REAL, DIMENSION(klon), INTENT(IN)        :: AcoefU, AcoefV, BcoefU, BcoefV
[781]56    REAL, DIMENSION(klon), INTENT(IN)        :: ps
[1067]57    REAL, DIMENSION(klon), INTENT(IN)        :: u1, v1
[781]58    REAL, DIMENSION(klon), INTENT(IN)        :: rugoro
59    REAL, DIMENSION(klon,nbsrf), INTENT(IN)  :: pctsrf
60
61! In/Output variables
62!****************************************************************************************
[888]63    REAL, DIMENSION(klon), INTENT(INOUT)     :: snow
64    REAL, DIMENSION(klon), INTENT(INOUT)     :: qsurf
[781]65    REAL, DIMENSION(klon), INTENT(INOUT)     :: agesno
66
67! Output variables
68!****************************************************************************************
69    REAL, DIMENSION(klon), INTENT(OUT)       :: z0_new
[888]70    REAL, DIMENSION(klon), INTENT(OUT)       :: alb1_new  ! new albedo in visible SW interval
71    REAL, DIMENSION(klon), INTENT(OUT)       :: alb2_new  ! new albedo in near IR interval
[781]72    REAL, DIMENSION(klon), INTENT(OUT)       :: evap, fluxsens, fluxlat
[888]73    REAL, DIMENSION(klon), INTENT(OUT)       :: tsurf_new
[781]74    REAL, DIMENSION(klon), INTENT(OUT)       :: dflux_s, dflux_l     
[996]75    REAL, DIMENSION(klon), INTENT(OUT)       :: lmt_bils
[1067]76    REAL, DIMENSION(klon), INTENT(OUT)       :: flux_u1, flux_v1
[781]77
78! Local variables
79!****************************************************************************************
80    INTEGER               :: i
81    REAL, DIMENSION(klon) :: alb_eau
[888]82    REAL, DIMENSION(klon) :: radsol
[781]83
84! End definition
85!****************************************************************************************
[888]86
87
88!****************************************************************************************
89! Calculate total net radiance at surface
90!
91!****************************************************************************************
92    radsol(:) = 0.0
93    radsol(1:knon) = swnet(1:knon) + lwnet(1:knon)
94
95!****************************************************************************************
[781]96! Switch according to type of ocean (couple, slab or forced)
97!****************************************************************************************
[996]98    SELECT CASE(type_ocean)
[781]99    CASE('couple')
[888]100       CALL ocean_cpl_noice( &
101            swnet, lwnet, alb1, &
[1067]102            windsp, fder, &
[781]103            itime, dtime, knon, knindex, &
[1067]104            p1lay, cdragh, cdragm, precip_rain, precip_snow,temp_air,spechum,&
105            AcoefH, AcoefQ, BcoefH, BcoefQ, &
106            AcoefU, AcoefV, BcoefU, BcoefV, &
107            ps, u1, v1, &
[888]108            radsol, snow, agesno, &
[1067]109            qsurf, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
[996]110            tsurf_new, dflux_s, dflux_l)
[781]111
112    CASE('slab')
[888]113       CALL ocean_slab_noice( &
[996]114            itime, dtime, jour, knon, knindex, &
[1067]115            p1lay, cdragh, cdragm, precip_rain, precip_snow, temp_air, spechum,&
116            AcoefH, AcoefQ, BcoefH, BcoefQ, &
117            AcoefU, AcoefV, BcoefU, BcoefV, &
118            ps, u1, v1, tsurf_in, &
[888]119            radsol, snow, agesno, &
[1067]120            qsurf, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
[996]121            tsurf_new, dflux_s, dflux_l, lmt_bils)
[781]122       
123    CASE('force')
[888]124       CALL ocean_forced_noice( &
125            itime, dtime, jour, knon, knindex, &
[1067]126            p1lay, cdragh, cdragm, precip_rain, precip_snow, &
[781]127            temp_air, spechum, &
[1067]128            AcoefH, AcoefQ, BcoefH, BcoefQ, &
129            AcoefU, AcoefV, BcoefU, BcoefV, &
130            ps, u1, v1, &
[888]131            radsol, snow, agesno, &
[1067]132            qsurf, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
[996]133            tsurf_new, dflux_s, dflux_l)
[781]134    END SELECT
135
136!****************************************************************************************
137! Calculate albedo
138!
139!****************************************************************************************
140    IF ( MINVAL(rmu0) == MAXVAL(rmu0) .AND. MINVAL(rmu0) == -999.999 ) THEN
141       CALL alboc(FLOAT(jour),rlat,alb_eau)
142    ELSE  ! diurnal cycle
143       CALL alboc_cd(rmu0,alb_eau)
144    ENDIF
145
146    DO i =1, knon
[888]147       alb1_new(i) = alb_eau(knindex(i))
[781]148    ENDDO
[888]149    alb2_new(1:knon) = alb1_new(1:knon)
[781]150
151!****************************************************************************************
152! Calculate the rugosity
153!
154!****************************************************************************************
155    z0_new = SQRT(rugos**2 + rugoro**2)
156
157    ! The rugosity is recalculated with another method
158    z0_new(:) = 0.0
159    DO i = 1, knon
[1067]160       z0_new(i) = 0.018*cdragm(i) * (u1(i)**2+v1(i)**2)/RG  &
161            +  0.11*14e-6 / SQRT(cdragm(i) * (u1(i)**2+v1(i)**2))
[781]162       z0_new(i) = MAX(1.5e-05,z0_new(i))
163    ENDDO
164   
165!
166!****************************************************************************************
167!   
168  END SUBROUTINE surf_ocean
169!
170!****************************************************************************************
171!
172END MODULE surf_ocean_mod
Note: See TracBrowser for help on using the repository browser.