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/test_moci_test_suite/NEMOGCM/NEMO/OPA_SRC/SBC – NEMO

source: branches/UKMO/test_moci_test_suite/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk_mfs.F90 @ 8243

Last change on this file since 8243 was 8243, checked in by andmirek, 7 years ago

#1914 working XIOS read, XIOS write and single processor read

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