diff --git a/plotter/Args.py b/plotter/Args.py index e1c1947e7d1e46124913cb5ca6fec9c9a9c86202..4b8170359331e1347515d4ef2ed6c598c4901610 100644 --- a/plotter/Args.py +++ b/plotter/Args.py @@ -1,7 +1,7 @@ import sys import numpy as np class Args: - def __init__(self, filename, func, var=None, mval=None, oname=None, out=None, ndim = None, min_y = None, max_y = None, title=None, levels=None): + def __init__(self, filename, func, var=None, mval=None, oname=None, out=None, ndim = None, min_y = None, max_y = None, title=None, levels=None, plane_type = None, slice_position = None): if out == "plotter_lib_pngs/": print("Output directory name can't be equal to " + out) sys.exit(-1) @@ -17,6 +17,8 @@ class Args: self.min_y = min_y self.max_y = max_y self.levels = levels + self.plane_type = plane_type + self.slice_position = slice_position self.CorrVals() diff --git a/plotter/Plotter.py b/plotter/Plotter.py index d8effa125be27bb6cc32ee7d7bed427fc3259255..3e6979ccb45955516dcfeb66933477bedc1e87ce 100755 --- a/plotter/Plotter.py +++ b/plotter/Plotter.py @@ -28,6 +28,8 @@ class Plotter: self.min_y = None self.max_y = None self.min_max_var_vals = None + self.plane_type = None + self.slice_position = None def __check_arg_dim_equiv(self, args): if args.var != None and args.mval != None: @@ -42,7 +44,6 @@ class Plotter: names = d.variable_names var_names.append(np.array(names, dtype=object)) - if(len(var_names) > 1): for i in range(1, len(var_names)): if np.equal(var_names[0], var_names[i]).any() != True: @@ -67,6 +68,8 @@ class Plotter: self.title = args.title self.min_y = args.min_y self.max_y = args.max_y + self.plane_type = args.plane_type + self.slice_position = args.slice_position if args.levels != None: self.levels = args.levels @@ -77,7 +80,6 @@ class Plotter: self.if_save_result = kwargs.get('if_save_result', True) pData = [] - for fname in self.filename: p = ProcData(fname) p.get_variable_names() @@ -92,7 +94,7 @@ class Plotter: self.ndim = 1 elif args.func == self.plot_contour or args.func == self.ani_plot_contour: self.ndim = 2 - elif args.func == self.avg_plot: + elif args.func == self.avg_plot or args.func == self.slice: self.ndim = 3 if self.var == None and len(self.file_column_names) != 0: @@ -440,6 +442,75 @@ class Plotter: elif self.ndim == 2: self.__plot_contour() + def __find_closest(self, arr, val): + idx = np.abs(arr - val).argmin() + return idx + + def __slice(self): + os.system("mkdir -p " + self.out) + + if self.plane_type == 'xy': + x_name = self.file_column_names[0] + y_name = self.file_column_names[1] + + z_name = self.file_column_names[2] + arr = self.file_data[0].data[z_name] + pos = self.__find_closest(arr, self.slice_position) + + elif self.plane_type == 'yz': + x_name = self.file_column_names[1] + y_name = self.file_column_names[2] + + z_name = self.file_column_names[0] + arr = self.file_data[0].data[z_name] + pos = self.__find_closest(arr, self.slice_position) + + elif self.plane_type == 'xz': + x_name = self.file_column_names[0] + y_name = self.file_column_names[2] + + z_name = self.file_column_names[1] + arr = self.file_data[0].data[z_name] + pos = self.__find_closest(arr, self.slice_position) + + if self.oname == None: + fig_names = self.var + fig_end = ".png" + else: + fig_names = self.oname + fig_end = "" + + for i in range(self.fig_count): + fig,ax=plt.subplots(1,1) + + if self.title == None: + title = self.var[i] + else: + title = self.title + + if self.plane_type == 'xy': + Z = self.file_data[0].data[self.var[i]][pos, :, :] + + elif self.plane_type == 'xz': + Z = self.file_data[0].data[self.var[i]][:, pos, :] + + elif self.plane_type == 'yz': + Z = self.file_data[0].data[self.var[i]][:, :, pos] + + X = self.file_data[0].data[x_name] + Y = self.file_data[0].data[y_name] + + cp = ax.contourf(X, Y, Z) + + fig.colorbar(cp) # Add a colorbar to a plot + ax.set_title(title) + ax.set_xlabel(x_name) + ax.set_ylabel(y_name) + + if self.if_manual_plot: plt.show() + else: plt.close(fig) + if self.if_save_result: fig.savefig(self.out + fig_names[i] + fig_end) + def dump(self): self.__dump() @@ -472,4 +543,8 @@ class Plotter: def multiple_plot(self): self.__get_min_max_ax() - self.__multiple_plot() \ No newline at end of file + self.__multiple_plot() + + def slice(self): + self.__get_min_max_bar() + self.__slice() \ No newline at end of file diff --git a/plotter/ProcData.py b/plotter/ProcData.py index e3183eb18ab4fe33018696555f872d5c53756724..eeae9cfe1167dd599f6c2950ed53b69ea1798fcd 100755 --- a/plotter/ProcData.py +++ b/plotter/ProcData.py @@ -3,6 +3,7 @@ import os import numpy as np from .binSubfunctions import * import re +from decimal import Decimal class ProcData: def __init__(self, filename=None): @@ -118,7 +119,25 @@ class ProcData: J = int(file_data[2].split(',')[1].split('=')[1]) K = int(file_data[2].split(',')[2].split('=')[1]) - file_data = np.loadtxt(self.filename, dtype = float, skiprows=3, unpack=False, ndmin=2, encoding='utf-8') + with open(self.filename, 'r') as f: + file_data = f.read().split('\n') + f.close() + + skip_rows = 0 + continue_flag = True + for row in file_data: + for word in row.split(' '): + try: + Decimal(word) + continue_flag = False + except: + break + if continue_flag == True: + skip_rows += 1 + else: + break + + file_data = np.loadtxt(self.filename, dtype = float, skiprows=skip_rows, unpack=False, ndmin=2, encoding='utf-8') file_data = file_data.T if self.var == None: @@ -135,9 +154,9 @@ class ProcData: self.data[self.variable_names[0]] = file_data[0][0:I] if ndim == 2: - self.data[self.variable_names[1]] = file_data[1][: : I] + self.data[self.variable_names[1]] = file_data[1][0: I * J : I] elif ndim == 3: - self.data[self.variable_names[1]] = file_data[1][: : I] + self.data[self.variable_names[1]] = file_data[1][0: I * J : I] self.data[self.variable_names[2]] = file_data[2][: : I * J] i = 0 @@ -154,7 +173,6 @@ class ProcData: self.data['cy'] = J self.data['cz'] = K - def __read_bin(self): f = open(self.filename,'rb') fid = read_int(f) @@ -312,8 +330,6 @@ class ProcData: self.var = column_names self.mval = mval - # print(ndim, self.filename) - if filename_extension == '.plt': self.__read_plt(ndim) elif filename_extension == '.nsx': diff --git a/plotter/__init__.py b/plotter/__init__.py index 4c896fe2aabf0f635ca1bd9ea0ce20792a179edc..ae8d0c61670057b4a1bde9ed0b0681b6a69ecdae 100755 --- a/plotter/__init__.py +++ b/plotter/__init__.py @@ -6,6 +6,7 @@ from .main import ani_plot from .main import plot_contour from .main import ani_plot_contour from .main import avg_plot +from .main import slice from .main import plot_diff from .main import get_data from .main import multiple_plot diff --git a/plotter/main.py b/plotter/main.py index 7c9e06914691b85152b1f6fa950d8fe850eca662..c8de57a4386a576efa4886a2097a3ed5036344cc 100755 --- a/plotter/main.py +++ b/plotter/main.py @@ -66,6 +66,12 @@ def avg_plot(filename, out = './', oname = 'fig.png', var=[None], mval=[None]): Plot.set(args, if_manual_plot=manual_plot, if_save_result=save_result) Plot.avg_plot() +def slice(filename, plane_type = 'xy', slice_position = 0, out = './', oname = [None], var=[None], mval=[None], min_y = None, max_y = None): + Plot = Plotter() + args = Args([filename], Plot.slice, var=var, mval=mval, oname=oname, out=out, plane_type=plane_type, slice_position=slice_position) + Plot.set(args, if_manual_plot=manual_plot, if_save_result=save_result) + Plot.slice() + def plot_diff(filename, ndim, out = './', oname = 'fig.png', var=[None], mval=[None]): Plot = Plotter() args = Args(filename, Plot.plot_diff, var=var, mval=mval, oname=oname, out=out, ndim=ndim)