SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
coupling_icefluxn.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 ! #######################################################################
6 SUBROUTINE coupling_iceflux_n(KI, PTA, PEXNA, PRHOA, PTICE, PEXNS, &
7  pqa, prain, psnow, pwind, pzref, puref, &
8  pps, ptwat, ptts, psfth, psftq, &
9  ohandle_sic, pmask, pqsat, pz0, &
10  pustar, pcd, pcdn, pch, &
11  pri, presa, pz0h )
12 ! #######################################################################
13 !
14 !!**** *COUPLING_ICEFLUX_n * - Driver of the ICE_FLUX scheme
15 !!
16 !! PURPOSE
17 !! -------
18 !
19 !!** METHOD
20 !! ------
21 !!
22 !! REFERENCE
23 !! ---------
24 !!
25 !!
26 !! AUTHOR
27 !! ------
28 !! B. DECHARME
29 !!
30 !! MODIFICATIONS
31 !! -------------
32 !! Original 02/2010
33 !! S.Senesi 01/2014 Add numerous optional output fields (transfer
34 !! coeff, qsat...). Optionnaly use seaice cover
35 !!---------------------------------------------------------------------
36 !
37 USE modd_surf_par, ONLY : xundef
38 !
39 USE modi_ice_sea_flux
40 !
41 !
42 USE yomhook ,ONLY : lhook, dr_hook
43 USE parkind1 ,ONLY : jprb
44 !
45 IMPLICIT NONE
46 !
47 !* 0.1 declarations of arguments
48 !
49 INTEGER, INTENT(IN) :: ki ! number of points
50 !
51 REAL, DIMENSION(KI), INTENT(IN) :: pta ! air temperature forcing (K)
52 REAL, DIMENSION(KI), INTENT(IN) :: pexna ! Exner function at atm. level
53 REAL, DIMENSION(KI), INTENT(IN) :: prhoa ! air density (kg/m3)
54 REAL, DIMENSION(KI), INTENT(IN) :: ptice ! Ice Surface Temperature
55 REAL, DIMENSION(KI), INTENT(IN) :: pexns ! Exner function at sea surface
56 REAL, DIMENSION(KI), INTENT(IN) :: pqa ! air humidity forcing (kg/m3)
57 REAL, DIMENSION(KI), INTENT(IN) :: prain ! liquid precipitation (kg/m2/s)
58 REAL, DIMENSION(KI), INTENT(IN) :: psnow ! snow precipitation (kg/m2/s)
59 REAL, DIMENSION(KI), INTENT(IN) :: pwind ! module of wind at atm. wind level
60 REAL, DIMENSION(KI), INTENT(IN) :: pzref ! atm. level for temp. and humidity
61 REAL, DIMENSION(KI), INTENT(IN) :: puref ! atm. level for wind
62 REAL, DIMENSION(KI), INTENT(IN) :: pps ! pressure at atmospheric model surface (Pa)
63 REAL, DIMENSION(KI), INTENT(IN) :: ptwat ! Sea surface temperature
64 REAL, INTENT(IN) :: ptts ! Freezing point for sea water
65 REAL, DIMENSION(KI), INTENT(OUT) :: psfth ! flux of heat (W/m2)
66 REAL, DIMENSION(KI), INTENT(OUT) :: psftq ! flux of water vapor (kg/m2/s)
67 !
68 LOGICAL, INTENT(IN) , OPTIONAL:: ohandle_sic ! Should we output extended set of fields
69 REAL, DIMENSION(KI), INTENT(IN) , OPTIONAL :: pmask ! Where to compute sea-ice fluxes (0./1.)
70 !
71 REAL, DIMENSION(KI), INTENT(OUT), OPTIONAL :: pqsat ! humidity at saturation
72 REAL, DIMENSION(KI), INTENT(OUT), OPTIONAL :: pz0 ! roughness length over the sea ice
73 REAL, DIMENSION(KI), INTENT(OUT), OPTIONAL :: pustar ! friction velocity (m/s)
74 REAL, DIMENSION(KI), INTENT(OUT), OPTIONAL :: pcd ! Drag coefficient
75 REAL, DIMENSION(KI), INTENT(OUT), OPTIONAL :: pcdn ! Neutral Drag coefficient
76 REAL, DIMENSION(KI), INTENT(OUT), OPTIONAL :: pch ! Heat transfer coefficient
77 REAL, DIMENSION(KI), INTENT(OUT), OPTIONAL :: pri ! Richardson number
78 REAL, DIMENSION(KI), INTENT(OUT), OPTIONAL :: presa ! aerodynamical resistance
79 REAL, DIMENSION(KI), INTENT(OUT), OPTIONAL :: pz0h ! heat roughness length over ice
80 !
81 !* 0.2 declarations of local variables
82 !
83 INTEGER, DIMENSION(KI) :: imask
84 LOGICAL :: ghandle_sic
85 INTEGER :: jj, isize
86 !
87 REAL(KIND=JPRB) :: zhook_handle
88 !
89 !-------------------------------------------------------------------------------------
90 ! Preliminaries:
91 !-------------------------------------------------------------------------------------
92 !
93 IF (lhook) CALL dr_hook('COUPLING_ICEFLUX_N',0,zhook_handle)
94 psfth(:)=0.0
95 psftq(:)=0.0
96 IF (present(ohandle_sic)) THEN
97  ghandle_sic=ohandle_sic
98 ELSE
99  ghandle_sic=.false.
100 ENDIF
101 !
102 imask(:)=0
103 isize =0
104 DO jj=1,ki
105  IF (ghandle_sic) THEN
106  IF(pmask(jj)>0.)THEN
107  isize=isize+1
108  imask(isize)=jj
109  ENDIF
110  ELSE
111  IF(ptwat(jj)<ptts+10.)THEN
112  isize=isize+1
113  imask(isize)=jj
114  ENDIF
115  ENDIF
116 ENDDO
117 !
118 IF(isize==0)THEN
119  IF (lhook) CALL dr_hook('COUPLING_ICEFLUX_N',1,zhook_handle)
120  RETURN
121 ENDIF
122 !
123  CALL treat_ice(isize,imask)
124 !
125 !=======================================================================================
126 !
127 IF (lhook) CALL dr_hook('COUPLING_ICEFLUX_N',1,zhook_handle)
128  CONTAINS
129 !
130 !=======================================================================================
131 SUBROUTINE treat_ice(KSIZE,KMASK)
132 !
133 IMPLICIT NONE
134 !
135 INTEGER, INTENT(IN) :: ksize
136 INTEGER, INTENT(IN), DIMENSION(:) :: kmask
137 !
138 REAL, DIMENSION(KSIZE) :: zta ! air temperature forcing (K)
139 REAL, DIMENSION(KSIZE) :: zexna ! Exner function at atm. level
140 REAL, DIMENSION(KSIZE) :: zrhoa ! air density (kg/m3)
141 REAL, DIMENSION(KSIZE) :: ztice ! Ice Surface Temperature
142 REAL, DIMENSION(KSIZE) :: zexns ! Exner function at sea surface
143 REAL, DIMENSION(KSIZE) :: zqa ! air humidity forcing (kg/m3)
144 REAL, DIMENSION(KSIZE) :: zrr ! liquid precipitation (kg/m2/s)
145 REAL, DIMENSION(KSIZE) :: zrs ! snow precipitation (kg/m2/s)
146 REAL, DIMENSION(KSIZE) :: zwind ! module of wind at atm. wind level
147 REAL, DIMENSION(KSIZE) :: zzref ! atm. level for temp. and humidity
148 REAL, DIMENSION(KSIZE) :: zuref ! atm. level for wind
149 REAL, DIMENSION(KSIZE) :: zps ! pressure at atmospheric model surface (Pa)
150 !
151 REAL, DIMENSION(KSIZE) :: zsfth ! flux of heat (W/m2)
152 REAL, DIMENSION(KSIZE) :: zsftq ! flux of water vapor (kg/m2/s)
153 
154 !
155 REAL, DIMENSION(KSIZE) :: zz0 ! roughness length over the sea ice
156 REAL, DIMENSION(KSIZE) :: zqsat ! humidity at saturation
157 REAL, DIMENSION(KSIZE) :: zustar ! friction velocity (m/s)
158 REAL, DIMENSION(KSIZE) :: zcd ! Drag coefficient
159 REAL, DIMENSION(KSIZE) :: zcdn ! Neutral Drag coefficient
160 REAL, DIMENSION(KSIZE) :: zch ! Heat transfer coefficient
161 REAL, DIMENSION(KSIZE) :: zri ! Richardson number
162 REAL, DIMENSION(KSIZE) :: zresa ! aerodynamical resistance
163 REAL, DIMENSION(KSIZE) :: zz0h ! heat roughness length over ice
164 REAL(KIND=JPRB) :: zhook_handle
165 !
166 IF (lhook) CALL dr_hook('COUPLING_ICEFLUX_N:TREAT_ICE',0,zhook_handle)
167 !
168 !-------------------------------------------------------------------------------------
169 !
170 DO jj=1, SIZE(zta)
171  zta(jj) = pta(kmask(jj))
172  zexna(jj) = pexna(kmask(jj))
173  zrhoa(jj) = prhoa(kmask(jj))
174  ztice(jj) = ptice(kmask(jj))
175  zexns(jj) = pexns(kmask(jj))
176  zqa(jj) = pqa(kmask(jj))
177  zrr(jj) = prain(kmask(jj))
178  zrs(jj) = psnow(kmask(jj))
179  zwind(jj) = pwind(kmask(jj))
180  zzref(jj) = pzref(kmask(jj))
181  zuref(jj) = puref(kmask(jj))
182  zps(jj) = pps(kmask(jj))
183 END DO
184 !
185 ! Local variables :
186 !
187 zz0(:) = xundef
188 zqsat(:) = xundef
189 zustar(:) = xundef
190 zcd(:) = xundef
191 zcdn(:) = xundef
192 zch(:) = xundef
193 zri(:) = xundef
194 zresa(:) = xundef
195 zz0h(:) = xundef
196 zsfth(:) = xundef
197 zsftq(:) = xundef
198 !
199 !-------------------------------------------------------------------------------------
200 ! Fluxes over ice according to Charnock formulae (or constant Cd)
201 !--------------------------------------------------------------------------------------
202 !
203  CALL ice_sea_flux(zz0, zta, zexna, zrhoa, ztice, zexns, &
204  zqa, zrr, zrs, zwind, zzref, zuref, zps, &
205  zqsat, zsfth, zsftq, zustar, zcd, zcdn, &
206  zch, zri, zresa, zz0h )
207 !
208 !-------------------------------------------------------------------------------------
209 ! Outputs:
210 !-------------------------------------------------------------------------------------
211 !
212 DO jj=1, SIZE(zsfth)
213  psfth(kmask(jj)) = zsfth(jj)
214  psftq(kmask(jj)) = zsftq(jj)
215  IF (ghandle_sic) THEN
216  pqsat(kmask(jj)) = zqsat(jj)
217  pz0(kmask(jj)) = zz0(jj)
218  pustar(kmask(jj)) = zustar(jj)
219  pcd(kmask(jj)) = zcd(jj)
220  pcdn(kmask(jj)) = zcdn(jj)
221  pch(kmask(jj)) = zch(jj)
222  pri(kmask(jj)) = zri(jj)
223  presa(kmask(jj)) = zresa(jj)
224  pz0h(kmask(jj)) = zz0h(jj)
225  ENDIF
226 END DO
227 !
228 IF (lhook) CALL dr_hook('COUPLING_ICEFLUX_N:TREAT_ICE',1,zhook_handle)
229 !
230 END SUBROUTINE treat_ice
231 !
232 !==========================================================================================
233 !
234 END SUBROUTINE coupling_iceflux_n
subroutine treat_ice(KSIZE, KMASK)
subroutine coupling_iceflux_n(KI, PTA, PEXNA, PRHOA, PTICE, PEXNS, PQA, PRAIN, PSNOW, PWIND, PZREF, PUREF, PPS, PTWAT, PTTS, PSFTH, PSFTQ, OHANDLE_SIC, PMASK, PQSAT, PZ0, PUSTAR, PCD, PCDN, PCH, PRI, PRESA, PZ0H)
subroutine ice_sea_flux(PZ0ICE, PTA, PEXNA, PRHOA, PTICE, PEXNS, PQA, PRR, PRS, PVMOD, PZREF, PUREF, PPS, PQSAT, PSFTH, PSFTQ, PUSTAR, PCD, PCDN, PCH, PRI, PRESA, PZ0HICE)
Definition: ice_sea_flux.F90:6