Source code for pysagas.sensitivity.cart3d.utilities

import os
import sys
import traceback
import pandas as pd
from typing import Tuple, List


[docs] def process_components_file( a_inf: float, rho_inf: float, filepath: str = "Components.i.plt", write_data: bool = True, verbosity: int = 1, ) -> Tuple[pd.DataFrame, pd.DataFrame]: """A ParaView script to process Components.i.plt to extract points and cells with data attached. Parameters ---------- a_inf : float The freestream speed of sound (m/s). rho_inf : float The freestream density (kg/m^3). filepath : str, optional The filepath to the Components.i.plt file to be processed. The default is Components.i.plt. write_data : bool, optional Write the flow data to CSV files. The default is True. verbosity : int, optional The verbosity of the code. The defualt is 1. Returns ------- points : pd.DataFrame A DataFrame of the point data. cells : pd.DataFrame A DataFrame of the cell data. """ # Check file exists if not os.path.exists(filepath): raise FileNotFoundError(f"File '{filepath}' does not exist.") # Define root directory root_dir = os.path.dirname(filepath) try: # import the simple module from the paraview import vtk from paraview.simple import ( VisItTecplotBinaryReader, _DisableFirstRenderCameraReset, GetActiveViewOrCreate, Show, ProgrammableFilter, Hide, PointDatatoCellData, ExportView, ) except ModuleNotFoundError: # Cannot find paraview python package print( "Cannot find ParaView Python package. If ParaView is already " + "installed, please append the bin/ directory to the Python path. " + "If it is not installed, please do so. If you are using " + "an Anaconda environment, you can install using " + "'conda install -c conda-forge paraview'.\n\n" ) tb = traceback.format_exc() print(tb) sys.exit() # disable automatic camera reset on 'Show' _DisableFirstRenderCameraReset() # create a new 'VisItTecplotBinaryReader' if verbosity > 0: print(f"Loading {filepath}") componentsiplt = VisItTecplotBinaryReader(FileName=[filepath]) componentsiplt.MeshStatus = ["Surface"] componentsiplt.PointArrayStatus = [] # Properties modified on componentsiplt componentsiplt.PointArrayStatus = [ "Cp", "Pressure", "Rho", "U", "V", "W", "x", "y", "z", ] # get active view spreadSheetView1 = GetActiveViewOrCreate("SpreadSheetView") # uncomment following to set a specific view size # spreadSheetView1.ViewSize = [400, 400] # show data in view componentsipltDisplay = Show(componentsiplt, spreadSheetView1) # update the view to ensure updated data information spreadSheetView1.Update() # create a new 'Programmable Filter' programmableFilter1 = ProgrammableFilter(Input=componentsiplt) programmableFilter1.Script = "" programmableFilter1.RequestInformationScript = "" programmableFilter1.RequestUpdateExtentScript = "" programmableFilter1.PythonPath = "" # Properties modified on programmableFilter1 if verbosity > 0: print(" Dimensionalising attributes.") programmableFilter1.Script = f""" # Paraview script to normalise Cart3D variables. R_gas = 287.058 gamma = 1.4 # Redefine the Cart3D variables - normalised values are *_tilde output.PointData.append(inputs[0].PointData["U"], "U_tilde") output.PointData.append(inputs[0].PointData["V"], "V_tilde") output.PointData.append(inputs[0].PointData["W"], "W_tilde") output.PointData.append(inputs[0].PointData["Pressure"], "p_tilde") output.PointData.append(inputs[0].PointData["Rho"], "rho_tilde") # Define the dimensional flow properties output.PointData.append({a_inf} * inputs[0].PointData["U"], "U") output.PointData.append({a_inf} * inputs[0].PointData["V"], "V") output.PointData.append({a_inf} * inputs[0].PointData["W"], "W") output.PointData.append({a_inf} * {a_inf} * {rho_inf} * output.PointData["p_tilde"], "p") output.PointData.append({rho_inf} * output.PointData["rho_tilde"], "rho") output.PointData.append({a_inf}*{a_inf}*{rho_inf}*output.PointData["p_tilde"] / ({rho_inf}*output.PointData["rho_tilde"]*R_gas), "T") output.PointData.append((abs(gamma * R_gas * output.PointData["T"]))**0.5, "a") output.PointData.append((output.PointData["U"]**2 + output.PointData["V"]**2 + output.PointData["W"]**2)**0.5, "V_mag") output.PointData.append(output.PointData["V_mag"]/output.PointData["a"], "M")""" programmableFilter1.RequestInformationScript = "" programmableFilter1.RequestUpdateExtentScript = "" programmableFilter1.PythonPath = "" # show data in view programmableFilter1Display = Show(programmableFilter1, spreadSheetView1) # hide data in view Hide(componentsiplt, spreadSheetView1) # update the view to ensure updated data information spreadSheetView1.Update() # create a new 'Point Data to Cell Data' pointDatatoCellData1 = PointDatatoCellData(Input=programmableFilter1) # show data in view pointDatatoCellData1Display = Show(pointDatatoCellData1, spreadSheetView1) # hide data in view Hide(programmableFilter1, spreadSheetView1) # update the view to ensure updated data information spreadSheetView1.Update() # Properties modified on pointDatatoCellData1 pointDatatoCellData1.PassPointData = 1 # update the view to ensure updated data information spreadSheetView1.Update() # Properties modified on spreadSheetView1 spreadSheetView1.GenerateCellConnectivity = 1 # update the view to ensure updated data information spreadSheetView1.Update() # Properties modified on spreadSheetView1 spreadSheetView1.FieldAssociation = "Point Data" # update the view to ensure updated data information spreadSheetView1.Update() # export view if verbosity > 0: print(" Saving point data.") points_filename = os.path.join(root_dir, "points.csv") ExportView(points_filename, view=spreadSheetView1) # Properties modified on spreadSheetView1 spreadSheetView1.FieldAssociation = "Cell Data" # update the view to ensure updated data information spreadSheetView1.Update() # export view if verbosity > 0: print(" Saving cell data.") cells_filename = os.path.join(root_dir, "cells.csv") ExportView(cells_filename, view=spreadSheetView1) if verbosity > 0: print("Complete.") # Read the files to Pandas DataFrames points = pd.read_csv(points_filename) cells = pd.read_csv(cells_filename) if not write_data: # Delete the files os.remove(points_filename) os.remove(cells_filename) return points, cells