Density
Methods
The density equation of state can be specified in a number of ways
GeoParams.MaterialParameters.Density.ConstantDensity
— TypeConstantDensity(ρ=2900kg/m^3)
Set a constant density:
\[ \rho = cst\]
where $\rho$ is the density [$kg/m^3$].
GeoParams.MaterialParameters.Density.PT_Density
— TypePT_Density(ρ0=2900kg/m^3, α=3e-5/K, β=1e-9/Pa, T0=0C, P=0MPa)
Set a pressure and temperature-dependent density:
\[ \rho = \rho_0 (1.0 - \alpha (T-T_0) + \beta (P-P_0) )\]
where $\rho_0$ is the density [$kg/m^3$] at reference temperature $T_0$ and pressure $P_0$, $\alpha$ is the temperature dependence of density and $\beta$ the pressure dependence.
GeoParams.MaterialParameters.Density.T_Density
— TypeT_Density(ρ0=2900kg/m^3, α=3e-5/K, T₀=273.15K)
Set a temperature-dependent density:
\[ \rho = \rho_0 (1 - \alpha * (T - T\_0) )\]
where $\rho_0$ is the density [$kg/m^3$] at reference temperature $T_0$ and $\alpha$ the temperature dependence.
GeoParams.MaterialParameters.Density.Compressible_Density
— TypeCompressible_Density(ρ0=2900kg/m^3, β=1e-9/Pa, P₀=0MPa)
Set a pressure-dependent density:
\[ \rho = \rho_0 \exp(β*(P - P\_0))\]
where $\rho_0$ is the density [$kg/m^3$] at reference pressure $P_0$ and $\beta$ the pressure dependence.
GeoParams.MaterialParameters.Density.MeltDependent_Density
— TypeMeltDependent_Density(ρsolid=ConstantDensity(), ρmelt=ConstantDensity())
If we use a single phase code the average density of a partially molten rock is
\[ \rho = \phi \rho_{\textrm{melt}} + (1-\phi) \rho_{\textrm{solid}}\]
where $\rho$ is the average density [$kg/m^3$], $\rho_{ extrm{melt}}$ the melt density, $\rho_{ extrm{solid}}$ the solid density and $\phi$ the melt fraction.
Note that any density formulation can be used for melt and solid.
Computational routines
To evaluate density within a user routine, use this:
GeoParams.MaterialParameters.Density.compute_density
— Functioncompute_density(P,T, s::PhaseDiagram_LookupTable)
Interpolates density as a function of T,P
from a lookup table
GeoParams.MaterialParameters.Density.compute_density!
— Functioncompute_density!(rho::AbstractArray{_T, ndim}, MatParam::NTuple{N,AbstractMaterialParamsStruct}, Phases::AbstractArray{_I, ndim}; P=nothing, T=nothing) where {ndim,N,_T,_I<:Integer}
In-place computation of density rho
for the whole domain and all phases, in case a vector with phase properties MatParam
is provided, along with P
and T
arrays. This assumes that the Phase
of every point is specified as an Integer in the Phases
array.
Example
julia> MatParam = (SetMaterialParams(Name="Mantle", Phase=1,
CreepLaws= (PowerlawViscous(), LinearViscous(η=1e23Pa*s)),
Density = PT_Density()
),
SetMaterialParams(Name="Crust", Phase=2,
CreepLaws= (PowerlawViscous(), LinearViscous(η=1e23Pas)),
Density = ConstantDensity(ρ=2900kg/m^3))
);
julia> Phases = ones(Int64,400,400);
julia> Phases[:,20:end] .= 2
julia> rho = zeros(size(Phases))
julia> T = ones(size(Phases))
julia> P = ones(size(Phases))*10
julia> args = (P=P, T=T)
julia> compute_density!(rho, MatParam, Phases, args)
julia> rho
400×400 Matrix{Float64}:
2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 … 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0
2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0
2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0
2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0
2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0
2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 … 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0
2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0
2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0
2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0
2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0
2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 … 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0
2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0
2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0
2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0
⋮ ⋮ ⋱ ⋮ ⋮
2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0
2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0
2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0
2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 … 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0
2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0
2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0
2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0
2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0
2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 … 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0
2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0
2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0
2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0
2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2899.91 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0 2900.0
The routine is made to minimize allocations:
julia> using BenchmarkTools
julia> @btime compute_density!($rho, $MatParam, $Phases, P=$P, T=$T)
203.468 μs (0 allocations: 0 bytes)
_____________________________________________________________________________________________________________________________
compute_density!(rho::AbstractArray{_T, N}, MatParam::NTuple{K,AbstractMaterialParamsStruct}, PhaseRatios::AbstractArray{_T, M}, P=nothing, T=nothing)
In-place computation of density rho
for the whole domain and all phases, in case a vector with phase properties MatParam
is provided, along with P
and T
arrays. This assumes that the PhaseRatio
of every point is specified as an Integer in the PhaseRatios
array, which has one dimension more than the data arrays (and has a phase fraction between 0-1)
Note that density values are usually not used in itself in the governing PDE's, but usually in combination with other parameters, such as $\rho g$ or $\rho c_p$. the non-dimensional value of $\rho$ may thus have very large or small values, but multiplied with the other values one often obtains numbers that are closer to one.