diff --git a/final_plots.py b/final_plots.py index df0c95a5a34593a643ebf4f30be5320a87405219..bf19f33d42b73726c69b49ca471b244200293214 100644 --- a/final_plots.py +++ b/final_plots.py @@ -18,6 +18,7 @@ from scipy.special import jn import settings from data_management import DataManager, KondoImport from kondo import gen_init_matrix +from numbers import Number # In this program all energies are given in units of the RTRG Kondo # temperature Tkrg, which is an integration constant of the E-flow RG @@ -234,21 +235,41 @@ def export_omega5(): np.savetxt(file, np.array([vac[i]/omega, vdc[i]/omega, np.pi*gdc[i], idc[i], iac[i]]).T) -def export_omega5_interp( - filename = "figdata/omega5_interp.npz", - omega = 16.5372, - vdc_min = 0, - vdc_max = 165.372, - vac_min = 0, - vac_max = 165.372, - dc_res = 301, - ac_res = 201, +def export_interp( + filename, + fixed_parameter, + fixed_value, + x_parameter, + y_parameter, + x_arr, + y_arr, + x_sort_parameter = None, + y_sort_parameter = None, + x_func = None, + y_func = None, korder = 2, + special_selection = None, + **parameters ): """ - Export interpolated data for given parameters. + Export interpolated data. Parameters: + + filename: string, file path + fixed_parameter: name of fixed parameter (e.g. "omega") + fixed_value: value of fixed parameter (e.g. 16.5372) + x_parameter: name of x axis parameter (e.g. "vdc") + y_parameter: name of y axis parameter (e.g. "vac") + x_sort_parameter: name of x axis parameter for sorting + y_sort_parameter: name of y axis parameter for sorting + x_func: function to obtain x value from data + y_func: function to obtain y value from data + korder: order of spline interpolation + special_selection: function for filtering input data. Arguments: + data, order, method, padding, **kwargs + Data are stored with units e=hbar=kB=Tkrg=1. All results are exported as 2d arrays of the same shape. + The parameters vdc and vac are included as 2d arrays. Results have the naming convention {observable}_{order}{padding}_{method}_{suffix} @@ -281,23 +302,20 @@ def export_omega5_interp( "_ispline" data is derived from spline interpolation for the current (dc or ac) """ + assert isinstance(filename, str) + if x_func is None: + x_func = lambda data: data[x_parameter] + if y_func is None: + y_func = lambda data: data[y_parameter] + x_mesh, y_mesh = np.meshgrid(x_arr, y_arr) + mesh = (x_mesh, y_mesh) dm = DataManager() - data = dm.list( - omega = omega, - vdc = None, - vac = None, - method = None, - d = 1e9, - xL = 0.5, - solver_tol_rel = 1e-8, - solver_tol_abs = 1e-10, - voltage_branches = 4, - ) + data = dm.list(**{fixed_parameter:fixed_value}, **parameters) global_bad_flags = DataManager.SOLVER_FLAGS["simplified_initial_conditions"] \ | DataManager.SOLVER_FLAGS["extrapolate_voltage"] \ | DataManager.SOLVER_FLAGS["deleted"] data = data.loc[data.solver_flags & global_bad_flags == 0] - data = data.sort_values(["vac", "vdc"]) + data = data.sort_values([x_sort_parameter or x_parameter, y_sort_parameter or y_parameter]) required_flags = dict( o2 = DataManager.SOLVER_FLAGS["second_order_rg_equations"], o3 = 0, @@ -321,72 +339,69 @@ def export_omega5_interp( selected &= data["padding"] == 0 for key, value in kwargs.items(): selected &= (data[key] == value) + if special_selection is not None: + selected &= special_selection(data, order, method, padding, **kwargs) return selected - vac_arr = np.linspace(0, vac_max, ac_res) - vdc_arr = np.linspace(0, vdc_max, dc_res) - vdc_mesh, vac_mesh = np.meshgrid(vdc_arr, vac_arr) - def gen_data(order, method, padding=False, s=5e-5, **kwargs): suffix = "_p" if padding else "" reduced_data = data.loc[selection(order, method, padding, **kwargs)] settings.logger.info(f"Starting with {order}{suffix} {method}, found {reduced_data.shape[0]} data points") results = {} - if reduced_data.shape[0] < 100 \ - or reduced_data.vdc.max() - reduced_data.vdc.min() < 10 \ - or reduced_data.vac.max() - reduced_data.vac.min() < 10: + if reduced_data.shape[0] < 100: return results + xy_data = (x_func(reduced_data), y_func(reduced_data)) try: results[f"gdc_{method}_{order}{suffix}"] = griddata( - (reduced_data.vdc, reduced_data.vac), + xy_data, reduced_data.dc_conductance, - (vdc_mesh, vac_mesh), + mesh, method="cubic") - #gdc_tck = bisplrep(reduced_data.vac, reduced_data.vdc, reduced_data.dc_conductance, s=s, kx=korder, ky=korder) - #results[f"gdc_{method}_{order}{suffix}"] = bisplev(vac_arr, vdc_arr, gdc_tck) + #gdc_tck = bisplrep(reduced_data[y], reduced_data[x], reduced_data.dc_conductance, s=s, kx=korder, ky=korder) + #results[f"gdc_{method}_{order}{suffix}"] = bisplev(y_arr, x_arr, gdc_tck) except: settings.logger.exception(f"in griddata interpolation of Gdc for {order}{suffix} {method}") try: results[f"idc_{method}_{order}{suffix}"] = griddata( - (reduced_data.vdc, reduced_data.vac), + xy_data, reduced_data.dc_current, - (vdc_mesh, vac_mesh), + mesh, method="cubic") except: settings.logger.exception(f"in griddata interpolation of Idc for {order}{suffix} {method}") try: - idc_tck = bisplrep(reduced_data.vac, reduced_data.vdc, reduced_data.dc_current, s=s, kx=korder, ky=korder) - results[f"idc_{method}_{order}{suffix}_spline"] = bisplev(vac_arr, vdc_arr, idc_tck) - results[f"gdc_{method}_{order}{suffix}_ispline"] = bisplev(vac_arr, vdc_arr, idc_tck, dy=1) + idc_tck = bisplrep(*xy_data[::-1], reduced_data.dc_current, s=s, kx=korder, ky=korder) + results[f"idc_{method}_{order}{suffix}_spline"] = bisplev(y_arr, x_arr, idc_tck) + results[f"gdc_{method}_{order}{suffix}_ispline"] = bisplev(y_arr, x_arr, idc_tck, dy=1) except: settings.logger.exception(f"in spline interpolation of Idc for {order}{suffix} {method}") try: results[f"iac_{method}_{order}{suffix}"] = griddata( - (reduced_data.vdc, reduced_data.vac), + xy_data, 2*reduced_data.ac_current_abs, - (vdc_mesh, vac_mesh), + mesh, method="cubic") except: settings.logger.exception(f"in griddata interpolation of Iac for {order}{suffix} {method}") try: - iac_tck = bisplrep(reduced_data.vac, reduced_data.vdc, 2*reduced_data.ac_current_abs, s=s, kx=korder, ky=korder) - results[f"iac_{method}_{order}{suffix}_spline"] = bisplev(vac_arr, vdc_arr, iac_tck) - results[f"gac_{method}_{order}{suffix}_ispline"] = bisplev(vac_arr, vdc_arr, iac_tck, dx=1) + iac_tck = bisplrep(*xy_data[::-1], 2*reduced_data.ac_current_abs, s=s, kx=korder, ky=korder) + results[f"iac_{method}_{order}{suffix}_spline"] = bisplev(y_arr, x_arr, iac_tck) + results[f"gac_{method}_{order}{suffix}_ispline"] = bisplev(y_arr, x_arr, iac_tck, dx=1) except: settings.logger.exception(f"in spline interpolation of Iac for {order}{suffix} {method}") try: results[f"phase_{method}_{order}{suffix}"] = griddata( - (reduced_data.vdc, reduced_data.vac), + xy_data, reduced_data.ac_current_phase, - (vdc_mesh, vac_mesh), + mesh, method="cubic") except: settings.logger.exception(f"in griddata interpolation of phase for {order}{suffix} {method}") try: results[f"gamma_{method}_{order}{suffix}"] = griddata( - (reduced_data.vdc, reduced_data.vac), + xy_data, reduced_data.gamma, - (vdc_mesh, vac_mesh), + mesh, method="cubic") except: settings.logger.exception(f"in griddata interpolation of gamma for {order}{suffix} {method}") @@ -394,8 +409,7 @@ def export_omega5_interp( np.savez( filename, - vdc = vdc_arr, - vac = vac_arr, + **{fixed_parameter:fixed_value, x_parameter:x_mesh, y_parameter:y_mesh}, **gen_data("o2", "mu"), **gen_data("o3", "mu"), **gen_data("o3a", "mu"), @@ -411,6 +425,67 @@ def export_omega5_interp( ) +def export_omega5_interp( + filename = "figdata/omega5_interp.npz", + omega = 16.5372, + vdc_min = 0, + vdc_max = 165.372, + vac_min = 0, + vac_max = 165.372, + dc_res = 301, + ac_res = 201, + korder = 2, + vdc_max_J = 82.686, + vac_max_J = 82.686, + ): + """ + Export interpolated data for fixed frequency omega. + """ + parameters = dict(d=1e9, solver_tol_rel=1e-8, solver_tol_abs=1e-10, voltage_branches=4, xL=0.5) + def special_selection(data, order, method, padding, **kwargs): + if method == "J": + return (data["vdc"] < vdc_max_J + 1e-3) & (data["vac"] < vac_max_J + 1e-3) + return True + export_interp(filename, + fixed_parameter = "omega", + fixed_value = omega, + x_parameter = "vdc", + y_parameter = "vac", + x_arr = np.linspace(vdc_min, vdc_max, dc_res), + y_arr = np.linspace(vac_min, vac_max, ac_res), + korder = korder, + special_selection = special_selection, + **parameters) + + +def export_vdc0_interp( + filename = "figdata/vdc0_interp.npz", + omega_min = 0.05, + omega_max = 20, + vac_omega_min = 0, + vac_omega_max = 10, + omega_res = 101, + vac_res = 101, + korder = 2, + ): + """ + Export interpolated data for fixed frequency omega. + """ + parameters = dict(d=1e9, solver_tol_rel=1e-8, solver_tol_abs=1e-10, voltage_branches=0, xL=0.5) + export_interp(filename, + fixed_parameter = "vdc", + fixed_value = 0, + x_parameter = "omega", + y_parameter = "vac_omega", + y_sort_parameter = "vac", + x_arr = np.linspace(omega_min, omega_max, omega_res), + y_arr = np.linspace(vac_omega_min, vac_omega_max, vac_res), + y_func = (lambda data: data["vac"]/data["omega"]), + korder = korder, + special_selection = (lambda data, *args, **kwargs: data["omega"] > 0), + **parameters) + + def prepare_plotly_csv(): dm = DataManager() # General overview diff --git a/plot.py b/plot.py index 8611536da8675228cb338518bbd112f202295add..9c90fd1bf934ec2fd86cd904429f3dfdf6f5ae95 100644 --- a/plot.py +++ b/plot.py @@ -1721,6 +1721,27 @@ def RGeq_comparison_contours( plt.show() +def contours_to_coordinates(contour): + for level, collection in zip(contour.levels, contour.collections): + for path in collection.get_paths(): + yield level, path.vertices + +def contours_to_coordinates_unified(contour): + for level, vertices in contours_to_coordinates(contour): + array = np.empty((vertices.shape[0], 3), dtype=np.float64) + array[:,:2] = vertices + array[:,2] = level + yield array + +def save_contour_coordinates(contour, filename, x, y, z): + """For usage in pgf plots. Overwrites filename.""" + with open(filename, "w") as file: + print(f"{x} {y} {z}", file=file) + for array in contours_to_coordinates_unified(contour): + np.savetxt(file, array, "%.6f") + print(file=file) + + def RGeq_comparison_contours2( dm = None, filename = "figdata/omega5_interp.npz", @@ -1738,13 +1759,16 @@ def RGeq_comparison_contours2( levels = (1/np.linspace(1, 12, 12)[::-1]) / prefactor fig, ax = plt.subplots(nrows=1, ncols=1, sharex=True, sharey=True) for approx in approximations: - ax.contour(vdc, vac, data[f"{observable}_mu_{approx}"], levels, zorder=zorder[approx], colors=colors[approx], **kwargs) + contour = ax.contour(vdc, vac, data[f"{observable}_mu_{approx}"], levels, zorder=zorder[approx], colors=colors[approx], **kwargs) + save_contour_coordinates(contour, f"figdata/contour_{observable}_mu_{approx}.dat", "vdc", "vac", "gdc") try: - ax.contour(vdc, vac, data[f"{observable}_J_{approx}"], levels, zorder=zorder[approx], colors=colors[approx], **kwargs) + contour = ax.contour(vdc, vac, data[f"{observable}_J_{approx}"], levels, zorder=zorder[approx], colors=colors[approx], **kwargs) + save_contour_coordinates(contour, f"figdata/contour_{observable}_J_{approx}.dat", "vdc", "vac", "gdc") except KeyError: settings.logger.warning(f"No data available for {observable}_J_{approx}") try: - ax.contour(vdc, vac, data[f"{observable}_J_{approx}_p"], levels, zorder=zorder[approx], colors=colors[approx], **kwargs) + contour = ax.contour(vdc, vac, data[f"{observable}_J_{approx}_p"], levels, zorder=zorder[approx], colors=colors[approx], **kwargs) + save_contour_coordinates(contour, f"figdata/contour_{observable}_J_{approx}_p.dat", "vdc", "vac", "gdc") except KeyError: settings.logger.warning(f"No data available for {observable}_J_{approx}_p")