16 namespace EquationsOfState
40 "reference rho0", rho0_,
"The reference density at T=0 and P=0");
43 this->add_parameter(
"reference T0", T0_,
"The reference temperature");
46 this->add_parameter(
"Gamma", Gc_,
"The Gruneisen parameter");
49 this->add_parameter(
"A", capA_,
"The A constant");
53 this->add_parameter(
"B", capB_,
"The B constant");
57 this->add_parameter(
"cvInf", cvInf_,
"The Dulong-Petit limit of cv");
63 const auto update_values = [
this]() {
68 this->parse_parameters_call_back.connect(update_values);
80 double pressure(
double rho,
double e)
const final
82 const auto v = 1. / rho;
83 const auto ratio = v / v0_;
84 const auto p_cold = pressure_cold(v);
87 (std::pow(ratio, -capB_) + ratio * capB_ - (capB_ + 1.));
89 return p_cold + Gc_ * rho * (e - e_cold);
102 const auto v = 1. / rho;
103 const auto ratio = v / v0_;
104 const auto p_cold = pressure_cold(v);
107 (std::pow(ratio, -capB_) + ratio * capB_ - (capB_ + 1.));
109 return (p - p_cold) / (Gc_ * rho) + e_cold;
123 const auto v = 1. / rho;
124 const auto ratio = v / v0_;
127 (std::pow(ratio, -capB_) + ratio * capB_ - (capB_ + 1.));
128 const auto delta_e = e - e_cold;
129 const auto radicand =
130 delta_e * (delta_e + 4. * cvInf_ * T0_ * std::pow(ratio, -Gc_));
131 const auto numerator = delta_e + std::sqrt(radicand);
132 const auto denominator = 2. * cvInf_;
134 return numerator / denominator;
145 const auto v = 1. / rho;
146 const auto ratio = v / v0_;
147 auto e_cold = std::pow(ratio, -capB_) + ratio * capB_ - (capB_ + 1.);
148 e_cold *= capA_ * v0_;
162 const auto v = 1. / rho;
163 const auto ratio = v / v0_;
166 (std::pow(ratio, -capB_) + ratio * capB_ - (capB_ + 1.));
167 const auto delta_e = e - e_cold;
168 const auto radicand =
169 delta_e * (delta_e + 4. * cvInf_ * T0_ * std::pow(ratio, -Gc_));
170 const auto numerator = delta_e + std::sqrt(radicand);
171 const auto denominator = 2. * cvInf_;
172 const auto T = numerator / denominator;
173 const auto tau = T * std::pow(ratio, Gc_) / T0_;
175 return cvInf_ * (tau / (1. + tau) + std::log(1. + tau));
188 const auto v = 1. / rho;
189 const auto ratio = v / v0_;
193 (std::pow(ratio, -capB_) + ratio * capB_ - (capB_ + 1.));
197 capA_ * capB_ * v0_ * (capB_ + 1.) * std::pow(ratio, -capB_);
199 return std::sqrt(c_cold + Gc_ * (Gc_ + 1.) * (e - e_cold));
211 double pressure_cold(
const double v)
const
213 const auto ratio = v / v0_;
215 auto cold_curve = std::pow(ratio, -capB_ - 1.) - 1.;
216 cold_curve *= capA_ * capB_;
virtual double pressure(double rho, double e) const =0
virtual double temperature(double, double) const
double interpolation_pinfty_
virtual double speed_of_sound(double, double) const
virtual double specific_internal_energy(double rho, double p) const =0
double specific_internal_energy(double rho, double p) const final
double specific_entropy(double rho, double e) const final
SimpleMacaw(const std::string &subsection)
double speed_of_sound(double rho, double e) const final
double cold_curve_bound(double rho) const final
double temperature(double rho, double e) const final
double pressure(double rho, double e) const final