import numpy as np
from scipy import special as ss
import constants as c
D_func = lambda T: c.D0 * np.exp(-c.Q/(c.R*T))

def t_list_funk(t_f, dt):
    t_list = np.arange(dt, t_f, dt)
    return t_list

def S_func(x_dist, D, t, k):
    S = 0
    for k_i in range(-k,k):
        z_0 = (x_dist - 2 * c.L * k_i) / (2 * np.sqrt(D * t))
        z_1 = (x_dist - (2 * k_i - c.L) * c.L) / (2 * np.sqrt(D * t))
        z_2 = (x_dist - 2 * k_i * c.L) / (2 * np.sqrt(D * t))
        z_3 = (x_dist - (2 * k_i + 1) * c.L) / (2 * np.sqrt(D * t))

        S += 0.5 * (ss.erf(z_0) - ss.erf(z_1) + ss.erf(z_2) - ss.erf(z_3) )
    return S

def cons(x, t, T):
    D = D_func(T)
    x_dist = c.L/2 - x
    C = c.C0 * S_func(x_dist,D ,t, c.analytical_k)
    return C