LCOV - code coverage report
Current view: top level - icepack/columnphysics - icepack_mushy_physics.F90 (source / functions) Hit Total Coverage
Test: 231018-211459:8916b9ff2c:1:quick Lines: 114 114 100.00 %
Date: 2023-10-18 15:30:36 Functions: 15 15 100.00 %

          Line data    Source code
       1             : module icepack_mushy_physics
       2             : 
       3             :   use icepack_kinds
       4             :   use icepack_parameters, only: c0, c1, c2, c4, c1000
       5             :   use icepack_parameters, only: puny
       6             :   use icepack_parameters, only: rhow, rhoi, rhos, cp_ocn, cp_ice, Lfresh
       7             :   use icepack_parameters, only: ksno
       8             :   use icepack_warnings, only: warnstr, icepack_warnings_add
       9             :   use icepack_warnings, only: icepack_warnings_setabort, icepack_warnings_aborted
      10             : 
      11             :   implicit none
      12             : 
      13             :   private
      14             :   public :: &
      15             :        conductivity_mush_array, &   ! LCOV_EXCL_LINE
      16             :        conductivity_snow_array, &   ! LCOV_EXCL_LINE
      17             :        icepack_enthalpy_snow, &   ! LCOV_EXCL_LINE
      18             :        enthalpy_brine, &   ! LCOV_EXCL_LINE
      19             :        icepack_enthalpy_mush, &   ! LCOV_EXCL_LINE
      20             :        enthalpy_mush_liquid_fraction, &   ! LCOV_EXCL_LINE
      21             :        enthalpy_of_melting, &   ! LCOV_EXCL_LINE
      22             :        temperature_snow, &   ! LCOV_EXCL_LINE
      23             :        icepack_mushy_temperature_mush, &   ! LCOV_EXCL_LINE
      24             :        temperature_mush_liquid_fraction, &   ! LCOV_EXCL_LINE
      25             :        liquidus_brine_salinity_mush, &   ! LCOV_EXCL_LINE
      26             :        liquidus_temperature_mush, &   ! LCOV_EXCL_LINE
      27             :        icepack_mushy_liquid_fraction, &   ! LCOV_EXCL_LINE
      28             :        icepack_mushy_density_brine
      29             : 
      30             :   !-----------------------------------------------------------------
      31             :   ! Constants for Liquidus relation from Assur (1958)
      32             :   !-----------------------------------------------------------------
      33             : 
      34             :   ! liquidus relation - higher temperature region
      35             :   real(kind=dbl_kind), parameter :: &
      36             :        az1_liq = -18.48_dbl_kind, &   ! LCOV_EXCL_LINE
      37             :        bz1_liq =    0.0_dbl_kind
      38             : 
      39             :   ! liquidus relation - lower temperature region
      40             :   real(kind=dbl_kind), parameter :: &
      41             :        az2_liq = -10.3085_dbl_kind, &   ! LCOV_EXCL_LINE
      42             :        bz2_liq =     62.4_dbl_kind
      43             : 
      44             :   ! liquidus break
      45             :   real(kind=dbl_kind), parameter :: &
      46             :        Tb_liq = -7.6362968855167352_dbl_kind, & ! temperature of liquidus break   ! LCOV_EXCL_LINE
      47             :        Sb_liq =  123.66702800276086_dbl_kind    ! salinity of liquidus break
      48             : 
      49             :   ! basic liquidus relation constants
      50             :   real(kind=dbl_kind), parameter :: &
      51             :        az1p_liq = az1_liq / c1000, &   ! LCOV_EXCL_LINE
      52             :        bz1p_liq = bz1_liq / c1000, &   ! LCOV_EXCL_LINE
      53             :        az2p_liq = az2_liq / c1000, &   ! LCOV_EXCL_LINE
      54             :        bz2p_liq = bz2_liq / c1000
      55             : 
      56             :   !-----------------------------------------------------------------
      57             :   ! Other parameters
      58             :   !-----------------------------------------------------------------
      59             : 
      60             :   real(kind=dbl_kind), parameter :: &
      61             :        ki = 2.3_dbl_kind , & ! fresh ice conductivity (W m-1 K-1)   ! LCOV_EXCL_LINE
      62             :        kb = 0.5375_dbl_kind  ! brine conductivity (W m-1 K-1)
      63             : 
      64             : !=======================================================================
      65             : 
      66             : contains
      67             : 
      68             : !=======================================================================
      69             : ! Physical Quantities
      70             : !=======================================================================
      71             : ! Detemine the conductivity of the mush from enthalpy and salinity
      72             : 
      73    33852099 :   subroutine conductivity_mush_array(nilyr, zqin, zSin, km)
      74             : 
      75             :     integer (kind=int_kind), intent(in) :: &
      76             :          nilyr   ! number of ice layers
      77             : 
      78             :     real(kind=dbl_kind), dimension(:), intent(in) :: &
      79             :          zqin, & ! ice layer enthalpy (J m-3)   ! LCOV_EXCL_LINE
      80             :          zSin    ! ice layer bulk salinity (ppt)
      81             : 
      82             :     real(kind=dbl_kind), dimension(:), intent(out) :: &
      83             :          km      ! ice layer conductivity (W m-1 K-1)
      84             : 
      85             :     integer(kind=int_kind) :: &
      86             :          k       ! ice layer index
      87             : 
      88     3086234 :     real(kind=dbl_kind) :: Tmush
      89             : 
      90             :     character(len=*),parameter :: subname='(conductivity_mush_array)'
      91             : 
      92   270816792 :     do k = 1, nilyr
      93             : 
      94   236964693 :        Tmush = icepack_mushy_temperature_mush(zqin(k), zSin(k))
      95             : 
      96   270816792 :        km(k) = heat_conductivity(Tmush, zSin(k))
      97             : 
      98             :     enddo ! k
      99             : 
     100    33852099 :   end subroutine conductivity_mush_array
     101             : 
     102             : !=======================================================================
     103             : !autodocument_start icepack_mushy_density_brine
     104             : ! Compute density of brine from brine salinity
     105             : 
     106   670043277 :   function icepack_mushy_density_brine(Sbr) result(rho)
     107             : 
     108             :     real(kind=dbl_kind), intent(in) :: &
     109             :          Sbr ! brine salinity (ppt)
     110             : 
     111             :     real(kind=dbl_kind) :: &
     112             :          rho ! brine density (kg m-3)
     113             : 
     114             : !autodocument_end
     115             : 
     116             :     real(kind=dbl_kind), parameter :: &
     117             :          a = 1000.3_dbl_kind    , & ! zeroth empirical coefficient   ! LCOV_EXCL_LINE
     118             :          b = 0.78237_dbl_kind   , & ! linear empirical coefficient   ! LCOV_EXCL_LINE
     119             :          c = 2.8008e-4_dbl_kind     ! quadratic empirical coefficient
     120             : 
     121             :     character(len=*),parameter :: subname='(icepack_mushy_density_brine)'
     122             : 
     123   670043277 :     rho = a + b * Sbr + c * Sbr**2
     124             : 
     125   670043277 :   end function icepack_mushy_density_brine
     126             : 
     127             : !=======================================================================
     128             : ! Snow
     129             : !=======================================================================
     130             : ! Heat conductivity of the snow
     131             : 
     132    20282724 :   subroutine conductivity_snow_array(ks)
     133             : 
     134             :     real(kind=dbl_kind), dimension(:), intent(out) :: &
     135             :          ks ! snow layer conductivity (W m-1 K-1)
     136             : 
     137             :     character(len=*),parameter :: subname='(conductivity_snow_array)'
     138             : 
     139    40565448 :     ks = ksno
     140             : 
     141    20282724 :   end subroutine conductivity_snow_array
     142             : 
     143             : !=======================================================================
     144             : !autodocument_start icepack_enthalpy_snow
     145             : ! Enthalpy of snow from snow temperature
     146             : 
     147    44178434 :   function icepack_enthalpy_snow(zTsn) result(zqsn)
     148             : 
     149             :     real(kind=dbl_kind), intent(in) :: &
     150             :          zTsn ! snow layer temperature (C)
     151             : 
     152             :     real(kind=dbl_kind) :: &
     153             :          zqsn ! snow layer enthalpy (J m-3)
     154             : 
     155             : !autodocument_end
     156             : 
     157             :     character(len=*),parameter :: subname='(icepack_enthalpy_snow)'
     158             : 
     159    44178434 :     zqsn = -rhos * (-cp_ice * zTsn + Lfresh)
     160             : 
     161    44178434 :   end function icepack_enthalpy_snow
     162             : 
     163             : !=======================================================================
     164             : ! Temperature of snow from the snow enthalpy
     165             : 
     166    41292873 :   function temperature_snow(zqsn) result(zTsn)
     167             : 
     168             :     real(kind=dbl_kind), intent(in) :: &
     169             :          zqsn ! snow layer enthalpy (J m-3)
     170             : 
     171             :     real(kind=dbl_kind) :: &
     172             :          zTsn, & ! snow layer temperature (C)   ! LCOV_EXCL_LINE
     173     6153078 :          A, B
     174             : 
     175             :     character(len=*),parameter :: subname='(temperature_snow)'
     176             : 
     177    41292873 :     A = c1 / (rhos * cp_ice)
     178    41292873 :     B = Lfresh / cp_ice
     179    41292873 :     zTsn = A * zqsn + B
     180             : 
     181    41292873 :   end function temperature_snow
     182             : 
     183             : !=======================================================================
     184             : ! Mushy Layer Formulation - Assur (1958) liquidus
     185             : !=======================================================================
     186             : ! Liquidus relation: equilibrium brine salinity as function of temperature
     187             : ! based on empirical data from Assur (1958)
     188             : 
     189  2197029654 :   function liquidus_brine_salinity_mush(zTin) result(Sbr)
     190             : 
     191             :     real(kind=dbl_kind), intent(in) :: &
     192             :          zTin         ! ice layer temperature (C)
     193             : 
     194             :     real(kind=dbl_kind) :: &
     195             :          Sbr          ! ice brine salinity (ppt)
     196             : 
     197             :     real(kind=dbl_kind) :: &
     198             :          t_high   , & ! mask for high temperature liquidus region   ! LCOV_EXCL_LINE
     199   211721018 :          lsubzero     ! mask for sub-zero temperatures
     200             : 
     201             :     real(kind=dbl_kind) :: &
     202             :          J1_liq, K1_liq, L1_liq, & ! temperature to brine salinity   ! LCOV_EXCL_LINE
     203   211721018 :          J2_liq, K2_liq, L2_liq
     204             : 
     205             :     character(len=*),parameter :: subname='(liquidus_brine_salinty_mush)'
     206             : 
     207             :     ! temperature to brine salinity
     208  2197029654 :     J1_liq = bz1_liq / az1_liq
     209  2197029654 :     K1_liq = c1 / c1000
     210  2197029654 :     L1_liq = (c1 + bz1p_liq) / az1_liq
     211  2197029654 :     J2_liq = bz2_liq  / az2_liq
     212  2197029654 :     K2_liq = c1 / c1000
     213  2197029654 :     L2_liq = (c1 + bz2p_liq) / az2_liq
     214             : 
     215  2197029654 :     t_high   = merge(c1, c0, (zTin > Tb_liq))
     216  2197029654 :     lsubzero = merge(c1, c0, (zTin <= c0))
     217             : 
     218             :     Sbr = ((zTin + J1_liq) / (K1_liq * zTin + L1_liq)) * t_high + &
     219  2197029654 :           ((zTin + J2_liq) / (K2_liq * zTin + L2_liq)) * (c1 - t_high)
     220             : 
     221  2197029654 :     Sbr = Sbr * lsubzero
     222             : 
     223  2197029654 :   end function liquidus_brine_salinity_mush
     224             : 
     225             : !=======================================================================
     226             : ! Liquidus relation: equilibrium temperature as function of brine salinity
     227             : ! based on empirical data from Assur (1958)
     228             : 
     229   532337388 :   function liquidus_temperature_mush(Sbr) result(zTin)
     230             : 
     231             :     real(kind=dbl_kind), intent(in) :: &
     232             :          Sbr    ! ice brine salinity (ppt)
     233             : 
     234             :     real(kind=dbl_kind) :: &
     235             :          zTin   ! ice layer temperature (C)
     236             : 
     237             :     real(kind=dbl_kind) :: &
     238    49531582 :          t_high ! mask for high temperature liquidus region
     239             : 
     240             :     real(kind=dbl_kind) :: &
     241             :        M1_liq, &! brine salinity to temperature   ! LCOV_EXCL_LINE
     242             :        N1_liq, &   ! LCOV_EXCL_LINE
     243             :        O1_liq, &   ! LCOV_EXCL_LINE
     244             :        M2_liq, &   ! LCOV_EXCL_LINE
     245             :        N2_liq, &   ! LCOV_EXCL_LINE
     246    49531582 :        O2_liq
     247             : 
     248             :     character(len=*),parameter :: subname='(liquidus_temperature_mush)'
     249             : 
     250             :     ! brine salinity to temperature
     251   532337388 :     M1_liq = az1_liq
     252   532337388 :     N1_liq = -az1p_liq
     253   532337388 :     O1_liq = -bz1_liq / az1_liq
     254   532337388 :     M2_liq = az2_liq
     255   532337388 :     N2_liq = -az2p_liq
     256   532337388 :     O2_liq = -bz2_liq / az2_liq
     257             : 
     258   532337388 :     t_high = merge(c1, c0, (Sbr <= Sb_liq))
     259             : 
     260             :     zTin = ((Sbr / (M1_liq + N1_liq * Sbr)) + O1_liq) * t_high + &
     261   532337388 :           ((Sbr / (M2_liq + N2_liq * Sbr)) + O2_liq) * (c1 - t_high)
     262             : 
     263   532337388 :   end function liquidus_temperature_mush
     264             : 
     265             : !=======================================================================
     266             : !autodocument_start icepack_enthalpy_mush
     267             : ! Enthalpy of mush from mush temperature and bulk salinity
     268             : 
     269    45684843 :   function icepack_enthalpy_mush(zTin, zSin) result(zqin)
     270             : 
     271             :     real(kind=dbl_kind), intent(in) :: &
     272             :          zTin, & ! ice layer temperature (C)   ! LCOV_EXCL_LINE
     273             :          zSin    ! ice layer bulk salinity (ppt)
     274             : 
     275             :     real(kind=dbl_kind) :: &
     276             :          zqin    ! ice layer enthalpy (J m-3)
     277             : 
     278             : !autodocument_end
     279             : 
     280             :     real(kind=dbl_kind) :: &
     281     5968394 :          phi     ! ice liquid fraction
     282             : 
     283             :     character(len=*),parameter :: subname='(icepack_enthalpy_mush)'
     284             : 
     285    45684843 :     phi = icepack_mushy_liquid_fraction(zTin, zSin)
     286             : 
     287             :     zqin = phi * (cp_ocn * rhow - cp_ice * rhoi) * zTin + &
     288    45684843 :            rhoi * cp_ice * zTin - (c1 - phi) * rhoi * Lfresh
     289             : 
     290    45684843 :   end function icepack_enthalpy_mush
     291             : 
     292             : !=======================================================================
     293             : ! Enthalpy of mush from mush temperature and liquid fraction
     294             : 
     295   507168144 :   function enthalpy_mush_liquid_fraction(zTin, phi) result(zqin)
     296             : 
     297             :     real(kind=dbl_kind), intent(in) :: &
     298             :          zTin, & ! ice layer temperature (C)   ! LCOV_EXCL_LINE
     299             :          phi     ! liquid fraction
     300             : 
     301             :     real(kind=dbl_kind) :: &
     302             :          zqin    ! ice layer enthalpy (J m-3)
     303             : 
     304             :     character(len=*),parameter :: subname='(enthalpy_mush_liquid_fraction)'
     305             : 
     306             :     zqin = phi * (cp_ocn * rhow - cp_ice * rhoi) * zTin + &
     307   507168144 :            rhoi * cp_ice * zTin - (c1 - phi) * rhoi * Lfresh
     308             : 
     309   507168144 :   end function enthalpy_mush_liquid_fraction
     310             : 
     311             : !=======================================================================
     312             : ! Enthalpy of melting of mush from bulk salinity
     313             : ! Energy needed to fully melt mush (T < 0)
     314             : 
     315   270816792 :   function enthalpy_of_melting(zSin) result(qm)
     316             : 
     317             :     real(kind=dbl_kind), intent(in) :: &
     318             :          zSin ! ice layer bulk salinity (ppt)
     319             : 
     320             :     real(kind=dbl_kind) :: &
     321             :          qm   ! melting ice enthalpy (J m-3)
     322             : 
     323             :     character(len=*),parameter :: subname='(enthalpy_of_melting)'
     324             : 
     325   270816792 :     qm = cp_ocn * rhow * liquidus_temperature_mush(zSin)
     326             : 
     327   270816792 :   end function enthalpy_of_melting
     328             : 
     329             : !=======================================================================
     330             : ! Enthalpy of brine (fully liquid) from temperature
     331             : 
     332  1291987279 :   function enthalpy_brine(zTin) result(qbr)
     333             : 
     334             :     real(kind=dbl_kind), intent(in) :: &
     335             :          zTin ! ice layer temperature (C)
     336             : 
     337             :     real(kind=dbl_kind) :: &
     338             :          qbr  ! brine enthalpy (J m-3)
     339             : 
     340             :     character(len=*),parameter :: subname='(enthalpy_brine)'
     341             : 
     342  1291987279 :     qbr = cp_ocn * rhow * zTin
     343             : 
     344  1291987279 :   end function enthalpy_brine
     345             : 
     346             : !=======================================================================
     347             : !autodocument_start icepack_mushy_temperature_mush
     348             : ! Temperature of mush from mush enthalpy and bulk salinity
     349             : 
     350   954079630 :   function icepack_mushy_temperature_mush(zqin, zSin) result(zTin)
     351             : 
     352             :     real(kind=dbl_kind), intent(in) :: &
     353             :          zqin   , & ! ice enthalpy (J m-3)   ! LCOV_EXCL_LINE
     354             :          zSin       ! ice layer bulk salinity (ppt)
     355             : 
     356             :     real(kind=dbl_kind) :: &
     357             :          zTin       ! ice layer temperature (C)
     358             : 
     359             : !autodocument_end
     360             : 
     361             :     real(kind=dbl_kind) :: &
     362             :          qb     , & ! liquidus break enthalpy   ! LCOV_EXCL_LINE
     363             :          q0     , & ! fully melted enthalpy   ! LCOV_EXCL_LINE
     364             :          A      , & ! quadratic equation A parameter   ! LCOV_EXCL_LINE
     365             :          B      , & ! quadratic equation B parameter   ! LCOV_EXCL_LINE
     366             :          C      , & ! quadratic equation C parameter   ! LCOV_EXCL_LINE
     367             :          S_low  , & ! mask for salinity less than the liquidus break salinity   ! LCOV_EXCL_LINE
     368             :          t_high , & ! mask for high temperature liquidus region   ! LCOV_EXCL_LINE
     369             :          t_low  , & ! mask for low temperature liquidus region   ! LCOV_EXCL_LINE
     370    90187846 :          q_melt     ! mask for all mush melted
     371             : 
     372             :     ! quadratic constants - higher temperature region
     373             :     real(kind=dbl_kind) :: &
     374             :          AS1_liq, AC1_liq,          & ! quadratic constants - higher temperature region   ! LCOV_EXCL_LINE
     375             :          BS1_liq, BC1_liq, BQ1_liq, & ! "   ! LCOV_EXCL_LINE
     376             :          CS1_liq, CC1_liq, CQ1_liq, & ! "   ! LCOV_EXCL_LINE
     377             :          AS2_liq, AC2_liq,          & ! quadratic constants - lower temperature region   ! LCOV_EXCL_LINE
     378             :          BS2_liq, BC2_liq, BQ2_liq, & ! "   ! LCOV_EXCL_LINE
     379             :          CS2_liq, CC2_liq, CQ2_liq, & ! "   ! LCOV_EXCL_LINE
     380             :          D_liq, E_liq,              & ! break enthalpy constants   ! LCOV_EXCL_LINE
     381             :          F1_liq, G1_liq, H1_liq,    & ! just fully melted enthapy constants   ! LCOV_EXCL_LINE
     382             :          F2_liq, G2_liq, H2_liq,    & ! "   ! LCOV_EXCL_LINE
     383    90187846 :          I_liq                        ! warmer than fully melted constants
     384             : 
     385             :     character(len=*),parameter :: subname='(icepack_mushy_temperature_mush)'
     386             : 
     387             :   !--------------------------------------------------------
     388             : 
     389             :   ! quadratic constants - higher temperature region
     390   954079630 :     AS1_liq = az1p_liq * (rhow * cp_ocn - rhoi * cp_ice)
     391   954079630 :     AC1_liq = rhoi * cp_ice * az1_liq
     392             :     BS1_liq = (c1 + bz1p_liq) * (rhow * cp_ocn - rhoi * cp_ice)  &
     393   954079630 :             + rhoi * Lfresh * az1p_liq
     394   954079630 :     BQ1_liq = -az1_liq
     395   954079630 :     BC1_liq = rhoi * cp_ice * bz1_liq - rhoi * Lfresh * az1_liq
     396   954079630 :     CS1_liq = rhoi * Lfresh * (c1 + bz1p_liq)
     397   954079630 :     CQ1_liq = -bz1_liq
     398   954079630 :     CC1_liq = -rhoi * Lfresh * bz1_liq
     399             : 
     400             :   ! quadratic constants - lower temperature region
     401   954079630 :     AS2_liq = az2p_liq * (rhow * cp_ocn - rhoi * cp_ice)
     402   954079630 :     AC2_liq = rhoi * cp_ice * az2_liq
     403             :     BS2_liq = (c1 + bz2p_liq) * (rhow * cp_ocn - rhoi * cp_ice)  &
     404   954079630 :             + rhoi * Lfresh * az2p_liq
     405   954079630 :     BQ2_liq = -az2_liq
     406   954079630 :     BC2_liq = rhoi * cp_ice * bz2_liq - rhoi * Lfresh * az2_liq
     407   954079630 :     CS2_liq = rhoi * Lfresh * (c1 + bz2p_liq)
     408   954079630 :     CQ2_liq = -bz2_liq
     409   954079630 :     CC2_liq = -rhoi * Lfresh * bz2_liq
     410             : 
     411             :   ! break enthalpy constants
     412             :     D_liq = ((c1 + az1p_liq*Tb_liq + bz1p_liq) &
     413             :           / (       az1_liq*Tb_liq + bz1_liq)) &   ! LCOV_EXCL_LINE
     414   954079630 :           * ((cp_ocn*rhow - cp_ice*rhoi)*Tb_liq + Lfresh*rhoi)
     415   954079630 :     E_liq = cp_ice*rhoi*Tb_liq - Lfresh*rhoi
     416             : 
     417             :   ! just fully melted enthapy constants
     418   954079630 :     F1_liq = (  -c1000 * cp_ocn * rhow) / az1_liq
     419   954079630 :     G1_liq =    -c1000
     420   954079630 :     H1_liq = (-bz1_liq * cp_ocn * rhow) / az1_liq
     421   954079630 :     F2_liq = (  -c1000 * cp_ocn * rhow) / az2_liq
     422   954079630 :     G2_liq =    -c1000
     423   954079630 :     H2_liq = (-bz2_liq * cp_ocn * rhow) / az2_liq
     424             : 
     425             :   ! warmer than fully melted constants
     426   954079630 :     I_liq = c1 / (cp_ocn * rhow)
     427             : 
     428             :     ! just melted enthalpy
     429   954079630 :     S_low = merge(c1, c0, (zSin < Sb_liq))
     430             :     q0 = ((F1_liq * zSin) / (G1_liq + zSin) + H1_liq) * S_low + &
     431   954079630 :          ((F2_liq * zSin) / (G2_liq + zSin) + H2_liq) * (c1 - S_low)
     432   954079630 :     q_melt = merge(c1, c0, (zqin > q0))
     433             : 
     434             :     ! break enthalpy
     435   954079630 :     qb = D_liq * zSin + E_liq
     436   954079630 :     t_high = merge(c1, c0, (zqin > qb))
     437   954079630 :     t_low = c1 - t_high
     438             : 
     439             :     ! quadratic values
     440             :     A = (AS1_liq * zSin                 + AC1_liq) * t_high + &
     441   954079630 :         (AS2_liq * zSin                 + AC2_liq) * t_low
     442             : 
     443             :     B = (BS1_liq * zSin + BQ1_liq * zqin + BC1_liq) * t_high + &
     444   954079630 :         (BS2_liq * zSin + BQ2_liq * zqin + BC2_liq) * t_low
     445             : 
     446             :     C = (CS1_liq * zSin + CQ1_liq * zqin + CC1_liq) * t_high + &
     447   954079630 :         (CS2_liq * zSin + CQ2_liq * zqin + CC2_liq) * t_low
     448             : 
     449   954079630 :     zTin = (-B + sqrt(max(B**2 - c4 * A * C,puny))) / (c2 * A)
     450             : 
     451             :     ! change T if all melted
     452   954079630 :     zTin = q_melt * zqin * I_liq + (c1 - q_melt) * zTin
     453             : 
     454   954079630 :   end function icepack_mushy_temperature_mush
     455             : 
     456             : !=======================================================================
     457             : ! Temperature of mush from mush enthalpy and liquid fraction
     458             : 
     459   236964693 :   function temperature_mush_liquid_fraction(zqin, phi) result(zTin)
     460             : 
     461             :     real(kind=dbl_kind), intent(in) :: &
     462             :          zqin   , & ! ice enthalpy (J m-3)   ! LCOV_EXCL_LINE
     463             :          phi        ! liquid fraction
     464             : 
     465             :     real(kind=dbl_kind) :: &
     466             :          zTin       ! ice layer temperature (C)
     467             : 
     468             :     character(len=*),parameter :: subname='(temperature_mush_liquid_fraction)'
     469             : 
     470             :     zTin = (zqin + (c1 - phi) * rhoi * Lfresh) / &
     471   236964693 :           (phi * (cp_ocn * rhow - cp_ice * rhoi) + rhoi * cp_ice)
     472             : 
     473   236964693 :   end function temperature_mush_liquid_fraction
     474             : 
     475             : !=======================================================================
     476             : ! Mush heat conductivity from mush temperature and bulk salinity
     477             : 
     478   236964693 :   function heat_conductivity(zTin, zSin) result(km)
     479             : 
     480             :     real(kind=dbl_kind), intent(in) :: &
     481             :          zTin              , & ! ice layer temperature (C)   ! LCOV_EXCL_LINE
     482             :          zSin                  ! ice layer bulk salinity (ppt)
     483             : 
     484             :     real(kind=dbl_kind) :: &
     485             :          km                    ! ice layer conductivity (W m-1 K-1)
     486             : 
     487             :     real(kind=dbl_kind) :: &
     488    21603638 :          phi                   ! liquid fraction
     489             : 
     490             :     character(len=*),parameter :: subname='(heat_conductivity)'
     491             : 
     492   236964693 :     phi = icepack_mushy_liquid_fraction(zTin, zSin)
     493             : 
     494   236964693 :     km = phi * (kb - ki) + ki
     495             : 
     496   236964693 :   end function heat_conductivity
     497             : 
     498             : !=======================================================================
     499             : !autodocument_start icepack_mushy_liquid_fraction
     500             : ! Liquid fraction of mush from mush temperature and bulk salinity
     501             : 
     502   999764473 :   function icepack_mushy_liquid_fraction(zTin, zSin) result(phi)
     503             : 
     504             :     real(kind=dbl_kind), intent(in) :: &
     505             :          zTin, & ! ice layer temperature (C)   ! LCOV_EXCL_LINE
     506             :          zSin    ! ice layer bulk salinity (ppt)
     507             : 
     508             :     real(kind=dbl_kind) :: &
     509             :          phi     ! liquid fraction
     510             : 
     511             : !autodocument_end
     512             : 
     513             :     real(kind=dbl_kind) :: &
     514    96156240 :          Sbr     ! brine salinity (ppt)
     515             : 
     516             :     character(len=*),parameter :: subname='(icepack_mushy_liquid_fraction)'
     517             : 
     518   999764473 :     Sbr = max(liquidus_brine_salinity_mush(zTin),puny)
     519   999764473 :     phi = zSin / max(Sbr, zSin)
     520             : 
     521   999764473 :   end function icepack_mushy_liquid_fraction
     522             : 
     523             : !=======================================================================
     524             : 
     525             : end module icepack_mushy_physics

Generated by: LCOV version 1.14-6-g40580cd