ENKI

Sulfide liquid model of Kress

This notebook shows how to import the sulfide_liquid module of the ThermoEngine package in order to calculate the thermodynamic properties of liquid solutions in the system O-S-Fe-Ni-Cu. The model used is from Kress (Contributions to Mineralogy and Petrology, 156(6):785-797). DOI: 10.1007/s00410-008-0315-z).

The ThermoEngine sulfide_liquid module emulates a “coder” solution phase by wrapping the Python package, SulfLiq, which is available on PyPI.org and as a GitLab project. The underlying code in the SulfLiq module is written in C++ (by Kress), which is wrapped using PyBind11 to expose a Python API.

from thermoengine import core, model, phases, sulfide_liquid
import numpy as np

Test module function calls

This section makes function calls directly to the sulfide_liquid module API. All methods are tested, and all coded functions are “calibration” versions. Note that this method of accessing the module functions is not commonly used. See below for an example of how to load the module into the ThermoEngine package and access the capabilities of the sulfide_liquid module using the standard database and phase properties methods.

Set temperature (K), pressure (bars) and a composition for testing: moles of (O, S, Fe, Ni, Cu) = (2.0, 5.0, 10.0, 1.0, 1.0)

t = 2000.00
p = 1.0
n = np.array([2., 5., 10., 1., 1.])

Characteristics

print(sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_identifier())
print(sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_name())
print(sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_formula(t,p,n))
Version_1_0_0
Sulfide Liquid
O2.0S5.0Fe10.0Ni1.0Cu1.0

Composition conversion methods

c = sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_endmember_number()
e = np.zeros(106)
sum = np.sum(n)
for index in range(0,c):
    end = sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_endmember_elements(index)
    for i in range(0,106):
        e[i] += end[i]*n[index]/sum
nConv = sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_conv_elm_to_moles(e)
for i in range(0,c):
    print ('X[{0:d}] input {1:13.6e}, calc {2:13.6e}, diff {3:13.6e}'.format(
        i, n[i]/sum, nConv[i], nConv[i]-n[i]/sum))
if not sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_test_moles(nConv):
    print ('Output of intrinsic composition calculation fails tests for permissible values.')
X[0] input  1.052632e-01, calc  1.052632e-01, diff  0.000000e+00
X[1] input  2.631579e-01, calc  2.631579e-01, diff  0.000000e+00
X[2] input  5.263158e-01, calc  5.263158e-01, diff  0.000000e+00
X[3] input  5.263158e-02, calc  5.263158e-02, diff  0.000000e+00
X[4] input  5.263158e-02, calc  5.263158e-02, diff  0.000000e+00
print (sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_conv_moles_to_tot_moles(n))
print (sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_conv_moles_to_mole_frac(n))
e = sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_conv_moles_to_elm(n)
print (e)
print (sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_conv_elm_to_moles(e))
print (sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_conv_elm_to_tot_moles(e))
print (sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_conv_elm_to_tot_grams(e))
19.0
[0.10526316 0.26315789 0.52631579 0.05263158 0.05263158]
[ 0.  0.  0.  0.  0.  0.  0.  0.  2.  0.  0.  0.  0.  0.  0.  0.  5.  0.
  0.  0.  0.  0.  0.  0.  0.  0. 10.  0.  1.  1.  0.  0.  0.  0.  0.  0.
  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.
  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.
  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.
  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
[ 2.  5. 10.  1.  1.]
19.0
873.0248000000001
try:
    sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_g(t,p,n)
except:
    print ("Exception generated on first call to function.")

Execute the standard thermodynamic property retrieval functions:

fmt = "{0:<10.10s} {1:13.6e} {2:<10.10s}"
print(fmt.format('G', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_g(t,p,n), 'J'))
print(fmt.format('dGdT', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_dgdt(t,p,n), 'J/K'))
print(fmt.format('dGdP', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_dgdp(t,p,n), 'J/bar'))
print(fmt.format('d2GdT2', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d2gdt2(t,p,n), 'J/K^2'))
print(fmt.format('d2GdTdP', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d2gdtdp(t,p,n), 'J/K-bar'))
print(fmt.format('d2GdP2', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d2gdp2(t,p,n), 'J/bar^2'))
print(fmt.format('d3GdT3', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d3gdt3(t,p,n), 'J/K^3'))
print(fmt.format('d3GdT2dP', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d3gdt2dp(t,p,n), 'J/K^2-bar'))
print(fmt.format('d3GdTdP2', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d3gdtdp2(t,p,n), 'J/K-bar^2'))
print(fmt.format('d3GdP3', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d3gdp3(t,p,n), 'J/bar^3'))
print(fmt.format('S', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_s(t,p,n), 'J/K'))
print(fmt.format('V', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_v(t,p,n), 'J/bar'))
print(fmt.format('Cv', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_cv(t,p,n), 'J/K'))
print(fmt.format('Cp', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_cp(t,p,n), 'J/K'))
print(fmt.format('dCpdT', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_dcpdt(t,p,n), 'J/K^2'))
print(fmt.format('alpha', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_alpha(t,p,n), '1/K'))
print(fmt.format('beta', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_beta(t,p,n), '1/bar'))
print(fmt.format('K', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_K(t,p,n), 'bar'))
print(fmt.format('Kp', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_Kp(t,p,n), ''))
G          -3.878956e+06 J
dGdT       -2.452130e+03 J/K
dGdP        1.884016e+01 J/bar
d2GdT2     -3.800446e-01 J/K^2
d2GdTdP     2.350344e-03 J/K-bar
d2GdP2     -2.574264e-04 J/bar^2
d3GdT3      1.880394e-04 J/K^3
d3GdT2dP    1.310298e-05 J/K^2-bar
d3GdTdP2   -8.854753e-07 J/K-bar^2
d3GdP3      6.631852e-08 J/bar^3
S           2.452130e+03 J/K
V           1.884016e+01 J/bar
Cv          7.171711e+02 J/K
Cp          7.600892e+02 J/K
dCpdT       3.965713e-03 J/K^2
alpha       1.247519e-04 1/K
beta        1.366371e-05 1/bar
K           7.318657e+04 bar
Kp          1.785441e+01

Execute functions that access endmember properties:

fmt = "{0:<10.10s} {1:13.6e} {2:<15.15s}"
print ("number of components", sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_endmember_number())
for index in range(0, c):
    print ("{0:<20.20s}".format(sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_endmember_name(index)), end=' ')
    print ("{0:<20.20s}".format(sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_endmember_formula(index)), end=' ')
    print ("mw: {0:10.2f}".format(sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_endmember_mw(index)))
    print (fmt.format('mu0', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_endmember_mu0(index,t,p), 'J/mol'))
    print (fmt.format('dmu0dT', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_endmember_dmu0dT(index,t,p), 'J/K-mol'))
    print (fmt.format('dmu0dP', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_endmember_dmu0dP(index,t,p), 'J/bar-mol'))
    print (fmt.format('d2mu0dT2', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_endmember_d2mu0dT2(index,t,p), 'J/K^2-mol'))
    print (fmt.format('d2mu0dTdP', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_endmember_d2mu0dTdP(index,t,p), 'J/K-bar-mol'))
    print (fmt.format('d2mu0dP2', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_endmember_d2mu0dP2(index,t,p), 'J/bar^2-mol'))
    print (fmt.format('d3mu0dT3', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_endmember_d3mu0dT3(index,t,p), 'J/K^3-mol'))
    print (fmt.format('d3mu0dT2dP', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_endmember_d3mu0dT2dP(index,t,p), 'J/K^2-bar-mol'))
    print (fmt.format('d3mu0dTdP2', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_endmember_d3mu0dTdP2(index,t,p), 'J/K-bar^2-mol'))
    print (fmt.format('d3mu0dP3', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_endmember_d3mu0dP3(index,t,p), 'J/bar^3-mol'))
    print ("Element array:")
    print (sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_endmember_elements(index))
    print ()
number of components 5
O                    O                    mw:      16.00
mu0        -1.549132e+05 J/mol
dmu0dT     -7.949271e+01 J/K-mol
dmu0dP      6.621094e-06 J/bar-mol
d2mu0dT2    0.000000e+00 J/K^2-mol
d2mu0dTdP   2.208563e-01 J/K-bar-mol
d2mu0dP2    4.443341e-03 J/bar^2-mol
d3mu0dT3    0.000000e+00 J/K^3-mol
d3mu0dT2dP  0.000000e+00 J/K^2-bar-mol
d3mu0dTdP2  0.000000e+00 J/K-bar^2-mol
d3mu0dP3    0.000000e+00 J/bar^3-mol
Element array:
[0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

S                    S                    mw:      32.06
mu0        -1.404959e+05 J/mol
dmu0dT     -9.945635e+01 J/K-mol
dmu0dP      3.267578e-05 J/bar-mol
d2mu0dT2   -3.276800e-02 J/K^2-mol
d2mu0dTdP   1.095107e+00 J/K-bar-mol
d2mu0dP2    2.192835e-02 J/bar^2-mol
d3mu0dT3    0.000000e+00 J/K^3-mol
d3mu0dT2dP  0.000000e+00 J/K^2-bar-mol
d3mu0dTdP2  0.000000e+00 J/K-bar^2-mol
d3mu0dP3    0.000000e+00 J/bar^3-mol
Element array:
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

Fe                   Fe                   mw:      55.85
mu0        -1.276421e+05 J/mol
dmu0dT     -1.044423e+02 J/K-mol
dmu0dP      1.626953e-05 J/bar-mol
d2mu0dT2   -8.192000e-02 J/K^2-mol
d2mu0dTdP   5.442765e-01 J/K-bar-mol
d2mu0dP2    1.091830e-02 J/bar^2-mol
d3mu0dT3    0.000000e+00 J/K^3-mol
d3mu0dT2dP  0.000000e+00 J/K^2-bar-mol
d3mu0dTdP2  0.000000e+00 J/K-bar^2-mol
d3mu0dP3    0.000000e+00 J/bar^3-mol
Element array:
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

Ni                   Ni                   mw:      58.71
mu0        -1.277856e+05 J/mol
dmu0dT     -1.014425e+02 J/K-mol
dmu0dP      1.543945e-05 J/bar-mol
d2mu0dT2    3.276800e-02 J/K^2-mol
d2mu0dTdP   5.200282e-01 J/K-bar-mol
d2mu0dP2    1.036124e-02 J/bar^2-mol
d3mu0dT3    0.000000e+00 J/K^3-mol
d3mu0dT2dP  0.000000e+00 J/K^2-bar-mol
d3mu0dTdP2  0.000000e+00 J/K-bar^2-mol
d3mu0dP3    0.000000e+00 J/bar^3-mol
Element array:
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

Cu                   Cu                   mw:      63.55
mu0        -1.294941e+05 J/mol
dmu0dT     -9.668906e+01 J/K-mol
dmu0dP      1.678711e-05 J/bar-mol
d2mu0dT2    3.276800e-02 J/K^2-mol
d2mu0dTdP   5.639373e-01 J/K-bar-mol
d2mu0dP2    1.126564e-02 J/bar^2-mol
d3mu0dT3    0.000000e+00 J/K^3-mol
d3mu0dT2dP  0.000000e+00 J/K^2-bar-mol
d3mu0dTdP2  0.000000e+00 J/K-bar^2-mol
d3mu0dP3    0.000000e+00 J/bar^3-mol
Element array:
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

Execute functions that access species properties:

print ("number of species", sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_species_number())
for index in range(0, sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_species_number()):
    print ("{0:<20.20s}".format(sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_species_name(index)), end=' ')
    print ("{0:<20.20s}".format(sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_species_formula(index)), end=' ')
    print ("mw: {0:10.2f}".format(sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_species_mw(index)))
    print ("Element array:")
    print (sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_species_elements(index))
    print ()
number of species 15
O                    O                    mw:      16.00
Element array:
[0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

S                    S                    mw:      32.06
Element array:
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

Fe                   Fe                   mw:      55.85
Element array:
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

Ni                   Ni                   mw:      58.71
Element array:
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

Cu                   Cu                   mw:      63.55
Element array:
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

FeO                  FeO                  mw:      71.85
Element array:
[0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

FeO1.5               FeO1.5               mw:      79.85
Element array:
[0.  0.  0.  0.  0.  0.  0.  0.  1.5 0.  0.  0.  0.  0.  0.  0.  0.  0.
 0.  0.  0.  0.  0.  0.  0.  0.  1.  0.  0.  0.  0.  0.  0.  0.  0.  0.
 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.
 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.
 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.
 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0. ]

NiO                  NiO                  mw:      74.71
Element array:
[0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

FeS                  FeS                  mw:      87.91
Element array:
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

NiS                  NiS                  mw:      90.77
Element array:
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

CuS0.5               CuS0.5               mw:      79.58
Element array:
[0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.5 0.
 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  1.  0.  0.  0.  0.  0.  0.
 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.
 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.
 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.
 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0. ]

FeOS                 FeOS                 mw:     103.91
Element array:
[0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

Ni.25S.25O           Ni.25S.25O           mw:      38.69
Element array:
[0.   0.   0.   0.   0.   0.   0.   0.   1.   0.   0.   0.   0.   0.
 0.   0.   0.25 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
 0.25 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
 0.   0.   0.   0.   0.   0.   0.   0.  ]

CuS                  CuS                  mw:      95.61
Element array:
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

CuO                  CuO                  mw:      79.55
Element array:
[0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

Execute functions for molar derivatives

Component first derivative vectors:

def printResult(name, result, units):
    print ("{0:<10.10s}".format(name), end=' ')
    [print ("{0:13.6e}".format(x), end=' ') for x in result]
    print ("{0:<10.10s}".format(units))
def printLabels(n):
    print ("{0:<18.18s}".format(''), end=' ')
    [print ("[{0:3d}]{1:<8.8s}".format(idx, ''), end=' ') for idx in range(len(n))]
    print ()
printLabels(n)
printResult('dGdn', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_dgdn(t,p,n), 'J/m')
printResult('d2GdndT', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d2gdndt(t,p,n), 'J/K-m')
printResult('d2GdndP', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d2gdndp(t,p,n), 'J/bar-m')
printResult('d3GdndT2', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d3gdndt2(t,p,n), 'J/K^2-m')
printResult('d3GdndTdP', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d3gdndtdp(t,p,n), 'J/K-bar-m')
printResult('d3GdndP2', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d3gdndp2(t,p,n), 'J/bar^2-m')
printResult('d4GdndT3', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d4gdndt3(t,p,n), 'J/K^3-m')
printResult('d4GdndT2dP', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d4gdndt2dp(t,p,n), 'J/K^2-bar-m')
printResult('d4GdndTdP2', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d4gdndtdp2(t,p,n), 'J/K-bar^2-m')
printResult('d4GdndP3', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d4gdndp3(t,p,n), 'J/bar^3-m')
                   [  0]         [  1]         [  2]         [  3]         [  4]
dGdn       -4.624664e+05 -2.353277e+05 -1.410271e+05 -1.992151e+05 -1.678986e+05 J/m
d2GdndT    -3.279900e+02 -8.095877e+01 -1.117905e+02 -1.290345e+02 -1.173106e+02 J/K-m
d2GdndP     6.594476e-01  1.633334e+00  8.133086e-01  7.724063e-01  8.390871e-01 J/bar-m
d3GdndT2   -1.573033e-02 -2.062067e-02 -2.301200e-02 -1.945551e-02 -1.642221e-02 J/K^2-m
d3GdndTdP  -2.588384e-04  6.446500e-04  7.302876e-05  8.384035e-05  8.892059e-05 J/K-bar-m
d3GdndP2   -1.218492e-06 -4.841321e-05 -9.289128e-07 -9.577613e-07 -2.676480e-06 J/bar^2-m
d4GdndT3    0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00 J/K^3-m
d4GdndT2dP  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00 J/K^2-bar-
d4GdndTdP2  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00 J/K-bar^2-
d4GdndP3    0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00 J/bar^3-m

The Hessian matrix (molar second derivative matrix) is stored as a compact linear array

def printResult(name, result, units):
    print ("{0:<10.10s}".format(name), end=' ')
    [print ("{0:13.6e}".format(x), end=' ') for x in result]
    print ("{0:<10.10s}".format(units))
def printLabels(n):
    print ("{0:<18.18s}".format(''), end=' ')
    maxIdx = int(len(n)*(len(n)-1)/2 + len(n))
    [print ("[{0:3d}]{1:<8.8s}".format(idx, ''), end=' ') for idx in range(maxIdx)]
    print ()
printLabels(n)
printResult('d2Gdn2', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d2gdn2(t,p,n), 'J/m^2')
printResult('d3Gdn2dT', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d3gdn2dt(t,p,n), 'J/K-m^2')
printResult('d3Gdn2dP', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d3gdn2dp(t,p,n), 'J/bar-m^2')
printResult('d4Gdn2dT2', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d4gdn2dt2(t,p,n), 'J/K^2-m^2')
printResult('d4Gdn2dTdP', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d4gdn2dtdp(t,p,n), 'J/K-bar-m^2')
printResult('d4Gdn2dP2', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d4gdn2dp2(t,p,n), 'J/bar^2-m^2')
printResult('d5Gdn2dT3', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d5gdn2dt3(t,p,n), 'J/K^3-m^2')
printResult('d5Gdn2dT2dP', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d5gdn2dt2dp(t,p,n), 'J/K^2-bar-m^2')
printResult('d5Gdn2dTdP2', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d5gdn2dtdp2(t,p,n), 'J/K-bar^2-m^2')
printResult('d5Gdn2dP3', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d5gdn2dp3(t,p,n), 'J/bar^3-m^2')
                   [  0]         [  1]         [  2]         [  3]         [  4]         [  5]         [  6]         [  7]         [  8]         [  9]         [ 10]         [ 11]         [ 12]         [ 13]         [ 14]
d2Gdn2      3.631551e+05 -9.909290e+04 -4.091487e+03  1.189443e+05 -1.045312e+04  3.475317e+05 -2.083723e+04 -2.987186e+05  5.169939e+03  2.147133e+04 -1.713196e+04 -2.862025e+04  7.397122e+05  2.155454e+01  1.803476e+05 J/m^2
d3Gdn2dT   -1.576708e-09  4.640982e-09 -9.783600e-11 -1.049198e-08 -1.402419e-08  1.943042e-11 -1.780479e-13 -8.672956e-11 -1.443867e-10 -4.148268e-11 -4.472491e-12 -1.000217e-11 -4.992790e-08 -6.762534e-08 -9.142881e-08 J/K-m^2
d3Gdn2dP    0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00 J/bar-m^2
d4Gdn2dT2   0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00 J/K^2-m^2
d4Gdn2dTdP  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00 J/K-bar-m^
d4Gdn2dP2   0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00 J/bar^2-m^
d5Gdn2dT3   0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00 J/K^3-m^2
d5Gdn2dT2d  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00 J/K^2-bar-
d5Gdn2dTdP  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00 J/K-bar^2-
d5Gdn2dP3   0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00 J/bar^3-m^

The 3-D Tensor (molar third derivative tensor) is stored as a compact linear array

def printResult(name, result, units):
    print ("{0:<10.10s}".format(name), end=' ')
    [print ("{0:10.3e}".format(x), end=' ') for x in result]
    print ("{0:<14.14s}".format(units))
def printLabels(n):
    print ("{0:<15.15s}".format(''), end=' ')
    maxIdx = int(len(n)*(len(n)+1)*(len(n)+2)/6)
    [print ("[{0:3d}]{1:<5.5s}".format(idx, ''), end=' ') for idx in range(maxIdx)]
    print ()
printLabels(n)
printResult('d3Gdn3', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d3gdn3(t,p,n), 'J/m^3')
printResult('d4Gdn3dT', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d4gdn3dt(t,p,n), 'J/K-m^3')
printResult('d4Gdn3dP', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d4gdn3dp(t,p,n), 'J/bar-m^3')
printResult('d5Gdn3dT2', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d5gdn3dt2(t,p,n), 'J/K^2-m^3')
printResult('d5Gdn3dTdP', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d5gdn3dtdp(t,p,n), 'J/K-bar-m^3')
printResult('d5Gdn3dP2', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d5gdn3dp2(t,p,n), 'J/bar^2-m^3')
printResult('d6Gdn3dT3', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d6gdn3dt3(t,p,n), 'J/K^3-m^3')
printResult('d6Gdn3dT2dP', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d6gdn3dt2dp(t,p,n), 'J/K^2-bar-m^3')
printResult('d6Gdn3dTdP2', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d6gdn3dtdp2(t,p,n), 'J/K-bar^2-m^3')
printResult('d6Gdn3dP3', sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_d6gdn3dp3(t,p,n), 'J/bar^3-m^3')
                [  0]      [  1]      [  2]      [  3]      [  4]      [  5]      [  6]      [  7]      [  8]      [  9]      [ 10]      [ 11]      [ 12]      [ 13]      [ 14]      [ 15]      [ 16]      [ 17]      [ 18]      [ 19]      [ 20]      [ 21]      [ 22]      [ 23]      [ 24]      [ 25]      [ 26]      [ 27]      [ 28]      [ 29]      [ 30]      [ 31]      [ 32]      [ 33]      [ 34]
d3Gdn3      0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00 J/m^3
d4Gdn3dT    0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00 J/K-m^3
d4Gdn3dP    0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00 J/bar-m^3
d5Gdn3dT2   0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00 J/K^2-m^3
d5Gdn3dTdP  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00 J/K-bar-m^3
d5Gdn3dP2   0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00 J/bar^2-m^3
d6Gdn3dT3   0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00 J/K^3-m^3
d6Gdn3dT2d  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00 J/K^2-bar-m^3
d6Gdn3dTdP  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00 J/K-bar^2-m^3
d6Gdn3dP3   0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00  0.000e+00 J/bar^3-m^3

Test and time the Gibbs free energy method

%timeit sulfide_liquid.cy_SulfLiq_sulfide_liquid_calib_g(t, p, n)
45.9 ms ± 1.5 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

Import the sulfide_liquid module into the ThermoEngine package

Note that the module is treated as if it was generated using the coder module. See the Example-8 notebook in this folder for further details.

modelDB = model.Database(database="CoderModule", calib="calib",
                         phase_tuple=('thermoengine.sulfide_liquid', {
                             'Sulf':['SulfLiq','solution']
                         }))
Solution phase code generated by the coder module does not yet provide information on solution species. Species are proxied by components.
Solution phase code generated by the coder module does not yet provide information on species properties. Species are proxied by components.
phase = modelDB.get_phase('Sulf')

Test module methods wrapped by the standard ThermoEngine interface.

print (phase.props['phase_name'])
print (phase.props['formula'])
print (phase.props['molwt'])
print (phase.props['abbrev'])
print (phase.props['endmember_num'])
print (phase.props['endmember_name'])
Sulfide Liquid
['O' 'S' 'Fe' 'Ni' 'Cu']
[15.9994 32.06   55.847  58.71   63.546 ]
Sulf
5
['O' 'S' 'Fe' 'Ni' 'Cu']

Test solution composition chosen as above.

moles_end = np.array([2., 5., 10., 1., 1.])
for i in range(0,phase.props['endmember_num']):
    print ("mole number of {0:10.10s} = {1:13.6e}".format(phase.props['endmember_name'][i], moles_end[i]))
if not phase.test_endmember_comp(moles_end):
    print ("Calculated composition is infeasible!")
print ('Formula: ', phase.compute_formula(t, p, moles_end))
print ('Total moles of endmembers: ', phase.covert_endmember_comp(moles_end,output='total_moles'))
mol_elm = phase.covert_endmember_comp(moles_end,output='moles_elements')
print ('Mole fractions of endmembers: ', phase.covert_endmember_comp(moles_end,output='mole_fraction'))
print ('Moles of endmembers: ', phase.convert_elements(mol_elm, output='moles_end'))
print ('Total moles of endmembers: ', phase.convert_elements(mol_elm, output='total_moles'))
print ('Total grams of phase: ', phase.convert_elements(mol_elm, output='total_grams'))
# Check if intrinsic mode fails
if len(moles_end) == 0:
    print ('Intrinsic mode returned an empty array; estimating composition ...')
    moles_end = np.array([0.20813521, 0.00267478, 0.14968884])
    print (moles_end)
mole number of O          =  2.000000e+00
mole number of S          =  5.000000e+00
mole number of Fe         =  1.000000e+01
mole number of Ni         =  1.000000e+00
mole number of Cu         =  1.000000e+00
Formula:  O2.0S5.0Fe10.0Ni1.0Cu1.0
Total moles of endmembers:  19.0
Mole fractions of endmembers:  [0.10526316 0.26315789 0.52631579 0.05263158 0.05263158]
Moles of endmembers:  [ 2.  5. 10.  1.  1.]
Total moles of endmembers:  19.0
Total grams of phase:  873.0248000000001

Test and output the remainder of the methods for retrieval of thermodynamic quantities.

def test_func(name, func, t, p, units, deriv=None, const=None, endmember=None):
    global moles_end
    try:
        if deriv:
            result = func(t, p, deriv=deriv, mol=moles_end)
            if type(result) is np.ndarray:
                if len(result.shape) == 2:
                    print ("{0:>10s}".format(name), end=' ')
                    for x in result[0]:
                        print ("{0:15.6e}".format(x), end=' ')
                    print (" {0:<20s}".format(units))
                elif len(result.shape) == 3:
                    for i in range(0,result.shape[1]):
                        print ("{0:>10s}".format(name), end=' ')
                        for x in result[0][i]:
                            print ("{0:15.6e}".format(x), end=' ')
                        print (" {0:<20s}".format(units))
                elif len(result.shape) == 4:
                    for i in range(0,result.shape[1]):
                        for j in range(0,result.shape[2]):
                            print ("{0:>10s}".format(name), end=' ')
                            for x in result[0][i][j]:
                                print ("{0:15.6e}".format(x), end=' ')
                            print (" {0:<20s}".format(units))
                elif len(result.shape) == 1:
                    print ("{0:>10s}".format(name), end=' ')
                    for x in result:
                        print ("{0:15.6e}".format(x), end=' ')
                    print (" {0:<20s}".format(units))
                else:
                    print ('A', result.shape)
            else:
                print ("{0:>10s}{1:15.6e} {2:<20s}".format(name, result, units))
        elif const:
            print ("{0:>10s}{1:15.6e} {2:<20s}".format(name, func(t, p, const=const, mol=moles_end), units))
        else:
            result = func(t, p, mol=moles_end)
            if type(result) is np.ndarray:
                if len(result.shape) == 2:
                    print ("{0:>10s}".format(name), end=' ')
                    for x in result[0]:
                        print ("{0:15.6e}".format(x), end=' ')
                    print (" {0:<20s}".format(units))
                elif len(result.shape) == 1:
                    print ("{0:>10s}".format(name), end=' ')
                    for x in result:
                        print ("{0:15.6e}".format(x), end=' ')
                    print (" {0:<20s}".format(units))
                else:
                    print ('B', len(result.shape))
            else:
                print ("{0:>10s}{1:15.6e} {2:<20s}".format(name, result, units))
    except AttributeError:
        print ("{0:>10s} is not implemented".format(name))

test_func('G',  phase.gibbs_energy, t, p, 'J/mol')
test_func('dG/dT', phase.gibbs_energy, t, p, 'J/K-mol', deriv={'dT':1})
test_func('dG/dP', phase.gibbs_energy, t, p, 'J/bar-mol', deriv={'dP':1})
test_func('dG/dm', phase.gibbs_energy, t, p, 'J/mol^2', deriv={'dmol':1})

test_func('d2G/dT2', phase.gibbs_energy, t, p, 'J/K^2-mol', deriv={'dT':2})
test_func('d2G/dTdP', phase.gibbs_energy, t, p, 'J/K-bar-mol', deriv={'dT':1, 'dP':1})
test_func('d2G/dTdm', phase.gibbs_energy, t, p, 'J/K-mol^2', deriv={'dT':1, 'dmol':1})
test_func('d2G/dP2', phase.gibbs_energy, t, p, 'J/bar^2-mol', deriv={'dP':2})
test_func('d2G/dPdm', phase.gibbs_energy, t, p, 'J/bar-mol^2', deriv={'dP':1, 'dmol':1})
test_func('d2G/dm2', phase.gibbs_energy, t, p, 'J/mol^3', deriv={'dmol':2})

test_func('d3G/dT3', phase.gibbs_energy, t, p, 'J/K^3-mol', deriv={'dT':3})
test_func('d3G/dT2dP', phase.gibbs_energy, t, p, 'J/K^2-bar-mol', deriv={'dT':2, 'dP':1})
test_func('d3G/dT2dm', phase.gibbs_energy, t, p, 'J/K^2-mol^2', deriv={'dT':2, 'dmol':1})
test_func('d3G/dTdP2', phase.gibbs_energy, t, p, 'J/K-bar^2-mol', deriv={'dT':1, 'dP':2})
test_func('d3G/dTdPdm', phase.gibbs_energy, t, p, 'J/K-bar-mol^2', deriv={'dT':1, 'dP':1, 'dmol':1})
test_func('d3G/dTdm2', phase.gibbs_energy, t, p, 'J/K-mol^3', deriv={'dT':1, 'dmol':2})
test_func('d3G/dP3', phase.gibbs_energy, t, p, 'J/bar^3-mol', deriv={'dP':3})
test_func('d3G/dP2dm', phase.gibbs_energy, t, p, 'J/bar^2-mol^2', deriv={'dP':2, 'dmol':1})
test_func('d3G/dPdm2', phase.gibbs_energy, t, p, 'J/bar-mol^3', deriv={'dP':1, 'dmol':2})
test_func('d3G/dm3', phase.gibbs_energy, t, p, 'J/mol^4', deriv={'dmol':3})

test_func('H', phase.enthalpy, t, p, 'J/mol')
test_func('S', phase.entropy, t, p, 'J/K-mol')
test_func('dS/dm', phase.entropy, t, p, 'J/K-mol^2', deriv={'dmol':1})
test_func('d2S/dm2', phase.entropy, t, p, 'J/K-mol^3', deriv={'dmol':2})

test_func('Cv', phase.heat_capacity, t, p, 'J/K-mol', const='V')
test_func('Cp', phase.heat_capacity, t, p, 'J/K-mol')
test_func('dCp/dT', phase.heat_capacity, t, p, 'J/-K^2-mol', deriv={'dT':1})
test_func('dCp/dm', phase.heat_capacity, t, p, 'J/-K-mol^2', deriv={'dmol':1})

test_func('rho', phase.density, t, p, 'gm/cc')
test_func('alpha', phase.thermal_exp, t, p, '1/K')
test_func('beta', phase.compressibility, t, p, '1/bar')
test_func('K', phase.bulk_mod, t, p, '')
test_func('Kp', phase.bulk_mod, t, p, '1/bar', deriv={'dP':1})

test_func("V", phase.volume, t, p, 'J/bar-mol')
test_func("dV/dT", phase.volume, t, p, 'J/bar-K-mol', deriv={'dT':1})
test_func("dv/dP", phase.volume, t, p, 'J/bar^2-mol', deriv={'dP':1})
test_func("dv/dm", phase.volume, t, p, 'J/bar-mol^2', deriv={'dP':1, 'dmol':1})
test_func("d2V/dT2", phase.volume, t, p, 'J/bar-K^2-mol', deriv={'dT':2})
test_func("d2V/dTdP", phase.volume, t, p, 'J/bar^2-K-mol', deriv={'dT':1, 'dP':1})
test_func("d2V/dP2", phase.volume, t, p, 'J/bar^3-mol', deriv={'dP':2})
test_func("d2V/dTdm", phase.volume, t, p, 'J/bar-K-mol^2', deriv={'dT':1, 'dmol':1})
test_func("d2V/dPdm", phase.volume, t, p, 'J/bar^2-mol^2', deriv={'dP':1, 'dmol':1})
test_func("d2V/dm2", phase.volume, t, p, 'J/bar-mol^3', deriv={'dmol':2})

test_func('mu0', phase.chem_potential, t, p, 'J/mol')
test_func('activity', phase.activity, t, p, '')
test_func('da/dm', phase.activity, t, p, '1/mol', deriv={'dmol':1})
         G  -3.878956e+06 J/mol
     dG/dT  -2.452130e+03 J/K-mol
     dG/dP   1.884016e+01 J/bar-mol
     dG/dm   -4.624664e+05   -2.353277e+05   -1.410271e+05   -1.992151e+05   -1.678986e+05  J/mol^2
   d2G/dT2  -3.800446e-01 J/K^2-mol
  d2G/dTdP   2.350344e-03 J/K-bar-mol
  d2G/dTdm   -3.279900e+02   -8.095877e+01   -1.117905e+02   -1.290345e+02   -1.173106e+02  J/K-mol^2
   d2G/dP2  -2.574264e-04 J/bar^2-mol
  d2G/dPdm    6.594476e-01    1.633334e+00    8.133086e-01    7.724063e-01    8.390871e-01  J/bar-mol^2
   d2G/dm2    3.631551e+05   -9.909290e+04   -4.091487e+03    1.189443e+05   -1.045312e+04    3.475317e+05   -2.083723e+04   -2.987186e+05    5.169939e+03    2.147133e+04   -1.713196e+04   -2.862025e+04    7.397122e+05    2.155454e+01    1.803476e+05  J/mol^3
   d3G/dT3   1.880394e-04 J/K^3-mol
 d3G/dT2dP   1.310298e-05 J/K^2-bar-mol
 d3G/dT2dm   -1.573033e-02   -2.062067e-02   -2.301200e-02   -1.945551e-02   -1.642221e-02  J/K^2-mol^2
 d3G/dTdP2  -8.854753e-07 J/K-bar^2-mol
d3G/dTdPdm   -2.588384e-04    6.446500e-04    7.302876e-05    8.384035e-05    8.892059e-05  J/K-bar-mol^2
 d3G/dTdm2   -1.576708e-09    4.640982e-09   -9.783600e-11   -1.049198e-08   -1.402419e-08    1.943042e-11   -1.780479e-13   -8.672956e-11   -1.443867e-10   -4.148268e-11   -4.472491e-12   -1.000217e-11   -4.992790e-08   -6.762534e-08   -9.142881e-08  J/K-mol^3
   d3G/dP3   6.631852e-08 J/bar^3-mol
 d3G/dP2dm   -1.218492e-06   -4.841321e-05   -9.289128e-07   -9.577613e-07   -2.676480e-06  J/bar^2-mol^2
 d3G/dPdm2    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00  J/bar-mol^3
   d3G/dm3    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00  J/mol^4
         H   1.025303e+06 J/mol
         S   2.452130e+03 J/K-mol
     dS/dm    3.279900e+02    8.095877e+01    1.117905e+02    1.290345e+02    1.173106e+02  J/K-mol^2
   d2S/dm2    1.576708e-09   -4.640982e-09    9.783600e-11    1.049198e-08    1.402419e-08   -1.942983e-11    1.780292e-13    8.672955e-11    1.443867e-10    4.148261e-11    4.472356e-12    1.000216e-11    4.992790e-08    6.762534e-08    9.142881e-08  J/K-mol^3
        Cv   7.171711e+02 J/K-mol
        Cp   7.600892e+02 J/K-mol
    dCp/dT   3.965713e-03 J/-K^2-mol
    dCp/dm    7.865164e-06    1.031033e-05    1.150600e-05    9.727757e-06    8.211105e-06  J/-K-mol^2
       rho is not implemented
     alpha   1.247519e-04 1/K
      beta   1.366371e-05 1/bar
         K   7.318657e+04
        Kp   1.785441e+01 1/bar
         V   1.884016e+01 J/bar-mol
     dV/dT   2.350344e-03 J/bar-K-mol
     dv/dP  -2.574264e-04 J/bar^2-mol
     dv/dm   -1.218492e-06   -4.841321e-05   -9.289128e-07   -9.577613e-07   -2.676480e-06  J/bar-mol^2
   d2V/dT2   1.310298e-05 J/bar-K^2-mol
  d2V/dTdP  -8.854753e-07 J/bar^2-K-mol
   d2V/dP2   6.631852e-08 J/bar^3-mol
  d2V/dTdm   -2.588384e-04    6.446500e-04    7.302876e-05    8.384035e-05    8.892059e-05  J/bar-K-mol^2
  d2V/dPdm   -1.218492e-06   -4.841321e-05   -9.289128e-07   -9.577613e-07   -2.676480e-06  J/bar^2-mol^2
   d2V/dm2    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00  J/bar-mol^3
       mu0   -1.678986e+05  J/mol
  activity is not implemented
     da/dm is not implemented