source: LMDZ6/trunk/libf/phylmd/surf_seaice_mod.F90 @ 5935

Last change on this file since 5935 was 5662, checked in by Laurent Fairhead, 11 months ago

Ajout du modèle thermodynamique de glace de mer interactive améliorant les flux échangés à la surface de la banquise (Doctorat de Nicolas Michalezyk, Contact : Nicolas Michaleyk, Guillaume Gastineau)

  • 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:keywords set to Author Date Id Revision
File size: 8.8 KB
Line 
1!
2! $Id: surf_seaice_mod.F90 5662 2025-05-20 14:24:41Z lfalletti $
3!
4MODULE surf_seaice_mod
5
6  IMPLICIT NONE
7
8CONTAINS
9!
10!****************************************************************************************
11!
12  SUBROUTINE surf_seaice( &
13       rlon, rlat, swnet, lwnet, alb1, fder, &
14       itime, dtime, jour, knon, knindex, &
15       lafin, &
16       tsurf, p1lay, cdragh, cdragm, precip_rain, precip_snow, temp_air, spechum, &
17       AcoefH, AcoefQ, BcoefH, BcoefQ, &
18       AcoefU, AcoefV, BcoefU, BcoefV, &
19       ps, u1, v1, gustiness, pctsrf, &
20       snow, qsurf, qsol, agesno, tsoil, &
21       z0m, z0h, SFRWL, alb_dir_new, alb_dif_new, evap, fluxsens, fluxlat, & 
22       tsurf_new, dflux_s, dflux_l, &
23!GG       flux_u1, flux_v1)
24       flux_u1, flux_v1, hice, tice,bilg_cumul, &
25       fcds, fcdi, dh_basal_growth, dh_basal_melt, dh_top_melt, dh_snow2sic, &
26       dtice_melt, dtice_snow2sic &
27!GG
28#ifdef ISO
29         &      ,xtprecip_rain, xtprecip_snow,xtspechum,Roce, &
30         &      xtsnow,xtsol,xtevap,Rland_ice &
31#endif               
32         &      )
33
34  USE dimphy
35  USE surface_data
36  USE ocean_forced_mod, ONLY : ocean_forced_ice
37  USE ocean_cpl_mod, ONLY    : ocean_cpl_ice
38  USE ocean_slab_mod, ONLY   : ocean_slab_ice
39  USE indice_sol_mod
40#ifdef ISO
41  USE infotrac_phy, ONLY : ntiso,niso
42#endif
43  USE clesphys_mod_h
44    USE yomcst_mod_h
45USE dimsoil_mod_h, ONLY: nsoilmx
46
47!
48! This subroutine will make a call to ocean_XXX_ice according to the ocean mode (force,
49! slab or couple). The calculation of rugosity for the sea-ice surface is also done
50! in here because it is the same calculation for the different modes of ocean.
51!
52
53
54    ! for rd and retv
55
56! Input arguments
57!****************************************************************************************
58    INTEGER, INTENT(IN)                      :: itime, jour, knon
59    INTEGER, DIMENSION(klon), INTENT(IN)     :: knindex
60    LOGICAL, INTENT(IN)                      :: lafin
61    REAL, INTENT(IN)                         :: dtime
62    REAL, DIMENSION(klon), INTENT(IN)        :: rlon, rlat
63    REAL, DIMENSION(klon), INTENT(IN)        :: swnet  ! net shortwave radiation at surface 
64    REAL, DIMENSION(klon), INTENT(IN)        :: lwnet  ! net longwave radiation at surface 
65    REAL, DIMENSION(klon), INTENT(IN)        :: alb1   ! albedo in visible SW interval
66    REAL, DIMENSION(klon), INTENT(IN)        :: fder
67    REAL, DIMENSION(klon), INTENT(IN)        :: tsurf
68    REAL, DIMENSION(klon), INTENT(IN)        :: p1lay
69    REAL, DIMENSION(klon), INTENT(IN)        :: cdragh, cdragm
70    REAL, DIMENSION(klon), INTENT(IN)        :: precip_rain, precip_snow
71    REAL, DIMENSION(klon), INTENT(IN)        :: temp_air, spechum
72    REAL, DIMENSION(klon), INTENT(IN)        :: AcoefH, AcoefQ, BcoefH, BcoefQ
73    REAL, DIMENSION(klon), INTENT(IN)        :: AcoefU, AcoefV, BcoefU, BcoefV
74    REAL, DIMENSION(klon), INTENT(IN)        :: ps
75    REAL, DIMENSION(klon), INTENT(IN)        :: u1, v1, gustiness
76    REAL, DIMENSION(klon,nbsrf), INTENT(IN)  :: pctsrf
77#ifdef ISO
78    REAL, DIMENSION(ntiso,klon), INTENT(IN)  :: xtprecip_rain, xtprecip_snow
79    REAL, DIMENSION(klon),       INTENT(IN)  :: xtspechum
80    REAL, DIMENSION(niso,klon),  INTENT(IN)  :: Roce
81    REAL, DIMENSION(niso,klon),  INTENT(IN)  :: Rland_ice
82#endif
83
84! In/Output arguments
85!****************************************************************************************
86    REAL, DIMENSION(klon), INTENT(INOUT)          :: snow, qsurf, qsol
87    REAL, DIMENSION(klon), INTENT(INOUT)          :: agesno
88    REAL, DIMENSION(klon, nsoilmx), INTENT(INOUT) :: tsoil
89#ifdef ISO
90    REAL, DIMENSION(niso,klon), INTENT(INOUT)     :: xtsnow 
91    REAL, DIMENSION(niso,klon), INTENT(IN)        :: xtsol
92#endif
93
94! Output arguments
95!****************************************************************************************
96    REAL, DIMENSION(klon), INTENT(OUT)       :: z0m, z0h
97!albedo SB >>>
98!    REAL, DIMENSION(klon), INTENT(OUT)       :: alb1_new  ! new albedo in visible SW interval
99!    REAL, DIMENSION(klon), INTENT(OUT)       :: alb2_new  ! new albedo in near IR interval
100    REAL, DIMENSION(6), INTENT(IN)    :: SFRWL
101    REAL, DIMENSION(klon,nsw), INTENT(OUT)   :: alb_dir_new,alb_dif_new
102!albedo SB <<<
103    REAL, DIMENSION(klon), INTENT(OUT)       :: evap, fluxsens, fluxlat
104    REAL, DIMENSION(klon), INTENT(OUT)       :: tsurf_new
105    REAL, DIMENSION(klon), INTENT(OUT)       :: dflux_s, dflux_l     
106    REAL, DIMENSION(klon), INTENT(OUT)       :: flux_u1, flux_v1
107!GG
108    REAL, DIMENSION(klon), INTENT(INOUT)       :: hice, tice, bilg_cumul
109    REAL, DIMENSION(klon), INTENT(INOUT)       :: fcds,fcdi, dh_basal_growth,dh_basal_melt
110    REAL, DIMENSION(klon), INTENT(INOUT)       :: dh_top_melt, dh_snow2sic, dtice_melt, dtice_snow2sic
111!GG
112#ifdef ISO
113    REAL, DIMENSION(ntiso,klon), INTENT(OUT) :: xtevap
114#endif
115
116! Local arguments
117!****************************************************************************************
118    REAL, DIMENSION(klon)  :: radsol
119#ifdef ISO
120#ifdef ISOVERIF
121    INTEGER :: j
122#endif
123#endif
124
125!albedo SB >>>
126    REAL, DIMENSION(klon) :: alb1_new,alb2_new
127!albedo SB <<<
128
129    real rhoa(knon) ! density of moist air  (kg / m3)
130
131! End definitions
132!****************************************************************************************
133
134
135!****************************************************************************************
136! Calculate total net radiance at surface
137!
138!****************************************************************************************
139    radsol(:) = 0.0
140    radsol(1:knon) = swnet(1:knon) + lwnet(1:knon)
141
142    rhoa = PS(:KNON) / (Rd * temp_air(:knon) * (1. + retv * spechum(:knon)))
143
144!****************************************************************************************
145! Switch according to type of ocean (couple, slab or forced)
146!
147!****************************************************************************************
148    IF (type_ocean == 'couple') THEN
149       
150       CALL ocean_cpl_ice( &
151            rlon, rlat, swnet, lwnet, alb1, &
152            fder, &
153            itime, dtime, knon, knindex, &
154            lafin,&
155            p1lay, cdragh, cdragm, precip_rain, precip_snow, temp_air, spechum,&
156            AcoefH, AcoefQ, BcoefH, BcoefQ, &
157            AcoefU, AcoefV, BcoefU, BcoefV, &
158            ps, u1, v1, gustiness, pctsrf, &
159            radsol, snow, qsurf, &
160            alb1_new, alb2_new, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
161            tsurf_new, dflux_s, dflux_l, rhoa)
162       
163    ELSE IF (type_ocean == 'slab'.AND.version_ocean=='sicINT') THEN
164       CALL ocean_slab_ice( &
165          itime, dtime, jour, knon, knindex, &
166          tsurf, p1lay, cdragh, cdragm, precip_rain, precip_snow, temp_air, spechum,&
167          AcoefH, AcoefQ, BcoefH, BcoefQ, &
168            AcoefU, AcoefV, BcoefU, BcoefV, &
169          ps, u1, v1, gustiness, &
170          radsol, snow, qsurf, qsol, agesno, &
171          alb1_new, alb2_new, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
172          tsurf_new, dflux_s, dflux_l, swnet)
173
174      ELSE ! type_ocean=force or slab +sicOBS or sicNO
175       CALL ocean_forced_ice( &
176            itime, dtime, jour, knon, knindex, &
177            tsurf, p1lay, cdragh, cdragm, precip_rain, precip_snow, temp_air, spechum,&
178            AcoefH, AcoefQ, BcoefH, BcoefQ, &
179            AcoefU, AcoefV, BcoefU, BcoefV, &
180!GG            ps, u1, v1, gustiness, &
181            ps, u1, v1, gustiness,pctsrf, &
182!GG
183            radsol, snow, qsol, agesno, tsoil, &
184            qsurf, alb1_new, alb2_new, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
185!GG            tsurf_new, dflux_s, dflux_l, rhoa)
186            tsurf_new, dflux_s, dflux_l,rhoa,swnet,hice, tice, bilg_cumul, &
187            fcds, fcdi, dh_basal_growth, dh_basal_melt, dh_top_melt, dh_snow2sic, &
188            dtice_melt, dtice_snow2sic &
189!GG
190#ifdef ISO
191            ,xtprecip_rain, xtprecip_snow, xtspechum,Roce, &
192            xtsnow, xtsol,xtevap,Rland_ice & 
193#endif           
194            )
195
196    END IF
197
198!****************************************************************************************
199! Calculate rugosity
200!
201!****************************************************************************************
202
203    z0m=z0m_seaice
204    z0h = z0h_seaice
205
206!albedo SB >>>
207     select case(NSW)
208     case(2)
209       alb_dir_new(1:knon,1)=alb1_new(1:knon)
210       alb_dir_new(1:knon,2)=alb2_new(1:knon)
211     case(4)
212       alb_dir_new(1:knon,1)=alb1_new(1:knon)
213       alb_dir_new(1:knon,2)=alb2_new(1:knon)
214       alb_dir_new(1:knon,3)=alb2_new(1:knon)
215       alb_dir_new(1:knon,4)=alb2_new(1:knon)
216     case(6)
217       alb_dir_new(1:knon,1)=alb1_new(1:knon)
218       alb_dir_new(1:knon,2)=alb1_new(1:knon)
219       alb_dir_new(1:knon,3)=alb1_new(1:knon)
220       alb_dir_new(1:knon,4)=alb2_new(1:knon)
221       alb_dir_new(1:knon,5)=alb2_new(1:knon)
222       alb_dir_new(1:knon,6)=alb2_new(1:knon)
223     end select
224alb_dif_new=alb_dir_new
225!albedo SB <<<
226
227
228
229
230  END SUBROUTINE surf_seaice
231!
232!****************************************************************************************
233!
234END MODULE surf_seaice_mod
235
Note: See TracBrowser for help on using the repository browser.