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

source: branches/2013/dev_r3853_CNRS9_ConfSetting/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk_clio.F90 @ 3901

Last change on this file since 3901 was 3901, checked in by clevy, 11 years ago

Configuration Setting/Step2, see ticket:#1074

  • Property svn:keywords set to Id
File size: 54.6 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!CDIR COLLAPSE
243      utau(:,:) = sf(jp_utau)%fnow(:,:,1)
244!CDIR COLLAPSE
245      vtau(:,:) = sf(jp_vtau)%fnow(:,:,1)
246
247      !------------------------------------!
248      !   wind stress module (taum )       !
249      !------------------------------------!
250!CDIR NOVERRCHK
251      DO jj = 2, jpjm1
252!CDIR NOVERRCHK
253         DO ji = fs_2, fs_jpim1   ! vector opt.
254            ztx2 = utau(ji-1,jj  ) + utau(ji,jj)
255            zty2 = vtau(ji  ,jj-1) + vtau(ji,jj)
256            taum(ji,jj) = 0.5 * SQRT( ztx2 * ztx2 + zty2 * zty2 )
257         END DO
258      END DO
259      CALL lbc_lnk( taum, 'T', 1. )
260
261      !------------------------------------!
262      !   store the wind speed  (wndm )    !
263      !------------------------------------!
264!CDIR COLLAPSE
265      wndm(:,:) = sf(jp_wndm)%fnow(:,:,1)
266
267      !------------------------------------------------!
268      !   Shortwave radiation for ocean and snow/ice   !
269      !------------------------------------------------!
270     
271      CALL blk_clio_qsr_oce( qsr )
272
273      !------------------------!
274      !   Other ocean fluxes   !
275      !------------------------!
276!CDIR NOVERRCHK
277!CDIR COLLAPSE
278      DO jj = 1, jpj
279!CDIR NOVERRCHK
280         DO ji = 1, jpi
281            !
282            zsst  = pst(ji,jj)              + rt0           ! converte Celcius to Kelvin the SST
283            ztatm = sf(jp_tair)%fnow(ji,jj,1)               ! and set minimum value far above 0 K (=rt0 over land)
284            zcco1 = 1.0 - sf(jp_ccov)%fnow(ji,jj,1)         ! fraction of clear sky ( 1 - cloud cover)
285            zrhoa = zpatm / ( 287.04 * ztatm )              ! air density (equation of state for dry air)
286            ztamr = ztatm - rtt                             ! Saturation water vapour
287            zmt1  = SIGN( 17.269,  ztamr )                  !           ||
288            zmt2  = SIGN( 21.875,  ztamr )                  !          \  /
289            zmt3  = SIGN( 28.200, -ztamr )                  !           \/
290            zes   = 611.0 * EXP(  ABS( ztamr ) * MIN ( zmt1, zmt2 ) / ( ztatm - 35.86  + MAX( 0.e0, zmt3 ) )  )
291            zev    = sf(jp_humi)%fnow(ji,jj,1) * zes        ! vapour pressure 
292            zevsqr = SQRT( zev * 0.01 )                     ! square-root of vapour pressure
293            zqatm = 0.622 * zev / ( zpatm - 0.378 * zev )   ! specific humidity
294
295            !--------------------------------------!
296            !  long-wave radiation over the ocean  !  ( Berliand 1952 ; all latitudes )
297            !--------------------------------------!
298            ztatm3  = ztatm * ztatm * ztatm
299            zcldeff = 1.0 - sbudyko(ji,jj) * sf(jp_ccov)%fnow(ji,jj,1) * sf(jp_ccov)%fnow(ji,jj,1)   
300            ztaevbk = ztatm * ztatm3 * zcldeff * ( 0.39 - 0.05 * zevsqr ) 
301            !
302            zqlw(ji,jj) = - emic * stefan * ( ztaevbk + 4. * ztatm3 * ( zsst - ztatm ) ) 
303
304            !--------------------------------------------------
305            !  Latent and sensible heat fluxes over the ocean
306            !--------------------------------------------------
307            !                                                          ! vapour pressure at saturation of ocean
308            zeso =  611.0 * EXP ( 17.2693884 * ( zsst - rtt ) * tmask(ji,jj,1) / ( zsst - 35.86 ) )
309
310            zqsato = ( 0.622 * zeso ) / ( zpatm - 0.378 * zeso )       ! humidity close to the ocean surface (at saturation)
311
312            ! Drag coefficients from Large and Pond (1981,1982)
313            !                                                          ! Stability parameters
314            zdteta  = zsst - ztatm
315            zdeltaq = zqatm - zqsato
316            ztvmoy  = ztatm * ( 1. + 2.2e-3 * ztatm * zqatm )
317            zdenum  = MAX( sf(jp_wndm)%fnow(ji,jj,1) * sf(jp_wndm)%fnow(ji,jj,1) * ztvmoy, eps20 )
318            zdtetar = zdteta / zdenum
319            ztvmoyr = ztvmoy * ztvmoy * zdeltaq / zdenum
320            !                                                          ! case of stable atmospheric conditions
321            zobouks = -70.0 * 10. * ( zdtetar + 3.2e-3 * ztvmoyr )
322            zobouks = MAX( 0.e0, zobouks )
323            zpsims = -7.0 * zobouks
324            zpsihs =  zpsims
325            zpsils =  zpsims
326            !                                                          ! case of unstable atmospheric conditions
327            zobouku = MIN(  0.e0, -100.0 * 10.0 * ( zdtetar + 2.2e-3 * ztvmoyr )  )
328            zxins   = ( 1. - 16. * zobouku )**0.25
329            zlxins  = LOG( ( 1. + zxins * zxins ) / 2. )
330            zpsimu  = 2. * LOG( ( 1 + zxins ) * 0.5 )  + zlxins - 2. * ATAN( zxins ) + rpi * 0.5
331            zpsihu  = 2. * zlxins
332            zpsilu  = zpsihu
333            !                                                          ! intermediate values
334            zstab   = MAX( 0.e0, SIGN( 1.e0, zdteta ) )
335            zpsim   = zstab * zpsimu + ( 1.0 - zstab ) * zpsims
336            zpsih   = zstab * zpsihu + ( 1.0 - zstab ) * zpsihs
337            zpsil   = zpsih
338           
339            zvatmg         = MAX( 0.032 * 1.5e-3 * sf(jp_wndm)%fnow(ji,jj,1) * sf(jp_wndm)%fnow(ji,jj,1) / grav, eps20 )
340            zcmn           = vkarmn / LOG ( 10. / zvatmg )
341            zchn           = 0.0327 * zcmn
342            zcln           = 0.0346 * zcmn
343            zcmcmn         = 1. / ( 1. - zcmn * zpsim / vkarmn )
344            ! sometimes the ratio zchn * zpsih / ( vkarmn * zcmn ) is too close to 1 and zchcm becomes very very big
345            zcmax = 0.1               ! choice for maximum value of the heat transfer coefficient, guided by my intuition
346            zrmax = 1 - 3.e-4 / zcmax ! maximum value of the ratio
347            zchcm = zcmcmn / ( 1. - MIN ( zchn * zpsih / ( vkarmn * zcmn ) , zrmax ) )
348            zclcm          = zchcm
349            !                                                          ! transfert coef. (Large and Pond 1981,1982)
350            zcsho          = zchn * zchcm                               
351            zcleo          = zcln * zclcm 
352
353            zrhova         = zrhoa * sf(jp_wndm)%fnow(ji,jj,1)
354
355            ! sensible heat flux
356            zqsb(ji,jj) = zrhova * zcsho * 1004.0  * ( zsst - ztatm ) 
357         
358            ! latent heat flux (bounded by zero)
359            zqla(ji,jj) = MAX(  0.e0, zrhova * zcleo * 2.5e+06 * ( zqsato - zqatm )  )
360            !               
361         END DO
362      END DO
363     
364      ! ----------------------------------------------------------------------------- !
365      !     III    Total FLUXES                                                       !
366      ! ----------------------------------------------------------------------------- !
367      zcevap = rcp /  cevap    ! convert zqla ==> evap (Kg/m2/s) ==> m/s ==> W/m2
368      zcprec = rcp /  rday     ! convert prec ( mm/day ==> m/s)  ==> W/m2
369
370!CDIR COLLAPSE
371      emp(:,:) = zqla(:,:) / cevap                                        &   ! freshwater flux
372         &     - sf(jp_prec)%fnow(:,:,1) / rday * tmask(:,:,1)
373      !
374!CDIR COLLAPSE
375      qns(:,:) = zqlw(:,:) - zqsb(:,:) - zqla(:,:)                        &   ! Downward Non Solar flux
376         &     - zqla(:,:)             * pst(:,:) * zcevap                &   ! remove evap.   heat content at SST in Celcius
377         &     + sf(jp_prec)%fnow(:,:,1) * sf(jp_tair)%fnow(:,:,1) * zcprec   ! add    precip. heat content at Tair in Celcius
378      ! NB: if sea-ice model, the snow precip are computed and the associated heat is added to qns (see blk_ice_clio)
379
380      CALL iom_put( "qlw_oce",   zqlw )   ! output downward longwave  heat over the ocean
381      CALL iom_put( "qsb_oce", - zqsb )   ! output downward sensible  heat over the ocean
382      CALL iom_put( "qla_oce", - zqla )   ! output downward latent    heat over the ocean
383      CALL iom_put( "qns_oce",   qns  )   ! output downward non solar heat over the ocean
384
385      IF(ln_ctl) THEN
386         CALL prt_ctl(tab2d_1=zqsb , clinfo1=' blk_oce_clio: zqsb   : ', tab2d_2=zqlw , clinfo2=' zqlw  : ')
387         CALL prt_ctl(tab2d_1=zqla , clinfo1=' blk_oce_clio: zqla   : ', tab2d_2=qsr  , clinfo2=' qsr   : ')
388         CALL prt_ctl(tab2d_1=pst  , clinfo1=' blk_oce_clio: pst    : ', tab2d_2=emp  , clinfo2=' emp   : ')
389         CALL prt_ctl(tab2d_1=utau , clinfo1=' blk_oce_clio: utau   : ', mask1=umask,   &
390            &         tab2d_2=vtau , clinfo2=' vtau : ', mask2=vmask )
391      ENDIF
392
393      CALL wrk_dealloc( jpi,jpj, zqlw, zqla, zqsb )
394      !
395      IF( nn_timing == 1 )  CALL timing_stop('blk_oce_clio')
396      !
397   END SUBROUTINE blk_oce_clio
398
399
400   SUBROUTINE blk_ice_clio(  pst   , palb_cs, palb_os ,       &
401      &                      p_taui, p_tauj, p_qns , p_qsr,   &
402      &                      p_qla , p_dqns, p_dqla,          &
403      &                      p_tpr , p_spr ,                  &
404      &                      p_fr1 , p_fr2 , cd_grid, pdim  )
405      !!---------------------------------------------------------------------------
406      !!                     ***  ROUTINE blk_ice_clio  ***
407      !!                 
408      !!  ** Purpose :   Computation of the heat fluxes at ocean and snow/ice
409      !!       surface the solar heat at ocean and snow/ice surfaces and the
410      !!       sensitivity of total heat fluxes to the SST variations
411      !!         
412      !!  ** Method  :   The flux of heat at the ice and ocean surfaces are derived
413      !!       from semi-empirical ( or bulk ) formulae which relate the flux to
414      !!       the properties of the surface and of the lower atmosphere. Here, we
415      !!       follow the work of Oberhuber, 1988   
416      !!
417      !!  ** Action  :   call albedo_oce/albedo_ice to compute ocean/ice albedo
418      !!               - snow precipitation
419      !!               - solar flux at the ocean and ice surfaces
420      !!               - the long-wave radiation for the ocean and sea/ice
421      !!               - turbulent heat fluxes over water and ice
422      !!               - evaporation over water
423      !!               - total heat fluxes sensitivity over ice (dQ/dT)
424      !!               - latent heat flux sensitivity over ice (dQla/dT)
425      !!               - qns  :  modified the non solar heat flux over the ocean
426      !!                         to take into account solid precip latent heat flux
427      !!----------------------------------------------------------------------
428      REAL(wp), INTENT(in   ), DIMENSION(:,:,:)   ::   pst      ! ice surface temperature                   [Kelvin]
429      REAL(wp), INTENT(in   ), DIMENSION(:,:,:)   ::   palb_cs  ! ice albedo (clear    sky) (alb_ice_cs)         [%]
430      REAL(wp), INTENT(in   ), DIMENSION(:,:,:)   ::   palb_os  ! ice albedo (overcast sky) (alb_ice_os)         [%]
431      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   p_taui   ! surface ice stress at I-point (i-component) [N/m2]
432      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   p_tauj   ! surface ice stress at I-point (j-component) [N/m2]
433      REAL(wp), INTENT(  out), DIMENSION(:,:,:)   ::   p_qns    ! non solar heat flux over ice (T-point)      [W/m2]
434      REAL(wp), INTENT(  out), DIMENSION(:,:,:)   ::   p_qsr    !     solar heat flux over ice (T-point)      [W/m2]
435      REAL(wp), INTENT(  out), DIMENSION(:,:,:)   ::   p_qla    ! latent    heat flux over ice (T-point)      [W/m2]
436      REAL(wp), INTENT(  out), DIMENSION(:,:,:)   ::   p_dqns   ! non solar heat sensistivity  (T-point)      [W/m2]
437      REAL(wp), INTENT(  out), DIMENSION(:,:,:)   ::   p_dqla   ! latent    heat sensistivity  (T-point)      [W/m2]
438      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   p_tpr    ! total precipitation          (T-point)   [Kg/m2/s]
439      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   p_spr    ! solid precipitation          (T-point)   [Kg/m2/s]
440      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   p_fr1    ! 1sr fraction of qsr penetration in ice         [%]
441      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   p_fr2    ! 2nd fraction of qsr penetration in ice         [%]
442      CHARACTER(len=1), INTENT(in   )             ::   cd_grid  ! type of sea-ice grid ("C" or "B" grid)
443      INTEGER, INTENT(in   )                      ::   pdim     ! number of ice categories
444      !!
445      INTEGER  ::   ji, jj, jl    ! dummy loop indices
446      INTEGER  ::   ijpl          ! number of ice categories (size of 3rd dim of input arrays)
447      !!
448      REAL(wp) ::   zcoef, zmt1, zmt2, zmt3, ztatm3     ! temporary scalars
449      REAL(wp) ::   ztaevbk, zind1, zind2, zind3, ztamr         !    -         -
450      REAL(wp) ::   zesi, zqsati, zdesidt                       !    -         -
451      REAL(wp) ::   zdqla, zcldeff, zev, zes, zpatm, zrhova     !    -         -
452      REAL(wp) ::   zcshi, zclei, zrhovaclei, zrhovacshi        !    -         -
453      REAL(wp) ::   ztice3, zticemb, zticemb2, zdqlw, zdqsb     !    -         -
454      !!
455      REAL(wp), DIMENSION(:,:)  , POINTER ::   ztatm   ! Tair in Kelvin
456      REAL(wp), DIMENSION(:,:)  , POINTER ::   zqatm   ! specific humidity
457      REAL(wp), DIMENSION(:,:)  , POINTER ::   zevsqr  ! vapour pressure square-root
458      REAL(wp), DIMENSION(:,:)  , POINTER ::   zrhoa   ! air density
459      REAL(wp), DIMENSION(:,:,:), POINTER ::   z_qlw, z_qsb
460      !!---------------------------------------------------------------------
461      !
462      IF( nn_timing == 1 )  CALL timing_start('blk_ice_clio')
463      !
464      CALL wrk_alloc( jpi,jpj, ztatm, zqatm, zevsqr, zrhoa )
465      CALL wrk_alloc( jpi,jpj,pdim, z_qlw, z_qsb )
466
467      ijpl  = pdim                           ! number of ice categories
468      zpatm = 101000.                        ! atmospheric pressure  (assumed constant  here)
469
470#if defined key_lim3     
471      tatm_ice(:,:) = sf(jp_tair)%fnow(:,:,1)   ! LIM3: make Tair available in sea-ice. WARNING allocated after call to ice_init
472#endif
473      !                                                        ! surface ocean fluxes computed with CLIO bulk formulea
474      !------------------------------------!
475      !   momentum fluxes  (utau, vtau )   !
476      !------------------------------------!
477
478      SELECT CASE( cd_grid )
479      CASE( 'C' )                          ! C-grid ice dynamics
480         zcoef  = cai / cao                         ! Change from air-sea stress to air-ice stress
481         p_taui(:,:) = zcoef * utau(:,:)
482         p_tauj(:,:) = zcoef * vtau(:,:)
483      CASE( 'I' )                          ! I-grid ice dynamics:  I-point (i.e. F-point lower-left corner)
484         zcoef  = 0.5_wp * cai / cao                ! Change from air-sea stress to air-ice stress
485         DO jj = 2, jpj         ! stress from ocean U- and V-points to ice U,V point
486            DO ji = 2, jpi   ! I-grid : no vector opt.
487               p_taui(ji,jj) = zcoef * ( utau(ji-1,jj  ) + utau(ji-1,jj-1) )
488               p_tauj(ji,jj) = zcoef * ( vtau(ji  ,jj-1) + vtau(ji-1,jj-1) )
489            END DO
490         END DO
491         CALL lbc_lnk( p_taui(:,:), 'I', -1. )   ;   CALL lbc_lnk( p_tauj(:,:), 'I', -1. )   ! I-point
492      END SELECT
493
494
495      !  Determine cloud optical depths as a function of latitude (Chou et al., 1981).
496      !  and the correction factor for taking into account  the effect of clouds
497      !------------------------------------------------------
498!CDIR NOVERRCHK
499!CDIR COLLAPSE
500      DO jj = 1, jpj
501!CDIR NOVERRCHK
502         DO ji = 1, jpi
503            ztatm (ji,jj) = sf(jp_tair)%fnow(ji,jj,1)                ! air temperature in Kelvins
504     
505            zrhoa(ji,jj) = zpatm / ( 287.04 * ztatm(ji,jj) )         ! air density (equation of state for dry air)
506     
507            ztamr = ztatm(ji,jj) - rtt                               ! Saturation water vapour
508            zmt1  = SIGN( 17.269,  ztamr )
509            zmt2  = SIGN( 21.875,  ztamr )
510            zmt3  = SIGN( 28.200, -ztamr )
511            zes   = 611.0 * EXP(  ABS( ztamr ) * MIN ( zmt1, zmt2 )   &
512               &                / ( ztatm(ji,jj) - 35.86  + MAX( 0.e0, zmt3 ) )  )
513
514            zev = sf(jp_humi)%fnow(ji,jj,1) * zes                    ! vapour pressure 
515            zevsqr(ji,jj) = SQRT( zev * 0.01 )                       ! square-root of vapour pressure
516            zqatm(ji,jj) = 0.622 * zev / ( zpatm - 0.378 * zev )     ! specific humidity
517
518            !----------------------------------------------------
519            !   Computation of snow precipitation (Ledley, 1985) |
520            !----------------------------------------------------
521            zmt1  =   253.0 - ztatm(ji,jj)            ;   zind1 = MAX( 0.e0, SIGN( 1.e0, zmt1 ) )
522            zmt2  = ( 272.0 - ztatm(ji,jj) ) / 38.0   ;   zind2 = MAX( 0.e0, SIGN( 1.e0, zmt2 ) )
523            zmt3  = ( 281.0 - ztatm(ji,jj) ) / 18.0   ;   zind3 = MAX( 0.e0, SIGN( 1.e0, zmt3 ) )
524            p_spr(ji,jj) = sf(jp_prec)%fnow(ji,jj,1) / rday   &      ! rday = converte mm/day to kg/m2/s
525               &         * (          zind1      &                   ! solid  (snow) precipitation [kg/m2/s]
526               &            + ( 1.0 - zind1 ) * (          zind2   * ( 0.5 + zmt2 )   &
527               &                                 + ( 1.0 - zind2 ) *  zind3 * zmt3  )   ) 
528
529            !----------------------------------------------------!
530            !  fraction of net penetrative shortwave radiation   !
531            !----------------------------------------------------!
532            ! fraction of qsr_ice which is NOT absorbed in the thin surface layer
533            ! and thus which penetrates inside the ice cover ( Maykut and Untersteiner, 1971 ; Elbert anbd Curry, 1993 )
534            p_fr1(ji,jj) = 0.18  * ( 1.e0 - sf(jp_ccov)%fnow(ji,jj,1) ) + 0.35 * sf(jp_ccov)%fnow(ji,jj,1) 
535            p_fr2(ji,jj) = 0.82  * ( 1.e0 - sf(jp_ccov)%fnow(ji,jj,1) ) + 0.65 * sf(jp_ccov)%fnow(ji,jj,1)
536         END DO
537      END DO
538      CALL iom_put( 'snowpre', p_spr )   ! Snow precipitation
539     
540      !-----------------------------------------------------------!
541      !  snow/ice Shortwave radiation   (abedo already computed)  !
542      !-----------------------------------------------------------!
543      CALL blk_clio_qsr_ice( palb_cs, palb_os, p_qsr )
544
545      !                                     ! ========================== !
546      DO jl = 1, ijpl                       !  Loop over ice categories  !
547         !                                  ! ========================== !
548!CDIR NOVERRCHK
549!CDIR COLLAPSE
550         DO jj = 1 , jpj
551!CDIR NOVERRCHK
552            DO ji = 1, jpi
553               !-------------------------------------------!
554               !  long-wave radiation over ice categories  !  ( Berliand 1952 ; all latitudes )
555               !-------------------------------------------!
556               ztatm3  = ztatm(ji,jj) * ztatm(ji,jj) * ztatm(ji,jj)
557               zcldeff = 1.0 - sbudyko(ji,jj) * sf(jp_ccov)%fnow(ji,jj,1) * sf(jp_ccov)%fnow(ji,jj,1)   
558               ztaevbk = ztatm3 * ztatm(ji,jj) * zcldeff * ( 0.39 - 0.05 * zevsqr(ji,jj) ) 
559               !
560               z_qlw(ji,jj,jl) = - emic * stefan * ( ztaevbk + 4. * ztatm3 * ( pst(ji,jj,jl) - ztatm(ji,jj) ) ) 
561
562               !----------------------------------------
563               !  Turbulent heat fluxes over snow/ice     ( Latent and sensible )
564               !----------------------------------------       
565
566               ! vapour pressure at saturation of ice (tmask to avoid overflow in the exponential)
567               zesi =  611.0 * EXP( 21.8745587 * tmask(ji,jj,1) * ( pst(ji,jj,jl) - rtt )/ ( pst(ji,jj,jl) - 7.66 ) )
568               ! humidity close to the ice surface (at saturation)
569               zqsati   = ( 0.622 * zesi ) / ( zpatm - 0.378 * zesi )
570               
571               !  computation of intermediate values
572               zticemb  = pst(ji,jj,jl) - 7.66
573               zticemb2 = zticemb * zticemb 
574               ztice3   = pst(ji,jj,jl) * pst(ji,jj,jl) * pst(ji,jj,jl)
575               zdesidt  = zesi * ( 9.5 * LOG( 10.0 ) * ( rtt - 7.66 )  / zticemb2 )
576               
577               !  Transfer cofficients assumed to be constant (Parkinson 1979 ; Maykut 1982)
578               zcshi    = 1.75e-03
579               zclei    = zcshi
580               
581               !  sensible and latent fluxes over ice
582               zrhova     = zrhoa(ji,jj) * sf(jp_wndm)%fnow(ji,jj,1)      ! computation of intermediate values
583               zrhovaclei = zrhova * zcshi * 2.834e+06
584               zrhovacshi = zrhova * zclei * 1004.0
585           
586               !  sensible heat flux
587               z_qsb(ji,jj,jl) = zrhovacshi * ( pst(ji,jj,jl) - ztatm(ji,jj) )
588           
589               !  latent heat flux
590               p_qla(ji,jj,jl) = MAX(  0.e0, zrhovaclei * ( zqsati - zqatm(ji,jj) )  )
591             
592               !  sensitivity of non solar fluxes (dQ/dT) (long-wave, sensible and latent fluxes)
593               zdqlw = 4.0 * emic * stefan * ztice3
594               zdqsb = zrhovacshi
595               zdqla = zrhovaclei * ( zdesidt * ( zqsati * zqsati / ( zesi * zesi ) ) * ( zpatm / 0.622 ) )   
596               !
597               p_dqla(ji,jj,jl) = zdqla                           ! latent flux sensitivity
598               p_dqns(ji,jj,jl) = -( zdqlw + zdqsb + zdqla )      !  total non solar sensitivity
599            END DO
600            !
601         END DO
602         !
603      END DO
604      !
605      ! ----------------------------------------------------------------------------- !
606      !    Total FLUXES                                                               !
607      ! ----------------------------------------------------------------------------- !
608      !
609!CDIR COLLAPSE
610      p_qns(:,:,:) = z_qlw (:,:,:) - z_qsb (:,:,:) - p_qla (:,:,:)      ! Downward Non Solar flux
611!CDIR COLLAPSE
612      p_tpr(:,:)   = sf(jp_prec)%fnow(:,:,1) / rday                     ! total precipitation [kg/m2/s]
613      !
614      ! ----------------------------------------------------------------------------- !
615      !    Correct the OCEAN non solar flux with the existence of solid precipitation !
616      ! ---------------=====--------------------------------------------------------- !
617!CDIR COLLAPSE
618      qns(:,:) = qns(:,:)                                                           &   ! update the non-solar heat flux with:
619         &     - p_spr(:,:) * lfus                                                  &   ! remove melting solid precip
620         &     + p_spr(:,:) * MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow - rt0 ) * cpic &   ! add solid P at least below melting
621         &     - p_spr(:,:) * sf(jp_tair)%fnow(:,:,1)                        * rcp      ! remove solid precip. at Tair
622      !
623!!gm : not necessary as all input data are lbc_lnk...
624      CALL lbc_lnk( p_fr1  (:,:) , 'T', 1. )
625      CALL lbc_lnk( p_fr2  (:,:) , 'T', 1. )
626      DO jl = 1, ijpl
627         CALL lbc_lnk( p_qns (:,:,jl) , 'T', 1. )
628         CALL lbc_lnk( p_dqns(:,:,jl) , 'T', 1. )
629         CALL lbc_lnk( p_qla (:,:,jl) , 'T', 1. )
630         CALL lbc_lnk( p_dqla(:,:,jl) , 'T', 1. )
631      END DO
632
633!!gm : mask is not required on forcing
634      DO jl = 1, ijpl
635         p_qns (:,:,jl) = p_qns (:,:,jl) * tmask(:,:,1)
636         p_qla (:,:,jl) = p_qla (:,:,jl) * tmask(:,:,1)
637         p_dqns(:,:,jl) = p_dqns(:,:,jl) * tmask(:,:,1)
638         p_dqla(:,:,jl) = p_dqla(:,:,jl) * tmask(:,:,1)
639      END DO
640
641      IF(ln_ctl) THEN
642         CALL prt_ctl(tab3d_1=z_qsb  , clinfo1=' blk_ice_clio: z_qsb  : ', tab3d_2=z_qlw  , clinfo2=' z_qlw  : ', kdim=ijpl)
643         CALL prt_ctl(tab3d_1=p_qla  , clinfo1=' blk_ice_clio: z_qla  : ', tab3d_2=p_qsr  , clinfo2=' p_qsr  : ', kdim=ijpl)
644         CALL prt_ctl(tab3d_1=p_dqns , clinfo1=' blk_ice_clio: p_dqns : ', tab3d_2=p_qns  , clinfo2=' p_qns  : ', kdim=ijpl)
645         CALL prt_ctl(tab3d_1=p_dqla , clinfo1=' blk_ice_clio: p_dqla : ', tab3d_2=pst    , clinfo2=' pst    : ', kdim=ijpl)
646         CALL prt_ctl(tab2d_1=p_tpr  , clinfo1=' blk_ice_clio: p_tpr  : ', tab2d_2=p_spr  , clinfo2=' p_spr  : ')
647         CALL prt_ctl(tab2d_1=p_taui , clinfo1=' blk_ice_clio: p_taui : ', tab2d_2=p_tauj , clinfo2=' p_tauj : ')
648      ENDIF
649
650      CALL wrk_dealloc( jpi,jpj, ztatm, zqatm, zevsqr, zrhoa )
651      CALL wrk_dealloc( jpi,jpj,pdim, z_qlw, z_qsb )
652      !
653      IF( nn_timing == 1 )  CALL timing_stop('blk_ice_clio')
654      !
655   END SUBROUTINE blk_ice_clio
656
657
658   SUBROUTINE blk_clio_qsr_oce( pqsr_oce )
659      !!---------------------------------------------------------------------------
660      !!                     ***  ROUTINE blk_clio_qsr_oce  ***
661      !!                 
662      !!  ** Purpose :   Computation of the shortwave radiation at the ocean and the
663      !!               snow/ice surfaces.
664      !!         
665      !!  ** Method  : - computed qsr from the cloud cover for both ice and ocean
666      !!               - also initialise sbudyko and stauc once for all
667      !!----------------------------------------------------------------------
668      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj)     ::   pqsr_oce    ! shortwave radiation  over the ocean
669      !!
670      INTEGER, PARAMETER  ::   jp24 = 24   ! sampling of the daylight period (sunrise to sunset) into 24 equal parts
671      !!     
672      INTEGER  ::   ji, jj, jt    ! dummy loop indices
673      INTEGER  ::   indaet            !  = -1, 0, 1 for odd, normal and leap years resp.
674      INTEGER  ::   iday              ! integer part of day
675      INTEGER  ::   indxb, indxc      ! index for cloud depth coefficient
676
677      REAL(wp)  ::   zalat , zclat, zcmue, zcmue2    ! local scalars
678      REAL(wp)  ::   zmt1, zmt2, zmt3                !
679      REAL(wp)  ::   zdecl, zsdecl , zcdecl          !
680      REAL(wp)  ::   za_oce, ztamr                   !
681
682      REAL(wp) ::   zdl, zlha                        ! local scalars
683      REAL(wp) ::   zlmunoon, zcldcor, zdaycor       !   
684      REAL(wp) ::   zxday, zdist, zcoef, zcoef1      !
685      REAL(wp) ::   zes
686     
687      REAL(wp), DIMENSION(:,:), POINTER ::   zev          ! vapour pressure
688      REAL(wp), DIMENSION(:,:), POINTER ::   zdlha, zlsrise, zlsset     ! 2D workspace
689      REAL(wp), DIMENSION(:,:), POINTER ::   zps, zpc   ! sine (cosine) of latitude per sine (cosine) of solar declination
690      !!---------------------------------------------------------------------
691      !
692      IF( nn_timing == 1 )  CALL timing_start('blk_clio_qsr_oce')
693      !
694      CALL wrk_alloc( jpi,jpj, zev, zdlha, zlsrise, zlsset, zps, zpc )
695
696      IF( lbulk_init ) THEN             !   Initilization at first time step only
697         rdtbs2 = nn_fsbc * rdt * 0.5
698         ! cloud optical depths as a function of latitude (Chou et al., 1981).
699         ! and the correction factor for taking into account  the effect of clouds
700         DO jj = 1, jpj
701            DO ji = 1 , jpi
702               zalat          = ( 90.e0 - ABS( gphit(ji,jj) ) ) /  5.e0
703               zclat          = ( 95.e0 -      gphit(ji,jj)   ) / 10.e0
704               indxb          = 1 + INT( zalat )
705               indxc          = 1 + INT( zclat )
706               zdl            = zclat - INT( zclat )
707               !  correction factor to account for the effect of clouds
708               sbudyko(ji,jj) = budyko(indxb)
709               stauc  (ji,jj) = ( 1.e0 - zdl ) * tauco( indxc ) + zdl * tauco( indxc + 1 )
710            END DO
711         END DO
712         lbulk_init = .FALSE.
713      ENDIF
714
715
716      ! Saturated water vapour and vapour pressure
717      ! ------------------------------------------
718!CDIR NOVERRCHK
719!CDIR COLLAPSE
720      DO jj = 1, jpj
721!CDIR NOVERRCHK
722         DO ji = 1, jpi
723            ztamr = sf(jp_tair)%fnow(ji,jj,1) - rtt
724            zmt1  = SIGN( 17.269,  ztamr )
725            zmt2  = SIGN( 21.875,  ztamr )
726            zmt3  = SIGN( 28.200, -ztamr )
727            zes = 611.0 * EXP(  ABS( ztamr ) * MIN ( zmt1, zmt2 )   &              ! Saturation water vapour
728               &                     / ( sf(jp_tair)%fnow(ji,jj,1) - 35.86  + MAX( 0.e0, zmt3 ) )  )
729            zev(ji,jj) = sf(jp_humi)%fnow(ji,jj,1) * zes * 1.0e-05                 ! vapour pressure 
730         END DO
731      END DO
732
733      !-----------------------------------!
734      !  Computation of solar irradiance  !
735      !-----------------------------------!
736!!gm : hard coded  leap year ???
737      indaet   = 1                                    ! = -1, 0, 1 for odd, normal and leap years resp.
738      zxday = nday_year + rdtbs2 / rday               ! day of the year at which the fluxes are calculated
739      iday  = INT( zxday )                            ! (centred at the middle of the ice time step)
740      CALL flx_blk_declin( indaet, iday, zdecl )      ! solar declination of the current day
741      zsdecl = SIN( zdecl * rad )                     ! its sine
742      zcdecl = COS( zdecl * rad )                     ! its cosine
743
744
745      !  correction factor added for computation of shortwave flux to take into account the variation of
746      !  the distance between the sun and the earth during the year (Oberhuber 1988)
747      zdist    = zxday * 2. * rpi / REAL(nyear_len(1), wp)
748      zdaycor  = 1.0 + 0.0013 * SIN( zdist ) + 0.0342 * COS( zdist )
749
750!CDIR NOVERRCHK
751      DO jj = 1, jpj
752!CDIR NOVERRCHK
753         DO ji = 1, jpi
754            !  product of sine (cosine) of latitude and sine (cosine) of solar declination
755            zps(ji,jj) = SIN( gphit(ji,jj) * rad ) * zsdecl
756            zpc(ji,jj) = COS( gphit(ji,jj) * rad ) * zcdecl
757            !  computation of the both local time of sunrise and sunset
758            zlsrise(ji,jj) = ACOS( - SIGN( 1.e0, zps(ji,jj) )    &
759               &                   * MIN(  1.e0, SIGN( 1.e0, zps(ji,jj) ) * ( zps(ji,jj) / zpc(ji,jj) )  )   )
760            zlsset (ji,jj) = - zlsrise(ji,jj)
761            !  dividing the solar day into jp24 segments of length zdlha
762            zdlha  (ji,jj) = ( zlsrise(ji,jj) - zlsset(ji,jj) ) / REAL( jp24, wp )
763         END DO
764      END DO
765
766
767      !---------------------------------------------!
768      !  shortwave radiation absorbed by the ocean  !
769      !---------------------------------------------!
770      pqsr_oce(:,:)   = 0.e0      ! set ocean qsr to zero     
771
772      ! compute and sum ocean qsr over the daylight (i.e. between sunrise and sunset)
773!CDIR NOVERRCHK   
774      DO jt = 1, jp24
775         zcoef = FLOAT( jt ) - 0.5
776!CDIR NOVERRCHK     
777!CDIR COLLAPSE
778         DO jj = 1, jpj
779!CDIR NOVERRCHK
780            DO ji = 1, jpi
781               zlha = COS(  zlsrise(ji,jj) - zcoef * zdlha(ji,jj)  )                  ! local hour angle
782               zcmue              = MAX( 0.e0 ,   zps(ji,jj) + zpc(ji,jj) * zlha  )   ! cos of local solar altitude
783               zcmue2             = 1368.0 * zcmue * zcmue
784
785               ! ocean albedo depending on the cloud cover (Payne, 1972)
786               za_oce     = ( 1.0 - sf(jp_ccov)%fnow(ji,jj,1) ) * 0.05 / ( 1.1 * zcmue**1.4 + 0.15 )   &   ! clear sky
787                  &       +         sf(jp_ccov)%fnow(ji,jj,1)   * 0.06                                     ! overcast
788
789                  ! solar heat flux absorbed by the ocean (Zillman, 1972)
790               pqsr_oce(ji,jj) = pqsr_oce(ji,jj)                                         &
791                  &            + ( 1.0 - za_oce ) * zdlha(ji,jj) * zcmue2                &
792                  &            / ( ( zcmue + 2.7 ) * zev(ji,jj) + 1.085 * zcmue +  0.10 )
793            END DO
794         END DO
795      END DO
796      ! Taking into account the ellipsity of the earth orbit, the clouds AND masked if sea-ice cover > 0%
797      zcoef1 = srgamma * zdaycor / ( 2. * rpi )
798!CDIR COLLAPSE
799      DO jj = 1, jpj
800         DO ji = 1, jpi
801            zlmunoon = ASIN( zps(ji,jj) + zpc(ji,jj) ) / rad                         ! local noon solar altitude
802            zcldcor  = MIN(  1.e0, ( 1.e0 - 0.62 * sf(jp_ccov)%fnow(ji,jj,1)   &     ! cloud correction (Reed 1977)
803               &                          + 0.0019 * zlmunoon )                 )
804            pqsr_oce(ji,jj) = zcoef1 * zcldcor * pqsr_oce(ji,jj) * tmask(ji,jj,1)    ! and zcoef1: ellipsity
805         END DO
806      END DO
807
808      CALL wrk_dealloc( jpi,jpj, zev, zdlha, zlsrise, zlsset, zps, zpc )
809      !
810      IF( nn_timing == 1 )  CALL timing_stop('blk_clio_qsr_oce')
811      !
812   END SUBROUTINE blk_clio_qsr_oce
813
814
815   SUBROUTINE blk_clio_qsr_ice( pa_ice_cs, pa_ice_os, pqsr_ice )
816      !!---------------------------------------------------------------------------
817      !!                     ***  ROUTINE blk_clio_qsr_ice  ***
818      !!                 
819      !!  ** Purpose :   Computation of the shortwave radiation at the ocean and the
820      !!               snow/ice surfaces.
821      !!         
822      !!  ** Method  : - computed qsr from the cloud cover for both ice and ocean
823      !!               - also initialise sbudyko and stauc once for all
824      !!----------------------------------------------------------------------
825      REAL(wp), INTENT(in   ), DIMENSION(:,:,:) ::   pa_ice_cs   ! albedo of ice under clear sky
826      REAL(wp), INTENT(in   ), DIMENSION(:,:,:) ::   pa_ice_os   ! albedo of ice under overcast sky
827      REAL(wp), INTENT(  out), DIMENSION(:,:,:) ::   pqsr_ice    ! shortwave radiation over the ice/snow
828      !!
829      INTEGER, PARAMETER  ::   jp24 = 24   ! sampling of the daylight period (sunrise to sunset) into 24 equal parts
830      !!
831      INTEGER  ::   ji, jj, jl, jt    ! dummy loop indices
832      INTEGER  ::   ijpl              ! number of ice categories (3rd dim of pqsr_ice)
833      INTEGER  ::   indaet            !  = -1, 0, 1 for odd, normal and leap years resp.
834      INTEGER  ::   iday              ! integer part of day
835      !!
836      REAL(wp) ::   zcmue, zcmue2, ztamr          ! temporary scalars
837      REAL(wp) ::   zmt1, zmt2, zmt3              !    -         -
838      REAL(wp) ::   zdecl, zsdecl, zcdecl         !    -         -
839      REAL(wp) ::   zlha, zdaycor, zes            !    -         -
840      REAL(wp) ::   zxday, zdist, zcoef, zcoef1   !    -         -
841      REAL(wp) ::   zqsr_ice_cs, zqsr_ice_os      !    -         -
842
843      REAL(wp), DIMENSION(:,:), POINTER ::   zev                      ! vapour pressure
844      REAL(wp), DIMENSION(:,:), POINTER ::   zdlha, zlsrise, zlsset   ! 2D workspace
845      REAL(wp), DIMENSION(:,:), POINTER ::   zps, zpc   ! sine (cosine) of latitude per sine (cosine) of solar declination
846      !!---------------------------------------------------------------------
847      !
848      IF( nn_timing == 1 )  CALL timing_start('blk_clio_qsr_ice')
849      !
850      CALL wrk_alloc( jpi,jpj, zev, zdlha, zlsrise, zlsset, zps, zpc )
851
852      ijpl = SIZE(pqsr_ice, 3 )      ! number of ice categories
853     
854      ! Saturated water vapour and vapour pressure
855      ! ------------------------------------------
856!CDIR NOVERRCHK
857!CDIR COLLAPSE
858      DO jj = 1, jpj
859!CDIR NOVERRCHK
860         DO ji = 1, jpi           
861            ztamr = sf(jp_tair)%fnow(ji,jj,1) - rtt           
862            zmt1  = SIGN( 17.269,  ztamr )
863            zmt2  = SIGN( 21.875,  ztamr )
864            zmt3  = SIGN( 28.200, -ztamr )
865            zes = 611.0 * EXP(  ABS( ztamr ) * MIN ( zmt1, zmt2 )   &              ! Saturation water vapour
866               &                     / ( sf(jp_tair)%fnow(ji,jj,1) - 35.86  + MAX( 0.e0, zmt3 ) )  )
867            zev(ji,jj) = sf(jp_humi)%fnow(ji,jj,1) * zes * 1.0e-05                 ! vapour pressure 
868         END DO
869      END DO
870
871      !-----------------------------------!
872      !  Computation of solar irradiance  !
873      !-----------------------------------!
874!!gm : hard coded  leap year ???
875      indaet   = 1                                    ! = -1, 0, 1 for odd, normal and leap years resp.
876      zxday = nday_year + rdtbs2 / rday               ! day of the year at which the fluxes are calculated
877      iday  = INT( zxday )                            ! (centred at the middle of the ice time step)
878      CALL flx_blk_declin( indaet, iday, zdecl )      ! solar declination of the current day
879      zsdecl = SIN( zdecl * rad )                     ! its sine
880      zcdecl = COS( zdecl * rad )                     ! its cosine
881
882     
883      !  correction factor added for computation of shortwave flux to take into account the variation of
884      !  the distance between the sun and the earth during the year (Oberhuber 1988)
885      zdist    = zxday * 2. * rpi / REAL(nyear_len(1), wp)
886      zdaycor  = 1.0 + 0.0013 * SIN( zdist ) + 0.0342 * COS( zdist )
887
888!CDIR NOVERRCHK
889      DO jj = 1, jpj
890!CDIR NOVERRCHK
891         DO ji = 1, jpi
892            !  product of sine (cosine) of latitude and sine (cosine) of solar declination
893            zps(ji,jj) = SIN( gphit(ji,jj) * rad ) * zsdecl
894            zpc(ji,jj) = COS( gphit(ji,jj) * rad ) * zcdecl
895            !  computation of the both local time of sunrise and sunset
896            zlsrise(ji,jj) = ACOS( - SIGN( 1.e0, zps(ji,jj) )    &
897               &                   * MIN(  1.e0, SIGN( 1.e0, zps(ji,jj) ) * ( zps(ji,jj) / zpc(ji,jj) )  )   ) 
898            zlsset (ji,jj) = - zlsrise(ji,jj)
899            !  dividing the solar day into jp24 segments of length zdlha
900            zdlha  (ji,jj) = ( zlsrise(ji,jj) - zlsset(ji,jj) ) / REAL( jp24, wp )
901         END DO
902      END DO
903
904
905      !---------------------------------------------!
906      !  shortwave radiation absorbed by the ice    !
907      !---------------------------------------------!
908      ! compute and sum ice qsr over the daylight for each ice categories
909      pqsr_ice(:,:,:) = 0.e0
910      zcoef1 = zdaycor / ( 2. * rpi )       ! Correction for the ellipsity of the earth orbit
911     
912      !                    !----------------------------!
913      DO jl = 1, ijpl      !  loop over ice categories  !
914         !                 !----------------------------!
915!CDIR NOVERRCHK   
916         DO jt = 1, jp24   
917            zcoef = FLOAT( jt ) - 0.5
918!CDIR NOVERRCHK     
919!CDIR COLLAPSE
920            DO jj = 1, jpj
921!CDIR NOVERRCHK
922               DO ji = 1, jpi
923                  zlha = COS(  zlsrise(ji,jj) - zcoef * zdlha(ji,jj)  )                  ! local hour angle
924                  zcmue              = MAX( 0.e0 ,   zps(ji,jj) + zpc(ji,jj) * zlha  )   ! cos of local solar altitude
925                  zcmue2             = 1368.0 * zcmue * zcmue
926                 
927                  !  solar heat flux absorbed by the ice/snow system (Shine and Crane 1984 adapted to high albedo)
928                  zqsr_ice_cs =  ( 1.0 - pa_ice_cs(ji,jj,jl) ) * zdlha(ji,jj) * zcmue2        &   ! clear sky
929                     &        / ( ( 1.0 + zcmue ) * zev(ji,jj) + 1.2 * zcmue + 0.0455 )
930                  zqsr_ice_os = zdlha(ji,jj) * SQRT( zcmue )                                  &   ! overcast sky
931                     &        * ( 53.5 + 1274.5 * zcmue )      * ( 1.0 - 0.996  * pa_ice_os(ji,jj,jl) )    &
932                     &        / (  1.0 + 0.139  * stauc(ji,jj) * ( 1.0 - 0.9435 * pa_ice_os(ji,jj,jl) ) )       
933             
934                  pqsr_ice(ji,jj,jl) = pqsr_ice(ji,jj,jl) + (  ( 1.0 - sf(jp_ccov)%fnow(ji,jj,1) ) * zqsr_ice_cs    &
935                     &                                       +         sf(jp_ccov)%fnow(ji,jj,1)   * zqsr_ice_os  )
936               END DO
937            END DO
938         END DO
939         !
940         ! Correction : Taking into account the ellipsity of the earth orbit
941         pqsr_ice(:,:,jl) = pqsr_ice(:,:,jl) * zcoef1 * tmask(:,:,1)
942         !
943         !                 !--------------------------------!
944      END DO               !  end loop over ice categories  !
945      !                    !--------------------------------!
946
947
948!!gm  : this should be suppress as input data have been passed through lbc_lnk
949      DO jl = 1, ijpl
950         CALL lbc_lnk( pqsr_ice(:,:,jl) , 'T', 1. )
951      END DO
952      !
953      CALL wrk_dealloc( jpi,jpj, zev, zdlha, zlsrise, zlsset, zps, zpc )
954      !
955      IF( nn_timing == 1 )  CALL timing_stop('blk_clio_qsr_ice')
956      !
957   END SUBROUTINE blk_clio_qsr_ice
958
959
960   SUBROUTINE flx_blk_declin( ky, kday, pdecl )
961      !!---------------------------------------------------------------------------
962      !!               ***  ROUTINE flx_blk_declin  ***
963      !!         
964      !! ** Purpose :   Computation of the solar declination for the day
965      !!       
966      !! ** Method  :   ???
967      !!---------------------------------------------------------------------
968      INTEGER , INTENT(in   ) ::   ky      ! = -1, 0, 1 for odd, normal and leap years resp.
969      INTEGER , INTENT(in   ) ::   kday    ! day of the year ( kday = 1 on january 1)
970      REAL(wp), INTENT(  out) ::   pdecl   ! solar declination
971      !!
972      REAL(wp) ::   a0  =  0.39507671      ! coefficients for solar declinaison computation
973      REAL(wp) ::   a1  = 22.85684301      !     "              ""                 "
974      REAL(wp) ::   a2  = -0.38637317      !     "              ""                 "
975      REAL(wp) ::   a3  =  0.15096535      !     "              ""                 "
976      REAL(wp) ::   a4  = -0.00961411      !     "              ""                 "
977      REAL(wp) ::   b1  = -4.29692073      !     "              ""                 "
978      REAL(wp) ::   b2  =  0.05702074      !     "              ""                 "
979      REAL(wp) ::   b3  = -0.09028607      !     "              ""                 "
980      REAL(wp) ::   b4  =  0.00592797
981      !!
982      REAL(wp) ::   zday   ! corresponding day of type year (cf. ky)
983      REAL(wp) ::   zp     ! temporary scalars
984      !!---------------------------------------------------------------------
985           
986      IF    ( ky == 1 )  THEN   ;   zday = REAL( kday, wp ) - 0.5
987      ELSEIF( ky == 3 )  THEN   ;   zday = REAL( kday, wp ) - 1.
988      ELSE                      ;   zday = REAL( kday, wp )
989      ENDIF
990     
991      zp = rpi * ( 2.0 * zday - 367.0 ) / REAL(nyear_len(1), wp)
992     
993      pdecl  = a0                                                                      &
994         &   + a1 * COS( zp ) + a2 * COS( 2. * zp ) + a3 * COS( 3. * zp ) + a4 * COS( 4. * zp )   &
995         &   + b1 * SIN( zp ) + b2 * SIN( 2. * zp ) + b3 * SIN( 3. * zp ) + b4 * SIN( 4. * zp )
996      !
997   END SUBROUTINE flx_blk_declin
998
999   !!======================================================================
1000END MODULE sbcblk_clio
Note: See TracBrowser for help on using the repository browser.