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.
sbcabl.F90 in NEMO/branches/2020/dev_r12563_ASINTER-06_ABL_improvement/src/ABL – NEMO

source: NEMO/branches/2020/dev_r12563_ASINTER-06_ABL_improvement/src/ABL/sbcabl.F90 @ 12770

Last change on this file since 12770 was 12770, checked in by gsamson, 4 years ago

fix ABL restartability issue (ticket #2419)

File size: 20.4 KB
RevLine 
[11305]1MODULE sbcabl
2   !!======================================================================
3   !!                       ***  MODULE  sbcabl  ***
[12199]4   !! Ocean forcing:  momentum, heat and freshwater flux formulation
5   !!                 derived from an ABL model
[11305]6   !!=====================================================================
7   !! History :  4.0  !  2019-03  (F. Lemarié & G. Samson)  Original code
8   !!----------------------------------------------------------------------
9
10   !!----------------------------------------------------------------------
[12199]11   !!   sbc_abl_init  : Initialization of ABL model based on namelist options
12   !!   sbc_abl       : driver for the computation of momentum, heat and freshwater
[11305]13   !!                   fluxes over ocean via the ABL model
14   !!----------------------------------------------------------------------
15   USE abl            ! ABL
16   USE par_abl        ! abl parameters
17   USE ablmod
[11858]18   USE ablrst
[11305]19
20   USE phycst         ! physical constants
21   USE fldread        ! read input fields
22   USE sbc_oce        ! Surface boundary condition: ocean fields
23   USE sbcblk         ! Surface boundary condition: bulk formulae
[12021]24   USE sbcblk_phy     ! Surface boundary condition: bulk formulae
[11305]25   USE dom_oce, ONLY  : tmask
26   !
27   USE iom            ! I/O manager library
28   USE in_out_manager ! I/O manager
29   USE lib_mpp        ! distribued memory computing library
30   USE lib_fortran    ! to use key_nosignedzero
31   USE timing         ! Timing
32   USE lbclnk         ! ocean lateral boundary conditions (or mpp link)
33   USE prtctl         ! Print control
[11334]34#if defined key_si3
35   USE ice    , ONLY : u_ice, v_ice, tm_su, ato_i      ! ato_i = total open water fractional area
36   USE sbc_ice, ONLY : wndm_ice, utau_ice, vtau_ice
[12199]37#endif
[11334]38#if ! defined key_iomput
39   USE diawri    , ONLY : dia_wri_alloc_abl
40#endif
[11305]41   IMPLICIT NONE
42   PRIVATE
43
44   PUBLIC   sbc_abl_init       ! routine called in sbcmod module
45   PUBLIC   sbc_abl            ! routine called in sbcmod module
46
47   !!----------------------------------------------------------------------
48   !! NEMO/OPA 3.7 , NEMO-consortium (2014)
49   !! $Id: sbcabl.F90 6416 2016-04-01 12:22:17Z clem $
50   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
51   !!----------------------------------------------------------------------
52CONTAINS
53
54   SUBROUTINE sbc_abl_init
55      !!---------------------------------------------------------------------
56      !!                    ***  ROUTINE sbc_abl_init  ***
57      !!
58      !! ** Purposes :   - read namelist section namsbc_abl
[12199]59      !!                 - initialize and check parameter values
60      !!                 - initialize variables of ABL model
[11305]61      !!
62      !!----------------------------------------------------------------------
63      INTEGER            ::   ji, jj, jk, jbak, jbak_dta       ! dummy loop indices
64      INTEGER            ::   ios, ierror, ioptio              ! Local integer
65      INTEGER            ::   inum, indims, idimsz(4), id
66      CHARACTER(len=100) ::   cn_dir, cn_dom                   ! Atmospheric grid directory
67      REAL(wp)           ::   zcff,zcff1
68      LOGICAL            ::   lluldl
[11858]69      NAMELIST/namsbc_abl/ cn_dir, cn_dom, cn_ablrst_in, cn_ablrst_out,           &
[12588]70         &                 cn_ablrst_indir, cn_ablrst_outdir, ln_rstart_abl,      &
[11858]71         &                 ln_hpgls_frc, ln_geos_winds, nn_dyn_restore,           &
[11305]72         &                 rn_ldyn_min , rn_ldyn_max, rn_ltra_min, rn_ltra_max,   &
[12588]73         &                 nn_amxl, rn_Cm, rn_Ct, rn_Ce, rn_Ceps, rn_Rod, rn_Ric, &
[12199]74         &                 ln_smth_pblh
[11305]75      !!---------------------------------------------------------------------
76
[12588]77                                        ! Namelist namsbc_abl in reference namelist : ABL parameters
[11305]78      READ  ( numnam_ref, namsbc_abl, IOSTAT = ios, ERR = 901 )
[11348]79901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namsbc_abl in reference namelist' )
[12588]80      !
81                                        ! Namelist namsbc_abl in configuration namelist : ABL parameters
[11305]82      READ  ( numnam_cfg, namsbc_abl, IOSTAT = ios, ERR = 902 )
[11348]83902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namsbc_abl in configuration namelist' )
[11305]84      !
85      IF(lwm) WRITE( numond, namsbc_abl )
86      !
[12199]87      ! Check ABL mixing length option
[11305]88      IF( nn_amxl  < 0   .OR.  nn_amxl  > 2 )   &
[12199]89         &                 CALL ctl_stop( 'abl_init : bad flag, nn_amxl must be  0, 1 or 2 ' )
[11305]90      !
[12199]91      ! Check ABL dyn restore option
[11305]92      IF( nn_dyn_restore  < 0   .OR.  nn_dyn_restore  > 2 )   &
[12199]93         &                 CALL ctl_stop( 'abl_init : bad flag, nn_dyn_restore must be  0, 1 or 2 ' )
[12063]94
[11305]95      !!---------------------------------------------------------------------
96      !! Control prints
[12199]97      !!---------------------------------------------------------------------
[11305]98      IF(lwp) THEN                              ! Control print (other namelist variable)
99         WRITE(numout,*)
100         WRITE(numout,*) '      ABL -- cn_dir         = ', cn_dir
101         WRITE(numout,*) '      ABL -- cn_dom         = ', cn_dom
102         IF( ln_hpgls_frc ) THEN
103            WRITE(numout,*) '      ABL -- winds forced by large-scale pressure gradient'
104            IF(ln_geos_winds) THEN
105               ln_geos_winds = .FALSE.
[12199]106               WRITE(numout,*) '      ABL -- geostrophic guide disabled (not compatible with ln_hpgls_frc = .T.)'
[11305]107            END IF
108         ELSE IF( ln_geos_winds ) THEN
[12199]109            WRITE(numout,*) '      ABL -- winds forced by geostrophic winds'
[11305]110         ELSE
[12199]111            WRITE(numout,*) '      ABL -- Geostrophic winds and large-scale pressure gradient are ignored'
[11305]112         END IF
113         !
114         SELECT CASE ( nn_dyn_restore )
[12199]115         CASE ( 0 )
116            WRITE(numout,*) '      ABL -- No restoring for ABL winds'
[11305]117         CASE ( 1 )
[12199]118            WRITE(numout,*) '      ABL -- Restoring of ABL winds only in the equatorial region '
[11305]119         CASE ( 2 )
[12199]120            WRITE(numout,*) '      ABL -- Restoring of ABL winds activated everywhere '
[11305]121         END SELECT
122         !
[12199]123         IF( ln_smth_pblh )  WRITE(numout,*) '      ABL -- Smoothing of PBL height is activated'
124         !
[11305]125      ENDIF
126
127      !!---------------------------------------------------------------------
128      !! Convert nudging coefficient from hours to 1/sec
[12199]129      !!---------------------------------------------------------------------
[11305]130      zcff        = 1._wp / 3600._wp
131      rn_ldyn_min = zcff / rn_ldyn_min
[12199]132      rn_ldyn_max = zcff / rn_ldyn_max
[11305]133      rn_ltra_min = zcff / rn_ltra_min
[12199]134      rn_ltra_max = zcff / rn_ltra_max
[11305]135
136      !!---------------------------------------------------------------------
[12199]137      !! ABL grid initialization
138      !!---------------------------------------------------------------------
139      CALL iom_open( TRIM(cn_dir)//TRIM(cn_dom), inum )
[11305]140      id     = iom_varid( inum, 'e3t_abl', kdimsz=idimsz, kndims=indims, lduld=lluldl )
[12199]141      jpka   = idimsz(indims - COUNT( (/lluldl/) ) )
[11305]142      jpkam1 = jpka - 1
143
144      IF( abl_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'abl_init : unable to allocate arrays' )
145      CALL iom_get( inum, jpdom_unknown, 'e3t_abl', e3t_abl(:) )
146      CALL iom_get( inum, jpdom_unknown, 'e3w_abl', e3w_abl(:) )
147      CALL iom_get( inum, jpdom_unknown, 'ght_abl', ght_abl(:) )
148      CALL iom_get( inum, jpdom_unknown, 'ghw_abl', ghw_abl(:) )
149      CALL iom_close( inum )
[11348]150
[11334]151#if ! defined key_iomput
[12199]152      IF( dia_wri_alloc_abl()  /= 0 ) CALL ctl_stop( 'STOP', 'abl_init : unable to allocate arrays' )
[11334]153#endif
[11305]154
155      IF(lwp) THEN
156         WRITE(numout,*)
157         WRITE(numout,*) '    sbc_abl_init   : ABL Reference vertical grid'
[12199]158         WRITE(numout,*) '    ~~~~~~~'
[11305]159         WRITE(numout, "(9x,'  level ght_abl   ghw_abl   e3t_abl   e3w_abl  ')" )
160         WRITE(numout, "(10x, i4, 4f9.2)" ) ( jk, ght_abl(jk), ghw_abl(jk), e3t_abl(jk), e3w_abl(jk), jk = 1, jpka )
161      END IF
162
163      !!---------------------------------------------------------------------
[12199]164      !! Check TKE closure parameters
165      !!---------------------------------------------------------------------
[11305]166      rn_Sch  = rn_ce / rn_cm
167      mxl_min = (avm_bak / rn_cm) / sqrt( tke_min )
[12588]168      rn_Esfc =  1._wp / SQRT(rn_cm*rn_ceps)
169      rn_Lsfc = vkarmn * SQRT(SQRT(rn_cm*rn_ceps)) / rn_cm
[12749]170
[11305]171      IF(lwp) THEN
172         WRITE(numout,*)
173         WRITE(numout,*) '    abl_zdf_tke   : ABL TKE turbulent closure'
[12199]174         WRITE(numout,*) '    ~~~~~~~~~~~'
[11305]175         IF(nn_amxl==0) WRITE(numout,*) 'Deardorff 80 length-scale '
[12588]176         IF(nn_amxl==1) WRITE(numout,*) 'Modified Deardorff 80 length-scale '
[12749]177         IF(nn_amxl==2) WRITE(numout,*) 'Bougeault and Lacarrere length-scale '     
[12588]178         IF(nn_amxl==3) WRITE(numout,*) 'Rodier et al. length-scale '   
[11305]179         WRITE(numout,*) ' Minimum value of atmospheric TKE           = ',tke_min,' m^2 s^-2'
180         WRITE(numout,*) ' Minimum value of atmospheric mixing length = ',mxl_min,' m'
[12199]181         WRITE(numout,*) ' Constant for turbulent viscosity           = ',rn_Cm
182         WRITE(numout,*) ' Constant for turbulent diffusivity         = ',rn_Ct
183         WRITE(numout,*) ' Constant for Schmidt number                = ',rn_Sch
184         WRITE(numout,*) ' Constant for TKE dissipation               = ',rn_Ceps
[12588]185         WRITE(numout,*) ' Constant for TKE sfc boundary condition    = ',rn_Esfc
186         WRITE(numout,*) ' Constant for mxl sfc boundary condition    = ',rn_Lsfc
[11305]187      END IF
188
189      !!-------------------------------------------------------------------------------------------
190      !! Compute parameters to build the vertical profile for the nudging term (used in abl_stp())
[12199]191      !!-------------------------------------------------------------------------------------------
[11305]192      zcff1       = 1._wp / ( jp_bmax - jp_bmin )**3
193      ! for active tracers
194      jp_alp3_tra = -2._wp * zcff1                       * ( rn_ltra_max - rn_ltra_min )
195      jp_alp2_tra =  3._wp * zcff1 * (jp_bmax + jp_bmin) * ( rn_ltra_max - rn_ltra_min )
196      jp_alp1_tra = -6._wp * zcff1 *  jp_bmax * jp_bmin  * ( rn_ltra_max - rn_ltra_min )
197      jp_alp0_tra = zcff1 * (  rn_ltra_max * jp_bmin*jp_bmin * (3._wp*jp_bmax - jp_bmin)      &
[12199]198         &                   - rn_ltra_min * jp_bmax*jp_bmax * (3._wp*jp_bmin - jp_bmax) )
[11305]199      ! for dynamics
200      jp_alp3_dyn = -2._wp * zcff1                       * ( rn_ldyn_max - rn_ldyn_min )
201      jp_alp2_dyn =  3._wp * zcff1 * (jp_bmax + jp_bmin) * ( rn_ldyn_max - rn_ldyn_min )
202      jp_alp1_dyn = -6._wp * zcff1 *  jp_bmax * jp_bmin  * ( rn_ldyn_max - rn_ldyn_min )
203      jp_alp0_dyn = zcff1 * (  rn_ldyn_max * jp_bmin*jp_bmin * (3._wp*jp_bmax - jp_bmin)      &
[12199]204         &                   - rn_ldyn_min * jp_bmax*jp_bmax * (3._wp*jp_bmin - jp_bmax) )
[11305]205
206      jp_pblh_min = ghw_abl(     4) / jp_bmin  !<-- at least 3 grid points at the bottom have value rn_ltra_min
207      jp_pblh_max = ghw_abl(jpka-3) / jp_bmax  !<-- at least 3 grid points at the top    have value rn_ltra_max
208
[11363]209      ! ABL timestep
[12489]210      rDt_abl = nn_fsbc * rn_Dt
[11363]211
[11305]212      ! Check parameters for dynamics
[11363]213      zcff  = ( jp_alp3_dyn * jp_bmin**3 + jp_alp2_dyn * jp_bmin**2   &
[12489]214         &    + jp_alp1_dyn * jp_bmin    + jp_alp0_dyn ) * rDt_abl
[11363]215      zcff1 = ( jp_alp3_dyn * jp_bmax**3 + jp_alp2_dyn * jp_bmax**2   &
[12489]216         &    + jp_alp1_dyn * jp_bmax    + jp_alp0_dyn ) * rDt_abl
[11305]217      IF(lwp) THEN
218         IF(nn_dyn_restore > 0) THEN
[11363]219            WRITE(numout,*) ' ABL Minimum value for dynamics restoring = ',zcff
220            WRITE(numout,*) ' ABL Maximum value for dynamics restoring = ',zcff1
[11305]221            ! Check that restoring coefficients are between 0 and 1
[11586]222            IF( zcff1 - nn_fsbc > 0.001_wp .OR. zcff1 < 0._wp )   &
[11305]223               &                   CALL ctl_stop( 'abl_init : wrong value for rn_ldyn_max' )
[11586]224            IF( zcff  - nn_fsbc > 0.001_wp .OR. zcff  < 0._wp )   &
[11305]225               &                   CALL ctl_stop( 'abl_init : wrong value for rn_ldyn_min' )
[11363]226            IF( zcff  > zcff1                    )   &
[11586]227               &                   CALL ctl_stop( 'abl_init : rn_ldyn_max must be smaller than rn_ldyn_min' )
[11305]228         END IF
229      END IF
230
231      ! Check parameters for active tracers
[11363]232      zcff  = ( jp_alp3_tra * jp_bmin**3 + jp_alp2_tra * jp_bmin**2   &
[12489]233         &    + jp_alp1_tra * jp_bmin    + jp_alp0_tra ) * rDt_abl
[11363]234      zcff1 = ( jp_alp3_tra * jp_bmax**3 + jp_alp2_tra * jp_bmax**2   &
[12489]235         &    + jp_alp1_tra * jp_bmax    + jp_alp0_tra ) * rDt_abl
[11305]236      IF(lwp) THEN
[11363]237         WRITE(numout,*) ' ABL Minimum value for tracers restoring = ',zcff
238         WRITE(numout,*) ' ABL Maximum value for tracers restoring = ',zcff1
[11305]239         ! Check that restoring coefficients are between 0 and 1
[11586]240         IF( zcff1 - nn_fsbc > 0.001_wp .OR. zcff1 < 0._wp )   &
[11305]241            &                   CALL ctl_stop( 'abl_init : wrong value for rn_ltra_max' )
[11586]242         IF( zcff  - nn_fsbc > 0.001_wp .OR. zcff  < 0._wp )   &
[11305]243            &                   CALL ctl_stop( 'abl_init : wrong value for rn_ltra_min' )
[11363]244         IF( zcff  > zcff1                    )   &
[11586]245            &                   CALL ctl_stop( 'abl_init : rn_ltra_max must be smaller than rn_ltra_min' )
[11305]246      END IF
247
248      !!-------------------------------------------------------------------------------------------
249      !! Initialize Coriolis frequency, equatorial restoring and land/sea mask
[12199]250      !!-------------------------------------------------------------------------------------------
[11305]251      fft_abl(:,:) = 2._wp * omega * SIN( rad * gphit(:,:) )
252
253      ! Equatorial restoring
254      IF( nn_dyn_restore == 1 ) THEN
[12199]255         zcff         = 2._wp * omega * SIN( rad * 90._wp )   !++ fmax
[11363]256         rest_eq(:,:) = SIN( 0.5_wp*rpi*( (fft_abl(:,:) - zcff) / zcff ) )**8
[11305]257      ELSE
258         rest_eq(:,:) = 1._wp
259      END IF
260      ! T-mask
261      msk_abl(:,:) = tmask(:,:,1)
262
[12199]263      !!-------------------------------------------------------------------------------------------
[11305]264
265      ! initialize 2D bulk fields AND 3D abl data
266      CALL sbc_blk_init
267
268      ! Initialize the time index for now time (nt_n) and after time (nt_a)
[12770]269      nt_n = 1 + MOD( nit000+1, 2)
270      nt_a = 1 + MOD( nit000  , 2)
[11305]271
[11858]272      ! initialize ABL from data or restart
[12588]273      IF( ln_rstart_abl ) THEN
[11858]274         CALL abl_rst_read
275      ELSE
276         CALL fld_read( nit000, nn_fsbc, sf ) ! input fields provided at the first time-step
[11305]277
[12588]278          u_abl(:,:,:,nt_n      ) = sf(jp_wndi)%fnow(:,:,:)
279          v_abl(:,:,:,nt_n      ) = sf(jp_wndj)%fnow(:,:,:)
[11858]280         tq_abl(:,:,:,nt_n,jp_ta) = sf(jp_tair)%fnow(:,:,:)
281         tq_abl(:,:,:,nt_n,jp_qa) = sf(jp_humi)%fnow(:,:,:)
[12199]282
[11858]283         tke_abl(:,:,:,nt_n     ) = tke_min
284         avm_abl(:,:,:          ) = avm_bak
285         avt_abl(:,:,:          ) = avt_bak
[12199]286         pblh   (:,:            ) = ghw_abl( 3 )  !<-- assume that the pbl contains 3 grid points
[11858]287         u_abl  (:,:,:,nt_a     ) = 0._wp
288         v_abl  (:,:,:,nt_a     ) = 0._wp
289         tq_abl (:,:,:,nt_a,:   ) = 0._wp
290         tke_abl(:,:,:,nt_a     ) = 0._wp
[12592]291
292         mxlm_abl(:,:,:         ) = mxl_min
293         mxld_abl(:,:,:         ) = mxl_min
[11858]294      ENDIF
[12021]295
296      rhoa(:,:) = rho_air( tq_abl(:,:,2,nt_n,jp_ta), tq_abl(:,:,2,nt_n,jp_qa), sf(jp_slp)%fnow(:,:,1) ) !!GS: rhoa must be (re)computed here here to avoid division by zero in blk_ice_1 (TBI)
[12199]297
[11305]298   END SUBROUTINE sbc_abl_init
299
300
301   SUBROUTINE sbc_abl( kt )
302      !!---------------------------------------------------------------------
303      !!                     ***  ROUTINE sbc_abl  ***
304      !!
305      !! ** Purpose :   provide the momentum, heat and freshwater fluxes at
[12199]306      !!      the ocean surface from an ABL calculation at each oceanic time step
[11305]307      !!
[12199]308      !! ** Method  :
[11305]309      !!              - Pre-compute part of turbulent fluxes in blk_oce_1
[12199]310      !!              - Perform 1 time-step of the ABL model
[11305]311      !!              - Finalize flux computation in blk_oce_2
312      !!
313      !! ** Outputs : - utau    : i-component of the stress at U-point  (N/m2)
314      !!              - vtau    : j-component of the stress at V-point  (N/m2)
315      !!              - taum    : Wind stress module at T-point         (N/m2)
316      !!              - wndm    : Wind speed module at T-point          (m/s)
317      !!              - qsr     : Solar heat flux over the ocean        (W/m2)
318      !!              - qns     : Non Solar heat flux over the ocean    (W/m2)
319      !!              - emp     : evaporation minus precipitation       (kg/m2/s)
320      !!
321      !!---------------------------------------------------------------------
322      INTEGER ,         INTENT(in) ::   kt   ! ocean time step
323      !!
324      REAL(wp), DIMENSION(jpi,jpj) ::   zssq, zcd_du, zsen, zevp
[11334]325#if defined key_si3
326      REAL(wp), DIMENSION(jpi,jpj) ::   zssqi, zcd_dui, zseni, zevpi
[12199]327#endif
[11305]328      INTEGER                      ::   jbak, jbak_dta, ji, jj
329      !!---------------------------------------------------------------------
330      !
331      !!-------------------------------------------------------------------------------------------
332      !! 1 - Read Atmospheric 3D data for large-scale forcing
333      !!-------------------------------------------------------------------------------------------
[12199]334
[11305]335      CALL fld_read( kt, nn_fsbc, sf )             ! input fields provided at the current time-step
[12199]336
[11305]337      !!-------------------------------------------------------------------------------------------
338      !! 2 - Compute Cd x ||U||, Ch x ||U||, Ce x ||U||, and SSQ using now fields
[12199]339      !!-------------------------------------------------------------------------------------------
[11334]340
[11348]341      CALL blk_oce_1( kt,  u_abl(:,:,2,nt_n      ),  v_abl(:,:,2,nt_n      ),   &   !   <<= in
342         &                tq_abl(:,:,2,nt_n,jp_ta), tq_abl(:,:,2,nt_n,jp_qa),   &   !   <<= in
343         &                sf(jp_slp )%fnow(:,:,1) , sst_m, ssu_m, ssv_m     ,   &   !   <<= in
[12015]344         &                sf(jp_qsr )%fnow(:,:,1) , sf(jp_qlw )%fnow(:,:,1) ,   &   !   <<= in
[12199]345         &                tsk_m, zssq, zcd_du, zsen, zevp                       )   !   =>> out
346
[11334]347#if defined key_si3
[11360]348      CALL blk_ice_1(  u_abl(:,:,2,nt_n      ),  v_abl(:,:,2,nt_n      ),    &   !   <<= in
349         &            tq_abl(:,:,2,nt_n,jp_ta), tq_abl(:,:,2,nt_n,jp_qa),    &   !   <<= in
350         &            sf(jp_slp)%fnow(:,:,1)  ,  u_ice, v_ice, tm_su    ,    &   !   <<= in
351         &            pseni=zseni, pevpi=zevpi, pssqi=zssqi, pcd_dui=zcd_dui )   !   <<= out
[12199]352#endif
[11334]353
[11305]354      !!-------------------------------------------------------------------------------------------
355      !! 3 - Advance ABL variables from now (n) to after (n+1)
[12199]356      !!-------------------------------------------------------------------------------------------
357
358      CALL abl_stp( kt, tsk_m, ssu_m, ssv_m, zssq,                          &   !   <<= in
[11348]359         &              sf(jp_wndi)%fnow(:,:,:), sf(jp_wndj)%fnow(:,:,:),   &   !   <<= in
360         &              sf(jp_tair)%fnow(:,:,:), sf(jp_humi)%fnow(:,:,:),   &   !   <<= in
361         &              sf(jp_slp )%fnow(:,:,1),                            &   !   <<= in
362         &              sf(jp_hpgi)%fnow(:,:,:), sf(jp_hpgj)%fnow(:,:,:),   &   !   <<= in
363         &              zcd_du, zsen, zevp,                                 &   !   <=> in/out
364         &              wndm, utau, vtau, taum                              &   !   =>> out
[12199]365#if defined key_si3
[11348]366         &            , tm_su, u_ice, v_ice, zssqi, zcd_dui                 &   !   <<= in
367         &            , zseni, zevpi, wndm_ice, ato_i                       &   !   <<= in
368         &            , utau_ice, vtau_ice                                  &   !   =>> out
[12199]369#endif
[11348]370         &                                                                  )
[11305]371      !!-------------------------------------------------------------------------------------------
[12199]372      !! 4 - Finalize flux computation using ABL variables at (n+1), nt_n corresponds to (n+1) since
[11305]373      !!                                                                time swap is done in abl_stp
[12199]374      !!-------------------------------------------------------------------------------------------
[11305]375
[11360]376      CALL blk_oce_2( tq_abl(:,:,2,nt_n,jp_ta),                            &
377         &            sf(jp_qsr )%fnow(:,:,1) , sf(jp_qlw )%fnow(:,:,1),   &
378         &            sf(jp_prec)%fnow(:,:,1) , sf(jp_snow)%fnow(:,:,1),   &
[12199]379         &            tsk_m, zsen, zevp                                )
[11305]380
[12199]381      CALL abl_rst_opn( kt )                       ! Open abl restart file (if necessary)
382      IF( lrst_abl ) CALL abl_rst_write( kt )      ! -- abl restart file
[11858]383
[11334]384#if defined key_si3
[11348]385      ! Avoid a USE abl in icesbc module
[11334]386      sf(jp_tair)%fnow(:,:,1) = tq_abl(:,:,2,nt_n,jp_ta);  sf(jp_humi)%fnow(:,:,1) = tq_abl(:,:,2,nt_n,jp_qa)
[12199]387#endif
[11334]388
[11305]389   END SUBROUTINE sbc_abl
390
391   !!======================================================================
392END MODULE sbcabl
Note: See TracBrowser for help on using the repository browser.