My Project
 All Classes Files Functions Variables Macros
surf_ocean_mod.F90
Go to the documentation of this file.
1 !
3 
4  IMPLICIT NONE
5 
6 CONTAINS
7 !
8 !****************************************************************************************
9 !
10  SUBROUTINE surf_ocean(rlon, rlat, swnet, lwnet, alb1, &
11  rugos, windsp, rmu0, fder, tsurf_in, &
12  itime, dtime, jour, knon, knindex, &
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, &
17  snow, qsurf, agesno, &
18  z0_new, alb1_new, alb2_new, evap, fluxsens, fluxlat, &
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
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 !
32  include "indicesol.h"
33  include "YOMCST.h"
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
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
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
48  REAL, DIMENSION(klon), INTENT(IN) :: tsurf_in
49  REAL, DIMENSION(klon), INTENT(IN) :: p1lay
50  REAL, DIMENSION(klon), INTENT(IN) :: cdragh
51  REAL, DIMENSION(klon), INTENT(IN) :: cdragm
52  REAL, DIMENSION(klon), INTENT(IN) :: precip_rain, precip_snow
53  REAL, DIMENSION(klon), INTENT(IN) :: temp_air, spechum
54  REAL, DIMENSION(klon), INTENT(IN) :: acoefh, acoefq, bcoefh, bcoefq
55  REAL, DIMENSION(klon), INTENT(IN) :: acoefu, acoefv, bcoefu, bcoefv
56  REAL, DIMENSION(klon), INTENT(IN) :: ps
57  REAL, DIMENSION(klon), INTENT(IN) :: u1, v1
58  REAL, DIMENSION(klon), INTENT(IN) :: rugoro
59  REAL, DIMENSION(klon,nbsrf), INTENT(IN) :: pctsrf
60 
61 ! In/Output variables
62 !****************************************************************************************
63  REAL, DIMENSION(klon), INTENT(INOUT) :: snow
64  REAL, DIMENSION(klon), INTENT(INOUT) :: qsurf
65  REAL, DIMENSION(klon), INTENT(INOUT) :: agesno
66 
67 ! Output variables
68 !****************************************************************************************
69  REAL, DIMENSION(klon), INTENT(OUT) :: z0_new
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
72  REAL, DIMENSION(klon), INTENT(OUT) :: evap, fluxsens, fluxlat
73  REAL, DIMENSION(klon), INTENT(OUT) :: tsurf_new
74  REAL, DIMENSION(klon), INTENT(OUT) :: dflux_s, dflux_l
75  REAL, DIMENSION(klon), INTENT(OUT) :: lmt_bils
76  REAL, DIMENSION(klon), INTENT(OUT) :: flux_u1, flux_v1
77 
78 ! Local variables
79 !****************************************************************************************
80  INTEGER :: i
81  REAL :: tmp
82  REAL, PARAMETER :: cepdu2=(0.1)**2
83  REAL, DIMENSION(klon) :: alb_eau
84  REAL, DIMENSION(klon) :: radsol
85 
86 ! End definition
87 !****************************************************************************************
88 
89 
90 !****************************************************************************************
91 ! Calculate total net radiance at surface
92 !
93 !****************************************************************************************
94  radsol(:) = 0.0
95  radsol(1:knon) = swnet(1:knon) + lwnet(1:knon)
96 
97 !****************************************************************************************
98 ! Switch according to type of ocean (couple, slab or forced)
99 !****************************************************************************************
100  SELECT CASE(type_ocean)
101  CASE('couple')
102  CALL ocean_cpl_noice( &
103  swnet, lwnet, alb1, &
104  windsp, fder, &
105  itime, dtime, knon, knindex, &
106  p1lay, cdragh, cdragm, precip_rain, precip_snow,temp_air,spechum,&
107  acoefh, acoefq, bcoefh, bcoefq, &
108  acoefu, acoefv, bcoefu, bcoefv, &
109  ps, u1, v1, &
110  radsol, snow, agesno, &
111  qsurf, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
112  tsurf_new, dflux_s, dflux_l)
113 
114  CASE('slab')
115  CALL ocean_slab_noice( &
116  itime, dtime, jour, knon, knindex, &
117  p1lay, cdragh, cdragm, precip_rain, precip_snow, temp_air, spechum,&
118  acoefh, acoefq, bcoefh, bcoefq, &
119  acoefu, acoefv, bcoefu, bcoefv, &
120  ps, u1, v1, tsurf_in, &
121  radsol, snow, agesno, &
122  qsurf, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
123  tsurf_new, dflux_s, dflux_l, lmt_bils)
124 
125  CASE('force')
126  CALL ocean_forced_noice( &
127  itime, dtime, jour, knon, knindex, &
128  p1lay, cdragh, cdragm, precip_rain, precip_snow, &
129  temp_air, spechum, &
130  acoefh, acoefq, bcoefh, bcoefq, &
131  acoefu, acoefv, bcoefu, bcoefv, &
132  ps, u1, v1, &
133  radsol, snow, agesno, &
134  qsurf, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
135  tsurf_new, dflux_s, dflux_l)
136  END SELECT
137 
138 !****************************************************************************************
139 ! Calculate albedo
140 !
141 !****************************************************************************************
142  IF ( minval(rmu0) == maxval(rmu0) .AND. minval(rmu0) == -999.999 ) THEN
143  CALL alboc(REAL(jour),rlat,alb_eau)
144  ELSE ! diurnal cycle
145  CALL alboc_cd(rmu0,alb_eau)
146  ENDIF
147 
148  DO i =1, knon
149  alb1_new(i) = alb_eau(knindex(i))
150  ENDDO
151  alb2_new(1:knon) = alb1_new(1:knon)
152 
153 !****************************************************************************************
154 ! Calculate the rugosity
155 !
156 !****************************************************************************************
157  DO i = 1, knon
158  tmp = max(cepdu2,u1(i)**2+v1(i)**2)
159  z0_new(i) = 0.018*cdragm(i) * (u1(i)**2+v1(i)**2)/rg &
160  + 0.11*14e-6 / sqrt(cdragm(i) * tmp)
161  z0_new(i) = max(1.5e-05,z0_new(i))
162  ENDDO
163 !
164 !****************************************************************************************
165 !
166  END SUBROUTINE surf_ocean
167 !
168 !****************************************************************************************
169 !
170 END MODULE surf_ocean_mod