Substances
Several element expressions can be combined into a more complex molecular formula. In this context, we consider as substances pure elements, chemical compounds and molecules. The syntax of molecular formulas used in this solver is based on standard molecular formulas known from chemistry. The substance expression solver currently supports the following 3 basic operations:
Operation |
Explicit notation |
Short notation |
---|---|---|
addition |
|
|
multiplication |
|
|
parentheses |
|
Note
Symbols of explicit addition and multiplication need to be separated from element symbols with an empty space.
Class Substance
can solve a molecular formula, break it into individual elements and calculate their collective atomic properties.
Similarly, as for Element
class, it has an option to switch between natural and most abundant elements when isotopes are not specified.
In this case, the option applies to all elements in a substance.
>>> from scinumtools.materials import Substance
>>> Substance('DT')
Substance(mass=5.030 Z=2 N=3.000 e=2)
>>> Substance('H2O', natural=False)
Substance(mass=18.011 Z=10 N=8.000 e=10)
A substance can also be initialized from an explicit dictionary of element expressions and corresponding proportions.
>>> Substance({
>>> "B{11}": 1,
>>> "N{14}": 1,
>>> "H{1}": 6,
>>> })
Substance(mass=31.059 Z=18 N=13.000 e=18)
Besides information about elements and nucleons, every substance calculates also other parameters.
In the example below, we show an example of the substance of water H2O
.
A concise overview of all its properties can be printed using its print()
method.
Here the mass
is an atomic mass, Z
proton number, N
number of neutrons, e
number of electrons, x
number fraction and X
is a mass fraction.
>>> with Substance('H2O', natural=False, mass_density=Quantity(997,'kg/m3'), volume=Quantity(1,'l')) as c:
>>> c.print()
Components:
expr element isotope ionisation mass[Da] count Z N e
H H 1 0 1.007825 2.0 1 0 1
O O 16 0 15.994915 1.0 8 8 8
Composite:
Total mass: Quantity(1.801e+01 Da)
Total number: 3.0
expr mass[Da] Z N e x[%] X[%]
H 2.015650 2.000000 0.000000 2.000000 66.666667 11.191487
O 15.994915 8.000000 8.000000 8.000000 33.333333 88.808513
avg 6.003522 3.333333 2.666667 3.333333 33.333333 33.333333
sum 18.010565 10.000000 8.000000 10.000000 100.000000 100.000000
Matter:
Mass density: Quantity(9.970e-01 g*cm-3)
Number density: Quantity(3.334e+22 cm-3)
Volume: Quantity(1.000e+00 l)
Mass: Quantity(9.970e+02 g)
expr n[cm-3] rho[g/cm3] N M[g]
H 6.667280e+22 0.111579 6.667280e+25 111.579129
O 3.333640e+22 0.885421 3.333640e+25 885.420871
avg 3.333640e+22 0.332333 3.333640e+25 332.333333
sum 1.000092e+23 0.997000 1.000092e+26 997.000000
In the example above, we additionally set substance density rho
and its volume V
.
Density is used for calculation of number n
and mass rho
densities.
If volume is also set, the total number of species N
and total mass M
are added.
Individual substance parameters can be accessed directly using data_components()
, data_composite()
and data_matter()
.
Both methods return a ParameterTable object with corresponding values.
Corresponding tabular values can be printed using method print_components()
, print_composite()
and print_matter()
.
>>> with Substance('H2O', natural=False) as c:
>>> data = c.data_components()
>>> data.O['N']
8
>>> data.H.count
2
>>> data = c.data_composite()
>>> data['sum'].e
10
>>> data.H.mass
Quantity(2.015650, 'Da')
In both cases, dimensional parameters are returned as Quantity
objects.
If needed, simple numerical values can be requested by setting the following option: quantity=False
.
Sometimes it is required to know information about part of a substance.
In this case, one can specify which elements (H
) should be returned.
>>> with Substance('H2O', natural=False) as c:
>>> c.data_substance(['H'], quantity=False).to_text()
expr mass Z N e x X
0 H 2.015650 2.0 0.0 2.0 66.666667 11.191487
1 avg 1.007825 1.0 0.0 1.0 33.333333 5.595744
2 sum 2.015650 2.0 0.0 2.0 66.666667 11.191487