Changeset 13454


Ignore:
Timestamp:
2020-09-08T15:50:53+02:00 (6 months ago)
Author:
dancopsey
Message:

Merge in Catherine Guiavarch's change to implement implicit ice drag to improve stability. Her changes were implemented in:

https://code.metoffice.gov.uk/trac/roses-u/changeset?reponame=&new=161415%40b%2Fv%2F1%2F1%2F4&old=161163%40b%2Fv%2F1%2F1%2F4

Location:
NEMO/branches/UKMO/NEMO_4.0.1_FKOSM_m11715
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/UKMO/NEMO_4.0.1_FKOSM_m11715/cfgs/SHARED/namelist_ref

    r13403 r13454  
    678678   ! 
    679679   ln_drgimp   = .true.    !  implicit top/bottom friction flag 
     680      ln_drgice_imp = .false. ! implicit ice-ocean drag 
    680681/ 
    681682!----------------------------------------------------------------------- 
  • NEMO/branches/UKMO/NEMO_4.0.1_FKOSM_m11715/src/ICE/iceupdate.F90

    r11715 r13454  
    2626   USE icectl         ! sea-ice: control prints 
    2727   USE bdy_oce , ONLY : ln_bdy 
     28   USE zdfdrg , ONLY: ln_drgice_imp 
    2829   ! 
    2930   USE in_out_manager ! I/O manager 
     
    323324      REAL(wp) ::   zat_u, zutau_ice, zu_t, zmodt   ! local scalar 
    324325      REAL(wp) ::   zat_v, zvtau_ice, zv_t, zrhoco  !   -      - 
     326      REAL(wp) ::   zflagi                          !   -      - 
    325327      !!--------------------------------------------------------------------- 
    326328      IF( ln_timing )   CALL timing_start('ice_update_tau') 
     
    355357      ! 
    356358      !                                      !==  every ocean time-step  ==! 
     359      IF ( ln_drgice_imp ) THEN 
     360         ! Save drag with right sign to update top drag in the ocean implicit 
     361         ! friction  
     362         rCdU_ice(:,:) = -r1_rau0 * tmod_io(:,:) * at_i(:,:) * tmask(:,:,1)  
     363         zflagi = 0._wp 
     364      ELSE 
     365         zflagi = 1._wp 
     366      ENDIF 
    357367      ! 
    358368      DO jj = 2, jpjm1                                !* update the stress WITHOUT an ice-ocean rotation angle 
     
    364374               &     / MAX( 1.0_wp , tmask(ji,jj,1) + tmask(ji  ,jj+1,1) ) 
    365375            !                                                   ! linearized quadratic drag formulation 
    366             zutau_ice   = 0.5_wp * ( tmod_io(ji,jj) + tmod_io(ji+1,jj) ) * ( u_ice(ji,jj) - pu_oce(ji,jj) ) 
    367             zvtau_ice   = 0.5_wp * ( tmod_io(ji,jj) + tmod_io(ji,jj+1) ) * ( v_ice(ji,jj) - pv_oce(ji,jj) ) 
     376            zutau_ice   = 0.5_wp * ( tmod_io(ji,jj) + tmod_io(ji+1,jj) ) * ( u_ice(ji,jj) - zflagi * pu_oce(ji,jj) ) 
     377            zvtau_ice   = 0.5_wp * ( tmod_io(ji,jj) + tmod_io(ji,jj+1) ) * ( v_ice(ji,jj) - zflagi * pv_oce(ji,jj) ) 
    368378            !                                                   ! stresses at the ocean surface 
    369379            utau(ji,jj) = ( 1._wp - zat_u ) * utau_oce(ji,jj) + zat_u * zutau_ice 
  • NEMO/branches/UKMO/NEMO_4.0.1_FKOSM_m11715/src/OCE/DYN/dynnxt.F90

    r11715 r13454  
    4848   USE prtctl         ! Print control 
    4949   USE timing         ! Timing 
     50   USE zdfdrg, ONLY: ln_drgice_imp, rCdU_top 
    5051#if defined key_agrif 
    5152   USE agrif_oce_interp 
     
    99100      REAL(wp) ::   zve3a, zve3n, zve3b, zvf, z1_2dt   !   -      - 
    100101      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zue, zve 
     102      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zutau, zvtau 
    101103      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ze3u_f, ze3v_f, zua, zva  
    102104      !!---------------------------------------------------------------------- 
     
    368370      ENDIF 
    369371      ! 
     372      IF ( iom_use("utau") ) THEN 
     373         IF ( ln_drgice_imp.OR.ln_isfcav ) THEN 
     374            ALLOCATE(zutau(jpi,jpj))  
     375            DO jj = 2, jpjm1 
     376               DO ji = 2, jpim1 
     377                  jk = miku(ji,jj)  
     378                  zutau(ji,jj) = utau(ji,jj) &  
     379                  &  + 0.5_wp * rau0 * (rCdU_top(ji+1,jj)+rCdU_top(ji,jj)) * ua(ji,jj,jk)  
     380               END DO 
     381            END DO 
     382            CALL lbc_lnk( 'dynnxt' , zutau, 'U', -1.) 
     383            CALL iom_put(  "utau", zutau(:,:) ) 
     384            DEALLOCATE(zutau) 
     385         ELSE 
     386            CALL iom_put(  "utau", utau(:,:) ) 
     387         ENDIF 
     388      ENDIF 
     389      ! 
     390      IF ( iom_use("vtau") ) THEN 
     391         IF ( ln_drgice_imp.OR.ln_isfcav ) THEN 
     392            ALLOCATE(zvtau(jpi,jpj)) 
     393            DO jj = 2, jpjm1 
     394               DO ji = 2, jpim1 
     395                  jk = mikv(ji,jj) 
     396                  zvtau(ji,jj) = vtau(ji,jj) & 
     397                  &  + 0.5_wp * rau0 * (rCdU_top(ji,jj+1)+rCdU_top(ji,jj)) * va(ji,jj,jk) 
     398               END DO 
     399            END DO 
     400            CALL lbc_lnk( 'dynnxt' , zvtau, 'V', -1.) 
     401            CALL iom_put(  "vtau", zvtau(:,:) ) 
     402            DEALLOCATE(zvtau) 
     403         ELSE 
     404            CALL iom_put(  "vtau", vtau(:,:) ) 
     405         ENDIF 
     406      ENDIF 
     407      ! 
    370408      IF(ln_ctl)   CALL prt_ctl( tab3d_1=un, clinfo1=' nxt  - Un: ', mask1=umask,   & 
    371409         &                       tab3d_2=vn, clinfo2=' Vn: '       , mask2=vmask ) 
  • NEMO/branches/UKMO/NEMO_4.0.1_FKOSM_m11715/src/OCE/DYN/dynspg_ts.F90

    r11715 r13454  
    14691469      !                    !==  Set the barotropic drag coef.  ==! 
    14701470      ! 
    1471       IF( ln_isfcav ) THEN          ! top+bottom friction (ocean cavities) 
     1471      IF( ln_isfcav.OR.ln_drgice_imp ) THEN          ! top+bottom friction (ocean cavities) 
    14721472          
    14731473         DO jj = 2, jpjm1 
     
    15321532      !                    !==  TOP stress contribution from baroclinic velocities  ==!   (no W/D case) 
    15331533      ! 
    1534       IF( ln_isfcav ) THEN 
     1534      IF( ln_isfcav.OR.ln_drgice_imp ) THEN 
    15351535         ! 
    15361536         IF( ln_bt_fw ) THEN                ! FORWARD integration: use NOW top baroclinic velocity 
  • NEMO/branches/UKMO/NEMO_4.0.1_FKOSM_m11715/src/OCE/DYN/dynzdf.F90

    r11715 r13454  
    141141            END DO 
    142142         END DO 
    143          IF( ln_isfcav ) THEN    ! Ocean cavities (ISF) 
     143         IF( ln_isfcav.OR.ln_drgice_imp ) THEN    ! Ocean cavities (ISF) 
    144144            DO jj = 2, jpjm1         
    145145               DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    258258            END DO 
    259259         END DO 
    260          IF ( ln_isfcav ) THEN   ! top friction (always implicit) 
     260         IF ( ln_isfcav.OR.ln_drgice_imp ) THEN   ! top friction (always implicit) 
    261261            DO jj = 2, jpjm1 
    262262               DO ji = 2, jpim1 
     
    423423            END DO 
    424424         END DO 
    425          IF ( ln_isfcav ) THEN 
     425         IF ( ln_isfcav.OR.ln_drgice_imp ) THEN 
    426426            DO jj = 2, jpjm1 
    427427               DO ji = 2, jpim1 
  • NEMO/branches/UKMO/NEMO_4.0.1_FKOSM_m11715/src/OCE/SBC/sbc_ice.F90

    r11715 r13454  
    7070   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   wndm_ice       !: wind speed module at T-point                 [m/s] 
    7171   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   sstfrz         !: wind speed module at T-point                 [m/s] 
     72   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   rCdU_ice       !: ice-ocean drag at T-point (<0)               [m/s] 
    7273   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   tsfc_ice       !: sea ice surface skin temperature (on categories) 
    7374#endif 
     
    132133         &      qemp_ice(jpi,jpj)     , qevap_ice(jpi,jpj,jpl) , qemp_oce   (jpi,jpj)     ,   & 
    133134         &      qns_oce (jpi,jpj)     , qsr_oce  (jpi,jpj)     , emp_oce    (jpi,jpj)     ,   & 
    134          &      emp_ice (jpi,jpj)     , tsfc_ice (jpi,jpj,jpl) , sstfrz     (jpi,jpj)     , STAT= ierr(2) ) 
     135         &      emp_ice (jpi,jpj)     , tsfc_ice (jpi,jpj,jpl) , sstfrz     (jpi,jpj)     ,   & 
     136         &      rCdU_ice   (jpi,jpj)  , STAT= ierr(2) ) 
    135137#endif 
    136138 
  • NEMO/branches/UKMO/NEMO_4.0.1_FKOSM_m11715/src/OCE/SBC/sbcmod.F90

    r11715 r13454  
    554554      ENDIF 
    555555      ! 
    556       CALL iom_put( "utau", utau )   ! i-wind stress   (stress can be updated at each time step in sea-ice) 
    557       CALL iom_put( "vtau", vtau )   ! j-wind stress 
    558       ! 
    559556      IF(ln_ctl) THEN         ! print mean trends (used for debugging) 
    560557         CALL prt_ctl(tab2d_1=fr_i              , clinfo1=' fr_i    - : ', mask1=tmask ) 
  • NEMO/branches/UKMO/NEMO_4.0.1_FKOSM_m11715/src/OCE/ZDF/zdfdrg.F90

    r11715 r13454  
    3232   USE lib_mpp        ! distributed memory computing 
    3333   USE prtctl         ! Print control 
     34   USE sbc_oce, ONLY: nn_ice  
    3435 
    3536   IMPLICIT NONE 
     
    4647   LOGICAL          ::   ln_loglayer  ! logarithmic drag: Cd = vkarmn/log(z/z0) 
    4748   LOGICAL , PUBLIC ::   ln_drgimp    ! implicit top/bottom friction flag 
     49   LOGICAL , PUBLIC ::   ln_drgice_imp ! implicit ice-ocean drag  
    4850 
    4951   !                                 !!* Namelist namdrg_top & _bot: TOP or BOTTOM coefficient namelist * 
     
    231233      INTEGER   ::   ios, ioptio   ! local integers 
    232234      !! 
    233       NAMELIST/namdrg/ ln_OFF, ln_lin, ln_non_lin, ln_loglayer, ln_drgimp 
     235      NAMELIST/namdrg/ ln_OFF, ln_lin, ln_non_lin, ln_loglayer, ln_drgimp, ln_drgice_imp 
    234236      !!---------------------------------------------------------------------- 
    235237      ! 
     
    254256         WRITE(numout,*) '      logarithmic drag: Cd = vkarmn/log(z/z0)   ln_loglayer = ', ln_loglayer 
    255257         WRITE(numout,*) '      implicit friction                         ln_drgimp   = ', ln_drgimp 
     258         WRITE(numout,*) '      implicit ice-ocean drag                   ln_drgice_imp  =', ln_drgice_imp 
    256259      ENDIF 
    257260      ! 
     
    264267      IF( ioptio /= 1 )   CALL ctl_stop( 'zdf_drg_init: Choose ONE type of drag coef in namdrg' ) 
    265268      ! 
     269      IF ( ln_drgice_imp.AND.(.NOT.ln_drgimp) ) &  
     270         &                CALL ctl_stop( 'zdf_drg_init: ln_drgice_imp=T requires ln_drgimp=T' ) 
     271      ! 
     272      IF ( ln_drgice_imp.AND.( nn_ice /=2 ) ) & 
     273         &  CALL ctl_stop( 'zdf_drg_init: ln_drgice_imp=T requires si3' ) 
    266274      ! 
    267275      !                     !==  BOTTOM drag setting  ==!   (applied at seafloor) 
     
    274282      !                     !==  TOP drag setting  ==!   (applied at the top of ocean cavities) 
    275283      ! 
    276       IF( ln_isfcav ) THEN              ! Ocean cavities: top friction setting 
    277          ALLOCATE( rCd0_top(jpi,jpj), rCdU_top(jpi,jpj) ) 
     284      IF( ln_isfcav.OR.ln_drgice_imp ) THEN              ! Ocean cavities: top friction setting 
     285         ALLOCATE( rCdU_top(jpi,jpj) ) 
     286      ENDIF 
     287      ! 
     288      IF( ln_isfcav ) THEN 
     289         ALLOCATE( rCd0_top(jpi,jpj) ) 
    278290         CALL drg_init( 'TOP   '   , mikt       ,                                         &   ! <== in 
    279291            &           r_Cdmin_top, r_Cdmax_top, r_z0_top, r_ke0_top, rCd0_top, rCdU_top )   ! ==> out 
  • NEMO/branches/UKMO/NEMO_4.0.1_FKOSM_m11715/src/OCE/ZDF/zdfphy.F90

    r13402 r13454  
    2828   USE sbc_oce        ! surface module (only for nn_isf in the option compatibility test) 
    2929   USE sbcrnf         ! surface boundary condition: runoff variables 
     30   USE sbc_ice        ! sea ice drag 
     31 
    3032#if defined key_agrif 
    3133   USE agrif_oce_interp   ! interpavm 
     
    252254      ENDIF 
    253255      ! 
     256      IF ( ln_drgice_imp) THEN 
     257         IF ( ln_isfcav ) THEN 
     258            rCdU_top(:,:) = rCdU_top(:,:) + ssmask(:,:) * tmask(:,:,1) * rCdU_ice(:,:) 
     259         ELSE 
     260            rCdU_top(:,:) = rCdU_ice(:,:) 
     261         ENDIF 
     262      ENDIF 
     263      !  
    254264      !                       !==  Kz from chosen turbulent closure  ==!   (avm_k, avt_k) 
    255265      ! 
Note: See TracChangeset for help on using the changeset viewer.