Skip to content

Calliope.solubility

solubility

Solubility(composition)

Solubility base class.

Pressures are in bar; subclasses return dissolved concentration in ppmw (parts-per-million by weight in the silicate melt).

Source code in src/calliope/solubility.py
20
21
def __init__(self, composition):
    self.callmodel = getattr(self, composition)

SolubilityCH4(composition='basalt_ardia')

Bases: Solubility

CH4 solubility models

Source code in src/calliope/solubility.py
171
172
def __init__(self, composition='basalt_ardia'):
    super().__init__(composition)

basalt_ardia(p, p_total)

Ardia 2013

Source code in src/calliope/solubility.py
174
175
176
177
178
179
def basalt_ardia(self, p, p_total):
    """Ardia 2013"""
    p_total *= 1e-4  # Convert to GPa
    p *= 1e-4  # Convert to GPa
    ppmw = p * np.exp(4.93 - (1.93 * p_total))
    return ppmw

SolubilityCO(composition='mafic_armstrong')

Bases: Solubility

CO solubility models

Source code in src/calliope/solubility.py
185
186
def __init__(self, composition='mafic_armstrong'):
    super().__init__(composition)

mafic_armstrong(p, p_total)

Armstrong 2015

Source code in src/calliope/solubility.py
188
189
190
191
def mafic_armstrong(self, p, p_total):
    """Armstrong 2015"""
    ppmw = 10 ** (-0.738 + 0.876 * np.log10(p) - 5.44e-5 * p_total)
    return ppmw

SolubilityCO2(composition='basalt_dixon')

Bases: Solubility

CO2 solubility models

Source code in src/calliope/solubility.py
102
103
def __init__(self, composition='basalt_dixon'):
    super().__init__(composition)

basalt_dixon(p, temp)

Dixon et al. (1995)

Source code in src/calliope/solubility.py
105
106
107
108
109
def basalt_dixon(self, p, temp):
    """Dixon et al. (1995)"""
    ppmw = (3.8e-7) * p * np.exp(-23 * (p - 1) / (83.15 * temp))
    ppmw = 1.0e4 * (4400 * ppmw) / (36.6 - 44 * ppmw)
    return ppmw

SolubilityH2O(composition='peridotite')

Bases: Solubility

H2O solubility models

Source code in src/calliope/solubility.py
35
36
def __init__(self, composition='peridotite'):
    super().__init__(composition)

anorthite_diopside(p)

Newcombe et al. (2017)

Source code in src/calliope/solubility.py
38
39
40
def anorthite_diopside(self, p):
    """Newcombe et al. (2017)"""
    return self.power_law(p, 727, 0.5)

basalt_dixon(p)

Dixon et al. (1995) refit by Paolo Sossi

Source code in src/calliope/solubility.py
46
47
48
def basalt_dixon(self, p):
    """Dixon et al. (1995) refit by Paolo Sossi"""
    return self.power_law(p, 965, 0.5)

basalt_wilson(p)

Hamilton (1964) and Wilson and Head (1981)

Source code in src/calliope/solubility.py
50
51
52
def basalt_wilson(self, p):
    """Hamilton (1964) and Wilson and Head (1981)"""
    return self.power_law(p, 215, 0.7)

lunar_glass(p)

Newcombe et al. (2017)

Source code in src/calliope/solubility.py
54
55
56
def lunar_glass(self, p):
    """Newcombe et al. (2017)"""
    return self.power_law(p, 683, 0.5)

peridotite(p)

Sossi et al. (2023)

Source code in src/calliope/solubility.py
42
43
44
def peridotite(self, p):
    """Sossi et al. (2023)"""
    return self.power_law(p, 524, 0.5)

SolubilityN2(composition='libourel', x_SiO2=0.56, x_Al2O3=0.11, x_TiO2=0.01)

Bases: Solubility

N2 solubility models.

Parameters:

Name Type Description Default
composition str

Solubility-law name. 'libourel' selects the linear Henry's-law form of Libourel et al. (2003); 'dasgupta' selects the physical-state-dependent form of Dasgupta et al. (2022).

'libourel'
x_SiO2 float

Melt mole fractions used by the Dasgupta et al. (2022) law to compute the molecular-N2 prefactor dasfac_2. Defaults (0.56, 0.11, 0.01) match the Earth-mantle reference adopted in prior CALLIOPE releases; override for non-Earth compositions. These kwargs have no effect when composition='libourel'.

0.56
x_Al2O3 float

Melt mole fractions used by the Dasgupta et al. (2022) law to compute the molecular-N2 prefactor dasfac_2. Defaults (0.56, 0.11, 0.01) match the Earth-mantle reference adopted in prior CALLIOPE releases; override for non-Earth compositions. These kwargs have no effect when composition='libourel'.

0.56
x_TiO2 float

Melt mole fractions used by the Dasgupta et al. (2022) law to compute the molecular-N2 prefactor dasfac_2. Defaults (0.56, 0.11, 0.01) match the Earth-mantle reference adopted in prior CALLIOPE releases; override for non-Earth compositions. These kwargs have no effect when composition='libourel'.

0.56
Source code in src/calliope/solubility.py
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
def __init__(self, composition='libourel', x_SiO2=0.56, x_Al2O3=0.11, x_TiO2=0.01):
    super().__init__(composition)

    # Stored on the instance so callers can introspect them; defaults
    # match the Earth-mantle reference used by Dasgupta et al. (2022).
    self.x_SiO2 = x_SiO2
    self.x_Al2O3 = x_Al2O3
    self.x_TiO2 = x_TiO2
    # dasfac_2 is only consumed by the dasgupta() path, so skip the
    # exp(...) precompute when libourel is selected. This avoids a
    # spurious RuntimeWarning at construction time when a libourel
    # caller passes extreme composition values that would overflow
    # the exponent (the dasgupta path is the only one that cares).
    if composition == 'dasgupta':
        self.dasfac_2 = np.exp(4.67 + 7.11 * x_SiO2 - 13.06 * x_Al2O3 - 120.67 * x_TiO2)
    else:
        self.dasfac_2 = None

dasgupta(p, ptot, temp, fO2_shift)

Dasgupta et al. (2022)

Source code in src/calliope/solubility.py
152
153
154
155
156
157
158
159
160
161
162
163
164
165
def dasgupta(self, p, ptot, temp, fO2_shift):
    """Dasgupta et al. (2022)"""

    # convert bar to GPa
    pb_N2 = p * 1.0e-4
    pb_tot = ptot * 1.0e-4

    pb_tot = max(pb_tot, 1e-15)

    # calculate N2 concentration in melt
    ppmw = pb_N2**0.5 * np.exp(5908.0 * pb_tot**0.5 / temp - 1.6 * fO2_shift)
    ppmw += pb_N2 * self.dasfac_2

    return ppmw

libourel(p)

Libourel et al. (2003)

Source code in src/calliope/solubility.py
147
148
149
150
def libourel(self, p):
    """Libourel et al. (2003)"""
    ppmw = self.power_law(p, 0.0611, 1.0)
    return ppmw

SolubilityS2(composition='gaillard', x_FeO=10.0)

Bases: Solubility

S2 solubility models.

Parameters:

Name Type Description Default
composition str

Solubility-law name (currently only 'gaillard' is implemented).

'gaillard'
x_FeO float

Melt FeO content [wt%] used by the Gaillard et al. (2022) law. The default value matches the Earth-mantle reference adopted in prior CALLIOPE releases; override for non-Earth bulk compositions.

10.0
Source code in src/calliope/solubility.py
73
74
75
76
def __init__(self, composition='gaillard', x_FeO=10.0):
    self.fO2_model = OxygenFugacity()
    self.x_FeO = x_FeO
    super().__init__(composition)