import numpy as np

#G = G0 * t^(-r)
#G0 = M * P_D
#M = M0 * exp(-Q/RT)
#P_D = G_s*b^2 * roh/2 + alfa * (gamma / delta)
#P_D = Brukerinput (driving force)
#r, M0 = empiriske konstanter
#Q = aktiveringsenergi
def G0_func(T = 300, M0 = 1e4, Q = 156000, P_D = 1e5):
    R = 8.314 #gas constant
    T += 273
    M = M0 * np.exp(-Q / (R * T))
    G0 = M * P_D

    return G0

def variable_growth_rate(t = 0, r = 0.1, T = 300, M0 = 1e4, Q = 156000, P_D = 1e5, N = 2e12):
    G0 = G0_func(T = T, M0 = M0, Q = Q, P_D = P_D)

    X_VEX = (4/3) * np.pi * N * (G0**3) * ((t**(1-r)) / (1-r))**3
    X_V = 1 - np.exp(-X_VEX)

    return X_V

def Johnson_Mehl(t=0, r = 0, N=1.6 * 10**14, T = 300, M0 = 1e4, Q = 156000, P_D = 1e5):
    G0 = G0_func(T= T, M0 = M0, Q = Q, P_D = P_D)
    x = 1 - np.exp((-np.pi * N * G0**3 * t**4) / 3)
    return x

def site_saturation(t=0, r= 0, N = 2*10**12, M0 = 1.0*10**4, Q = 156000, P_D = 1.0*10**5, T =300):
    G0 = G0_func(M0=M0, Q=Q, P_D=P_D, T=T)
    X = 1 - np.exp(-(4/3)*np.pi*N*G0**3*t**3)
    D = (1/N)**(1/3) #Grain size
    return X

