SURFEX v8.1
General documentation of Surfex
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)
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
subroutine ice_sea_flux(PZ0ICE,
Definition: ice_sea_flux.F90:7