import numpy as np
import matplotlib.pyplot as plt
# Constants
T_c = 647.096 # K, critical temperature of water
T_ref = 373.15 # K, reference temp (100°C)
L_ref = 2257e3 # J/kg, latent heat at T_ref
# Temperature range: from 0.1°C to just below critical
T = np.linspace(274, 645, 500) # in K
# Latent heat using Watson's correlation
def latent_heat(T):
return L_ref * ((T_c - T) / (T_c - T_ref))**0.38 # J/kg
# Saturated liquid entropy (assume simple polynomial fit)
def s_liquid(T):
return 0.5 + 0.001 * (T - 273.15) # crude estimate in kJ/kg·K
# Entropy of vaporization
def delta_s(T):
return latent_heat(T) / T / 1000 # Convert J to kJ
# Saturated vapor entropy
def s_vapor(T):
return s_liquid(T) + delta_s(T)
# Convert T to °C for x-axis
T_C = T - 273.15
# Compute values
s_l = s_liquid(T)
s_v = s_vapor(T)
# Plotting
plt.figure(figsize=(8, 6))
plt.plot(s_l, T_C, label='Saturated Liquid', color='blue')
plt.plot(s_v, T_C, label='Saturated Vapor', color='red')
plt.fill_betweenx(T_C, s_l, s_v, color='lightgray', alpha=0.5, label='Wet Region')
plt.xlabel('Entropy (kJ/kg·K)')
plt.ylabel('Temperature (°C)')
plt.title('T–S Diagram of Water (Physics-Based Model)')
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()
aW1wb3J0IG51bXB5IGFzIG5wCmltcG9ydCBtYXRwbG90bGliLnB5cGxvdCBhcyBwbHQKCiMgQ29uc3RhbnRzClRfYyA9IDY0Ny4wOTYgICMgSywgY3JpdGljYWwgdGVtcGVyYXR1cmUgb2Ygd2F0ZXIKVF9yZWYgPSAzNzMuMTUgICMgSywgcmVmZXJlbmNlIHRlbXAgKDEwMMKwQykKTF9yZWYgPSAyMjU3ZTMgICMgSi9rZywgbGF0ZW50IGhlYXQgYXQgVF9yZWYKCiMgVGVtcGVyYXR1cmUgcmFuZ2U6IGZyb20gMC4xwrBDIHRvIGp1c3QgYmVsb3cgY3JpdGljYWwKVCA9IG5wLmxpbnNwYWNlKDI3NCwgNjQ1LCA1MDApICAjIGluIEsKCiMgTGF0ZW50IGhlYXQgdXNpbmcgV2F0c29uJ3MgY29ycmVsYXRpb24KZGVmIGxhdGVudF9oZWF0KFQpOgogICAgcmV0dXJuIExfcmVmICogKChUX2MgLSBUKSAvIChUX2MgLSBUX3JlZikpKiowLjM4ICAjIEova2cKCiMgU2F0dXJhdGVkIGxpcXVpZCBlbnRyb3B5IChhc3N1bWUgc2ltcGxlIHBvbHlub21pYWwgZml0KQpkZWYgc19saXF1aWQoVCk6CiAgICByZXR1cm4gMC41ICsgMC4wMDEgKiAoVCAtIDI3My4xNSkgICMgY3J1ZGUgZXN0aW1hdGUgaW4ga0ova2fCt0sKCiMgRW50cm9weSBvZiB2YXBvcml6YXRpb24KZGVmIGRlbHRhX3MoVCk6CiAgICByZXR1cm4gbGF0ZW50X2hlYXQoVCkgLyBUIC8gMTAwMCAgIyBDb252ZXJ0IEogdG8ga0oKCiMgU2F0dXJhdGVkIHZhcG9yIGVudHJvcHkKZGVmIHNfdmFwb3IoVCk6CiAgICByZXR1cm4gc19saXF1aWQoVCkgKyBkZWx0YV9zKFQpCgojIENvbnZlcnQgVCB0byDCsEMgZm9yIHgtYXhpcwpUX0MgPSBUIC0gMjczLjE1CgojIENvbXB1dGUgdmFsdWVzCnNfbCA9IHNfbGlxdWlkKFQpCnNfdiA9IHNfdmFwb3IoVCkKCiMgUGxvdHRpbmcKcGx0LmZpZ3VyZShmaWdzaXplPSg4LCA2KSkKcGx0LnBsb3Qoc19sLCBUX0MsIGxhYmVsPSdTYXR1cmF0ZWQgTGlxdWlkJywgY29sb3I9J2JsdWUnKQpwbHQucGxvdChzX3YsIFRfQywgbGFiZWw9J1NhdHVyYXRlZCBWYXBvcicsIGNvbG9yPSdyZWQnKQpwbHQuZmlsbF9iZXR3ZWVueChUX0MsIHNfbCwgc192LCBjb2xvcj0nbGlnaHRncmF5JywgYWxwaGE9MC41LCBsYWJlbD0nV2V0IFJlZ2lvbicpCgpwbHQueGxhYmVsKCdFbnRyb3B5IChrSi9rZ8K3SyknKQpwbHQueWxhYmVsKCdUZW1wZXJhdHVyZSAowrBDKScpCnBsdC50aXRsZSgnVOKAk1MgRGlhZ3JhbSBvZiBXYXRlciAoUGh5c2ljcy1CYXNlZCBNb2RlbCknKQpwbHQubGVnZW5kKCkKcGx0LmdyaWQoVHJ1ZSkKcGx0LnRpZ2h0X2xheW91dCgpCnBsdC5zaG93KCk=