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

source: branches/UKMO/test_moci_test_suite_namelist_read/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk_clio.F90 @ 9383

Last change on this file since 9383 was 9383, checked in by andmirek, 6 years ago

#2050 fixes and changes

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