DualReal
SinglePhaseFluidProperties::v_from_p_T(const DualReal & p, const DualReal & T) const
{
  Real rawv = 0;
  Real rawp = p.value();
  Real rawT = T.value();
  Real dvdp = 0;
  Real dvdT = 0;
  v_from_p_T(rawp, rawT, rawv, dvdp, dvdT);

  DualReal result = rawv;
  for (size_t i = 0; i < p.derivatives().size(); i++)
    result.derivatives()[i] = p.derivatives()[i] * dvdp + T.derivatives()[i] * dvdT;
  return result;
}
DualReal
SinglePhaseFluidProperties::T_from_p_h(const DualReal & p, const DualReal & h) const
{
  Real T = 0.0;
  Real pressure = p.value();
  Real enthalpy = h.value();
  Real dT_dp = 0.0;
  Real dT_dh = 0.0;
  T_from_p_h(pressure, enthalpy, T, dT_dp, dT_dh);

  DualReal result = T;
  for (size_t i = 0; i < p.derivatives().size(); ++i)
    result.derivatives()[i] = p.derivatives()[i] * dT_dp + h.derivatives()[i] * dT_dh;

  return result;
}
DualReal
SinglePhaseFluidProperties::e_from_p_T(const DualReal & p, const DualReal & T) const
{
  Real e = 0.0;
  Real pressure = p.value();
  Real temperature = T.value();
  Real de_dp = 0.0;
  Real de_dT = 0.0;
  e_from_p_T(pressure, temperature, e, de_dp, de_dT);

  DualReal result = e;
  for (size_t i = 0; i < p.derivatives().size(); ++i)
    result.derivatives()[i] = p.derivatives()[i] * de_dp + T.derivatives()[i] * de_dT;

  return result;
}
DualReal
SinglePhaseFluidProperties::vaporTemperature(const DualReal & p) const
{
  Real T = 0.0;
  Real pressure = p.value();
  Real dTdp = 0.0;

  vaporTemperature(pressure, T, dTdp);

  DualReal result = T;
  for (std::size_t i = 0; i < p.derivatives().size(); ++i)
    result.derivatives()[i] = p.derivatives()[i] * dTdp;

  return result;
}
DualReal
SinglePhaseFluidProperties::vaporPressure(const DualReal & T) const
{
  Real p = 0.0;
  Real temperature = T.value();
  Real dpdT = 0.0;

  vaporPressure(temperature, p, dpdT);

  DualReal result = p;
  for (std::size_t i = 0; i < T.derivatives().size(); ++i)
    result.derivatives()[i] = T.derivatives()[i] * dpdT;

  return result;
}