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

source: branches/2013/dev_CMCC_INGV_2013/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk_clio.F90 @ 4217

Last change on this file since 4217 was 4217, checked in by poddo, 11 years ago

Solved problems with namelist parameter land/sea mask

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