# mengen.py - de eindtemperatuur van een mengsel, ook met ijs dat (gedeeltelijk) smelt
C_WATER = 4186.0     # J/(kg K)
C_IJS = 2100.0       # J/(kg K)
L_SMELT = 334e3      # J/kg


def mengen(delen):
    """delen: lijst van (massa in kg, c in J/(kg K), temperatuur in °C), zonder faseovergang."""
    teller = sum(m * c * T for m, c, T in delen)
    noemer = sum(m * c for m, c, T in delen)
    return teller / noemer                              # een gewogen gemiddelde


def met_ijs(m_water, T_water, m_ijs, T_ijs):
    """Water boven 0 °C met ijs van T_ijs (<= 0 °C). Geeft (eindtemperatuur, overgebleven ijs in kg)."""
    q_beschikbaar = m_water * C_WATER * T_water        # het water afkoelen tot 0 °C
    q_opwarmen = m_ijs * C_IJS * (0 - T_ijs)           # het ijs opwarmen tot 0 °C
    q_smelten = m_ijs * L_SMELT                        # het ijs smelten
    if q_beschikbaar < q_opwarmen:
        return None, m_ijs                             # er bevriest water: valt buiten dit programma
    if q_beschikbaar < q_opwarmen + q_smelten:         # niet alles smelt: het mengsel blijft op 0 °C
        gesmolten = (q_beschikbaar - q_opwarmen) / L_SMELT
        return 0.0, m_ijs - gesmolten
    rest = q_beschikbaar - q_opwarmen - q_smelten     # alles gesmolten: de rest warmt al het water op
    return rest / ((m_water + m_ijs) * C_WATER), 0.0


print("reservoir bijvullen:", round(mengen([(24, C_WATER, 21), (9.1, C_WATER, 50), (26.9, C_WATER, 9)]), 1), "°C")
print("aluminium in de calorimeter:", round(mengen([(0.250, 897, 99.5), (0.200, C_WATER, 18.1), (1, 30, 18.1)]), 1), "°C")
for m_ijs in (0.050, 0.200):
    T, rest = met_ijs(0.30, 22.0, m_ijs, -18.0)
    print(f"limonade + {m_ijs * 1000:.0f} g ijs: {T:.1f} °C, {rest * 1000:.0f} g ijs over")
