Skip to content
Snippets Groups Projects
ProcData.py 8.46 KiB
Newer Older
数学の武士's avatar
数学の武士 committed
import numpy as np
import os
import numpy as np
from .binSubfunctions import *

class ProcData:
    def __init__(self, filename=None):
数学の武士's avatar
数学の武士 committed
        self.filename = filename
        self.data = {}
        self.nse_read_bin_data = {}
        self.variable_names = ""

    def __get_variable_names_plt(self):
        with open(self.filename, "r") as file:
            file_data = file.read().split('\n')
        file.close()

        names = [variable_name.replace(" ", "").replace('"' , "") for variable_name in file_data[1].split('=')[1].split(',')]
        self.variable_names = np.array(names, dtype=object)
    
    def __get_variable_names_bin(self):
        f = open(self.filename,'rb')
        _ = read_int(f)
        _ = read_int(f)
        ndims = read_int(f)
        data_type_size = read_int(f)

        if ndims == 1:
            self.variable_names = ['I']
        elif ndims == 2:
            self.variable_names = ['I', 'J']
        elif ndims == 3:
            self.variable_names = ['I', 'J', 'K']

        if data_type_size == 4:
            read_float = read_float32
            read_floats = read_floats32
            float_type = np.float32
        elif data_type_size == 8:
            read_float = read_float64
            read_floats = read_floats64
            float_type = np.float64
        else:
            raise Exception(f"Unknown data_type value: {data_type_size}. Must be either 4 or 8.")

        for _ in range(24):
            read_float(f)

        nx = read_int(f)
        ny = read_int(f)
        nz = read_int(f)

        # skip gap; reserved for future usage
        for _ in range(21):
            read_int(f)

        for _ in range(2):
            read_floats(f, num=nx)
            read_floats(f, num=ny)
            read_floats(f, num=nz)

        read_float(f)

        field_type = read_int(f)
        if field_type == 0:
            nvars = 1
        elif field_type == 1:
            nvars = ndims
        else:
            raise Exception(f"Unknown field_type value: {field_type}. Must be either 0 or 1")

        len_varnames = []
        for _ in range(nvars):
            len_varnames += [read_int(f)]

        varnames = []
        for nvar in range(nvars):
            varnames += [read_str(f, length=len_varnames[nvar])]
                    
        self.variable_names += varnames
        self.variable_names = np.array(self.variable_names, dtype=object)
    
    def __read_plt(self, ndim):
        with open(self.filename, "r") as file:
            file_data = file.read().split('\n')
        file.close()

        I = int(file_data[2].split(',')[0].split('=')[1])

        if ndim == 1:
            var_begin = 1
            J = 0
            K = 0
        elif ndim == 2:
            var_begin = 2
            J = int(file_data[2].split(',')[1].split('=')[1])
            K = 0
        elif ndim == 3:
            var_begin = 3
            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, delimiter=' ', skiprows=3, unpack=False, ndmin=2, encoding='bytes')
        file_data = file_data.T

        if self.var == None:
            column_names = [self.variable_names[i] for i in range(var_begin, len(self.variable_names))] 
        else:
            column_names = self.var
            
        if self.mval != None:
            for col, abs_val in zip(column_names, self.mval):
                check_variable_idx = np.where(self.variable_names == col)[0][0]
                idx = np.where(np.abs(file_data[check_variable_idx]) > abs_val)[0]
                file_data[check_variable_idx][idx] = np.nan

        self.data[self.variable_names[0]] = file_data[0][0:I]

        if ndim == 2:
            self.data[self.variable_names[1]] = file_data[1][: : I]
        elif ndim == 3:
            self.data[self.variable_names[1]] = file_data[1][: : I]
            self.data[self.variable_names[2]] = file_data[2][: : I * J]

        i = 0
        for name in self.variable_names[ndim : ]:
            if ndim == 1:
                self.data[name] = file_data[ndim + i]
            elif ndim == 2:
                self.data[name] = file_data[ndim + i].reshape( J, I )
            elif ndim == 3:
                self.data[name] = file_data[ndim + i].reshape( K, J, I )
            i += 1

        self.data['cx'] = I
        self.data['cy'] = J
        self.data['cz'] = K

    
    def __read_bin(self):
        f = open(self.filename,'rb')
        fid = read_int(f)
        grid_type = read_int(f)
        ndims = read_int(f)
        data_type_size = read_int(f)

        if data_type_size == 4:
            read_float = read_float32
            read_floats = read_floats32
            float_type = np.float32
        elif data_type_size == 8:
            read_float = read_float64
            read_floats = read_floats64
            float_type = np.float64
        else:
            raise Exception(f"Unknown data_type value: {data_type_size}. Must be either 4 or 8.")
        
        x = read_float(f)
        y = read_float(f)
        z = read_float(f)

        xdomainsize = read_float(f)
        ydomainsize = read_float(f)
        zdomainsize = read_float(f)

        # skip gap; reserved for future usage
        for _ in range(18):
            read_float(f)

        nx = read_int(f)
        ny = read_int(f)
        nz = read_int(f)

        if ndims < 3:
            nz = 0
        if ndims < 2:
            ny = 0

        dimsizes = ([nx, ny, nz])[0:ndims]

        gcx = read_int(f)
        gcy = read_int(f)
        gcz = read_int(f)

        # skip gap; reserved for future usage
        for _ in range(18):
            read_int(f)

        cx = read_floats(f, num=nx)
        cy = read_floats(f, num=ny)
        cz = read_floats(f, num=nz)

        ex = read_floats(f, num=nx)
        ey = read_floats(f, num=ny)
        ez = read_floats(f, num=nz)

        time = read_float(f)

        field_type = read_int(f)
        if field_type == 0:
            nvars = 1
        elif field_type == 1:
            nvars = ndims
        else:
            raise Exception(f"Unknown field_type value: {field_type}. Must be either 0 or 1")

        len_varnames = []
        for _ in range(nvars):
            len_varnames += [read_int(f)]

        varnames = []
        for nvar in range(nvars):
            varnames += [read_str(f, length=len_varnames[nvar])]

        values = np.fromfile(f, dtype=float_type, count=np.prod(dimsizes)).reshape(dimsizes + [1])
        for nvar in range(1,nvars):
            vadd = np.fromfile(f, dtype=float_type, count=np.prod(dimsizes)).reshape(dimsizes + [1])
            values = np.concatenate((values, vadd), axis=-1)

        f.close()

        I = nx - 2 * gcx
        J = ny - 2 * gcy
        K = nz - 2 * gcz

        self.data['cx'] = I
        self.data['cy'] = J
        self.data['cz'] = K

        self.variable_names = ['I', 'J', 'K']

        for i in range(nvars):
            self.variable_names.append(varnames[i][0])

        self.data['I'] = cx[gcx:nx - gcx]
        self.data['J'] = cy[gcy:ny - gcy]
        self.data['K'] = cz[gcz:nz - gcz]

        values = values.T

        for i in range(ndims, ndims + nvars):
            print(values[:, :, :, i - ndims].shape)
            self.data[self.variable_names[i]] = values[i - ndims, gcz:nz - gcz, gcy:ny - gcy, gcx:nx - gcx]

        if ndims == 1:
            var_begin = 1
        elif ndims == 2:
            var_begin = 2
        elif ndims == 3:
            var_begin = 3

        if self.var == None:
            column_names = [self.variable_names[i] for i in range(var_begin, len(self.variable_names))] 
        else:
            column_names = self.var

        if self.mval != None:
            # print(self.mval)
            for col, abs_val in zip(column_names, self.mval):
                idx = np.where(np.abs(self.data[col]) > abs_val)
                self.data[col][idx] = np.nan

    def process_file(self, ndim, column_names, mval):
        filename_parts = os.path.splitext(self.filename)
        filename_extension = filename_parts[-1]
        self.var = column_names
        self.mval = mval

        if filename_extension == '.plt':
            self.__read_plt(ndim)
        elif filename_extension == '.nsx':
            self.__read_bin()

    def get_variable_names(self):
        filename_parts = os.path.splitext(self.filename)
        filename_extension = filename_parts[-1]

        if filename_extension == '.plt':
            self.__get_variable_names_plt()
        elif filename_extension == '.nsx':
            self.__get_variable_names_bin()