source: trunk/LMDZ.COMMON/libf/evolution/NS_soilthprop_mars.F90 @ 3525

Last change on this file since 3525 was 3493, checked in by jbclement, 3 weeks ago

PEM:

  • Renaming of Norbert Schorghofer's subroutines with the prefix 'NS_';
  • Making the extension of all NS's subroutines as '.F90';
  • Deletion of the wrapper subroutine;
  • Making the initialization, variables management and arguments of the main subroutine for the dynamic computation of ice table to be more suitable.

JBC

File size: 5.4 KB
Line 
1subroutine soilthprop(porosity,fill,rhocobs,tiobs,layertype, &
2     &     newrhoc,newti,icefrac)
3!***********************************************************************
4! soilthprop: assign thermal properties of icy soil or dirty ice
5!
6!     porositiy = void space / total volume
7!     rhof = density of free ice in space not occupied by regolith [kg/m^3]
8!     fill = rhof/icedensity <=1 (only relevant for layertype 1)
9!     rhocobs = heat capacity per volume of dry regolith [J/m^3]
10!     tiobs = thermal inertia of dry regolith [SI-units]
11!     layertype: 1=interstitial ice, 2=pure ice or ice with dirt
12!                3=pure ice, 4=ice-cemented soil, 5=custom values
13!     icefrac: fraction of ice in icelayer (only relevant for layertype 2)
14!     output are newti and newrhoc
15!***********************************************************************
16  implicit none
17  integer, intent(IN) :: layertype
18  real(8), intent(IN) :: porosity, fill, rhocobs, tiobs
19  real(8), intent(OUT) :: newti, newrhoc
20  real(8), intent(IN) :: icefrac
21  real(8) kobs, cice, icedensity, kice
22  !parameter (cice=2000.d0, icedensity=926.d0, kice=2.4d0) ! unaffected by scaling
23  parameter (cice=1540.d0, icedensity=927.d0, kice=3.2d0) ! at 198 Kelvin
24  real(8) fA, ki0, ki, k
25  real(8), parameter :: kw=3. ! Mellon et al., JGR 102, 19357 (1997)
26
27  kobs = tiobs**2/rhocobs
28  ! k, rhoc, and ti are defined in between grid points
29  ! rhof and T are defined on grid points
30
31  newrhoc = -9999.
32  newti  = -9999.
33
34  select case (layertype)
35  case (1) ! interstitial ice
36     newrhoc = rhocobs + porosity*fill*icedensity*cice
37     if (fill>0.) then
38        !--linear addition (option A)
39        k = porosity*fill*kice + kobs
40        !--Mellon et al. 1997 (option B)
41        ki0 = porosity/(1/kobs-(1-porosity)/kw)
42        fA = sqrt(fill)
43        ki = (1-fA)*ki0 + fA*kice
44        !k = kw*ki/((1-porosity)*ki+porosity*kw)
45     else
46        k = kobs
47     endif
48     newti = sqrt(newrhoc*k)
49     
50  case (2)  ! massive ice (pure or dirty ice)
51     newrhoc = rhocobs*(1.-icefrac)/(1.-porosity) + icefrac*icedensity*cice
52     k = icefrac*kice + (1.-icefrac)*kw
53     newti = sqrt(newrhoc*k)
54 
55  case (3)  ! all ice, special case of layertype 2, which doesn't use porosity
56     newrhoc = icedensity*cice
57     k = kice
58     newti = sqrt(newrhoc*k)
59 
60  case (4)  ! pores completely filled with ice, special case of layertype 1
61     newrhoc = rhocobs + porosity*icedensity*cice
62     k = porosity*kice + kobs ! option A, end-member case of type 1, option A
63     !k = kw*kice/((1-porosity)*kice+porosity*kw) ! option B, harmonic average
64     newti = sqrt(newrhoc*k)
65
66  case (5)  ! custom values
67     ! values from Mellon et al. (2004) for ice-cemented soil
68     newrhoc = 2018.*1040.
69     k = 2.5
70     newti = sqrt(newrhoc*k)
71
72  case default
73     error stop 'invalid layer type'
74     
75  end select
76 
77end subroutine soilthprop
78
79
80     
81subroutine smartgrid(nz,z,zdepth,thIn,rhoc,porosity,ti,rhocv,layertype,icefrac)
82!***********************************************************************
83! smartgrid: returns intelligently spaced grid and appropriate
84!            values of thermal inertia ti and rho*c in icy layer
85!                 
86!     INPUTS:
87!             nz = number of grid points
88!             z = grid spacing for dry regolith
89!                 (will be partially overwritten)
90!             zdepth = depth where ice table starts
91!                      negative values indicate no ice
92!             rhoc = heat capacity per volume of dry regolith [J/m^3]
93!             thIn = thermal inertia of dry regolith [SI-units]
94!             porosity = void space / total volume
95!             layertypes are explained below 
96!             icefrac = fraction of ice in icelayer
97!
98!     OUTPUTS: z = grid coordinates
99!              vectors ti and rhocv
100!***********************************************************************
101  implicit none
102  integer, intent(IN) :: nz, layertype
103  real(8), intent(IN) :: zdepth, thIn, rhoc, porosity, icefrac
104  real(8), intent(INOUT) :: z(nz)
105  real(8), intent(OUT) :: ti(nz), rhocv(nz)
106  integer j, b
107  real(8) stretch, newrhoc, newti
108  real(8), parameter :: NULL=0.
109 
110  if (zdepth>0 .and. zdepth<z(nz)) then
111
112     select case (layertype)
113     case (1)  ! interstitial ice
114        call soilthprop(porosity,1.d0,rhoc,thIn,1,newrhoc,newti,NULL)
115     case (2)  ! mostly ice (massive ice)
116        call soilthprop(porosity,NULL,rhoc,thIn,2,newrhoc,newti,icefrac)
117     case (3)  ! all ice (pure ice)
118        call soilthprop(NULL,NULL,NULL,NULL,3,newrhoc,newti,NULL)
119     case (4)  ! ice + rock + nothing else (ice-cemented soil)
120        call soilthprop(porosity,NULL,rhoc,NULL,4,newrhoc,newti,NULL)
121     case default
122        error stop 'invalid layer type'
123     end select
124
125     ! Thermal skin depth is proportional to sqrt(kappa)
126     ! thermal diffusivity kappa = k/(rho*c) = I^2/(rho*c)**2
127     stretch = (newti/thIn)*(rhoc/newrhoc) ! ratio of sqrt(thermal diffusivity)
128     
129     b = 1
130     do j=1,nz
131        if (z(j)<=zdepth) then
132           b = j+1
133           rhocv(j) = rhoc
134           ti(j) = thIn
135        else
136           rhocv(j) = newrhoc
137           ti(j) = newti
138        endif
139        ! print *,j,z(j),ti(j),rhocv(j)
140     enddo
141     do j=b+1,nz
142        z(j) = z(b) + stretch*(z(j)-z(b))
143     enddo
144     
145     ! print *,'zmax=',z(nz),' b=',b,' stretch=',stretch
146     ! print *,'depth at b-1, b ',z(b-1),z(b)
147     ! print *,'ti1=',thIn,' ti2=',newti
148     ! print *,'rhoc1=',rhoc,' rhoc2=',newrhoc
149  endif
150 
151end subroutine smartgrid
152
Note: See TracBrowser for help on using the repository browser.