import scipy.optimize as opt
import numpy as np
from py_oving.stromklasse import Strom,mix




def reaktor(xlist):
    n1 = Strom(k=['ch4', 'c2h6', 'c3h8', 'c4h10', 'n2'], f= [0.995, 0.03, 0.005, 0.004, 0.006], n=1) #strøm.komponent.egenskap = verdi
    n2 = Strom(k=['h2o'], n=2.5)                                                       #f.eks. n1.ch4.n = 0.995 mol
    n3 = mix(n1,n2)                                                                    #eller n2.h2o.cp = 4.8 J/(kg*K)
    n4 = Strom(k=['h2o','ch4','co', 'co2', 'h2', 'n2'], p=21)                          # hvor f=fraksjon og n=molstrøm
    n4.n2.n = n3.n2.n

    k1 = 710
    k2 = 0.81

    # Definerer ukjennte
    n4.h2o.n = xlist[0]
    n4.ch4.n = xlist[1]
    n4.co.n = xlist[2]
    n4.co2.n = xlist[3]
    n4.h2.n = xlist[4]

    #regner ut total molstrøm ut av reaktor
    n4.n = 0
    for komp in n4.kompList: #kompList er en liste, hvor hvert element er en komponent i strømmen.
        n4.n += komp.n       #komp.n returnerer molstrømmen til den gitte komponentetn

    #ksi1 og ksi2 er ukjennte
    ksi1 = xlist[5]
    ksi2 = xlist[6]

    #definerer likninger
    eq0 = n4.h2o.n -(n3.h2o.n - ksi1 -ksi2 -(2*n3.c2h6.n + 3*n3.c3h8.n + 4*n3.c4h10.n))
    eq1 = n4.ch4.n -(n3.ch4.n -ksi1)
    eq2 = n4.co.n -(ksi1 - ksi2 + (2*n3.c2h6.n + 3*n3.c3h8.n + 4*n3.c4h10.n))
    eq3 = n4.h2.n -(3*ksi1 + ksi2 + 5*n3.c2h6.n + 7*n3.c3h8.n + 9*n3.c4h10.n)
    eq4 = n4.co2.n -(ksi2)

    eq5 = k1 * (n4.ch4.n * n4.h2o.n) - (n4.co.n * (n4.h2.n)**3)/((n4.p/n4.n)**2)
    eq6 = k2 * (n4.co.n * n4.h2o.n) -n4.co2.n * n4.h2.n

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

gList = [0.1, 0.04, 0.1, 0.05, 0.5, 0.8, 0.2]
komp=['h2o','ch4','co', 'co2', 'h2', 'ksi1', 'ksi2']
ans = opt.root(reaktor,gList)

#skriver ut fraksjoner
tot = 0
for k,v in zip(komp,np.array(ans.x[:-2])/sum(ans.x[:-2])):
    print(k, ' : ', v)
    tot += v

print('total molstrøm ut: ', sum(ans.x[:-2]))
print('sum av fraksjoner  : ', tot)