Skip to content

Commit 261c4f7

Browse files
committed
improve error parsing for unset state
1 parent 959c9fd commit 261c4f7

File tree

7 files changed

+58
-25
lines changed

7 files changed

+58
-25
lines changed

burnman/classes/anisotropicsolution.py

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -178,8 +178,10 @@ def set_composition(self, molar_fractions):
178178
)
179179
# Calculate all other required properties
180180
Solution.set_composition(self, molar_fractions)
181-
if self._scalar_solution.pressure is not None:
181+
try: # if pressure and temperature are already set, compute base properties
182182
self.compute_base_properties()
183+
except AttributeError:
184+
pass
183185

184186
@cached_property
185187
def ones(self):
@@ -349,9 +351,12 @@ def set_state(self, pressure, temperature, relaxed=True):
349351
"""
350352
self.unrelaxed.set_state(pressure, temperature)
351353

352-
if hasattr(self.unrelaxed, "molar_fractions") and relaxed:
353-
self._relax_at_PTX()
354-
AnisotropicSolution.set_state(self, pressure, temperature)
354+
if relaxed:
355+
try: # relax the structure if composition has been set
356+
self._relax_at_PTX()
357+
AnisotropicSolution.set_state(self, pressure, temperature)
358+
except AttributeError:
359+
pass
355360

356361
def set_composition(self, molar_fractions, q_initial=None, relaxed=True):
357362
"""
@@ -383,11 +388,14 @@ def set_composition(self, molar_fractions, q_initial=None, relaxed=True):
383388

384389
self.unrelaxed.set_composition(n)
385390

386-
if self.unrelaxed.pressure is not None and relaxed:
387-
AnisotropicSolution.set_composition(self, n)
388-
self._relax_at_PTX()
389-
self.unrelaxed._scalar_solution.set_composition(self.molar_fractions)
390-
self.unrelaxed.set_composition(self.molar_fractions)
391+
if relaxed:
392+
try: # relax the structure if state has been set
393+
AnisotropicSolution.set_composition(self, n)
394+
self._relax_at_PTX()
395+
self.unrelaxed._scalar_solution.set_composition(self.molar_fractions)
396+
self.unrelaxed.set_composition(self.molar_fractions)
397+
except AttributeError:
398+
pass
391399

392400
def _relax_at_PTX(self):
393401
"""

burnman/classes/elasticsolution.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,10 @@ def set_composition(self, molar_fractions):
111111
self.reset()
112112
self.molar_fractions = np.array(molar_fractions)
113113

114-
if self.temperature is not None:
114+
try: # set the volume if pressure and temperature are already set
115115
_ = self.molar_volume
116+
except AttributeError:
117+
pass
116118

117119
def set_method(self, method):
118120
for i in range(self.n_endmembers):

burnman/classes/material.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -350,8 +350,13 @@ def evaluate_with_volumes(
350350
have different shapes.
351351
:rtype: list or :class:`numpy.array`, n-dimensional
352352
"""
353-
old_pressure = self.pressure
354-
old_temperature = self.temperature
353+
try:
354+
old_pressure = self.pressure
355+
old_temperature = self.temperature
356+
except AttributeError:
357+
old_pressure = None
358+
old_temperature = None
359+
355360
try:
356361
old_molar_fractions = self.molar_fractions
357362
except AttributeError:
@@ -385,10 +390,10 @@ def evaluate_with_volumes(
385390
for j in range(len(vars_list)):
386391
output[j][i] = getattr(self, vars_list[j])
387392
if old_pressure is None or old_temperature is None:
388-
# do not set_state if old values were None. Just reset to None
389-
# manually
390-
self._pressure = self._temperature = None
391-
self.reset()
393+
# delete the pressure and temperature attributes
394+
# if they were not set before
395+
del self._pressure
396+
del self._temperature
392397
else:
393398
self.set_state(old_pressure, old_temperature)
394399

burnman/classes/solution.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -865,10 +865,13 @@ def set_state(self, pressure, temperature, relaxed=True):
865865
:type relaxed: bool, optional
866866
"""
867867
self.unrelaxed.set_state(pressure, temperature)
868+
Solution.set_state(self, pressure, temperature)
868869

869-
if hasattr(self.unrelaxed, "molar_fractions") and relaxed:
870-
self._relax_at_PTX()
871-
Solution.set_state(self, pressure, temperature)
870+
if relaxed:
871+
try: # relax if composition has already been set
872+
self._relax_at_PTX()
873+
except AttributeError:
874+
pass
872875

873876
def set_composition(self, molar_fractions, q_initial=None, relaxed=True):
874877
"""
@@ -900,10 +903,12 @@ def set_composition(self, molar_fractions, q_initial=None, relaxed=True):
900903

901904
self.unrelaxed.set_composition(n)
902905

903-
if self.unrelaxed.pressure is not None and relaxed:
904-
Solution.set_composition(self, n)
905-
self._relax_at_PTX()
906-
self.unrelaxed.set_composition(self.molar_fractions)
906+
if relaxed:
907+
try: # relax if state has already been set
908+
Solution.set_composition(self, n)
909+
self._relax_at_PTX()
910+
except AttributeError:
911+
pass
907912

908913
def _relax_at_PTX(self):
909914
"""
@@ -926,6 +931,7 @@ def G_func(dq):
926931
n = n0 + np.einsum("ij, j", self.dndq, sol.x)
927932
self.unrelaxed.set_composition(n)
928933
Solution.set_composition(self, n)
934+
self.unrelaxed.set_composition(self.molar_fractions)
929935

930936
def set_state_with_volume(
931937
self, volume, temperature, pressure_guesses=[0.0e9, 10.0e9]

burnman/tools/equilibration.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1026,8 +1026,10 @@ def equilibrate(
10261026
# Set up solves
10271027
nc = [len(eq_constraint_list) for eq_constraint_list in eq_constraint_lists]
10281028

1029-
# Find the initial state (could be none here)
1030-
initial_state = [assemblage.pressure, assemblage.temperature]
1029+
try:
1030+
initial_state = [assemblage.pressure, assemblage.temperature]
1031+
except AttributeError:
1032+
initial_state = [None, None]
10311033

10321034
# Reset initial state if equality constraints
10331035
# are related to pressure or temperature

misc/benchmarks/slb_2024_benchmarks.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ def check_fper_entropy():
5050
print("Endmember entropies (should all be zero):")
5151
print(np.abs(fper.solution_model.endmember_configurational_entropies))
5252

53+
fper.set_state(1.0e5, 300.0)
5354
fper.set_composition([0.0, 0.5, 0.0, 0.0, 0.5])
5455
Sxs = -2 * gas_constant * np.log(0.5)
5556
print(

tests/test_material.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,15 @@ def test_set_state_with_volume(self):
133133
m.set_state(P1, T1) # return to new state
134134
self.assertFloatEqual(V, m.V)
135135

136+
def test_unset_state_raises(self):
137+
m = self.min_with_name()
138+
with self.assertRaises(AttributeError):
139+
_ = m.pressure
140+
with self.assertRaises(AttributeError):
141+
_ = m.temperature
142+
with self.assertRaises(AttributeError):
143+
_ = m.V
144+
136145

137146
if __name__ == "__main__":
138147
unittest.main()

0 commit comments

Comments
 (0)