def plot_system_temperature(dir): items = os.listdir(dir) log_files = [] for name in items: if name[:13] == "log.boundary_": log_files.append(name) log_files = sorted(log_files) n_files = len(log_files) for file in log_files: with open(dir + file, "r") as infile: contents = infile.readlines() i = 0 while i < len(contents): if "on 4 procs for 5000 steps with" in contents[i]: words = contents[i].split(" ") n_atoms = int(words[-2]) break i += 1 log = lammps_logfile.File(dir + file) time = log.get("v_time") Ek = log.get("KinEng") T = log.get("Temp") std = np.std(T[int(1 / 5 * len(T)):]) plt.plot(time, T, label=rf'# of atoms: {n_atoms}. $\sigma_T = {std:.4f}$') plt.legend() plt.xlabel(r"Time $[\tau]$") plt.ylabel(r"Temperature $[Tk_b/\epsilon]$") plt.show()
def plot_pressure(dir): dir_files = os.listdir(dir) log_files = [] for file in dir_files: if file[:6] == "log.T_": log_files.append(file) n_files = len(log_files) mean_temp = np.zeros(n_files) mean_press = np.zeros(n_files) for i, filename in enumerate(log_files): log = lammps_logfile.File(dir + filename) temp = log.get("Temp") press = log.get("Press") equil = int(len(temp) * 0.5) mean_temp[i] = np.mean(temp[equil:-1]) mean_press[i] = np.mean(press[equil:-1]) idx = np.argsort(mean_temp) plt.plot(mean_temp[idx], mean_press[idx], label='Simulation results') plt.plot(mean_temp[idx], idea_gas_law(mean_temp[idx]), label='Ideal gas law') plt.ylabel(r"Pressure $[P\sigma^3 / \epsilon]$") plt.xlabel(r"Temperature $[ Tk_b/\epsilon]$") plt.legend() plt.show()
def plot_radial_distribution(dir, n_time_steps=5000, step_window=100, n_bins=50, n_info_lines=3): dir_files = os.listdir(dir) log_files = [] for file in dir_files: if file[:7] == "log.rdf": log_files.append(file) # log_files = np.sort(log_files) log_files = natsort.natsorted(log_files) print(log_files) # T_init_vals = list(range(20, 300, 20)) for i, file in enumerate(log_files): # T_init = float(file[10:]) T = int(file[10:]) # T = T_init_vals[i] log = lammps_logfile.File(dir + f"log.rdf_T_{T}") # T = log.get("Temp") # idx = len(T) / 2 bins, radials = read_rdf_dump(dir, file) # T_mean = np.mean(T) plt.plot(bins, radials / radials[-1], label=f"T={T:d}") plt.legend(loc=1) plt.xlabel(r"$r$") plt.ylabel(r"$g(r)$") plt.show()
def plot_radial_distribution(dir, n_time_steps = 5000, step_window = 100, n_bins = 50, n_info_lines = 3): dir_files = os.listdir(dir) log_files = [] for file in dir_files: if file[:7] == "tmp.rdf": log_files.append(file) log_files = np.sort(log_files) # print(log_files) T_init_vals = [0.1, 1, 5] print(T_init_vals) for i, file in enumerate(log_files): T_init = float(file[10:]) log = lammps_logfile.File(dir + f"log.rdf_T_{T_init_vals[i]}") T = log.get("Temp") idx = len(T) / 2 bins, radials = read_rdf_dump(dir, file) T_mean = np.mean(T) plt.plot(bins, radials/radials[-1], label=f"T={T_mean:.2f}") plt.legend() plt.xlabel(r"$r$") plt.ylabel(r"$g(r)$") plt.show()
def plot_thermostat(dir): log_be = lammps_logfile.File(dir + "log.berendsen") log_nh = lammps_logfile.File(dir + "log.nosehoover") T_be = log_be.get("Temp") T_nh = log_nh.get("Temp") t = np.linspace(0, len(T_be)*0.005, len(T_be)) plt.plot(t, T_be, label='Berendsen') plt.plot(t, T_nh, label='Nosé-Hoover') plt.xlabel(r"t") plt.ylabel(r"T") plt.legend() plt.show()
def plotTemp(dir, filename): log = lammps_logfile.File(dir + filename) time = log.get("v_time", run_num=2) temp = log.get("c_moving_temp", run_num=2) plt.plot(time, temp) plt.xlabel(r"$t/\tau$") plt.ylabel(r"$T/T_0$") plt.show()
def update_timings(self, t0): t1 = time.time() self.elapsed_time = t1 - t0 try: log = lammps_logfile.File( os.path.join(self.path, self.outfile_name)) remaining_time = log.get('CPULeft', run_num=-1) except: remaining_time = None if remaining_time is None: self.remaining_time = 0.0 else: self.remaining_time = round(remaining_time[-1])
def diffusion(dir, filename): log = lammps_logfile.File(dir + filename) dt = 0.005 time = np.array(log.get("v_time", run_num=2)) msd = np.array(log.get("c_my_msd[4]", run_num=2)) timeFinal = time[-1] coeff = np.polyfit(time, msd, deg=1)[0] D = coeff / (6 * timeFinal) print(f"Estimated diffusion coefficient: D={D:.3f}") plt.plot(time, msd) plt.xlabel(r"$t$") plt.ylabel(r"$\langle r^2(t) \rangle $") plt.show()
def plot_diffusion(dir): dir_files = os.listdir(dir) log_files = [] for file in dir_files: if file[:7] == "log.msd": log_files.append(file) msd_vals = [] T_vals = [] dt = 1.0 log_files = natsort.natsorted(log_files) for i, filename in enumerate(log_files): log = lammps_logfile.File(dir + filename) msd = log.get("c_msd[4]", run_num=0) # print(msd) msd_vals.append(msd) T_vals.append(str(filename[10:])) t_vals = np.linspace(0, len(msd_vals[0]) * 10, len(msd_vals[0])) for i in range(len(log_files)): plt.plot(t_vals, msd_vals[i], label=f'T={T_vals[i]}') plt.xlabel(r"$t$ [fs]") plt.ylabel(r"$\langle r^2(t) \rangle$ [A$^2$]") plt.legend() plt.show() D_vals = [] idx = 20 for i in range(len(log_files)): D_vals.append( np.polyfit(t_vals[-idx:], msd_vals[i][-idx:], deg=1)[0] / 6) plt.scatter(T_vals, D_vals) plt.xlabel(r"$T$ [K]") plt.ylabel(r"$D(T)$ [A$^2$/fs]") plt.show()
def plot_diffusion(dir): dir_files = os.listdir(dir) log_files = [] for file in dir_files: if file[:7] == "log.msd": log_files.append(file) msd_vals = [] T_vals = [] dt = 0.005 # in units tau = 2.1569e3 fs log_files = np.sort(log_files) for i, filename in enumerate(log_files): log = lammps_logfile.File(dir + filename) msd = log.get("c_msd[4]") msd_vals.append(msd) T_vals.append(str(filename[10:])) t_vals = np.linspace(0, len(msd_vals[0]) * 100 * dt, len(msd_vals[0])) for i in range(len(log_files)): plt.plot(t_vals, msd_vals[i], label=f'T={T_vals[i]}') plt.xlabel(r"$t$ $[\tau]$") plt.ylabel(r"$\langle r^2(t) \rangle$ $[\sigma^2]$") plt.legend() plt.show() D_vals = [] for i in range(len(log_files)): D_vals.append(np.polyfit(t_vals[-5:], msd_vals[i][-5:], deg=1)[0] / 6) plt.scatter(T_vals, D_vals) plt.xlabel(r"$T$ $[\epsilon/k_B]$") plt.ylabel(r"$D(T)$ $[\sigma^2/ \tau]$") plt.show()
def energy_vs_dt(dir): items = os.listdir(dir) log_files = [] for name in items: if name[:6] == "log.dt": log_files.append(name) log_files = sorted(log_files) n_files = len(log_files) for file in log_files: log = lammps_logfile.File(dir + file) dt = float(file[7:]) time = log.get("v_time") etot = log.get("TotEng") plt.plot(time, etot, label=rf"$\Delta t = {dt}$") plt.legend() plt.xlabel(r"Time $[\tau]$") plt.ylabel(r"Energy $[\epsilon]$") plt.show()
def plot_pressure_grid(dir): dir += "press_vs_temp_density/" temps = [1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0] press = [0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1.0] n_temps = len(temps) n_rhos = len(press) dirs = os.listdir(dir) dirs = sorted(dirs) press_grid = np.zeros((n_rhos, n_temps)) for i, d in enumerate(dirs): log_files = os.listdir(dir + d) n_files = len(log_files) mean_temp = np.zeros(n_files) mean_press = np.zeros(n_files) density = float(d[3:]) for j, filename in enumerate(log_files): log = lammps_logfile.File(dir + d + "/" + filename) temp = log.get("Temp") press = log.get("Press") equil = int(len(temp) * 7 / 10) mean_temp[j] = np.mean(temp[equil:-1]) mean_press[j] = np.mean(press[equil:-1]) idx = np.argsort(mean_temp) press_grid[i, :] = mean_press[idx] if density != 0.5 and density != 1.0: plt.plot(mean_temp[idx], mean_press[idx], label=rf'$\rho={density}$') plt.xlabel(r"Pressure $[P\sigma^3 / \epsilon]$") plt.ylabel(r"Temperature $[ Tk_b/\epsilon]$") plt.legend() plt.show()
import os import matplotlib.pyplot as plt import lammps_logfile log = lammps_logfile.File(os.path.join(os.path.dirname(__file__), "logfiles", "crack_log.lammps")) print("Log keywords: ", log.get_keywords()) x = log.get("Time") y = log.get("Pyy") plt.figure(figsize=(6,6)) plt.subplot(221) plt.plot(x, y) plt.xlabel("$t$") plt.ylabel("$p_{yy}$") plt.subplot(222) for i in range(log.get_num_partial_logs()): x = log.get("Time", run_num=i) y = log.get("Pyy", run_num=i) plt.plot(x, y) plt.xlabel("$t$") plt.ylabel("$p_{yy}$") plt.subplot(223) x = log.get("Time") y = log.get("Temp") plt.plot(x, y) plt.xlabel("$t$")
r_vec = np.zeros(n_files) phi_vec = np.zeros(n_files) vcm_vec = np.zeros(n_files) for i, filename in enumerate(log_files): idx_k = filename.index("_r") idx_phi = filename.index("phi") r = filename[idx_k + 2:idx_k + 5] phi = filename[idx_phi + 3:idx_phi + 7] r_vec[i] = r phi_vec[i] = phi log = lammps_logfile.File(data_dir + filename) vcm = log.get("v_velocity_cm", run_num=0) if type(vcm) is np.ndarray: avg_vcm = np.mean(vcm) vcm_vec[i] = avg_vcm else: print(f"no vcm data in file {filename}") # exit() sorted_idx = np.argsort(r_vec) r_vec = r_vec[sorted_idx] phi_vec = phi_vec[sorted_idx] vcm_vec = vcm_vec[sorted_idx] # print(r_vec) # print(phi_vec) print(vcm_vec)
def setUp(self): self.log = lammps_logfile.File(os.path.join(os.path.dirname(__file__), "data", "log.lammps"))
def silicon_diffusion(dir): files_dir = os.listdir(dir) log_files = [] for file in files_dir: if "log.T" in file: log_files.append(file) log_files = np.sort(log_files) # data_dict = {} # avg_temps = [] msd_vals = [] T_vals = [] for file in log_files: log = lammps_logfile.File(os.path.join(dir, file)) T = log.get("Temp") # size = T_temp.shape[0] # size_2 = size//2 # T = T_temp[size_2:] t = log.get("Time")#[size_2:] msd = log.get("c_msd[4]")#[size_2:] # avg_temp = int(np.mean(T[int(len(T)/4):])) # avg_temps.append(avg_temp) # data_dict["T_" + str(avg_temp)] = T # data_dict["msd_" + str(avg_temp)] = msd msd_vals.append(msd) T_vals.append(T[0]) # plt.plot(t, msd, label=f'T={avg_temp}') n_files = len(log_files) for i in range(n_files): plt.plot(t, msd_vals[i], label=f'T={T_vals[i]}') plt.legend() plt.xlabel(r"$t$") plt.ylabel(r"$\langle r^2(t) \rangle$") plt.show() plt.clf() diffusion = np.zeros(n_files) # plt.plot() # idx1 = int(len(t)/2) idx2 = int(len(t)/10) for i in range(n_files): # diffusion[i] = np.polyfit(t[:-5], data_dict["msd_" + str(avg_temps[i])][:-5], deg=1)[0]/6 # diffusion[i] = np.polyfit(t[:-idx], msd_vals[i][:-idx], deg=1)[0] / 6 diffusion[i] = np.polyfit(t[-idx1:-idx2], msd_vals[i][-idx1:-idx2], deg=1)[0] / 6 # a, b = np.polyfit(T_vals, diffusion, deg=1) T_fit_vals = np.linspace(0, 8000, len(T_vals)) # plt.plot(T_vals, np.linspace(0, T_vals[-1], len(T_vals))*a + b, label='Line fit') # plt.plot(T_fit_vals, T_fit_vals*a + b) # plt.scatter(-b/a, 0, label=rf'Approximate melting point $T = {-b/a:.0f}K$') plt.scatter(T_vals, diffusion, c="g")#, label="Simulated results") plt.xlabel("T") plt.ylabel("D(T)") # plt.plot([1687, 1687], [-2.5, diffusion.max()], "b--", label=r"Experimental melting point $T = 1687$K") # plt.plot([3538, 3538], [0, diffusion.max()], "r--", label="Experimental boiling point") plt.legend() plt.show()