diff --git a/docs/reference_guides/model_libraries/generic/property_models/helmholtz_parameters.rst b/docs/reference_guides/model_libraries/generic/property_models/helmholtz_parameters.rst index 4e920a9f83..1238be6425 100644 --- a/docs/reference_guides/model_libraries/generic/property_models/helmholtz_parameters.rst +++ b/docs/reference_guides/model_libraries/generic/property_models/helmholtz_parameters.rst @@ -282,6 +282,15 @@ Parameters for the type 3 version are similar to type 1. \log_e \delta + n^\circ_1 + n^\circ_2 \tau + n^\circ_3 \log_e \tau + \sum_{i = 4}^{h} n^\circ_i \tau^{\gamma^\circ_i} +**Type 4** + +Parameters for the type 4 version are similar to type 1 + +.. math:: + \log_e \delta + n^\circ_1 + n^\circ_2 \tau + (n^\circ_3 - 1) \log_e \tau + + \sum_{i = 4}^h n^\circ_i \log_e \left[ 1 - \exp(\frac{-\gamma^\circ_i \tau}{T_c})\right] + + Residual Part of Dimensionless Helmholtz Free Energy ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -379,6 +388,16 @@ free energy expression:: \sum^{h_0}_{i=1} n_i \delta^{d_i} \tau^{t_1} + \sum^m_{j=1} \left[ \exp(-\delta^j) \sum^{h_j}_{i = h_{j-1} + 1} n_i \delta^{d_i} \tau^{t_1} \right] + +**Type 5** + +.. math:: + \phi^r(\delta, \tau) = \sum^{h_1}_{i=1} n_i \delta^{d_i} \tau^{t_1} + + \sum_{i =h_1 + 1}^{h_2} n_i \delta^{d_i} \tau^{t_1} \exp(-\delta^{c_i}) + + \sum_{i = h_2 + 1}^{h_3} n_i \delta^{d_i} \tau^{t_1} \exp\left[-\alpha_i(\delta - \varepsilon_i)^2 - \beta_i(\tau - \gamma_i)^2 \right] + + \sum_{i = h_3+1}^{h_4} n_i \delta^{d_i} \tau^{t_1} \exp\left[-\alpha_i(\delta - \varepsilon_i)^2 - \frac{1}{\beta_i(\tau - \gamma_i)^2 + b_i} \right] + + Approximate Saturated Reduced Density ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/idaes/models/properties/general_helmholtz/components/parameters/co2.json b/idaes/models/properties/general_helmholtz/components/parameters/co2.json index a114cc22b6..ee6b8b2d40 100644 --- a/idaes/models/properties/general_helmholtz/components/parameters/co2.json +++ b/idaes/models/properties/general_helmholtz/components/parameters/co2.json @@ -300,7 +300,7 @@ "0": 78.63 }, "n": { - "0": 2.471 + "0": 1.254 }, "type": 1 } diff --git a/idaes/models/properties/general_helmholtz/components/parameters/nh3.json b/idaes/models/properties/general_helmholtz/components/parameters/nh3.json new file mode 100644 index 0000000000..3a8823a748 --- /dev/null +++ b/idaes/models/properties/general_helmholtz/components/parameters/nh3.json @@ -0,0 +1,257 @@ +{ + "comp": "nh3", + "basic": { + "R": 0.48820939114, + "MW": 17.03052, + "T_star": 405.56, + "rho_star": 233.25, + "Tc": 405.56, + "rhoc": 233.25, + "Pc": 11363.4, + "Tt": 195.49, + "Pt": 6.055813, + "rhot_l": 733.8486491, + "rhot_v": 0.063731569, + "P_min": 6.055813, + "P_max": 1000000.0, + "rho_max": 904.8315276, + "T_min": 195.49, + "T_max": 725.0 + }, + "eos": { + "reference": [ + "SKehui Gao (高克慧),Jiangtao Wu (吴江涛),Ian H. Bell, Allan H. Harvey, and Eric W. Lemmon (2023)", + " A Reference Equation of State with an Associating Term for Thermodynamic Properties of Ammonia" + ], + "c": { + "6": 2, + "7": 2, + "8": 1 + }, + "d": { + "1": 4, + "2": 1, + "3": 1, + "4": 2, + "5": 3, + "6": 3, + "7": 2, + "8": 3, + "9": 1, + "10": 1, + "11": 1, + "12": 2, + "13": 2, + "14": 1, + "15": 3, + "16": 3, + "17": 1, + "18": 1, + "19": 1, + "20": 1 + + }, + "t": { + "1": 1.0, + "2": 0.382, + "3": 1.00, + "4": 1.0, + "5": 0.677, + "6": 2.915, + "7": 3.51, + "8": 1.063, + "9": 0.655, + "10": 1.3, + "11": 3.1, + "12": 1.4395, + "13": 1.623, + "14": 0.643, + "15": 1.13, + "16": 4.5, + "17": 1.0, + "18": 4.0, + "19": 4.3315, + "20": 4.015 + }, + "n": { + "1": 0.006132232, + "2": 1.7395866, + "3": -2.2261792, + "4": -0.30127553, + "5": 0.08967023, + "6": -0.076387037, + "7": -0.84063963, + "8": -0.27026327, + "9": 6.212578, + "10": -5.7844357, + "11": 2.4817542, + "12": -2.3739168, + "13": 0.01493697, + "14": -3.7749264, + "15": 0.0006254348, + "16": -1.7359e-05, + "17": -0.13462033, + "18": 0.07749072839, + "19": -1.6909858, + "20": 0.93739074 + }, + "a": { + "9": 0.42776, + "10": 0.6424, + "11": 0.8175, + "12": 0.7995, + "13": 0.91, + "14": 0.3574, + "15": 1.21, + "16": 4.14, + "17": 22.56, + "18": 22.68, + "19": 2.8452, + "20": 2.8342 + }, + "b": { + "9": 1.708, + "10": 1.4865, + "11": 2.0915, + "12": 2.43, + "13": 0.488, + "14": 1.1, + "15": 0.85, + "16": 1.14, + "17": 945.64, + "18": 993.85, + "19": 0.3696, + "20": 0.2962 + }, + "bi":{ + "19": 1.244, + "20": 0.6826 + }, + "g": { + "9": 1.036, + "10": 1.2777, + "11": 1.083, + "12": 1.2906, + "13": 0.928, + "14": 0.934, + "15": 0.919, + "16": 1.852, + "17": 1.05897, + "18": 1.05277, + "19": 1.108, + "20": 1.313 + }, + "e": { + "9": -0.0726, + "10": -0.1274, + "11": 0.7527, + "12": 0.57, + "13": 2.2, + "14": -0.243, + "15": 2.96, + "16": 3.02, + "17": 0.9574, + "18": 0.9576, + "19": 0.4478, + "20": 0.44689 + }, + "reference_state_offset": [ + + ], + "n0": { + "1": -6.59406093943886, + "2": 5.60101151987913, + "3": 4.0, + "4": 2.224, + "5": 3.148, + "6": 0.9579 + }, + "g0": { + "4":1646, + "5":3965, + "6":7231 + }, + "last_term_ideal": 6, + "last_term_residual": [5, 8, 18, 20], + "phi_ideal_type": 4, + "phi_residual_type": 5 + }, + "aux": { + "reference": [ + "Gao, Kehui, et al. A reference equation of state with an associating term for the thermodynamic properties of ammonia.", + " Journal of Physical and Chemical Reference Data 52.1 (2023)." + ], + "delta_l_sat_approx": { + "c": 1, + "n": { + "1": 0.051236, + "2": 3.7925, + "3": -3.5929, + "4": 4.6409, + "5": -1.9893, + "6": 1.5978 + }, + "t": { + "1": 0.07, + "2": 0.46, + "3": 0.77, + "4": 1.05, + "5": 1.25, + "6": 8.0 + }, + "type": 1 + }, + "delta_v_sat_approx": { + "c": 1, + "n": { + "1": -0.089966, + "2": -3.8722, + "3": -8.1183, + "4": -25.293, + "5": -54.279, + "6": -400.83 + }, + "t": { + "1": 0.112, + "2": 0.473, + "3": 1.5, + "4": 3.875, + "5": 8.0, + "6": 20.0 + }, + "type": 2 + } + }, + "transport": { + "thermal_conductivity": { + "reference": [ + "Monogenidou, S. A., Marc J. Assael, and Marcia L. Huber.", + "Reference correlation for the thermal conductivity of ammonia ", + "from the triple-point temperature to 680 K and pressures up to 80 MPa. ", + "Journal of Physical and Chemical Reference Data 47.4 (2018)." + ] + }, + "viscosity": { + "reference": [ + "Fenghour, A., et al. The viscosity of ammonia.", + " Journal of Physical and Chemical Reference Data 24.5 (1995): 1649-1667." + ] + }, + "surface_tension": { + "reference": [ + "Mulero, A., I. Cachadina, Parra, M., Recommended Correlations for the Surface ", + " Tension of Common Fluids, J. Phys. Chem. Ref. Data 41, 043105, (2012)." + ], + "Tc": 405.4, + "s": { + "0": 102.8, + "1": -94.53 + }, + "n": { + "0": 1.211, + "1": 5.585 + }, + "type": 1 + } + } +} \ No newline at end of file diff --git a/idaes/models/properties/general_helmholtz/components/parameters/nh3.py b/idaes/models/properties/general_helmholtz/components/parameters/nh3.py new file mode 100644 index 0000000000..982e053d51 --- /dev/null +++ b/idaes/models/properties/general_helmholtz/components/parameters/nh3.py @@ -0,0 +1,173 @@ +################################################################################# +# The Institute for the Design of Advanced Energy Systems Integrated Platform +# Framework (IDAES IP) was produced under the DOE Institute for the +# Design of Advanced Energy Systems (IDAES). +# +# Copyright (c) 2018-2024 by the software owners: The Regents of the +# University of California, through Lawrence Berkeley National Laboratory, +# National Technology & Engineering Solutions of Sandia, LLC, Carnegie Mellon +# University, West Virginia University Research Corporation, et al. +# All rights reserved. Please see the files COPYRIGHT.md and LICENSE.md +# for full copyright and license information. +################################################################################# +"""Generate parameter and expression files for NH3 +""" + +__author__ = "Stephen Burroughs" + +import os +import pyomo.environ as pyo +from pyomo.common.fileutils import this_file_dir +from idaes.models.properties.general_helmholtz.helmholtz_parameters import ( + WriteParameters, +) + + +def thermal_conductivity_rule(m): + # """Thermal conductivity rule + + # Monogenidou, S. A., Marc J. Assael, and Marcia L. Huber. + # "Reference correlation for the thermal conductivity of ammonia + # from the triple-point temperature to 680 K and pressures up to 80 MPa." + # Journal of Physical and Chemical Reference Data 47.4 (2018). + # """ + b = { + 1: 0.07152, + 2: 130.228, + 3: 9569.817, + } + u = { + 1: 1646, + 2: 3965, + 3: 7231, + } + v = { + 1: 2.224, + 2: 3.148, + 3: 0.9579, + } + B = { + 1: { + 1: 0.103432e0, + 2: -0.112597e0, + 3: 0.233301e0, + 4: -0.112536e0, + 5: 0.141129e-1, + }, + 2: { + 1: -0.283976e-1, + 2: 0.482520e-1, + 3: -0.644124e-1, + 4: 0.529376e-2, + 5: 0.891203e-2, + }, + } + T = m.T_star / m.tau + # Ts = T / 251.196 + rho = m.rho_star * m.delta + G = sum(bval / T**i for i, bval in b.items()) + cint_over_k = 4.0 + +sum( + v[i] * (u[i] / T) ** 2 * pyo.exp(u[i] / T) / (pyo.exp(u[i] / T) - 1) ** 2 + for i in range(1, len(u.items()) + 1) + ) + return 0.1351767 * pyo.sqrt(T) * cint_over_k / G + sum( + (B[1][i] + B[2][i] * T) * rho**i for i in range(1, 6) + ) + + +def viscosity_rule(m): + # """Viscosity rule + + # Fenghour, A., et al. "The viscosity of ammonia." + # Journal of Physical and Chemical Reference Data 24.5 (1995): 1649-1667. + # """ + a = { + 0: 4.99318220, + 1: -0.61122364, + 2: 0, + 3: 0.18535124, + 4: -0.11160946, + } + c = { + 0: -0.17999496e1, + 1: 0.46692621e2, + 2: -0.53460794e3, + 3: 0.33604074e4, + 4: -0.13019164e5, + 5: 0.33414230e5, + 6: -0.58711743e5, + 7: 0.71426686e5, + 8: -0.59834012e5, + 9: 0.33652741e5, + 10: -0.12027350e5, + 11: 0.24348205e4, + 12: -0.20807957e3, + } + d = { + 2: { + 0: 0, + 1: 0, + 2: 2.19664285e-1, + 3: 0, + 4: -0.83651107e-1, + }, + 3: { + 0: 0.17366936e-2, + 1: -0.64250359e-2, + 2: 0, + 3: 0, + 4: 0, + }, + 4: { + 0: 0, + 1: 0, + 2: 1.67668649e-4, + 3: -1.49710093e-4, + 4: 0.77012274e-4, + }, + } + + T = m.T_star / m.tau + rho = m.delta * m.rho_star + Ts = T / 386 + return ( + 0.021357 + * pyo.sqrt(17.03026 * T) + / (0.2957**2 * pyo.exp(sum(aval * pyo.log(Ts) ** i for i, aval in a.items()))) + + 0.021357 + * pyo.sqrt(17.03026 * T) + / (0.2957**2 * pyo.exp(sum(aval * pyo.log(Ts) ** i for i, aval in a.items()))) + * sum((c[i] * pyo.sqrt(Ts) ** -i) for i in range(0, len(c.items()))) + / (0.6022137 * 0.2957**3) + * rho + + sum( + sum(d[i][j] / Ts**j for j in range(0, len(d[i].items()))) * rho**i + for i in range(2, 5) + ) + ) + + +def main(dry_run=False): + """Generate parameter and expression files. + + Args: + dry_run (bool): If dry run don't generate files + + Returns: + None + """ + main_param_file = os.path.join(this_file_dir(), "nh3.json") + we = WriteParameters(parameters=main_param_file) + we.add( + { + "viscosity": viscosity_rule, + "thermal_conductivity": thermal_conductivity_rule, + } + ) + we.write(dry_run=dry_run) + return we + + +if __name__ == "__main__": + main() diff --git a/idaes/models/properties/general_helmholtz/components/parameters/nh3_expressions_eos.nl b/idaes/models/properties/general_helmholtz/components/parameters/nh3_expressions_eos.nl new file mode 100644 index 0000000000..de31f4350c --- /dev/null +++ b/idaes/models/properties/general_helmholtz/components/parameters/nh3_expressions_eos.nl @@ -0,0 +1,3827 @@ +g3 1 1 0 # problem unknown + 2 0 14 0 0 # vars, constraints, objectives, ranges, eqns + 0 13 0 0 0 0 # nonlinear constrs, objs; ccons: lin, nonlin, nd, nzlb + 0 0 # network constraints: nonlinear, linear + 0 2 0 # nonlinear vars in constraints, objectives, both + 0 0 0 1 # linear network variables; functions; arith, flags + 0 0 0 0 0 # discrete variables: binary, integer, nonlinear (b,c,o) + 0 20 # nonzeros in Jacobian, obj. gradient + 0 0 # max name lengths: constraints, variables + 0 0 0 0 0 # common exprs: b,c,o,c1,o1 +O0 0 +o0 +o54 +5 +o43 +v0 +o2 +n3.0 +o43 +v1 +o2 +n2.224 +o43 +o0 +o16 +o44 +o2 +n-4.0585856593352405 +v1 +n1 +o2 +n3.148 +o43 +o0 +o16 +o44 +o2 +n-9.776605187888352 +v1 +n1 +o2 +n0.9579 +o43 +o0 +o16 +o44 +o2 +n-17.829667620080876 +v1 +n1 +n-6.59406093943886 +O1 0 +o3 +n1.0 +v0 +O2 0 +o3 +n-1.0 +o5 +v0 +n2 +O3 0 +o0 +o54 +4 +o3 +n3.0 +v1 +o3 +n3660.704 +o2 +n405.56 +o0 +o44 +o2 +n4.0585856593352405 +v1 +n-1 +o3 +n12481.82 +o2 +n405.56 +o0 +o44 +o2 +n9.776605187888352 +v1 +n-1 +o3 +n6926.5749 +o2 +n405.56 +o0 +o44 +o2 +n17.829667620080876 +v1 +n-1 +n5.60101151987913 +O4 0 +o0 +o3 +n-3.0 +o5 +v1 +n2 +o16 +o54 +3 +o3 +o2 +n6025518.784000001 +o44 +o2 +n4.0585856593352405 +v1 +o2 +n164478.9136 +o5 +o0 +o44 +o2 +n4.0585856593352405 +v1 +n-1 +n2 +o3 +o2 +n49490416.300000004 +o44 +o2 +n9.776605187888352 +v1 +o2 +n164478.9136 +o5 +o0 +o44 +o2 +n9.776605187888352 +v1 +n-1 +n2 +o3 +o2 +n50086063.1019 +o44 +o2 +n17.829667620080876 +v1 +o2 +n164478.9136 +o5 +o0 +o44 +o2 +n17.829667620080876 +v1 +n-1 +n2 +O5 0 +o54 +20 +o2 +o2 +n0.006132232 +o5 +v0 +n4 +v1 +o2 +o2 +n1.7395866 +v0 +o5 +v1 +n0.382 +o2 +o2 +n-2.2261792 +v0 +v1 +o2 +o2 +n-0.30127553 +o5 +v0 +n2 +v1 +o2 +o2 +n0.08967023 +o5 +v0 +n3 +o5 +v1 +n0.677 +o2 +o2 +o2 +n-0.076387037 +o5 +v0 +n3 +o5 +v1 +n2.915 +o44 +o16 +o5 +v0 +n2 +o2 +o2 +o2 +n-0.84063963 +o5 +v0 +n2 +o5 +v1 +n3.51 +o44 +o16 +o5 +v0 +n2 +o2 +o2 +o2 +n-0.27026327 +o5 +v0 +n3 +o5 +v1 +n1.063 +o44 +o2 +n-1 +v0 +o2 +o2 +o2 +n6.212578 +v0 +o5 +v1 +n0.655 +o44 +o0 +o2 +n-0.42776 +o5 +o0 +v0 +n0.0726 +n2 +o2 +n-1.708 +o5 +o0 +v1 +n-1.036 +n2 +o2 +o2 +o2 +n-5.7844357 +v0 +o5 +v1 +n1.3 +o44 +o0 +o2 +n-0.6424 +o5 +o0 +v0 +n0.1274 +n2 +o2 +n-1.4865 +o5 +o0 +v1 +n-1.2777 +n2 +o2 +o2 +o2 +n2.4817542 +v0 +o5 +v1 +n3.1 +o44 +o0 +o2 +n-0.8175 +o5 +o0 +v0 +n-0.7527 +n2 +o2 +n-2.0915 +o5 +o0 +v1 +n-1.083 +n2 +o2 +o2 +o2 +n-2.3739168 +o5 +v0 +n2 +o5 +v1 +n1.4395 +o44 +o0 +o2 +n-0.7995 +o5 +o0 +v0 +n-0.57 +n2 +o2 +n-2.43 +o5 +o0 +v1 +n-1.2906 +n2 +o2 +o2 +o2 +n0.01493697 +o5 +v0 +n2 +o5 +v1 +n1.623 +o44 +o0 +o2 +n-0.91 +o5 +o0 +v0 +n-2.2 +n2 +o2 +n-0.488 +o5 +o0 +v1 +n-0.928 +n2 +o2 +o2 +o2 +n-3.7749264 +v0 +o5 +v1 +n0.643 +o44 +o0 +o2 +n-0.3574 +o5 +o0 +v0 +n0.243 +n2 +o2 +n-1.1 +o5 +o0 +v1 +n-0.934 +n2 +o2 +o2 +o2 +n0.0006254348 +o5 +v0 +n3 +o5 +v1 +n1.13 +o44 +o0 +o2 +n-1.21 +o5 +o0 +v0 +n-2.96 +n2 +o2 +n-0.85 +o5 +o0 +v1 +n-0.919 +n2 +o2 +o2 +o2 +n-1.7359e-05 +o5 +v0 +n3 +o5 +v1 +n4.5 +o44 +o0 +o2 +n-4.14 +o5 +o0 +v0 +n-3.02 +n2 +o2 +n-1.14 +o5 +o0 +v1 +n-1.852 +n2 +o2 +o2 +o2 +n-0.13462033 +v0 +v1 +o44 +o0 +o2 +n-22.56 +o5 +o0 +v0 +n-0.9574 +n2 +o2 +n-945.64 +o5 +o0 +v1 +n-1.05897 +n2 +o2 +o2 +o2 +n0.07749072839 +v0 +o5 +v1 +n4.0 +o44 +o0 +o2 +n-22.68 +o5 +o0 +v0 +n-0.9576 +n2 +o2 +n-993.85 +o5 +o0 +v1 +n-1.05277 +n2 +o2 +o2 +o2 +n-1.6909858 +v0 +o5 +v1 +n4.3315 +o44 +o0 +o2 +n-2.8452 +o5 +o0 +v0 +n-0.4478 +n2 +o3 +n1 +o0 +o2 +n0.3696 +o5 +o0 +v1 +n-1.108 +n2 +n1.244 +o2 +o2 +o2 +n0.93739074 +v0 +o5 +v1 +n4.015 +o44 +o0 +o2 +n-2.8342 +o5 +o0 +v0 +n-0.44689 +n2 +o3 +n1 +o0 +o2 +n0.2962 +o5 +o0 +v1 +n-1.313 +n2 +n0.6826 +O6 0 +o54 +19 +o2 +o2 +n0.024528928 +o5 +v0 +n3 +v1 +o2 +n1.7395866 +o5 +v1 +n0.382 +o2 +o2 +n-0.60255106 +v0 +v1 +o2 +o2 +n0.26901069 +o5 +v0 +n2 +o5 +v1 +n0.677 +o2 +o2 +o2 +o2 +n-0.076387037 +o44 +o16 +o5 +v0 +n2 +o5 +v0 +n2 +o5 +v1 +n2.915 +o0 +o2 +n-2 +o5 +v0 +n2 +n3 +o2 +o2 +o2 +o2 +n-0.84063963 +o44 +o16 +o5 +v0 +n2 +v0 +o5 +v1 +n3.51 +o0 +o2 +n-2 +o5 +v0 +n2 +n2 +o2 +o2 +o2 +o2 +n-0.27026327 +o44 +o2 +n-1 +v0 +o5 +v0 +n2 +o5 +v1 +n1.063 +o0 +o2 +n-1 +v0 +n3 +o2 +o2 +o2 +o2 +n6.212578 +v0 +o5 +v1 +n0.655 +o44 +o0 +o2 +n-0.42776 +o5 +o0 +v0 +n0.0726 +n2 +o2 +n-1.708 +o5 +o0 +v1 +n-1.036 +n2 +o54 +3 +o2 +n-0.85552 +v0 +o3 +n1 +v0 +n-0.06211075199999999 +o2 +o2 +o2 +o2 +n-5.7844357 +v0 +o5 +v1 +n1.3 +o44 +o0 +o2 +n-0.6424 +o5 +o0 +v0 +n0.1274 +n2 +o2 +n-1.4865 +o5 +o0 +v1 +n-1.2777 +n2 +o54 +3 +o2 +n-1.2848 +v0 +o3 +n1 +v0 +n-0.16368352 +o2 +o2 +o2 +o2 +n2.4817542 +v0 +o5 +v1 +n3.1 +o44 +o0 +o2 +n-0.8175 +o5 +o0 +v0 +n-0.7527 +n2 +o2 +n-2.0915 +o5 +o0 +v1 +n-1.083 +n2 +o54 +3 +o2 +n-1.635 +v0 +o3 +n1 +v0 +n1.2306645 +o2 +o2 +o2 +o2 +n-2.3739168 +o5 +v0 +n2 +o5 +v1 +n1.4395 +o44 +o0 +o2 +n-0.7995 +o5 +o0 +v0 +n-0.57 +n2 +o2 +n-2.43 +o5 +o0 +v1 +n-1.2906 +n2 +o54 +3 +o2 +n-1.599 +v0 +o3 +n2 +v0 +n0.91143 +o2 +o2 +o2 +o2 +n0.01493697 +o5 +v0 +n2 +o5 +v1 +n1.623 +o44 +o0 +o2 +n-0.91 +o5 +o0 +v0 +n-2.2 +n2 +o2 +n-0.488 +o5 +o0 +v1 +n-0.928 +n2 +o54 +3 +o2 +n-1.82 +v0 +o3 +n2 +v0 +n4.0040000000000004 +o2 +o2 +o2 +o2 +n-3.7749264 +v0 +o5 +v1 +n0.643 +o44 +o0 +o2 +n-0.3574 +o5 +o0 +v0 +n0.243 +n2 +o2 +n-1.1 +o5 +o0 +v1 +n-0.934 +n2 +o54 +3 +o2 +n-0.7148 +v0 +o3 +n1 +v0 +n-0.1736964 +o2 +o2 +o2 +o2 +n0.0006254348 +o5 +v0 +n3 +o5 +v1 +n1.13 +o44 +o0 +o2 +n-1.21 +o5 +o0 +v0 +n-2.96 +n2 +o2 +n-0.85 +o5 +o0 +v1 +n-0.919 +n2 +o54 +3 +o2 +n-2.42 +v0 +o3 +n3 +v0 +n7.1632 +o2 +o2 +o2 +o2 +n-1.7359e-05 +o5 +v0 +n3 +o5 +v1 +n4.5 +o44 +o0 +o2 +n-4.14 +o5 +o0 +v0 +n-3.02 +n2 +o2 +n-1.14 +o5 +o0 +v1 +n-1.852 +n2 +o54 +3 +o2 +n-8.28 +v0 +o3 +n3 +v0 +n25.005599999999998 +o2 +o2 +o2 +o2 +n-0.13462033 +v0 +v1 +o44 +o0 +o2 +n-22.56 +o5 +o0 +v0 +n-0.9574 +n2 +o2 +n-945.64 +o5 +o0 +v1 +n-1.05897 +n2 +o54 +3 +o2 +n-45.12 +v0 +o3 +n1 +v0 +n43.197888 +o2 +o2 +o2 +o2 +n0.07749072839 +v0 +o5 +v1 +n4.0 +o44 +o0 +o2 +n-22.68 +o5 +o0 +v0 +n-0.9576 +n2 +o2 +n-993.85 +o5 +o0 +v1 +n-1.05277 +n2 +o54 +3 +o2 +n-45.36 +v0 +o3 +n1 +v0 +n43.436735999999996 +o2 +o2 +o2 +o2 +n-1.6909858 +v0 +o5 +v1 +n4.3315 +o44 +o0 +o2 +n-2.8452 +o5 +o0 +v0 +n-0.4478 +n2 +o3 +n1 +o0 +o2 +n0.3696 +o5 +o0 +v1 +n-1.108 +n2 +n1.244 +o54 +3 +o2 +n-5.6904 +v0 +o3 +n1 +v0 +n2.54816112 +o2 +o2 +o2 +o2 +n0.93739074 +v0 +o5 +v1 +n4.015 +o44 +o0 +o2 +n-2.8342 +o5 +o0 +v0 +n-0.44689 +n2 +o3 +n1 +o0 +o2 +n0.2962 +o5 +o0 +v1 +n-1.313 +n2 +n0.6826 +o54 +3 +o2 +n-5.6684 +v0 +o3 +n1 +v0 +n2.533151276 +O7 0 +o54 +17 +o2 +o2 +n0.07358678399999999 +o5 +v0 +n2 +v1 +o2 +o2 +n0.53802138 +v0 +o5 +v1 +n0.677 +o2 +o2 +o2 +o2 +n-0.076387037 +o44 +o16 +o5 +v0 +n2 +v0 +o5 +v1 +n2.915 +o0 +o2 +o0 +o2 +n-2 +o5 +v0 +n2 +n3 +o0 +o2 +n-2 +o5 +v0 +n2 +n2 +o2 +n-4 +o5 +v0 +n2 +o2 +o2 +o2 +n-0.84063963 +o44 +o16 +o5 +v0 +n2 +o5 +v1 +n3.51 +o0 +o2 +o0 +o2 +n-2 +o5 +v0 +n2 +n2 +o0 +o2 +n-2 +o5 +v0 +n2 +n1 +o2 +n-4 +o5 +v0 +n2 +o2 +o2 +o2 +o2 +n-0.27026327 +o44 +o2 +n-1 +v0 +v0 +o5 +v1 +n1.063 +o0 +o2 +n-1 +v0 +o2 +o0 +o2 +n-1 +v0 +n3 +o0 +o2 +n-1 +v0 +n2 +o2 +o2 +o2 +n6.212578 +o5 +v1 +n0.655 +o44 +o0 +o2 +n-0.42776 +o5 +o0 +v0 +n0.0726 +n2 +o2 +n-1.708 +o5 +o0 +v1 +n-1.036 +n2 +o54 +3 +o2 +n-2.56656 +v0 +o2 +o2 +n0.7319144703999999 +v0 +o5 +o0 +v0 +n0.0726 +n2 +n-0.12422150399999998 +o2 +o2 +o2 +n-5.7844357 +o5 +v1 +n1.3 +o44 +o0 +o2 +n-0.6424 +o5 +o0 +v0 +n0.1274 +n2 +o2 +n-1.4865 +o5 +o0 +v1 +n-1.2777 +n2 +o54 +3 +o2 +n-3.8544 +v0 +o2 +o2 +n1.6507110399999998 +v0 +o5 +o0 +v0 +n0.1274 +n2 +n-0.32736704 +o2 +o2 +o2 +n2.4817542 +o5 +v1 +n3.1 +o44 +o0 +o2 +n-0.8175 +o5 +o0 +v0 +n-0.7527 +n2 +o2 +n-2.0915 +o5 +o0 +v1 +n-1.083 +n2 +o54 +3 +o2 +n-4.905 +v0 +o2 +o2 +n2.673225 +v0 +o5 +o0 +v0 +n-0.7527 +n2 +n2.461329 +o2 +o2 +o2 +n-2.3739168 +o5 +v1 +n1.4395 +o44 +o0 +o2 +n-0.7995 +o5 +o0 +v0 +n-0.57 +n2 +o2 +n-2.43 +o5 +o0 +v1 +n-1.2906 +n2 +o54 +4 +o2 +n-1.599 +o5 +v0 +n2 +o2 +o2 +n2.556801 +o5 +v0 +n2 +o5 +o0 +v0 +n-0.57 +n2 +o16 +o2 +o2 +n6.396 +v0 +o0 +v0 +n-0.57 +n2.0 +o2 +o2 +o2 +n0.01493697 +o5 +v1 +n1.623 +o44 +o0 +o2 +n-0.91 +o5 +o0 +v0 +n-2.2 +n2 +o2 +n-0.488 +o5 +o0 +v1 +n-0.928 +n2 +o54 +4 +o2 +n-1.82 +o5 +v0 +n2 +o2 +o2 +n3.3124000000000002 +o5 +v0 +n2 +o5 +o0 +v0 +n-2.2 +n2 +o16 +o2 +o2 +n7.28 +v0 +o0 +v0 +n-2.2 +n2.0 +o2 +o2 +o2 +n-3.7749264 +o5 +v1 +n0.643 +o44 +o0 +o2 +n-0.3574 +o5 +o0 +v0 +n0.243 +n2 +o2 +n-1.1 +o5 +o0 +v1 +n-0.934 +n2 +o54 +3 +o2 +n-2.1444 +v0 +o2 +o2 +n0.51093904 +v0 +o5 +o0 +v0 +n0.243 +n2 +n-0.3473928 +o2 +o2 +o2 +n0.0006254348 +o5 +v1 +n1.13 +o44 +o0 +o2 +n-1.21 +o5 +o0 +v0 +n-2.96 +n2 +o2 +n-0.85 +o5 +o0 +v1 +n-0.919 +n2 +o54 +4 +o2 +n6 +v0 +o2 +n-2.42 +o5 +v0 +n3 +o2 +o2 +n5.8564 +o5 +v0 +n3 +o5 +o0 +v0 +n-2.96 +n2 +o16 +o2 +o2 +n14.52 +o5 +v0 +n2 +o0 +v0 +n-2.96 +o2 +o2 +o2 +n-1.7359e-05 +o5 +v1 +n4.5 +o44 +o0 +o2 +n-4.14 +o5 +o0 +v0 +n-3.02 +n2 +o2 +n-1.14 +o5 +o0 +v1 +n-1.852 +n2 +o54 +4 +o2 +n6 +v0 +o2 +n-8.28 +o5 +v0 +n3 +o2 +o2 +n68.55839999999999 +o5 +v0 +n3 +o5 +o0 +v0 +n-3.02 +n2 +o16 +o2 +o2 +n49.67999999999999 +o5 +v0 +n2 +o0 +v0 +n-3.02 +o2 +o2 +o2 +n-0.13462033 +v1 +o44 +o0 +o2 +n-22.56 +o5 +o0 +v0 +n-0.9574 +n2 +o2 +n-945.64 +o5 +o0 +v1 +n-1.05897 +n2 +o54 +3 +o2 +n-135.35999999999999 +v0 +o2 +o2 +n2035.8143999999998 +v0 +o5 +o0 +v0 +n-0.9574 +n2 +n86.395776 +o2 +o2 +o2 +n0.07749072839 +o5 +v1 +n4.0 +o44 +o0 +o2 +n-22.68 +o5 +o0 +v0 +n-0.9576 +n2 +o2 +n-993.85 +o5 +o0 +v1 +n-1.05277 +n2 +o54 +3 +o2 +n-136.07999999999998 +v0 +o2 +o2 +n2057.5296 +v0 +o5 +o0 +v0 +n-0.9576 +n2 +n86.87347199999999 +o2 +o2 +o2 +o2 +n-1.6909858 +o5 +v0 +n-1 +o5 +v1 +n4.3315 +o0 +o2 +o2 +n-11.3808 +v0 +o0 +v0 +n-0.4478 +o2 +o2 +n5.6904 +o5 +v0 +n2 +o0 +o2 +n5.6904 +o5 +o0 +v0 +n-0.4478 +n2 +n-1.0 +o44 +o0 +o2 +n-2.8452 +o5 +o0 +v0 +n-0.4478 +n2 +o3 +n1 +o0 +o2 +n0.3696 +o5 +o0 +v1 +n-1.108 +n2 +n1.244 +o2 +o2 +o2 +o2 +n0.93739074 +o5 +v0 +n-1 +o5 +v1 +n4.015 +o0 +o2 +o2 +n-11.3368 +v0 +o0 +v0 +n-0.44689 +o2 +o2 +n5.6684 +o5 +v0 +n2 +o0 +o2 +n5.6684 +o5 +o0 +v0 +n-0.44689 +n2 +n-1.0 +o44 +o0 +o2 +n-2.8342 +o5 +o0 +v0 +n-0.44689 +n2 +o3 +n1 +o0 +o2 +n0.2962 +o5 +o0 +v1 +n-1.313 +n2 +n0.6826 +O8 0 +o54 +19 +o2 +n0.006132232 +o5 +v0 +n4 +o2 +o2 +n0.6645220812 +v0 +o5 +v1 +n-0.618 +o2 +n-0.30127553 +o5 +v0 +n2 +o2 +o2 +n0.06070674571000001 +o5 +v0 +n3 +o5 +v1 +n-0.32299999999999995 +o2 +o2 +o2 +n-0.22266821285500002 +o5 +v0 +n3 +o5 +v1 +n1.915 +o44 +o16 +o5 +v0 +n2 +o2 +o2 +o2 +n-2.9506451012999997 +o5 +v0 +n2 +o5 +v1 +n2.51 +o44 +o16 +o5 +v0 +n2 +o2 +o2 +o2 +n-0.28728985601 +o5 +v0 +n3 +o5 +v1 +n0.06299999999999994 +o44 +o2 +n-1 +v0 +o2 +o2 +o2 +o2 +n6.212578 +v0 +o5 +v1 +n0.655 +o44 +o0 +o2 +n-0.42776 +o5 +o0 +v0 +n0.0726 +n2 +o2 +n-1.708 +o5 +o0 +v1 +n-1.036 +n2 +o54 +3 +o2 +n-3.416 +v1 +o3 +n0.655 +v1 +n3.538976 +o2 +o2 +o2 +o2 +n-5.7844357 +v0 +o5 +v1 +n1.3 +o44 +o0 +o2 +n-0.6424 +o5 +o0 +v0 +n0.1274 +n2 +o2 +n-1.4865 +o5 +o0 +v1 +n-1.2777 +n2 +o54 +3 +o2 +n-2.973 +v1 +o3 +n1.3 +v1 +n3.7986021 +o2 +o2 +o2 +o2 +n2.4817542 +v0 +o5 +v1 +n3.1 +o44 +o0 +o2 +n-0.8175 +o5 +o0 +v0 +n-0.7527 +n2 +o2 +n-2.0915 +o5 +o0 +v1 +n-1.083 +n2 +o54 +3 +o2 +n-4.183 +v1 +o3 +n3.1 +v1 +n4.530189 +o2 +o2 +o2 +o2 +n-2.3739168 +o5 +v0 +n2 +o5 +v1 +n1.4395 +o44 +o0 +o2 +n-0.7995 +o5 +o0 +v0 +n-0.57 +n2 +o2 +n-2.43 +o5 +o0 +v1 +n-1.2906 +n2 +o54 +3 +o2 +n-4.86 +v1 +o3 +n1.4395 +v1 +n6.272316 +o2 +o2 +o2 +o2 +n0.01493697 +o5 +v0 +n2 +o5 +v1 +n1.623 +o44 +o0 +o2 +n-0.91 +o5 +o0 +v0 +n-2.2 +n2 +o2 +n-0.488 +o5 +o0 +v1 +n-0.928 +n2 +o54 +3 +o2 +n-0.976 +v1 +o3 +n1.623 +v1 +n0.905728 +o2 +o2 +o2 +o2 +n-3.7749264 +v0 +o5 +v1 +n0.643 +o44 +o0 +o2 +n-0.3574 +o5 +o0 +v0 +n0.243 +n2 +o2 +n-1.1 +o5 +o0 +v1 +n-0.934 +n2 +o54 +3 +o2 +n-2.2 +v1 +o3 +n0.643 +v1 +n2.0548 +o2 +o2 +o2 +o2 +n0.0006254348 +o5 +v0 +n3 +o5 +v1 +n1.13 +o44 +o0 +o2 +n-1.21 +o5 +o0 +v0 +n-2.96 +n2 +o2 +n-0.85 +o5 +o0 +v1 +n-0.919 +n2 +o54 +3 +o2 +n-1.7 +v1 +o3 +n1.13 +v1 +n1.5623 +o2 +o2 +o2 +o2 +n-1.7359e-05 +o5 +v0 +n3 +o5 +v1 +n4.5 +o44 +o0 +o2 +n-4.14 +o5 +o0 +v0 +n-3.02 +n2 +o2 +n-1.14 +o5 +o0 +v1 +n-1.852 +n2 +o54 +3 +o2 +n-2.28 +v1 +o3 +n4.5 +v1 +n4.22256 +o2 +o2 +o2 +o2 +n-0.13462033 +v0 +v1 +o44 +o0 +o2 +n-22.56 +o5 +o0 +v0 +n-0.9574 +n2 +o2 +n-945.64 +o5 +o0 +v1 +n-1.05897 +n2 +o54 +3 +o2 +n-1891.28 +v1 +o3 +n1.0 +v1 +n2002.8087816 +o2 +o2 +o2 +o2 +n0.07749072839 +v0 +o5 +v1 +n4.0 +o44 +o0 +o2 +n-22.68 +o5 +o0 +v0 +n-0.9576 +n2 +o2 +n-993.85 +o5 +o0 +v1 +n-1.05277 +n2 +o54 +3 +o2 +n-1987.7 +v1 +o3 +n4.0 +v1 +n2092.590929 +o3 +o2 +o2 +o2 +o2 +n-1.6909858 +v0 +o5 +v1 +n3.3315 +o54 +3 +o2 +n3.9830949312 +o5 +o0 +v1 +n-1.108 +n2 +o16 +o2 +o2 +n0.3696 +o0 +v1 +n-1.108 +o0 +o2 +n2 +v1 +o2 +n1.6009224 +o5 +o0 +v1 +n-1.108 +n3 +n6.703152184 +o44 +o0 +o2 +n-2.8452 +o5 +o0 +v0 +n-0.4478 +n2 +o3 +n1 +o0 +o2 +n0.3696 +o5 +o0 +v1 +n-1.108 +n2 +n1.244 +o5 +o0 +o2 +n0.3696 +o5 +o0 +v1 +n-1.108 +n2 +n1.244 +n2 +o3 +o2 +o2 +o2 +o2 +n0.93739074 +v0 +o5 +v1 +n3.0149999999999997 +o54 +3 +o2 +n1.6235545435999998 +o5 +o0 +v1 +n-1.313 +n2 +o16 +o2 +o2 +n0.2962 +o0 +v1 +n-1.313 +o0 +o2 +n2 +v1 +o2 +n1.189243 +o5 +o0 +v1 +n-1.313 +n3 +n1.8707601813999997 +o44 +o0 +o2 +n-2.8342 +o5 +o0 +v0 +n-0.44689 +n2 +o3 +n1 +o0 +o2 +n0.2962 +o5 +o0 +v1 +n-1.313 +n2 +n0.6826 +o5 +o0 +o2 +n0.2962 +o5 +o0 +v1 +n-1.313 +n2 +n0.6826 +n2 +O9 0 +o54 +17 +o2 +o2 +n-0.4106746461816 +v0 +o5 +v1 +n-1.6179999999999999 +o2 +o2 +n-0.01960827886433 +o5 +v0 +n3 +o5 +v1 +n-1.323 +o2 +o2 +o2 +n-0.42640962761732504 +o5 +v0 +n3 +o5 +v1 +n0.915 +o44 +o16 +o5 +v0 +n2 +o2 +o2 +o2 +n-7.406119204262999 +o5 +v0 +n2 +o5 +v1 +n1.5099999999999998 +o44 +o16 +o5 +v0 +n2 +o2 +o2 +o2 +n-0.018099260928629984 +o5 +v0 +n3 +o5 +v1 +n-0.937 +o44 +o2 +n-1 +v0 +o2 +o2 +o2 +o2 +n6.212578 +v0 +o5 +v1 +n0.655 +o44 +o0 +o2 +n-0.42776 +o5 +o0 +v0 +n0.0726 +n2 +o2 +n-1.708 +o5 +o0 +v1 +n-1.036 +n2 +o54 +3 +o5 +o54 +3 +o2 +n-3.416 +v1 +o3 +n0.655 +v1 +n3.538976 +n2 +o16 +o3 +n0.655 +o5 +v1 +n2 +n-3.416 +o2 +o2 +o2 +o2 +n-5.7844357 +v0 +o5 +v1 +n1.3 +o44 +o0 +o2 +n-0.6424 +o5 +o0 +v0 +n0.1274 +n2 +o2 +n-1.4865 +o5 +o0 +v1 +n-1.2777 +n2 +o54 +3 +o5 +o54 +3 +o2 +n-2.973 +v1 +o3 +n1.3 +v1 +n3.7986021 +n2 +o16 +o3 +n1.3 +o5 +v1 +n2 +n-2.973 +o2 +o2 +o2 +o2 +n2.4817542 +v0 +o5 +v1 +n3.1 +o44 +o0 +o2 +n-0.8175 +o5 +o0 +v0 +n-0.7527 +n2 +o2 +n-2.0915 +o5 +o0 +v1 +n-1.083 +n2 +o54 +3 +o5 +o54 +3 +o2 +n-4.183 +v1 +o3 +n3.1 +v1 +n4.530189 +n2 +o16 +o3 +n3.1 +o5 +v1 +n2 +n-4.183 +o2 +o2 +o2 +o2 +n-2.3739168 +o5 +v0 +n2 +o5 +v1 +n1.4395 +o44 +o0 +o2 +n-0.7995 +o5 +o0 +v0 +n-0.57 +n2 +o2 +n-2.43 +o5 +o0 +v1 +n-1.2906 +n2 +o54 +3 +o5 +o54 +3 +o2 +n-4.86 +v1 +o3 +n1.4395 +v1 +n6.272316 +n2 +o16 +o3 +n1.4395 +o5 +v1 +n2 +n-4.86 +o2 +o2 +o2 +o2 +n0.01493697 +o5 +v0 +n2 +o5 +v1 +n1.623 +o44 +o0 +o2 +n-0.91 +o5 +o0 +v0 +n-2.2 +n2 +o2 +n-0.488 +o5 +o0 +v1 +n-0.928 +n2 +o54 +3 +o5 +o54 +3 +o2 +n-0.976 +v1 +o3 +n1.623 +v1 +n0.905728 +n2 +o16 +o3 +n1.623 +o5 +v1 +n2 +n-0.976 +o2 +o2 +o2 +o2 +n-3.7749264 +v0 +o5 +v1 +n0.643 +o44 +o0 +o2 +n-0.3574 +o5 +o0 +v0 +n0.243 +n2 +o2 +n-1.1 +o5 +o0 +v1 +n-0.934 +n2 +o54 +3 +o5 +o54 +3 +o2 +n-2.2 +v1 +o3 +n0.643 +v1 +n2.0548 +n2 +o16 +o3 +n0.643 +o5 +v1 +n2 +n-2.2 +o2 +o2 +o2 +o2 +n0.0006254348 +o5 +v0 +n3 +o5 +v1 +n1.13 +o44 +o0 +o2 +n-1.21 +o5 +o0 +v0 +n-2.96 +n2 +o2 +n-0.85 +o5 +o0 +v1 +n-0.919 +n2 +o54 +3 +o5 +o54 +3 +o2 +n-1.7 +v1 +o3 +n1.13 +v1 +n1.5623 +n2 +o16 +o3 +n1.13 +o5 +v1 +n2 +n-1.7 +o2 +o2 +o2 +o2 +n-1.7359e-05 +o5 +v0 +n3 +o5 +v1 +n4.5 +o44 +o0 +o2 +n-4.14 +o5 +o0 +v0 +n-3.02 +n2 +o2 +n-1.14 +o5 +o0 +v1 +n-1.852 +n2 +o54 +3 +o5 +o54 +3 +o2 +n-2.28 +v1 +o3 +n4.5 +v1 +n4.22256 +n2 +o16 +o3 +n4.5 +o5 +v1 +n2 +n-2.28 +o2 +o2 +o2 +o2 +n-0.13462033 +v0 +v1 +o44 +o0 +o2 +n-22.56 +o5 +o0 +v0 +n-0.9574 +n2 +o2 +n-945.64 +o5 +o0 +v1 +n-1.05897 +n2 +o54 +3 +o5 +o54 +3 +o2 +n-1891.28 +v1 +o3 +n1.0 +v1 +n2002.8087816 +n2 +o16 +o3 +n1.0 +o5 +v1 +n2 +n-1891.28 +o2 +o2 +o2 +o2 +n0.07749072839 +v0 +o5 +v1 +n4.0 +o44 +o0 +o2 +n-22.68 +o5 +o0 +v0 +n-0.9576 +n2 +o2 +n-993.85 +o5 +o0 +v1 +n-1.05277 +n2 +o54 +3 +o5 +o54 +3 +o2 +n-1987.7 +v1 +o3 +n4.0 +v1 +n2092.590929 +n2 +o16 +o3 +n4.0 +o5 +v1 +n2 +n-1987.7 +o2 +o2 +o2 +o2 +n-1.6909858 +v0 +o5 +v1 +n4.3315 +o54 +3 +o3 +o2 +o2 +n0.5464166399999999 +o5 +o0 +v1 +n-1.108 +n2 +o0 +o2 +n0.7392 +o5 +o0 +v1 +n-1.108 +n2 +n3.488 +o5 +o0 +o2 +n0.3696 +o5 +o0 +v1 +n-1.108 +n2 +n1.244 +n4 +o16 +o3 +o2 +n0.7392 +o0 +o2 +n9.663 +v1 +n-9.598604000000002 +o2 +v1 +o5 +o0 +o2 +n0.3696 +o5 +o0 +v1 +n-1.108 +n2 +n1.244 +n2 +o3 +n14.43039225 +o5 +v1 +n2 +o44 +o0 +o2 +n-2.8452 +o5 +o0 +v0 +n-0.4478 +n2 +o3 +n1 +o0 +o2 +n0.3696 +o5 +o0 +v1 +n-1.108 +n2 +n1.244 +o2 +o2 +o2 +o2 +n0.93739074 +v0 +o5 +v1 +n4.015 +o54 +3 +o3 +o2 +o2 +n0.35093776000000004 +o5 +o0 +v1 +n-1.313 +n2 +o0 +o2 +n0.5924 +o5 +o0 +v1 +n-1.313 +n2 +n2.3651999999999997 +o5 +o0 +o2 +n0.2962 +o5 +o0 +v1 +n-1.313 +n2 +n0.6826 +n4 +o16 +o3 +o2 +n0.5924 +o0 +o2 +n9.03 +v1 +n-10.543389999999999 +o2 +v1 +o5 +o0 +o2 +n0.2962 +o5 +o0 +v1 +n-1.313 +n2 +n0.6826 +n2 +o3 +n12.105224999999997 +o5 +v1 +n2 +o44 +o0 +o2 +n-2.8342 +o5 +o0 +v0 +n-0.44689 +n2 +o3 +n1 +o0 +o2 +n0.2962 +o5 +o0 +v1 +n-1.313 +n2 +n0.6826 +O10 0 +o0 +o54 +18 +o2 +n0.024528928 +o5 +v0 +n3 +o2 +n0.6645220812 +o5 +v1 +n-0.618 +o2 +o2 +n0.18212023713000003 +o5 +v0 +n2 +o5 +v1 +n-0.32299999999999995 +o2 +o2 +o2 +o2 +n-0.22266821285500002 +o5 +v0 +n2 +o5 +v1 +n1.915 +o0 +o2 +n-2 +o5 +v0 +n2 +n3 +o44 +o16 +o5 +v0 +n2 +o2 +o2 +o2 +o2 +n-2.9506451012999997 +v0 +o5 +v1 +n2.51 +o0 +o2 +n-2 +o5 +v0 +n2 +n2 +o44 +o16 +o5 +v0 +n2 +o2 +o2 +o2 +o2 +n-0.28728985601 +o5 +v0 +n2 +o5 +v1 +n0.06299999999999994 +o0 +o2 +n-1 +v0 +n3 +o44 +o2 +n-1 +v0 +o2 +o2 +o2 +o2 +o2 +n6.212578 +v0 +o5 +v1 +n0.655 +o44 +o0 +o2 +n-0.42776 +o5 +o0 +v0 +n0.0726 +n2 +o2 +n-1.708 +o5 +o0 +v1 +n-1.036 +n2 +o54 +3 +o2 +n-0.85552 +v0 +o3 +n1 +v0 +n-0.06211075199999999 +o54 +3 +o2 +n-3.416 +v1 +o3 +n0.655 +v1 +n3.538976 +o2 +o2 +o2 +o2 +o2 +n-5.7844357 +v0 +o5 +v1 +n1.3 +o44 +o0 +o2 +n-0.6424 +o5 +o0 +v0 +n0.1274 +n2 +o2 +n-1.4865 +o5 +o0 +v1 +n-1.2777 +n2 +o54 +3 +o2 +n-1.2848 +v0 +o3 +n1 +v0 +n-0.16368352 +o54 +3 +o2 +n-2.973 +v1 +o3 +n1.3 +v1 +n3.7986021 +o2 +o2 +o2 +o2 +o2 +n2.4817542 +v0 +o5 +v1 +n3.1 +o44 +o0 +o2 +n-0.8175 +o5 +o0 +v0 +n-0.7527 +n2 +o2 +n-2.0915 +o5 +o0 +v1 +n-1.083 +n2 +o54 +3 +o2 +n-1.635 +v0 +o3 +n1 +v0 +n1.2306645 +o54 +3 +o2 +n-4.183 +v1 +o3 +n3.1 +v1 +n4.530189 +o2 +o2 +o2 +o2 +o2 +n-2.3739168 +o5 +v0 +n2 +o5 +v1 +n1.4395 +o44 +o0 +o2 +n-0.7995 +o5 +o0 +v0 +n-0.57 +n2 +o2 +n-2.43 +o5 +o0 +v1 +n-1.2906 +n2 +o54 +3 +o2 +n-1.599 +v0 +o3 +n2 +v0 +n0.91143 +o54 +3 +o2 +n-4.86 +v1 +o3 +n1.4395 +v1 +n6.272316 +o2 +o2 +o2 +o2 +o2 +n0.01493697 +o5 +v0 +n2 +o5 +v1 +n1.623 +o44 +o0 +o2 +n-0.91 +o5 +o0 +v0 +n-2.2 +n2 +o2 +n-0.488 +o5 +o0 +v1 +n-0.928 +n2 +o54 +3 +o2 +n-1.82 +v0 +o3 +n2 +v0 +n4.0040000000000004 +o54 +3 +o2 +n-0.976 +v1 +o3 +n1.623 +v1 +n0.905728 +o2 +o2 +o2 +o2 +o2 +n-3.7749264 +v0 +o5 +v1 +n0.643 +o44 +o0 +o2 +n-0.3574 +o5 +o0 +v0 +n0.243 +n2 +o2 +n-1.1 +o5 +o0 +v1 +n-0.934 +n2 +o54 +3 +o2 +n-0.7148 +v0 +o3 +n1 +v0 +n-0.1736964 +o54 +3 +o2 +n-2.2 +v1 +o3 +n0.643 +v1 +n2.0548 +o2 +o2 +o2 +o2 +o2 +n0.0006254348 +o5 +v0 +n3 +o5 +v1 +n1.13 +o44 +o0 +o2 +n-1.21 +o5 +o0 +v0 +n-2.96 +n2 +o2 +n-0.85 +o5 +o0 +v1 +n-0.919 +n2 +o54 +3 +o2 +n-2.42 +v0 +o3 +n3 +v0 +n7.1632 +o54 +3 +o2 +n-1.7 +v1 +o3 +n1.13 +v1 +n1.5623 +o2 +o2 +o2 +o2 +o2 +n-1.7359e-05 +o5 +v0 +n3 +o5 +v1 +n4.5 +o44 +o0 +o2 +n-4.14 +o5 +o0 +v0 +n-3.02 +n2 +o2 +n-1.14 +o5 +o0 +v1 +n-1.852 +n2 +o54 +3 +o2 +n-8.28 +v0 +o3 +n3 +v0 +n25.005599999999998 +o54 +3 +o2 +n-2.28 +v1 +o3 +n4.5 +v1 +n4.22256 +o2 +o2 +o2 +o2 +o2 +n-0.13462033 +v0 +v1 +o44 +o0 +o2 +n-22.56 +o5 +o0 +v0 +n-0.9574 +n2 +o2 +n-945.64 +o5 +o0 +v1 +n-1.05897 +n2 +o54 +3 +o2 +n-45.12 +v0 +o3 +n1 +v0 +n43.197888 +o54 +3 +o2 +n-1891.28 +v1 +o3 +n1.0 +v1 +n2002.8087816 +o2 +o2 +o2 +o2 +o2 +n0.07749072839 +v0 +o5 +v1 +n4.0 +o44 +o0 +o2 +n-22.68 +o5 +o0 +v0 +n-0.9576 +n2 +o2 +n-993.85 +o5 +o0 +v1 +n-1.05277 +n2 +o54 +3 +o2 +n-45.36 +v0 +o3 +n1 +v0 +n43.436735999999996 +o54 +3 +o2 +n-1987.7 +v1 +o3 +n4.0 +v1 +n2092.590929 +o2 +o2 +o2 +o3 +o2 +n-1.6909858 +o5 +v1 +n3.3315 +o5 +o0 +o2 +n0.3696 +o5 +o0 +v1 +n-1.108 +n2 +n1.244 +n2 +o0 +o16 +o2 +o2 +n5.6904 +v0 +o0 +v0 +n-0.4478 +n1 +o54 +3 +o2 +n3.9830949312 +o5 +o0 +v1 +n-1.108 +n2 +o16 +o2 +o2 +n0.3696 +o0 +v1 +n-1.108 +o0 +o2 +n2 +v1 +o2 +n1.6009224 +o5 +o0 +v1 +n-1.108 +n3 +n6.703152184 +o44 +o0 +o2 +n-2.8452 +o5 +o0 +v0 +n-0.4478 +n2 +o3 +n1 +o0 +o2 +n0.3696 +o5 +o0 +v1 +n-1.108 +n2 +n1.244 +o2 +o2 +o2 +o3 +o2 +n0.93739074 +o5 +v1 +n3.0149999999999997 +o5 +o0 +o2 +n0.2962 +o5 +o0 +v1 +n-1.313 +n2 +n0.6826 +n2 +o0 +o16 +o2 +o2 +n5.6684 +v0 +o0 +v0 +n-0.44689 +n1 +o54 +3 +o2 +n1.6235545435999998 +o5 +o0 +v1 +n-1.313 +n2 +o16 +o2 +o2 +n0.2962 +o0 +v1 +n-1.313 +o0 +o2 +n2 +v1 +o2 +n1.189243 +o5 +o0 +v1 +n-1.313 +n3 +n1.8707601813999997 +o44 +o0 +o2 +n-2.8342 +o5 +o0 +v0 +n-0.44689 +n2 +o3 +n1 +o0 +o2 +n0.2962 +o5 +o0 +v1 +n-1.313 +n2 +n0.6826 +n-2.2261792 +O11 0 +o0 +o54 +6 +o2 +n0.051236 +o5 +o0 +o16 +o3 +n1 +v1 +n1 +n0.07 +o2 +n3.7925 +o5 +o0 +o16 +o3 +n1 +v1 +n1 +n0.46 +o2 +n-3.5929 +o5 +o0 +o16 +o3 +n1 +v1 +n1 +n0.77 +o2 +n4.6409 +o5 +o0 +o16 +o3 +n1 +v1 +n1 +n1.05 +o2 +n-1.9893 +o5 +o0 +o16 +o3 +n1 +v1 +n1 +n1.25 +o2 +n1.5978 +o5 +o0 +o16 +o3 +n1 +v1 +n1 +n8.0 +n1.0 +O12 0 +o44 +o54 +6 +o2 +n-0.089966 +o5 +o0 +o16 +o3 +n1 +v1 +n1 +n0.112 +o2 +n-3.8722 +o5 +o0 +o16 +o3 +n1 +v1 +n1 +n0.473 +o2 +n-8.1183 +o5 +o0 +o16 +o3 +n1 +v1 +n1 +n1.5 +o2 +n-25.293 +o5 +o0 +o16 +o3 +n1 +v1 +n1 +n3.875 +o2 +n-54.279 +o5 +o0 +o16 +o3 +n1 +v1 +n1 +n8.0 +o2 +n-400.83 +o5 +o0 +o16 +o3 +n1 +v1 +n1 +n20.0 +O13 0 +n0.0 +x2 +0 1.0 +1 1.0 +r +b +3 +3 +k1 +0 +G0 2 +0 0 +1 5.60101151987913 +G1 1 +0 0 +G2 1 +0 0 +G3 1 +1 0 +G4 1 +1 0 +G5 2 +0 0 +1 0 +G6 2 +0 0 +1 -2.2261792 +G7 2 +0 0 +1 -0.60255106 +G8 2 +0 -2.2261792 +1 0 +G9 2 +0 0 +1 0 +G10 2 +0 -0.60255106 +1 0 +G11 1 +1 0 +G12 1 +1 0 diff --git a/idaes/models/properties/general_helmholtz/components/parameters/nh3_expressions_st.nl b/idaes/models/properties/general_helmholtz/components/parameters/nh3_expressions_st.nl new file mode 100644 index 0000000000..1d039a1994 --- /dev/null +++ b/idaes/models/properties/general_helmholtz/components/parameters/nh3_expressions_st.nl @@ -0,0 +1,73 @@ +g3 1 1 0 # problem unknown + 1 0 1 0 0 # vars, constraints, objectives, ranges, eqns + 0 1 0 0 0 0 # nonlinear constrs, objs; ccons: lin, nonlin, nd, nzlb + 0 0 # network constraints: nonlinear, linear + 0 1 0 # nonlinear vars in constraints, objectives, both + 0 0 0 1 # linear network variables; functions; arith, flags + 0 0 0 0 0 # discrete variables: binary, integer, nonlinear (b,c,o) + 0 1 # nonzeros in Jacobian, obj. gradient + 0 0 # max name lengths: constraints, variables + 0 0 0 0 0 # common exprs: b,c,o,c1,o1 +O0 0 +o0 +o2 +n102.8 +o5 +o2 +n0.5 +o54 +3 +o2 +n-0.00246669955599408 +o3 +n405.56 +v0 +o5 +o0 +o5 +o0 +o2 +n-0.00246669955599408 +o3 +n405.56 +v0 +n1.0 +n2 +n1e-08 +n0.5 +n1.0 +n1.211 +o2 +n-94.53 +o5 +o2 +n0.5 +o54 +3 +o2 +n-0.00246669955599408 +o3 +n405.56 +v0 +o5 +o0 +o5 +o0 +o2 +n-0.00246669955599408 +o3 +n405.56 +v0 +n1.0 +n2 +n1e-08 +n0.5 +n1.0 +n5.585 +x0 +r +b +3 +k0 +G0 1 +0 0 diff --git a/idaes/models/properties/general_helmholtz/components/parameters/nh3_parameters.json b/idaes/models/properties/general_helmholtz/components/parameters/nh3_parameters.json new file mode 100644 index 0000000000..cbaaa741dc --- /dev/null +++ b/idaes/models/properties/general_helmholtz/components/parameters/nh3_parameters.json @@ -0,0 +1,54 @@ +{ + "nl_file": "nh3_expressions_eos.nl", + "expr_map": [ + 0, + 1, + 2, + 3, + 4, + 13, + 5, + 6, + 7, + 8, + 9, + 10, + 12, + 11 + ], + "var_map": [ + 0, + 1, + 1000, + 1000 + ], + "param": { + "R": 0.48820939114, + "MW": 17.03052, + "T_star": 405.56, + "rho_star": 233.25, + "Tc": 405.56, + "rhoc": 233.25, + "Pc": 11363.391069274156, + "Tt": 195.49, + "Pt": 6.055813, + "rhot_l": 733.8486491, + "rhot_v": 0.063731569, + "P_min": 6.055813, + "P_max": 1000000.0, + "rho_max": 904.8315276, + "T_min": 195.49, + "T_max": 725.0, + "reference_state_offset": [] + }, + "have_tcx": false, + "nl_file_st": "nh3_expressions_st.nl", + "var_map_st": [ + 1, + 1000, + 1000, + 1000 + ], + "have_st": true, + "have_visc": false +} \ No newline at end of file diff --git a/idaes/models/properties/general_helmholtz/expressions/__init__.py b/idaes/models/properties/general_helmholtz/expressions/__init__.py index b02fe075dd..e4eae6f87e 100644 --- a/idaes/models/properties/general_helmholtz/expressions/__init__.py +++ b/idaes/models/properties/general_helmholtz/expressions/__init__.py @@ -16,10 +16,12 @@ from .phi_ideal_type01 import phi_ideal_expressions_type01 from .phi_ideal_type02 import phi_ideal_expressions_type02 from .phi_ideal_type03 import phi_ideal_expressions_type03 +from .phi_ideal_type04 import phi_ideal_expressions_type04 from .phi_residual_type01 import phi_residual_expressions_type01 from .phi_residual_type02 import phi_residual_expressions_type02 from .phi_residual_type03 import phi_residual_expressions_type03 from .phi_residual_type04 import phi_residual_expressions_type04 +from .phi_residual_type05 import phi_residual_expressions_type05 from .surface_tension_type01 import surface_tension_type01 from .sat_delta_approx import sat_delta_type01, sat_delta_type02, sat_delta_type03 @@ -29,6 +31,7 @@ 2: phi_residual_expressions_type02, 3: phi_residual_expressions_type03, 4: phi_residual_expressions_type04, + 5: phi_residual_expressions_type05, } phi_ideal_types = { @@ -36,6 +39,7 @@ 1: phi_ideal_expressions_type01, 2: phi_ideal_expressions_type02, 3: phi_ideal_expressions_type03, + 4: phi_ideal_expressions_type04, } delta_sat_types = { diff --git a/idaes/models/properties/general_helmholtz/expressions/phi_ideal_type04.py b/idaes/models/properties/general_helmholtz/expressions/phi_ideal_type04.py new file mode 100644 index 0000000000..2d4c9a0e43 --- /dev/null +++ b/idaes/models/properties/general_helmholtz/expressions/phi_ideal_type04.py @@ -0,0 +1,56 @@ +################################################################################# +# The Institute for the Design of Advanced Energy Systems Integrated Platform +# Framework (IDAES IP) was produced under the DOE Institute for the +# Design of Advanced Energy Systems (IDAES). +# +# Copyright (c) 2018-2024 by the software owners: The Regents of the +# University of California, through Lawrence Berkeley National Laboratory, +# National Technology & Engineering Solutions of Sandia, LLC, Carnegie Mellon +# University, West Virginia University Research Corporation, et al. +# All rights reserved. Please see the files COPYRIGHT.md and LICENSE.md +# for full copyright and license information. +################################################################################# +"""Predefined expression for Helmholtz EoS functions +""" +# Extended from phi_ideal_type01.py by John Eslick +__author__ = "Ben Lincoln and Stephen Burroughs" + +import pyomo.environ as pyo + + +def phi_ideal_expressions_type04(model, parameters): + """Type01 expression for the ideal part of dimensionless Helmholtz free energy + + Args: + model (Block): Pyomo model + parameters (dict): Main parameters dictionary + + Returns: + dict: Expressions for ideal part of Helmholtz free energy + """ + last_term = parameters["eos"]["last_term_ideal"] + n0 = parameters["eos"]["n0"] + Tc = parameters["basic"]["Tc"] + g0 = parameters["eos"]["g0"] + rng = range(4, last_term + 1) + return { + "phii": pyo.log(model.delta) + + n0[1] + + n0[2] * model.tau + + (n0[3] - 1) * pyo.log(model.tau) + + sum(n0[i] * pyo.log(1 - pyo.exp(-g0[i] * model.tau / Tc)) for i in rng), + "phii_d": 1.0 / model.delta, + "phii_dd": -1.0 / model.delta**2, + "phii_t": n0[2] + + (n0[3] - 1) / model.tau + + sum( + n0[i] * g0[i] / (Tc * (pyo.exp((model.tau * g0[i]) / Tc) - 1)) for i in rng + ), + "phii_tt": (1 - n0[3]) / model.tau**2 + - sum( + (n0[i] * g0[i] ** 2 * pyo.exp((model.tau * g0[i]) / Tc)) + / (Tc**2 * (pyo.exp((model.tau * g0[i]) / Tc) - 1) ** 2) + for i in rng + ), + "phii_dt": 0, + } diff --git a/idaes/models/properties/general_helmholtz/expressions/phi_residual_type05.py b/idaes/models/properties/general_helmholtz/expressions/phi_residual_type05.py new file mode 100644 index 0000000000..76cff1206f --- /dev/null +++ b/idaes/models/properties/general_helmholtz/expressions/phi_residual_type05.py @@ -0,0 +1,285 @@ +################################################################################# +# The Institute for the Design of Advanced Energy Systems Integrated Platform +# Framework (IDAES IP) was produced under the DOE Institute for the +# Design of Advanced Energy Systems (IDAES). +# +# Copyright (c) 2018-2024 by the software owners: The Regents of the +# University of California, through Lawrence Berkeley National Laboratory, +# National Technology & Engineering Solutions of Sandia, LLC, Carnegie Mellon +# University, West Virginia University Research Corporation, et al. +# All rights reserved. Please see the files COPYRIGHT.md and LICENSE.md +# for full copyright and license information. +################################################################################# +"""Predefined expression for Helmholtz EoS functions +""" +# Extended from phi_residual_type02.py by John Eslick +__author__ = "Ben Lincoln and Stephen Burroughs" + +import pyomo.environ as pyo + + +def phi_residual_expressions_type05(model, parameters): + """Type05 expression for the residual part of dimensionless Helmholtz free energy + + Args: + model (Block): Pyomo model + parameters (dict): Main parameters dictionary + + Returns: + dict: Expressions for residual part of Helmholtz free energy + """ + last_terms = parameters["eos"]["last_term_residual"] + n = parameters["eos"]["n"] + t = parameters["eos"]["t"] + d = parameters["eos"]["d"] + c = parameters["eos"]["c"] + a = parameters["eos"]["a"] + b = parameters["eos"]["b"] + bi = parameters["eos"]["bi"] + e = parameters["eos"]["e"] + g = parameters["eos"]["g"] + first_term = 1 + rng = [] + for last_term in last_terms: + rng.append(range(first_term, last_term + 1)) + first_term = last_term + 1 + return { + "phir": sum(n[i] * model.delta ** d[i] * model.tau ** t[i] for i in rng[0]) + + sum( + n[i] + * model.delta ** d[i] + * model.tau ** t[i] + * pyo.exp(-model.delta ** c[i]) + for i in rng[1] + ) + + sum( + n[i] + * model.delta ** d[i] + * model.tau ** t[i] + * pyo.exp( + -a[i] * (model.delta - e[i]) ** 2 - b[i] * (model.tau - g[i]) ** 2 + ) + for i in rng[2] + ) + + sum( + n[i] + * model.delta ** d[i] + * model.tau ** t[i] + * pyo.exp( + -a[i] * (model.delta - e[i]) ** 2 + + 1 / (b[i] * (model.tau - g[i]) ** 2 + bi[i]) + ) + for i in rng[3] + ), + "phir_d": sum( + n[i] * d[i] * model.delta ** (d[i] - 1) * model.tau ** t[i] for i in rng[0] + ) + + sum( + n[i] + * pyo.exp(-model.delta ** c[i]) + * model.delta ** (d[i] - 1) + * model.tau ** t[i] + * (d[i] - c[i] * model.delta ** c[i]) + for i in rng[1] + ) + + sum( + n[i] + * model.delta ** d[i] + * model.tau ** t[i] + * pyo.exp( + -a[i] * (model.delta - e[i]) ** 2 - b[i] * (model.tau - g[i]) ** 2 + ) + * (d[i] / model.delta - 2 * a[i] * (model.delta - e[i])) + for i in rng[2] + ) + + sum( + n[i] + * model.delta ** d[i] + * model.tau ** t[i] + * pyo.exp( + -a[i] * (model.delta - e[i]) ** 2 + + 1 / (b[i] * (model.tau - g[i]) ** 2 + bi[i]) + ) + * (d[i] / model.delta - 2 * a[i] * (model.delta - e[i])) + for i in rng[3] + ), + "phir_dd": sum( + n[i] * d[i] * (d[i] - 1) * model.delta ** (d[i] - 2) * model.tau ** t[i] + for i in rng[0] + ) + + sum( + n[i] + * pyo.exp(-model.delta ** c[i]) + * model.delta ** (d[i] - 2) + * model.tau ** t[i] + * ( + (d[i] - c[i] * model.delta ** c[i]) + * (d[i] - 1 - c[i] * model.delta ** c[i]) + - c[i] ** 2 * model.delta ** c[i] + ) + for i in rng[1] + ) + + sum( + n[i] + * model.tau ** t[i] + * pyo.exp( + -a[i] * (model.delta - e[i]) ** 2 - b[i] * (model.tau - g[i]) ** 2 + ) + * ( + -2.0 * a[i] * model.delta ** d[i] + + 4 * a[i] ** 2 * model.delta ** d[i] * (model.delta - e[i]) ** 2 + - 4 * d[i] * a[i] * model.delta ** (d[i] - 1) * (model.delta - e[i]) + + d[i] * (d[i] - 1) * model.delta ** (d[i] - 2) + ) + for i in rng[2] + ) + + sum( + n[i] + * model.delta ** (d[i] - 2) + * model.tau ** t[i] + * ( + d[i] ** 2 + + d[i] * (-4 * model.delta * a[i] * (model.delta - e[i]) - 1) + + 2 * model.delta**2 * a[i] * (2 * a[i] * (model.delta - e[i]) ** 2 - 1) + ) + * pyo.exp( + -a[i] * (model.delta - e[i]) ** 2 + + 1 / (b[i] * (model.tau - g[i]) ** 2 + bi[i]) + ) + for i in rng[3] + ), + "phir_t": sum( + n[i] * t[i] * model.delta ** d[i] * model.tau ** (t[i] - 1) for i in rng[0] + ) + + sum( + n[i] + * t[i] + * model.delta ** d[i] + * model.tau ** (t[i] - 1) + * pyo.exp(-model.delta ** c[i]) + for i in rng[1] + ) + + sum( + n[i] + * model.delta ** d[i] + * model.tau ** t[i] + * pyo.exp( + -a[i] * (model.delta - e[i]) ** 2 - b[i] * (model.tau - g[i]) ** 2 + ) + * (t[i] / model.tau - 2 * b[i] * (model.tau - g[i])) + for i in rng[2] + ) + + sum( + ( + n[i] + * model.delta ** d[i] + * model.tau ** (t[i] - 1) + * ( + bi[i] ** 2 * t[i] + + 2 * b[i] * bi[i] * t[i] * (model.tau - g[i]) ** 2 + - b[i] + * (model.tau - g[i]) + * (b[i] * t[i] * (model.tau - g[i]) ** 3 + 2 * model.tau) + ) + * pyo.exp( + -a[i] * (model.delta - e[i]) ** 2 + + 1 / (b[i] * (model.tau - g[i]) ** 2 + bi[i]) + ) + ) + / (b[i] * (model.tau - g[i]) ** 2 + bi[i]) ** 2 + for i in rng[3] + ), + "phir_tt": sum( + n[i] * t[i] * (t[i] - 1) * model.delta ** d[i] * model.tau ** (t[i] - 2) + for i in rng[0] + ) + + sum( + n[i] + * t[i] + * (t[i] - 1) + * model.delta ** d[i] + * model.tau ** (t[i] - 2) + * pyo.exp(-model.delta ** c[i]) + for i in rng[1] + ) + + sum( + n[i] + * model.delta ** d[i] + * model.tau ** t[i] + * pyo.exp( + -a[i] * (model.delta - e[i]) ** 2 - b[i] * (model.tau - g[i]) ** 2 + ) + * ( + (t[i] / model.tau - 2 * b[i] * (model.tau - g[i])) ** 2 + - t[i] / model.tau**2 + - 2 * b[i] + ) + for i in rng[2] + ) + + sum( + n[i] + * model.delta ** d[i] + * model.tau ** t[i] + * ( + ( + 4 + * b[i] ** 2 + * (model.tau - g[i]) ** 2 + * (2 * b[i] * (model.tau - g[i]) ** 2 + 2 * bi[i] + 1) + ) + / (b[i] * (model.tau - g[i]) ** 2 + bi[i]) ** 4 + - (2 * b[i] * (-2 * g[i] * t[i] + 2 * t[i] * model.tau + model.tau)) + / (model.tau * (b[i] * (model.tau - g[i]) ** 2 + bi[i]) ** 2) + + ((t[i] - 1) * t[i]) / model.tau**2 + ) + * pyo.exp( + -a[i] * (model.delta - e[i]) ** 2 + + 1 / (b[i] * (model.tau - g[i]) ** 2 + bi[i]) + ) + for i in rng[3] + ), + "phir_dt": sum( + n[i] * t[i] * d[i] * model.delta ** (d[i] - 1) * model.tau ** (t[i] - 1) + for i in rng[0] + ) + + sum( + n[i] + * t[i] + * model.delta ** (d[i] - 1) + * model.tau ** (t[i] - 1) + * (d[i] - c[i] * model.delta ** c[i]) + * pyo.exp(-model.delta ** c[i]) + for i in rng[1] + ) + + sum( + n[i] + * model.delta ** d[i] + * model.tau ** t[i] + * pyo.exp( + -a[i] * (model.delta - e[i]) ** 2 - b[i] * (model.tau - g[i]) ** 2 + ) + * (d[i] / model.delta - 2.0 * a[i] * (model.delta - e[i])) + * (t[i] / model.tau - 2.0 * b[i] * (model.tau - g[i])) + for i in rng[2] + ) + + sum( + n[i] + * model.delta ** (d[i] - 1) + * model.tau ** (t[i] - 1) + * 1 + / (b[i] * (model.tau - g[i]) ** 2 + bi[i]) ** 2 + * (d[i] - 2 * model.delta * a[i] * (model.delta - e[i])) + * ( + bi[i] ** 2 * t[i] + + 2 * b[i] * bi[i] * t[i] * (model.tau - g[i]) ** 2 + - b[i] + * (model.tau - g[i]) + * (b[i] * t[i] * (model.tau - g[i]) ** 3 + 2 * model.tau) + ) + * pyo.exp( + -a[i] * (model.delta - e[i]) ** 2 + + 1 / (b[i] * (model.tau - g[i]) ** 2 + bi[i]) + ) + for i in rng[3] + ), + } diff --git a/idaes/models/properties/general_helmholtz/tests/test_parameter_util.py b/idaes/models/properties/general_helmholtz/tests/test_parameter_util.py index 33458386ac..8c2bab5296 100644 --- a/idaes/models/properties/general_helmholtz/tests/test_parameter_util.py +++ b/idaes/models/properties/general_helmholtz/tests/test_parameter_util.py @@ -10,9 +10,9 @@ # All rights reserved. Please see the files COPYRIGHT.md and LICENSE.md # for full copyright and license information. ################################################################################# -"""Test the Helmholtz EoS parameter writing utility. Property calculations +"""Test the Helmholtz EoS parameter writing utility. Property calculations tested here do not use IDAES properties or the external functions. This directly -tests the expressions created by the WriteParameters class that will be written +tests the expressions created by the WriteParameters class that will be written to parameter and expression files to verify they are generated correctly. The tests here use three points from the saturation curve near critical, near triple, @@ -28,7 +28,6 @@ If you're adding more tests and run into the same problem, the function infer_rhol_value can be uncommented to print out an inferred value for liquid density. """ - import pytest import math from idaes.models.properties.general_helmholtz.components.parameters.h2o import ( @@ -37,6 +36,9 @@ from idaes.models.properties.general_helmholtz.components.parameters.co2 import ( main as co2_main, ) +from idaes.models.properties.general_helmholtz.components.parameters.nh3 import ( + main as nh3_main, +) from idaes.models.properties.general_helmholtz.components.parameters.propane import ( main as propane_main, ) @@ -66,6 +68,7 @@ def _common_sat(sat_thermo_data, we): # Check the EoS expressions, the tolerance is a little loose # due to lack of sig. figs. in reported data + for pnt in sat_thermo_data.values(): # The pressure is very sensitive to the liquid density (rhol) around the triple point. @@ -93,7 +96,7 @@ def _common_sat(sat_thermo_data, we): pnt["sl"], rel=1e-2, abs=1e-3 ) - # Check the approximate sat density curves + # Check the approxibackendmate sat density curves rhol, rhov = we.approx_sat_curves([sat_thermo_data[2]["T"]]) assert rhol[0] == pytest.approx(sat_thermo_data[2]["rhol"], rel=1e-1) assert rhov[0] == pytest.approx(sat_thermo_data[2]["rhov"], rel=1e-1) @@ -152,6 +155,48 @@ def test_h2o(): _common_sat(sat_thermo_data, we) +@pytest.mark.unit +def test_nh3(): + # Some test data from: + # + # SKehui Gao (高克慧),Jiangtao Wu (吴江涛),Ian H. Bell, Allan H. Harvey, and Eric W. Lemmon (2023) + # A Reference Equation of State with an Associating Term for Thermodynamic Properties of Ammonia + sat_thermo_data = { + 1: { # near critical + "T": 405, + "p": 11252.87, + "rhol": 281.00858, + "hl": 1179.9637, + "sl": 3.8288, + "rhov": 188.1331, + "hv": 1318.9971, + "sv": 4.1722, + }, + 2: { # between critical and triple point + "T": 380, + "p": 7139.7014, + "rhol": 436.2496, + "hl": 912.9600, + "sl": 3.1807, + "rhov": 67.3260, + "hv": 1559.7529, + "sv": 4.8828, + }, + 3: { # near triple point + "T": 195.49, + "p": 6.055813, + "rhol": 733.8544, + "hl": 8.2544e-03, + "sl": 1.1792e-05, + "rhov": 0.06371, + "hv": 1489.120, + "sv": 7.6173, + }, + } + we = nh3_main(dry_run=True) + _common_sat(sat_thermo_data, we) + + @pytest.mark.unit def test_co2(): # Some test data from: diff --git a/idaes/models/properties/general_helmholtz/tests/test_register.py b/idaes/models/properties/general_helmholtz/tests/test_register.py index d27b33f131..f1f34428a0 100644 --- a/idaes/models/properties/general_helmholtz/tests/test_register.py +++ b/idaes/models/properties/general_helmholtz/tests/test_register.py @@ -57,6 +57,7 @@ def test_registered_components(): """Use some standard components to test list""" assert "h2o" in registered_components() assert "co2" in registered_components() + assert "nh3" in registered_components() assert "r134a" in registered_components()