def linear_advection_parameter_comparation_with_error(errorType=2):
    
    number_of_params = 8
    
    alphas = np.linspace(-2.0, 2.0, number_of_params)
    
    betas = np.linspace(0.0, 2.0, number_of_params)
    
    gammas = np.linspace(4.0, 12.0, number_of_params)
    
    lams = np.linspace(16.0, 95.0, number_of_params)
    
#    params_list = [alphas]
    params_list = [alphas, betas, gammas, lams]
    
    
#    schemes = [[SCHEMES.TOPUS, 'alpha']]
    schemes = [[SCHEMES.TOPUS, 'alpha'],
               [SCHEMES.FSFL, 'beta'],
               [SCHEMES.SDPUS_C1, 'gamma'],
               [SCHEMES.EPUS, 'lambda']]
    
    #advection velocity
    a = 1
    
    cases = [2]
    
    ymins = [-0.1, -1.1]
    
    ymaxs = [1.1, 1.1]
    
    cfl = 0.9
    
    nx = 400
    
    v = 0.25
    
    domx = [-1, 1]
    
    domts = [[0.0, 0.25], [0, 0.125]]
    
    for case_index in range(len(cases)):
    
        case = cases[case_index]
        
        ymin = ymins[case_index]
        
        ymax = ymaxs[case_index]
        
        domt = domts[case_index]
                
        PATH = 'ERROR_param_compar_lin_ad_CASE=' + str(case) + '/'
        
        for scheme_index in range(len(schemes)):
            
            tools.clear()
            
            scheme = schemes[scheme_index]
            
            SCHEME = scheme[0]
            
            params = params_list[scheme_index]
            
            custom_path = str(SCHEME.__name__) + '_' + PATH
            
            analitic_sol = lambda x, t: analitic_linear_advection(x, u_0, t, a, case = case)
            
            ERRORS = []
            
            for param in params:
                                
                marker = None#param_[-1]
                
                SCHEME_LABEL = scheme[-1] + '=' + str(param)
                
                initial_cond_func = lambda x: initial_cond_func_Linear_Advection(x, case = case)
            
                error = solver.advection_difusion_equation_solver(nx, domx, domt, cfl, v,\
                                               initial_cond_func,\
                                               initial_cond_func(domx[0]),\
                                               initial_cond_func(domx[-1]),\
                                               SCHEME, param,\
                                               analitic_sol,\
                                               SCHEME_LABEL, marker = marker,\
                                               PATH = custom_path,\
                                               equation_type = solver.Equation_types.Linear_advection,\
                                               a = 1,\
                                               save_step_by_step = False, clean_plot = False,\
                                               ymin = ymin, ymax = ymax,
                                               generateError = True,
                                               errorType=errorType)
                
                ERRORS.append(error)
                
            tools.save_fig(params, ERRORS, PATH + scheme[0].__name__ + ".png", 
                           scheme[0].__name__ + " cfl = " + str(cfl),
                           None, xlabel = "parâmetro " + scheme[-1],
                           ylabel = 'Erro')
def linear_advection_schemes_comparation():
    
    alpha = 2.0
    
    beta = 2.0
    
    gamma = 12.0
    
    lam = 95.0
    
    params = [alpha, beta, gamma, lam]
    
    schemes = [[SCHEMES.TOPUS, 'TOPUS alpha'],
               [SCHEMES.FSFL, 'FSFL beta'],
               [SCHEMES.SDPUS_C1, 'SDPUS-C1 gamma'],
               [SCHEMES.EPUS, 'EPUS lambda']]
    
    #advection velocity
    a = 1
    
    cases = [2, 3]
    
    ymins = [-0.1, -1.1]
    
    ymaxs = [1.1, 1.1]
    
    cfl = 0.05
    
    nx = 400
    
    v = 0.25
    
    domx = [-1, 1]
    
    domts = [[0.0, 0.25], [0, 0.125]]
    
    dx = (domx[-1] - domx[0]) / (nx-1)

    x_axes = [domx[0] + i*dx for i in range(nx)]

    save_analitic = True

    for case_index in range(len(cases)):
    
        tools.clear()
        
        case = cases[case_index]
        
        ymin = ymins[case_index]
        
        ymax = ymaxs[case_index]
        
        domt = domts[case_index]
        
        t = domt[-1]
        
        PATH = 'schemes_compar_lin_ad_CASE=' + str(case) + '/'
        
        for scheme_index in range(len(schemes)):
                        
            scheme = schemes[scheme_index]
            
            SCHEME = scheme[0]
            
            param = params[scheme_index]
            
            custom_path = PATH
            
            if scheme_index == 0 and save_analitic:
        
                time_precision = 4
            
                time_string = "{:." + str(time_precision) + "f}"
                
                fileName = custom_path + 'result'\
                + '_time=' + time_string.format(t)\
                + '_v=' + str(v)\
                + '_cfl=' + str(cfl) + '.png'
                
                analitic = [analitic_linear_advection(domx[0] + i*dx, u_0, t, a, case = case)\
                            for i in range(nx)]
                
                tools.save_fig(x_axes, analitic, fileName, 'analitica', 'analitica',\
                        marker = None,\
                        xlabel = 'x', ylabel = 'y',\
                        clean_plot = False, margin = 0.1, ymin = ymin, ymax = ymax)
                
            marker = None#param_[-1]
            
            SCHEME_LABEL = scheme[-1] + '=' + str(param)
            
            initial_cond_func = lambda x: initial_cond_func_Linear_Advection(x, case = case)
        
            solver.advection_difusion_equation_solver(nx, domx, domt, cfl, v,\
                                           initial_cond_func,\
                                           initial_cond_func(domx[0]),\
                                           initial_cond_func(domx[-1]),\
                                           SCHEME, param,\
                                           None,\
                                           SCHEME_LABEL, marker = marker,\
                                           PATH = custom_path,\
                                           equation_type = solver.Equation_types.Linear_advection,\
                                           a = 1,\
                                           save_step_by_step = False, clean_plot = False,\
                                           ymin = ymin, ymax = ymax)
def linear_advection_parameter_comparation(folderPathSubName = "", cases = [2, 3]):
    
    number_of_params = 3
    
    alphas = np.linspace(-2.0, 2.0, number_of_params)
    alphas = [float('%.2f' % el) for el in alphas]
    
    betas = np.linspace(0.0, 2.0, number_of_params)
    betas = [float('%.2f' % el) for el in betas]
    
    gammas = np.linspace(4.0, 12.0, number_of_params)
    gammas = [float('%.2f' % el) for el in gammas]
    
    lams = np.linspace(16.0, 95.0, number_of_params)
    lams = [float('%.2f' % el) for el in lams]
    
    params_list = [alphas]
#    params_list = [alphas, betas, gammas, lams]
    
    
    schemes = [[SCHEMES.TOPUS, 'alpha']]
#    schemes = [[SCHEMES.TOPUS, 'alpha'],
#               [SCHEMES.FSFL, 'beta'],
#               [SCHEMES.SDPUS_C1, 'gamma'],
#               [SCHEMES.EPUS, 'lambda']]
    
    #advection velocity
    a = 1
    
    ymins = [-1, -1.1]
    
    ymaxs = [2, 1.1]
    
    cfl = 0.9
    
    nx = 400
    
    v = 0.25
    
    domx = [-1, 1]
    
    domts = [[0.0, 0.25], [0, 0.125]]
    
    dx = (domx[-1] - domx[0]) / (nx-1)

    x_axes = [domx[0] + i*dx for i in range(nx)]

    save_analitic = True
    
    setters = ['.', '+', '3']

    for case_index in range(len(cases)):
    
        case = cases[case_index]
        
        ymin = ymins[case_index]
        
        ymax = ymaxs[case_index]
        
        domt = domts[case_index]
        
        t = domt[-1]
        
        PATH = 'param_compar_lin_ad_CASE=' + str(case) + '/'
        
        
        for scheme_index in range(len(schemes)):
            
            tools.clear()
            
            scheme = schemes[scheme_index]
            
            SCHEME = scheme[0]
            
            params = params_list[scheme_index]
            
            setter_index = -1
            for param in params:
                setter_index = setter_index + 1
                
                setter = setters[setter_index]
#                param = param_[0]
                
                marker = None#param_[-1]
                
                SCHEME_LABEL = scheme[-1] + '=' + str(param)
                
                initial_cond_func = lambda x: initial_cond_func_Linear_Advection(x, case = case)
            
#                omitPlot = not (param == params[0] or param == params[-1])
            
                custom_path = folderPathSubName + "_" + str(SCHEME.__name__) + '=' + str(param) + '_' + PATH
            
                if save_analitic:
            
                    time_precision = 4
                
                    time_string = "{:." + str(time_precision) + "f}"
                    
                    fileName = custom_path + 'result'\
                    + '_time=' + time_string.format(t)\
                    + '_v=' + str(v)\
                    + '_cfl=' + str(cfl) + '.png'
                    
                    analitic = [analitic_linear_advection(domx[0] + i*dx, u_0, t, a, case = case)\
                                for i in range(nx)]
                    
                    tools.save_fig(x_axes, analitic, fileName, 'analitica', 'analitica',\
                            marker = None,\
                            xlabel = 'x', ylabel = 'y',\
                            clean_plot = False, margin = 0.1, ymin = ymin, ymax = ymax)
            
                solver.advection_difusion_equation_solver(nx, domx, domt, cfl, v,\
                                               initial_cond_func,\
                                               initial_cond_func(domx[0]),\
                                               initial_cond_func(domx[-1]),\
                                               SCHEME, param,\
                                               None,\
                                               SCHEME_LABEL, marker = marker,\
                                               PATH = custom_path,\
                                               equation_type = solver.Equation_types.Linear_advection,\
                                               a = 1,\
                                               save_step_by_step = False, clean_plot = True,\
                                               ymin = ymin, ymax = ymax,
                                               traced = True)
def schemes_comparation_boundary_layer_equation_test():
    
    tools.clear()
    
    ymin = -0.1
    ymax = 1.1
    
    alpha = 2.0
    
    beta = 2.0
    
    gamma = 12.0
    
    lam = 95.0
    
    params = [alpha, beta, gamma, lam]
    
    schemes = [[SCHEMES.TOPUS, 'TOPUS alpha'],
               [SCHEMES.FSFL, 'FSFL beta'],
               [SCHEMES.SDPUS_C1, 'SDPUS-C1 gamma'],
               [SCHEMES.EPUS, 'EPUS lambda']]
        
    domx = [0, 1]
    
    domt = [0, 0.5]
 
    PATH = 'camada_limite_schemes_comp_'
    
    vs_nxs = [[1, 10], [0.1, 80], [0.01, 640]]
#    vs_nxs = [[1, 10]]
    
    save_analitic = True
    
    for v_nx in vs_nxs:
        
        v = v_nx[0]
    
        if save_analitic:
            
            time_precision = 4
                
            time_string = "{:." + str(time_precision) + "f}"
            
            fileName = PATH + '/' + 'result'\
                        + '_time=' + time_string.format(domt[-1])\
                        + '.png'
            
            x_axes = np.linspace(domx[0], domx[-1], 640)
            
            analitic = [analitic_boundary_layer_equation(x_axes[i], v)\
                        for i in range(640)]
            
            tools.save_fig(x_axes, analitic, fileName, 'analitica', 'analitica_v=' + str(v),\
                    marker = None,\
                    xlabel = 'x', ylabel = 'y',\
                    clean_plot = False, margin = 0.1, ymin = ymin, ymax = ymax)
    
    t = domt[-1]
    
    for scheme_index in range(len(schemes)):
        
        scheme = schemes[scheme_index]
                
        custom_path = PATH + '/'
        
        fileName = custom_path + 'result'\
                    + '_time=' + time_string.format(t)\
                    + '.png'
                    
        title = 'tempo = ' + str(t)
        
        for v_nx in vs_nxs:
            
            initial_cond_func = lambda x: initial_cond_func_Boundary_Layer(x)
            
            v = v_nx[0]
                           
            param = params[scheme_index]
            
            marker = '.'#_param[1]
            
            SCHEME = scheme[0]
            
            SCHEME_LABEL = 'v=' + str(v) + ' ' + scheme[-1] + '=' + str(param)
            
            nx = v_nx[-1]
            
            dx = (domx[-1] - domx[0]) / (nx-1)

            dt = 0.01 / float(nx)
            
            cfl = dt / dx
            
            solver.advection_difusion_equation_solver(nx, domx, domt, cfl, v,\
                                           initial_cond_func,\
                                           initial_cond_func(domx[0]),\
                                           1.0,\
                                           SCHEME, param,\
                                           None,\
                                           SCHEME_LABEL, marker = marker,\
                                           PATH = custom_path,\
                                           equation_type = solver.Equation_types.Boundary_layer,\
                                           a = 1,\
                                           save_step_by_step = False, clean_plot = False,\
                                           ymin = ymin, ymax = ymax,
                                           customFileName = fileName,
                                           customTitle = title,
                                           outsideLegend=True)
def TRAB1_CFD_MESTRADO():
    
    #max and minimum values for plot
    ymin = -2.0
    ymax = 2.0
    
    #domain in x direction
    domx = [0, 1]
    
    #number of points in x direction
    nx = 200
    
    #spacing discretization size
    dx = (domx[-1] - domx[0]) / (nx-1)
    
    #FSFL param
    beta = 0;
    
    #TOPUS param
    alpha = 2;
    
    #domains in time
    domts = [[0, 0.1], [0, 0.3], [0, 0.5]]
    
    #Courant numbers
    cfls = [0.1, 0.5, 0.9]
    
    #viscosity numbers
    vs = [0.001, 0.0005, 0.00025]
        
    x_axes = [domx[0] + i*dx for i in range(nx)]
    
    initial_condition = list(initial_cond_func_Burges(np.array(x_axes)))
    
    name = 'results_TRAB1_CFD_MESTRADO/initial.png'
    
    tools.save_fig(x_axes, initial_condition, name, 'Condicao inicial', 'Condicao inicial',\
                marker = None,\
                xlabel = 'x', ylabel = 'y',\
                clean_plot = True, margin = 0.1, ymin = ymin, ymax = ymax)
    
    #-----------------------EXERCISE 2-----------------------
    
    #path to save results
    PATH = 'results_TRAB1_CFD_MESTRADO/EXE2_'
    
    #viscosity
    v = 0.001
    
    for cfl in cfls:
        
        for domt in domts:
            
            #seting upwind scheme, label and parameter
            SCHEME = SCHEMES.FSFL
            SCHEME_LABEL = 'FSFL'
            param = beta
            solver.advection_difusion_equation_solver(nx, domx, domt, cfl, v,\
                                       initial_cond_func_Burges,\
                                       initial_condition[0], initial_condition[-1], SCHEME, param,\
                                       None,\
                                       SCHEME_LABEL, marker = '.',\
                                       PATH = PATH,\
                                       equation_type = solver.Equation_types.Burges,\
                                       a = 1,\
                                       save_step_by_step = False, clean_plot = False,
                                       ymin = ymin, ymax = ymax)
            
            #seting upwind scheme, label and parameter
            SCHEME = SCHEMES.ADBQUICKEST
            SCHEME_LABEL = 'ADBQUICKEST'
            param = cfl
            solver.advection_difusion_equation_solver(nx, domx, domt, cfl, v,\
                                       initial_cond_func_Burges,\
                                       initial_condition[0], initial_condition[-1], SCHEME, param,\
                                       None,\
                                       SCHEME_LABEL, marker = None,\
                                       PATH = PATH,\
                                       equation_type = solver.Equation_types.Burges,\
                                       a = 1,\
                                       save_step_by_step = False, clean_plot = True,
                                       ymin = ymin, ymax = ymax)
    
    #--------------------------------------------------------
    
    
    #-----------------------EXERCISE 3-----------------------
    
    #path to save results
    PATH = 'results_TRAB1_CFD_MESTRADO/EXE3_'
    
    #Courant number
    cfl = 0.5
    
    for v in vs:
        
        for domt in domts:
            
            #seting upwind scheme, label and parameter
            SCHEME = SCHEMES.FSFL
            SCHEME_LABEL = 'FSFL'
            param = beta
            solver.advection_difusion_equation_solver(nx, domx, domt, cfl, v,\
                                       initial_cond_func_Burges,\
                                       initial_condition[0], initial_condition[-1], SCHEME, param,\
                                       None,\
                                       SCHEME_LABEL, marker = '.',\
                                       PATH = PATH,\
                                       equation_type = solver.Equation_types.Burges,\
                                       a = 1,\
                                       save_step_by_step = False, clean_plot = False,
                                       ymin = ymin, ymax = ymax)
            
            #seting upwind scheme, label and parameter
            SCHEME = SCHEMES.ADBQUICKEST
            SCHEME_LABEL = 'ADBQUICKEST'
            param = cfl
            solver.advection_difusion_equation_solver(nx, domx, domt, cfl, v,\
                                       initial_cond_func_Burges,\
                                       initial_condition[0], initial_condition[-1], SCHEME, param,\
                                       None,\
                                       SCHEME_LABEL, marker = None,\
                                       PATH = PATH,\
                                       equation_type = solver.Equation_types.Burges,\
                                       a = 1,\
                                       save_step_by_step = False, clean_plot = True,
                                       ymin = ymin, ymax = ymax)
    alpha = 2;
    
    t = domt[-1]

    x_axes = [domx[0] + i*dx for i in range(nx)]

    save_analitic = False

    if save_analitic:

        analitic = [analitic_linear_advection(domx[0] + i*dx, u_0, 0, a, case = case)\
                    for i in range(nx)]
        
        fileName = 'analitic_' + PATH + 'INITIAL.png'
        tools.save_fig(x_axes, analitic, fileName, 'analitica', 'analitica',\
                marker = None,\
                xlabel = 'x', ylabel = 'y',\
                clean_plot = True, margin = 0.1, ymin = ymin, ymax = ymax)

    
        analitic = [analitic_linear_advection(domx[0] + i*dx, u_0, t, a, case = case)\
                    for i in range(nx)]
        
        fileName = 'analitic_' + PATH + 'FINAL.png'
        tools.save_fig(x_axes, analitic, fileName, 'analitica', 'analitica',\
                marker = None,\
                xlabel = 'x', ylabel = 'y',\
                clean_plot = True, margin = 0.1, ymin = ymin, ymax = ymax)
    
    for i in range(n_v):
        
        SCHEME = SCHEMES.TOPUS