///|
pub fn water_liquid() -> Substance {
  Substance::constant_cp(
    id="water-liquid",
    name="Water liquid",
    phase=Liquid,
    cp=75.3,
    reference_temperature=298.15,
  ).with_latent_heat(
    transition_temperature=373.15,
    heat=40650.0,
    direction=Vaporize,
  )
}

///|
pub fn water_vapor() -> Substance {
  Substance::constant_cp(
    id="water-vapor",
    name="Water vapor",
    phase=Vapor,
    cp=33.6,
    reference_temperature=373.15,
  ).with_latent_heat(
    transition_temperature=373.15,
    heat=40650.0,
    direction=Condense,
  )
}

///|
pub fn nitrogen_gas() -> Substance {
  Substance::linear_cp(
    id="nitrogen-gas",
    name="Nitrogen gas",
    phase=Vapor,
    a=27.2,
    b=0.0042,
    reference_temperature=298.15,
  )
}

///|
pub fn methane_gas() -> Substance {
  Substance::linear_cp(
    id="methane-gas",
    name="Methane gas",
    phase=Vapor,
    a=19.9,
    b=0.0502,
    reference_temperature=298.15,
  )
}

///|
pub fn ice_solid() -> Substance {
  Substance::constant_cp(
    id="ice-solid",
    name="Ice",
    phase=Solid,
    cp=37.6,
    reference_temperature=273.15,
  )
  .with_latent_heat(transition_temperature=273.15, heat=6010.0, direction=Melt)
  .with_latent_heat(
    transition_temperature=273.15,
    heat=6010.0,
    direction=Freeze,
  )
}

///|
pub fn generic_substance(
  id~ : String,
  name~ : String,
  cp~ : Double,
) -> Substance {
  Substance::constant_cp(
    id~,
    name~,
    phase=UnknownPhase,
    cp~,
    reference_temperature=298.15,
  )
}