Changeset 12953


Ignore:
Timestamp:
2020-05-19T15:59:10+02:00 (6 days ago)
Author:
jchanut
Message:

Add ice-ocean implicit drag as namelist option ln_drgice_imp, #2468

Location:
NEMO/branches/MOI/NEMO_4.03_IODRAG
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/MOI/NEMO_4.03_IODRAG/cfgs/SHARED/namelist_ref

    r12288 r12953  
    677677   ! 
    678678   ln_drgimp   = .true.    !  implicit top/bottom friction flag 
     679      ln_drgice_imp = .false. ! implicit ice-ocean drag 
    679680/ 
    680681!----------------------------------------------------------------------- 
  • NEMO/branches/MOI/NEMO_4.03_IODRAG/src/ICE/iceupdate.F90

    r11536 r12953  
    2626   USE icectl         ! sea-ice: control prints 
    2727   USE bdy_oce , ONLY : ln_bdy 
     28   USE zdfdrg 
    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/MOI/NEMO_4.03_IODRAG/src/OCE/DYN/dynnxt.F90

    r12366 r12953  
    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      !!---------------------------------------------------------------------- 
     
    354356      ENDIF 
    355357      ! 
     358      IF ( iom_use("utau") ) THEN 
     359         IF ( ln_drgice_imp.OR.ln_isfcav ) THEN 
     360            ALLOCATE(zutau(jpi,jpj))  
     361            DO jj = 2, jpjm1 
     362               DO ji = 2, jpim1 
     363                  jk = miku(ji,jj)  
     364                  zutau(ji,jj) = utau(ji,jj) &  
     365                  &  + 0.5_wp * rau0 * (rCdU_top(ji+1,jj)+rCdU_top(ji,jj)) * ua(ji,jj,jk)  
     366               END DO 
     367            END DO 
     368            CALL lbc_lnk( 'dynnxt' , zutau, 'U', -1.) 
     369            CALL iom_put(  "utau", zutau(:,:) ) 
     370            DEALLOCATE(zutau) 
     371         ELSE 
     372            CALL iom_put(  "utau", utau(:,:) ) 
     373         ENDIF 
     374      ENDIF 
     375      ! 
     376      IF ( iom_use("vtau") ) THEN 
     377         IF ( ln_drgice_imp.OR.ln_isfcav ) THEN 
     378            ALLOCATE(zvtau(jpi,jpj)) 
     379            DO jj = 2, jpjm1 
     380               DO ji = 2, jpim1 
     381                  jk = mikv(ji,jj) 
     382                  zvtau(ji,jj) = vtau(ji,jj) & 
     383                  &  + 0.5_wp * rau0 * (rCdU_top(ji,jj+1)+rCdU_top(ji,jj)) * va(ji,jj,jk) 
     384               END DO 
     385            END DO 
     386            CALL lbc_lnk( 'dynnxt' , zvtau, 'V', -1.) 
     387            CALL iom_put(  "vtau", zvtau(:,:) ) 
     388            DEALLOCATE(zvtau) 
     389         ELSE 
     390            CALL iom_put(  "vtau", vtau(:,:) ) 
     391         ENDIF 
     392      ENDIF 
     393      ! 
    356394      IF(ln_ctl)   CALL prt_ctl( tab3d_1=un, clinfo1=' nxt  - Un: ', mask1=umask,   & 
    357395         &                       tab3d_2=vn, clinfo2=' Vn: '       , mask2=vmask ) 
  • NEMO/branches/MOI/NEMO_4.03_IODRAG/src/OCE/DYN/dynspg_ts.F90

    r12737 r12953  
    14651465      !                    !==  Set the barotropic drag coef.  ==! 
    14661466      ! 
    1467       IF( ln_isfcav ) THEN          ! top+bottom friction (ocean cavities) 
     1467      IF( ln_isfcav.OR.ln_drgice_imp ) THEN          ! top+bottom friction (ocean cavities) 
    14681468          
    14691469         DO jj = 2, jpjm1 
     
    15281528      !                    !==  TOP stress contribution from baroclinic velocities  ==!   (no W/D case) 
    15291529      ! 
    1530       IF( ln_isfcav ) THEN 
     1530      IF( ln_isfcav.OR.ln_drgice_imp ) THEN 
    15311531         ! 
    15321532         IF( ln_bt_fw ) THEN                ! FORWARD integration: use NOW top baroclinic velocity 
  • NEMO/branches/MOI/NEMO_4.03_IODRAG/src/OCE/DYN/dynzdf.F90

    r12292 r12953  
    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/MOI/NEMO_4.03_IODRAG/src/OCE/SBC/sbcmod.F90

    r12276 r12953  
    564564      ENDIF 
    565565      ! 
    566       CALL iom_put( "utau", utau )   ! i-wind stress   (stress can be updated at each time step in sea-ice) 
    567       CALL iom_put( "vtau", vtau )   ! j-wind stress 
    568       ! 
    569566      IF(ln_ctl) THEN         ! print mean trends (used for debugging) 
    570567         CALL prt_ctl(tab2d_1=fr_i              , clinfo1=' fr_i    - : ', mask1=tmask ) 
  • NEMO/branches/MOI/NEMO_4.03_IODRAG/src/OCE/ZDF/zdfdrg.F90

    r11536 r12953  
    4646   LOGICAL          ::   ln_loglayer  ! logarithmic drag: Cd = vkarmn/log(z/z0) 
    4747   LOGICAL , PUBLIC ::   ln_drgimp    ! implicit top/bottom friction flag 
     48   LOGICAL , PUBLIC ::   ln_drgice_imp ! implicit ice-ocean drag 
    4849 
    4950   !                                 !!* Namelist namdrg_top & _bot: TOP or BOTTOM coefficient namelist * 
     
    7172   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:), PUBLIC ::   rCd0_top, rCd0_bot   !: precomputed top/bottom drag coeff. at t-point (>0) 
    7273   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:), PUBLIC ::   rCdU_top, rCdU_bot   !: top/bottom drag coeff. at t-point (<0)  [m/s] 
     74   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:), PUBLIC ::   rCdU_ice             !: ice-ocean drag (used if ln_drgice_imp=T) 
    7375 
    7476   !! * Substitutions 
     
    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' ) 
    266271      ! 
    267272      !                     !==  BOTTOM drag setting  ==!   (applied at seafloor) 
     
    274279      !                     !==  TOP drag setting  ==!   (applied at the top of ocean cavities) 
    275280      ! 
    276       IF( ln_isfcav ) THEN              ! Ocean cavities: top friction setting 
    277          ALLOCATE( rCd0_top(jpi,jpj), rCdU_top(jpi,jpj) ) 
     281      IF( ln_isfcav.OR.ln_drgice_imp ) THEN              ! Ocean cavities: top friction setting 
     282         ALLOCATE( rCdU_top(jpi,jpj) ) 
     283         rCdU_top(:,:) = 0._wp 
     284      ENDIF 
     285      ! 
     286      IF (ln_drgice_imp) ALLOCATE( rCdU_ice(jpi,jpj) ) 
     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/MOI/NEMO_4.03_IODRAG/src/OCE/ZDF/zdfphy.F90

    r11536 r12953  
    252252      ENDIF 
    253253      ! 
     254      IF ( ln_drgice_imp) THEN 
     255         IF ( ln_isfcav ) THEN 
     256            rCdU_top(:,:) = rCdU_top(:,:) + ssmask(:,:) * tmask(:,:,1) * rCdU_ice(:,:) 
     257         ELSE 
     258            rCdU_top(:,:) = rCdU_ice(:,:) 
     259         ENDIF 
     260      ENDIF 
     261      !  
    254262      !                       !==  Kz from chosen turbulent closure  ==!   (avm_k, avt_k) 
    255263      ! 
Note: See TracChangeset for help on using the changeset viewer.