stim_basal_melt.F90 Source File


This file depends on

sourcefile~~stim_basal_melt.f90~~EfferentGraph sourcefile~stim_basal_melt.f90 stim_basal_melt.F90 sourcefile~stim_variables.f90 stim_variables.F90 sourcefile~stim_basal_melt.f90->sourcefile~stim_variables.f90

Contents

Source Code


Source Code

!> The basal_melt ice model
!>
!> authors: Hans Burchard and Karsten Bolding

   module stim_basal_melt

   use stim_variables, only: rk
   use stim_variables, only: Hice
   use stim_variables, only: z0 => z0i
   use stim_variables, only: rhoi => rho_ice
   use stim_variables, only: Li => L_ice
   use stim_variables, only: vm => melt_rate
   use stim_variables, only: Tb => T_melt
   use stim_variables, only: Sb => S_melt
   use stim_variables, only: fH => ocean_ice_heat_flux
   use stim_variables, only: fS => ocean_ice_salt_flux

   IMPLICIT NONE

   private

   public init_stim_basal_melt, do_stim_basal_melt, clean_stim_basal_melt

!-----------------------------------------------------------------------

   contains

   SUBROUTINE init_stim_basal_melt(ice_cover)
     !! Initialize the basal_melt model with an ice-cover

   IMPLICIT NONE

   integer, intent(inout)  :: ice_cover
   integer                   :: rc
!-----------------------------------------------------------------------

   END SUBROUTINE init_stim_basal_melt

!-----------------------------------------------------------------------

   SUBROUTINE do_stim_basal_melt(h,ustar,T,S)

   IMPLICIT NONE

   real(rk), intent(in) :: h      
     !! upper layer thickness [m]
   real(rk), intent(inout) :: ustar  
     !! friction velocity ice/water interface [m/s]
   real(rk), intent(in) :: T
     !! upper layer temperature [C]
   real(rk), intent(in) :: S      
     !! upper layer salinity [g/kg] 

#if 0
   ! param. for freezing in-situ temperature eq. 
   real(rk) :: l1 =  -0.0575    
   real(rk) :: l2 =   0.0901
   real(rk) :: l3 =  7.61e-4
#else
   ! param. for freezing potential temperature eq. 
   real(rk), parameter :: l1 = -5.6705121472405570E-002 
   real(rk), parameter :: l2 =  7.5436448744204881E-002
   real(rk), parameter :: l3 =  7.6828512903539831E-004
#endif

   real(rk) :: nu     = 1.95e-6 
     !! molecular viscosity [m2/s]
   real(rk) :: kappa  = 0.4     
     !! von Karman constant [-]
   real(rk) :: Bs     = 8.5     
     !! constant for tracer roughness [-]
   real(rk) :: Pr_turb= 0.7     
     !! turbulent Prandtl number [-]
   real(rk) :: Pr_temp= 13.8    
     !! molecular Prandtl for temp [-]
   real(rk) :: Pr_salt= 2432.   
     !! turbulent Prandtl for salt [-]
   real(rk) :: c      = 4180.   
     !! heat capacity of sea water [J/(kg K)]
   real(rk) :: ci     = 1995.   
     !! heat capacity of glacial ice [J/(kg K)]
   real(rk) :: Ti     = -20.    
     !! ice core temperature [deg C]
!KB   real(rk) :: Li     = 3.33e5  
!KB     !! latent heat of fusion [J/kg]
   real(rk) :: rho0   = 1030.   
     !! reference density of sea water [kg/m3]
!KB   real(rk) :: rhoi   =  920.   
!KB     !! reference density of glacial ice [kg/m3]

   real(rk) ::  log_zk_p_z0_z0t,log_zk_p_z0_z0s
   real(rk) ::  betaT,betaS
   real(rk) ::  A1T,A1S,LL
   real(rk) ::  s1,s2,s3,pp,qq

   real(rk) :: X,beta
!-----------------------------------------------------------------------
#if 0
   X=0.55*exp(0.5*kappa*Bs)*sqrt(z0*ustar/nu)

   beta=X*(Pr_temp**(2./3.)-0.2)-Pr_turb*Bs+9.5
   log_zk_p_z0_z0t=log((0.5*h+z0)/z0)+kappa/Pr_turb*beta

   beta=X*(Pr_salt**(2./3.)-0.2)-Pr_turb*Bs+9.5
   log_zk_p_z0_z0s=log((0.5*h+z0)/z0)+kappa/Pr_turb*beta
#else
   betaT=0.55*exp(0.5*kappa*Bs)*sqrt(z0*ustar/nu)
   betaT=betaT*(Pr_temp**(2./3.)-0.2)
   betaT=betaT-Pr_turb*Bs+9.5

   betaS=0.55*exp(0.5*kappa*Bs)*sqrt(z0*ustar/nu)
   betaS=betaS*(Pr_salt**(2./3.)-0.2)
   betaS=betaS-Pr_turb*Bs+9.5

   log_zk_p_z0_z0t=log((0.5*h+z0)/z0)+kappa/Pr_turb*betaT
   log_zk_p_z0_z0s=log((0.5*h+z0)/z0)+kappa/Pr_turb*betaS
#endif

   A1T=kappa*ustar/(Pr_turb*log_zk_p_z0_z0t)
   A1S=kappa*ustar/(Pr_turb*log_zk_p_z0_z0s)
!KB   LL=l2+l3*zb
   LL=l2+l3*Hice*rhoi/rho0

   s1=l1*(A1T-A1S*ci/c)
   s2=A1S*S*l1*ci/c-A1S/c*(ci*(LL-Ti)+Li)-A1T*(T-LL)
   s3=A1S*S/c*(ci*(LL-Ti)+Li)
   pp=s2/s1
   qq=s3/s1

   Sb = -0.5*pp+sqrt(0.25*pp**2-qq)     
     !! melt layer salinity
   Tb = l1*Sb+LL                        
     !! melt layer temperature

   vm = A1T*(T-Tb)/(ci/c*(Tb-Ti)+Li/c)  
     !! melt rate in m/s (>0 for melting)

   fH = (A1T*(T-Tb)-vm*Tb)*c*rho0       
     !! upward heat flux in W/m2 (>0 for melting)

   fS = A1S*(S-Sb)-vm*Sb                
     !! upward salinity flux (should be zero for glacial ice)

   if (ustar < 1e-10) then
      fH = 0.0
      fS = 0.0
      vm = 0.0
   end if
   END SUBROUTINE do_stim_basal_melt

!-----------------------------------------------------------------------
!
   SUBROUTINE clean_stim_basal_melt()
!
   IMPLICIT NONE
!-----------------------------------------------------------------------

   END SUBROUTINE clean_stim_basal_melt
!EOC

!-----------------------------------------------------------------------

   end module stim_basal_melt

!-----------------------------------------------------------------------
! Copyright by the STIM-team under the GNU Public License - www.gnu.org
!-----------------------------------------------------------------------