The input file describes the geometry of the machine, the model of the fluid, and finally the discretization. The file itself is in TOML.
The file consists of several parts (see individual sections bellow):
machine
- this section gives basic parameters of the machinethermo
- this section gives parameters of the fluid modeldiscretization
- this section gives parameters of the discretizationboundary_conditions
- this section gives parameters of the boundary conditionsplots
- this section defines plots to be generated after the simulation The code displays basic performance summary during the computation. The summary contains: - mass flux in kg/s - compression or expansion (total-to-total) - adiabatic efficiency - loss coefficient at mean cut of the first blade row
At the end of computation the results are written into results.vtk
file which can be post-processed using e.g. ParaView software.
machine
This section describes basic shape of the machine as well as models of blades. The section contains a basic part in the form
[machine]
type = "compressor" # can be "compressor" or "turbine"
rpm = 17500 # Speed in rev/minute
# Shape of the hub, array of [x,r] points, in m
hub_outline = [ [-0.057, 0.093188 ],
[-0.017, 0.093188 ],
[ 0.029, 0.098655 ],
[ 0.054, 0.098655 ],
[ 0.136, 0.100246 ],
[ 0.175, 0.100246 ] ]
# Shape of the shroud, array of [x,r] points, in m
shroud_outline = [ [-0.057, 0.135 ],
[ 0.175, 0.135 ] ]
The rotation axis is x
and the rotation is in right hand direction ( is perpendicular to axis).
Hub and shroud outlines are given as a series of points. The actual shape is interpolated using piecewise cubic monotone interpolation, see the figure bellow.
The inlet and outlet boundaries are defined by simply connecting first and last point of the hub and shorud outlines.
The machine
section then contains the array of tables corresponding to individual blade rows, see next sub-sections.
blade_row
Each blade row is described by an embedded table
[[machine.blade_row ]]
name = "R1" # name of blade row, can be arbitrary
rotating = true # rotor of stator
number_of_blades = 11 # number of blades in row
leading_edge = [ [-0.016120, 0.093000], # Leading edge outline, in m
[-0.012625, 0.114000],
[-0.010111, 0.135000] ]
trailing_edge= [ [ 0.030103, 0.093000], # Trailing edge outline, in m
[ 0.023516, 0.114000],
[ 0.018109, 0.135000] ]
inlet_angle = [ 53.029, 59.621, 64.936] # Inlet angles at LE points, in deg
outlet_angle = [ -7.725, 23.717, 42.544] # Outlet angles at TE points, in deg
chord = [ 0.05310, 0.05225, 0.05140 ] # Chord at LE/TE points, in m
relative_thickness = [ 0.06, 0.06, 0.06 ] # Relative thickness at LE/TE points
The leading and trailing edge outlines are given as arrays of points. The code automatically extends/trims these outlines at hub and shroud, see the figure bellow:
The inlet and outlet angles, chord and relative thickness are given in corresponding points at the leading edge (for compressors) or trailing edge (for turbines).
All tables are interpolated using piecewise cubic monotone interpolation.
Each blade row contains a configuration of an empirical performance model. The model is selected and configured using
the performance_model
table. The table contains a mandatory type
key and optional keys depending on the model.
The following performance models are implemented:
[machine.blade_row.performance_model]
type = "lieblein" # Mandatory for Lieblein's model
Ksh = 1.0 # Shape factor, optional
K1 = 0.004 # Loss model parameter, optional
K2 = 1.0 # Loss model parameter, optional
m = [ 0.17, -0.0333, 0.333] # Coeffs of m in deviation model, optional
thermo
Viscous compressible fluid governed by the ideal gas EOS, see Theory manual. The model is selected and configured as
[thermo]
model = "perfect_gas"
[thermo.perfect_gas]
r = 287.058 # Specific gas constant in J/(kg.K)
cp = 1004.0 # Specific heat at const. pressure in J/(kg.K)
mu0 = 1.716e-5 # Viscosity at T = 273.15 K
T0 = 273.15 # Reference temperature in K
S = 110.4 # Sutherland's temperature in [K]
Pr = 0.72 # Prandtl number
Viscous compressible fluid governed by the cubic Aungier-Redlich-Kwong EOS, see Theory manual. The model is selected and configured as
[thermo]
model = "aungier"
[thermo.aungier]
r = 296.80 # Specific gas constant in J/(kg.K)
# Coeffs for cp0(T) polynomial (T in K, cp0 in J/(kg.K))
cp0 = [1.0480e+03, -3.6703e-02, -1.4929e-04, 7.2281e-07, -4.1814e-10]
h_std = 309269.90 # Enthalpy at p = 1e5 Pa and T = 298.15 K
s_std = 6839.21 # Entropy at p = 1e5 Pa and T = 298.15 K
T_crit = 126.20 # Critical temperature in K
p_crit = 3.3980e6 # Critical pressure in Pa
V_crit = 0.003216 # Critical specific volume in m3/kg
acentric_factor = 0.037 # Accentric factor
mu0 = 1.716e-5 # Viscosity at T = 273.15 K
T0 = 273.15 # Reference temperature in K
S = 110.4 # Sutherland's temperature in [K]
Pr = 0.72 # Prandtl number
Coolprop model uses external Coolprop library (not included). The model is selected and configured as
[thermo]
model = "coolprop"
[thermo.coolprop]
library = "/path_to_coolprop_library/libCoolProp.so"
fluid = "N2"
backend = "TTSE"
The code supports TTSE
and HEOS
backends.
Warning
the Coolprop library is very slow even with TTSE backend!
boundary_conditions
The boundary conditions are specified as two sub-tables. The first table inlet
specifies the inlet boundary condition and the second table outlet
specifies the outlet boundary condition.
The boundary conditions are specified as
[boundary_conditions]
inlet.type = "total_inlet"
inlet.dir = [1.0, 0.0, 0.0]
inlet.p_tot = 7.5e6
inlet.T_tot = 333.15
outlet.type = "pressure_outlet"
outlet.p = 8.6e6
As now, the only supported combination of boundary conditions is total_inlet
and pressure_outlet
. The total_inlet
boundary condition is specified by the total pressure, total temperature, and inflow velocity direction. The pressure_outlet
boundary condition is specified by the static pressure.
discretization
The domain is discretized using a structured mesh (see the figure bellow).
The number of cells in streamwise direction can be prescribed either as an array :
[discretization]
cells_spanwise = 20
cells_streamwise = [10, 10, 10, 10, 10]
or simply as a total number of cells :
[discretization]
cells_spanwise = 20
cells_streamwise = 50
In the second case, the code automatically distributes points to individual section.
Next, the number of iterations, stopping criterion, and relaxation parameters can be prescribed:
[discretization]
cells_spanwise = 20
cells_streamwise = 50
relax_U = 0.9
relax_p = 0.02
relax_h0 = 0.9
relax_Fn = 0.2
relaxFv = 0.1
tolerance_p = 1e-8
max_iterations = 5000
min_iterations = 1000
plots
The code contains several built-in postprocessing capabilities. Nevertheless, the result is stored in VTK file and it can be postprocessed using some third party software (e.g.ParaView).
[machine]
type = "compressor"
rpm = 17500
hub_outline = [ [-0.057, 0.093188 ],
[-0.017, 0.093188 ],
[ 0.029, 0.098655 ],
[ 0.054, 0.098655 ],
[ 0.136, 0.100246 ],
[ 0.175, 0.100246 ] ]
shroud_outline = [ [-0.057, 0.135 ],
[ 0.175, 0.135 ] ]
[[machine.blade_row ]]
name = "R1"
rotating = true
number_of_blades = 11
leading_edge = [ [-0.016120, 0.093000], [-0.012625, 0.114000], [-0.010111, 0.135000] ]
trailing_edge= [ [ 0.030103, 0.093000], [ 0.023516, 0.114000], [ 0.018109, 0.135000] ]
inlet_angle = [ 53.029, 59.621, 64.936]
outlet_angle = [ -7.725, 23.717, 42.544]
chord = [ 0.05310, 0.05225, 0.05140 ]
relative_thickness = [ 0.06, 0.06, 0.06 ]
[machine_blade_row.performance_model]
type = "lieblein"
[[machine.blade_row ]]
name = "S1"
rotating = false
number_of_blades = 13
leading_edge = [ [ 0.049987, 0.099000], [ 0.049589, 0.117000], [ 0.049491, 0.135000] ]
trailing_edge= [ [ 0.139000, 0.099000], [ 0.138000, 0.117000], [ 0.137100, 0.135000] ]
inlet_angle = [ 40.950, 37.920, 35.633 ]
outlet_angle = [-10.000, -8.500, -7.000 ]
chord = [ 0.09570, 0.09435, 0.09300 ]
relative_thickness = [ 0.06, 0.06, 0.06 ]
[machine.blade_row.performance_model]
type = "lieblein"
[thermo]
model = "perfect_gas"
[thermo.perfect_gas]
r = 287.058
cp = 1004.0
mu0 = 1.716e-5 # Viscosity at T = 273.15 K
T0 = 273.15
S = 110.4
Pr = 0.72
[boundary_conditions]
inlet.type = "total_inlet"
inlet.dir = [1.0, 0.0, 0.0]
inlet.p_tot = 7.5e6
inlet.T_tot = 333.15
outlet.type = "pressure_outlet"
outlet.p = 8.6e6
[discretization]
cells_spanwise = 20
cells_streamwise = 100
max_iterations = 2000
tolerance_p = 1.0e-8
[plots]
python = "python3"
dpi = 150
format = "png"
meridional_view = false
meridional_mesh = false
spanwise_pressure = false
spanwise_temperature = false
spanwise_C = false
spanwise_beta = false