peritheos 0.4.0__tar.gz → 0.5.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {peritheos-0.4.0 → peritheos-0.5.0}/CHANGELOG.md +42 -1
- {peritheos-0.4.0 → peritheos-0.5.0}/CITATION.cff +2 -2
- {peritheos-0.4.0 → peritheos-0.5.0}/PKG-INFO +22 -2
- {peritheos-0.4.0 → peritheos-0.5.0}/README.md +20 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/docs/api-stability.md +4 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/docs/api.md +45 -0
- peritheos-0.5.0/docs/dac-thermal-pressure.md +134 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/docs/development.md +8 -2
- peritheos-0.5.0/docs/equation-reference.md +432 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/docs/fitting.md +68 -5
- peritheos-0.5.0/docs/getting-started.md +109 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/docs/index.md +4 -0
- peritheos-0.5.0/docs/models.md +77 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/docs/references.md +20 -0
- peritheos-0.5.0/docs/requirements.txt +3 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/docs/thermoelastic-properties.md +30 -2
- {peritheos-0.4.0 → peritheos-0.5.0}/docs/uncertainty.md +62 -3
- {peritheos-0.4.0 → peritheos-0.5.0}/docs/units.md +24 -4
- {peritheos-0.4.0 → peritheos-0.5.0}/docs/validation.md +25 -6
- peritheos-0.5.0/mkdocs.yml +55 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/__init__.py +1 -1
- {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/eos/__init__.py +260 -4
- {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/eos/thermal/sokolova2016.py +79 -68
- {peritheos-0.4.0 → peritheos-0.5.0}/peritheos.egg-info/PKG-INFO +22 -2
- {peritheos-0.4.0 → peritheos-0.5.0}/peritheos.egg-info/SOURCES.txt +2 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/peritheos.egg-info/requires.txt +1 -1
- {peritheos-0.4.0 → peritheos-0.5.0}/pyproject.toml +3 -1
- peritheos-0.5.0/tests/test_numerical_stress.py +271 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/tests/test_thermal_sokolova.py +20 -0
- peritheos-0.4.0/docs/getting-started.md +0 -68
- peritheos-0.4.0/docs/models.md +0 -82
- peritheos-0.4.0/docs/requirements.txt +0 -1
- peritheos-0.4.0/mkdocs.yml +0 -25
- peritheos-0.4.0/tests/test_numerical_stress.py +0 -98
- {peritheos-0.4.0 → peritheos-0.5.0}/CODE_OF_CONDUCT.md +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/CONTRIBUTING.md +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/LICENSE +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/MANIFEST.in +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/SECURITY.md +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/SUPPORT.md +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/docs/project-policies.md +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/constants.py +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/eos/rt/__init__.py +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/eos/rt/bm.py +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/eos/rt/holzapfel.py +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/eos/rt/murnaghan.py +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/eos/rt/natural_strain.py +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/eos/rt/tait.py +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/eos/rt/vinet.py +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/eos/thermal/__init__.py +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/eos/thermal/holland_powell.py +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/eos/thermal/mie_gruneisen.py +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/fitting.py +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/uncertainty.py +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/units.py +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/utils.py +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/peritheos.egg-info/dependency_links.txt +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/peritheos.egg-info/top_level.txt +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/setup.cfg +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/tests/data/literature_reference_cases.json +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/tests/test_bm.py +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/tests/test_eos_api.py +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/tests/test_fitting.py +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/tests/test_holzapfel.py +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/tests/test_literature_reference_cases.py +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/tests/test_murnaghan.py +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/tests/test_natural_strain.py +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/tests/test_package_metadata.py +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/tests/test_tait.py +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/tests/test_thermal_mie_gruneisen.py +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/tests/test_thermoelastic_api.py +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/tests/test_uncertainty.py +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/tests/test_units.py +0 -0
- {peritheos-0.4.0 → peritheos-0.5.0}/tests/test_vinet.py +0 -0
|
@@ -5,6 +5,46 @@ All notable changes to Peritheos are documented here. The project follows
|
|
|
5
5
|
|
|
6
6
|
## [Unreleased]
|
|
7
7
|
|
|
8
|
+
## [0.5.0] - 2026-08-30
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- A comprehensive equation reference for every public isothermal and thermal
|
|
13
|
+
EOS, including parameter definitions, model domains, numerical inversion,
|
|
14
|
+
thermoelastic identities, fitting diagnostics, uncertainty propagation, and
|
|
15
|
+
explicit public-unit conversion factors.
|
|
16
|
+
- Documentation distinguishing the equations typeset in Sokolova et al. (2016)
|
|
17
|
+
from the accompanying Excel workbook calculation implemented by
|
|
18
|
+
`Sokolova2016`, including differences in the bulk-modulus derivative,
|
|
19
|
+
characteristic-temperature multiplier, oscillator pressure contributions,
|
|
20
|
+
reference-isotherm subtraction, and working pressure units.
|
|
21
|
+
- Temperature inversion from pressure and volume for all thermal EOS models,
|
|
22
|
+
including NumPy broadcasting through `temperature()` and
|
|
23
|
+
`calculate_temperature()`.
|
|
24
|
+
- Coupled temperature inference from ambient and heated volumes with a
|
|
25
|
+
fractional DAC confinement contribution through `temperature_from_volumes()`.
|
|
26
|
+
The empirical `f_dac * thermal_pressure` pressure increment is solved in its
|
|
27
|
+
algebraically reduced form and requires `0 <= f_dac < 1`.
|
|
28
|
+
Documentation distinguishes this fraction of EOS thermal pressure from a
|
|
29
|
+
fraction of cold pressure and describes its physical limits, calibration,
|
|
30
|
+
identifiability, baseline-drift, and uncertainty constraints.
|
|
31
|
+
- Fixed-volume preparation for temperature inversion, avoiding repeated
|
|
32
|
+
Sokolova volume-integral evaluations during root finding.
|
|
33
|
+
|
|
34
|
+
### Changed
|
|
35
|
+
|
|
36
|
+
- Refreshed the locked runtime, development, documentation, and release
|
|
37
|
+
dependencies to their latest versions compatible with the supported Python
|
|
38
|
+
and declared package-version ranges.
|
|
39
|
+
- The minimum supported SciPy version is now 1.9.3, ensuring a stable binary
|
|
40
|
+
installation and numerical fitting path on Python 3.9 across supported
|
|
41
|
+
platforms.
|
|
42
|
+
- Documentation now uses Material for MkDocs with responsive navigation,
|
|
43
|
+
improved search and code presentation, and automatic light and dark themes.
|
|
44
|
+
- The model overview now focuses on model selection and reference-EOS
|
|
45
|
+
compatibility, while advanced two-volume DAC analysis has moved out of the
|
|
46
|
+
introductory tutorial into a dedicated guide.
|
|
47
|
+
|
|
8
48
|
## [0.4.0] - 2026-08-09
|
|
9
49
|
|
|
10
50
|
### Added
|
|
@@ -102,7 +142,8 @@ All notable changes to Peritheos are documented here. The project follows
|
|
|
102
142
|
and out-of-domain states.
|
|
103
143
|
- Project naming and release metadata were standardized.
|
|
104
144
|
|
|
105
|
-
[Unreleased]: https://github.com/CPrescher/peritheos/compare/v0.
|
|
145
|
+
[Unreleased]: https://github.com/CPrescher/peritheos/compare/v0.5.0...HEAD
|
|
146
|
+
[0.5.0]: https://github.com/CPrescher/peritheos/compare/v0.4.0...v0.5.0
|
|
106
147
|
[0.4.0]: https://github.com/CPrescher/peritheos/compare/v0.3.0...v0.4.0
|
|
107
148
|
[0.3.0]: https://github.com/CPrescher/peritheos/compare/v0.2.0...v0.3.0
|
|
108
149
|
[0.2.0]: https://github.com/CPrescher/peritheos/releases/tag/v0.2.0
|
|
@@ -4,8 +4,8 @@ message: >-
|
|
|
4
4
|
original references for the equation-of-state models you use.
|
|
5
5
|
title: Peritheos
|
|
6
6
|
type: software
|
|
7
|
-
version: 0.
|
|
8
|
-
date-released: 2026-08-
|
|
7
|
+
version: 0.5.0
|
|
8
|
+
date-released: 2026-08-30
|
|
9
9
|
authors:
|
|
10
10
|
- family-names: Prescher
|
|
11
11
|
given-names: Clemens
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: peritheos
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.0
|
|
4
4
|
Summary: A library for thermodynamic equations of state calculations
|
|
5
5
|
Author-email: Clemens Prescher <clemens.prescher@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -25,7 +25,7 @@ Requires-Python: >=3.9
|
|
|
25
25
|
Description-Content-Type: text/markdown
|
|
26
26
|
License-File: LICENSE
|
|
27
27
|
Requires-Dist: numpy>=1.21.0
|
|
28
|
-
Requires-Dist: scipy>=1.
|
|
28
|
+
Requires-Dist: scipy>=1.9.3
|
|
29
29
|
Dynamic: license-file
|
|
30
30
|
|
|
31
31
|
# Peritheos
|
|
@@ -124,8 +124,26 @@ eos = MieGruneisenDebye(
|
|
|
124
124
|
|
|
125
125
|
pressure = eos.pressure(V=0.9, T=2000.0)
|
|
126
126
|
volume = eos.volume(P=pressure, T=2000.0)
|
|
127
|
+
temperature = eos.temperature(P=pressure, V=0.9)
|
|
128
|
+
|
|
129
|
+
# Infer temperature from volumes measured before and during DAC heating.
|
|
130
|
+
ambient_volume = 0.80000
|
|
131
|
+
heated_volume = 0.80001
|
|
132
|
+
temperature_with_dac = eos.temperature_from_volumes(
|
|
133
|
+
V_ambient=ambient_volume,
|
|
134
|
+
V_heated=heated_volume,
|
|
135
|
+
f_dac=0.25,
|
|
136
|
+
)
|
|
137
|
+
ambient_pressure = eos.rt_eos.pressure(ambient_volume)
|
|
138
|
+
heated_pressure = ambient_pressure + 0.25 * eos.thermal_pressure(
|
|
139
|
+
heated_volume, temperature_with_dac
|
|
140
|
+
)
|
|
127
141
|
```
|
|
128
142
|
|
|
143
|
+
The two-volume method uses the empirical `f_dac * thermal_pressure` confinement
|
|
144
|
+
increment and requires `0 <= f_dac < 1`; report and sensitivity-test the assumed
|
|
145
|
+
fraction.
|
|
146
|
+
|
|
129
147
|
Diamond thermal equation of state from sokolova et al. 2016
|
|
130
148
|
|
|
131
149
|
```python
|
|
@@ -179,11 +197,13 @@ thermal_pressure = sokolova.thermal_pressure(V, T)
|
|
|
179
197
|
rt_pressure = holzapfel.pressure(V)
|
|
180
198
|
pressure = sokolova.pressure(V, T)
|
|
181
199
|
recovered_volume = sokolova.volume(pressure, T)
|
|
200
|
+
recovered_temperature = sokolova.temperature(pressure, V)
|
|
182
201
|
|
|
183
202
|
print(f"Thermal pressure: {thermal_pressure} GPa")
|
|
184
203
|
print(f"RT pressure: {rt_pressure} GPa")
|
|
185
204
|
print(f"Total pressure: {pressure} GPa")
|
|
186
205
|
print(f"Recovered volume: {recovered_volume} J bar^-1")
|
|
206
|
+
print(f"Recovered temperature: {recovered_temperature} K")
|
|
187
207
|
```
|
|
188
208
|
|
|
189
209
|
## Citation and support
|
|
@@ -94,8 +94,26 @@ eos = MieGruneisenDebye(
|
|
|
94
94
|
|
|
95
95
|
pressure = eos.pressure(V=0.9, T=2000.0)
|
|
96
96
|
volume = eos.volume(P=pressure, T=2000.0)
|
|
97
|
+
temperature = eos.temperature(P=pressure, V=0.9)
|
|
98
|
+
|
|
99
|
+
# Infer temperature from volumes measured before and during DAC heating.
|
|
100
|
+
ambient_volume = 0.80000
|
|
101
|
+
heated_volume = 0.80001
|
|
102
|
+
temperature_with_dac = eos.temperature_from_volumes(
|
|
103
|
+
V_ambient=ambient_volume,
|
|
104
|
+
V_heated=heated_volume,
|
|
105
|
+
f_dac=0.25,
|
|
106
|
+
)
|
|
107
|
+
ambient_pressure = eos.rt_eos.pressure(ambient_volume)
|
|
108
|
+
heated_pressure = ambient_pressure + 0.25 * eos.thermal_pressure(
|
|
109
|
+
heated_volume, temperature_with_dac
|
|
110
|
+
)
|
|
97
111
|
```
|
|
98
112
|
|
|
113
|
+
The two-volume method uses the empirical `f_dac * thermal_pressure` confinement
|
|
114
|
+
increment and requires `0 <= f_dac < 1`; report and sensitivity-test the assumed
|
|
115
|
+
fraction.
|
|
116
|
+
|
|
99
117
|
Diamond thermal equation of state from sokolova et al. 2016
|
|
100
118
|
|
|
101
119
|
```python
|
|
@@ -149,11 +167,13 @@ thermal_pressure = sokolova.thermal_pressure(V, T)
|
|
|
149
167
|
rt_pressure = holzapfel.pressure(V)
|
|
150
168
|
pressure = sokolova.pressure(V, T)
|
|
151
169
|
recovered_volume = sokolova.volume(pressure, T)
|
|
170
|
+
recovered_temperature = sokolova.temperature(pressure, V)
|
|
152
171
|
|
|
153
172
|
print(f"Thermal pressure: {thermal_pressure} GPa")
|
|
154
173
|
print(f"RT pressure: {rt_pressure} GPa")
|
|
155
174
|
print(f"Total pressure: {pressure} GPa")
|
|
156
175
|
print(f"Recovered volume: {recovered_volume} J bar^-1")
|
|
176
|
+
print(f"Recovered temperature: {recovered_temperature} K")
|
|
157
177
|
```
|
|
158
178
|
|
|
159
179
|
## Citation and support
|
|
@@ -24,6 +24,10 @@ the API reference, and exact optimizer messages are private.
|
|
|
24
24
|
a supported compatibility alias and will remain available throughout the 1.x
|
|
25
25
|
series.
|
|
26
26
|
|
|
27
|
+
`temperature()` is the preferred pressure-and-volume-to-temperature method.
|
|
28
|
+
`calculate_temperature()` is its supported compatibility alias and will remain
|
|
29
|
+
available throughout the 1.x series.
|
|
30
|
+
|
|
27
31
|
After 1.0, planned public API removals will normally emit
|
|
28
32
|
`DeprecationWarning` for at least two minor releases. Scientific corrections
|
|
29
33
|
that cannot preserve old behavior will include a reproducible before-and-after
|
|
@@ -23,6 +23,25 @@ Common methods:
|
|
|
23
23
|
- `bulk_modulus(V)`
|
|
24
24
|
- `volume(P)` and `calculate_volume(P)`
|
|
25
25
|
|
|
26
|
+
Constructor signatures and special requirements are:
|
|
27
|
+
|
|
28
|
+
| Class | Signature after class name | Special requirement |
|
|
29
|
+
|---|---|---|
|
|
30
|
+
| `BM2` | `(V0, K0)` | $K_0'=4$ is implied |
|
|
31
|
+
| `BM3` | `(V0, K0, K0_prime)` | none |
|
|
32
|
+
| `BM4` | `(V0, K0, K0_prime, K0_double_prime)` | `K0_double_prime` has inverse-pressure units |
|
|
33
|
+
| `Murnaghan` | `(V0, K0, K0_prime)` | supports the `K0_prime=0` limit |
|
|
34
|
+
| `NaturalStrain2` | `(V0, K0)` | $K_0'=2$ is implied |
|
|
35
|
+
| `NaturalStrain3` | `(V0, K0, K0_prime)` | none |
|
|
36
|
+
| `NaturalStrain4` | `(V0, K0, K0_prime, K0_double_prime)` | `K0_double_prime` has inverse-pressure units |
|
|
37
|
+
| `ModifiedTait` | `(V0, K0, K0_prime, K0_double_prime)` | rejects singular coefficient sets and volumes outside its real domain |
|
|
38
|
+
| `Vinet` | `(V0, K0, K0_prime)` | none |
|
|
39
|
+
| `Holzapfel` | `(V0, K0, K0_prime, n, Z)` | molar volume in `J bar^-1 mol^-1` |
|
|
40
|
+
|
|
41
|
+
`Holzapfel` additionally provides `bulk_modulus_derivative(V, eps=1e-6)`.
|
|
42
|
+
See the [equation reference](equation-reference.md#isothermal-equations) for
|
|
43
|
+
the mathematical definitions and coefficient domains.
|
|
44
|
+
|
|
26
45
|
## Thermal equations of state
|
|
27
46
|
|
|
28
47
|
```python
|
|
@@ -35,11 +54,29 @@ from peritheos.eos.thermal import (
|
|
|
35
54
|
)
|
|
36
55
|
```
|
|
37
56
|
|
|
57
|
+
Thermal constructor signatures are:
|
|
58
|
+
|
|
59
|
+
| Class | Parameters after `rt_eos` |
|
|
60
|
+
|---|---|
|
|
61
|
+
| `MieGruneisenDebye` | `Tr, theta0, gamma0, q, n` |
|
|
62
|
+
| `MieGruneisenEinstein` | `Tr, theta0, gamma0, q, n` |
|
|
63
|
+
| `ThermalModifiedTait` | `Tr, theta, alpha0, n` |
|
|
64
|
+
| `Sokolova2016` | `Tr, QE1o, mE1, QE2o, mE2, delta, t, a_0, m, g, e_0`, followed by optional `beta, QBo, d, mb, QB1o, d1, mb1` |
|
|
65
|
+
|
|
66
|
+
The Mie-Gruneisen classes accept any `EosBase` reference; thermal modified Tait
|
|
67
|
+
requires `ModifiedTait`, and Sokolova requires `Holzapfel`. All thermal classes
|
|
68
|
+
require molar volume in `J bar^-1 mol^-1`. `HollandPowell2011` is an alias for
|
|
69
|
+
`ThermalModifiedTait`. Exact equations and parameter roles are documented
|
|
70
|
+
under [Thermal equations](equation-reference.md#thermal-equations).
|
|
71
|
+
|
|
38
72
|
Common methods:
|
|
39
73
|
|
|
40
74
|
- `thermal_pressure(V, T)`
|
|
75
|
+
- `dac_thermal_pressure(V, T, f_dac)`
|
|
41
76
|
- `pressure(V, T)`
|
|
42
77
|
- `volume(P, T)`
|
|
78
|
+
- `temperature(P, V)` and `calculate_temperature(P, V)`
|
|
79
|
+
- `temperature_from_volumes(V_ambient, V_heated, f_dac=...)`
|
|
43
80
|
- `bulk_modulus(V, T)`
|
|
44
81
|
- `isothermal_compressibility(V, T)`
|
|
45
82
|
- `thermal_expansivity(V, T)`
|
|
@@ -48,6 +85,14 @@ Common methods:
|
|
|
48
85
|
- `adiabatic_bulk_modulus(V, T)` when a caloric model exists
|
|
49
86
|
- `gruneisen_parameter(V, T)` when a caloric model exists
|
|
50
87
|
|
|
88
|
+
`dac_thermal_pressure()` returns only the additional confinement term
|
|
89
|
+
`f_dac * thermal_pressure(V, T)`. `temperature_from_volumes()` applies the
|
|
90
|
+
empirical confinement model described in
|
|
91
|
+
[Diamond-anvil-cell thermal-pressure contribution](dac-thermal-pressure.md);
|
|
92
|
+
it requires `0 <= f_dac < 1`. In this API, `f_dac` means
|
|
93
|
+
`(P_hot - P_ambient) / thermal_pressure(V_heated, T)`; it is not a fraction of
|
|
94
|
+
the cold pressure.
|
|
95
|
+
|
|
51
96
|
Mie-Gruneisen models additionally expose `gruneisen_parameter()`,
|
|
52
97
|
`characteristic_temperature()`, and the vibrational thermodynamic methods
|
|
53
98
|
documented under [Thermoelastic properties](thermoelastic-properties.md).
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# Diamond-anvil-cell thermal-pressure contribution
|
|
2
|
+
|
|
3
|
+
This advanced workflow estimates temperature from separate volumes measured at
|
|
4
|
+
the reference temperature and during laser heating. It introduces an
|
|
5
|
+
experiment-specific boundary-condition parameter and should only be used when
|
|
6
|
+
the total high-temperature pressure is not measured independently. Review the
|
|
7
|
+
[thermal model](models.md#thermal-models), [unit](units.md), and
|
|
8
|
+
[uncertainty](uncertainty.md) conventions before applying it.
|
|
9
|
+
|
|
10
|
+
## Two-volume temperature inversion
|
|
11
|
+
|
|
12
|
+
The ambient pressure is calculated from the volume measured at the reference
|
|
13
|
+
temperature. A second volume is measured during heating. The two-volume
|
|
14
|
+
temperature inversion solves
|
|
15
|
+
|
|
16
|
+
\[
|
|
17
|
+
\begin{aligned}
|
|
18
|
+
P_{\mathrm{ambient}} &= P_{\mathrm{cold}}(V_{\mathrm{ambient}}), \\
|
|
19
|
+
P_{\mathrm{EOS}}(V_{\mathrm{heated}}, T)
|
|
20
|
+
&= P_{\mathrm{ambient}}
|
|
21
|
+
+ f_{\mathrm{DAC}}\,\Delta P_{\mathrm{thermal}}(V_{\mathrm{heated}}, T).
|
|
22
|
+
\end{aligned}
|
|
23
|
+
\]
|
|
24
|
+
|
|
25
|
+
Because `P_EOS = P_cold + Delta P_thermal`, this reduces exactly to
|
|
26
|
+
|
|
27
|
+
\[
|
|
28
|
+
\Delta P_{\mathrm{thermal}}(V_{\mathrm{heated}}, T)
|
|
29
|
+
= \frac{P_{\mathrm{cold}}(V_{\mathrm{ambient}})
|
|
30
|
+
- P_{\mathrm{cold}}(V_{\mathrm{heated}})}
|
|
31
|
+
{1-f_{\mathrm{DAC}}}.
|
|
32
|
+
\]
|
|
33
|
+
|
|
34
|
+
The implementation solves this reduced equation directly. This avoids
|
|
35
|
+
re-evaluating both sides of the original expression and makes the domain clear:
|
|
36
|
+
for the usual positive, monotonic thermal-pressure models, a heated state needs
|
|
37
|
+
the heated volume to have the larger cold-compression pressure.
|
|
38
|
+
|
|
39
|
+
Here `f_dac` is defined specifically as the fraction of the EOS thermal pressure
|
|
40
|
+
that appears as an increase above the reference-temperature pressure:
|
|
41
|
+
|
|
42
|
+
\[
|
|
43
|
+
\begin{aligned}
|
|
44
|
+
\Delta P_{\mathrm{DAC}} &= P_{\mathrm{hot}} - P_{\mathrm{ambient}}, \\
|
|
45
|
+
f_{\mathrm{DAC}} &=
|
|
46
|
+
\frac{\Delta P_{\mathrm{DAC}}}
|
|
47
|
+
{\Delta P_{\mathrm{thermal}}(V_{\mathrm{heated}}, T)}.
|
|
48
|
+
\end{aligned}
|
|
49
|
+
\]
|
|
50
|
+
|
|
51
|
+
It is not the ratio `Delta P_DAC / P_ambient` and therefore is not a percentage
|
|
52
|
+
of the cold pressure.
|
|
53
|
+
|
|
54
|
+
## Using the two-volume method
|
|
55
|
+
|
|
56
|
+
```python
|
|
57
|
+
f_dac = 0.25
|
|
58
|
+
ambient_volume = 0.80000
|
|
59
|
+
heated_volume = 0.80001
|
|
60
|
+
corrected_temperature = eos.temperature_from_volumes(
|
|
61
|
+
ambient_volume,
|
|
62
|
+
heated_volume,
|
|
63
|
+
f_dac=f_dac,
|
|
64
|
+
)
|
|
65
|
+
ambient_pressure = eos.rt_eos.pressure(ambient_volume)
|
|
66
|
+
thermal_pressure = eos.thermal_pressure(heated_volume, corrected_temperature)
|
|
67
|
+
high_temperature_pressure = ambient_pressure + f_dac * thermal_pressure
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
If total high-temperature pressure is measured independently, use
|
|
71
|
+
`temperature(P_hot, V_heated)` directly and do not apply the two-volume model.
|
|
72
|
+
See the [thermal API reference](api.md#thermal-equations-of-state) for both
|
|
73
|
+
inversion methods.
|
|
74
|
+
|
|
75
|
+
## Physical interpretation and limits
|
|
76
|
+
|
|
77
|
+
The two-volume inversion requires `0 <= f_dac < 1`:
|
|
78
|
+
|
|
79
|
+
| `f_dac` | Boundary-condition interpretation | Consequence |
|
|
80
|
+
|---:|---|---|
|
|
81
|
+
| `0` | Isobaric heating | `P_hot = P_ambient` |
|
|
82
|
+
| between `0` and `1` | Partial confinement | Some EOS thermal pressure raises the experimental pressure |
|
|
83
|
+
| approaching `1` | Isochoric limit | `V_heated` approaches `V_ambient`; volume alone ceases to constrain temperature |
|
|
84
|
+
|
|
85
|
+
This interpolation is physically consistent with the isobaric-to-isochoric
|
|
86
|
+
range discussed by [Yen, Williams, and Kunz
|
|
87
|
+
(2020)](https://doi.org/10.1029/2020JB020006). It remains an experimental
|
|
88
|
+
boundary-condition model, not an additional term in the material EOS.
|
|
89
|
+
|
|
90
|
+
The meaning of percentages in the DAC literature must be checked before using
|
|
91
|
+
them as `f_dac`. [Heinz (1990)](https://doi.org/10.1029/GL017i008p01161)
|
|
92
|
+
estimated roughly 40--60% of the constant-volume thermodynamic thermal pressure
|
|
93
|
+
for a particular elastic hotspot model; this ratio is conceptually compatible
|
|
94
|
+
with `f_dac`. In contrast, the approximately 30% result attributed to the
|
|
95
|
+
Dewaele finite-element model by Yen et al. is a fraction of the *cold pressure*.
|
|
96
|
+
That is a different denominator and cannot be entered as `f_dac=0.3` without an
|
|
97
|
+
additional conversion.
|
|
98
|
+
|
|
99
|
+
## Experimental cautions
|
|
100
|
+
|
|
101
|
+
`f_dac` depends on the sample and pressure-medium strength, hotspot and sample
|
|
102
|
+
geometry, temperature distribution, probe position, heating duration, and
|
|
103
|
+
stress relaxation. It may vary spatially, with temperature, and between heating
|
|
104
|
+
cycles. A literature value from a different assembly is therefore best treated
|
|
105
|
+
as a sensitivity scenario rather than a calibrated correction.
|
|
106
|
+
|
|
107
|
+
The two measured volumes cannot determine both temperature and `f_dac`.
|
|
108
|
+
Assuming `f_dac` selects one temperature from a family of possible solutions.
|
|
109
|
+
If an independent temperature is available, an experiment-specific fraction
|
|
110
|
+
can instead be estimated from
|
|
111
|
+
|
|
112
|
+
\[
|
|
113
|
+
f_{\mathrm{DAC}} =
|
|
114
|
+
\frac{P_{\mathrm{EOS}}(V_{\mathrm{heated}}, T_{\mathrm{independent}})
|
|
115
|
+
- P_{\mathrm{ambient}}}
|
|
116
|
+
{\Delta P_{\mathrm{thermal}}
|
|
117
|
+
(V_{\mathrm{heated}}, T_{\mathrm{independent}})}.
|
|
118
|
+
\]
|
|
119
|
+
|
|
120
|
+
The reference volume also needs experimental scrutiny. Heating can cause
|
|
121
|
+
irreversible pressure or stress relaxation, so a post-cooling volume need not
|
|
122
|
+
equal the pre-heating reference. Prefer reference measurements bracketing the
|
|
123
|
+
heating sequence; interpolate a drifting baseline when justified. Otherwise,
|
|
124
|
+
define the stable interval, report how its average was selected, and propagate
|
|
125
|
+
its scatter rather than treating the average as exact.
|
|
126
|
+
|
|
127
|
+
For a fixed volume pair, increasing `f_dac` raises the required thermal pressure
|
|
128
|
+
and therefore normally raises the inferred temperature. The result is singular
|
|
129
|
+
as `f_dac` approaches one and can be highly sensitive to small errors in both
|
|
130
|
+
volumes, particularly when their difference is small. Sweep the plausible
|
|
131
|
+
`f_dac` range, propagate both volume errors, and check that the resulting
|
|
132
|
+
temperature remains inside the calibrated range of the selected EOS. Report the
|
|
133
|
+
uncorrected `f_dac=0` result alongside the sensitivity cases. See
|
|
134
|
+
[Uncertainty](uncertainty.md) and the [DAC references](references.md).
|
|
@@ -32,8 +32,14 @@ derivative, array, invalid-input, and round-trip tests.
|
|
|
32
32
|
|
|
33
33
|
Subclass `ThermalEOS` and implement `thermal_pressure(V, T)`. The base class
|
|
34
34
|
provides total pressure, inversion, isothermal bulk modulus, compressibility,
|
|
35
|
-
and expansivity.
|
|
36
|
-
|
|
35
|
+
and expansivity. Both volume and temperature inversion are array-aware.
|
|
36
|
+
Implement `molar_heat_capacity_v()` only when the model has a defined caloric
|
|
37
|
+
potential; the base class then provides `C_P` and `K_S`.
|
|
38
|
+
|
|
39
|
+
Models with expensive fixed-volume preparation may override the private
|
|
40
|
+
`_thermal_pressure_function(V)` hook. It returns a temperature-only callable
|
|
41
|
+
used by both inversion methods; Sokolova uses it to evaluate its volume integral
|
|
42
|
+
once per solved state.
|
|
37
43
|
|
|
38
44
|
Document the required molar-volume unit, reference temperature, pressure unit,
|
|
39
45
|
parameter domain, source equations, and whether energy methods are absolute or
|