source: LMDZ5/trunk/libf/phylmd/surf_seaice_mod.F90 @ 2212

Last change on this file since 2212 was 2209, checked in by Ehouarn Millour, 10 years ago

Update of the slab ocean by Francis Codron. There are now 3 possibilities for the "version_ocean" slab type:
sicOBS = prescribed ice fraction. Water temperature nearby is set to -1.8°C and cannot become lower.
sicNO = ignore sea ice. One can prescribe a fraction, but the nearby ocean evolves freely, depending on surface fluxes: temperature can go below freezing point or above...
sicINT = interactive sea ice.
EM

  • 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: 6.1 KB
Line 
1!
2MODULE surf_seaice_mod
3
4  IMPLICIT NONE
5
6CONTAINS
7!
8!****************************************************************************************
9!
10  SUBROUTINE surf_seaice( &
11       rlon, rlat, swnet, lwnet, alb1, fder, &
12       itime, dtime, jour, knon, knindex, &
13       lafin, &
14       tsurf, p1lay, cdragh, cdragm, precip_rain, precip_snow, temp_air, spechum, &
15       AcoefH, AcoefQ, BcoefH, BcoefQ, &
16       AcoefU, AcoefV, BcoefU, BcoefV, &
17       ps, u1, v1, rugoro, pctsrf, &
18       snow, qsurf, qsol, agesno, tsoil, &
19       z0_new, alb1_new, alb2_new, evap, fluxsens, fluxlat, &
20       tsurf_new, dflux_s, dflux_l, &
21       flux_u1, flux_v1)
22
23  USE dimphy
24  USE surface_data
25  USE ocean_forced_mod, ONLY : ocean_forced_ice
26  USE ocean_cpl_mod, ONLY    : ocean_cpl_ice
27  USE ocean_slab_mod, ONLY   : ocean_slab_ice
28  USE indice_sol_mod
29
30!
31! This subroutine will make a call to ocean_XXX_ice according to the ocean mode (force,
32! slab or couple). The calculation of rugosity for the sea-ice surface is also done
33! in here because it is the same calculation for the different modes of ocean.
34!
35    INCLUDE "dimsoil.h"
36
37! Input arguments
38!****************************************************************************************
39    INTEGER, INTENT(IN)                      :: itime, jour, knon
40    INTEGER, DIMENSION(klon), INTENT(IN)     :: knindex
41    LOGICAL, INTENT(IN)                      :: lafin
42    REAL, INTENT(IN)                         :: dtime
43    REAL, DIMENSION(klon), INTENT(IN)        :: rlon, rlat
44    REAL, DIMENSION(klon), INTENT(IN)        :: swnet  ! net shortwave radiation at surface 
45    REAL, DIMENSION(klon), INTENT(IN)        :: lwnet  ! net longwave radiation at surface 
46    REAL, DIMENSION(klon), INTENT(IN)        :: alb1   ! albedo in visible SW interval
47    REAL, DIMENSION(klon), INTENT(IN)        :: fder
48    REAL, DIMENSION(klon), INTENT(IN)        :: tsurf
49    REAL, DIMENSION(klon), INTENT(IN)        :: p1lay
50    REAL, DIMENSION(klon), INTENT(IN)        :: cdragh, cdragm
51    REAL, DIMENSION(klon), INTENT(IN)        :: precip_rain, precip_snow
52    REAL, DIMENSION(klon), INTENT(IN)        :: temp_air, spechum
53    REAL, DIMENSION(klon), INTENT(IN)        :: AcoefH, AcoefQ, BcoefH, BcoefQ
54    REAL, DIMENSION(klon), INTENT(IN)        :: AcoefU, AcoefV, BcoefU, BcoefV
55    REAL, DIMENSION(klon), INTENT(IN)        :: ps
56    REAL, DIMENSION(klon), INTENT(IN)        :: u1, v1
57    REAL, DIMENSION(klon), INTENT(IN)        :: rugoro
58    REAL, DIMENSION(klon,nbsrf), INTENT(IN)  :: pctsrf
59
60! In/Output arguments
61!****************************************************************************************
62    REAL, DIMENSION(klon), INTENT(INOUT)          :: snow, qsurf, qsol
63    REAL, DIMENSION(klon), INTENT(INOUT)          :: agesno
64    REAL, DIMENSION(klon, nsoilmx), INTENT(INOUT) :: tsoil
65
66! Output arguments
67!****************************************************************************************
68    REAL, DIMENSION(klon), INTENT(OUT)       :: z0_new
69    REAL, DIMENSION(klon), INTENT(OUT)       :: alb1_new  ! new albedo in visible SW interval
70    REAL, DIMENSION(klon), INTENT(OUT)       :: alb2_new  ! new albedo in near IR interval
71    REAL, DIMENSION(klon), INTENT(OUT)       :: evap, fluxsens, fluxlat
72    REAL, DIMENSION(klon), INTENT(OUT)       :: tsurf_new
73    REAL, DIMENSION(klon), INTENT(OUT)       :: dflux_s, dflux_l     
74    REAL, DIMENSION(klon), INTENT(OUT)       :: flux_u1, flux_v1
75
76! Local arguments
77!****************************************************************************************
78    REAL, DIMENSION(klon)  :: radsol
79
80!
81! End definitions
82!****************************************************************************************
83
84
85!****************************************************************************************
86! Calculate total net radiance at surface
87!
88!****************************************************************************************
89    radsol(:) = 0.0
90    radsol(1:knon) = swnet(1:knon) + lwnet(1:knon)
91
92!****************************************************************************************
93! Switch according to type of ocean (couple, slab or forced)
94!
95!****************************************************************************************
96    IF (type_ocean == 'couple') THEN
97       
98       CALL ocean_cpl_ice( &
99            rlon, rlat, swnet, lwnet, alb1, &
100            fder, &
101            itime, dtime, knon, knindex, &
102            lafin,&
103            p1lay, cdragh, cdragm, precip_rain, precip_snow, temp_air, spechum,&
104            AcoefH, AcoefQ, BcoefH, BcoefQ, &
105            AcoefU, AcoefV, BcoefU, BcoefV, &
106            ps, u1, v1, pctsrf, &
107            radsol, snow, qsurf, &
108            alb1_new, alb2_new, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
109            tsurf_new, dflux_s, dflux_l)
110       
111    ELSE IF (type_ocean == 'slab'.AND.version_ocean=='sicINT') THEN
112       CALL ocean_slab_ice( &
113          itime, dtime, jour, knon, knindex, &
114          tsurf, p1lay, cdragh, cdragm, precip_rain, precip_snow, temp_air, spechum,&
115          AcoefH, AcoefQ, BcoefH, BcoefQ, &
116            AcoefU, AcoefV, BcoefU, BcoefV, &
117          ps, u1, v1, &
118          radsol, snow, qsurf, qsol, agesno, &
119          alb1_new, alb2_new, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
120          tsurf_new, dflux_s, dflux_l, swnet)
121
122      ELSE ! type_ocean=force or slab +sicOBS or sicNO
123       CALL ocean_forced_ice( &
124            itime, dtime, jour, knon, knindex, &
125            tsurf, p1lay, cdragh, cdragm, precip_rain, precip_snow, temp_air, spechum,&
126            AcoefH, AcoefQ, BcoefH, BcoefQ, &
127            AcoefU, AcoefV, BcoefU, BcoefV, &
128            ps, u1, v1, &
129            radsol, snow, qsol, agesno, tsoil, &
130            qsurf, alb1_new, alb2_new, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
131            tsurf_new, dflux_s, dflux_l)
132
133    END IF
134
135!****************************************************************************************
136! Calculate rugosity
137!
138!****************************************************************************************
139    z0_new = 0.002
140    z0_new = SQRT(z0_new**2+rugoro**2)
141
142  END SUBROUTINE surf_seaice
143!
144!****************************************************************************************
145!
146END MODULE surf_seaice_mod
147
Note: See TracBrowser for help on using the repository browser.