LCOV - code coverage report
Current view: top level - icepack/columnphysics - icepack_mushy_physics.F90 (source / functions) Coverage Total Hit
Test: 250115-172326:736c1771a8:7:first,quick,base,travis,io,gridsys,unittest Lines: 100.00 % 103 103
Test Date: 2025-01-15 16:42:12 Functions: 100.00 % 15 15

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

Generated by: LCOV version 2.0-1