My Project
 All Classes Files Functions Variables Macros
surf_seaice_mod.F90
Go to the documentation of this file.
1 !
3 
4  IMPLICIT NONE
5 
6 CONTAINS
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 
28 !
29 ! This subroutine will make a call to ocean_XXX_ice according to the ocean mode (force,
30 ! slab or couple). The calculation of rugosity for the sea-ice surface is also done
31 ! in here because it is the same calculation for the different modes of ocean.
32 !
33  include "indicesol.h"
34  include "dimsoil.h"
35 
36 ! Input arguments
37 !****************************************************************************************
38  INTEGER, INTENT(IN) :: itime, jour, knon
39  INTEGER, DIMENSION(klon), INTENT(IN) :: knindex
40  LOGICAL, INTENT(IN) :: lafin
41  REAL, INTENT(IN) :: dtime
42  REAL, DIMENSION(klon), INTENT(IN) :: rlon, rlat
43  REAL, DIMENSION(klon), INTENT(IN) :: swnet ! net shortwave radiation at surface
44  REAL, DIMENSION(klon), INTENT(IN) :: lwnet ! net longwave radiation at surface
45  REAL, DIMENSION(klon), INTENT(IN) :: alb1 ! albedo in visible SW interval
46  REAL, DIMENSION(klon), INTENT(IN) :: fder
47  REAL, DIMENSION(klon), INTENT(IN) :: tsurf
48  REAL, DIMENSION(klon), INTENT(IN) :: p1lay
49  REAL, DIMENSION(klon), INTENT(IN) :: cdragh, cdragm
50  REAL, DIMENSION(klon), INTENT(IN) :: precip_rain, precip_snow
51  REAL, DIMENSION(klon), INTENT(IN) :: temp_air, spechum
52  REAL, DIMENSION(klon), INTENT(IN) :: acoefh, acoefq, bcoefh, bcoefq
53  REAL, DIMENSION(klon), INTENT(IN) :: acoefu, acoefv, bcoefu, bcoefv
54  REAL, DIMENSION(klon), INTENT(IN) :: ps
55  REAL, DIMENSION(klon), INTENT(IN) :: u1, v1
56  REAL, DIMENSION(klon), INTENT(IN) :: rugoro
57  REAL, DIMENSION(klon,nbsrf), INTENT(IN) :: pctsrf
58 
59 ! In/Output arguments
60 !****************************************************************************************
61  REAL, DIMENSION(klon), INTENT(INOUT) :: snow, qsurf, qsol
62  REAL, DIMENSION(klon), INTENT(INOUT) :: agesno
63  REAL, DIMENSION(klon, nsoilmx), INTENT(INOUT) :: tsoil
64 
65 ! Output arguments
66 !****************************************************************************************
67  REAL, DIMENSION(klon), INTENT(OUT) :: z0_new
68  REAL, DIMENSION(klon), INTENT(OUT) :: alb1_new ! new albedo in visible SW interval
69  REAL, DIMENSION(klon), INTENT(OUT) :: alb2_new ! new albedo in near IR interval
70  REAL, DIMENSION(klon), INTENT(OUT) :: evap, fluxsens, fluxlat
71  REAL, DIMENSION(klon), INTENT(OUT) :: tsurf_new
72  REAL, DIMENSION(klon), INTENT(OUT) :: dflux_s, dflux_l
73  REAL, DIMENSION(klon), INTENT(OUT) :: flux_u1, flux_v1
74 
75 ! Local arguments
76 !****************************************************************************************
77  REAL, DIMENSION(klon) :: radsol
78 
79 !
80 ! End definitions
81 !****************************************************************************************
82 
83 
84 !****************************************************************************************
85 ! Calculate total net radiance at surface
86 !
87 !****************************************************************************************
88  radsol(:) = 0.0
89  radsol(1:knon) = swnet(1:knon) + lwnet(1:knon)
90 
91 !****************************************************************************************
92 ! Switch according to type of ocean (couple, slab or forced)
93 !
94 !****************************************************************************************
95  IF (type_ocean == 'couple') THEN
96 
97  CALL ocean_cpl_ice( &
98  rlon, rlat, swnet, lwnet, alb1, &
99  fder, &
100  itime, dtime, knon, knindex, &
101  lafin,&
102  p1lay, cdragh, cdragm, precip_rain, precip_snow, temp_air, spechum,&
103  acoefh, acoefq, bcoefh, bcoefq, &
104  acoefu, acoefv, bcoefu, bcoefv, &
105  ps, u1, v1, pctsrf, &
106  radsol, snow, qsurf, &
107  alb1_new, alb2_new, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
108  tsurf_new, dflux_s, dflux_l)
109 
110  ELSE IF (type_ocean == 'force' .OR. (type_ocean == 'slab' .AND. version_ocean=='sicOBS')) THEN
111  CALL ocean_forced_ice( &
112  itime, dtime, jour, knon, knindex, &
113  tsurf, p1lay, cdragh, cdragm, precip_rain, precip_snow, temp_air, spechum,&
114  acoefh, acoefq, bcoefh, bcoefq, &
115  acoefu, acoefv, bcoefu, bcoefv, &
116  ps, u1, v1, &
117  radsol, snow, qsol, agesno, tsoil, &
118  qsurf, alb1_new, alb2_new, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
119  tsurf_new, dflux_s, dflux_l)
120 
121  ELSE IF (type_ocean == 'slab') THEN
122 !!$ CALL ocean_slab_ice( &
123 !!$ itime, dtime, jour, knon, knindex, &
124 !!$ debut, &
125 !!$ tsurf, p1lay, cdragh, precip_rain, precip_snow, temp_air, spechum,&
126 !!$ AcoefH, AcoefQ, BcoefH, BcoefQ, &
127 !!$ ps, u1, v1, pctsrf, &
128 !!$ radsol, snow, qsurf, qsol, agesno, tsoil, &
129 !!$ alb1_new, alb2_new, evap, fluxsens, fluxlat, &
130 !!$ tsurf_new, dflux_s, dflux_l)
131 
132  END IF
133 
134 !****************************************************************************************
135 ! Calculate rugosity
136 !
137 !****************************************************************************************
138  z0_new = 0.002
139  z0_new = sqrt(z0_new**2+rugoro**2)
140 
141  END SUBROUTINE surf_seaice
142 !
143 !****************************************************************************************
144 !
145 END MODULE surf_seaice_mod
146