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_mfs.F90 in branches/UKMO/r5936_CO6_CO5_shelfdiagnostic/NEMOGCM/NEMO/OPA_SRC/SBC – NEMO

source: branches/UKMO/r5936_CO6_CO5_shelfdiagnostic/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk_mfs.F90 @ 7113

Last change on this file since 7113 was 7113, checked in by jcastill, 7 years ago

Remove again the svn keywords, as it did not work before

File size: 29.9 KB
Line 
1MODULE sbcblk_mfs
2   !!======================================================================
3   !!                       ***  MODULE  sbcblk_mfs  ***
4   !! Ocean forcing:  momentum, heat and freshwater flux formulation
5   !!=====================================================================
6   !! History :  3.3  !   2010-05 (P. Oddo) Original Code
7   !!----------------------------------------------------------------------
8
9   !!----------------------------------------------------------------------
10   !!   sbc_blk_mfs  : bulk formulation as ocean surface boundary condition
11   !!                   (forced mode, mfs bulk formulae)
12   !!   blk_oce_mfs  : ocean: computes momentum, heat and freshwater fluxes
13   !!----------------------------------------------------------------------
14   USE oce             ! ocean dynamics and tracers
15   USE dom_oce         ! ocean space and time domain
16   USE phycst          ! physical constants
17   USE fldread         ! read input fields
18   USE sbc_oce         ! Surface boundary condition: ocean fields
19   USE iom             ! I/O manager library
20   USE in_out_manager  ! I/O manager
21   USE lib_mpp         ! distribued memory computing library
22   USE wrk_nemo        ! work arrays
23   USE timing          ! Timing
24   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
25   USE prtctl          ! Print control
26   USE sbcwave,ONLY : cdn_wave !wave module
27
28   IMPLICIT NONE
29   PRIVATE
30
31   PUBLIC   sbc_blk_mfs       ! routine called in sbcmod module
32     
33   INTEGER , PARAMETER ::   jpfld   = 7         ! maximum number of files to read
34   INTEGER , PARAMETER ::   jp_wndi = 1         ! index of 10m wind velocity (i-component) (m/s) at T-point
35   INTEGER , PARAMETER ::   jp_wndj = 2         ! index of 10m wind velocity (j-component) (m/s) at T-point
36   INTEGER , PARAMETER ::   jp_clc  = 3         ! index of total cloud cover               ( % )
37   INTEGER , PARAMETER ::   jp_msl  = 4         ! index of mean sea level pressure         (Pa)
38   INTEGER , PARAMETER ::   jp_tair = 5         ! index of 10m air temperature             (Kelvin)
39   INTEGER , PARAMETER ::   jp_rhm  = 6         ! index of dew point temperature           (Kelvin)
40   INTEGER , PARAMETER ::   jp_prec = 7         ! index of total precipitation (rain+snow) (Kg/m2/s)
41   TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   sf ! structure of input fields (file informations, fields read)
42         
43   !! * Substitutions
44#  include "domzgr_substitute.h90"
45#  include "vectopt_loop_substitute.h90"
46   !!----------------------------------------------------------------------
47   !! NEMO/OPA 3.2 , LOCEAN-IPSL (2009)
48   !! $Id$
49   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)
50   !!----------------------------------------------------------------------
51
52CONTAINS
53
54
55   SUBROUTINE sbc_blk_mfs( kt )
56      !!---------------------------------------------------------------------
57      !!                    ***  ROUTINE sbc_blk_mfs  ***
58      !!                   
59      !! ** Purpose :   provide at each time step the surface ocean fluxes
60      !!      (momentum, heat, freshwater, runoff is added later in the code)
61      !!
62      !! ** Method  : (1) READ Atmospheric data from NetCDF files:
63      !!      the 10m wind velocity (i-component) (m/s) at T-point
64      !!      the 10m wind velocity (j-component) (m/s) at T-point
65      !!      the 2m Dew point Temperature        (k)
66      !!      the Cloud COver                     (%)
67      !!      the 2m air temperature              (Kelvin)
68      !!      the Mean Sea Level Preesure         (hPa)
69      !!      the Climatological Precipitation    (kg/m2/s)
70      !!              (2) CALL blk_oce_mfs
71      !!
72      !!      Computes:
73      !!      Solar Radiation using Reed formula (1975, 1977)
74      !!      Net Long wave radiation using Bignami et al. (1995)
75      !!      Latent and Sensible heat using Kondo (1975)
76      !!      Drag coeff using Hllerman and Rosenstein (1983)
77      !!      C A U T I O N : never mask the surface stress fields
78      !!                      the stress is assumed to be in the mesh referential
79      !!                      i.e. the (i,j) referential
80      !!
81      !! ** Action  :   defined at each time-step at the air-sea interface
82      !!              - utau, vtau  i- and j-component of the wind stress
83      !!              - taum        wind stress module at T-point
84      !!              - wndm        10m wind module at T-point over free ocean or leads in presence of sea-ice
85      !!              - qns, qsr    non-slor and solar heat flux
86      !!              - emp         evaporation minus precipitation
87      !!----------------------------------------------------------------------
88      REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  sh_now   ! specific humidity at T-point
89      REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  catm     ! Cover
90      REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  alonl    ! Lon
91      REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  alatl    ! Lat
92      REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  gsst     ! SST
93      !!---------------------------------------------------------------------
94      !! Local fluxes variables
95      !!---------------------------------------------------------------------
96      REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  qbw     ! Net Long wave
97      REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  ha      ! Sesnible
98      REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  elat    ! Latent
99      REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  evap    ! evaporation rate
100
101      INTEGER, INTENT( in  ) ::   kt   ! ocean time step
102      !!
103      INTEGER  :: ierror                          ! return error code
104      INTEGER  :: ifpr     ! dummy loop indice
105      INTEGER  :: jj,ji    ! dummy loop arguments
106      INTEGER  ::   ios    ! Local integer output status for namelist read
107      REAL(wp) :: act_hour
108      !!--------------------------------------------------------------------
109      !! Variables for specific humidity computation
110      !!--------------------------------------------------------------------
111      REAL(wp) :: onsea,par1,par2
112      DATA onsea,par1,par2 / 0.98, 640380., -5107.4 /
113      !!                      par1 [Kg/m3], par2 [K]
114
115      CHARACTER(len=100) ::  cn_dir                           ! Root directory for location of Atmospheric forcing files
116      TYPE(FLD_N), DIMENSION(jpfld) ::   slf_i                ! array of namelist informations on the fields to read
117      TYPE(FLD_N) ::   sn_wndi, sn_wndj, sn_clc, sn_msl       ! informations about the fields to be read
118      TYPE(FLD_N) ::   sn_tair , sn_rhm, sn_prec              !   "                                 "
119      !!---------------------------------------------------------------------
120      NAMELIST/namsbc_mfs/ cn_dir ,                                          &
121         &                  sn_wndi , sn_wndj, sn_clc   , sn_msl ,           &
122         &                  sn_tair , sn_rhm , sn_prec 
123      !!---------------------------------------------------------------------
124      !
125      IF( nn_timing == 1 )  CALL timing_start('sbc_blk_mfs')
126      !
127      !                                         ! ====================== !
128      IF( kt == nit000 ) THEN                   !  First call kt=nit000  !
129         !                                      ! ====================== !
130         ALLOCATE( sh_now(jpi,jpj), catm(jpi,jpj), alonl(jpi,jpj), alatl(jpi,jpj),     &
131         &        gsst(jpi,jpj),  qbw(jpi,jpj),    ha(jpi,jpj),  elat(jpi,jpj),     &
132         &        evap(jpi,jpj), STAT=ierror )
133
134         IF( ierror /= 0 )   CALL ctl_warn('sbc_blk_mfs: failed to allocate arrays')
135
136         REWIND( numnam_ref )              ! Namelist namsbc_msf in reference namelist : MFS files
137         READ  ( numnam_ref, namsbc_mfs, IOSTAT = ios, ERR = 901)
138901      IF( ios /= 0 ) CALL ctl_nam ( ios , 'namsbc_mfs in reference namelist', lwp )
139
140         REWIND( numnam_cfg )              ! Namelist namsbc_msf in configuration namelist : MFS files
141         READ  ( numnam_cfg, namsbc_mfs, IOSTAT = ios, ERR = 902 )
142902      IF( ios /= 0 ) CALL ctl_nam ( ios , 'namsbc_mfs in configuration namelist', lwp )
143         IF(lwm) WRITE ( numond, namsbc_mfs )
144         !
145         ! store namelist information in an array
146         slf_i(jp_wndi) = sn_wndi   ;   slf_i(jp_wndj) = sn_wndj
147         slf_i(jp_clc ) = sn_clc    ;   slf_i(jp_msl ) = sn_msl
148         slf_i(jp_tair) = sn_tair   ;   slf_i(jp_rhm)  = sn_rhm
149         slf_i(jp_prec) = sn_prec   ; 
150         !
151         ALLOCATE( sf(jpfld), STAT=ierror )         ! set sf structure
152         IF( ierror > 0 ) THEN
153            CALL ctl_stop( 'sbc_blk_mfs: unable to allocate sf structure' )   ;   RETURN
154         ENDIF
155         DO ifpr= 1, jpfld
156            ALLOCATE( sf(ifpr)%fnow(jpi,jpj,1) )
157            IF( slf_i(ifpr)%ln_tint ) ALLOCATE( sf(ifpr)%fdta(jpi,jpj,1,2) )
158         END DO
159         ! fill sf with slf_i and control print
160         CALL fld_fill( sf, slf_i, cn_dir,'sbc_blk_mfs','bulk formulation for ocean SBC', 'namsbc_mfs' )
161            !
162      ENDIF
163
164         CALL fld_read( kt, nn_fsbc, sf )                   ! input fields provided at the current time-step
165
166         catm(:,:)   = 0.0    ! initializze cloud cover variable
167         sh_now(:,:) = 0.0    ! initializze specifif humidity variable
168
169         DO jj = 2, jpjm1
170            DO ji = fs_2, fs_jpim1   ! vector opt.
171
172         ! Calculate Specific Humidity
173         !-------------------------------------------------
174            sh_now(ji,jj) = (1/1.22) * onsea * par1 * EXP(par2/sf(jp_rhm)%fnow(ji,jj,1))
175
176         ! Normalize Clouds
177         !-------------------------------------------------
178            catm(ji,jj)   = max(0.0,min(1.0,sf(jp_clc)%fnow(ji,jj,1)*0.01))
179
180            END DO
181         END DO
182
183         ! wind module at 10m
184         !--------------------------------------------------
185         wndm(:,:) = SQRT(  sf(jp_wndi)%fnow(:,:,1) * sf(jp_wndi)%fnow(:,:,1)   &
186              &             + sf(jp_wndj)%fnow(:,:,1) * sf(jp_wndj)%fnow(:,:,1)  )
187
188         ! Some conv for fluxes computation
189         !-------------------------------------------------
190         alonl(:,:) = glamt(:,:) * rad
191         alatl(:,:) = gphit(:,:) * rad
192         gsst(:,:)  = tsn(:,:,1,jp_tem)  * tmask(:,:,1)
193
194         IF( MOD( kt - 1, nn_fsbc ) == 0 ) THEN
195
196         ! Force to zero the output of fluxes
197         !-------------------------------------------------
198          qsr(:,:)  = 0.0 ; qbw(:,:)  = 0.0 ; 
199          ha(:,:)   = 0.0 ; elat(:,:) = 0.0 ; 
200          evap(:,:) = 0.0 ; utau(:,:) = 0.0 ; 
201          vtau(:,:) = 0.0
202
203          CALL lbc_lnk( sf(jp_wndi)%fnow(:,:,1), 'T', -1. )
204          CALL lbc_lnk( sf(jp_wndj)%fnow(:,:,1), 'T', -1. )
205
206          act_hour = (( nsec_year / rday ) - INT (nsec_year / rday)) * rjjhh
207
208          CALL fluxes_mfs(alatl,alonl,act_hour,                                &     ! input static
209                            gsst(:,:),sf(jp_tair)%fnow(:,:,1),sh_now(:,:),     &     ! input dynamic
210                            sf(jp_wndi)%fnow(:,:,1), sf(jp_wndj)%fnow(:,:,1),  &     ! input dynamic
211                            sf(jp_msl)%fnow(:,:,1) , catm(:,:) ,               &     ! input dynamic
212                            qsr,qbw,ha,elat,evap,utau,vtau)                          ! output
213
214         ! Shortwave radiation
215         !--------------------------------------------------
216          qsr(:,:) = qsr(:,:) * tmask(:,:,1)
217
218         ! total non solar heat flux over water
219         !--------------------------------------------------
220          qns(:,:) = -1. * ( qbw(:,:) + ha(:,:) + elat(:,:) )
221          qns(:,:) = qns(:,:)*tmask(:,:,1)
222
223         ! mask the wind module at 10m
224         !--------------------------------------------------
225          wndm(:,:) = wndm(:,:) * tmask(:,:,1)
226
227         !   wind stress module (taum) into T-grid
228         !--------------------------------------------------
229          taum(:,:) = SQRT( utau(:,:) * utau(:,:) + vtau(:,:) * vtau(:,:) ) * tmask(:,:,1)
230
231          CALL lbc_lnk( taum, 'T', 1. )
232
233         ! Interpolate utau, vtau into the grid_V and grid_V
234         !-------------------------------------------------
235      !     Note the use of 0.5*(2-umask) in order to unmask the stress along coastlines
236      !     Note the use of MAX(tmask(i,j),tmask(i+1,j) is to mask tau over ice shelves
237         DO jj = 1, jpjm1
238            DO ji = 1, fs_jpim1
239               utau(ji,jj) = 0.5 * ( 2. - umask(ji,jj,1) ) * ( utau(ji,jj) * tmask(ji,jj,1) &
240               &                                + utau(ji+1,jj) * tmask(ji+1,jj,1) )        &
241               &                 * MAX(tmask(ji,jj,1),tmask(ji+1,jj  ,1))
242               vtau(ji,jj) = 0.5 * ( 2. - vmask(ji,jj,1) ) * ( vtau(ji,jj) * tmask(ji,jj,1) &
243               &                                + vtau(ji,jj+1) * tmask(ji,jj+1,1) )        &
244               &                 * MAX(tmask(ji,jj,1),tmask(ji  ,jj+1,1))
245            END DO
246         END DO
247
248         CALL lbc_lnk( utau(:,:), 'U', -1. )
249         CALL lbc_lnk( vtau(:,:), 'V', -1. )
250
251         ! for basin budget and cooerence
252         !--------------------------------------------------
253         emp(:,:) = evap(:,:) - sf(jp_prec)%fnow(:,:,1) * tmask(:,:,1)
254
255         CALL iom_put( "qlw_oce",   qbw  )                 ! output downward longwave heat over the ocean
256         CALL iom_put( "qsb_oce", - ha   )                 ! output downward sensible heat over the ocean
257         CALL iom_put( "qla_oce", - elat )                 ! output downward latent   heat over the ocean
258         CALL iom_put( "qns_oce",   qns  )                 ! output downward non solar heat over the ocean
259
260      ENDIF
261      !
262      IF( nn_timing == 1 )  CALL timing_stop('sbc_blk_mfs')
263      !
264   END SUBROUTINE sbc_blk_mfs
265 
266 
267   SUBROUTINE fluxes_mfs(alat,alon,hour,                               &
268        sst,tnow,shnow,unow,vnow,mslnow,cldnow,qsw,qbw,ha,elat,        &
269        evap,taux,tauy)
270      !!----------------------------------------------------------------------
271      !!                    ***  ROUTINE fluxes_mfs  ***
272      !!
273      !! --- it provides SURFACE HEAT and MOMENTUM FLUXES in MKS :
274      !!
275      !!  1)   Water flux (WFLUX)                 [ watt/m*m ]
276      !!  2)   Short wave flux (QSW)              [ watt/m*m ] Reed 1977
277      !!  3)   Long wave flux backward (QBW)      [ watt/m*m ]
278      !!  4)   Latent heat of evaporation (ELAT)  [ watt/m*m ]
279      !!  5)   Sensible heat flux   (HA)          [ watt/m*m ]
280      !!  6)   Wind stress x-component   (TAUX)   [ newton/m*m ]
281      !!  7)   Wind stress y-component   (TAUY)   [ newton/m*m ]
282      !!
283      !!----------------------------------------------------------------------
284      USE sbcblk_core, ONLY: turb_core_2z ! For wave coupling and Tair/rh from 2 to 10m
285
286      REAL(wp), INTENT(in   ) :: hour
287      REAL(wp), INTENT(in   ), DIMENSION (:,:) :: sst, unow, alat , alon
288      REAL(wp), INTENT(in   ), DIMENSION (:,:) :: vnow, cldnow, mslnow
289      REAL(wp), INTENT(out  ), DIMENSION (:,:) :: qsw, qbw, ha, elat
290      REAL(wp), INTENT(out  ), DIMENSION (:,:) :: evap,taux,tauy
291      REAL(wp), INTENT(inout), DIMENSION (:,:) :: tnow , shnow
292
293      INTEGER :: ji,jj 
294      REAL(wp)  :: wair, vtnow, ea, deltemp, s, stp , fh , fe
295      REAL(wp)  :: esre, cseep
296
297      REAL(wp), DIMENSION (:,:), POINTER ::   rspeed, sh10now, t10now, cdx, ce, shms
298      REAL(wp), DIMENSION (:,:), POINTER ::   rhom, sstk, ch, rel_windu, rel_windv
299      !!----------------------------------------------------------------------
300      !!     coefficients ( in MKS )  :
301      !!----------------------------------------------------------------------
302
303      REAL(wp), PARAMETER ::  ps = 1013.    ! --- surface air pressure
304      REAL(wp), PARAMETER ::  expsi=0.622   ! --- expsi
305      REAL(wp), PARAMETER ::  rd=287.       ! --- dry air gas constant
306      REAL(wp), PARAMETER ::  cp=1005.      ! --- specific heat capacity
307      REAL(wp), PARAMETER ::  onsea=0.98    ! --- specific humidity factors
308      REAL(wp), PARAMETER ::  par1=640380.  ! [Kg/m3]
309      REAL(wp), PARAMETER ::  par2=-5107.4  ! [K]
310
311      !---------------------------------------------------------------------
312      !--- define Kondo parameters
313      !---------------------------------------------------------------------
314
315      REAL(wp), DIMENSION(5) :: a_h = (/0.0,0.927,1.15,1.17,1.652/)
316      REAL(wp), DIMENSION(5) :: a_e = (/0.0,0.969,1.18,1.196,1.68/)
317      REAL(wp), DIMENSION(5) :: b_h = (/1.185,0.0546,0.01,0.0075,-0.017/)
318      REAL(wp), DIMENSION(5) :: b_e = (/1.23,0.0521,0.01,0.008,-0.016/)
319      REAL(wp), DIMENSION(5) :: c_h = (/0.0,0.0,0.0,-0.00045,0.0/)
320      REAL(wp), DIMENSION(5) :: c_e = (/0.0,0.0,0.0,-0.0004,0.0/)
321      REAL(wp), DIMENSION(5) :: p_h = (/-0.157,1.0,1.0,1.0,1.0/)
322      REAL(wp), DIMENSION(5) :: p_e = (/-0.16,1.0,1.0,1.0,1.0/)
323      INTEGER :: kku                        !index varing with wind speed
324      !
325      IF( nn_timing == 1 )  CALL timing_start('fluxes_mfs')
326      !
327      CALL wrk_alloc( jpi,jpj, rspeed, sh10now, t10now, cdx, ce, shms )
328      CALL wrk_alloc( jpi,jpj, rhom, sstk, ch, rel_windu, rel_windv )
329
330      !!----------------------------------------------------------------------
331      !! ------------------ (i)      short wave
332      !!----------------------------------------------------------------------
333
334       CALL qshort(hour,alat,alon,cldnow,qsw)
335
336          rel_windu(:,:) = 0.0_wp
337          rel_windv(:,:) = 0.0_wp
338
339       DO jj = 2, jpj
340          DO ji = fs_2, jpi
341           rel_windu(ji,jj) = unow(ji,jj) - 0.5_wp * ( ssu_m(ji-1,jj) + ssu_m(ji,jj) )
342           rel_windv(ji,jj) = vnow(ji,jj) - 0.5_wp * ( ssv_m(ji,jj-1) + ssv_m(ji,jj) )
343          END DO
344       END DO
345
346       rspeed(:,:)= SQRT(rel_windu(:,:)*rel_windu(:,:)   &
347         &                   + rel_windv(:,:)*rel_windv(:,:)) 
348
349       sstk(:,:) = sst(:,:) + rtt                          !- SST data in Kelvin degrees
350       shms(:,:) = (1/1.22)*onsea*par1*EXP(par2/sstk(:,:)) !- Saturation Specific Humidity
351
352      ! --- Transport temperature and humidity from 2m to 10m
353      !----------------------------------------------------------------------
354
355      t10now(:,:) = 0.0           ;   sh10now(:,:)= 0.0
356      ! Note that air temp is converted in potential temp
357      CALL turb_core_2z(2.,10.,sstk,tnow+2*0.0098,shms,shnow,rspeed,        &
358         &              Cdx,Ch,Ce,t10now,sh10now )
359      tnow(:,:)  = t10now(:,:)    ;    shnow(:,:) = sh10now(:,:)
360
361      !!----------------------------------------------------------------------
362      !! ------------------ (ii)    net long wave
363      !!----------------------------------------------------------------------
364
365      DO jj = 1, jpj
366         DO ji = 1, jpi
367            wair = shnow(ji,jj) / (1 - shnow(ji,jj))    ! mixing ratio of the air (Wallace and Hobbs)
368            vtnow = (tnow(ji,jj)*(expsi+wair))/(expsi*(1.+wair))   ! virtual temperature of air
369            rhom(ji,jj) = 100.*(ps/rd)/vtnow                       ! density of the moist air
370            ea   = (wair  / (wair  + 0.622 )) * mslnow(ji,jj)
371
372            qbw(ji,jj) = emic*stefan*( sstk(ji,jj)**4. )                    &
373                 - ( stefan*( tnow(ji,jj)**4. ) * ( 0.653 + 0.00535*ea ) )  &
374                   * ( 1. + 0.1762*( cldnow(ji,jj)**2. ) )
375
376         END DO
377      END DO
378
379      DO jj = 1, jpj
380         DO ji = 1, jpi
381      !!----------------------------------------------------------------------
382      !! ------------------ (iii)   sensible heat
383      !!----------------------------------------------------------------------
384
385      !! --- calculates the term :      ( Ts - Ta )
386      !!----------------------------------------------------------------------
387            deltemp = sstk(ji,jj) - tnow (ji,jj)
388
389      !!----------------------------------------------------------------------
390      !! --- variable turbulent exchange coefficients ( from Kondo 1975 )
391      !! --- calculate the Neutral Transfer Coefficent using an empiric formula
392      !! --- by Kondo et al. Then it applies the diabatic approximation.
393      !!----------------------------------------------------------------------
394
395            s = deltemp/(wndm(ji,jj)**2.)   !! --- calculate S
396            stp = s*abs(s)/(abs(s)+0.01)    !! --- calculate the Stability Parameter
397
398      !!----------------------------------------------------------------------
399      !! --- for stable condition (sst-t_air < 0):
400      !!----------------------------------------------------------------------
401
402            IF (s.lt.0. .and. ((stp.gt.-3.3).and.(stp.lt.0.))) THEN
403                fh = 0.1_wp+0.03_wp*stp+0.9_wp*exp(4.8_wp*stp)
404                fe = fh
405            ELSE IF (s.lt.0. .and. stp.le.-3.3) THEN
406                fh = 0._wp
407                fe = fh
408            ELSE                                       ! --- for unstable condition
409                fh = 1.0_wp+0.63_wp*sqrt(stp)
410                fe = fh
411            ENDIF
412
413      !!----------------------------------------------------------------------
414      !! --- calculate the coefficient CH,CE,CD
415      !!----------------------------------------------------------------------
416
417            IF (wndm(ji,jj) >= 0. .AND. wndm(ji,jj) <= 2.2)       THEN
418                kku=1
419            ELSE IF (wndm(ji,jj) > 2.2 .AND. wndm(ji,jj) <= 5.0)  THEN
420                kku=2
421            ELSE IF (wndm(ji,jj) > 5.0 .AND. wndm(ji,jj) <= 8.0)  THEN
422                kku=3
423            ELSE IF (wndm(ji,jj) > 8.0 .AND. wndm(ji,jj) <= 25.0) THEN
424                kku=4
425            ELSE IF (wndm(ji,jj) > 25.0 )                         THEN
426                kku=5
427            ENDIF
428
429            ch(ji,jj) = ( a_h(kku) + b_h(kku) * wndm(ji,jj) ** p_h(kku)      &
430                        + c_h(kku) * (wndm(ji,jj)-8 ) **2) * fh
431
432            ce(ji,jj) = ( a_e(kku) + b_e(kku) * wndm(ji,jj) ** p_e(kku)      &
433                        + c_e(kku) * (wndm(ji,jj)-8 ) **2) * fe
434
435            ch(ji,jj) = ch(ji,jj) / 1000.0
436            ce(ji,jj) = ce(ji,jj) / 1000.0
437
438            IF (wndm(ji,jj)<0.3) THEN
439               ch(ji,jj) = 1.3e-03 * fh
440               ce(ji,jj) = 1.5e-03 * fe
441            ELSE IF(wndm(ji,jj)>50.0) THEN
442               ch(ji,jj) = 1.25e-03 * fh
443               ce(ji,jj) = 1.30e-03 * fe
444            ENDIF
445
446      !!----------------------------------------------------------------------
447      !! --- calculates the SENSIBLE HEAT FLUX in MKS ( watt/m*m )
448      !!----------------------------------------------------------------------
449
450            HA(ji,jj) = rhom(ji,jj)*cp*ch(ji,jj)*wndm(ji,jj)*deltemp
451
452      !!----------------------------------------------------------------------
453      !! ------------------ (iv)  latent heat
454      !! --- calculates the LATENT HEAT FLUX  ( watt/m*m )
455      !! --- ELAT = L*rho*Ce*|V|*[qs(Ts)-qa(t2d)]
456      !!----------------------------------------------------------------------
457
458            esre  = shms(ji,jj) - shnow(ji,jj)   ! --- calculates the term : qs(Ta)-qa(t2d)
459
460            cseep = ce(ji,jj) * wndm(ji,jj) * esre     ! --- calculates the term : Ce*|V|*[qs(Ts)-qa(t2d)]
461
462            evap(ji,jj) = (cseep * rhom(ji,jj))  ! in [kg/m2/sec] !! --- calculates the EVAPORATION RATE [m/yr]
463
464            elat(ji,jj) = rhom(ji,jj) * cseep * heatlat(sst(ji,jj))
465
466      !!----------------------------------------------------------------------
467      !! --- calculates the Drag Coefficient
468      !!----------------------------------------------------------------------
469
470      !!----------------------------------------------------------------------
471      !! --- deltemp should be (Ts - Ta) in the formula estimating
472      !! --- drag coefficient
473      !!----------------------------------------------------------------------
474
475              IF( .NOT. ln_cdgw ) THEN
476                 cdx(ji,jj) = cd_HR(wndm(ji,jj),deltemp)
477              ENDIF
478
479          END DO
480      END DO
481
482      !!----------------------------------------------------------------------
483      !! --- calculates the wind stresses in MKS ( newton/m*m )
484      !! ---            taux= rho*Cd*|V|u      tauy= rho*Cd*|V|v
485      !!----------------------------------------------------------------------
486
487       taux(:,:)= rhom(:,:) * cdx(:,:) * rspeed(:,:) * rel_windu(:,:)
488       tauy(:,:)= rhom(:,:) * cdx(:,:) * rspeed(:,:) * rel_windv(:,:)
489
490      CALL wrk_dealloc( jpi,jpj, rspeed, sh10now, t10now, cdx, ce, shms )
491      CALL wrk_dealloc( jpi,jpj, rhom, sstk, ch, rel_windu, rel_windv )
492      !
493      IF( nn_timing == 1 )  CALL timing_stop('fluxes_mfs')
494      !
495   END SUBROUTINE fluxes_mfs
496
497
498      REAL(wp) FUNCTION cd_HR(speed,delt)
499      !!----------------------------------------------------------------------
500      !! --- calculates the Drag Coefficient as a function of the abs. value
501      !! --- of the wind velocity ( Hellermann and Rosenstein )
502      !!----------------------------------------------------------------------
503
504       REAL(wp), INTENT(in) :: speed,delt
505       REAL(wp), PARAMETER  :: a1=0.934e-3 , a2=0.788e-4, a3=0.868e-4     
506       REAL(wp), PARAMETER  :: a4=-0.616e-6, a5=-.120e-5, a6=-.214e-5
507
508        cd_HR = a1 + a2*speed + a3*delt + a4*speed*speed        &
509           + a5*delt*delt  + a6*speed*delt
510
511      END FUNCTION cd_HR
512
513      REAL(wp) function HEATLAT(t)
514      !!----------------------------------------------------------------------
515      !! --- calculates the Latent Heat of Vaporization ( J/kg ) as function of
516      !! --- the temperature ( Celsius degrees )
517      !! --- ( from A. Gill  pag. 607 )
518      !!
519      !! --- Constant Latent Heat of Vaporization ( Rosati,Miyakoda 1988 )
520      !!     L = 2.501e+6  (MKS)
521      !!----------------------------------------------------------------------
522
523      REAL(wp) , intent(in) :: t
524
525      heatlat = 2.5008e+6 -2.3e+3*t
526
527      END FUNCTION HEATLAT
528
529
530   SUBROUTINE qshort(hour,alat,alon,cldnow,qsw)
531      !!----------------------------------------------------------------------
532      !!                    ***  ROUTINE qshort  ***
533      !!
534      !! ** Purpose :   Compute Solar Radiation
535      !!
536      !! ** Method  :   Compute Solar Radiation according Astronomical
537      !!                formulae
538      !!
539      !! References :   Reed RK (1975) and Reed RK (1977)
540      !!
541      !! Note: alat,alon - (lat, lon)  in radians
542      !!----------------------------------------------------------------------
543        REAL(wp), INTENT (in) :: hour
544
545        REAL(wp), INTENT(in ), DIMENSION(:,:) :: alat,alon
546        REAL(wp), INTENT(in ), DIMENSION(:,:) :: cldnow
547        REAL(wp), INTENT(out), DIMENSION(:,:) :: qsw
548        REAL(wp), DIMENSION(12) :: alpham
549
550        REAL(wp), PARAMETER ::   eclips=23.439* (3.141592653589793_wp / 180._wp)
551        REAL(wp), PARAMETER ::   solar = 1350.
552        REAL(wp), PARAMETER ::   tau = 0.7
553        REAL(wp), PARAMETER ::   aozone = 0.09
554        REAL(wp), PARAMETER ::   yrdays = 360.
555        REAL(wp) :: days, th0,th02,th03, sundec, thsun, coszen, qatten
556        REAL(wp) :: qzer, qdir,qdiff,qtot,tjul,sunbet
557        REAL(wp) :: albedo
558        INTEGER :: jj, ji
559
560      !!----------------------------------------------------------------------
561      !! --- albedo monthly values from Payne (1972) as means of the values
562      !! --- at 40N and 30N for the Atlantic Ocean ( hence the same latitudinal
563      !! --- band of the Mediterranean Sea ) :
564      !!----------------------------------------------------------------------
565
566        data alpham /0.095,0.08,0.065,0.065,0.06,0.06,0.06,0.06,        &
567                    0.065,0.075,0.09,0.10/
568
569      !!----------------------------------------------------------------------
570      !!   days is the number of days elapsed until the day=nday_year
571      !!----------------------------------------------------------------------
572        days = nday_year -1.
573        th0  = 2.*rpi*days/yrdays
574        th02 = 2.*th0
575        th03 = 3.*th0
576
577      !! --- sun declination :
578      !!----------------------------------------------------------------------
579        sundec = 0.006918 - 0.399912*cos(th0) + 0.070257*sin(th0) -   &
580                          0.006758*cos(th02) + 0.000907*sin(th02) -   &
581                          0.002697*cos(th03) + 0.001480*sin(th03)
582
583      DO jj = 1, jpj
584         DO ji = 1, jpi
585
586      !! --- sun hour angle :
587      !!----------------------------------------------------------------------
588          thsun = (hour -12.)*15.*rad + alon(ji,jj)
589
590      !! --- cosine of the solar zenith angle :
591      !!----------------------------------------------------------------------
592          coszen =sin(alat(ji,jj))*sin(sundec)                 &
593                    +cos(alat(ji,jj))*cos(sundec)*cos(thsun)
594
595          IF(coszen .LE. 5.035D-04) THEN
596            coszen = 0.0
597            qatten = 0.0
598          ELSE
599            qatten = tau**(1./coszen)
600          END IF
601
602          qzer  = coszen * solar *                                 &
603                  (1.0+1.67E-2*cos(rpi*2.*(days-3.0)/365.0))**2
604          qdir  = qzer * qatten
605          qdiff = ((1.-aozone)*qzer - qdir) * 0.5
606          qtot  =  qdir + qdiff
607          tjul = (days -81.)*rad
608
609      !! --- sin of the solar noon altitude in radians :
610      !!----------------------------------------------------------------------
611          sunbet=sin(alat(ji,jj))*sin(eclips*sin(tjul)) +   &
612                 cos(alat(ji,jj))*cos(eclips*sin(tjul))
613
614      !! --- solar noon altitude in degrees :
615      !!----------------------------------------------------------------------
616
617         sunbet = asin(sunbet)/rad
618
619      !!----------------------------------------------------------------------
620      !! --- calculates the albedo according to Payne (1972)
621      !!----------------------------------------------------------------------
622
623         albedo = alpham(nmonth)
624
625      !!----------------------------------------------------------------------
626      !! --- ( radiation as from Reed(1977), Simpson and Paulson(1979) )
627      !! --- calculates SHORT WAVE FLUX ( watt/m*m )
628      !! --- ( Rosati,Miyakoda 1988 ; eq. 3.8 )
629      !!----------------------------------------------------------------------
630
631          IF(cldnow(ji,jj).LT.0.3) THEN
632             qsw(ji,jj) = qtot * (1.-albedo)
633          ELSE
634             qsw(ji,jj) = qtot*(1.-0.62*cldnow(ji,jj)              &
635                                + .0019*sunbet)*(1.-albedo)
636          ENDIF
637
638         END DO
639      END DO
640
641   END SUBROUTINE qshort
642
643
644   !!======================================================================
645
646END MODULE sbcblk_mfs
Note: See TracBrowser for help on using the repository browser.