Source code for burnman.classes.combinedmineral
# This file is part of BurnMan - a thermoelastic and thermodynamic toolkit for
# the Earth and Planetary Sciences
# Copyright (C) 2012 - 2017 by the BurnMan team, released under the GNU
# GPL v2 or later.
import numpy as np
from .mineral import Mineral, material_property
from .solution import Solution
from .solutionmodel import MechanicalSolution
[docs]
class CombinedMineral(Mineral):
"""
This is the base class for endmembers constructed from a
linear combination of other minerals.
Instances of this class should be initialised with a
list of Mineral instances, a second list containing the
number of moles of each mineral, and (optionally) a
third list containing three floats describing a
free energy adjustment which is linear in pressure and temperature
(i.e. a constant energy [J/mol], entropy [J/K/mol]
and volume adjustment [J/Pa/mol or m^3/mol]).
For example, a crude approximation to a bridgmanite model might be
bdg = CombinedMineral([per, stv], [1.0, 1.0], [-15.e3, 0., 0.])
This class is available as :class:`burnman.CombinedMineral`.
"""
def __init__(
self,
mineral_list,
molar_amounts,
energy_adjustment=[],
name="User-created endmember",
):
model = MechanicalSolution(endmembers=[[m, ""] for m in mineral_list])
self.mixture = Solution(solution_model=model, molar_fractions=molar_amounts)
# Remove elements from the chemical formula if they have
# negligible concentrations
for key, value in list(self.mixture.formula.items()):
if np.abs(value) < 1.0e-10:
self.mixture.formula.pop(key)
self.params = {
"name": name,
"formula": self.mixture.formula,
"equation_of_state": "combined",
"molar_mass": self.mixture.molar_mass,
"n": sum(self.mixture.formula.values()),
}
if energy_adjustment != []:
assert len(energy_adjustment) == 3
dE, dS, dV = energy_adjustment
self.property_modifiers = [
["linear", {"delta_E": dE, "delta_S": dS, "delta_V": dV}]
]
Mineral.__init__(self)
[docs]
def set_state(self, pressure, temperature):
self.mixture.set_state(pressure, temperature)
Mineral.set_state(self, pressure, temperature)
@material_property
def molar_gibbs(self):
"""
Returns Gibbs free energy of the mineral [J]
Aliased with self.gibbs
"""
return self.mixture.molar_gibbs + self._property_modifiers["G"]
@material_property
def _molar_volume_unmodified(self):
return self.mixture.molar_volume
@material_property
def molar_volume(self):
"""
Returns molar volume of the mineral [m^3/mol]
Aliased with self.V
"""
return self.mixture.molar_volume + self._property_modifiers["dGdP"]
@material_property
def molar_entropy(self):
"""
Returns entropy of the mineral [J]
Aliased with self.S
"""
return self.mixture.molar_entropy - self._property_modifiers["dGdT"]
@material_property
def isothermal_bulk_modulus_reuss(self):
"""
Returns isothermal bulk modulus of the mineral [Pa]
Aliased with self.K_T
"""
K_T_orig = self.mixture.isothermal_bulk_modulus_reuss
return self.molar_volume / (
(self._molar_volume_unmodified / K_T_orig)
- self._property_modifiers["d2GdP2"]
)
@material_property
def shear_modulus(self):
"""
Returns shear modulus of the mineral [Pa]
Aliased with self.G
"""
return self.mixture.shear_modulus
@material_property
def thermal_expansivity(self):
"""
Returns thermal expansion coefficient (alpha) of the mineral [1/K]
Aliased with self.alpha
"""
return (
(self.mixture.thermal_expansivity * self._molar_volume_unmodified)
+ self._property_modifiers["d2GdPdT"]
) / self.molar_volume
@material_property
def molar_heat_capacity_p(self):
"""
Returns heat capacity at constant pressure of the mineral [J/K/mol]
Aliased with self.C_p
"""
return (
self.mixture.molar_heat_capacity_p
- self.temperature * self._property_modifiers["d2GdT2"]
)
"""
Properties from mineral parameters,
Legendre transformations
or Maxwell relations
"""
@material_property
def molar_mass(self):
"""
Returns molar mass of the mineral [kg/mol]
"""
return self.mixture.molar_mass
@material_property
def formula(self):
"""
Returns molar chemical formula of the mineral
"""
return self.mixture.formula
@material_property
def density(self):
"""
Returns density of the mineral [kg/m^3]
Aliased with self.rho
"""
return self.molar_mass / self.molar_volume
@material_property
def molar_internal_energy(self):
"""
Returns molar internal energy of the mineral [J/mol]
Aliased with self.energy
"""
return (
self.molar_gibbs
- self.pressure * self.molar_volume
+ self.temperature * self.molar_entropy
)
@material_property
def molar_helmholtz(self):
"""
Returns molar Helmholtz free energy of the mineral [J/mol]
Aliased with self.helmholtz
"""
return self.molar_gibbs - self.pressure * self.molar_volume
@material_property
def molar_enthalpy(self):
"""
Returns molar enthalpy of the mineral [J/mol]
Aliased with self.H
"""
return self.molar_gibbs + self.temperature * self.molar_entropy
@material_property
def isentropic_bulk_modulus_reuss(self):
"""
Returns adiabatic bulk modulus of the mineral [Pa]
Aliased with self.K_S
"""
if self.temperature < 1.0e-10:
return self.isothermal_bulk_modulus_reuss
else:
return (
self.isothermal_bulk_modulus_reuss
* self.molar_heat_capacity_p
/ self.molar_heat_capacity_v
)
@material_property
def isothermal_compressibility_reuss(self):
"""
Returns isothermal compressibility of the mineral
(or inverse isothermal bulk modulus) [1/Pa]
Aliased with self.K_T
"""
return 1.0 / self.isothermal_bulk_modulus_reuss
@material_property
def isentropic_compressibility_reuss(self):
"""
Returns adiabatic compressibility of the mineral
(or inverse adiabatic bulk modulus) [1/Pa]
Aliased with self.K_S
"""
return 1.0 / self.isentropic_bulk_modulus_reuss
@material_property
def p_wave_velocity(self):
"""
Returns P wave speed of the mineral [m/s]
Aliased with self.v_p
"""
return np.sqrt(
(self.isentropic_bulk_modulus_reuss + 4.0 / 3.0 * self.shear_modulus)
/ self.density
)
@material_property
def bulk_sound_velocity(self):
"""
Returns bulk sound speed of the mineral [m/s]
Aliased with self.v_phi
"""
return np.sqrt(self.isentropic_bulk_modulus_reuss / self.density)
@material_property
def shear_wave_velocity(self):
"""
Returns shear wave speed of the mineral [m/s]
Aliased with self.v_s
"""
return np.sqrt(self.shear_modulus / self.density)
@material_property
def grueneisen_parameter(self):
"""
Returns grueneisen parameter of the mineral [unitless]
Aliased with self.gr
"""
if self.temperature < 1.0e-12:
return 0.0
else:
return (
self.thermal_expansivity
* self.isothermal_bulk_modulus_reuss
* self.molar_volume
/ self.molar_heat_capacity_v
)
@material_property
def molar_heat_capacity_v(self):
"""
Returns molar heat capacity at constant volume of the mineral [J/K/mol]
Aliased with self.C_v
"""
return (
self.molar_heat_capacity_p
- self.molar_volume
* self.temperature
* self.thermal_expansivity
* self.thermal_expansivity
* self.isothermal_bulk_modulus_reuss
)