import scipy.optimize as opt

def reaktor(xlist):
    #### definerer kjente ####

    n1_n2 = 24
    n1_h2 = 72
    n1_ch4 = 4
    n1_nh3 = 0

    x2_ch4 = 0.1579

    n4_n2 = 0
    n4_h2 = 0
    n4_ch4 = 0

    n5_nh3 = 0

    ### definerer ukjennte ####
    n2_n2 = xlist[0]
    n2_h2 = xlist[1]
    n2_ch4 = xlist[2]
    n2_nh3 = xlist[3]

    n3_n2 = xlist[4]
    n3_h2 = xlist[5]
    n3_ch4 = xlist[6]
    n3_nh3 = xlist[7]

    n4_nh3 = xlist[8]

    n5_n2 = xlist[9]
    n5_h2 = xlist[10]
    n5_ch4 = xlist[11]

    f = xlist[12]

    ksi = 0.25 * n2_n2

    ### splitter ###
    n6_n2 = f * n5_n2
    n6_h2 = f * n5_h2
    n6_ch4 = f * n5_ch4
    n6_nh3 = f * n5_nh3

    n7_n2 = (1-f) * n5_n2
    n7_h2 = (1-f) * n5_h2
    n7_ch4 = (1-f) * n5_ch4
    n7_nh3 = (1-f) * n5_nh3



    ### likninger over mixer ###
    eq0 = n2_n2 - (n1_n2 + n7_n2)
    eq1 = n2_h2 - (n1_h2 + n7_h2)
    eq2 = n2_ch4 - (n1_ch4 + n7_ch4)
    eq3 = n2_nh3 - (n1_nh3 + n7_nh3)

    eq12 = n2_ch4 - (x2_ch4 * (n2_n2 + n2_h2 + n2_ch4 + n2_nh3))

    ### likninger over reaktor ###
    eq4 = n3_n2 - (n2_n2 - ksi)
    eq5 = n3_h2 - (n2_h2 - 3*ksi)
    eq6 = n3_ch4 - (n2_ch4)
    eq7 = n3_nh3 - (n2_nh3 + 2 * ksi)

    ### likninger over separator ###
    eq8 = n3_n2 - (n4_n2 + n5_n2)
    eq9 = n3_h2 - (n4_h2 + n5_h2)
    eq10 = n3_ch4 - (n4_ch4 + n5_ch4)
    eq11 = n3_nh3 - (n4_nh3 + n5_nh3)

    balance = [eq0, eq1, eq2, eq3, eq4, eq5, eq6, eq7, eq8, eq9, eq10, eq11, eq12]

    return balance

gList = [40, 100, 30, 0,        #n2
         30, 70, 30, 20,        #n3
         20,                    #n4
         30, 70, 30,            #n5
         0.1]                   # f

ans = list(opt.root(reaktor,gList).x)

gKomp2 = ['n2', 'h2', 'ch4', 'nh3']
gKomp3 = ['n2', 'h2', 'ch4', 'nh3']
gKomp4 = ['nh3']
gKomp5 = ['h2', 'n2', 'ch4']

print('-'*10, '  n2  ', '-'*10)
for komp in gKomp2:
    print(komp, ' : ', ans.pop(0))

print('-'*10, '  n3  ', '-'*10)
for komp in gKomp3:
    print(komp, ' : ', ans.pop(0))

print('-'*10, '  n4  ', '-'*10)
for komp in gKomp4:
    print(komp, ' : ', ans.pop(0))

print('-'*10, '  n5  ', '-'*10)
for komp in gKomp5:
    print(komp, ' : ', ans.pop(0))

print('f: ', ans.pop(0))