New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
sbcblk_algo_coare3p0.F90 in NEMO/branches/2019/dev_r11085_ASINTER-05_Brodeau_Advanced_Bulk/src/OCE/SBC – NEMO

source: NEMO/branches/2019/dev_r11085_ASINTER-05_Brodeau_Advanced_Bulk/src/OCE/SBC/sbcblk_algo_coare3p0.F90 @ 11672

Last change on this file since 11672 was 11672, checked in by laurent, 5 years ago

LB: "sbcblk_skin_coare.F90" now relies on "sbcdcy.F90" (modified) to know dawn/dusk time

File size: 26.2 KB
Line 
1MODULE sbcblk_algo_coare3p0
2   !!======================================================================
3   !!                   ***  MODULE  sbcblk_algo_coare3p0  ***
4   !!
5   !!                After Fairall et al, 2003
6   !! Computes:
7   !!   * bulk transfer coefficients C_D, C_E and C_H
8   !!   * air temp. and spec. hum. adjusted from zt (2m) to zu (10m) if needed
9   !!   * the effective bulk wind speed at 10m U_blk
10   !!   => all these are used in bulk formulas in sbcblk.F90
11   !!
12   !!       Routine turb_coare3p0 maintained and developed in AeroBulk
13   !!                     (https://github.com/brodeau/aerobulk)
14   !!
15   !! ** Author: L. Brodeau, June 2019 / AeroBulk (https://github.com/brodeau/aerobulk)
16   !!----------------------------------------------------------------------
17   !! History :  4.0  !  2016-02  (L.Brodeau)   Original code
18   !!----------------------------------------------------------------------
19
20   !!----------------------------------------------------------------------
21   !!   turb_coare3p0  : computes the bulk turbulent transfer coefficients
22   !!                   adjusts t_air and q_air from zt to zu m
23   !!                   returns the effective bulk wind speed at 10m
24   !!----------------------------------------------------------------------
25   USE oce             ! ocean dynamics and tracers
26   USE dom_oce         ! ocean space and time domain
27   USE phycst          ! physical constants
28   USE iom             ! I/O manager library
29   USE lib_mpp         ! distribued memory computing library
30   USE in_out_manager  ! I/O manager
31   USE prtctl          ! Print control
32   USE sbcwave, ONLY   :  cdn_wave ! wave module
33#if defined key_si3 || defined key_cice
34   USE sbc_ice         ! Surface boundary condition: ice fields
35#endif
36   USE lib_fortran     ! to use key_nosignedzero
37
38   USE sbc_oce         ! Surface boundary condition: ocean fields
39   USE sbcblk_phy      ! all thermodynamics functions, rho_air, q_sat, etc... !LB
40   USE sbcblk_skin_coare ! cool-skin/warm layer scheme (CSWL_ECMWF) !LB
41
42   IMPLICIT NONE
43   PRIVATE
44
45   PUBLIC :: COARE3P0_INIT, TURB_COARE3P0
46
47   !                                              !! COARE own values for given constants:
48   REAL(wp), PARAMETER ::   zi0     = 600._wp     ! scale height of the atmospheric boundary layer...
49   REAL(wp), PARAMETER ::   Beta0   =   1.25_wp   ! gustiness parameter
50
51   INTEGER , PARAMETER ::   nb_itt = 5             ! number of itterations
52
53   !!----------------------------------------------------------------------
54CONTAINS
55
56
57   SUBROUTINE coare3p0_init(l_use_cs, l_use_wl)
58      !!---------------------------------------------------------------------
59      !!                  ***  FUNCTION coare3p0_init  ***
60      !!
61      !! INPUT :
62      !! -------
63      !!    * l_use_cs : use the cool-skin parameterization
64      !!    * l_use_wl : use the warm-layer parameterization
65      !!---------------------------------------------------------------------
66      LOGICAL , INTENT(in) ::   l_use_cs ! use the cool-skin parameterization
67      LOGICAL , INTENT(in) ::   l_use_wl ! use the warm-layer parameterization
68      INTEGER :: ierr
69      !!---------------------------------------------------------------------
70      IF ( l_use_wl ) THEN
71         ierr = 0
72         ALLOCATE ( Tau_ac(jpi,jpj) , Qnt_ac(jpi,jpj), H_wl(jpi,jpj), STAT=ierr )
73         !IF( ierr > 0 ) STOP ' COARE3P0_INIT => allocation of Tau_ac and Qnt_ac failed!'
74         Tau_ac(:,:) = 0._wp
75         Qnt_ac(:,:)   = 0._wp
76         H_wl(:,:)    = H_wl_max
77      END IF
78      !!
79      IF ( l_use_cs ) THEN
80         ierr = 0
81         ALLOCATE ( delta_vl(jpi,jpj), STAT=ierr )
82         !IF( ierr > 0 ) STOP ' COARE3P0_INIT => allocation of delta_vl and Qnt_ac failed!'
83         delta_vl(:,:) = 0.001_wp      ! First guess of zdelta [m]
84      END IF
85   END SUBROUTINE coare3p0_init
86
87
88
89   SUBROUTINE turb_coare3p0( kt, zt, zu, T_s, t_zt, q_s, q_zt, U_zu, l_use_cs, l_use_wl, &
90      &                      Cd, Ch, Ce, t_zu, q_zu, U_blk,                              &
91      &                      Cdn, Chn, Cen,                                              &
92      &                      Qsw, rad_lw, slp, pdT_cs,                                   & ! optionals for cool-skin (and warm-layer)
93      &                      pdT_wl, Hwl )                                                 ! optionals for warm-layer only
94      !!----------------------------------------------------------------------
95      !!                      ***  ROUTINE  turb_coare3p0  ***
96      !!
97      !! ** Purpose :   Computes turbulent transfert coefficients of surface
98      !!                fluxes according to Fairall et al. (2003)
99      !!                If relevant (zt /= zu), adjust temperature and humidity from height zt to zu
100      !!                Returns the effective bulk wind speed at zu to be used in the bulk formulas
101      !!
102      !!                Applies the cool-skin warm-layer correction of the SST to T_s
103      !!                if the net shortwave flux at the surface (Qsw), the downwelling longwave
104      !!                radiative fluxes at the surface (rad_lw), and the sea-leve pressure (slp)
105      !!                are provided as (optional) arguments!
106      !!
107      !! INPUT :
108      !! -------
109      !!    *  kt   : current time step (starts at 1)
110      !!    *  zt   : height for temperature and spec. hum. of air            [m]
111      !!    *  zu   : height for wind speed (usually 10m)                     [m]
112      !!    *  t_zt : potential air temperature at zt                         [K]
113      !!    *  q_zt : specific humidity of air at zt                          [kg/kg]
114      !!    *  U_zu : scalar wind speed at zu                                 [m/s]
115      !!    * l_use_cs : use the cool-skin parameterization
116      !!    * l_use_wl : use the warm-layer parameterization
117      !!
118      !! INPUT/OUTPUT:
119      !! -------------
120      !!    *  T_s  : always "bulk SST" as input                              [K]
121      !!              -> unchanged "bulk SST" as output if CSWL not used      [K]
122      !!              -> skin temperature as output if CSWL used              [K]
123      !!
124      !!    *  q_s  : SSQ aka saturation specific humidity at temp. T_s       [kg/kg]
125      !!              -> doesn't need to be given a value if skin temp computed (in case l_use_cs=True or l_use_wl=True)
126      !!              -> MUST be given the correct value if not computing skint temp. (in case l_use_cs=False or l_use_wl=False)
127      !!
128      !! OPTIONAL INPUT:
129      !! ---------------
130      !!    *  Qsw    : net solar flux (after albedo) at the surface (>0)     [W/m^2]
131      !!    *  rad_lw : downwelling longwave radiation at the surface  (>0)   [W/m^2]
132      !!    *  slp    : sea-level pressure                                    [Pa]
133      !!    * pdT_cs  : SST increment "dT" for cool-skin correction           [K]
134      !!    * pdT_wl  : SST increment "dT" for warm-layer correction          [K]
135      !!    * Hwl     : depth of warm layer                                   [m]
136      !!
137      !! OUTPUT :
138      !! --------
139      !!    *  Cd     : drag coefficient
140      !!    *  Ch     : sensible heat coefficient
141      !!    *  Ce     : evaporation coefficient
142      !!    *  t_zu   : pot. air temperature adjusted at wind height zu       [K]
143      !!    *  q_zu   : specific humidity of air        //                    [kg/kg]
144      !!    *  U_blk  : bulk wind speed at zu                                 [m/s]
145      !!
146      !!
147      !! ** Author: L. Brodeau, June 2019 / AeroBulk (https://github.com/brodeau/aerobulk/)
148      !!----------------------------------------------------------------------------------
149      INTEGER,  INTENT(in   )                     ::   kt       ! current time step
150      REAL(wp), INTENT(in   )                     ::   zt       ! height for t_zt and q_zt                    [m]
151      REAL(wp), INTENT(in   )                     ::   zu       ! height for U_zu                             [m]
152      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj) ::   T_s      ! sea surface temperature                [Kelvin]
153      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   t_zt     ! potential air temperature              [Kelvin]
154      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj) ::   q_s      ! sea surface specific humidity           [kg/kg]
155      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   q_zt     ! specific air humidity at zt             [kg/kg]
156      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   U_zu     ! relative wind module at zu                [m/s]
157      LOGICAL , INTENT(in   )                     ::   l_use_cs ! use the cool-skin parameterization
158      LOGICAL , INTENT(in   )                     ::   l_use_wl ! use the warm-layer parameterization
159      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   Cd       ! transfer coefficient for momentum         (tau)
160      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   Ch       ! transfer coefficient for sensible heat (Q_sens)
161      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   Ce       ! transfert coefficient for evaporation   (Q_lat)
162      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   t_zu     ! pot. air temp. adjusted at zu               [K]
163      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   q_zu     ! spec. humidity adjusted at zu           [kg/kg]
164      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   U_blk    ! bulk wind speed at zu                     [m/s]
165      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   Cdn, Chn, Cen ! neutral transfer coefficients
166      !
167      REAL(wp), INTENT(in   ), OPTIONAL, DIMENSION(jpi,jpj) ::   Qsw      !             [W/m^2]
168      REAL(wp), INTENT(in   ), OPTIONAL, DIMENSION(jpi,jpj) ::   rad_lw   !             [W/m^2]
169      REAL(wp), INTENT(in   ), OPTIONAL, DIMENSION(jpi,jpj) ::   slp      !             [Pa]
170      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   pdT_cs
171      !
172      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   pdT_wl   !             [K]
173      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   Hwl      !             [m]
174      !
175      INTEGER :: j_itt
176      LOGICAL :: l_zt_equal_zu = .FALSE.      ! if q and t are given at same height as U
177      !
178      REAL(wp), DIMENSION(jpi,jpj) ::  &
179         &  u_star, t_star, q_star, &
180         &  dt_zu, dq_zu,    &
181         &  znu_a,           & !: Nu_air, Viscosity of air
182         &  z0, z0t
183      REAL(wp), DIMENSION(jpi,jpj) ::   zeta_u        ! stability parameter at height zu
184      REAL(wp), DIMENSION(jpi,jpj) ::   ztmp0, ztmp1, ztmp2
185      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   zeta_t        ! stability parameter at height zt
186      !
187      REAL(wp), DIMENSION(:,:), ALLOCATABLE :: &
188         &                zsst,   &  ! to back up the initial bulk SST
189         &                pdTc,   &  ! SST increment "dT" for cool-skin correction           [K]
190         &                pdTw,   &  ! SST increment "dT" for warm layer correction          [K]
191         &                zHwl       ! depth of warm-layer [m]
192      !!----------------------------------------------------------------------------------
193
194      IF ( kt == 1 ) CALL COARE3P0_INIT(l_use_cs, l_use_wl) ! allocation of accumulation arrays
195
196      l_zt_equal_zu = .FALSE.
197      IF( ABS(zu - zt) < 0.01_wp )   l_zt_equal_zu = .TRUE.    ! testing "zu == zt" is risky with double precision
198      IF( .NOT. l_zt_equal_zu )  ALLOCATE( zeta_t(jpi,jpj) )
199
200      !! Initializations for cool skin and warm layer:
201      IF ( l_use_cs .OR. l_use_wl ) THEN
202         IF( .NOT.(PRESENT(Qsw) .AND. PRESENT(rad_lw) .AND. PRESENT(slp)) ) &
203            & CALL ctl_stop( 'turb_coare3p0 => provide Qsw, rad_lw & slp to ', 'use cool-skin and/or warm-layer param' )
204         ALLOCATE ( zsst(jpi,jpj) )
205         zsst = T_s ! backing up the bulk SST
206         IF( l_use_cs ) T_s = T_s - 0.25   ! First guess of correction
207         q_s    = rdct_qsat_salt*q_sat(MAX(T_s, 200._wp), slp) ! First guess of q_s !LOLO WL too!!!
208      END IF
209      IF ( l_use_cs ) THEN
210         ALLOCATE ( pdTc(jpi,jpj) )
211         pdTc(:,:) = -0.25_wp  ! First guess of skin correction
212      END IF
213      IF ( l_use_wl ) THEN
214         ALLOCATE ( pdTw(jpi,jpj) )
215         IF (PRESENT(Hwl)) ALLOCATE ( zHwl(jpi,jpj) )
216      END IF
217
218
219      !! First guess of temperature and humidity at height zu:
220      t_zu = MAX( t_zt ,  180._wp )   ! who knows what's given on masked-continental regions...
221      q_zu = MAX( q_zt , 1.e-6_wp )   !               "
222
223      !! Pot. temp. difference (and we don't want it to be 0!)
224      dt_zu = t_zu - T_s ;   dt_zu = SIGN( MAX(ABS(dt_zu),1.E-6_wp), dt_zu )
225      dq_zu = q_zu - q_s ;   dq_zu = SIGN( MAX(ABS(dq_zu),1.E-9_wp), dq_zu )
226
227      znu_a = visc_air(t_zu) ! Air viscosity (m^2/s) at zt given from temperature in (K)
228
229      U_blk = SQRT(U_zu*U_zu + 0.5_wp*0.5_wp) ! initial guess for wind gustiness contribution
230
231      ztmp0   = LOG(    zu*10000._wp) ! optimization: 10000. == 1/z0 (with z0 first guess == 0.0001)
232      ztmp1   = LOG(10._wp*10000._wp) !       "                    "               "
233      u_star = 0.035_wp*U_blk*ztmp1/ztmp0       ! (u* = 0.035*Un10)
234
235      z0     = alfa_charn_3p0(U_zu)*u_star*u_star/grav + 0.11_wp*znu_a/u_star
236      z0     = MIN(ABS(z0), 0.001_wp)  ! (prevent FPE from stupid values from masked region later on...) !#LOLO
237      z0t    = 1._wp / ( 0.1_wp*EXP(vkarmn/(0.00115/(vkarmn/ztmp1))) )
238      z0t    = MIN(ABS(z0t), 0.001_wp)  ! (prevent FPE from stupid values from masked region later on...) !#LOLO
239
240      Cd     = (vkarmn/ztmp0)**2    ! first guess of Cd
241
242      ztmp0 = vkarmn*vkarmn/LOG(zt/z0t)/Cd
243
244      ztmp2 = Ri_bulk( zu, T_s, t_zu, q_s, q_zu, U_blk ) ! Bulk Richardson Number (BRN)
245
246      !! First estimate of zeta_u, depending on the stability, ie sign of BRN (ztmp2):
247      ztmp1 = 0.5 + SIGN( 0.5_wp , ztmp2 )
248      ztmp0 = ztmp0*ztmp2
249      zeta_u = (1._wp-ztmp1) * (ztmp0/(1._wp+ztmp2/(-zu/(zi0*0.004_wp*Beta0**3)))) & !  BRN < 0
250         &  +     ztmp1   * (ztmp0*(1._wp + 27._wp/9._wp*ztmp2/ztmp0))               !  BRN > 0
251      !#LB: should make sure that the "ztmp0" of "27./9.*ztmp2/ztmp0" is "ztmp0*ztmp2" and not "ztmp0==vkarmn*vkarmn/LOG(zt/z0t)/Cd" !
252
253      !! First guess M-O stability dependent scaling params.(u*,t*,q*) to estimate z0 and z/L
254      ztmp0  = vkarmn/(LOG(zu/z0t) - psi_h_coare(zeta_u))
255
256      u_star = U_blk*vkarmn/(LOG(zu) - LOG(z0)  - psi_m_coare(zeta_u))
257      t_star = dt_zu*ztmp0
258      q_star = dq_zu*ztmp0
259
260      ! What needs to be done if zt /= zu:
261      IF( .NOT. l_zt_equal_zu ) THEN
262         !! First update of values at zu (or zt for wind)
263         zeta_t = zt*zeta_u/zu
264         ztmp0 = psi_h_coare(zeta_u) - psi_h_coare(zeta_t)
265         ztmp1 = LOG(zt/zu) + ztmp0
266         t_zu = t_zt - t_star/vkarmn*ztmp1
267         q_zu = q_zt - q_star/vkarmn*ztmp1
268         q_zu = (0.5_wp + SIGN(0.5_wp,q_zu))*q_zu !Makes it impossible to have negative humidity :
269         !
270         dt_zu = t_zu - T_s  ; dt_zu = SIGN( MAX(ABS(dt_zu),1.E-6_wp), dt_zu )
271         dq_zu = q_zu - q_s  ; dq_zu = SIGN( MAX(ABS(dq_zu),1.E-9_wp), dq_zu )
272      END IF
273
274      !! ITERATION BLOCK
275      DO j_itt = 1, nb_itt
276
277         !!Inverse of Monin-Obukov length (1/L) :
278         ztmp0 = One_on_L(t_zu, q_zu, u_star, t_star, q_star)  ! 1/L == 1/[Monin-Obukhov length]
279         ztmp0 = SIGN( MIN(ABS(ztmp0),200._wp), ztmp0 ) ! (prevents FPE from stupid values from masked region later on...) !#LOLO
280
281         ztmp1 = u_star*u_star   ! u*^2
282
283         !! Update wind at zu with convection-related wind gustiness in unstable conditions (Fairall et al. 2003, Eq.8):
284         ztmp2 = Beta0*Beta0*ztmp1*(MAX(-zi0*ztmp0/vkarmn,0._wp))**(2._wp/3._wp) ! square of wind gustiness contribution, ztmp2 == Ug^2
285         !!   ! Only true when unstable (L<0) => when ztmp0 < 0 => explains "-" before zi0
286         U_blk = MAX(SQRT(U_zu*U_zu + ztmp2), 0.2_wp)        ! include gustiness in bulk wind speed
287         ! => 0.2 prevents U_blk to be 0 in stable case when U_zu=0.
288
289         !! Stability parameters:
290         zeta_u = zu*ztmp0
291         zeta_u = SIGN( MIN(ABS(zeta_u),50.0_wp), zeta_u )
292         IF( .NOT. l_zt_equal_zu ) THEN
293            zeta_t = zt*ztmp0
294            zeta_t = SIGN( MIN(ABS(zeta_t),50.0_wp), zeta_t )
295         END IF
296
297         !! Adjustment the wind at 10m (not needed in the current algo form):
298         !IF ( zu \= 10._wp ) U10 = U_zu + u_star/vkarmn*(LOG(10._wp/zu) - psi_m_coare(10._wp*ztmp0) + psi_m_coare(zeta_u))
299
300         !! Roughness lengthes z0, z0t (z0q = z0t) :
301         ztmp2 = u_star/vkarmn*LOG(10./z0)                                 ! Neutral wind speed at 10m
302         z0    = alfa_charn_3p0(ztmp2)*ztmp1/grav + 0.11_wp*znu_a/u_star   ! Roughness length (eq.6)
303         ztmp1 = ( znu_a / (z0*u_star) )**0.6_wp    ! (1./Re_r)^0.72 (Re_r: roughness Reynolds number) COARE3.6-specific!
304         z0t   = MIN( 1.1E-4_wp , 5.5E-5_wp*ztmp1 ) ! Scalar roughness for both theta and q (eq.28) #LOLO: some use 1.15 not 1.1 !!!
305
306         !! Turbulent scales at zu :
307         ztmp0   = psi_h_coare(zeta_u)
308         ztmp1   = vkarmn/(LOG(zu) - LOG(z0t) - ztmp0) ! #LOLO: in ztmp0, some use psi_h_coare(zeta_t) rather than psi_h_coare(zeta_t) ???
309
310         t_star = dt_zu*ztmp1
311         q_star = dq_zu*ztmp1
312         u_star = U_blk*vkarmn/(LOG(zu) - LOG(z0) - psi_m_coare(zeta_u))
313
314         IF( .NOT. l_zt_equal_zu ) THEN
315            !! Re-updating temperature and humidity at zu if zt /= zu :
316            ztmp1 = LOG(zt/zu) + ztmp0 - psi_h_coare(zeta_t)
317            t_zu = t_zt - t_star/vkarmn*ztmp1
318            q_zu = q_zt - q_star/vkarmn*ztmp1
319         END IF
320
321
322         IF( l_use_cs ) THEN
323            !! Cool-skin contribution
324
325            CALL UPDATE_QNSOL_TAU( T_s, q_s, t_zu, q_zu, u_star, t_star, q_star, U_blk, slp, rad_lw, &
326               &                   ztmp1, zeta_u,  Qlat=ztmp2)  ! Qnsol -> ztmp1 / Tau -> zeta_u
327
328            CALL CS_COARE( Qsw, ztmp1, u_star, zsst, ztmp2,  pdTc )  ! ! Qnsol -> ztmp1 / Qlat -> ztmp2
329
330            T_s(:,:) = zsst(:,:) + pdTc(:,:)*tmask(:,:,1)
331            IF( l_use_wl ) T_s(:,:) = T_s(:,:) + pdTw(:,:)*tmask(:,:,1)
332            q_s(:,:) = rdct_qsat_salt*q_sat(MAX(T_s(:,:), 200._wp), slp(:,:))
333
334         END IF
335
336         IF( l_use_wl ) THEN
337            !! Warm-layer contribution
338            CALL UPDATE_QNSOL_TAU( T_s, q_s, t_zu, q_zu, u_star, t_star, q_star, U_blk, slp, rad_lw, &
339               &                   ztmp1, zeta_u)  ! Qnsol -> ztmp1 / Tau -> zeta_u
340            !! In WL_COARE or , Tau_ac and Qnt_ac must be updated at the final itteration step => add a flag to do this!
341            IF (PRESENT(Hwl)) THEN
342               CALL WL_COARE( Qsw, ztmp1, zeta_u, zsst, MOD(nb_itt,j_itt),  pdTw,  Hwl=zHwl )
343            ELSE
344               CALL WL_COARE( Qsw, ztmp1, zeta_u, zsst, MOD(nb_itt,j_itt),  pdTw )
345            END IF
346            !! Updating T_s and q_s !!!
347            T_s(:,:) = zsst(:,:) + pdTw(:,:)*tmask(:,:,1)
348            IF( l_use_cs ) T_s(:,:) = T_s(:,:) + pdTc(:,:)*tmask(:,:,1)
349            q_s(:,:) = rdct_qsat_salt*q_sat(MAX(T_s(:,:), 200._wp), slp(:,:))
350            !LOLO:
351            !IF ( j_itt == nb_itt) THEN
352            !   WRITE(cf_tmp,'("Qnt_ac_k",i5.5,"_p",i4.4,".nc")') kt, narea
353            !   CALL DUMP_FIELD(REAL( Qnt_ac*tmask(:,:,1) , 4), TRIM(cf_tmp), 'Qnt_ac')
354            !   WRITE(cf_tmp,  '("pdTw_k",i5.5,"_p",i4.4,".nc")') kt, narea
355            !   CALL DUMP_FIELD(REAL( pdTw*tmask(:,:,1) , 4), TRIM(cf_tmp), 'pdTw')
356            !END IF
357            !LOLO.
358         END IF
359
360
361         IF( l_use_cs .OR. l_use_wl .OR. (.NOT. l_zt_equal_zu) ) THEN
362            dt_zu = t_zu - T_s ;  dt_zu = SIGN( MAX(ABS(dt_zu),1.E-6_wp), dt_zu )
363            dq_zu = q_zu - q_s ;  dq_zu = SIGN( MAX(ABS(dq_zu),1.E-9_wp), dq_zu )
364         END IF
365
366      END DO !DO j_itt = 1, nb_itt
367
368      ! compute transfer coefficients at zu :
369      ztmp0 = u_star/U_blk
370      Cd   = ztmp0*ztmp0
371      Ch   = ztmp0*t_star/dt_zu
372      Ce   = ztmp0*q_star/dq_zu
373
374      ztmp1 = zu + z0
375      Cdn = vkarmn*vkarmn / (log(ztmp1/z0 )*log(ztmp1/z0 ))
376      Chn = vkarmn*vkarmn / (log(ztmp1/z0t)*log(ztmp1/z0t))
377      Cen = Chn
378
379      IF( .NOT. l_zt_equal_zu ) DEALLOCATE( zeta_t )
380
381      IF ( l_use_cs .AND. PRESENT(pdT_cs) ) pdT_cs = pdTc*tmask(:,:,1)
382      IF ( l_use_wl .AND. PRESENT(pdT_wl) ) pdT_wl = pdTw*tmask(:,:,1)
383
384      IF ( l_use_cs .OR. l_use_wl ) DEALLOCATE ( zsst )
385      IF (          l_use_cs      ) DEALLOCATE ( pdTc )
386      IF (          l_use_wl      ) THEN
387         DEALLOCATE ( pdTw )
388         IF (PRESENT(Hwl)) DEALLOCATE ( zHwl )
389      END IF
390
391   END SUBROUTINE turb_coare3p0
392
393
394   FUNCTION alfa_charn_3p0( pwnd )
395      !!-------------------------------------------------------------------
396      !! Compute the Charnock parameter as a function of the wind speed
397      !!
398      !! (Fairall et al., 2003 p.577-578)
399      !!
400      !! Wind below 10 m/s :  alfa = 0.011
401      !! Wind between 10 and 18 m/s : linear increase from 0.011 to 0.018
402      !! Wind greater than 18 m/s :  alfa = 0.018
403      !!
404      !! Author: L. Brodeau, June 2016 / AeroBulk  (https://github.com/brodeau/aerobulk/)
405      !!-------------------------------------------------------------------
406      REAL(wp), DIMENSION(jpi,jpj) :: alfa_charn_3p0
407      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pwnd   ! wind speed
408      !
409      INTEGER  ::   ji, jj         ! dummy loop indices
410      REAL(wp) :: zw, zgt10, zgt18
411      !!-------------------------------------------------------------------
412      !
413      DO jj = 1, jpj
414         DO ji = 1, jpi
415            !
416            zw = pwnd(ji,jj)   ! wind speed
417            !
418            ! Charnock's constant, increases with the wind :
419            zgt10 = 0.5 + SIGN(0.5_wp,(zw - 10))  ! If zw<10. --> 0, else --> 1
420            zgt18 = 0.5 + SIGN(0.5_wp,(zw - 18.)) ! If zw<18. --> 0, else --> 1
421            !
422            alfa_charn_3p0(ji,jj) =  (1. - zgt10)*0.011    &    ! wind is lower than 10 m/s
423               &     + zgt10*((1. - zgt18)*(0.011 + (0.018 - 0.011) &
424               &      *(zw - 10.)/(18. - 10.)) + zgt18*( 0.018 ) )    ! Hare et al. (1999)
425            !
426         END DO
427      END DO
428      !
429   END FUNCTION alfa_charn_3p0
430
431   FUNCTION psi_m_coare( pzeta )
432      !!----------------------------------------------------------------------------------
433      !! ** Purpose: compute the universal profile stability function for momentum
434      !!             COARE 3.0, Fairall et al. 2003
435      !!             pzeta : stability paramenter, z/L where z is altitude
436      !!                     measurement and L is M-O length
437      !!       Stability function for wind speed and scalars matching Kansas and free
438      !!       convection forms with weighting f convective form, follows Fairall et
439      !!       al (1996) with profile constants from Grachev et al (2000) BLM stable
440      !!       form from Beljaars and Holtslag (1991)
441      !!
442      !! ** Author: L. Brodeau, June 2016 / AeroBulk (https://github.com/brodeau/aerobulk/)
443      !!----------------------------------------------------------------------------------
444      REAL(wp), DIMENSION(jpi,jpj) :: psi_m_coare
445      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pzeta
446      !
447      INTEGER  ::   ji, jj    ! dummy loop indices
448      REAL(wp) :: zta, zphi_m, zphi_c, zpsi_k, zpsi_c, zf, zc, zstab
449      !!----------------------------------------------------------------------------------
450      !
451      DO jj = 1, jpj
452         DO ji = 1, jpi
453            !
454            zta = pzeta(ji,jj)
455            !
456            zphi_m = ABS(1. - 15.*zta)**.25    !!Kansas unstable
457            !
458            zpsi_k = 2.*LOG((1. + zphi_m)/2.) + LOG((1. + zphi_m*zphi_m)/2.)   &
459               & - 2.*ATAN(zphi_m) + 0.5*rpi
460            !
461            zphi_c = ABS(1. - 10.15*zta)**.3333                   !!Convective
462            !
463            zpsi_c = 1.5*LOG((1. + zphi_c + zphi_c*zphi_c)/3.) &
464               &     - 1.7320508*ATAN((1. + 2.*zphi_c)/1.7320508) + 1.813799447
465            !
466            zf = zta*zta
467            zf = zf/(1. + zf)
468            zc = MIN(50._wp, 0.35_wp*zta)
469            zstab = 0.5 + SIGN(0.5_wp, zta)
470            !
471            psi_m_coare(ji,jj) = (1. - zstab) * ( (1. - zf)*zpsi_k + zf*zpsi_c ) & ! (zta < 0)
472               &                -   zstab     * ( 1. + 1.*zta     &                ! (zta > 0)
473               &                         + 0.6667*(zta - 14.28)/EXP(zc) + 8.525 )   !     "
474            !
475         END DO
476      END DO
477      !
478   END FUNCTION psi_m_coare
479
480
481   FUNCTION psi_h_coare( pzeta )
482      !!---------------------------------------------------------------------
483      !! Universal profile stability function for temperature and humidity
484      !! COARE 3.0, Fairall et al. 2003
485      !!
486      !! pzeta : stability paramenter, z/L where z is altitude measurement
487      !!         and L is M-O length
488      !!
489      !! Stability function for wind speed and scalars matching Kansas and free
490      !! convection forms with weighting f convective form, follows Fairall et
491      !! al (1996) with profile constants from Grachev et al (2000) BLM stable
492      !! form from Beljaars and Holtslag (1991)
493      !!
494      !! Author: L. Brodeau, June 2016 / AeroBulk
495      !!         (https://github.com/brodeau/aerobulk/)
496      !!----------------------------------------------------------------
497      !!
498      REAL(wp), DIMENSION(jpi,jpj) :: psi_h_coare
499      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pzeta
500      !
501      INTEGER  ::   ji, jj     ! dummy loop indices
502      REAL(wp) :: zta, zphi_h, zphi_c, zpsi_k, zpsi_c, zf, zc, zstab
503      !
504      DO jj = 1, jpj
505         DO ji = 1, jpi
506            !
507            zta = pzeta(ji,jj)
508            !
509            zphi_h = (ABS(1. - 15.*zta))**.5  !! Kansas unstable   (zphi_h = zphi_m**2 when unstable, zphi_m when stable)
510            !
511            zpsi_k = 2.*LOG((1. + zphi_h)/2.)
512            !
513            zphi_c = (ABS(1. - 34.15*zta))**.3333   !! Convective
514            !
515            zpsi_c = 1.5*LOG((1. + zphi_c + zphi_c*zphi_c)/3.) &
516               &    -1.7320508*ATAN((1. + 2.*zphi_c)/1.7320508) + 1.813799447
517            !
518            zf = zta*zta
519            zf = zf/(1. + zf)
520            zc = MIN(50._wp,0.35_wp*zta)
521            zstab = 0.5 + SIGN(0.5_wp, zta)
522            !
523            psi_h_coare(ji,jj) = (1. - zstab) * ( (1. - zf)*zpsi_k + zf*zpsi_c ) &
524               &                -   zstab     * ( (ABS(1. + 2.*zta/3.))**1.5     &
525               &                           + .6667*(zta - 14.28)/EXP(zc) + 8.525 )
526            !
527         END DO
528      END DO
529      !
530   END FUNCTION psi_h_coare
531
532   !!======================================================================
533END MODULE sbcblk_algo_coare3p0
Note: See TracBrowser for help on using the repository browser.