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_clio.F90 in branches/2014/dev_CNRS0_NOC1_LDF/NEMOGCM/NEMO/OPA_SRC/SBC – NEMO

source: branches/2014/dev_CNRS0_NOC1_LDF/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk_clio.F90 @ 4616

Last change on this file since 4616 was 4616, checked in by gm, 10 years ago

#1260 : see the associated wiki page for explanation

  • Property svn:keywords set to Id
File size: 54.0 KB
Line 
1MODULE sbcblk_clio
2   !!======================================================================
3   !!                   ***  MODULE  sbcblk_clio  ***
4   !! Ocean forcing:  bulk thermohaline forcing of the ocean (or ice)
5   !!=====================================================================
6   !! History :  OPA  !  1997-06 (Louvain-La-Neuve)  Original code
7   !!                 !  2001-04 (C. Ethe) add flx_blk_declin
8   !!   NEMO     2.0  !  2002-08 (C. Ethe, G. Madec) F90: Free form and module
9   !!            3.0  !  2008-03 (C. Talandier, G. Madec) surface module + LIM3
10   !!            3.2  !  2009-04 (B. Lemaire) Introduce iom_put
11   !!----------------------------------------------------------------------
12
13   !!----------------------------------------------------------------------
14   !!   sbc_blk_clio     : CLIO bulk formulation: read and update required input fields
15   !!   blk_clio_oce     : ocean CLIO bulk formulea: compute momentum, heat and freswater fluxes for the ocean
16   !!   blk_ice_clio     : ice   CLIO bulk formulea: compute momentum, heat and freswater fluxes for the sea-ice
17   !!   blk_clio_qsr_oce : shortwave radiation for ocean computed from the cloud cover
18   !!   blk_clio_qsr_ice : shortwave radiation for ice   computed from the cloud cover
19   !!   flx_blk_declin   : solar declination
20   !!----------------------------------------------------------------------
21   USE oce            ! ocean dynamics and tracers
22   USE dom_oce        ! ocean space and time domain
23   USE phycst         ! physical constants
24   USE fldread        ! read input fields
25   USE sbc_oce        ! Surface boundary condition: ocean fields
26   USE iom            ! I/O manager library
27   USE in_out_manager ! I/O manager
28   USE lib_mpp        ! distribued memory computing library
29   USE wrk_nemo       ! work arrays
30   USE timing         ! Timing
31   USE lbclnk         ! ocean lateral boundary conditions (or mpp link)
32   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
33
34   USE albedo
35   USE prtctl          ! Print control
36#if defined key_lim3
37   USE ice
38   USE sbc_ice         ! Surface boundary condition: ice fields
39#elif defined key_lim2
40   USE ice_2
41#endif
42
43   IMPLICIT NONE
44   PRIVATE
45
46   PUBLIC sbc_blk_clio        ! routine called by sbcmod.F90
47   PUBLIC blk_ice_clio        ! routine called by sbcice_lim.F90
48
49   INTEGER , PARAMETER ::   jpfld   = 7           ! maximum number of files to read
50   INTEGER , PARAMETER ::   jp_utau = 1           ! index of wind stress (i-component)      (N/m2)    at U-point
51   INTEGER , PARAMETER ::   jp_vtau = 2           ! index of wind stress (j-component)      (N/m2)    at V-point
52   INTEGER , PARAMETER ::   jp_wndm = 3           ! index of 10m wind module                 (m/s)    at T-point
53   INTEGER , PARAMETER ::   jp_humi = 4           ! index of specific humidity               ( % )
54   INTEGER , PARAMETER ::   jp_ccov = 5           ! index of cloud cover                     ( % )
55   INTEGER , PARAMETER ::   jp_tair = 6           ! index of 10m air temperature             (Kelvin)
56   INTEGER , PARAMETER ::   jp_prec = 7           ! index of total precipitation (rain+snow) (Kg/m2/s)
57
58   TYPE(FLD),ALLOCATABLE,DIMENSION(:) :: sf  ! structure of input fields (file informations, fields read)
59
60   INTEGER, PARAMETER  ::   jpintsr = 24          ! number of time step between sunrise and sunset
61   !                                              ! uses for heat flux computation
62   LOGICAL ::   lbulk_init = .TRUE.               ! flag, bulk initialization done or not)
63
64#if ! defined key_lim3                         
65   ! in namicerun with LIM3
66   REAL(wp) ::   cai = 1.40e-3 ! best estimate of atm drag in order to get correct FS export in ORCA2-LIM
67   REAL(wp) ::   cao = 1.00e-3 ! chosen by default  ==> should depends on many things...  !!gmto be updated
68#endif
69
70   REAL(wp) ::   rdtbs2      !:   
71   
72   REAL(wp), DIMENSION(19)  ::  budyko            ! BUDYKO's coefficient (cloudiness effect on LW radiation)
73   DATA budyko / 1.00, 0.98, 0.95, 0.92, 0.89, 0.86, 0.83, 0.80, 0.78, 0.75,   &
74      &          0.72, 0.69, 0.67, 0.64, 0.61, 0.58, 0.56, 0.53, 0.50 /
75   REAL(wp), DIMENSION(20)  :: tauco              ! cloud optical depth coefficient
76   DATA tauco / 6.6, 6.6, 7.0, 7.2, 7.1, 6.8, 6.5, 6.6, 7.1, 7.6,   &
77      &         6.6, 6.1, 5.6, 5.5, 5.8, 5.8, 5.6, 5.6, 5.6, 5.6 /
78   !!
79   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sbudyko      ! cloudiness effect on LW radiation
80   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   stauc        ! cloud optical depth
81   
82   REAL(wp) ::   eps20  = 1.e-20   ! constant values
83   
84   !! * Substitutions
85#  include "vectopt_loop_substitute.h90"
86   !!----------------------------------------------------------------------
87   !! NEMO/OPA 4.0 , NEMO Consortium (2011)
88   !! $Id$
89   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
90   !!----------------------------------------------------------------------
91CONTAINS
92
93   SUBROUTINE sbc_blk_clio( kt )
94      !!---------------------------------------------------------------------
95      !!                    ***  ROUTINE sbc_blk_clio  ***
96      !!                   
97      !! ** Purpose :   provide at each time step the surface ocean fluxes
98      !!      (momentum, heat, freshwater and runoff)
99      !!
100      !! ** Method  : (1) READ each fluxes in NetCDF files:
101      !!      the i-component of the stress                (N/m2)
102      !!      the j-component of the stress                (N/m2)
103      !!      the 10m wind speed module                    (m/s)
104      !!      the 10m air temperature                      (Kelvin)
105      !!      the 10m specific humidity                    (%)
106      !!      the cloud cover                              (%)
107      !!      the total precipitation (rain+snow)          (Kg/m2/s)
108      !!              (2) CALL blk_oce_clio
109      !!
110      !!      C A U T I O N : never mask the surface stress fields
111      !!                      the stress is assumed to be in the (i,j) mesh referential
112      !!
113      !! ** Action  :   defined at each time-step at the air-sea interface
114      !!              - utau, vtau  i- and j-component of the wind stress
115      !!              - taum        wind stress module at T-point
116      !!              - wndm        10m wind module at T-point
117      !!              - qns         non-solar heat flux including latent heat of solid
118      !!                            precip. melting and emp heat content
119      !!              - qsr         solar heat flux
120      !!              - emp         upward mass flux (evap. - precip)
121      !!              - sfx         salt flux; set to zero at nit000 but possibly non-zero
122      !!                            if ice is present (computed in limsbc(_2).F90)
123      !!----------------------------------------------------------------------
124      INTEGER, INTENT( in  ) ::   kt   ! ocean time step
125      !!
126      INTEGER  ::   ifpr, jfpr                   ! dummy indices
127      INTEGER  ::   ierr0, ierr1, ierr2, ierr3   ! return error code
128      INTEGER  ::   ios                          ! Local integer output status for namelist read
129      !!
130      CHARACTER(len=100) ::  cn_dir                            !   Root directory for location of CLIO files
131      TYPE(FLD_N), DIMENSION(jpfld) ::   slf_i                 ! array of namelist informations on the fields to read
132      TYPE(FLD_N) ::   sn_utau, sn_vtau, sn_wndm, sn_tair      ! informations about the fields to be read
133      TYPE(FLD_N) ::   sn_humi, sn_ccov, sn_prec               !   "                                 "
134      !!
135      NAMELIST/namsbc_clio/ cn_dir, sn_utau, sn_vtau, sn_wndm, sn_humi,   &
136         &                          sn_ccov, sn_tair, sn_prec
137      !!---------------------------------------------------------------------
138
139      !                                         ! ====================== !
140      IF( kt == nit000 ) THEN                   !  First call kt=nit000  !
141         !                                      ! ====================== !
142
143         REWIND( numnam_ref )              ! Namelist namsbc_clio in reference namelist : CLIO files
144         READ  ( numnam_ref, namsbc_clio, IOSTAT = ios, ERR = 901)
145901      IF( ios /= 0 ) CALL ctl_nam ( ios , 'namsbc_clio in reference namelist', lwp )
146
147         REWIND( numnam_cfg )              ! Namelist namsbc_clio in configuration namelist : CLIO files
148         READ  ( numnam_cfg, namsbc_clio, IOSTAT = ios, ERR = 902 )
149902      IF( ios /= 0 ) CALL ctl_nam ( ios , 'namsbc_clio in configuration namelist', lwp )
150         WRITE ( numond, namsbc_clio )
151
152         ! store namelist information in an array
153         slf_i(jp_utau) = sn_utau   ;   slf_i(jp_vtau) = sn_vtau   ;   slf_i(jp_wndm) = sn_wndm
154         slf_i(jp_tair) = sn_tair   ;   slf_i(jp_humi) = sn_humi
155         slf_i(jp_ccov) = sn_ccov   ;   slf_i(jp_prec) = sn_prec
156         
157         ! set sf structure
158         ALLOCATE( sf(jpfld), STAT=ierr0 )
159         IF( ierr0 > 0 )   CALL ctl_stop( 'STOP', 'sbc_blk_clio: unable to allocate sf structure' )
160         DO ifpr= 1, jpfld
161            ALLOCATE( sf(ifpr)%fnow(jpi,jpj,1) , STAT=ierr1)
162            IF( slf_i(ifpr)%ln_tint ) ALLOCATE( sf(ifpr)%fdta(jpi,jpj,1,2) , STAT=ierr2 )
163         END DO
164         IF( ierr1+ierr2 > 0 )   CALL ctl_stop( 'STOP', 'sbc_blk_clio: unable to allocate sf array structure' )
165         ! fill sf with slf_i and control print
166         CALL fld_fill( sf, slf_i, cn_dir, 'sbc_blk_clio', 'flux formulation for ocean surface boundary condition', 'namsbc_clio' )
167         
168         ! allocate sbcblk clio arrays
169         ALLOCATE( sbudyko(jpi,jpj) , stauc(jpi,jpj), STAT=ierr3 )
170         IF( ierr3 > 0 )   CALL ctl_stop( 'STOP', 'sbc_blk_clio: unable to allocate arrays' )
171         !
172         sfx(:,:) = 0._wp                       ! salt flux; zero unless ice is present (computed in limsbc(_2).F90)
173         !
174      ENDIF
175      !                                         ! ====================== !
176      !                                         !    At each time-step   !
177      !                                         ! ====================== !
178      !
179      CALL fld_read( kt, nn_fsbc, sf )                ! input fields provided at the current time-step
180      !
181      IF( MOD( kt - 1, nn_fsbc ) == 0 )   CALL blk_oce_clio( sf, sst_m )
182      !
183   END SUBROUTINE sbc_blk_clio
184
185
186   SUBROUTINE blk_oce_clio( sf, pst )
187      !!---------------------------------------------------------------------------
188      !!                     ***  ROUTINE blk_oce_clio  ***
189      !!                 
190      !!  ** Purpose :   Compute momentum, heat and freshwater fluxes at ocean surface
191      !!               using CLIO bulk formulea
192      !!         
193      !!  ** Method  :   The flux of heat at the ocean surfaces are derived
194      !!       from semi-empirical ( or bulk ) formulae which relate the flux to
195      !!       the properties of the surface and of the lower atmosphere. Here, we
196      !!       follow the work of Oberhuber, 1988   
197      !!               - momentum flux (stresses) directly read in files at U- and V-points
198      !!               - compute ocean/ice albedos (call albedo_oce/albedo_ice) 
199      !!               - compute shortwave radiation for ocean (call blk_clio_qsr_oce)
200      !!               - compute long-wave radiation for the ocean
201      !!               - compute the turbulent heat fluxes over the ocean
202      !!               - deduce the evaporation over the ocean
203      !!  ** Action  :   Fluxes over the ocean:
204      !!               - utau, vtau  i- and j-component of the wind stress
205      !!               - taum        wind stress module at T-point
206      !!               - wndm        10m wind module at T-point
207      !!               - qns         non-solar heat flux including latent heat of solid
208      !!                             precip. melting and emp heat content
209      !!               - qsr         solar heat flux
210      !!               - emp         suface mass flux (evap.-precip.)
211      !!  ** Nota    :   sf has to be a dummy argument for AGRIF on NEC
212      !!----------------------------------------------------------------------
213      TYPE(fld), INTENT(in), DIMENSION(:)       ::   sf    ! input data
214      REAL(wp) , INTENT(in), DIMENSION(jpi,jpj) ::   pst   ! surface temperature                      [Celcius]
215      !!
216      INTEGER  ::   ji, jj   ! dummy loop indices
217      !!
218      REAL(wp) ::   zrhova, zcsho, zcleo, zcldeff               ! temporary scalars
219      REAL(wp) ::   zqsato, zdteta, zdeltaq, ztvmoy, zobouks    !    -         -
220      REAL(wp) ::   zpsims, zpsihs, zpsils, zobouku, zxins, zpsimu   !    -         -
221      REAL(wp) ::   zpsihu, zpsilu, zstab,zpsim, zpsih, zpsil   !    -         -
222      REAL(wp) ::   zvatmg, zcmn, zchn, zcln, zcmcmn, zdenum    !    -         -
223      REAL(wp) ::   zdtetar, ztvmoyr, zlxins, zchcm, zclcm      !    -         -
224      REAL(wp) ::   zmt1, zmt2, zmt3, ztatm3, ztamr, ztaevbk    !    -         -
225      REAL(wp) ::   zsst, ztatm, zcco1, zpatm, zcmax, zrmax     !    -         -
226      REAL(wp) ::   zrhoa, zev, zes, zeso, zqatm, zevsqr        !    -         -
227      REAL(wp) ::   ztx2, zty2, zcevap, zcprec                  !    -         -
228      REAL(wp), POINTER, DIMENSION(:,:) ::   zqlw        ! long-wave heat flux over ocean
229      REAL(wp), POINTER, DIMENSION(:,:) ::   zqla        ! latent heat flux over ocean
230      REAL(wp), POINTER, DIMENSION(:,:) ::   zqsb        ! sensible heat flux over ocean
231      !!---------------------------------------------------------------------
232      !
233      IF( nn_timing == 1 )  CALL timing_start('blk_oce_clio')
234      !
235      CALL wrk_alloc( jpi,jpj, zqlw, zqla, zqsb )
236
237      zpatm = 101000._wp      ! atmospheric pressure  (assumed constant here)
238
239      !------------------------------------!
240      !   momentum fluxes  (utau, vtau )   !
241      !------------------------------------!
242      utau(:,:) = sf(jp_utau)%fnow(:,:,1)
243      vtau(:,:) = sf(jp_vtau)%fnow(:,:,1)
244
245      !------------------------------------!
246      !   wind stress module (taum )       !
247      !------------------------------------!
248      DO jj = 2, jpjm1
249         DO ji = fs_2, fs_jpim1   ! vector opt.
250            ztx2 = utau(ji-1,jj  ) + utau(ji,jj)
251            zty2 = vtau(ji  ,jj-1) + vtau(ji,jj)
252            taum(ji,jj) = 0.5 * SQRT( ztx2 * ztx2 + zty2 * zty2 )
253         END DO
254      END DO
255      CALL lbc_lnk( taum, 'T', 1. )
256
257      !------------------------------------!
258      !   store the wind speed  (wndm )    !
259      !------------------------------------!
260      wndm(:,:) = sf(jp_wndm)%fnow(:,:,1)
261
262      !------------------------------------------------!
263      !   Shortwave radiation for ocean and snow/ice   !
264      !------------------------------------------------!
265     
266      CALL blk_clio_qsr_oce( qsr )
267
268      !------------------------!
269      !   Other ocean fluxes   !
270      !------------------------!
271      DO jj = 1, jpj
272         DO ji = 1, jpi
273            !
274            zsst  = pst(ji,jj)              + rt0           ! converte Celcius to Kelvin the SST
275            ztatm = sf(jp_tair)%fnow(ji,jj,1)               ! and set minimum value far above 0 K (=rt0 over land)
276            zcco1 = 1.0 - sf(jp_ccov)%fnow(ji,jj,1)         ! fraction of clear sky ( 1 - cloud cover)
277            zrhoa = zpatm / ( 287.04 * ztatm )              ! air density (equation of state for dry air)
278            ztamr = ztatm - rtt                             ! Saturation water vapour
279            zmt1  = SIGN( 17.269,  ztamr )                  !           ||
280            zmt2  = SIGN( 21.875,  ztamr )                  !          \  /
281            zmt3  = SIGN( 28.200, -ztamr )                  !           \/
282            zes   = 611.0 * EXP(  ABS( ztamr ) * MIN ( zmt1, zmt2 ) / ( ztatm - 35.86  + MAX( 0.e0, zmt3 ) )  )
283            zev    = sf(jp_humi)%fnow(ji,jj,1) * zes        ! vapour pressure 
284            zevsqr = SQRT( zev * 0.01 )                     ! square-root of vapour pressure
285            zqatm = 0.622 * zev / ( zpatm - 0.378 * zev )   ! specific humidity
286
287            !--------------------------------------!
288            !  long-wave radiation over the ocean  !  ( Berliand 1952 ; all latitudes )
289            !--------------------------------------!
290            ztatm3  = ztatm * ztatm * ztatm
291            zcldeff = 1.0 - sbudyko(ji,jj) * sf(jp_ccov)%fnow(ji,jj,1) * sf(jp_ccov)%fnow(ji,jj,1)   
292            ztaevbk = ztatm * ztatm3 * zcldeff * ( 0.39 - 0.05 * zevsqr ) 
293            !
294            zqlw(ji,jj) = - emic * stefan * ( ztaevbk + 4. * ztatm3 * ( zsst - ztatm ) ) 
295
296            !--------------------------------------------------
297            !  Latent and sensible heat fluxes over the ocean
298            !--------------------------------------------------
299            !                                                          ! vapour pressure at saturation of ocean
300            zeso =  611.0 * EXP ( 17.2693884 * ( zsst - rtt ) * tmask(ji,jj,1) / ( zsst - 35.86 ) )
301
302            zqsato = ( 0.622 * zeso ) / ( zpatm - 0.378 * zeso )       ! humidity close to the ocean surface (at saturation)
303
304            ! Drag coefficients from Large and Pond (1981,1982)
305            !                                                          ! Stability parameters
306            zdteta  = zsst - ztatm
307            zdeltaq = zqatm - zqsato
308            ztvmoy  = ztatm * ( 1. + 2.2e-3 * ztatm * zqatm )
309            zdenum  = MAX( sf(jp_wndm)%fnow(ji,jj,1) * sf(jp_wndm)%fnow(ji,jj,1) * ztvmoy, eps20 )
310            zdtetar = zdteta / zdenum
311            ztvmoyr = ztvmoy * ztvmoy * zdeltaq / zdenum
312            !                                                          ! case of stable atmospheric conditions
313            zobouks = -70.0 * 10. * ( zdtetar + 3.2e-3 * ztvmoyr )
314            zobouks = MAX( 0.e0, zobouks )
315            zpsims = -7.0 * zobouks
316            zpsihs =  zpsims
317            zpsils =  zpsims
318            !                                                          ! case of unstable atmospheric conditions
319            zobouku = MIN(  0.e0, -100.0 * 10.0 * ( zdtetar + 2.2e-3 * ztvmoyr )  )
320            zxins   = ( 1. - 16. * zobouku )**0.25
321            zlxins  = LOG( ( 1. + zxins * zxins ) / 2. )
322            zpsimu  = 2. * LOG( ( 1 + zxins ) * 0.5 )  + zlxins - 2. * ATAN( zxins ) + rpi * 0.5
323            zpsihu  = 2. * zlxins
324            zpsilu  = zpsihu
325            !                                                          ! intermediate values
326            zstab   = MAX( 0.e0, SIGN( 1.e0, zdteta ) )
327            zpsim   = zstab * zpsimu + ( 1.0 - zstab ) * zpsims
328            zpsih   = zstab * zpsihu + ( 1.0 - zstab ) * zpsihs
329            zpsil   = zpsih
330           
331            zvatmg         = MAX( 0.032 * 1.5e-3 * sf(jp_wndm)%fnow(ji,jj,1) * sf(jp_wndm)%fnow(ji,jj,1) / grav, eps20 )
332            zcmn           = vkarmn / LOG ( 10. / zvatmg )
333            zchn           = 0.0327 * zcmn
334            zcln           = 0.0346 * zcmn
335            zcmcmn         = 1. / ( 1. - zcmn * zpsim / vkarmn )
336            ! sometimes the ratio zchn * zpsih / ( vkarmn * zcmn ) is too close to 1 and zchcm becomes very very big
337            zcmax = 0.1               ! choice for maximum value of the heat transfer coefficient, guided by my intuition
338            zrmax = 1 - 3.e-4 / zcmax ! maximum value of the ratio
339            zchcm = zcmcmn / ( 1. - MIN ( zchn * zpsih / ( vkarmn * zcmn ) , zrmax ) )
340            zclcm          = zchcm
341            !                                                          ! transfert coef. (Large and Pond 1981,1982)
342            zcsho          = zchn * zchcm                               
343            zcleo          = zcln * zclcm 
344
345            zrhova         = zrhoa * sf(jp_wndm)%fnow(ji,jj,1)
346
347            ! sensible heat flux
348            zqsb(ji,jj) = zrhova * zcsho * 1004.0  * ( zsst - ztatm ) 
349         
350            ! latent heat flux (bounded by zero)
351            zqla(ji,jj) = MAX(  0.e0, zrhova * zcleo * 2.5e+06 * ( zqsato - zqatm )  )
352            !               
353         END DO
354      END DO
355     
356      ! ----------------------------------------------------------------------------- !
357      !     III    Total FLUXES                                                       !
358      ! ----------------------------------------------------------------------------- !
359      zcevap = rcp /  cevap    ! convert zqla ==> evap (Kg/m2/s) ==> m/s ==> W/m2
360      zcprec = rcp /  rday     ! convert prec ( mm/day ==> m/s)  ==> W/m2
361
362      emp(:,:) = zqla(:,:) / cevap                                        &   ! freshwater flux
363         &     - sf(jp_prec)%fnow(:,:,1) / rday * tmask(:,:,1)
364      !
365      qns(:,:) = zqlw(:,:) - zqsb(:,:) - zqla(:,:)                        &   ! Downward Non Solar flux
366         &     - zqla(:,:)             * pst(:,:) * zcevap                &   ! remove evap.   heat content at SST in Celcius
367         &     + sf(jp_prec)%fnow(:,:,1) * sf(jp_tair)%fnow(:,:,1) * zcprec   ! add    precip. heat content at Tair in Celcius
368      ! NB: if sea-ice model, the snow precip are computed and the associated heat is added to qns (see blk_ice_clio)
369
370      CALL iom_put( "qlw_oce",   zqlw )   ! output downward longwave  heat over the ocean
371      CALL iom_put( "qsb_oce", - zqsb )   ! output downward sensible  heat over the ocean
372      CALL iom_put( "qla_oce", - zqla )   ! output downward latent    heat over the ocean
373      CALL iom_put( "qns_oce",   qns  )   ! output downward non solar heat over the ocean
374
375      IF(ln_ctl) THEN
376         CALL prt_ctl(tab2d_1=zqsb , clinfo1=' blk_oce_clio: zqsb   : ', tab2d_2=zqlw , clinfo2=' zqlw  : ')
377         CALL prt_ctl(tab2d_1=zqla , clinfo1=' blk_oce_clio: zqla   : ', tab2d_2=qsr  , clinfo2=' qsr   : ')
378         CALL prt_ctl(tab2d_1=pst  , clinfo1=' blk_oce_clio: pst    : ', tab2d_2=emp  , clinfo2=' emp   : ')
379         CALL prt_ctl(tab2d_1=utau , clinfo1=' blk_oce_clio: utau   : ', mask1=umask,   &
380            &         tab2d_2=vtau , clinfo2=' vtau : ', mask2=vmask )
381      ENDIF
382
383      CALL wrk_dealloc( jpi,jpj, zqlw, zqla, zqsb )
384      !
385      IF( nn_timing == 1 )  CALL timing_stop('blk_oce_clio')
386      !
387   END SUBROUTINE blk_oce_clio
388
389
390   SUBROUTINE blk_ice_clio(  pst   , palb_cs, palb_os ,       &
391      &                      p_taui, p_tauj, p_qns , p_qsr,   &
392      &                      p_qla , p_dqns, p_dqla,          &
393      &                      p_tpr , p_spr ,                  &
394      &                      p_fr1 , p_fr2 , cd_grid, pdim  )
395      !!---------------------------------------------------------------------------
396      !!                     ***  ROUTINE blk_ice_clio  ***
397      !!                 
398      !!  ** Purpose :   Computation of the heat fluxes at ocean and snow/ice
399      !!       surface the solar heat at ocean and snow/ice surfaces and the
400      !!       sensitivity of total heat fluxes to the SST variations
401      !!         
402      !!  ** Method  :   The flux of heat at the ice and ocean surfaces are derived
403      !!       from semi-empirical ( or bulk ) formulae which relate the flux to
404      !!       the properties of the surface and of the lower atmosphere. Here, we
405      !!       follow the work of Oberhuber, 1988   
406      !!
407      !!  ** Action  :   call albedo_oce/albedo_ice to compute ocean/ice albedo
408      !!               - snow precipitation
409      !!               - solar flux at the ocean and ice surfaces
410      !!               - the long-wave radiation for the ocean and sea/ice
411      !!               - turbulent heat fluxes over water and ice
412      !!               - evaporation over water
413      !!               - total heat fluxes sensitivity over ice (dQ/dT)
414      !!               - latent heat flux sensitivity over ice (dQla/dT)
415      !!               - qns  :  modified the non solar heat flux over the ocean
416      !!                         to take into account solid precip latent heat flux
417      !!----------------------------------------------------------------------
418      REAL(wp), INTENT(in   ), DIMENSION(:,:,:)   ::   pst      ! ice surface temperature                   [Kelvin]
419      REAL(wp), INTENT(in   ), DIMENSION(:,:,:)   ::   palb_cs  ! ice albedo (clear    sky) (alb_ice_cs)         [%]
420      REAL(wp), INTENT(in   ), DIMENSION(:,:,:)   ::   palb_os  ! ice albedo (overcast sky) (alb_ice_os)         [%]
421      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   p_taui   ! surface ice stress at I-point (i-component) [N/m2]
422      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   p_tauj   ! surface ice stress at I-point (j-component) [N/m2]
423      REAL(wp), INTENT(  out), DIMENSION(:,:,:)   ::   p_qns    ! non solar heat flux over ice (T-point)      [W/m2]
424      REAL(wp), INTENT(  out), DIMENSION(:,:,:)   ::   p_qsr    !     solar heat flux over ice (T-point)      [W/m2]
425      REAL(wp), INTENT(  out), DIMENSION(:,:,:)   ::   p_qla    ! latent    heat flux over ice (T-point)      [W/m2]
426      REAL(wp), INTENT(  out), DIMENSION(:,:,:)   ::   p_dqns   ! non solar heat sensistivity  (T-point)      [W/m2]
427      REAL(wp), INTENT(  out), DIMENSION(:,:,:)   ::   p_dqla   ! latent    heat sensistivity  (T-point)      [W/m2]
428      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   p_tpr    ! total precipitation          (T-point)   [Kg/m2/s]
429      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   p_spr    ! solid precipitation          (T-point)   [Kg/m2/s]
430      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   p_fr1    ! 1sr fraction of qsr penetration in ice         [%]
431      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   p_fr2    ! 2nd fraction of qsr penetration in ice         [%]
432      CHARACTER(len=1), INTENT(in   )             ::   cd_grid  ! type of sea-ice grid ("C" or "B" grid)
433      INTEGER, INTENT(in   )                      ::   pdim     ! number of ice categories
434      !!
435      INTEGER  ::   ji, jj, jl    ! dummy loop indices
436      INTEGER  ::   ijpl          ! number of ice categories (size of 3rd dim of input arrays)
437      !!
438      REAL(wp) ::   zcoef, zmt1, zmt2, zmt3, ztatm3     ! temporary scalars
439      REAL(wp) ::   ztaevbk, zind1, zind2, zind3, ztamr         !    -         -
440      REAL(wp) ::   zesi, zqsati, zdesidt                       !    -         -
441      REAL(wp) ::   zdqla, zcldeff, zev, zes, zpatm, zrhova     !    -         -
442      REAL(wp) ::   zcshi, zclei, zrhovaclei, zrhovacshi        !    -         -
443      REAL(wp) ::   ztice3, zticemb, zticemb2, zdqlw, zdqsb     !    -         -
444      !!
445      REAL(wp), DIMENSION(:,:)  , POINTER ::   ztatm   ! Tair in Kelvin
446      REAL(wp), DIMENSION(:,:)  , POINTER ::   zqatm   ! specific humidity
447      REAL(wp), DIMENSION(:,:)  , POINTER ::   zevsqr  ! vapour pressure square-root
448      REAL(wp), DIMENSION(:,:)  , POINTER ::   zrhoa   ! air density
449      REAL(wp), DIMENSION(:,:,:), POINTER ::   z_qlw, z_qsb
450      !!---------------------------------------------------------------------
451      !
452      IF( nn_timing == 1 )  CALL timing_start('blk_ice_clio')
453      !
454      CALL wrk_alloc( jpi,jpj, ztatm, zqatm, zevsqr, zrhoa )
455      CALL wrk_alloc( jpi,jpj,pdim, z_qlw, z_qsb )
456
457      ijpl  = pdim                           ! number of ice categories
458      zpatm = 101000.                        ! atmospheric pressure  (assumed constant  here)
459
460#if defined key_lim3     
461      tatm_ice(:,:) = sf(jp_tair)%fnow(:,:,1)   ! LIM3: make Tair available in sea-ice. WARNING allocated after call to ice_init
462#endif
463      !                                                        ! surface ocean fluxes computed with CLIO bulk formulea
464      !------------------------------------!
465      !   momentum fluxes  (utau, vtau )   !
466      !------------------------------------!
467
468      SELECT CASE( cd_grid )
469      CASE( 'C' )                          ! C-grid ice dynamics
470         zcoef  = cai / cao                         ! Change from air-sea stress to air-ice stress
471         p_taui(:,:) = zcoef * utau(:,:)
472         p_tauj(:,:) = zcoef * vtau(:,:)
473      CASE( 'I' )                          ! I-grid ice dynamics:  I-point (i.e. F-point lower-left corner)
474         zcoef  = 0.5_wp * cai / cao                ! Change from air-sea stress to air-ice stress
475         DO jj = 2, jpj         ! stress from ocean U- and V-points to ice U,V point
476            DO ji = 2, jpi   ! I-grid : no vector opt.
477               p_taui(ji,jj) = zcoef * ( utau(ji-1,jj  ) + utau(ji-1,jj-1) )
478               p_tauj(ji,jj) = zcoef * ( vtau(ji  ,jj-1) + vtau(ji-1,jj-1) )
479            END DO
480         END DO
481         CALL lbc_lnk( p_taui(:,:), 'I', -1. )   ;   CALL lbc_lnk( p_tauj(:,:), 'I', -1. )   ! I-point
482      END SELECT
483
484
485      !  Determine cloud optical depths as a function of latitude (Chou et al., 1981).
486      !  and the correction factor for taking into account  the effect of clouds
487      !------------------------------------------------------
488      DO jj = 1, jpj
489         DO ji = 1, jpi
490            ztatm (ji,jj) = sf(jp_tair)%fnow(ji,jj,1)                ! air temperature in Kelvins
491     
492            zrhoa(ji,jj) = zpatm / ( 287.04 * ztatm(ji,jj) )         ! air density (equation of state for dry air)
493     
494            ztamr = ztatm(ji,jj) - rtt                               ! Saturation water vapour
495            zmt1  = SIGN( 17.269,  ztamr )
496            zmt2  = SIGN( 21.875,  ztamr )
497            zmt3  = SIGN( 28.200, -ztamr )
498            zes   = 611.0 * EXP(  ABS( ztamr ) * MIN ( zmt1, zmt2 )   &
499               &                / ( ztatm(ji,jj) - 35.86  + MAX( 0.e0, zmt3 ) )  )
500
501            zev = sf(jp_humi)%fnow(ji,jj,1) * zes                    ! vapour pressure 
502            zevsqr(ji,jj) = SQRT( zev * 0.01 )                       ! square-root of vapour pressure
503            zqatm(ji,jj) = 0.622 * zev / ( zpatm - 0.378 * zev )     ! specific humidity
504
505            !----------------------------------------------------
506            !   Computation of snow precipitation (Ledley, 1985) |
507            !----------------------------------------------------
508            zmt1  =   253.0 - ztatm(ji,jj)            ;   zind1 = MAX( 0.e0, SIGN( 1.e0, zmt1 ) )
509            zmt2  = ( 272.0 - ztatm(ji,jj) ) / 38.0   ;   zind2 = MAX( 0.e0, SIGN( 1.e0, zmt2 ) )
510            zmt3  = ( 281.0 - ztatm(ji,jj) ) / 18.0   ;   zind3 = MAX( 0.e0, SIGN( 1.e0, zmt3 ) )
511            p_spr(ji,jj) = sf(jp_prec)%fnow(ji,jj,1) / rday   &      ! rday = converte mm/day to kg/m2/s
512               &         * (          zind1      &                   ! solid  (snow) precipitation [kg/m2/s]
513               &            + ( 1.0 - zind1 ) * (          zind2   * ( 0.5 + zmt2 )   &
514               &                                 + ( 1.0 - zind2 ) *  zind3 * zmt3  )   ) 
515
516            !----------------------------------------------------!
517            !  fraction of net penetrative shortwave radiation   !
518            !----------------------------------------------------!
519            ! fraction of qsr_ice which is NOT absorbed in the thin surface layer
520            ! and thus which penetrates inside the ice cover ( Maykut and Untersteiner, 1971 ; Elbert anbd Curry, 1993 )
521            p_fr1(ji,jj) = 0.18  * ( 1.e0 - sf(jp_ccov)%fnow(ji,jj,1) ) + 0.35 * sf(jp_ccov)%fnow(ji,jj,1) 
522            p_fr2(ji,jj) = 0.82  * ( 1.e0 - sf(jp_ccov)%fnow(ji,jj,1) ) + 0.65 * sf(jp_ccov)%fnow(ji,jj,1)
523         END DO
524      END DO
525      CALL iom_put( 'snowpre', p_spr )   ! Snow precipitation
526     
527      !-----------------------------------------------------------!
528      !  snow/ice Shortwave radiation   (abedo already computed)  !
529      !-----------------------------------------------------------!
530      CALL blk_clio_qsr_ice( palb_cs, palb_os, p_qsr )
531
532      !                                     ! ========================== !
533      DO jl = 1, ijpl                       !  Loop over ice categories  !
534         !                                  ! ========================== !
535         DO jj = 1 , jpj
536            DO ji = 1, jpi
537               !-------------------------------------------!
538               !  long-wave radiation over ice categories  !  ( Berliand 1952 ; all latitudes )
539               !-------------------------------------------!
540               ztatm3  = ztatm(ji,jj) * ztatm(ji,jj) * ztatm(ji,jj)
541               zcldeff = 1.0 - sbudyko(ji,jj) * sf(jp_ccov)%fnow(ji,jj,1) * sf(jp_ccov)%fnow(ji,jj,1)   
542               ztaevbk = ztatm3 * ztatm(ji,jj) * zcldeff * ( 0.39 - 0.05 * zevsqr(ji,jj) ) 
543               !
544               z_qlw(ji,jj,jl) = - emic * stefan * ( ztaevbk + 4. * ztatm3 * ( pst(ji,jj,jl) - ztatm(ji,jj) ) ) 
545
546               !----------------------------------------
547               !  Turbulent heat fluxes over snow/ice     ( Latent and sensible )
548               !----------------------------------------       
549
550               ! vapour pressure at saturation of ice (tmask to avoid overflow in the exponential)
551               zesi =  611.0 * EXP( 21.8745587 * tmask(ji,jj,1) * ( pst(ji,jj,jl) - rtt )/ ( pst(ji,jj,jl) - 7.66 ) )
552               ! humidity close to the ice surface (at saturation)
553               zqsati   = ( 0.622 * zesi ) / ( zpatm - 0.378 * zesi )
554               
555               !  computation of intermediate values
556               zticemb  = pst(ji,jj,jl) - 7.66
557               zticemb2 = zticemb * zticemb 
558               ztice3   = pst(ji,jj,jl) * pst(ji,jj,jl) * pst(ji,jj,jl)
559               zdesidt  = zesi * ( 9.5 * LOG( 10.0 ) * ( rtt - 7.66 )  / zticemb2 )
560               
561               !  Transfer cofficients assumed to be constant (Parkinson 1979 ; Maykut 1982)
562               zcshi    = 1.75e-03
563               zclei    = zcshi
564               
565               !  sensible and latent fluxes over ice
566               zrhova     = zrhoa(ji,jj) * sf(jp_wndm)%fnow(ji,jj,1)      ! computation of intermediate values
567               zrhovaclei = zrhova * zcshi * 2.834e+06
568               zrhovacshi = zrhova * zclei * 1004.0
569           
570               !  sensible heat flux
571               z_qsb(ji,jj,jl) = zrhovacshi * ( pst(ji,jj,jl) - ztatm(ji,jj) )
572           
573               !  latent heat flux
574               p_qla(ji,jj,jl) = MAX(  0.e0, zrhovaclei * ( zqsati - zqatm(ji,jj) )  )
575             
576               !  sensitivity of non solar fluxes (dQ/dT) (long-wave, sensible and latent fluxes)
577               zdqlw = 4.0 * emic * stefan * ztice3
578               zdqsb = zrhovacshi
579               zdqla = zrhovaclei * ( zdesidt * ( zqsati * zqsati / ( zesi * zesi ) ) * ( zpatm / 0.622 ) )   
580               !
581               p_dqla(ji,jj,jl) = zdqla                           ! latent flux sensitivity
582               p_dqns(ji,jj,jl) = -( zdqlw + zdqsb + zdqla )      !  total non solar sensitivity
583            END DO
584            !
585         END DO
586         !
587      END DO
588      !
589      ! ----------------------------------------------------------------------------- !
590      !    Total FLUXES                                                               !
591      ! ----------------------------------------------------------------------------- !
592      !
593      p_qns(:,:,:) = z_qlw (:,:,:) - z_qsb (:,:,:) - p_qla (:,:,:)      ! Downward Non Solar flux
594      p_tpr(:,:)   = sf(jp_prec)%fnow(:,:,1) / rday                     ! total precipitation [kg/m2/s]
595      !
596      ! ----------------------------------------------------------------------------- !
597      !    Correct the OCEAN non solar flux with the existence of solid precipitation !
598      ! ---------------=====--------------------------------------------------------- !
599      qns(:,:) = qns(:,:)                                                           &   ! update the non-solar heat flux with:
600         &     - p_spr(:,:) * lfus                                                  &   ! remove melting solid precip
601         &     + p_spr(:,:) * MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow - rt0 ) * cpic &   ! add solid P at least below melting
602         &     - p_spr(:,:) * sf(jp_tair)%fnow(:,:,1)                        * rcp      ! remove solid precip. at Tair
603      !
604!!gm : not necessary as all input data are lbc_lnk...
605      CALL lbc_lnk( p_fr1  (:,:) , 'T', 1. )
606      CALL lbc_lnk( p_fr2  (:,:) , 'T', 1. )
607      DO jl = 1, ijpl
608         CALL lbc_lnk( p_qns (:,:,jl) , 'T', 1. )
609         CALL lbc_lnk( p_dqns(:,:,jl) , 'T', 1. )
610         CALL lbc_lnk( p_qla (:,:,jl) , 'T', 1. )
611         CALL lbc_lnk( p_dqla(:,:,jl) , 'T', 1. )
612      END DO
613
614!!gm : mask is not required on forcing
615      DO jl = 1, ijpl
616         p_qns (:,:,jl) = p_qns (:,:,jl) * tmask(:,:,1)
617         p_qla (:,:,jl) = p_qla (:,:,jl) * tmask(:,:,1)
618         p_dqns(:,:,jl) = p_dqns(:,:,jl) * tmask(:,:,1)
619         p_dqla(:,:,jl) = p_dqla(:,:,jl) * tmask(:,:,1)
620      END DO
621
622      IF(ln_ctl) THEN
623         CALL prt_ctl(tab3d_1=z_qsb  , clinfo1=' blk_ice_clio: z_qsb  : ', tab3d_2=z_qlw  , clinfo2=' z_qlw  : ', kdim=ijpl)
624         CALL prt_ctl(tab3d_1=p_qla  , clinfo1=' blk_ice_clio: z_qla  : ', tab3d_2=p_qsr  , clinfo2=' p_qsr  : ', kdim=ijpl)
625         CALL prt_ctl(tab3d_1=p_dqns , clinfo1=' blk_ice_clio: p_dqns : ', tab3d_2=p_qns  , clinfo2=' p_qns  : ', kdim=ijpl)
626         CALL prt_ctl(tab3d_1=p_dqla , clinfo1=' blk_ice_clio: p_dqla : ', tab3d_2=pst    , clinfo2=' pst    : ', kdim=ijpl)
627         CALL prt_ctl(tab2d_1=p_tpr  , clinfo1=' blk_ice_clio: p_tpr  : ', tab2d_2=p_spr  , clinfo2=' p_spr  : ')
628         CALL prt_ctl(tab2d_1=p_taui , clinfo1=' blk_ice_clio: p_taui : ', tab2d_2=p_tauj , clinfo2=' p_tauj : ')
629      ENDIF
630
631      CALL wrk_dealloc( jpi,jpj, ztatm, zqatm, zevsqr, zrhoa )
632      CALL wrk_dealloc( jpi,jpj,pdim, z_qlw, z_qsb )
633      !
634      IF( nn_timing == 1 )  CALL timing_stop('blk_ice_clio')
635      !
636   END SUBROUTINE blk_ice_clio
637
638
639   SUBROUTINE blk_clio_qsr_oce( pqsr_oce )
640      !!---------------------------------------------------------------------------
641      !!                     ***  ROUTINE blk_clio_qsr_oce  ***
642      !!                 
643      !!  ** Purpose :   Computation of the shortwave radiation at the ocean and the
644      !!               snow/ice surfaces.
645      !!         
646      !!  ** Method  : - computed qsr from the cloud cover for both ice and ocean
647      !!               - also initialise sbudyko and stauc once for all
648      !!----------------------------------------------------------------------
649      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj)     ::   pqsr_oce    ! shortwave radiation  over the ocean
650      !!
651      INTEGER, PARAMETER  ::   jp24 = 24   ! sampling of the daylight period (sunrise to sunset) into 24 equal parts
652      !!     
653      INTEGER  ::   ji, jj, jt    ! dummy loop indices
654      INTEGER  ::   indaet            !  = -1, 0, 1 for odd, normal and leap years resp.
655      INTEGER  ::   iday              ! integer part of day
656      INTEGER  ::   indxb, indxc      ! index for cloud depth coefficient
657
658      REAL(wp)  ::   zalat , zclat, zcmue, zcmue2    ! local scalars
659      REAL(wp)  ::   zmt1, zmt2, zmt3                !
660      REAL(wp)  ::   zdecl, zsdecl , zcdecl          !
661      REAL(wp)  ::   za_oce, ztamr                   !
662
663      REAL(wp) ::   zdl, zlha                        ! local scalars
664      REAL(wp) ::   zlmunoon, zcldcor, zdaycor       !   
665      REAL(wp) ::   zxday, zdist, zcoef, zcoef1      !
666      REAL(wp) ::   zes
667     
668      REAL(wp), DIMENSION(:,:), POINTER ::   zev          ! vapour pressure
669      REAL(wp), DIMENSION(:,:), POINTER ::   zdlha, zlsrise, zlsset     ! 2D workspace
670      REAL(wp), DIMENSION(:,:), POINTER ::   zps, zpc   ! sine (cosine) of latitude per sine (cosine) of solar declination
671      !!---------------------------------------------------------------------
672      !
673      IF( nn_timing == 1 )  CALL timing_start('blk_clio_qsr_oce')
674      !
675      CALL wrk_alloc( jpi,jpj, zev, zdlha, zlsrise, zlsset, zps, zpc )
676
677      IF( lbulk_init ) THEN             !   Initilization at first time step only
678         rdtbs2 = nn_fsbc * rdt * 0.5
679         ! cloud optical depths as a function of latitude (Chou et al., 1981).
680         ! and the correction factor for taking into account  the effect of clouds
681         DO jj = 1, jpj
682            DO ji = 1 , jpi
683               zalat          = ( 90.e0 - ABS( gphit(ji,jj) ) ) /  5.e0
684               zclat          = ( 95.e0 -      gphit(ji,jj)   ) / 10.e0
685               indxb          = 1 + INT( zalat )
686               indxc          = 1 + INT( zclat )
687               zdl            = zclat - INT( zclat )
688               !  correction factor to account for the effect of clouds
689               sbudyko(ji,jj) = budyko(indxb)
690               stauc  (ji,jj) = ( 1.e0 - zdl ) * tauco( indxc ) + zdl * tauco( indxc + 1 )
691            END DO
692         END DO
693         lbulk_init = .FALSE.
694      ENDIF
695
696
697      ! Saturated water vapour and vapour pressure
698      ! ------------------------------------------
699      DO jj = 1, jpj
700         DO ji = 1, jpi
701            ztamr = sf(jp_tair)%fnow(ji,jj,1) - rtt
702            zmt1  = SIGN( 17.269,  ztamr )
703            zmt2  = SIGN( 21.875,  ztamr )
704            zmt3  = SIGN( 28.200, -ztamr )
705            zes = 611.0 * EXP(  ABS( ztamr ) * MIN ( zmt1, zmt2 )   &              ! Saturation water vapour
706               &                     / ( sf(jp_tair)%fnow(ji,jj,1) - 35.86  + MAX( 0.e0, zmt3 ) )  )
707            zev(ji,jj) = sf(jp_humi)%fnow(ji,jj,1) * zes * 1.0e-05                 ! vapour pressure 
708         END DO
709      END DO
710
711      !-----------------------------------!
712      !  Computation of solar irradiance  !
713      !-----------------------------------!
714!!gm : hard coded  leap year ???
715      indaet   = 1                                    ! = -1, 0, 1 for odd, normal and leap years resp.
716      zxday = nday_year + rdtbs2 / rday               ! day of the year at which the fluxes are calculated
717      iday  = INT( zxday )                            ! (centred at the middle of the ice time step)
718      CALL flx_blk_declin( indaet, iday, zdecl )      ! solar declination of the current day
719      zsdecl = SIN( zdecl * rad )                     ! its sine
720      zcdecl = COS( zdecl * rad )                     ! its cosine
721
722
723      !  correction factor added for computation of shortwave flux to take into account the variation of
724      !  the distance between the sun and the earth during the year (Oberhuber 1988)
725      zdist    = zxday * 2. * rpi / REAL(nyear_len(1), wp)
726      zdaycor  = 1.0 + 0.0013 * SIN( zdist ) + 0.0342 * COS( zdist )
727
728      DO jj = 1, jpj
729         DO ji = 1, jpi
730            !  product of sine (cosine) of latitude and sine (cosine) of solar declination
731            zps(ji,jj) = SIN( gphit(ji,jj) * rad ) * zsdecl
732            zpc(ji,jj) = COS( gphit(ji,jj) * rad ) * zcdecl
733            !  computation of the both local time of sunrise and sunset
734            zlsrise(ji,jj) = ACOS( - SIGN( 1.e0, zps(ji,jj) )    &
735               &                   * MIN(  1.e0, SIGN( 1.e0, zps(ji,jj) ) * ( zps(ji,jj) / zpc(ji,jj) )  )   )
736            zlsset (ji,jj) = - zlsrise(ji,jj)
737            !  dividing the solar day into jp24 segments of length zdlha
738            zdlha  (ji,jj) = ( zlsrise(ji,jj) - zlsset(ji,jj) ) / REAL( jp24, wp )
739         END DO
740      END DO
741
742
743      !---------------------------------------------!
744      !  shortwave radiation absorbed by the ocean  !
745      !---------------------------------------------!
746      pqsr_oce(:,:)   = 0.e0      ! set ocean qsr to zero     
747
748      ! compute and sum ocean qsr over the daylight (i.e. between sunrise and sunset)
749      DO jt = 1, jp24
750         zcoef = FLOAT( jt ) - 0.5
751         DO jj = 1, jpj
752            DO ji = 1, jpi
753               zlha = COS(  zlsrise(ji,jj) - zcoef * zdlha(ji,jj)  )                  ! local hour angle
754               zcmue              = MAX( 0.e0 ,   zps(ji,jj) + zpc(ji,jj) * zlha  )   ! cos of local solar altitude
755               zcmue2             = 1368.0 * zcmue * zcmue
756
757               ! ocean albedo depending on the cloud cover (Payne, 1972)
758               za_oce     = ( 1.0 - sf(jp_ccov)%fnow(ji,jj,1) ) * 0.05 / ( 1.1 * zcmue**1.4 + 0.15 )   &   ! clear sky
759                  &       +         sf(jp_ccov)%fnow(ji,jj,1)   * 0.06                                     ! overcast
760
761                  ! solar heat flux absorbed by the ocean (Zillman, 1972)
762               pqsr_oce(ji,jj) = pqsr_oce(ji,jj)                                         &
763                  &            + ( 1.0 - za_oce ) * zdlha(ji,jj) * zcmue2                &
764                  &            / ( ( zcmue + 2.7 ) * zev(ji,jj) + 1.085 * zcmue +  0.10 )
765            END DO
766         END DO
767      END DO
768      ! Taking into account the ellipsity of the earth orbit, the clouds AND masked if sea-ice cover > 0%
769      zcoef1 = srgamma * zdaycor / ( 2. * rpi )
770      DO jj = 1, jpj
771         DO ji = 1, jpi
772            zlmunoon = ASIN( zps(ji,jj) + zpc(ji,jj) ) / rad                         ! local noon solar altitude
773            zcldcor  = MIN(  1.e0, ( 1.e0 - 0.62 * sf(jp_ccov)%fnow(ji,jj,1)   &     ! cloud correction (Reed 1977)
774               &                          + 0.0019 * zlmunoon )                 )
775            pqsr_oce(ji,jj) = zcoef1 * zcldcor * pqsr_oce(ji,jj) * tmask(ji,jj,1)    ! and zcoef1: ellipsity
776         END DO
777      END DO
778
779      CALL wrk_dealloc( jpi,jpj, zev, zdlha, zlsrise, zlsset, zps, zpc )
780      !
781      IF( nn_timing == 1 )  CALL timing_stop('blk_clio_qsr_oce')
782      !
783   END SUBROUTINE blk_clio_qsr_oce
784
785
786   SUBROUTINE blk_clio_qsr_ice( pa_ice_cs, pa_ice_os, pqsr_ice )
787      !!---------------------------------------------------------------------------
788      !!                     ***  ROUTINE blk_clio_qsr_ice  ***
789      !!                 
790      !!  ** Purpose :   Computation of the shortwave radiation at the ocean and the
791      !!               snow/ice surfaces.
792      !!         
793      !!  ** Method  : - computed qsr from the cloud cover for both ice and ocean
794      !!               - also initialise sbudyko and stauc once for all
795      !!----------------------------------------------------------------------
796      REAL(wp), INTENT(in   ), DIMENSION(:,:,:) ::   pa_ice_cs   ! albedo of ice under clear sky
797      REAL(wp), INTENT(in   ), DIMENSION(:,:,:) ::   pa_ice_os   ! albedo of ice under overcast sky
798      REAL(wp), INTENT(  out), DIMENSION(:,:,:) ::   pqsr_ice    ! shortwave radiation over the ice/snow
799      !!
800      INTEGER, PARAMETER  ::   jp24 = 24   ! sampling of the daylight period (sunrise to sunset) into 24 equal parts
801      !!
802      INTEGER  ::   ji, jj, jl, jt    ! dummy loop indices
803      INTEGER  ::   ijpl              ! number of ice categories (3rd dim of pqsr_ice)
804      INTEGER  ::   indaet            !  = -1, 0, 1 for odd, normal and leap years resp.
805      INTEGER  ::   iday              ! integer part of day
806      !!
807      REAL(wp) ::   zcmue, zcmue2, ztamr          ! temporary scalars
808      REAL(wp) ::   zmt1, zmt2, zmt3              !    -         -
809      REAL(wp) ::   zdecl, zsdecl, zcdecl         !    -         -
810      REAL(wp) ::   zlha, zdaycor, zes            !    -         -
811      REAL(wp) ::   zxday, zdist, zcoef, zcoef1   !    -         -
812      REAL(wp) ::   zqsr_ice_cs, zqsr_ice_os      !    -         -
813
814      REAL(wp), DIMENSION(:,:), POINTER ::   zev                      ! vapour pressure
815      REAL(wp), DIMENSION(:,:), POINTER ::   zdlha, zlsrise, zlsset   ! 2D workspace
816      REAL(wp), DIMENSION(:,:), POINTER ::   zps, zpc   ! sine (cosine) of latitude per sine (cosine) of solar declination
817      !!---------------------------------------------------------------------
818      !
819      IF( nn_timing == 1 )  CALL timing_start('blk_clio_qsr_ice')
820      !
821      CALL wrk_alloc( jpi,jpj, zev, zdlha, zlsrise, zlsset, zps, zpc )
822
823      ijpl = SIZE(pqsr_ice, 3 )      ! number of ice categories
824     
825      ! Saturated water vapour and vapour pressure
826      ! ------------------------------------------
827      DO jj = 1, jpj
828         DO ji = 1, jpi           
829            ztamr = sf(jp_tair)%fnow(ji,jj,1) - rtt           
830            zmt1  = SIGN( 17.269,  ztamr )
831            zmt2  = SIGN( 21.875,  ztamr )
832            zmt3  = SIGN( 28.200, -ztamr )
833            zes = 611.0 * EXP(  ABS( ztamr ) * MIN ( zmt1, zmt2 )   &              ! Saturation water vapour
834               &                     / ( sf(jp_tair)%fnow(ji,jj,1) - 35.86  + MAX( 0.e0, zmt3 ) )  )
835            zev(ji,jj) = sf(jp_humi)%fnow(ji,jj,1) * zes * 1.0e-05                 ! vapour pressure 
836         END DO
837      END DO
838
839      !-----------------------------------!
840      !  Computation of solar irradiance  !
841      !-----------------------------------!
842!!gm : hard coded  leap year ???
843      indaet   = 1                                    ! = -1, 0, 1 for odd, normal and leap years resp.
844      zxday = nday_year + rdtbs2 / rday               ! day of the year at which the fluxes are calculated
845      iday  = INT( zxday )                            ! (centred at the middle of the ice time step)
846      CALL flx_blk_declin( indaet, iday, zdecl )      ! solar declination of the current day
847      zsdecl = SIN( zdecl * rad )                     ! its sine
848      zcdecl = COS( zdecl * rad )                     ! its cosine
849
850     
851      !  correction factor added for computation of shortwave flux to take into account the variation of
852      !  the distance between the sun and the earth during the year (Oberhuber 1988)
853      zdist    = zxday * 2. * rpi / REAL(nyear_len(1), wp)
854      zdaycor  = 1.0 + 0.0013 * SIN( zdist ) + 0.0342 * COS( zdist )
855
856      DO jj = 1, jpj
857         DO ji = 1, jpi
858            !  product of sine (cosine) of latitude and sine (cosine) of solar declination
859            zps(ji,jj) = SIN( gphit(ji,jj) * rad ) * zsdecl
860            zpc(ji,jj) = COS( gphit(ji,jj) * rad ) * zcdecl
861            !  computation of the both local time of sunrise and sunset
862            zlsrise(ji,jj) = ACOS( - SIGN( 1.e0, zps(ji,jj) )    &
863               &                   * MIN(  1.e0, SIGN( 1.e0, zps(ji,jj) ) * ( zps(ji,jj) / zpc(ji,jj) )  )   ) 
864            zlsset (ji,jj) = - zlsrise(ji,jj)
865            !  dividing the solar day into jp24 segments of length zdlha
866            zdlha  (ji,jj) = ( zlsrise(ji,jj) - zlsset(ji,jj) ) / REAL( jp24, wp )
867         END DO
868      END DO
869
870
871      !---------------------------------------------!
872      !  shortwave radiation absorbed by the ice    !
873      !---------------------------------------------!
874      ! compute and sum ice qsr over the daylight for each ice categories
875      pqsr_ice(:,:,:) = 0.e0
876      zcoef1 = zdaycor / ( 2. * rpi )       ! Correction for the ellipsity of the earth orbit
877     
878      !                    !----------------------------!
879      DO jl = 1, ijpl      !  loop over ice categories  !
880         !                 !----------------------------!
881         DO jt = 1, jp24   
882            zcoef = FLOAT( jt ) - 0.5
883            DO jj = 1, jpj
884               DO ji = 1, jpi
885                  zlha = COS(  zlsrise(ji,jj) - zcoef * zdlha(ji,jj)  )                  ! local hour angle
886                  zcmue              = MAX( 0.e0 ,   zps(ji,jj) + zpc(ji,jj) * zlha  )   ! cos of local solar altitude
887                  zcmue2             = 1368.0 * zcmue * zcmue
888                 
889                  !  solar heat flux absorbed by the ice/snow system (Shine and Crane 1984 adapted to high albedo)
890                  zqsr_ice_cs =  ( 1.0 - pa_ice_cs(ji,jj,jl) ) * zdlha(ji,jj) * zcmue2        &   ! clear sky
891                     &        / ( ( 1.0 + zcmue ) * zev(ji,jj) + 1.2 * zcmue + 0.0455 )
892                  zqsr_ice_os = zdlha(ji,jj) * SQRT( zcmue )                                  &   ! overcast sky
893                     &        * ( 53.5 + 1274.5 * zcmue )      * ( 1.0 - 0.996  * pa_ice_os(ji,jj,jl) )    &
894                     &        / (  1.0 + 0.139  * stauc(ji,jj) * ( 1.0 - 0.9435 * pa_ice_os(ji,jj,jl) ) )       
895             
896                  pqsr_ice(ji,jj,jl) = pqsr_ice(ji,jj,jl) + (  ( 1.0 - sf(jp_ccov)%fnow(ji,jj,1) ) * zqsr_ice_cs    &
897                     &                                       +         sf(jp_ccov)%fnow(ji,jj,1)   * zqsr_ice_os  )
898               END DO
899            END DO
900         END DO
901         !
902         ! Correction : Taking into account the ellipsity of the earth orbit
903         pqsr_ice(:,:,jl) = pqsr_ice(:,:,jl) * zcoef1 * tmask(:,:,1)
904         !
905         !                 !--------------------------------!
906      END DO               !  end loop over ice categories  !
907      !                    !--------------------------------!
908
909
910!!gm  : this should be suppress as input data have been passed through lbc_lnk
911      DO jl = 1, ijpl
912         CALL lbc_lnk( pqsr_ice(:,:,jl) , 'T', 1. )
913      END DO
914      !
915      CALL wrk_dealloc( jpi,jpj, zev, zdlha, zlsrise, zlsset, zps, zpc )
916      !
917      IF( nn_timing == 1 )  CALL timing_stop('blk_clio_qsr_ice')
918      !
919   END SUBROUTINE blk_clio_qsr_ice
920
921
922   SUBROUTINE flx_blk_declin( ky, kday, pdecl )
923      !!---------------------------------------------------------------------------
924      !!               ***  ROUTINE flx_blk_declin  ***
925      !!         
926      !! ** Purpose :   Computation of the solar declination for the day
927      !!       
928      !! ** Method  :   ???
929      !!---------------------------------------------------------------------
930      INTEGER , INTENT(in   ) ::   ky      ! = -1, 0, 1 for odd, normal and leap years resp.
931      INTEGER , INTENT(in   ) ::   kday    ! day of the year ( kday = 1 on january 1)
932      REAL(wp), INTENT(  out) ::   pdecl   ! solar declination
933      !!
934      REAL(wp) ::   a0  =  0.39507671      ! coefficients for solar declinaison computation
935      REAL(wp) ::   a1  = 22.85684301      !     "              ""                 "
936      REAL(wp) ::   a2  = -0.38637317      !     "              ""                 "
937      REAL(wp) ::   a3  =  0.15096535      !     "              ""                 "
938      REAL(wp) ::   a4  = -0.00961411      !     "              ""                 "
939      REAL(wp) ::   b1  = -4.29692073      !     "              ""                 "
940      REAL(wp) ::   b2  =  0.05702074      !     "              ""                 "
941      REAL(wp) ::   b3  = -0.09028607      !     "              ""                 "
942      REAL(wp) ::   b4  =  0.00592797
943      !!
944      REAL(wp) ::   zday   ! corresponding day of type year (cf. ky)
945      REAL(wp) ::   zp     ! temporary scalars
946      !!---------------------------------------------------------------------
947           
948      IF    ( ky == 1 )  THEN   ;   zday = REAL( kday, wp ) - 0.5
949      ELSEIF( ky == 3 )  THEN   ;   zday = REAL( kday, wp ) - 1.
950      ELSE                      ;   zday = REAL( kday, wp )
951      ENDIF
952     
953      zp = rpi * ( 2.0 * zday - 367.0 ) / REAL(nyear_len(1), wp)
954     
955      pdecl  = a0                                                                      &
956         &   + a1 * COS( zp ) + a2 * COS( 2. * zp ) + a3 * COS( 3. * zp ) + a4 * COS( 4. * zp )   &
957         &   + b1 * SIN( zp ) + b2 * SIN( 2. * zp ) + b3 * SIN( 3. * zp ) + b4 * SIN( 4. * zp )
958      !
959   END SUBROUTINE flx_blk_declin
960
961   !!======================================================================
962END MODULE sbcblk_clio
Note: See TracBrowser for help on using the repository browser.