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.
Changeset 9940 – NEMO

Changeset 9940


Ignore:
Timestamp:
2018-07-13T12:18:14+02:00 (6 years ago)
Author:
acc
Message:

Changes to restore restartability and reproducibility with ORCA2_ICE_PISCES SETTE tests with active icebergs. Changes to icbthm.F90 are purely cosmetic or improvements to code efficiency. The key change is the reintroduction of an lbc_lnk for emp in sbcmod after icb_stp. Icebergs that advect into haloes during icb_stp can melt and alter emp (if ln_passive_mode is .false.). These changes are lost across restarts without the halo exchange. This solution is not ideal but no alterantive is apparent with the current icb algorithm. This change restores both restartability and reproducibility with a 990 timestep (495 timestep restart) set of tests. See #2113 for details

Location:
NEMO/trunk/src/OCE
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • NEMO/trunk/src/OCE/ICB/icbthm.F90

    r9598 r9940  
    5050      REAL(wp) ::   zM, zT, zW, zL, zSST, zVol, zLn, zWn, zTn, znVol, zIC, zDn 
    5151      REAL(wp) ::   zMv, zMe, zMb, zmelt, zdvo, zdva, zdM, zSs, zdMe, zdMb, zdMv 
    52       REAL(wp) ::   zMnew, zMnew1, zMnew2, zheat 
     52      REAL(wp) ::   zMnew, zMnew1, zMnew2, zheat, z1_12 
    5353      REAL(wp) ::   zMbits, znMbits, zdMbitsE, zdMbitsM, zLbits, zAbits, zMbb 
    5454      REAL(wp) ::   zxi, zyj, zff, z1_rday, z1_e1e2, zdt, z1_dt, z1_dt_e1e2 
     
    5858      ! 
    5959      z1_rday = 1._wp / rday 
     60      z1_12   = 1._wp / 12._wp 
     61      zdt     = berg_dt 
     62      z1_dt   = 1._wp / zdt 
    6063      ! 
    6164      ! we're either going to ignore berg fresh water melt flux and associated heat 
     
    9194         ij  = mj1( ij ) 
    9295         zVol = zT * zW * zL 
    93          zdt = berg_dt   ;   z1_dt = 1._wp / zdt 
    9496 
    9597         ! Environment 
    9698         zdvo = SQRT( (pt%uvel-pt%uo)**2 + (pt%vvel-pt%vo)**2 ) 
    9799         zdva = SQRT( (pt%ua  -pt%uo)**2 + (pt%va  -pt%vo)**2 ) 
    98          zSs  = 1.5 * SQRT( zdva ) + 0.1 * zdva                ! Sea state      (eqn M.A9) 
     100         zSs  = 1.5_wp * SQRT( zdva ) + 0.1_wp * zdva                ! Sea state      (eqn M.A9) 
    99101 
    100102         ! Melt rates in m/s (i.e. division by rday) 
    101          zMv = MAX( 7.62e-3*zSST+1.29e-3*(zSST**2)            , 0._wp ) * z1_rday   ! Buoyant convection at sides (eqn M.A10) 
    102          zMb = MAX( 0.58*(zdvo**0.8)*(zSST+4.0)/(zL**0.2)      , 0._wp ) * z1_rday   ! Basal turbulent melting     (eqn M.A7 ) 
    103          zMe = MAX( 1./12.*(zSST+2.)*zSs*(1+COS(rpi*(zIC**3))) , 0._wp ) * z1_rday   ! Wave erosion                (eqn M.A8 ) 
     103         zMv = MAX( 7.62d-3*zSST+1.29d-3*(zSST**2)                    , 0._wp ) * z1_rday   ! Buoyant convection at sides (eqn M.A10) 
     104         zMb = MAX( 0.58_wp*(zdvo**0.8_wp)*(zSST+4.0_wp)/(zL**0.2_wp) , 0._wp ) * z1_rday   ! Basal turbulent melting     (eqn M.A7 ) 
     105         zMe = MAX( z1_12*(zSST+2.)*zSs*(1._wp+COS(rpi*(zIC**3)))    , 0._wp ) * z1_rday   ! Wave erosion                (eqn M.A8 ) 
    104106 
    105107         IF( ln_operator_splitting ) THEN      ! Operator split update of volume/mass 
    106108            zTn    = MAX( zT - zMb*zdt , 0._wp )         ! new total thickness (m) 
    107109            znVol  = zTn * zW * zL                       ! new volume (m^3) 
    108             zMnew1 = (znVol/zVol) * zM                   ! new mass (kg) 
     110            zMnew1 = ( znVol / zVol ) * zM               ! new mass (kg) 
    109111            zdMb   = zM - zMnew1                         ! mass lost to basal melting (>0) (kg) 
    110112            ! 
     
    112114            zWn    = MAX( zW - zMv*zdt , 0._wp )         ! new width (m) 
    113115            znVol  = zTn * zWn * zLn                     ! new volume (m^3) 
    114             zMnew2 = (znVol/zVol) * zM                   ! new mass (kg) 
     116            zMnew2 = ( znVol / zVol ) * zM               ! new mass (kg) 
    115117            zdMv   = zMnew1 - zMnew2                     ! mass lost to buoyant convection (>0) (kg) 
    116118            ! 
     
    142144            zLbits   = MIN( zL, zW, zT, 40._wp )                                     ! assume bergy bits are smallest dimension or 40 meters 
    143145            zAbits   = ( zMbits / rn_rho_bergs ) / zLbits                            ! Effective bottom area (assuming T=Lbits) 
    144             zMbb     = MAX( 0.58*(zdvo**0.8)*(zSST+2.0)/(zLbits**0.2), 0.) * z1_rday ! Basal turbulent melting (for bits) 
     146            zMbb     = MAX( 0.58_wp*(zdvo**0.8_wp)*(zSST+2._wp) /   & 
     147               &                              ( zLbits**0.2_wp ) , 0._wp ) * z1_rday ! Basal turbulent melting (for bits) 
    145148            zMbb     = rn_rho_bergs * zAbits * zMbb                                  ! in kg/s 
    146149            zdMbitsM = MIN( zMbb*zdt , znMbits )                                     ! bergy bits mass lost to melting (kg) 
  • NEMO/trunk/src/OCE/SBC/sbcmod.F90

    r9656 r9940  
    4646   USE sbcfwb         ! surface boundary condition: freshwater budget 
    4747   USE icbstp         ! Icebergs 
     48   USE icb_oce  , ONLY : ln_passive_mode      ! iceberg interaction mode 
    4849   USE traqsr         ! active tracers: light penetration 
    4950   USE sbcwave        ! Wave module 
     
    432433      END SELECT 
    433434 
    434       IF( ln_icebergs    )   CALL icb_stp( kt )                   ! compute icebergs 
     435      IF( ln_icebergs    )   THEN 
     436                                     CALL icb_stp( kt )           ! compute icebergs 
     437         ! icebergs may advect into haloes during the icb step and alter emp. 
     438         ! A lbc_lnk is necessary here to ensure restartability (#2113) 
     439         IF( .NOT. ln_passive_mode ) CALL lbc_lnk( emp, 'T', 1. ) ! ensure restartability with icebergs 
     440      ENDIF 
    435441 
    436442      IF( ln_isf         )   CALL sbc_isf( kt )                   ! compute iceshelves 
Note: See TracChangeset for help on using the changeset viewer.