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.
Files changed (74) hide show
  1. {peritheos-0.4.0 → peritheos-0.5.0}/CHANGELOG.md +42 -1
  2. {peritheos-0.4.0 → peritheos-0.5.0}/CITATION.cff +2 -2
  3. {peritheos-0.4.0 → peritheos-0.5.0}/PKG-INFO +22 -2
  4. {peritheos-0.4.0 → peritheos-0.5.0}/README.md +20 -0
  5. {peritheos-0.4.0 → peritheos-0.5.0}/docs/api-stability.md +4 -0
  6. {peritheos-0.4.0 → peritheos-0.5.0}/docs/api.md +45 -0
  7. peritheos-0.5.0/docs/dac-thermal-pressure.md +134 -0
  8. {peritheos-0.4.0 → peritheos-0.5.0}/docs/development.md +8 -2
  9. peritheos-0.5.0/docs/equation-reference.md +432 -0
  10. {peritheos-0.4.0 → peritheos-0.5.0}/docs/fitting.md +68 -5
  11. peritheos-0.5.0/docs/getting-started.md +109 -0
  12. {peritheos-0.4.0 → peritheos-0.5.0}/docs/index.md +4 -0
  13. peritheos-0.5.0/docs/models.md +77 -0
  14. {peritheos-0.4.0 → peritheos-0.5.0}/docs/references.md +20 -0
  15. peritheos-0.5.0/docs/requirements.txt +3 -0
  16. {peritheos-0.4.0 → peritheos-0.5.0}/docs/thermoelastic-properties.md +30 -2
  17. {peritheos-0.4.0 → peritheos-0.5.0}/docs/uncertainty.md +62 -3
  18. {peritheos-0.4.0 → peritheos-0.5.0}/docs/units.md +24 -4
  19. {peritheos-0.4.0 → peritheos-0.5.0}/docs/validation.md +25 -6
  20. peritheos-0.5.0/mkdocs.yml +55 -0
  21. {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/__init__.py +1 -1
  22. {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/eos/__init__.py +260 -4
  23. {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/eos/thermal/sokolova2016.py +79 -68
  24. {peritheos-0.4.0 → peritheos-0.5.0}/peritheos.egg-info/PKG-INFO +22 -2
  25. {peritheos-0.4.0 → peritheos-0.5.0}/peritheos.egg-info/SOURCES.txt +2 -0
  26. {peritheos-0.4.0 → peritheos-0.5.0}/peritheos.egg-info/requires.txt +1 -1
  27. {peritheos-0.4.0 → peritheos-0.5.0}/pyproject.toml +3 -1
  28. peritheos-0.5.0/tests/test_numerical_stress.py +271 -0
  29. {peritheos-0.4.0 → peritheos-0.5.0}/tests/test_thermal_sokolova.py +20 -0
  30. peritheos-0.4.0/docs/getting-started.md +0 -68
  31. peritheos-0.4.0/docs/models.md +0 -82
  32. peritheos-0.4.0/docs/requirements.txt +0 -1
  33. peritheos-0.4.0/mkdocs.yml +0 -25
  34. peritheos-0.4.0/tests/test_numerical_stress.py +0 -98
  35. {peritheos-0.4.0 → peritheos-0.5.0}/CODE_OF_CONDUCT.md +0 -0
  36. {peritheos-0.4.0 → peritheos-0.5.0}/CONTRIBUTING.md +0 -0
  37. {peritheos-0.4.0 → peritheos-0.5.0}/LICENSE +0 -0
  38. {peritheos-0.4.0 → peritheos-0.5.0}/MANIFEST.in +0 -0
  39. {peritheos-0.4.0 → peritheos-0.5.0}/SECURITY.md +0 -0
  40. {peritheos-0.4.0 → peritheos-0.5.0}/SUPPORT.md +0 -0
  41. {peritheos-0.4.0 → peritheos-0.5.0}/docs/project-policies.md +0 -0
  42. {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/constants.py +0 -0
  43. {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/eos/rt/__init__.py +0 -0
  44. {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/eos/rt/bm.py +0 -0
  45. {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/eos/rt/holzapfel.py +0 -0
  46. {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/eos/rt/murnaghan.py +0 -0
  47. {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/eos/rt/natural_strain.py +0 -0
  48. {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/eos/rt/tait.py +0 -0
  49. {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/eos/rt/vinet.py +0 -0
  50. {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/eos/thermal/__init__.py +0 -0
  51. {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/eos/thermal/holland_powell.py +0 -0
  52. {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/eos/thermal/mie_gruneisen.py +0 -0
  53. {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/fitting.py +0 -0
  54. {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/uncertainty.py +0 -0
  55. {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/units.py +0 -0
  56. {peritheos-0.4.0 → peritheos-0.5.0}/peritheos/utils.py +0 -0
  57. {peritheos-0.4.0 → peritheos-0.5.0}/peritheos.egg-info/dependency_links.txt +0 -0
  58. {peritheos-0.4.0 → peritheos-0.5.0}/peritheos.egg-info/top_level.txt +0 -0
  59. {peritheos-0.4.0 → peritheos-0.5.0}/setup.cfg +0 -0
  60. {peritheos-0.4.0 → peritheos-0.5.0}/tests/data/literature_reference_cases.json +0 -0
  61. {peritheos-0.4.0 → peritheos-0.5.0}/tests/test_bm.py +0 -0
  62. {peritheos-0.4.0 → peritheos-0.5.0}/tests/test_eos_api.py +0 -0
  63. {peritheos-0.4.0 → peritheos-0.5.0}/tests/test_fitting.py +0 -0
  64. {peritheos-0.4.0 → peritheos-0.5.0}/tests/test_holzapfel.py +0 -0
  65. {peritheos-0.4.0 → peritheos-0.5.0}/tests/test_literature_reference_cases.py +0 -0
  66. {peritheos-0.4.0 → peritheos-0.5.0}/tests/test_murnaghan.py +0 -0
  67. {peritheos-0.4.0 → peritheos-0.5.0}/tests/test_natural_strain.py +0 -0
  68. {peritheos-0.4.0 → peritheos-0.5.0}/tests/test_package_metadata.py +0 -0
  69. {peritheos-0.4.0 → peritheos-0.5.0}/tests/test_tait.py +0 -0
  70. {peritheos-0.4.0 → peritheos-0.5.0}/tests/test_thermal_mie_gruneisen.py +0 -0
  71. {peritheos-0.4.0 → peritheos-0.5.0}/tests/test_thermoelastic_api.py +0 -0
  72. {peritheos-0.4.0 → peritheos-0.5.0}/tests/test_uncertainty.py +0 -0
  73. {peritheos-0.4.0 → peritheos-0.5.0}/tests/test_units.py +0 -0
  74. {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.4.0...HEAD
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.4.0
8
- date-released: 2026-08-09
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.4.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.7.0
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. Implement `molar_heat_capacity_v()` only when the model has a
36
- defined caloric potential; the base class then provides `C_P` and `K_S`.
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