Changeset 10332


Ignore:
Timestamp:
2018-11-19T13:02:15+01:00 (23 months ago)
Author:
mathiot
Message:

Fix #2161

Location:
NEMO/trunk/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • NEMO/trunk/src/ICE/icedyn_rhg_evp.F90

    r10069 r10332  
    2626   USE sbc_ice , ONLY : utau_ice, vtau_ice, snwice_mass, snwice_mass_b 
    2727   USE ice            ! sea-ice: ice variables 
     28   USE icevar         ! ice_var_sshdyn 
    2829   USE icedyn_rdgrft  ! sea-ice: ice strength 
    2930   USE bdy_oce , ONLY : ln_bdy  
     
    143144      REAL(wp), DIMENSION(jpi,jpj) ::   zs1, zs2, zs12                  ! stress tensor components 
    144145      REAL(wp), DIMENSION(jpi,jpj) ::   zu_ice, zv_ice, zresr           ! check convergence 
    145       REAL(wp), DIMENSION(jpi,jpj) ::   zpice                           ! array used for the calculation of ice surface slope: 
     146      REAL(wp), DIMENSION(jpi,jpj) ::   zssh_lead_m                     ! array used for the calculation of ice surface slope: 
    146147      !                                                                 !    ocean surface (ssh_m) if ice is not embedded 
    147148      !                                                                 !    ice top surface if ice is embedded    
     
    261262      !------------------------------------------------------------------------------! 
    262263 
    263       IF( ln_ice_embd ) THEN             !== embedded sea ice: compute representative ice top surface ==! 
    264          !                                             
    265          ! average interpolation coeff as used in dynspg = (1/nn_fsbc)   * {SUM[n/nn_fsbc], n=0,nn_fsbc-1} 
    266          !                                               = (1/nn_fsbc)^2 * {SUM[n]        , n=0,nn_fsbc-1} 
    267          zintn = REAL( nn_fsbc - 1 ) / REAL( nn_fsbc ) * 0.5_wp      
    268          ! 
    269          ! average interpolation coeff as used in dynspg = (1/nn_fsbc)   *    {SUM[1-n/nn_fsbc], n=0,nn_fsbc-1} 
    270          !                                               = (1/nn_fsbc)^2 * (nn_fsbc^2 - {SUM[n], n=0,nn_fsbc-1}) 
    271          zintb = REAL( nn_fsbc + 1 ) / REAL( nn_fsbc ) * 0.5_wp 
    272          ! 
    273          zpice(:,:) = ssh_m(:,:) + ( zintn * snwice_mass(:,:) + zintb * snwice_mass_b(:,:) ) * r1_rau0 
    274          ! 
    275       ELSE                                    !== non-embedded sea ice: use ocean surface for slope calculation ==! 
    276          zpice(:,:) = ssh_m(:,:) 
    277       ENDIF 
     264      !== embedded sea ice: compute representative ice top surface      ==! 
     265      !== non-embedded sea ice: use ocean surface for slope calculation ==! 
     266      zssh_lead_m(:,:) = ice_var_sshdyn( ssh_m, snwice_mass, snwice_mass_b) 
    278267 
    279268      DO jj = 2, jpjm1 
     
    313302 
    314303            ! Surface pressure gradient (- m*g*GRAD(ssh)) at U-V points 
    315             zspgU(ji,jj)    = - zmassU * grav * ( zpice(ji+1,jj) - zpice(ji,jj) ) * r1_e1u(ji,jj) 
    316             zspgV(ji,jj)    = - zmassV * grav * ( zpice(ji,jj+1) - zpice(ji,jj) ) * r1_e2v(ji,jj) 
     304            zspgU(ji,jj)    = - zmassU * grav * ( zssh_lead_m(ji+1,jj) - zssh_lead_m(ji,jj) ) * r1_e1u(ji,jj) 
     305            zspgV(ji,jj)    = - zmassV * grav * ( zssh_lead_m(ji,jj+1) - zssh_lead_m(ji,jj) ) * r1_e2v(ji,jj) 
    317306 
    318307            ! masks 
  • NEMO/trunk/src/ICE/icevar.F90

    r10069 r10332  
    4949   !!   ice_var_bv        : brine volume 
    5050   !!   ice_var_enthalpy  : compute ice and snow enthalpies from temperature 
     51   !!   ice_var_sshdyn    : compute equivalent ssh in lead 
    5152   !!---------------------------------------------------------------------- 
    5253   USE dom_oce        ! ocean space and time domain 
    5354   USE phycst         ! physical constants (ocean directory)  
    54    USE sbc_oce , ONLY : sss_m 
     55   USE sbc_oce , ONLY : sss_m, ln_ice_embd, nn_fsbc 
    5556   USE ice            ! sea-ice: variables 
    5657   USE ice1D          ! sea-ice: thermodynamics variables 
     
    7475   PUBLIC   ice_var_bv            
    7576   PUBLIC   ice_var_enthalpy            
     77   PUBLIC   ice_var_sshdyn 
    7678 
    7779   !!---------------------------------------------------------------------- 
     
    949951   END SUBROUTINE ice_var_enthalpy 
    950952 
     953   FUNCTION ice_var_sshdyn(pssh, psnwice_mass, psnwice_mass_b) 
     954      !!--------------------------------------------------------------------- 
     955      !!                   ***  ROUTINE rhg_evp_rst  *** 
     956      !!                      
     957      !! ** Purpose :  compute the equivalent ssh in lead when sea ice is embedded 
     958      !! 
     959      !! ** Method  :  ssh_lead = ssh + (Mice + Msnow) / rau0 
     960      !! 
     961      !! ** Reference : Jean-Michel Campin, John Marshall, David Ferreira, 
     962      !!                Sea ice-ocean coupling using a rescaled vertical coordinate z*,  
     963      !!                Ocean Modelling, Volume 24, Issues 1-2, 2008 
     964      !! 
     965      !!---------------------------------------------------------------------- 
     966      ! 
     967      ! input 
     968      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pssh            !: ssh [m] 
     969      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: psnwice_mass    !: mass of snow and ice at current  ice time step [Kg/m2] 
     970      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: psnwice_mass_b  !: mass of snow and ice at previous ice time step [Kg/m2] 
     971      ! 
     972      ! output 
     973      REAL(wp), DIMENSION(jpi,jpj) :: ice_var_sshdyn  ! equivalent ssh in lead [m] 
     974      ! 
     975      ! temporary 
     976      REAL(wp) :: zintn, zintb                     ! time interpolation weights [] 
     977      REAL(wp), DIMENSION(jpi,jpj) :: zsnwiceload  ! snow and ice load [m] 
     978      ! 
     979      ! compute ice load used to define the equivalent ssh in lead 
     980      IF( ln_ice_embd ) THEN 
     981         !                                             
     982         ! average interpolation coeff as used in dynspg = (1/nn_fsbc)   * {SUM[n/nn_fsbc], n=0,nn_fsbc-1} 
     983         !                                               = (1/nn_fsbc)^2 * {SUM[n]        , n=0,nn_fsbc-1} 
     984         zintn = REAL( nn_fsbc - 1 ) / REAL( nn_fsbc ) * 0.5_wp 
     985         ! 
     986         ! average interpolation coeff as used in dynspg = (1/nn_fsbc)   *    {SUM[1-n/nn_fsbc], n=0,nn_fsbc-1} 
     987         !                                               = (1/nn_fsbc)^2 * (nn_fsbc^2 - {SUM[n], n=0,nn_fsbc-1}) 
     988         zintb = REAL( nn_fsbc + 1 ) / REAL( nn_fsbc ) * 0.5_wp 
     989         ! 
     990         zsnwiceload(:,:) = ( zintn * psnwice_mass(:,:) + zintb * psnwice_mass_b(:,:) ) * r1_rau0 
     991         ! 
     992      ELSE 
     993         zsnwiceload(:,:) = 0.0_wp 
     994      ENDIF 
     995      ! compute equivalent ssh in lead 
     996      ice_var_sshdyn(:,:) = pssh(:,:) + zsnwiceload(:,:) 
     997      ! 
     998   END FUNCTION ice_var_sshdyn 
     999 
     1000 
    9511001#else 
    9521002   !!---------------------------------------------------------------------- 
  • NEMO/trunk/src/OCE/ICB/icbutl.F90

    r10068 r10332  
    2424#if defined key_si3 
    2525   USE ice,    ONLY: u_ice, v_ice, hm_i    ! SI3 variables 
     26   USE icevar                              ! ice_var_sshdyn 
     27   USE sbc_ice, ONLY: snwice_mass, snwice_mass_b 
    2628#endif 
    2729 
     
    6062      !! ** Method  : - blah blah 
    6163      !!---------------------------------------------------------------------- 
    62  
     64#if defined key_si3 
     65      REAL(wp), DIMENSION(jpi,jpj) :: zssh_lead_m    !    ocean surface (ssh_m) if ice is not embedded 
     66      !                                              !    ocean surface in leads if ice is embedded    
     67#endif 
    6368      ! copy nemo forcing arrays into iceberg versions with extra halo 
    6469      ! only necessary for variables not on T points 
     
    8489      ui_e(:,:) = 0._wp ;   ui_e(1:jpi, 1:jpj) = u_ice(:,:) 
    8590      vi_e(:,:) = 0._wp ;   vi_e(1:jpi, 1:jpj) = v_ice(:,:) 
     91      !       
     92      ! compute ssh slope using ssh_lead if embedded 
     93      zssh_lead_m(:,:) = ice_var_sshdyn(ssh_m, snwice_mass, snwice_mass_b) 
     94      ssh_e(:,:) = 0._wp ;  ssh_e(1:jpi, 1:jpj) = zssh_lead_m(:,:) * tmask(:,:,1) 
    8695      ! 
    8796      CALL lbc_lnk_icb( hicth, 'T', +1._wp, 1, 1 ) 
    8897      CALL lbc_lnk_icb( ui_e , 'U', -1._wp, 1, 1 ) 
    8998      CALL lbc_lnk_icb( vi_e , 'V', -1._wp, 1, 1 ) 
     99#else 
     100      ssh_e(:,:) = 0._wp ;  ssh_e(1:jpi, 1:jpj) = ssh_m(:,:) * tmask(:,:,1) 
    90101#endif 
    91102 
    92103      !! special for ssh which is used to calculate slope 
    93104      !! so fudge some numbers all the way around the boundary 
    94  
    95       ssh_e(:,:) = 0._wp ;   ssh_e(1:jpi, 1:jpj) = ssh_m(:,:) * tmask(:,:,1) 
    96105      ssh_e(0    ,    :) = ssh_e(1  ,  :) 
    97106      ssh_e(jpi+1,    :) = ssh_e(jpi,  :) 
Note: See TracChangeset for help on using the changeset viewer.