Ignore:
Timestamp:
Nov 20, 2024, 3:53:19 PM (25 hours ago)
Author:
jbclement
Message:

PEM:

  • Removing redundant Norbert Schorghofer's subroutines/parameters (follow-up of r3526);
  • Making all Norbert Schorghofer's subroutines with modern explicit interface via modules;
  • Cleaning of "glaciers_mod.F90";
  • Optimization for the computation of ice density according to temperature by using a function.

JBC

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/LMDZ.COMMON/libf/evolution/NS_dyn_ss_ice_m.F90

    r3526 r3527  
     1MODULE dyn_ss_ice_m_mod
     2
     3implicit none
     4
     5CONTAINS
     6
    17!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    28!!!
     
    1521! orbital elements remain constant
    1622!***********************************************************************
    17   use miscparameters, only : pi, d2r, NMAX, marsDay, solsperyear
    18   !use allinterfaces
     23  use constants_marspem_mod, only: sec_per_sol
     24  use fast_subs_mars, only: psv, icelayer_mars, NMAX
     25#ifndef CPP_STD
     26    use comcstfi_h,   only: pi
     27#else
     28    use comcstfi_mod, only: pi
     29#endif
    1930  implicit none
    2031  integer, parameter :: NP=1   ! # of sites
     
    105116 !    print *,'  latitude (deg)',latitude(k),' rho*c (J/m^3/K)',rhoc(k),' thIn=',thIn(k)
    106117 !    print *,'  total pressure=',p0(k),'partial pressure=',pfrost(k)
    107      delta = thIn(k)/rhoc(k)*sqrt(marsDay/pi)
     118     delta = thIn(k)/rhoc(k)*sqrt(sec_per_sol/pi)
    108119 !    print *,'  skin depths (m)',delta,delta*sqrt(solsperyear)
    109120     call soilthprop(porosity,1.d0,rhoc(k),thIn(k),1,newrhoc,newti,icefrac)
     
    170181 
    171182end subroutine dyn_ss_ice_m
     183
     184!=======================================================================
     185
     186subroutine soilthprop(porosity,fill,rhocobs,tiobs,layertype, &
     187     &     newrhoc,newti,icefrac)
     188!***********************************************************************
     189! soilthprop: assign thermal properties of icy soil or dirty ice
     190!
     191!     porositiy = void space / total volume
     192!     rhof = density of free ice in space not occupied by regolith [kg/m^3]
     193!     fill = rhof/icedensity <=1 (only relevant for layertype 1)
     194!     rhocobs = heat capacity per volume of dry regolith [J/m^3]
     195!     tiobs = thermal inertia of dry regolith [SI-units]
     196!     layertype: 1=interstitial ice, 2=pure ice or ice with dirt
     197!                3=pure ice, 4=ice-cemented soil, 5=custom values
     198!     icefrac: fraction of ice in icelayer (only relevant for layertype 2)
     199!     output are newti and newrhoc
     200!***********************************************************************
     201  implicit none
     202  integer, intent(IN) :: layertype
     203  real(8), intent(IN) :: porosity, fill, rhocobs, tiobs
     204  real(8), intent(OUT) :: newti, newrhoc
     205  real(8), intent(IN) :: icefrac
     206  real(8) kobs, cice, icedensity, kice
     207  !parameter (cice=2000.d0, icedensity=926.d0, kice=2.4d0) ! unaffected by scaling
     208  parameter (cice=1540.d0, icedensity=927.d0, kice=3.2d0) ! at 198 Kelvin
     209  real(8) fA, ki0, ki, k
     210  real(8), parameter :: kw=3. ! Mellon et al., JGR 102, 19357 (1997)
     211
     212  kobs = tiobs**2/rhocobs
     213  ! k, rhoc, and ti are defined in between grid points
     214  ! rhof and T are defined on grid points
     215
     216  newrhoc = -9999.
     217  newti  = -9999.
     218
     219  select case (layertype)
     220  case (1) ! interstitial ice
     221     newrhoc = rhocobs + porosity*fill*icedensity*cice
     222     if (fill>0.) then
     223        !--linear addition (option A)
     224        k = porosity*fill*kice + kobs
     225        !--Mellon et al. 1997 (option B)
     226        ki0 = porosity/(1/kobs-(1-porosity)/kw)
     227        fA = sqrt(fill)
     228        ki = (1-fA)*ki0 + fA*kice
     229        !k = kw*ki/((1-porosity)*ki+porosity*kw)
     230     else
     231        k = kobs
     232     endif
     233     newti = sqrt(newrhoc*k)
     234     
     235  case (2)  ! massive ice (pure or dirty ice)
     236     newrhoc = rhocobs*(1.-icefrac)/(1.-porosity) + icefrac*icedensity*cice
     237     k = icefrac*kice + (1.-icefrac)*kw
     238     newti = sqrt(newrhoc*k)
     239 
     240  case (3)  ! all ice, special case of layertype 2, which doesn't use porosity
     241     newrhoc = icedensity*cice
     242     k = kice
     243     newti = sqrt(newrhoc*k)
     244 
     245  case (4)  ! pores completely filled with ice, special case of layertype 1
     246     newrhoc = rhocobs + porosity*icedensity*cice
     247     k = porosity*kice + kobs ! option A, end-member case of type 1, option A
     248     !k = kw*kice/((1-porosity)*kice+porosity*kw) ! option B, harmonic average
     249     newti = sqrt(newrhoc*k)
     250
     251  case (5)  ! custom values
     252     ! values from Mellon et al. (2004) for ice-cemented soil
     253     newrhoc = 2018.*1040.
     254     k = 2.5
     255     newti = sqrt(newrhoc*k)
     256
     257  case default
     258     error stop 'invalid layer type'
     259     
     260  end select
     261 
     262end subroutine soilthprop
     263
     264
     265!=======================================================================
     266     
     267      real*8 function frostpoint(p)
     268!     inverse of psv
     269!     input is partial pressure [Pascal]
     270!     output is temperature [Kelvin]
     271      implicit none
     272      real*8 p
     273     
     274!-----inverse of parametrization 1
     275!      real*8 DHmelt,DHvap,DHsub,R,pt,Tt
     276!      parameter (DHmelt=6008.,DHvap=45050.)
     277!      parameter (DHsub=DHmelt+DHvap)
     278!      parameter (R=8.314,pt=6.11e2,Tt=273.16)
     279!      frostpoint = 1./(1./Tt-R/DHsub*log(p/pt))
     280     
     281!-----inverse of parametrization 2
     282!     inverse of eq. (2) in Murphy & Koop (2005)
     283      real*8 A,B
     284      parameter (A=-6143.7, B=28.9074)
     285      frostpoint = A / (log(p) - B)
     286
     287!-----approximate inverse of parametrization 3
     288!     eq. (8) in Murphy & Koop (2005)
     289!      frostpoint = (1.814625*log(p) + 6190.134)/(29.120 - log(p))
     290     
     291      end function frostpoint
     292
     293END MODULE dyn_ss_ice_m_mod
Note: See TracChangeset for help on using the changeset viewer.