Ejemplo n.º 1
0
def main():
    args = sys.argv[1:]
    argc_min = 1
    if len(args) < argc_min:
        print(
            'usage: ./full_proc.py      model_name     [keys,    N0,     N1, ...]'
        )
        sys.exit(1)

    model_name, keys, graph_dir, time_gaps_str, N0, N1, Nfrm, E, Tmp, Tmp_av, t, stabTind, params = my.std_start(
        args, 0, 1, 2, 3)
    # std_start(args, model_i, N0_i, N1_i):
    # model_name, keys, graph_dir, time_gaps_str, N0, N1, Nfrm, E, Tmp, Tmp_av, t, stabTind, params

    extra_args_str = ''
    for i in range(1, len(args)):
        extra_args_str += (args[i] + ' ')

    if (my.find_key(keys, 'energy')):
        my.run_it('./E.py ' + model_name + ' ' + extra_args_str)

    if (my.find_key(keys, 'maxwell')):
        if (extra_args_str):
            command_to_run = './maxwell.py ' + model_name + ' 100 ' + extra_args_str
        else:
            command_to_run = './maxwell.py ' + model_name + ' 100 ' + str(
                stabTind)
        my.run_it(command_to_run)

    if (my.find_key(keys, 'diff') or my.find_key(keys, 'diffusion')):
        my.run_it('./diffusion.py ' + model_name + ' ' + extra_args_str)

    if (my.find_key(keys, 'cond') or my.find_key(keys, 'condition')):
        if (extra_args_str):
            command_to_run = './condition.py ' + model_name + ' ' + extra_args_str
        else:
            command_to_run = './condition.py ' + model_name + ' ' + str(
                stabTind)
        my.run_it(command_to_run)
Ejemplo n.º 2
0
def main():
    args = sys.argv[1:]
    argc_min = 1
    if len(args) < argc_min:
        print('usage:\npython condition.py    model_name     [N0,     N1,     R/dr]')
        sys.exit(1)
    
    model_name, keys, model_dir, graph_dir, time_gaps_str, N0, N1, Nfrm, E, P, Tmp, Tmp_av, t, stabTind, params = my.std_start(args, 0, 1, 2, 3)
    # std_start(args, model_i, N0_i, N1_i):
    # model_name, keys, graph_dir, time_gaps_str, N0, N1, Nfrm, E, Tmp, Tmp_av, t, stabTind, params
    
    if(len(args) < 4):
        path = os.path.join(my.RAW_DATA_PATH, model_name)
        all_filenames = [name_of_smth for name_of_smth in os.listdir(path) if os.path.isfile(os.path.join(path, name_of_smth))]
        Nslice = max([int(_x) for _x in re.findall(r'condition_(\d+).dat', ' '.join(all_filenames))])
    else:
        Nslice = int(args[3])
        
    input_filename = 'condition_' + str(Nslice) + '.dat'
    data = my.load_file(model_name, input_filename)
    x_dr = data[0];
    if(len(x_dr) != Nslice):
        print('wrong condition file\n' + input_filename + '\n' + 'Nslice = ' + str(Nslice) + '; len(x_dr) = ' + str(len(x_dr)))
        exit(1)
    data = data[1:]
    if(N1 > len(data)):
        print('wrong condition file\n' + input_filename + '\n' + 'max_frame_n = ' + str(len(data)-1))
        exit(1)
    draw_on_screen = my.find_key(keys, 'keep')
    if(not draw_on_screen):
        plt.switch_backend('Agg') 
    
    y_gFnc = data[0];
    for i in range(N0,N1):
        for j in range(Nslice):
            y_gFnc[j] += data[i,j]
            
        if(draw_on_screen):
            print('condition progress: ' + str((i+1-N0)/Nfrm*100) + '%                     \r', end='')
    y_gFnc = [_x/(N1-N0) for _x in y_gFnc]
    
    fig_c = -1
    fig = []
    time_gaps_str += ('_Nslice_' + str(Nslice))
    y0 = [math.exp(-my.phi_r(_x)) for _x in x_dr]
    
    path = os.path.join(graph_dir, 'g(t)_' + time_gaps_str + '.png')
    fig_c, fig = my.plot_error(fig_c, fig, x_dr, y_gFnc, y0=1, y_th=y0, x_lbl='r', y_lbl='n/n0', pic_path=path, filter_rng=round(params['R']/Nslice/0.05 + 0.5), draw_linfit='n', show_key=draw_on_screen)
    
    if(draw_on_screen):
        input()
Ejemplo n.º 3
0
def main():
    args = sys.argv[1:]
    argc_min = 1
    if len(args) < argc_min:
        print('usage:\npython E.py    model_name    [keys   N0    N1]')
        sys.exit(1)

    model_name, keys, model_dir, graph_dir, time_gaps_str, N0, N1, Nfrm, E, P, Tmp, Tmp_av, t, stabTind, params = my.std_start(
        args, 0, 1, 2, 3)
    # std_start(args, model_i, N0_i, N1_i):
    # model_name, keys, graph_dir, time_gaps_str, N0, N1, Nfrm, E, Tmp, Tmp_av, t, stabTind, params

    #for i in range(N0, N1):
    #    for j in range(4):
    #        E[i,j] /= params['Ntot']
    E /= params['Ntot']

    fig_c = -1
    fig = []
    draw_on_screen = my.find_key(keys, 'keep')
    if (not draw_on_screen):
        plt.switch_backend('Agg')

    fig_c += 1
    # 0
    fig.append(plt.figure(fig_c))
    plt.plot(t[N0:N1], E[N0:N1, 2], '-', label='Etot')
    plt.plot(t[N0:N1], E[N0:N1, 0], '-', label='Ek')
    plt.plot(t[N0:N1], E[N0:N1, 1], '-', label='Ep')
    plt.xlabel('time')
    plt.ylabel('E')
    plt.grid(True)
    plt.legend(bbox_to_anchor=(0., 1.02, 1., .102),
               loc=3,
               ncol=3,
               mode="expand",
               borderaxespad=0.)
    if (draw_on_screen):
        fig[fig_c].show()
    path = os.path.join(graph_dir, 'Energy3_' + time_gaps_str + '.png')
    fig[fig_c].savefig(path)

    # 1
    E0 = np.mean(E[N0:N1, 0]) + abs(np.mean(E[N0:N1, 1]))
    path = os.path.join(graph_dir, 'dE_norm_' + time_gaps_str + '.png')
    E_av = np.mean(E[N0:N1, 2])
    #y = [(e_el - E[N0,2])/E0 for e_el in E[N0:N1,2]]
    y = [(e_el / E_av - 1) for e_el in E[N0:N1, 2]]
    fig_c, fig = my.plot_error(fig_c,
                               fig,
                               t[N0:N1],
                               y,
                               y0=0,
                               y_lbl='E/<E>-1',
                               tit='E/<E> - 1 | std = ' +
                               my.str_sgn_round(np.std(y), 3),
                               pic_path=path,
                               show_key=draw_on_screen)

    # shadow error
    E0 = np.mean(E[N0:N1, 0]) + abs(np.mean(E[N0:N1, 1]))
    path = os.path.join(graph_dir, 'dH_norm_' + time_gaps_str + '.png')
    H_av = np.mean(E[N0:N1, 3])
    y = [(e_el / H_av - 1) for e_el in E[N0:N1, 3]]
    #print(E[N0:N1, :])
    fig_c, fig = my.plot_error(fig_c,
                               fig,
                               t[N0:N1],
                               y,
                               y0=0,
                               y_lbl='H/<H>-1',
                               tit='H/<H> - 1 | std = ' +
                               my.str_sgn_round(np.std(y), 3),
                               pic_path=path,
                               show_key=draw_on_screen)

    # shadow
    fig_c += 1
    fig.append(plt.figure(fig_c))
    plt.plot(t[N0:N1], E[N0:N1, 2], '-', label='Etot')
    plt.plot(t[N0:N1], E[N0:N1, 3], '-', label='d2H')
    plt.legend(bbox_to_anchor=(0., 1.02, 1., .102),
               loc=3,
               ncol=2,
               mode="expand",
               borderaxespad=0.)
    if (draw_on_screen):
        fig[fig_c].show()
    path = os.path.join(graph_dir, 'E_H_' + time_gaps_str + '.png')
    fig[fig_c].savefig(path)

    # shadow term
    fig_c += 1
    fig.append(plt.figure(fig_c))
    plt.plot(t[N0:N1], E[N0:N1, 3] - E[N0:N1, 2], '-', label='$d^2 H$')
    plt.legend(bbox_to_anchor=(0., 1.02, 1., .102),
               loc=3,
               mode="expand",
               borderaxespad=0.)
    if (draw_on_screen):
        fig[fig_c].show()
    path = os.path.join(graph_dir, 'd2H_' + time_gaps_str + '.png')
    fig[fig_c].savefig(path)

    # Pressure
    path = os.path.join(graph_dir, 'Pressure_' + time_gaps_str + '.png')
    P_th = params['n'] * params['Tmp']
    y = P[N0:N1]
    fig_c, fig = my.plot_error(
        fig_c,
        fig,
        t[N0:N1],
        y,
        y_th=[_x * P_th for _x in np.ones(len(y))],
        y0=np.mean(P[N0:N1]),
        y_lbl='P',
        tit='P(time) | std_rel = ' +
        my.str_sgn_round(np.std(P[N0:N1]) / np.mean(P[N0:N1]), 3),
        pic_path=path,
        show_key=draw_on_screen)

    # 2
    #path = os.path.join(graph_dir, 'Etot_' + time_gaps_str + '.png')
    #y = [_x*params['Ntot'] for _x in E[N0:N1, 2]]
    #fig_c, fig = my.plot_error(fig_c, fig, t[N0:N1], y, y0=np.mean(y), y_lbl='Etot', tit='Etot | std = ' + my.str_sgn_round(np.std(y),3), pic_path=path, show_key=draw_on_screen)

    # 3
    #path = os.path.join(graph_dir, 'dE_normSQRT(N)_' + time_gaps_str + '.png')
    ##y = [(e_el - E[N0,2])*mth.sqrt(params['Ntot']) for e_el in E[N0:N1,2]]
    #y = [(e_el - E_av)*mth.sqrt(params['Ntot']) for e_el in E[N0:N1,2]]
    #fig_c, fig = my.plot_error(fig_c, fig, t[N0:N1], y, y0=0, y_lbl='(E - <E>)/sqrt(N)', tit='Esqrt | std = ' + my.str_sgn_round(np.std(y),3), pic_path=path, show_key=draw_on_screen)

    # 4
    #path = os.path.join(graph_dir, 'dE_' + time_gaps_str + '.png')
    ##y = [(e_el - E[N0,2])*params['Ntot'] for e_el in E[N0:N1,2]]
    #y = [(e_el - E_av)*params['Ntot'] for e_el in E[N0:N1,2]]
    #fig_c, fig = my.plot_error(fig_c, fig, t[N0:N1], y, y0=0, y_lbl='E - <E>', tit='E - <E> | std = ' + my.str_sgn_round(np.std(y),3), pic_path=path, show_key=draw_on_screen)

    # 5
    path = os.path.join(graph_dir, 'Tmp_' + time_gaps_str + '.png')
    y = Tmp
    fig_c, fig = my.plot_error(fig_c,
                               fig,
                               t[N0:N1],
                               Tmp,
                               y0=Tmp_av,
                               y_lbl='Tmp',
                               tit='Tmp | std_rel = ' +
                               my.str_sgn_round(np.std(Tmp) / Tmp_av, 3),
                               pic_path=path,
                               show_key=draw_on_screen)

    if (draw_on_screen):
        input()
Ejemplo n.º 4
0
def main():
    args = sys.argv[1:]
    argc_min = 2
    if len(args) < argc_min:
        print(
            'usage: ./maxwell.py    model_name    N_V_steps    [keys,    N0,    N1]'
        )
        sys.exit(1)

    model_name, keys, graph_dir, time_gaps_str, N0, N1, Nfrm, E, Tmp, Tmp_av, t, stabTind, params = my.std_start(
        args, 0, 2, 3, 4)
    # std_start(args, model_i, N0_i, N1_i):
    # model_name, keys, graph_dir, time_gaps_str, N0, N1, Nfrm, E, Tmp, Tmp_av, t, stabTind, params

    NV = int(args[1])
    draw_on_screen = my.find_key(keys, 'keep')
    if (not draw_on_screen):
        plt.switch_backend('Agg')

    if (len(args) < 4):
        if (draw_on_screen):
            print("N0 isn't set, N0 = ", stabTind, ' will be used')
        N0 = stabTind
        Nfrm = N1 - N0

    Z_sum = math.pow(params['mu'] / 2 / np.pi / Tmp_av, 1.5)
    k0 = 2 * np.pi * Z_sum
    v_prob = math.sqrt(2 * Tmp_av / params['mu'])
    v2_prob = Tmp_av / params['mu']
    total_v2 = np.zeros(NV - 1)
    total_v = np.zeros(NV - 1)
    for n in range(N0, N1):
        x, v, m = my.read_frame(model_name, n)

        v2 = my.arrDot(v, v)
        v_abs = my.arrFnc(v2, math.sqrt)
        if (n == N0):
            #v2max = max(v2)
            #v2min = min(v2)
            v2max = 3 * Tmp_av / params['mu'] * 4
            v2min = 3 * Tmp_av / params['mu'] / 10
            k_v2 = 1 / (params['Ntot'] * (v2max - v2min) / NV * Nfrm)
            k_v = 1 / (params['Ntot'] *
                       (math.sqrt(v2max) - math.sqrt(v2min)) / NV * Nfrm)
            v2steps = np.linspace(v2min, v2max, num=NV)
            vsteps = np.linspace(math.sqrt(v2min), math.sqrt(v2max), num=NV)
            x_v2 = [(v2steps[i] + v2steps[i + 1]) / 2 for i in range(NV - 1)]
            x_v = [(vsteps[i] + vsteps[i + 1]) / 2 for i in range(NV - 1)]
            y0_v2 = [
                k0 * math.sqrt(_x) * math.exp(-params['mu'] * _x / 2 / Tmp_av)
                for _x in x_v2
            ]
            y0_v = [
                2 * k0 * _x * _x *
                math.exp(-params['mu'] * _x * _x / 2 / Tmp_av) for _x in x_v
            ]
            #y0_ln = [-params['mu']*_x/2/Tmp_av for _x in x_v2]
            y0_ln = []
            for _x in x_v2:
                _a = params['mu'] * _x / 2 / Tmp_av
                #y0_ln.append(math.log(1-2*_a/3/params['Ntot']) - _a)
                y0_ln.append(-_a)

        peaks, bin_edges = np.histogram(v2, bins=v2steps)
        for i in range(NV - 1):
            total_v2[i] += peaks[i]

        peaks, bin_edges = np.histogram(v_abs, bins=vsteps)
        for i in range(NV - 1):
            total_v[i] += peaks[i]

        if (draw_on_screen):
            print('maxwell progress: ' + str(
                (n + 1 - N0) / (N1 - N0) * 100) + '%                     \r',
                  end='')

    y_v2 = [total_v2[i] * k_v2 for i in range(NV - 1)]
    y_v = [total_v[i] * k_v for i in range(NV - 1)]
    y_ln = []
    for i in range(NV - 1):
        if (y_v2[i] > 0):
            y_ln.append(math.log(y_v2[i] / k0 / math.sqrt(x_v2[i])))
        else:
            y_ln.append(0)
    dy_v = [y_v[i] / y0_v[i] - 1 for i in range(len(x_v))]
    dy_v2 = [y_v2[i] / y0_v2[i] - 1 for i in range(len(x_v2))]
    dy_ln = [y_ln[i] / y0_ln[i] - 1 for i in range(len(x_v2))]

    p_lnp = np.poly1d(np.polyfit(x_v2, y_ln, 1))
    k_exp = -p_lnp.c[0]
    k_th = params['mu'] / 2 / Tmp_av
    #print('k_exp = ', k_exp)
    #print('k_th = ', k_th)
    s = 0
    for i in range(NV - 1):
        s += (p_lnp(x_v2[i]) - y_ln[i])**2
    s /= (NV - 2)
    if (draw_on_screen):
        print('S = ', s)

    fig_c = -1
    figs = []
    time_gaps_str += ('_NV_' + str(NV))

    path = os.path.join(graph_dir, 'p(v)_' + time_gaps_str + '.png')
    fig_c, figs = my.plot_error(fig_c,
                                figs,
                                x_v,
                                y_v,
                                y_th=y0_v,
                                x0=v_prob,
                                x_lbl='v',
                                y_lbl='p',
                                pic_path=path,
                                show_key=draw_on_screen)

    path = os.path.join(graph_dir, 'p(v2)_' + time_gaps_str + '.png')
    fig_c, figs = my.plot_error(fig_c,
                                figs,
                                x_v2,
                                y_v2,
                                y_th=y0_v2,
                                x0=v2_prob,
                                x_lbl='v^2',
                                y_lbl='p',
                                pic_path=path,
                                show_key=draw_on_screen)

    path = os.path.join(graph_dir, 'ln_p(v2)_' + time_gaps_str + '.png')
    #fig_c, figs = my.plot_error(fig_c, figs, x_v2, y_ln, y_th=y0_ln, x_lbl='v^2', y_lbl='ln(p/v^2)', tit='(ln(p/v^2))(v^2) | k_th = ' + my.str_sgn_round(k_th,3) + ',  k_exp = ' + my.str_sgn_round(k_exp,3) + ' | std = ' + my.str_sgn_round(s,3), pic_path=path, show_key=draw_on_screen)
    fig_c, figs = my.plot_error(fig_c,
                                figs,
                                x_v2,
                                y_ln,
                                y_th=y0_ln,
                                x_lbl='v^2',
                                y_lbl='ln(p/v^2)',
                                tit='k_th = ' + my.str_sgn_round(k_th, 3) +
                                ',  k_exp = ' + my.str_sgn_round(k_exp, 3) +
                                ' | std = ' + my.str_sgn_round(s, 3) +
                                ', p0 = ' + my.str_sgn_round(p_lnp.c[1], 3),
                                pic_path=path,
                                show_key=draw_on_screen)

    path = os.path.join(graph_dir, 'd_p(v)_' + time_gaps_str + '.png')
    fig_c, figs = my.plot_error(fig_c,
                                figs,
                                x_v,
                                dy_v,
                                x0=v_prob,
                                y0=0,
                                x_lbl='v',
                                y_lbl='p/p0-1',
                                pic_path=path,
                                show_key=draw_on_screen)

    path = os.path.join(graph_dir, 'd_p(v2)_' + time_gaps_str + '.png')
    fig_c, figs = my.plot_error(fig_c,
                                figs,
                                x_v2,
                                dy_v2,
                                x0=v2_prob,
                                y0=0,
                                x_lbl='v^2',
                                y_lbl='p/p0-1',
                                pic_path=path,
                                show_key=draw_on_screen)

    path = os.path.join(graph_dir, 'd_ln_p(v2)_' + time_gaps_str + '.png')
    fig_c, figs = my.plot_error(fig_c,
                                figs,
                                x_v2,
                                dy_ln,
                                y0=0,
                                x_lbl='v^2',
                                y_lbl='dln(p)',
                                pic_path=path,
                                show_key=draw_on_screen)

    if (draw_on_screen):
        input()
Ejemplo n.º 5
0
def main():
    args = sys.argv[1:]
    argc_min = 1
    if len(args) < argc_min:
        print('usage:\npython diffusion.py model_name [keys, N0, N1, Nprt]')
        sys.exit(1)
        
    # --------------------------------- std start ------------------------------------------
    model_name, keys, model_dir, graph_dir, time_gaps_str, N0, N1, Nfrm, E, P, Tmp, Tmp_av, t, stabTind, params = my.std_start(args, 0, 1, 2, 3)
    # std_start(args, model_i, N0_i, N1_i):
    # model_name, keys, graph_dir, time_gaps_str, N0, N1, Nfrm, E, Tmp, Tmp_av, t, stabTind, params
            
    # --------------------------------- input handle ------------------------------------------
    if(Nfrm < 10):
        print('Too few grames (Nfrm < 10)')
        return
    if(len(args) < 5):
        Nprt = params['Ntot']
    else:
        Nprt = int(args[4])
                
    draw_on_screen = my.find_key(keys, 'keep')
    pnrt_progress = (my.find_key(keys, 'percent') or my.find_key(keys, 'prcnt'))
    if(not draw_on_screen):
        plt.switch_backend('Agg') 
    make_pics = (my.find_key(keys, 'pics') or draw_on_screen)
    
    # --------------------------------- theory prediction ------------------------------------------
    n0 = params['n']
    r_th0 = 1
    lmd_th0 = 1/(n0 * math.pi * r_th0**2 * math.sqrt(2))
            
    r_th1 = r_th0 * my.r_th1(Tmp_av, n0)
    lmd_th1 = lmd_th0 * (r_th0/r_th1)**2
    
    #r_th2 = pow(2, 1/6) * math.sqrt(1 + 2/(3*Tmp_av))
    r_th2 = r_th0 * my.r_th2(Tmp_av)
    lmd_th2 = lmd_th0 * (r_th0/r_th2)**2
    
    k_th = 4*lmd_th1 * math.sqrt(2*Tmp_av / math.pi)
    c_th = 1 / (6*Tmp_av)
    
    # --------------------------------- experimant data ------------------------------------------
    diff_file_path = os.path.join(model_dir, my.diff_filename)
    if(os.path.isfile(diff_file_path) and (not my.find_key(keys, 'recomp'))):
        data = np.loadtxt(diff_file_path)
        #data = np.delete(data, (0), axis=0)
        #data = np.delete(data, (0), axis=1)
        r2 = cp.deepcopy(data[0])
        l = len(r2);
        x_cm = np.zeros((l, 3))
        v_cm = np.zeros((l, 3))
        for i in range(l):
            for j in range(3):
                x_cm[i][j] = data[j+1][i]
                v_cm[i][j] = data[j+4][i]
        data = None;
    else:
        r2 = []
        dr = [0,0,0]
        cubeSize = 2*params['R']
        cubeSzEff = params['R']
        x_cm = []
        #r_cm = []
        v_cm = []
        for n in range(N0,N1):
            x,v = my.read_frame(model_name, n)
            m = np.ones(params['Ntot'])
            
            if(n == N0):
                # set start conditions
                x0 = cp.deepcopy(x)
                x_real = cp.deepcopy(x)
                r2.append(0)
                
                v_start_av = np.mean([my.length(_x) for _x in v])
            else:
                r2_sum = 0
                for i in range(Nprt): # find <r^2> considering coords's shifts
                    for j in range(3): 
                        dr[j] = x[i][j]-x0[i][j]
                    r2_sum += my.dot(dr,dr)
                r2.append(r2_sum/Nprt)
            x_cm.append(my.find_cm(x, m))
            v_cm.append(my.find_cm(v,m))
                                
            if(pnrt_progress):
                print('diffusion progress: ' + str((n + 1 - N0) / Nfrm * 100) + '%                     \r', end='')
                
        xx = [_x[0] for _x in x_cm]
        xy = [_x[1] for _x in x_cm]
        xz = [_x[2] for _x in x_cm]
        vx = [_x[0] for _x in v_cm]
        vy = [_x[1] for _x in v_cm]
        vz = [_x[2] for _x in v_cm]        
        np.savetxt(diff_file_path, (r2, xx, xy, xz, vx, vy, vz))
                
    # --------------------------------- experimant analisys ------------------------------------------        
    # find proper tg
    r1 = my.arrFnc(r2, math.sqrt)
    big_time = 3
    small_time = 0.5
    approx_r2 = np.poly1d(np.polyfit(t[N0:N1], r2, 1))
    k_exp = approx_r2.c[0]
    tau = c_th*k_exp
    c2 = int(tau*params['dumpDT'] * big_time)
    if(c2 > Nfrm-10):
        c2 = Nfrm-10
    if(c2 < 10):
        c2 = int(Nfrm/2)
    approx_r2 = np.poly1d(np.polyfit(t[(N0+c2):N1], r2[c2:], 1))
    k_exp = abs(approx_r2.c[0])
    tau = c_th * k_exp
    c2 = int(tau*params['dumpDT'] * big_time)
    if(c2 > Nfrm - 5):
        c2 = Nfrm - 5
    if(c2 < 10):
        c2 = int(Nfrm/2)
    c1 = int(tau*params['dumpDT'] * small_time)
    if(c1 < 3):
        c1 = 3
                
    # in case of strange emergencies
    bad_k_exp = (k_exp < my.myeps)
    if(bad_k_exp):
        if(k_exp < 0):
            k_exp = -k_exp
        if(k_exp < my.myeps):
            k_exp = my.myeps
            
    xa0 = abs(approx_r2(0))
    tau = xa0/k_exp
            
    c_exp = xa0 / k_exp**2
    B = (1 - r2[-2] / (k_exp * t[N1-1])) * math.sqrt(t[N1-1])
    subdiff_c = int(round(B*B*params['dumpDT'] + 1.01))
        
    x = my.arrFnc(t[(N0+c2):N1], math.log)
    y = my.arrFnc(r2[c2:], math.log)
    logEnd_approx = np.poly1d(np.polyfit(x, y, 1))
    x = my.arrFnc(t[N0:c1], math.log)
    y = my.arrFnc(r2[1:c1], math.log)
    logBeg_approx = np.poly1d(np.polyfit(x, y, 1))
    x = t[N0:c1]
    y = my.arrFnc(r2[1:c1], math.sqrt)
    approx_r1 = np.poly1d(np.polyfit(x, y, 1))
    
    #lmd_1 = math.sqrt(3*math.pi*xa0)/4
    lmd_1 = my.lmd_1(xa0)
    #lmd_2 = k_exp/4 * math.sqrt(math.pi / (Tmp_av*2))
    lmd_2 = my.lmd_2(k_exp, 1, Tmp_av)
    D_Einst = lmd_2 * math.sqrt(8 * Tmp_av / math.pi) / 3
    
    selfconsist = my.rel_err(lmd_1, lmd_2)
    
    lmd_3 = my.lmd_3(logBeg_approx.c[0], logBeg_approx.c[1], logEnd_approx.c[0], logEnd_approx.c[1], 1, Tmp_av) # tau -> lmd
    lmd_4 = my.lmd_4(logBeg_approx.c[0], logBeg_approx.c[1], logEnd_approx.c[0], logEnd_approx.c[1]) # straight lmd

    if(make_pics):
        fig_c = -1
        figs = []
        
        if(my.find_key(keys, 'r_cm')):
            # -------------------------------- r_cm(t) -----------------------------------------        
            fig_c += 1
            figs.append(plt.figure(fig_c))
            cm = []
            std_cm = []
            x = t[N0:N1]
            t**s = ['x', 'y', 'z']
            for _j in range(3):
                cm.append([x_cm[_i][_j]-x_cm[0][_j] for _i in range(Nfrm)])
                std_cm.append(np.std(cm[_j]))
                plt.plot(x, cm[_j], '-', label = t**s[_j] + '; std = ' + str(my.str_sgn_round(std_cm[_j],3))) # experiment data
            x = [t[N0], t[N1-1]]
            plt.plot(x, [0,0], '--')
            plt.ticklabel_format(style='sci', axis='y', scilimits=(0,0))
            plt.ticklabel_format(style='sci', axis='x', scilimits=(0,0))
            plt.xlabel('t')
            plt.ylabel('xyz_cm')
            plt.grid(True)
            plt.legend(bbox_to_anchor=(0., 1.02, 1., .102), loc=3,
                       ncol=3, mode="expand", borderaxespad=0.)        
            if(draw_on_screen):
                figs[fig_c].show()
            path = os.path.join(graph_dir, 'xyz_cm(t)_' + time_gaps_str + '.png')
            figs[fig_c].savefig(path)    
                            
        if(my.find_key(keys, 'r2')):
            # -------------------------------- r2(t) ------------------------------------------
            fig_c += 1
            figs.append(plt.figure(fig_c))
            
            #tau = 1
            x = t[N0:N1]
            x_draw = [_x/tau for _x in x]
            plt.plot(x_draw, r2, '-', label="exp") # experiment data
            
            x = t[N0:N1]
            r2_th = [k_exp*tau*(_x/tau - 1 + math.exp(- _x/tau)) for _x in x]
            x_draw = [_x/tau for _x in x]
            plt.plot(x_draw, r2_th, '--', label="my_th")  # my approximation            
            
            if(my.find_key(keys, 'subdiff')):
                x = t[(N0 + subdiff_c):N1]
                subdiff_app = [k_exp*_x*(1 - B/math.sqrt(_x)) for _x in x]
                x_draw = [_x/tau for _x in x]
                plt.plot(x_draw, subdiff_app, '-.', label="subdiff") # subdiff approximation
                                    
            x = [t[N0], t[N1-1]]
            y = [approx_r2(_x) for _x in x]
            x_draw = [_x/tau for _x in x]
            plt.plot(x_draw, y, '--', label="line asimp") # line approximation            
            
            plt.ticklabel_format(style='sci', axis='y', scilimits=(0,0))
            plt.ticklabel_format(style='sci', axis='x', scilimits=(0,0))
            plt.xlabel('t/tau')
            plt.ylabel('<r^2>')
            plt.grid(True)
            #plt.title('r^2(t) | k_exp = ' + str(my.str_sgn_round(k_exp,3)) + ', k_th = ' + str(my.str_sgn_round(k_th,3)))
            plt.title('r^2(t) | tau = ' + my.str_sgn_round(tau,3) + ' | B = ' + my.str_sgn_round(B,3))
            plt.legend()
            if(draw_on_screen):
                figs[fig_c].show()
            path = os.path.join(graph_dir, 'r2(t)_' + time_gaps_str + '.png')
            figs[fig_c].savefig(path)
            
            # -------------------------------- log(r2)(log(t)) ------------------------------------------
            fig_c += 1
            figs.append(plt.figure(fig_c))
            
            x = t[N0:N1]
            x_draw = [_x/tau for _x in x]
            plt.plot(x_draw, r2, '-', label="exp") # experiment data
                        
            x = [_x/tau for _x in t[N0:N1]]
            plt.plot(x, r2_th, '--', label="my_th") # my approximation         
            
            if(my.find_key(keys, 'subdiff')):
                x = t[(N0 + subdiff_c):N1]
                x_draw = [_x/tau for _x in x]            
                plt.plot(x_draw, subdiff_app, '--', label="subdiff") # subdiff approximation
            
            x = [t[N0], t[N0+c2]]
            y = [math.exp(logBeg_approx(math.log(_x))) for _x in x]
            x_draw = [_x/tau for _x in x]
            plt.plot(x_draw, y, '--', label="ballistic") # beginning approximation        
            
            x = [t[N0+c1], t[N1-1]]
            y = [math.exp(logEnd_approx(math.log(_x))) for _x in x]
            x_draw = [_x/tau for _x in x]            
            plt.plot(x_draw, y, '--', label="linear") # ending approximation            
                    
            plt.xlabel('t/tau')
            plt.ylabel('<r^2>')
            plt.grid(True)
            plt.xscale('log')
            plt.yscale('log')
            plt.title('log(r2) | k_begin = ' + str(my.str_sgn_round(logBeg_approx.c[0],3)) + '; k_end = ' + str(my.str_sgn_round(logEnd_approx.c[0],3)))
            plt.legend()
            if(draw_on_screen):
                figs[fig_c].show()
            path = os.path.join(graph_dir, 'r2(t)_loglog_' + time_gaps_str + '.png')
            figs[fig_c].savefig(path)
            
            # -------------------------------- r(t) ------------------------------------------
            fig_c += 1
            figs.append(plt.figure(fig_c))        
            plt.plot(t[N0:N1], r1, '-', label="exp") # experiment data
                    
            x = t[N0:N1]
            y = my.arrFnc(r2_th, math.sqrt)
            plt.plot(x, y, '--', label="my_th") # my approximation 
            
            if(my.find_key(keys, 'subdiff')):
                x = t[(N0 + subdiff_c):N1]
                y = my.arrFnc(subdiff_app, math.sqrt)
                plt.plot(x, y, '--', label="subdiff") # sudiff approximation             
            
            x = [t[N0], t[c2]]
            y = [approx_r1(_x) for _x in x]
            plt.plot(x, y, '--', label="ballistic") # beginning approximation             
                
            plt.xlabel('t')
            plt.ylabel('sqrt(<r^2>)')
            plt.grid(True)
            #plt.title('sqrt(r2) | l_th = ' + str(my.str_sgn_round(lmd_th1,3)) + '; l_3 = ' + str(my.str_sgn_round(lmd_3,3)) + '; l_2 = ' + str(my.str_sgn_round(lmd_2,3)))
            plt.title('sqrt(<r^2>)')
            if(draw_on_screen):
                figs[fig_c].show()
            path = os.path.join(graph_dir, 'r1(t)_' + time_gaps_str + '.png')
            figs[fig_c].savefig(path)    
                            
        if(my.find_key(keys, 'r2_err')):
            # -------------------------------- r2_err(t) ------------------------------------------
            fig_c += 1
            figs.append(plt.figure(fig_c))
            
            x = t[N0:N1]
            y = [r2[_i] - r2_th[_i] for _i in range(len(r2_th))]
            plt.plot(x, y, '-') # my approximation            

            if(my.find_key(keys, 'subdiff')):
                x = t[(N0 + subdiff_c):N1]
                y = [r2[_i + subdiff_c] - subdiff_app[_i] for _i in range(0, N1 - N0 - subdiff_c)]
                plt.plot(x, y, '--') # subdiff approximation                        
            
            plt.plot([t[N0+1], t[N1-1]], [0, 0], '--')
            
            plt.ticklabel_format(style='sci', axis='y', scilimits=(0,0))
            plt.ticklabel_format(style='sci', axis='x', scilimits=(0,0))
            plt.xlabel('t')
            plt.ylabel('<r^2> - <r^2>_th')
            plt.grid(True)
            #plt.title('r^2(t) | k_exp = ' + str(my.str_sgn_round(k_exp,3)) + ', k_th = ' + str(my.str_sgn_round(k_th,3)))
            plt.title('<r^2> error')
            if(draw_on_screen):
                figs[fig_c].show()
            path = os.path.join(graph_dir, 'r2_err(t)_' + time_gaps_str + '.png')
            figs[fig_c].savefig(path)        
            
            # -------------------------------- r2_err_rel(t) ------------------------------------------
            fig_c += 1
            figs.append(plt.figure(fig_c))
            
            tmp = int(round(tau*5*params['dumpDT']))
            x = t[(N0 + subdiff_c + tmp):N1]
            y = [my.rel_err(r2[_i], r2_th[_i]) for _i in range(tmp, N1 - N0 - subdiff_c)]
            plt.plot(x, y, '-') # my approximation
            
            if(my.find_key(keys, 'subdiff')):
                x = t[(N0 + subdiff_c + tmp):N1]
                y = [my.rel_err(r2[_i + subdiff_c],subdiff_app[_i]) for _i in range(tmp, N1 - N0 - subdiff_c)]
                plt.plot(x, y, '-.') # subdiff approximation                        
            
            plt.plot([t[N0+1], t[N1-1]], [0, 0], '--')
            
            plt.ticklabel_format(style='sci', axis='y', scilimits=(0,0))
            plt.ticklabel_format(style='sci', axis='x', scilimits=(0,0))
            plt.xlabel('t')
            plt.ylabel('err')
            plt.grid(True)
            #plt.title('r^2(t) | k_exp = ' + str(my.str_sgn_round(k_exp,3)) + ', k_th = ' + str(my.str_sgn_round(k_th,3)))
            plt.title('|<r^2> / <r^2>_th - 1|')
            if(draw_on_screen):
                figs[fig_c].show()
            path = os.path.join(graph_dir, 'r2_err_rel(t)_' + time_gaps_str + '.png')
            figs[fig_c].savefig(path)                
    
            
        if(my.find_key(keys, 'v_cm')):
            # -------------------------------- v_cm(t) -----------------------------------------
            fig_c += 1
            figs.append(plt.figure(fig_c))
            x = t[N0:N1]
            dv_cm = []
            std_dvcm = []
            t**s = ['vx', 'vy', 'vz']        
            for _j in range(3):
                v_av = np.mean(v_cm[:][_j])
                dv_cm.append([v_cm[_i][_j] - v_av for _i in range(Nfrm)])
                std_dvcm.append(np.std(dv_cm[_j]))
                plt.plot(x, dv_cm[_j], '-', label = t**s[_j] + '; std = ' + str(my.str_sgn_round(std_dvcm[_j],3))) # experiment data
            x = [t[N0], t[N1-1]]
            plt.plot(x, [0,0], '--')
            plt.ticklabel_format(style='sci', axis='y', scilimits=(0,0))
            plt.ticklabel_format(style='sci', axis='x', scilimits=(0,0))
            plt.xlabel('t')
            plt.ylabel('v_cm')
            plt.grid(True)
            plt.legend(bbox_to_anchor=(0., 1.02, 1., .102), loc=3,
                    ncol=3, mode="expand", borderaxespad=0.)        
            if(draw_on_screen):
                figs[fig_c].show()
            path = os.path.join(graph_dir, 'v_cm(t)_' + time_gaps_str + '.png')
            figs[fig_c].savefig(path)    
            
        if(my.find_key(keys, 'human')):
            print('n = ', n0, '; T = ', Tmp_av)
            print('lmd_0 = ', lmd_th0, '; lmd_T<1 = ', lmd_th1, '; lmd_T>1 = ', lmd_th2)
            print('lmd_a = ', lmd_1, '; lmd_tg = ', lmd_2, '; lmd_exp_intercept = ', lmd_3, '; lmd_tau_intercept = ', lmd_4)
            print('inconsistency = ', selfconsist)
        else:
            print(n0, Tmp_av, lmd_th0, lmd_th1, lmd_th2, lmd_1, lmd_2, lmd_3, lmd_4)
        #print('D_Einst = ' + str(D_Einst))
        
    if(draw_on_screen):
        #print(c_th, c_exp, my.rel_err(c_th, c_exp))
        input()
Ejemplo n.º 6
0
def main():
    args = sys.argv[1:]
    argc_min = 1
    if len(args) < argc_min:
        print('usage: ./diffusion.py model_name [keys, N0, N1, Nprt]')
        sys.exit(1)

    # --------------------------------- std start ------------------------------------------
    model_name, keys, graph_dir, time_gaps_str, N0, N1, Nfrm, E, Tmp, Tmp_av, t, stabTind, params = my.std_start(
        args, 0, 1, 2, 3)
    # std_start(args, model_i, N0_i, N1_i):
    # model_name, keys, graph_dir, time_gaps_str, N0, N1, Nfrm, E, Tmp, Tmp_av, t, stabTind, params

    # --------------------------------- input handle ------------------------------------------
    if (Nfrm < 10):
        print('Too few grames (Nfrm < 10)')
        return
    if (len(args) < 4):
        Nprt = params['Ntot']
    else:
        Nprt = int(args[3])

    draw_on_screen = my.find_key(keys, 'keep')
    pnrt_progress = (my.find_key(keys, 'percent')
                     or my.find_key(keys, 'prcnt'))
    if (not draw_on_screen):
        plt.switch_backend('Agg')
    make_pics = (my.find_key(keys, 'pics') or draw_on_screen)

    # --------------------------------- theory prediction ------------------------------------------
    n0 = params['Ntot'] / math.pow(2 * params['R'], 3)
    r_th0 = 1
    lmd_th0 = 1 / (n0 * math.pi * r_th0**2 * math.sqrt(2))

    r_th1 = r_th0 * my.r_th1(Tmp_av, n0)
    lmd_th1 = lmd_th0 * (r_th0 / r_th1)**2

    #r_th2 = pow(2, 1/6) * math.sqrt(1 + 2/(3*Tmp_av))
    r_th2 = r_th0 * my.r_th2(Tmp_av)
    lmd_th2 = lmd_th0 * (r_th0 / r_th2)**2

    k_th = 4 * lmd_th1 * math.sqrt(2 * Tmp_av / (math.pi * params['mu']))
    c_th = params['mu'] / (6 * Tmp_av)

    # --------------------------------- experimant data ------------------------------------------
    r2 = []
    dr = [0, 0, 0]
    cubeSize = 2 * params['R']
    cubeSzEff = params['R']
    x_cm = []
    r_cm = []
    v_cm = []
    for n in range(N0, N1):
        x, v, m = my.read_frame(model_name, n)

        if (my.find_key(keys, 'vcm')):
            v_cm.append(my.find_cm(v, m))
        else:
            if (n == N0):
                # set start conditions
                x0 = cp.deepcopy(x)
                x_real = cp.deepcopy(x)
                x_prev = cp.deepcopy(x)
                r2.append(0)

                v_start_av = np.mean([my.length(_x) for _x in v])
            else:
                r2_sum = 0
                for i in range(Nprt):  # find <r^2> considering coords's shifts
                    for j in range(3):
                        dx = x[i][j] - x_prev[i][j]
                        if (dx > cubeSzEff):  # re-shift coords
                            dx -= cubeSize
                        elif (dx < -cubeSzEff):
                            dx += cubeSize
                        x_real[i][j] += dx
                        # find real displacement
                        dr[j] = x_real[i][j] - x0[i][j]
                    r2_sum += my.dot(dr, dr)
                r2.append(r2_sum / Nprt)
                x_prev = cp.deepcopy(x)
            x_cm.append(my.find_cm(x_real, m))
            r_cm.append(my.length(x_cm[-1]))

        if (pnrt_progress):
            print('diffusion progress: ' + str(
                (n + 1 - N0) / Nfrm * 100) + '%                     \r',
                  end='')

    if (not my.find_key(keys, 'vcm')):
        # --------------------------------- experimant analisys ------------------------------------------
        # find proper tg
        r1 = my.arrFnc(r2, math.sqrt)
        big_time = 3
        small_time = 0.5
        approx_r2 = np.poly1d(np.polyfit(t[N0:N1], r2, 1))
        k_exp = approx_r2.c[0]
        tau = c_th * k_exp
        c2 = int(tau * params['dumpDT'] * big_time)
        if (c2 > Nfrm - 10):
            c2 = Nfrm - 10
        if (c2 < 10):
            c2 = int(Nfrm / 2)
        approx_r2 = np.poly1d(np.polyfit(t[(N0 + c2):N1], r2[c2:], 1))
        k_exp = abs(approx_r2.c[0])
        tau = c_th * k_exp
        c2 = int(tau * params['dumpDT'] * big_time)
        if (c2 > Nfrm - 5):
            c2 = Nfrm - 5
        if (c2 < 10):
            c2 = int(Nfrm / 2)
        c1 = int(tau * params['dumpDT'] * small_time)
        if (c1 < 3):
            c1 = 3

        # in case of strange emergencies
        bad_k_exp = (k_exp < my.myeps)
        if (bad_k_exp):
            if (k_exp < 0):
                k_exp = -k_exp
            if (k_exp < my.myeps):
                k_exp = my.myeps

        xa0 = abs(approx_r2(0))
        #tau = xa0/k_exp

        c_exp = xa0 / k_exp**2

        x = my.arrFnc(t[(N0 + c2):N1], math.log)
        y = my.arrFnc(r2[c2:], math.log)
        logEnd_approx = np.poly1d(np.polyfit(x, y, 1))
        x = my.arrFnc(t[N0 + 1:c1], math.log)
        y = my.arrFnc(r2[1:c1], math.log)
        logBeg_approx = np.poly1d(np.polyfit(x, y, 1))
        x = t[N0 + 1:c1]
        y = my.arrFnc(r2[1:c1], math.sqrt)
        approx_r1 = np.poly1d(np.polyfit(x, y, 1))

        #lmd_1 = math.sqrt(3*math.pi*xa0)/4
        lmd_1 = my.lmd_1(xa0)
        #lmd_2 = k_exp/4 * math.sqrt(math.pi*params['mu'] / (Tmp_av*2))
        lmd_2 = my.lmd_2(k_exp, params['mu'], Tmp_av)

        lmd_3 = my.lmd_3(logBeg_approx.c[0], logBeg_approx.c[1],
                         logEnd_approx.c[0], logEnd_approx.c[1], params['mu'],
                         Tmp_av)  # tau -> lmd
        lmd_4 = my.lmd_4(logBeg_approx.c[0], logBeg_approx.c[1],
                         logEnd_approx.c[0],
                         logEnd_approx.c[1])  # straight lmd

    if (make_pics):
        fig_c = -1
        figs = []

        if (not my.find_key(keys, 'vcm')):
            # -------------------------------- r_cm(t) -----------------------------------------
            fig_c += 1
            figs.append(plt.figure(fig_c))
            cm = []
            std_cm = []
            x = t[N0:N1]
            t**s = ['x', 'y', 'z']
            for _j in range(3):
                cm.append([x_cm[_i][_j] - x_cm[0][_j] for _i in range(Nfrm)])
                std_cm.append(np.std(cm[_j]))
                plt.plot(
                    x,
                    cm[_j],
                    '-',
                    label=t**s[_j] + '; std = ' +
                    str(my.str_sgn_round(std_cm[_j], 3)))  # experiment data
            x = [t[N0], t[N1 - 1]]
            plt.plot(x, [0, 0], '--')
            plt.ticklabel_format(style='sci', axis='y', scilimits=(0, 0))
            plt.ticklabel_format(style='sci', axis='x', scilimits=(0, 0))
            plt.xlabel('t')
            plt.ylabel('xyz_cm')
            plt.grid(True)
            plt.legend(bbox_to_anchor=(0., 1.02, 1., .102),
                       loc=3,
                       ncol=3,
                       mode="expand",
                       borderaxespad=0.)
            if (draw_on_screen):
                figs[fig_c].show()
            path = os.path.join(graph_dir,
                                'xyz_cm(t)_' + time_gaps_str + '.png')
            figs[fig_c].savefig(path)

            # -------------------------------- r2(t) ------------------------------------------
            fig_c += 1
            figs.append(plt.figure(fig_c))
            plt.plot(t[N0:N1], r2, '-')  # experiment data

            x = [t[N0 + 1], t[N1 - 1]]
            y = [approx_r2(_x) for _x in x]
            plt.plot(x, y, '--')  # line approximation

            x = t[N0:N1]
            #y = [xa0*(_x/tau - 1 + math.exp(- _x/tau)) for _x in x]
            r2_th = [
                k_exp * (_x - tau * (1 - math.exp(-_x / tau))) for _x in x
            ]
            plt.plot(x, r2_th, '--')  # my approximation

            plt.ticklabel_format(style='sci', axis='y', scilimits=(0, 0))
            plt.ticklabel_format(style='sci', axis='x', scilimits=(0, 0))
            plt.xlabel('t')
            plt.ylabel('<r^2>')
            plt.grid(True)
            #plt.title('r^2(t) | k_exp = ' + str(my.str_sgn_round(k_exp,3)) + ', k_th = ' + str(my.str_sgn_round(k_th,3)))
            plt.title('r^2(t)')
            if (draw_on_screen):
                figs[fig_c].show()
            path = os.path.join(graph_dir, 'r2(t)_' + time_gaps_str + '.png')
            figs[fig_c].savefig(path)

            # -------------------------------- r2_err(t) ------------------------------------------
            fig_c += 1
            figs.append(plt.figure(fig_c))

            x = t[N0:N1]
            y = [r2[_i] - r2_th[_i] for _i in range(len(x))]
            plt.plot(x, y, '-')  # experiment data
            plt.plot([t[N0 + 1], t[N1 - 1]], [0, 0], '--')

            plt.ticklabel_format(style='sci', axis='y', scilimits=(0, 0))
            plt.ticklabel_format(style='sci', axis='x', scilimits=(0, 0))
            plt.xlabel('t')
            plt.ylabel('<r^2> - <r^2>_th')
            plt.grid(True)
            #plt.title('r^2(t) | k_exp = ' + str(my.str_sgn_round(k_exp,3)) + ', k_th = ' + str(my.str_sgn_round(k_th,3)))
            plt.title('<r^2> error')
            if (draw_on_screen):
                figs[fig_c].show()
            path = os.path.join(graph_dir,
                                'r2_err(t)_' + time_gaps_str + '.png')
            figs[fig_c].savefig(path)

            # -------------------------------- r2_err_rel(t) ------------------------------------------
            fig_c += 1
            figs.append(plt.figure(fig_c))

            x = t[N0:N1]
            y = [my.rel_err(r2[_i], r2_th[_i]) for _i in range(len(x))]
            plt.plot(x, y, '-')  # experiment data
            plt.plot([t[N0 + 1], t[N1 - 1]], [0, 0], '--')

            plt.ticklabel_format(style='sci', axis='y', scilimits=(0, 0))
            plt.ticklabel_format(style='sci', axis='x', scilimits=(0, 0))
            plt.xlabel('t')
            plt.ylabel('err')
            plt.grid(True)
            #plt.title('r^2(t) | k_exp = ' + str(my.str_sgn_round(k_exp,3)) + ', k_th = ' + str(my.str_sgn_round(k_th,3)))
            plt.title('|<r^2> / <r^2>_th - 1|')
            if (draw_on_screen):
                figs[fig_c].show()
            path = os.path.join(graph_dir,
                                'r2_err_rel(t)_' + time_gaps_str + '.png')
            figs[fig_c].savefig(path)

            # -------------------------------- log(r2)(log(t)) ------------------------------------------
            fig_c += 1
            figs.append(plt.figure(fig_c))
            plt.plot(t[N0:N1], r2, '-')  # experiment data

            x = [t[N0 + 1], t[N0 + c2]]
            y = [math.exp(logBeg_approx(math.log(_x))) for _x in x]
            plt.plot(x, y, '--')  # beginning approximation

            x = [t[N0 + c1], t[N1 - 1]]
            y = [math.exp(logEnd_approx(math.log(_x))) for _x in x]
            plt.plot(x, y, '--')  # ending approximation

            x = t[N0:N1]
            plt.plot(x, r2_th, '--')  # my approximation

            plt.xlabel('t')
            plt.ylabel('<r^2>')
            plt.grid(True)
            plt.xscale('log')
            plt.yscale('log')
            plt.title('log(r2) | k_begin = ' +
                      str(my.str_sgn_round(logBeg_approx.c[0], 3)) +
                      '; k_end = ' +
                      str(my.str_sgn_round(logEnd_approx.c[0], 3)))
            if (draw_on_screen):
                figs[fig_c].show()
            path = os.path.join(graph_dir,
                                'r2(t)_loglog_' + time_gaps_str + '.png')
            figs[fig_c].savefig(path)

            # -------------------------------- r(t) ------------------------------------------
            fig_c += 1
            figs.append(plt.figure(fig_c))
            plt.plot(t[N0:N1], r1, '-')  # experiment data

            x = [t[N0 + 1], t[c2]]
            y = [approx_r1(_x) for _x in x]
            plt.plot(x, y, '--')  # beginning approximation

            x = t[N0:N1]
            y = my.arrFnc(r2_th, math.sqrt)
            plt.plot(x, y, '--')  # my approximation

            plt.xlabel('t')
            plt.ylabel('sqrt(<r^2>)')
            plt.grid(True)
            #plt.title('sqrt(r2) | l_th = ' + str(my.str_sgn_round(lmd_th1,3)) + '; l_3 = ' + str(my.str_sgn_round(lmd_3,3)) + '; l_2 = ' + str(my.str_sgn_round(lmd_2,3)))
            plt.title('sqrt(<r^2>)')
            if (draw_on_screen):
                figs[fig_c].show()
            path = os.path.join(graph_dir, 'r1(t)_' + time_gaps_str + '.png')
            figs[fig_c].savefig(path)

        # -------------------------------- v_cm(t) -----------------------------------------
        fig_c += 1
        figs.append(plt.figure(fig_c))
        x = t[N0:N1]
        dv_cm = []
        std_dvcm = []
        t**s = ['vx', 'vy', 'vz']
        for _j in range(3):
            v_av = np.mean(v_cm[:][_j])
            dv_cm.append([v_cm[_i][_j] - v_av for _i in range(Nfrm)])
            std_dvcm.append(np.std(dv_cm[_j]))
            plt.plot(x,
                     dv_cm[_j],
                     '-',
                     label=t**s[_j] + '; std = ' +
                     str(my.str_sgn_round(std_dvcm[_j], 3)))  # experiment data
        x = [t[N0], t[N1 - 1]]
        plt.plot(x, [0, 0], '--')
        plt.ticklabel_format(style='sci', axis='y', scilimits=(0, 0))
        plt.ticklabel_format(style='sci', axis='x', scilimits=(0, 0))
        plt.xlabel('t')
        plt.ylabel('v_cm')
        plt.grid(True)
        plt.legend(bbox_to_anchor=(0., 1.02, 1., .102),
                   loc=3,
                   ncol=3,
                   mode="expand",
                   borderaxespad=0.)
        if (draw_on_screen):
            figs[fig_c].show()
        path = os.path.join(graph_dir, 'v_cm(t)_' + time_gaps_str + '.png')
        figs[fig_c].savefig(path)

    if (not my.find_key(keys, 'vcm')):
        print(n0, Tmp_av, lmd_th0, lmd_th1, lmd_th2, lmd_1, lmd_2, lmd_3,
              lmd_4)

    if (draw_on_screen):
        #print(c_th, c_exp, my.rel_err(c_th, c_exp))
        input()
Ejemplo n.º 7
0
def main():
    args = sys.argv[1:]
    argc_min = 1
    if len(args) < argc_min:
        print('usage: ./E.py    model_name    [keys   N0    N1]')
        sys.exit(1)
        
    model_name, keys, graph_dir, time_gaps_str, N0, N1, Nfrm, E, Tmp, Tmp_av, t, stabTind, params = my.std_start(args, 0, 1, 2, 3)
    # std_start(args, model_i, N0_i, N1_i):
    # model_name, keys, graph_dir, time_gaps_str, N0, N1, Nfrm, E, Tmp, Tmp_av, t, stabTind, params
    
    for i in range(N0, N1):
        for j in range(3):
            E[i,j] /= params['Ntot']
        
    fig_c = -1
    fig = []
    draw_on_screen = my.find_key(keys, 'keep')
    if(not draw_on_screen):
        plt.switch_backend('Agg') 
    
    fig_c += 1
    # 0
    fig.append(plt.figure(fig_c))
    plt.plot(t[N0:N1], E[N0:N1,2], '-', label = 'Etot')    
    plt.plot(t[N0:N1], E[N0:N1,0], '-', label = 'Ek')
    plt.plot(t[N0:N1], E[N0:N1,1], '-', label = 'Ep')
    plt.xlabel('time')
    plt.ylabel('E')
    plt.grid(True)
    plt.legend(bbox_to_anchor=(0., 1.02, 1., .102), loc=3,
               ncol=3, mode="expand", borderaxespad=0.)
    if(draw_on_screen):
        fig[fig_c].show()
    path = os.path.join(graph_dir, 'Energy3_' + time_gaps_str + '.png')
    fig[fig_c].savefig(path)    
    
    # 1    
    E0 = np.mean(E[N0:N1,0]) + abs(np.mean(E[N0:N1,1]))
    path = os.path.join(graph_dir, 'dE_norm_' + time_gaps_str + '.png')
    E_av = np.mean(E[:,2])
    #y = [(e_el - E[N0,2])/E0 for e_el in E[N0:N1,2]]
    y = [(e_el - E_av)/E0 for e_el in E[N0:N1,2]]
    fig_c, fig = my.plot_error(fig_c, fig, t[N0:N1], y, y0=0, y_lbl='E/<E>-1', tit='E/<E> - 1 | std = ' + my.str_sgn_round(np.std(y),3), pic_path=path, show_key=draw_on_screen)
    
    # 2
    path = os.path.join(graph_dir, 'Etot_' + time_gaps_str + '.png')
    y = [_x*params['Ntot'] for _x in E[N0:N1, 2]]
    fig_c, fig = my.plot_error(fig_c, fig, t[N0:N1], y, y0=np.mean(y), y_lbl='Etot', tit='Etot | std = ' + my.str_sgn_round(np.std(y),3), pic_path=path, show_key=draw_on_screen)
       
    # 3
    path = os.path.join(graph_dir, 'dE_normSQRT(N)_' + time_gaps_str + '.png')
    #y = [(e_el - E[N0,2])*mth.sqrt(params['Ntot']) for e_el in E[N0:N1,2]]
    y = [(e_el - E_av)*mth.sqrt(params['Ntot']) for e_el in E[N0:N1,2]]
    fig_c, fig = my.plot_error(fig_c, fig, t[N0:N1], y, y0=0, y_lbl='(E - <E>)/sqrt(N)', tit='Esqrt | std = ' + my.str_sgn_round(np.std(y),3), pic_path=path, show_key=draw_on_screen)
    
    # 4
    path = os.path.join(graph_dir, 'dE_' + time_gaps_str + '.png')
    #y = [(e_el - E[N0,2])*params['Ntot'] for e_el in E[N0:N1,2]]
    y = [(e_el - E_av)*params['Ntot'] for e_el in E[N0:N1,2]]
    fig_c, fig = my.plot_error(fig_c, fig, t[N0:N1], y, y0=0, y_lbl='E - <E>', tit='E - <E> | std = ' + my.str_sgn_round(np.std(y),3), pic_path=path, show_key=draw_on_screen)
       
    # 5
    path = os.path.join(graph_dir, 'Tmp_' + time_gaps_str + '.png')
    fig_c, fig = my.plot_error(fig_c, fig, t[N0:N1], Tmp, y0=Tmp_av, y_lbl='Tmp', tit='Tmp | std/Tmp = ' + my.str_sgn_round(np.std(Tmp)/Tmp_av,3), pic_path=path, show_key=draw_on_screen)
    
    if(draw_on_screen):
        input()
Ejemplo n.º 8
0
def main():
    args = sys.argv[1:]
    argc_min = 1
    if len(args) < argc_min:
        print('usage: ./diffusion.py model_name [keys, N0, N1, Nprt]')
        sys.exit(1)

    model_name, keys, graph_dir, time_gaps_str, N0, N1, Nfrm, E, Tmp, Tmp_av, t, stabTind, params = my.std_start(
        args, 0, 1, 2, 3)
    # std_start(args, model_i, N0_i, N1_i):
    # model_name, keys, graph_dir, time_gaps_str, N0, N1, Nfrm, E, Tmp, Tmp_av, t, stabTind, params

    if (len(args) < 4):
        Nprt = params['Ntot']
    else:
        Nprt = int(args[3])

    if (len(args) == 1):
        full_mode = 1
    else:
        full_mode = (my.find_key(keys, 'full_mode')
                     or my.find_key(keys, 'full'))
    if (full_mode and (Nfrm < int(Nfrm / 2) + 5)):
        print('too few frames for full_mode')
        sys.exit(1)

    draw_on_screen = my.find_key(keys, 'keep')
    if (not draw_on_screen):
        plt.switch_backend('Agg')
    make_pics = (my.find_key(keys, 'pics') or draw_on_screen)

    n0 = params['Ntot'] / math.pow(2 * params['R'], 3)
    sgm_th0 = 1
    lmd_th0 = 1 / (n0 * math.pi * math.sqrt(2))

    sgm_th2 = pow(2, 1 / 6) * math.sqrt(1 + 2 / (3 * Tmp_av))
    lmd_th2 = lmd_th0 / (sgm_th2 * sgm_th2)

    sgm_th1 = math.pow(
        (1 + math.sqrt(1 + 1.5 * Tmp_av + ((2 * n0)**2) * (n0**2 - 1))) / 2,
        -1 / 6)
    lmd_th1 = lmd_th0 / (sgm_th1 * sgm_th1)
    k_th = 4 * lmd_th1 * math.sqrt(2 * Tmp_av / (math.pi * params['mu']))

    r2 = []
    dr = [0, 0, 0]
    cubeSize = 2 * params['R']
    cubeSzEff = params['R']
    x_cm = []
    r_cm = []
    for n in range(N0, N1):
        x, v, m = my.read_frame(model_name, n)

        if (n == N0):
            # set start conditions
            x0 = cp.deepcopy(x)
            x_real = cp.deepcopy(x)
            x_prev = cp.deepcopy(x)
            r2.append(0)

            v_start_av = np.mean([my.length(_x) for _x in v])
        else:
            r2_sum = 0
            for i in range(Nprt):  # find <r^2> considering coords's shifts
                for j in range(3):
                    dx = x[i][j] - x_prev[i][j]
                    if (dx > cubeSzEff):  # re-shift coords
                        dx -= cubeSize
                    elif (dx < -cubeSzEff):
                        dx += cubeSize
                    x_real[i][j] += dx
                    # find real displacement
                    dr[j] = x_real[i][j] - x0[i][j]
                r2_sum += my.dot(dr, dr)
            r2.append(r2_sum / Nprt)
            x_prev = cp.deepcopy(x)
        x_cm.append(my.find_cm(x_real, m))
        r_cm.append(my.length(x_cm[-1]))

        if (draw_on_screen):
            print('diffusion progress: ' + str(
                (n + 1 - N0) / Nfrm * 100) + '%                     \r',
                  end='')

    fig_c = -1
    figs = []

    # -------------------------------- r_cm(t) ------------------------------------------
    if (make_pics):
        fig_c += 1
        figs.append(plt.figure(fig_c))
        cm = []
        std_cm = []
        x = t[N0:N1]
        t**s = ['x', 'y', 'z']
        for _j in range(3):
            cm.append([x_cm[_i][_j] - x_cm[0][_j] for _i in range(Nfrm)])
            std_cm.append(np.std(cm[_j]))
            plt.plot(x,
                     cm[_j],
                     '-',
                     label=t**s[_j] + '; std = ' +
                     str(my.str_sgn_round(std_cm[_j], 3)))  # experiment data
        x = [t[N0], t[N1 - 1]]
        plt.plot(x, [0, 0], '--')
        plt.ticklabel_format(style='sci', axis='y', scilimits=(0, 0))
        plt.ticklabel_format(style='sci', axis='x', scilimits=(0, 0))
        plt.xlabel('t')
        plt.ylabel('xyz_cm')
        plt.grid(True)
        plt.legend(bbox_to_anchor=(0., 1.02, 1., .102),
                   loc=3,
                   ncol=3,
                   mode="expand",
                   borderaxespad=0.)
        if (draw_on_screen):
            figs[fig_c].show()
        path = os.path.join(graph_dir, 'xyz_cm(t)_' + time_gaps_str + '.png')
        figs[fig_c].savefig(path)

    c2 = int(Nfrm / 2)
    if (full_mode):
        c1 = int(Nfrm / 4)
        c3 = int(Nfrm / 100)
        c4 = int(Nfrm / 8)
        x = my.arrFnc(t[(N0 + c2):(N1 - c4)], math.log)
        y = my.arrFnc(r2[c2:-c4], math.log)
        logEnd_approx = np.poly1d(np.polyfit(x, y, 1))
        x = my.arrFnc(t[N0 + 1:c3], math.log)
        y = my.arrFnc(r2[1:c3], math.log)
        logBeg_approx = np.poly1d(np.polyfit(x, y, 1))
        x = t[N0 + 1:c3]
        y = my.arrFnc(r2[1:c3], math.sqrt)
        approx_r1 = np.poly1d(np.polyfit(x, y, 1))
    else:
        c1 = 0
    approx_r2 = np.poly1d(np.polyfit(t[(N0 + c1):N1], r2[c1:], 1))
    k_exp = approx_r2.c[0]
    bad_k_exp = (k_exp < my.myeps)
    if (bad_k_exp):
        if (k_exp < 0):
            k_exp = -k_exp
        if (k_exp < my.myeps):
            k_exp = my.myeps

    # -------------------------------- r2(t) ------------------------------------------
    if (make_pics):
        fig_c += 1
        figs.append(plt.figure(fig_c))
        plt.plot(t[N0:N1], r2, '-')  # experiment data
        x = [t[N0], t[N1 - 1]]
        plt.plot(x, [approx_r2(_x) for _x in x],
                 '--')  # line experiment approximation

        tau = abs(approx_r2(0)) / k_exp
        x = t[N0:N1]
        y = [k_exp * (_x - tau + tau * pow(math.e, -_x / tau)) for _x in x]
        #plt.plot(x, [k_exp*(_x - tau + tau*math.exp(-_x/tau)) for _x in x], '--') # non-line experiment approximation
        plt.plot(x, y, '--')  # non-line experiment approximation

        #plt.plot([t[c2], t[c2]], [min(r2), max(r2)], '--') # last part boundary
        plt.ticklabel_format(style='sci', axis='y', scilimits=(0, 0))
        plt.ticklabel_format(style='sci', axis='x', scilimits=(0, 0))
        plt.xlabel('t')
        plt.ylabel('<r^2>')
        plt.grid(True)
        #plt.title('r^2(t) | k_exp = ' + str(my.str_sgn_round(k_exp,3)) + ', k_th = ' + str(my.str_sgn_round(k_th,3)))
        plt.title('r^2(t)')
        if (draw_on_screen):
            figs[fig_c].show()
        path = os.path.join(graph_dir, 'r2(t)_' + time_gaps_str + '.png')
        figs[fig_c].savefig(path)

    lmd_1 = k_exp / 4 * math.sqrt(math.pi * params['mu'] / (Tmp_av * 2))
    sgm_1 = 1 / math.sqrt(n0 * math.pi * lmd_1 * math.sqrt(2))
    lmd_4 = math.sqrt(abs(approx_r2(0)) * math.pi * 3) / 4

    if (draw_on_screen):
        print('Tmp_av = ', Tmp_av)
        print('sgm_th1 = ', sgm_th1)
        print('lmd_th1 = ', lmd_th1)
        print('sgm_1 = ', sgm_1)
        print('lmd_1 = ', lmd_1)
        print('lmd_4 = ', lmd_4)
    if (full_mode):
        i_log = 2
        while (1):
            tg = math.log(r2[i_log + 10] / r2[i_log]) / math.log(
                t[N0 + i_log + 10] / t[N0 + i_log])
            if (abs(2 - tg) > 0.2):
                break
            i_log += 1
            if (i_log >= N1 - N0 - 10):
                break
        stab_time_log = t[i_log]

        i_r1 = 2
        r1 = my.arrFnc(r2, math.sqrt)
        while (1):
            tg = (r1[i_r1 + 10] - r1[i_r1]) / (t[N0 + i_r1 + 10] -
                                               t[N0 + i_r1]) / v_start_av
            if (abs(tg - 1) > 0.18):
                break
            i_r1 += 1
            if (i_r1 >= N1 - N0 - 10):
                break
        stab_time_r1 = t[i_r1]

        #lmd_2 = 2 * stab_time * math.sqrt(2*Tmp_av / (math.pi*params['mu']))
        # it's incorrect to calculate lmd this way here, because in the beggining V doesn't have maxwell distribution
        lmd_2 = stab_time_log * v_start_av
        lmd_3 = stab_time_r1 * v_start_av
        sgm_2 = 1 / math.sqrt(n0 * math.pi * lmd_2 * math.sqrt(2))
        sgm_3 = 1 / math.sqrt(n0 * math.pi * lmd_3 * math.sqrt(2))
        stab_time_th = lmd_th1 / 2 * math.sqrt(math.pi * params['mu'] /
                                               (2 * Tmp_av))
        if (draw_on_screen):
            print('stab_time_th = ', stab_time_th)
            print('stab_time_log = ', stab_time_log)
            print('stab_time_r1 = ', stab_time_r1)
            print('sgm_2 = ', sgm_2)
            print('lmd_2 = ', lmd_2)
            print('r2 = ', math.sqrt(r2[i_log]))
            print('sgm_3 = ', sgm_3)
            print('lmd_3 = ', lmd_3)
            print('r1 = ', r1[i_r1])
        else:
            print(n0, Tmp_av, lmd_th0, lmd_th1, lmd_th2, lmd_1, lmd_2, lmd_3,
                  lmd_4)

        if (make_pics):
            # -------------------------------- log(r2)(log(t)) ------------------------------------------
            fig_c += 1
            figs.append(plt.figure(fig_c))
            plt.plot(t[N0:N1], r2, '-')  # experiment data
            x = [t[N0 + 1], t[N1 - 1]]
            plt.plot(x, [math.exp(logBeg_approx(math.log(_x))) for _x in x],
                     '--')  # beginning approximation
            plt.plot(x, [math.exp(logEnd_approx(math.log(_x))) for _x in x],
                     '--')  # ending approximation
            #plt.plot(x, [lmd_th1**2, lmd_th1**2], '--')
            #plt.plot(x, [lmd_1**2, lmd_1**2], '--')
            #plt.plot([stab_time_th, stab_time_th], [min(r2), max(r2)], '--')
            #plt.plot([t[c2], t[c2]], [min(r2), max(r2)], '--')

            plt.xlabel('t')
            plt.ylabel('<r^2>')
            plt.grid(True)
            plt.xscale('log')
            plt.yscale('log')
            plt.title('log(r2) | k_begin = ' +
                      str(my.str_sgn_round(logBeg_approx.c[0], 3)) +
                      '; k_end = ' +
                      str(my.str_sgn_round(logEnd_approx.c[0], 3)))
            if (draw_on_screen):
                figs[fig_c].show()
            path = os.path.join(graph_dir,
                                'r2(t)_loglog_' + time_gaps_str + '.png')
            figs[fig_c].savefig(path)

            # -------------------------------- r(t) ------------------------------------------
            fig_c += 1
            figs.append(plt.figure(fig_c))
            plt.plot(t[N0:N1], r1, '-')  # experiment data
            x = [t[N0 + 1], t[c4]]
            plt.plot(x, [approx_r1(_x) for _x in x],
                     '--')  # beginning approximation
            #plt.plot(x, [lmd_th1, lmd_th1], '--')
            #plt.plot([stab_time_th, stab_time_th], [min(r1), max(r1)], '--')
            #plt.plot([stab_time_r1, stab_time_r1], [min(r1), max(r1)], '--')
            #plt.plot([t[c2], t[c2]], [min(r1), max(r1)], '--')

            plt.xlabel('t')
            plt.ylabel('sqrt(<r^2>)')
            plt.grid(True)
            #plt.title('sqrt(r2) | l_th = ' + str(my.str_sgn_round(lmd_th1,3)) + '; l_3 = ' + str(my.str_sgn_round(lmd_3,3)) + '; l_2 = ' + str(my.str_sgn_round(lmd_2,3)))
            plt.title('sqrt(<r^2>)')
            if (draw_on_screen):
                figs[fig_c].show()
            path = os.path.join(graph_dir, 'r1(t)_' + time_gaps_str + '.png')
            figs[fig_c].savefig(path)

    if (draw_on_screen):
        input()