import scipy.optimize as opt
import numpy as np
import matplotlib.pyplot as plt


def veksler(xlist, A=50, U=150):
    #definerer kjennte variable

    cp_h = 1200
    m_h = 10
    Th1 = 70

    cp_c = 1500
    m_c = 12
    Tc1 = 20

    # definerer ukjennte
    Tc2= xlist[0]
    Th2 = xlist[1]
    Q = xlist[2]
    m_h = xlist[3]
    m_c = xlist[4]

    dT_innlop = Th1 - Tc2
    dT_utlop = Th2 - Tc1

    #sørger for at jeg ikke deler på null eller tar log av et negativt tall senere
    while dT_innlop == dT_utlop or (dT_innlop * dT_utlop) <= 0 :
        if dT_innlop <= 0:
            xlist[0] = Tc2 - 1

        elif dT_utlop <= 0:
            xlist[1] = Th2 + 1

        Tc2 = xlist[0]
        Th2 = xlist[1]
        Q = xlist[2]

        dT_innlop = Th1 - Tc2
        dT_utlop = Th2 - Tc1

    #likningssystem for varmeveksler
    eq0 = Q*np.log(dT_innlop/dT_utlop) - (U*A * (dT_innlop - dT_utlop))
    eq1 = Q - m_c*cp_c*(Tc2 -Tc1)
    eq2 = Q - (m_h * cp_h * (Th1 - Th2))
    eq3 = m_c - m_c
    eq4 = m_h - m_h

    balance = [eq0, eq1, eq2, eq3, eq4]
    return balance

def T_ut_lister(m=10, start=0, slutt=10, U=50, A = 150):       #Tar inn laveste og høyeste masse på kaldstrøm
                                                    # samt masse på varmstrøm (konstant)

    Tc_ut = [0 for x in range(start,slutt)]
    Th_ut = [0 for x in range(start,slutt)]
    uaDt = [0 for x in range(start,slutt)]

    for mc in range(start,slutt):
        gList = [25,60, 500000, m, mc] # kan ikke gi 70 - gList[0] == gList[1] - 20, må gi Q>=300000
        ans = opt.root(veksler,gList).x     #er listen [Tc_ut, Th_ut, Q, m_h, m_c]

        Tc_ut[mc-start] = ans[0]
        Th_ut[mc-start] = ans[1]

        dT_innlop = 70 - ans[0]
        dT_utlop = ans[1] - 20
        uaDt[mc-start] = (U * A * (dT_innlop - dT_utlop)/np.log(dT_innlop / dT_utlop))/10000

    return Tc_ut, Th_ut, uaDt #returnerer en liste over utløpstemperaturer som funksjon av størrelse på kald innstrøm


def varmeplot(start, slutt):
    plt.figure()

    Tc_ut, Th_ut, uaDt = T_ut_lister(m=10, start=start, slutt=slutt)

    xlist = [x for x in range(start,slutt)]

    plt.plot(xlist, Tc_ut, 'b', label='T ut, kald')
    plt.plot(xlist, Th_ut, 'r', label = 'T ut, varm')
    plt.plot(xlist, uaDt, 'g', label = 'QE-4')

    plt.legend(loc = 'best')
    plt.show()


varmeplot(10,31)
#dT_innlop øker med økende størrelse på kaldstrømmen
#dT_utløp minker med økende størrelse på kaldstrømmen

#utløpstemperaturen endrer seg mye mer for kaldstrømmen enn for varmstrømmen.
#dette er som forventet fordi endring i temperatur er både en funksjon av temperaturforskjell
#og en funksjon av spesifikk varmekapasitet for de to strømmene.

#Q = UAdT_im øker tilsynelatende logaritmisk med økende størrelse på kaldstrømmen dette er rimelig
# mtp. uttrykket for dT_im