From 4ee435c6b69508e23114de10c46edbcbabeb38d2 Mon Sep 17 00:00:00 2001 From: hechao <490956681@qq.com> Date: Thu, 15 Jun 2023 16:07:23 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=93=E6=9E=84=E7=BD=91=E6=A0=BC=E5=8F=82?= =?UTF-8?q?=E6=95=B0=EF=BC=8C=E7=BD=91=E6=A0=BC=EF=BC=8C=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=EF=BC=9B=E6=96=B0=E5=A2=9EA32=E4=BD=8E?= =?UTF-8?q?=E9=80=9F=E9=A2=84=E5=A4=84=E7=90=86NACA0012=E7=BF=BC=E5=9E=8B?= =?UTF-8?q?=E7=AE=97=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bin/cfd_para.hypara | 1055 +++++++++-------- .../bin/grid_para.hypara | 13 +- .../bin/cfd_para.hypara | 1055 +++++++++-------- .../bin/grid_para.hypara | 13 +- .../bin/cfd_para.hypara | 1055 +++++++++-------- .../bin/grid_para.hypara | 13 +- .../bin/cfd_para.hypara | 1055 +++++++++-------- .../bin/grid_para.hypara | 13 +- .../bin/cfd_para.hypara | 1055 +++++++++-------- .../bin/grid_para.hypara | 13 +- .../bin/cfd_para.hypara | 1055 +++++++++-------- .../bin/grid_para.hypara | 13 +- .../bin/cfd_para.hypara | 1055 +++++++++-------- .../bin/grid_para.hypara | 13 +- .../bin/cfd_para.hypara | 1055 +++++++++-------- .../bin/grid_para.hypara | 13 +- .../bin/cfd_para.hypara | 1055 +++++++++-------- .../bin/grid_para.hypara | 13 +- .../bin/cfd_para.hypara | 1055 +++++++++-------- .../bin/grid_para.hypara | 13 +- .../bin/cfd_para.hypara | 1055 +++++++++-------- .../bin/grid_para.hypara | 13 +- .../bin/cfd_para.hypara | 1055 +++++++++-------- .../bin/grid_para.hypara | 13 +- .../bin/cfd_para.hypara | 1055 +++++++++-------- .../bin/grid_para.hypara | 13 +- .../二维结构后台阶低速湍流算例说明文档.pdf | Bin 522239 -> 582591 bytes .../bin/cfd_para.hypara | 1046 ++++++++-------- .../bin/grid_para.hypara | 13 +- .../二维结构平板低速湍流算例说明文档.pdf | Bin 593383 -> 705073 bytes .../bin/cfd_para.hypara | 1055 +++++++++-------- .../bin/grid_para.hypara | 13 +- .../三维结构激波边界层干扰算例说明文档.pdf | Bin 496463 -> 555727 bytes .../bin/cfd_para.hypara | 1055 +++++++++-------- .../bin/grid_para.hypara | 13 +- .../bin/cfd_para.hypara | 1055 +++++++++-------- .../bin/grid_para.hypara | 13 +- .../bin/cfd_para.hypara | 1055 +++++++++-------- .../bin/grid_para.hypara | 13 +- .../bin/cfd_para.hypara | 1055 +++++++++-------- .../bin/grid_para.hypara | 13 +- .../bin/cfd_para.hypara | 1055 +++++++++-------- .../bin/grid_para.hypara | 13 +- .../bin/cfd_para.hypara | 1055 +++++++++-------- .../bin/grid_para.hypara | 13 +- ...结构激波干扰超声速层流平板_算例说明文档.pdf | Bin 707257 -> 708980 bytes .../bin/cfd_para.hypara | 1055 +++++++++-------- .../bin/grid_para.hypara | 13 +- .../三维结构弹体喷流_算例说明文档.pdf | Bin 606615 -> 607492 bytes .../bin/cfd_para.hypara | 1055 +++++++++-------- .../bin/grid_para.hypara | 13 +- .../二维结构低速平板转捩算例说明文档.pdf | Bin 274729 -> 383632 bytes .../bin/cfd_para.hypara | 1055 +++++++++-------- .../bin/grid_para.hypara | 13 +- ...p30n翼型低速绕流(Matrix LUSGS)算例说明文档.pdf | Bin 589823 -> 645568 bytes .../bin/cfd_para.hypara | 1055 +++++++++-------- .../bin/grid_para.hypara | 13 +- ...构低速湍流平板(Matrix LUSGS)算例说明文档.pdf | Bin 505918 -> 566802 bytes .../bin/cfd_para.hypara | 1055 +++++++++-------- .../bin/grid_para.hypara | 13 +- ...22翼型跨声速绕流(Matrix LUSGS)算例说明文档.pdf | Bin 528213 -> 587860 bytes .../bin/cfd_para.hypara | 1055 +++++++++-------- .../bin/grid_para.hypara | 13 +- ...构30p30n翼型低速绕流(熵修正)算例说明文档.pdf | Bin 590417 -> 645221 bytes .../bin/cfd_para.hypara | 1055 +++++++++-------- .../bin/grid_para.hypara | 13 +- ...结构圆柱超声速绕流(熵修正)算例说明文档.pdf | Bin 447975 -> 455420 bytes .../bin/cfd_para.hypara | 1055 +++++++++-------- .../bin/grid_para.hypara | 13 +- ...Rae2822翼型跨声速绕流(熵修正)算例说明文档.pdf | Bin 531276 -> 591143 bytes .../bin/cfd_para.hypara | 1055 +++++++++-------- .../bin/grid_para.hypara | 13 +- ...结构圆柱高超声速绕流(熵修正)算例说明文档.pdf | Bin 449412 -> 456831 bytes .../bin/cfd_para.hypara | 1055 +++++++++-------- .../bin/grid_para.hypara | 13 +- ...CHNT跨声速流动(Matrix LUSGS)算例说明文档.pdf | Bin 550661 -> 551754 bytes .../bin/cfd_para.hypara | 1055 +++++++++-------- .../bin/cfd_para_subsonic.hypara | 39 +- .../bin/grid_para.hypara | 17 +- .../bin/key.hypara | 17 +- .../grid/网格地址.txt | 0 81 files changed, 18332 insertions(+), 15895 deletions(-) rename {H01_PBSolver_TwoD_Backstep_Laminar_Re95_Unstruct_1CPU => A32_TwoD_NACA0012_Inv_Ma0d2_Precondition_Struct_1CPU}/bin/cfd_para.hypara (60%) rename {F01_ThreeD_30p30n_OversetGrid_SA_Struct_4CPU => A32_TwoD_NACA0012_Inv_Ma0d2_Precondition_Struct_1CPU}/bin/cfd_para_subsonic.hypara (92%) rename {F01_ThreeD_30p30n_OversetGrid_SA_Struct_4CPU => A32_TwoD_NACA0012_Inv_Ma0d2_Precondition_Struct_1CPU}/bin/grid_para.hypara (72%) rename {F01_ThreeD_30p30n_OversetGrid_SA_Struct_4CPU => A32_TwoD_NACA0012_Inv_Ma0d2_Precondition_Struct_1CPU}/bin/key.hypara (84%) rename {F01_ThreeD_30p30n_OversetGrid_SA_Struct_4CPU => A32_TwoD_NACA0012_Inv_Ma0d2_Precondition_Struct_1CPU}/grid/网格地址.txt (100%) diff --git a/A01_TwoD_Plate_Laminar_Struct_1CPU/bin/cfd_para.hypara b/A01_TwoD_Plate_Laminar_Struct_1CPU/bin/cfd_para.hypara index c344658..f903a5a 100644 --- a/A01_TwoD_Plate_Laminar_Struct_1CPU/bin/cfd_para.hypara +++ b/A01_TwoD_Plate_Laminar_Struct_1CPU/bin/cfd_para.hypara @@ -8,23 +8,24 @@ // Platform for Hybrid Engineering Simulation of Flows + // China Aerodynamics Research and Development Center + // (C) Copyright, Since 2010 + +// PHengLEI 2212 + //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ########################################################################### # Default parameters for Grid conversion # ########################################################################### // gridtype: Grid type for generation, conversion, reconstruction, merging. -// 0 -- Unstructured grid. -// 1 -- Structured grid. -// 2 -- Hybrid grid, include both of unstructured and structured grid. -// gridobj: Task type of grid treatment. -// 0 -- Grid generation of typical case, such as cylinder, flat plate, etc. -// 1 -- Grid conversion, from other grid data to PHenglEI, such as Fluent, CGNS. -// 2 -- Grid refinement. -// 3 -- Grid merging, merge two blocks into one block. -// 4 -- Grid deformation, achieve unstructured grid deformation. -// 5 -- Grid repairing, repair the original grid in order to remove the negative volume cells. -// 6 -- Grid mirroring, mirror a symmetry grid to whole grid. -// 7 -- Grid type change, convert structured grid to unstructured grid. +// 0 -- Unstructured grid. +// 1 -- Structured grid. +// 2 -- Hybrid grid, include both of unstructured and structured grid. +// gridobj: Task type of grid treatment. +// 0 -- Grid generation of typical case, such as cylinder, flat plate, etc. +// 1 -- Grid conversion, from other grid data to PHenglEI, such as Fluent, CGNS. +// 2 -- Grid refinement. +// 3 -- Grid merging, merge two blocks into one block. +// 4 -- Grid deformation, achieve unstructured grid deformation. +// 5 -- Grid repairing, repair the original grid in order to remove the negative volume cells. +// 6 -- Grid mirroring, mirror a symmetry grid to whole grid. +// 7 -- Grid type change, convert structured grid to unstructured grid. // multiblock: Multi-block grid or not, only for structured grid conversion. // 0 -- Not. // 1 -- Yes. @@ -46,19 +47,24 @@ int gridobj = 1; int multiblock = 0; int iadapt = 0; int SymmetryFaceVector = 1; - int gridReorder = 0; int faceReorderMethod = 0; -// axisup: Type of Cartisien coordinates system, used in grid conversion. -// 1 -- Y upward. (default) -// 2 -- Z upward. -int axisup = 1; +// nAxisRotateTimes: number of axis rotating times, zero (default) meaning without rotating. +// axisRotateOrder : axis rotating order. +// 1 -- X-axis. +// 2 -- Y-axis. +// 3 -- Z-axis. +// axisRotateAngles: axis rotating angles (degree), which are corresponding to the axis rotating order. +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; // omit_no_bound_bc: What's boundary condition for the type of "no_boundary_condition". // 0 -- Interface. (default) // 1 -- Physical boundary condition, used in Hybrid solver. int omit_no_bound_bc = 0; +int omitRepeatInterface = 1; //----------------------------------------------------------------------- # Grid data type # @@ -87,10 +93,9 @@ int dumpOldGrid = 0; // from_gfile: path of original data file for unstructure grid convert from. // out_gfile: path of target file for grid convert to, *.fts type of file usually. int numberOfGridFile = 1; -string from_gfile = "./grid/rae2822_hybrid2d.cas"; -string from_gfile1= ""; - -string out_gfile = "./grid/flat_laminr_133_85_2d.fts"; +string from_gfile = "./grid/rae2822_hybrid2d.cas"; +string from_gfile1 = ""; +string out_gfile = "./grid/flat_laminr_133_85_2d.fts"; // ----------------- some advanced choices ------------------------------ // iunsteady: The Grid is for unsteady simulation or not. @@ -103,9 +108,9 @@ int fileformat = 0; // Parameters for hybrid solver. // mixgrid_uns: path of unstructure grid file for hybrid solver, *.fts type. -// mixgrid_str: path of structure grid file for hybrid solver, *.fts type. -string mixgrid_uns = "./grid/rae2822_uns2d_4.fts"; -string mixgrid_str = "./grid/flat_laminr_133_85_2d.fts"; +// mixgrid_str: path of structure grid file for hybrid solver, *.fts type. +string mixgrid_uns = "./grid/rae2822_uns2d_4.fts"; +string mixgrid_str = "./grid/flat_laminr_133_85_2d.fts"; // Some parameters for structured overlapping grid. int codeOfDigHoles = 1; @@ -119,31 +124,31 @@ string zoneInverseFileName = "./oversetGridView/zoneInverseMapping.inp"; // 0 -- Not. (default) // 1 -- Yes. // geometryUnit: Geometry unit. -// 1 -- meter. -// 2 -- millimeter. -// 3 -- inch. +// 1 -- meter. +// 2 -- millimeter. +// 3 -- inch. // exclusiveCase: Parallel projection exclusive case. -// 0 -- NON case. -// 1 -- JSM-C2-NPOFF case. -// 2 -- CHNT. +// 0 -- NON case. +// 1 -- JSM-C2-NPOFF case. +// 2 -- CHNT. // projectOrgPoint: If the original wall points need to be projected or not. -int anisoRefine = 0; -int geometryUnit = 1; -int isProject = 0; -int readDist = 0; -int isDeform = 0; +int anisoRefine = 0; +int geometryUnit = 1; +int isProject = 0; +int readDist = 0; +int isDeform = 0; int exclusiveCase = 0; int projectOrgPoint = 0; string geometryFileName = "./grid/jsm.igs"; // ----------------- Grid Deform Parameters ----------------------------- // deformationMethod: Grid Deform. -// 1 -- SPRING. -// 2 -- RBF. +// 1 -- SPRING. +// 2 -- RBF. // stationalGridFile: Original grid file. // visualFileName : The visualization file path of deform grid. // nDeformStep : The max deform step. -// flapAngle : The max flap angle. +// flapAngle : The max flap angle. // rotatePostionZ : Rotate postion. // rotatePostionY : Rotate postion. // gridSlice : If dump slice grid. @@ -163,10 +168,10 @@ int sliceAxis = 1; double slicePosition = 13; // ----------------- RBF Parameters ------------------------------------- -// numberOfReferenceCP : Number of reference Control Points. -// influencePara : The RBF influence radius parameter. +// numberOfReferenceCP: Number of reference Control Points. +// influencePara : The RBF influence radius parameter. int numberOfReferenceCP = 40; -double influencePara = 25.0; +double influencePara = 25.0; // ----------------- Periodic Parameters -------------------------------- // Notice: Rotational periodicity only support rotation along the X axis! @@ -178,9 +183,8 @@ double influencePara = 25.0; which only support one direction. // rotationAngle: The relative angle between two periodic face. which is recorded in degrees. - int periodicType = 0; -double translationLength[] = [0.0,0.0,0.0]; +double translationLength[] = [0.0, 0.0, 0.0]; double rotationAngle = 0.0; ######################################################################### @@ -192,7 +196,6 @@ double rotationAngle = 0.0; // 2 -- refine structured grid. // maxproc: The number of partition zones that want to be divided into. // numberOfMultifile: The number of partition grid files that want to be dumped out. - int pgridtype = 0; int maxproc = 4; int numberOfMultifile = 1; @@ -201,20 +204,20 @@ int numberOfMultifile = 1; // 0 -- Not. // 1 -- Yes. // blockIndexOfMark: the block index of mark, only for structured grid partition. -// cellIndexOfMark: the cell index of mark, only for structured grid partition. +// cellIndexOfMark : the cell index of mark, only for structured grid partition. int traceMark = 0; int blockIndexOfMark = 0; -int cellIndexOfMark[] = [185,30,1]; +int cellIndexOfMark[] = [185, 30, 1]; -// parallel Strategy: -//! -# 0 : each zone is assigned to the one that defined in grid partition procedure. -//! -# 1 : random assigned for each zone or by some else ways. -int parallelStrategy = 1; +// parallelStrategy: +// 0 -- each zone is assigned to the one that defined in grid partition procedure. +// 1 -- random assigned for each zone or by some else ways. +int parallelStrategy = 1; //----------------------------------------------------------------------- # File path # //----------------------------------------------------------------------- -// original_grid_file: Original grid file that want to be divided(PHengLEI type, *.fts). +// original_grid_file: Original grid file that want to be divided(PHengLEI type, *.fts). // partition_grid_file: Target partition grid file(PHengLEI type, *.fts). string original_grid_file = "./grid/sphere_mixed.fts"; string partition_grid_file = "./grid/sphere_mixed__4.fts"; @@ -232,11 +235,10 @@ string partition_grid_file = "./grid/sphere_mixed__4.fts"; // 1 -- perfect balance. // maxproc -- perfect imbalance. // 1.05 -- recommended. - int omit_no_bound_bc = 0; int npartmethod = 1; int parallelPartitionMethod = 2; -double parmetisBalance = 1.05; +double parmetisBalance = 1.05; // numberOfMultigrid: Number of multi-grid levels, ONLY used for structured grid. // 1 -- single level. @@ -248,29 +250,35 @@ int numberOfMultigrid = 1; # Default parameters for CFD simulation # ######################################################################### // maxSimuStep: The max simulation step, don't care simulation is restart or not. -// intervalStepFlow: The step intervals for flow variables file 'flow.dat' saved. -// intervalStepPlot: The step intervals for tecplot visual file 'tecflow.dat' saved. +// intervalStepFlow: The step intervals for flow variables file 'flow.dat' saved. +// intervalStepPlot: The step intervals for tecplot visual file 'tecflow.dat' saved. // intervalStepSample: The step intervals for monitored probes variables file 'sample.dat' saved. -// intervalStepForce: The step intervals for aerodynamics coefficients file 'aircoef.dat' saved. -// intervalStepRes: The step intervals for residual file 'res.dat' saved. -// ifLowSpeedPrecon: Precondition process to accelerate convergence for low speed flow. -// 0 -- no precondition process. (default, mach > 0.3) -// 1 -- carry out precondition process. (mach number <= 0.3) - -int maxSimuStep = 20000; - -int intervalStepFlow = 1000; -int intervalStepPlot = 1000; +// intervalStepForce: The step intervals for aerodynamics coefficients file 'aircoef.dat' saved. +// intervalStepRes: The step intervals for residual file 'res.dat' saved. +int maxSimuStep = 20000; +int intervalStepFlow = 1000; +int intervalStepPlot = 1000; int intervalStepSample = 1000; -int intervalStepForce = 100; -int intervalStepRes = 10; -int ifLowSpeedPrecon = 0; +int intervalStepForce = 100; +int intervalStepRes = 10; // compressible: // 0 -- incompressible flow. // 1 -- compressible flow. (default) int compressible = 1; +// ifLowSpeedPrecon: Precondition process to accelerate convergence for low speed flow. +// 0 -- no precondition process. (default, mach > 0.3) +// 1 -- carry out precondition process. (mach number <= 0.3) +// Kprec: The coefficient K for the cut-off velocity. +// 1.0~3.0 is suggested. (default, 3.0) +// preconFarfieldBCMethod: The precondition method for farfield boundary condition. +// 0 -- precondition far-field boundary based on riemann invariants. +// 1 -- Turkel's simplified far-field boundary condition. +int ifLowSpeedPrecon = 0; +double Kprec = 3.0; +int preconFarfieldBCMethod = 1; + //----------------------------------------------------------------------- # CFD Control Parameter # //----------------------------------------------------------------------- @@ -281,33 +289,36 @@ int compressible = 1; // 0 -- the nondimensional conditions. // 1 -- the flight conditions. // 2 -- the experiment conditions. -// 3 -- the subsonic boundary conditions. +// 3 -- the subsonic boundary conditions. (Useless!) // 4 -- the condition that the velocity, temperature and density are given. // 5 -- the condition that the velocity, temperature and pressure are given. +//flowInitMethod: Flow field initialization method. +// 0 -- The entire flow field is initialized according to Infinite velocity. +// 1 -- The velocity near the wall is initialized according to the boundary layer of the plate. // refReNumber: Reynolds number, which is based unit length, unit of 1/m. // refDimensionalTemperature: Dimensional reference temperature, or the total temperature only for the experiment condition. // freestream_vibration_temperature: Dimensional freestream vibration temperature. // refDimensionalPressure: Dimensional reference pressure, or the total pressure only for the experiment condition. // height: Fly height, unit of km. // wallTemperature: Temprature of the solid wall, minus value is for adiabatic boundary condition. -// gridScaleFactor: The customizable unit of the grid, default value is 1.0 for meter.Common dimensions like: -// 1 dm = 0.1 m. -// 1 cm = 0.01 m. -// 1 mm = 0.001m. -// 1 inch = 0.0254m. -// 1 foot = 12 inches = 0.3048m. -// 1 yard = 3 feet = 0.9144m. +// gridScaleFactor: The customizable unit of the grid, default value is 1.0 for meter. Common dimensions like: +// 1 dm = 0.1 m. +// 1 cm = 0.01 m. +// 1 mm = 0.001 m. +// 1 inch = 0.0254 m. +// 1 foot = 12 inches = 0.3048 m. +// 1 yard = 3 feet = 0.9144 m. // forceReferenceLength, forceReferenceLengthSpanWise, forceReferenceArea: Reference length, SpanWise length and area, independent of grid unit. // TorqueRefX, TorqueRefY, TorqueRefZ: Reference point, independent of grid unit. // radiationCoef: The radiation coefficient on wall, it is used to compute the radiation heat flux on wall when the boundary // condition is radiation equilibrium temperature, and 0.8 is the default value. -// refMolecularWeight : the reference molecular weight of gas used for perfect gas. The unit is g/mol. +// refMolecularWeight: the reference molecular weight of gas used for perfect gas. The unit is g/mol. // Generally, the gas is air. Sometimes, it is experiment gas, such as Nitrogen, Argon, and so on. - -int directionMethod = 0; +int directionMethod = 0; double refMachNumber = 0.73; double attackd = 2.79; double angleSlide = 0.00; +int flowInitMethod = 0; int inflowParaType = 0; double refReNumber = 6.5e6; @@ -321,29 +332,27 @@ double freestream_vibration_temperature = 300.00; //double refDimensionalTemperature = 6051.024; // The total temperature, T*(1+(refGama-1)*M*M/2). //double refDimensionalPressure = 4.299696E09; // The total pressure, p*(T0/T)^(refGama/(refGama-1)). -//int inflowParaType = 3; -//int nsubsonicInlet = 1; -//int nsubsonicOutlet = 1; -//string inLetFileName = "./bin/subsonicInlet.hypara"; -//string outLetFileName = "./bin/subsonicOutlet.hypara"; -//double refDimensionalTemperature = 288.144; -//double refDimensionalPressure = 1.01313E05; - -//The velocity, temperature and density are fixed. +// The velocity, temperature and density are fixed. //int inflowParaType = 4; //double refDimensionalVelocity = 1000.0; -//double refDimensionalDensity = 1.0e3; +//double refDimensionalDensity = 1.0e3; -//The velocity, temperature and pressure are fixed. +// The velocity, temperature and pressure are fixed. //int inflowParaType = 5; //double refDimensionalVelocity = 1000.0; //double refDimensionalPressure = 1.0e5; -//The MachNumber, temperature and pressure are fixed. +// The MachNumber, temperature and pressure are fixed. //int inflowParaType = 6; -//double refDimensionalTemperature = 293; +//double refDimensionalTemperature = 293.0; //double refDimensionalPressure = 8886.06; +// The velocity, temperature and pressure are read from file. +//int inflowParaType = 7; +//string weatherDataFilePath = "./WRFData/"; +//double longitude = 110.95 +//double latitude = 19.61; + double wallTemperature = -1.0; double radiationCoef = 0.8; @@ -357,41 +366,41 @@ double forceReferenceArea = 1.0; // unit of meter^2. double TorqueRefX = 0.0; // unit of meter. double TorqueRefY = 0.0; // unit of meter. double TorqueRefZ = 0.0; // unit of meter. +double knudsenLength = 1.0; // unit of meter. double refMolecularWeight = 28.9644; // unit of g/mol. //----------------------------------------------------------------------- # Spatial Discretisation # //----------------------------------------------------------------------- -#******************************************************************* -# Struct Solver * -#******************************************************************* +#************************************************************************ +# Struct Solver * +#************************************************************************ // inviscidSchemeName: Spatial discretisation scheme of struct grid. // Using this when solve structered grid or hybrid. -// -- "vanleer", "steger", "hlle", "lax_f". -// -- "roe", "modified_roe". +// -- "vanleer", "steger", "hlle", "lax_f", +// -- "roe", "modified_roe", // -- "ausm+", "ausm+w", "ausm+up", "ausmdv", "ausmpw", "ausmpw+". // isWennScheme: If using WENN Scheme of struct grid. -// 0 -- NO. (default) -// 1 -- Yes. +// 0 -- NO. (default) +// 1 -- Yes. // str_limiter_name: Limiter of struct grid. -// -- "vanalbada", "vanleer", "minmod", "smooth", "minvan", "3rdsmooth", "3rd_minmod_smooth". -// -- "nolim", no limiter. -// -- "vanalbada_clz", clz supersonic version. -// -- "weno3_js", "wenn3_prm211", "wenn3_zm", "wenn3_zes2", "wenn3_zes3" - +// -- "vanalbada", "vanleer", "minmod", "smooth", "minvan", "3rdsmooth", "3rd_minmod_smooth", +// -- "nolim", no limiter, +// -- "vanalbada_clz", clz supersonic version, +// -- "weno3_js", "wenn3_prm211", "wenn3_zm", "wenn3_zes2", "wenn3_zes3". string inviscidSchemeName = "roe"; int isWennScheme = 0; -string str_limiter_name = "vanalbada"; +string str_limiter_name = "vanalbada"; -#******************************************************************* -# UnStruct Solver or Common * -#******************************************************************* +#************************************************************************ +# UnStruct Solver or Common * +#************************************************************************ // viscousType: Viscous model. -// 0 -- Euler. -// 1 -- Lamilar. -// 2 -- Algebraic. -// 3 -- 1eq turbulent. -// 4 -- 2eq turbulent. +// 0 -- Euler. +// 1 -- Lamilar. +// 2 -- Algebraic. +// 3 -- 1eq turbulent. +// 4 -- 2eq turbulent. // viscousName: Laminar or tubulent model. // -- "0eq-bl". // -- "1eq-sa". @@ -410,16 +419,16 @@ string str_limiter_name = "vanalbada"; // 3 -- IDDES. // uns_scheme_name: Spatial discretisation scheme of Unstruct grid. // Using this when solve Unstructered grid or hybrid. -// -- "vanleer", "roe", "steger", "kfvs", "lax_f", "hlle". +// -- "vanleer", "roe", "GMRESRoe", "GMRESSteger", "steger", "kfvs", "lax_f", "hlle", // -- "ausm+", "ausmdv", "ausm+w", "ausmpw", "ausmpw+". // uns_limiter_name: Limiter of Unstruct grid. -// -- "barth", "vencat", "vanleer", "minmod". -// -- "vanalbada", "smooth", "nnd", "lpz", "1st". +// -- "barth", "vencat", "vanleer", "minmod", +// -- "vanalbada", "smooth", "nnd", "lpz", "1st", // -- "nolim", no limiter. // uns_vis_name: Discretisation method of viscous term. // -- "std", "test", "aver", "new1", "new2". // gradientName: Gradient reconstruction method. -// -- "default", "ggcell", "ggnode", "lsq". +// -- "default", "ggcell", "ggnode", "lsq". // ivencat: Variation of vencat limiter. // 0 -- org method, it is independent of grid scale. // 1 -- new method, it is dependent of grid scale. @@ -442,18 +451,18 @@ string str_limiter_name = "vanalbada"; // 3 -- Harten type, which is default used. // roeEntropyScale: Entropy fix (correction) coefficient scale, default is 1.0. // It is used to scale the default Roe entropy fix coefficients. -// AusmpwPlusLimiter: A Limiter to make "function w" not change acutely in AusmpwPlus scheme, default is 1.0 +// AusmpwPlusLimiter: A Limiter to make "function w" not change acutely in AusmpwPlus scheme, default is 1.0. -//int viscousType = 0; +//int viscousType = 0; //string viscousName = "Euler"; -//int viscousType = 1; +//int viscousType = 1; //string viscousName = "laminar"; -int viscousType = 3; +int viscousType = 3; string viscousName = "1eq-sa"; -//int viscousType = 4; +//int viscousType = 4; //string viscousName = "2eq-kw-menter-sst"; int DESType = 0; @@ -463,7 +472,7 @@ string uns_limiter_name = "vencat"; string uns_vis_name = "test"; string gradientName = "ggnode"; -int ivencat = 7; +int ivencat = 7; double venkatCoeff = 5.0; int reconmeth = 1; int limitVariables = 0; @@ -475,9 +484,9 @@ double roeEntropyScale = 1.0; double AusmpwPlusLimiter = 1.0; -//----------------------------------------------------------------------- -# Temporal Discretisation # -//----------------------------------------------------------------------- +#************************************************************************ +# Temporal Discretisation * +#************************************************************************ // iunsteady: Steady or unsteady. // 0 -- steady. // 1 -- unsteay. @@ -490,51 +499,57 @@ double AusmpwPlusLimiter = 1.0; // statisticalTimePeriod: Used as time period of statistic analysis. // when the value is negative, time period is treated as infinite. // statisticMethod: Statistic reynolds stress method. -// 0 -- tau = - ^2 -// 1 -- tau = +// 0 -- tau = - ^2 +// 1 -- tau = // min_sub_iter: The min sub iteration of unsteady simulation. // max_sub_iter: The max sub iteration of unsteady simulation. // tol_sub_iter: The tolerance of sub iteration of unsteady simulation. // tscheme: Temporal Discretisation method. -// 1 -- Runge-Kutta Multi-State. -// 2 -- Point implicit. -// 3 -- Full implicit. -// 4 -- LU-SGS. -// 5 -- Block LU-SGS. -// 6 -- Jacobian iteration. -// 7 -- Line LU-SGS. -// 8 -- Matrix LU-SGS. +// 1 -- Runge-Kutta Multi-State. +// 2 -- Point implicit. +// 3 -- Full implicit. +// 4 -- LU-SGS. +// 5 -- Block LU-SGS. +// 6 -- Jacobian iteration. +// 7 -- Line LU-SGS. +// 8 -- Matrix LU-SGS. +// 9 -- GMRES. // iSimplifyViscousTerm: Simplify the computation of viscous term in the Block LU-SGS method. The default value assigns 1 that could speed up the computation. // Otherwise, the viscous Jacobian matrix Mv should be computed that will increase the memory and time in iteration of the BLUSGS method. // CFLStart: Started cfl number. // CFLEnd: End cfl number. // CFLVaryStep: The number of step when cfl increase from CFLStart to CFLEnd. +// GMRESCFLScale : CFL = CFLStart * GMRESCFLScal^iteration. +// OriginalTscheme : Used for LUSGS and GMres hybrid computing. +// useLUSGSprecond: Initialize flow field for GMRES. +// 0 --Initialize by first order Jacobian matrix. +// 1 --Initialize by LUSGS. +// GMRESInitStep : the number of iteration step of irst order Jacobian matrix or LUSGS for initialize flow field. // ktmax: Dtratio. dt[i] = MIN(dt[i], ktmax * dtmin / vol[i]) // swapDq: Communication dq between forward/backward sweep of LUSGS or not, default is 0. // nLUSGSSweeps: Sub iteration of LU-SGS or Block LU-SGS. // LUSGSTolerance: Sub iter tolerance of LU-SGS or Block LU-SGS. // ifLocalTimeStep: Time step method. -// 0 --Local. -// 1 --Global. +// 0 --Local. +// 1 --Global. // isUseLocalCFL: use variable number of CFL or not. -// 0 -- global unified CFL number. -// 1 -- local CFL number. +// 0 -- global unified CFL number. +// 1 -- local CFL number. // isUsePreTwall: use the previous temperatures on wall. 1 indicates yes, and 0 indicates no. // visl_min: Minimum value of laminar viscosity coefficient. // turbCFLScale: Turbulence model cfl number factor. // codeOfAleModel: Arbitrary Lagrangian-Eulerian method. -// 0 -- no ALE method. -// 1 -- ALE method for non-moving grids. -// 2 -- ALE method for moving grids. -// 3 -- ALE method for deforming grids. +// 0 -- no ALE method. +// 1 -- ALE method for non-moving grids. +// 2 -- ALE method for moving grids. +// 3 -- ALE method for deforming grids. // wallFunctionType: The type of wall function to implement. -// 0 -- no wall function. (default) -// 1 -- standard wall function. -// 2 -- Pab3D wall function. +// 0 -- no wall function. (default) +// 1 -- standard wall function. +// 2 -- Pab3D wall function. // RKStage: The number of Runge-Kutta step. // lamda: Cofficient of Runge-Kutta step. - -int iunsteady = 0; +int iunsteady = 0; double physicalTimeStep = 0.01; double physicalTimeStepDimensional = -0.001; int ifStartFromSteadyResults = 0; @@ -543,39 +558,42 @@ int ifStaticsReynoldsStress = 0; int startStatisticStep = 800000; double statisticalTimePeriod = -1.0; int statisticMethod = 0; -int linearTwoStepMethods = 1; // 1--BDF1; 2--C-N; 3--BDF2; +int linearTwoStepMethods = 1; // 1--BDF1; 2--C-N; 3--BDF2. int methodOfDualTime = 3; int min_sub_iter = 50; int max_sub_iter = 50; double tol_sub_iter = 0.01; -int tscheme = 4; +int tscheme = 4; int iSimplifyViscousTerm = 1; int ifLocalTimeStep = 0; int isUseLocalCFL = 0; int isUsePreTwall = 0; -double CFLStart = 0.01; -double CFLEnd = 10.0; -int CFLVaryStep = 500; - +double CFLStart = 0.01; +double CFLEnd = 10.0; +int CFLVaryStep = 500; +double GMRESCFLScale = 1.0; +int OriginalTscheme = 9; +int useLUSGSprecond = 1; +int GMRESInitStep = 1000; double pMaxForCFL = 0.2; double pMinForCFL = 0.1; double deltaMaxForCFL = 0.2; double magnifyFactorForCFL = 1.1; double reduceFactorForCFL = 0.5; -double ktmax = 1.0e10; +double ktmax = 1.0e10; -int swapDq = 1; +int swapDq = 1; int nLUSGSSweeps = 1; double LUSGSTolerance = 0.01; -int order = 2; +int order = 2; double visl_min = 0.01; double turbCFLScale = 1.0; -double csrv = 2.0; +double csrv = 1.0; double timemax = 1.0e10; double dtsave = -1.0; int maxale = 10; @@ -591,10 +609,9 @@ double lamda[] = [0.5, 1.0]; //int RKStage = 4; //double lamda[] = [0.25, 0.33333333333, 0.5, 1.0]; - -//----------------------------------------------------------------------- -# File In or Out # -//----------------------------------------------------------------------- +#************************************************************************ +# File In or Out * +#************************************************************************ // numberOfGridGroups: The number of grid groups. // gridfile: The partitioned Grid file path, using relative path, // which is relative to the working directory. @@ -611,20 +628,18 @@ double lamda[] = [0.5, 1.0]; // aircoeffile: The file path to save the aerodynamic force coefficients convergence process, write data for every default (intervalStepForce) steps. // restartNSFile: The file path to write restart flowfield variables, write data for every default (intervalStepFlow) steps. // turbfile: The file path to write restart flowfield variables of turbulence , write data for every default(intervalStepFlow) steps. -// visualfile: The visualization file path of flowfield , write data for every default (intervalStepPlot) steps. +// visualfile: The visualization file path of flowfield, write data for every default (intervalStepPlot) steps. // wall_aircoefile: The file path to save flowfield variables of wall, write data for every default steps. // nDumpSurfaceInfo = 0 the "wall_varfile" write the informations including heat flux. // nDumpSurfaceInfo = 1 the "wall_varfile" write the informations without heat flux. // nIsComputeWallDist: Whether to compute the wall distance. // 0 -- Compute wall distance. // 1 -- Not compute. -// -// protectionFile0 and protectionFile1 : Two continuation file of the data protection mechanism. -// wall_heatfluxfile : The file to output the MaxHeatFlux of wall. - -int numberOfGridGroups = 1; -string gridfile = "./grid/rae2822_hybrid2d__4.fts"; -string wallTemperaturefile= ""; +// protectionFile0 and protectionFile1: Two continuation file of the data protection mechanism. +// wall_heatfluxfile: The file to output the MaxHeatFlux of wall. +int numberOfGridGroups = 1; +string gridfile = "./grid/rae2822_hybrid2d__4.fts"; +string wallTemperaturefile = ""; int nIsComputeWallDist = 0; int walldistMethod = 1; @@ -632,10 +647,12 @@ int cellMethodOrNodeMethod = 0; string resSaveFile = "results/res.dat"; string turbresfile = "results/turbres.dat"; +string transitionResFile = "results/transitionRes.dat"; string aircoeffile = "results/aircoef.dat"; string restartNSFile = "results/flow.dat"; string turbfile = "results/turb.dat"; +string transitionFile = "results/transition.dat"; string visualfile = "results/tecflow.plt"; string wall_aircoefile = "results/wall_aircoef.dat"; @@ -645,10 +662,14 @@ string protectionFile0 = "results/flow0.dat"; string protectionFile1 = "results/flow1.dat"; string wall_heatfluxfile = "results/wall_heatflux.dat"; -int nDumpSurfaceInfo = 0; -string wall_varfile = ""; +string protectionTurbFile0 = "results/turb0.dat"; +string protectionTurbFile1 = "results/turb1.dat"; -string jetDefineFile = "bin/jet.hypara"; +string protectionTransitionFile0 = "results/transition0.dat"; +string protectionTransitionFile1 = "results/transition1.dat"; + +int nDumpSurfaceInfo = 0; +string wall_varfile = ""; string sixDofFileName = "results/sixDofInfo.dat"; string derivativeFileName = "results/identify.dat"; @@ -659,7 +680,8 @@ int plotFieldType = 0; // visualfileType: The file type of visualfile. // 0 -- Tecplot binary. // 1 -- Tecplot ASCII. - +// 2 -- Ensight binary. +// 3 -- Ensight ASCII. int visualfileType = 1; // samplefileMode: The dump mode of sample file. @@ -697,21 +719,21 @@ double upperPlotFieldBox[] = [1.0 1.0 1.0]; // -- vibration temperature(Tv, 33), electron temperature(Te, 34), vibrational energy(Ev, 35), electric energy(Ee, 36), // -- number density of electron(Ne, 37), dimensioanl density(rho, 38), dimensioanl pressure(p, 39), dimensioanl temperature(T, 40), // -- gradientUx(41), gradientUy(42), gradientVx(43), gradientVy(44), streamline_u(45), streamline_v(46), streamline_w(47), -// -- transition intermittency(intermittency, 51), -transition momentum thickness reynolds(MomentumThicknessReynolds, 52), -// -- overlap iblank(iblank, 81) - -// -- specific heat ratio(gama, 56) +// -- transition intermittency(intermittency, 51), transition momentum thickness reynolds(MomentumThicknessReynolds, 52), +// -- local CFL Number(localCFL, 57), minimal CFL Number(minCFL, 58), +// -- overlap iblank(iblank, 81), +// -- specific heat ratio(gama, 56), Knudsen number(kn, 60), Damkohler number(Da, 61), vibrational nonequilibrium number(Vi, 62). // Important Warning: Array size of visualVariables MUST be equal to nVisualVariables!!! // Variables order must from small to big. //-----------the optional parameters list for the wall boundary condition---------------- // nVisualWallVariables: The number of visual variables on wall. // visualWallVariables : dumped variable types, listed as following: -// -coefficient of pressure(cp, 0), -coefficient of friction(cf, 1), yplus(2), -non-dimensional heat flux(Q_NonDim, 3), -dimensional heat flux(Q_Dim, 4), -// -pressure on wall(pw, 5), -temperature on wall(Tw, 6), -density on wall(rhow, 7), -heat flux of translational-rotational temperature term(Qtr, 8), -// -heat flux of species diffusion term(Qs, 9), -heat flux of vibrational temperature term(Qv, 10), -heat flux of electron temperature term(Qe, 11), -// -species mass fractions(Ns, 12), -x component of wall velocity(Vx, 13), -y component of wall velocity(Vy, 14), -z component of wall velocity(Vz, 15) -// -slip translational-rotational temperature(Tts, 16), -slip vibrational temperature(Tvs, 17), -slip electron temperature(Tes, 18), -absolute wall velocity(Vs, 19) -// -Stanton number(St, 20), -coefficient of heat rate(Ch, 21), -temperature jump(deltaT, 22), -Grid Reynolds number on wall(Re_w, 23) +// -- coefficient of pressure(cp, 0), coefficient of friction(cf, 1), yplus(2), non-dimensional heat flux(Q_NonDim, 3), dimensional heat flux(Q_Dim, 4), +// -- pressure on wall(pw, 5), temperature on wall(Tw, 6), density on wall(rhow, 7), heat flux of translational-rotational temperature term(Qtr, 8), +// -- heat flux of species diffusion term(Qs, 9), heat flux of vibrational temperature term(Qv, 10), heat flux of electron temperature term(Qe, 11), +// -- species mass fractions(Ns, 12), x component of wall velocity(Vx, 13), y component of wall velocity(Vy, 14), z component of wall velocity(Vz, 15), +// -- slip translational-rotational temperature(Tts, 16), slip vibrational temperature(Tvs, 17), slip electron temperature(Tes, 18), absolute wall velocity(Vs, 19), +// -- Stanton number(St, 20), coefficient of heat rate(Ch, 21), temperature jump(deltaT, 22), Grid Reynolds number on wall(Re_w, 23), Knudsen number(Kn_wall, 24). int nVisualVariables = 8; int visualVariables[] = [0, 1, 2, 3, 4, 5, 6, 15]; @@ -739,16 +761,18 @@ int dumpStandardModel = 0; // 1 -- Real cell where the probe is located. // nProbeVariables: Number of variables want to be dumped for probes monitered. // probeVariables : Variable types dumped, listed as following: -// -- density(0), u(1), v(2), w(3), pressure(4), temperature(5), mach(6). +// -- density(0), u(1), v(2), w(3), pressure(4), temperature(5), mach(6), +// -- dimensioanl_density(7), dimensioanl_u(8), dimensioanl_v(9), +// -- dimensioanl_w(10), dimensioanl_pressure(11), dimensioanl_temperature(12). // Important Warning: Array size of probeVariables MUST be equal to nProbeVariables!!! // probeVariables order must from small to big. // probeVariablesInterpolationMethod: Interpolation method used to compute the probe variables. -// 0 -- Take the value of probe's cell as probe real value. -// 1 -- Interpolation from probe's and neighbouring cell to probe. -// 2 -- Interpolation from probe's cell nodes to probe. +// 0 -- Take the value of probe's cell as probe real value. +// 1 -- Interpolation from probe's and neighbouring cell to probe. +// 2 -- Interpolation from probe's cell nodes to probe. int ifSetDataMonitor = 0; -int dataMonitorType = 0; +int dataMonitorType = 0; string probesDefineFile = "bin/probes_XYZ.dat"; //int dataMonitorType = 1; @@ -761,28 +785,26 @@ string probesDefineFile = "bin/probes_XYZ.dat"; int searchCellsMethod = 0; -int nProbeVariables = 7; -int probeVariables[] = [0, 1, 2, 3, 4, 5, 6]; -int probeVariablesInterpolationMethod = 0; -//----------------------------------------------------------------------- -# Turbulence Parameter # -//----------------------------------------------------------------------- +int nProbeVariables = 14; +int probeVariables[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]; +int probeVariablesInterpolationMethod = 0; + +#************************************************************************ +# Turbulence Parameter * +#************************************************************************ // turbInterval: Iteration number of turbulence. // kindOfTurbSource: Kinds of turbulent source. // 0 -- Original. // mod_turb_res: If modify the residuals for the cells next to the wall or not, default is 0. -// transitionType: transition model type +// transitionType: transition model type // 0 -- none. // 2 -- gama-re-theta. -// turbIntensity: (valid while greater than 0.0 ) turbulent intensity of free stream(*100) in transition -// freeturbIntensitySRModify: to use SR modify in free stream turbulent intensity decay or not - - +// turbIntensity: (valid while greater than 0.0 ) turbulent intensity of free stream(*100) in transition. +// freeturbIntensitySRModify: to use SR modify in free stream turbulent intensity decay or not. int turbInterval = 1; int turbOrderStruct = 2; int kindOfTurbSource = 0; int mod_turb_res = 0; -double turb_relax = 1.0; double freeStreamViscosity = 1.0e-3; double muoo = 3.0; double kwoo = 5.0; @@ -790,29 +812,28 @@ int transitionType = 0; double turbIntensity = -1.0; int freeturbIntensitySRModify = 0; double freeDecayXLocation = 0.0; -int compressibleCorrection = 0; -int prandtlNumberCorrection = 0; +int compressibleCorrection = 0; int transitionMaFix = 1; -# maximum eddy viscosity (myt/my) max. +// maximum eddy viscosity (myt/my) max. double eddyViscosityLimit = 1.0e10; int monitor_vistmax = 0; -//----------------------------------------------------------------------- -# LES Parameter # -//----------------------------------------------------------------------- +#************************************************************************ +# LES Parameter * +#************************************************************************ // iLES: Create LESSolver or not. -// = 1 - Create LESSolver; -// != 1 - not. +// = 1 -- Create LESSolver; +// != 1 -- not. // amplitudeofDisturb: Amplitude of adding disturb. // disturbstep: Unsteady time step or steady iteration of adding random disturb. // iterdisturb: Add random disturb in every sub-iter or only first sub-iter. -// = 0 - in only first sub-iter; -// != 0 - in every sub-iter. +// = 0 -- in only first sub-iter; +// != 0 -- in every sub-iter. // ipraddisturb: Add density and pressure disturb or not. // ibodyforce: Add body force in source flux of NS equations or not. -// = 0 - not; -// != 0 - Add body force. +// = 0 -- not; +// != 0 -- Add body force. // bodyforce: Body force in source flux of NS equations or not. // utau: friction velocity, using in DNSDisturb. // sgsmodel: subgrid scale model. @@ -820,23 +841,22 @@ int monitor_vistmax = 0; // = "dsmCom"; // = "wale"; // = "sigma". -// deltaFunctionType: = 1 - MAX(deltai, deltaj, deltak); -// = 2 - pow(deltai * deltaj *deltak, 1/3); -// = 3 - Devloped by Scotti. -// wallDampingFunctionType: = 0 - no wall function; -// = 1 - van Driest; -// = 2 - developed by Dr. Deng Xiaobing; -// = 3 - developed by Piomelli. +// deltaFunctionType: = 1 -- MAX(deltai, deltaj, deltak); +// = 2 -- pow(deltai * deltaj *deltak, 1/3); +// = 3 -- Devloped by Scotti. +// wallDampingFunctionType: = 0 -- no wall function; +// = 1 -- van Driest; +// = 2 -- developed by Dr. Deng Xiaobing; +// = 3 -- developed by Piomelli. // turbViscousCutType: turbulent viscosity cut type. -// = 0 - mu_total = mut + mul; -// = 1 - mu_total = max(mut-mul,0)+ mul; -// = 2 - mu_total = max(mut ,0)+ mul. +// = 0 -- mu_total = mut + mul; +// = 1 -- mu_total = max(mut-mul, 0) + mul; +// = 2 -- mu_total = max(mut , 0) + mul. // smagConstant: constant of smagorinsky model. // waleConstant: constant of wale model. -// filterDirection[3]: filter variables in i, j, k direction or not. +// filterDirection [3]: filter variables in i, j, k direction or not. // averageDirection[3]: average variables in i, j, k direction or not. // isotropicConstant: constant of isotropic part of SGS stress. - int iLES = 0; string sgsmodel = "smagorinsky"; int deltaFunctionType = 2; @@ -852,19 +872,16 @@ double testFilterScale = 2.0; int averageWidth = 1; int monitorNegativeConstant = 0; -//----------------------------------------------------------------------- -# Other Parameters for Hypersonic Non-equilibrium Gas # -//----------------------------------------------------------------------- +#************************************************************************ +# Other Parameters for Hypersonic Non-equilibrium Gas * +#************************************************************************ // dg_high_order: // 0 -- generic order accuracy. // 1 -- high order accuracy. // iapplication: // 0 -- gas model is fixed in the codes. // 1 -- gas model is imported from library files. -// isAdaptiveSolver: isAdaptiveSolver=0 indicates the generic Navier-Stokes solver, -// isAdaptiveSolver>0 indicates the HyFlow self-adaptive solver. -// 1 -- using HyFlow self-adaptive solver where the switch is controlled by the total iteration steps. -// 2 -- using HyFlow self-adaptive solver where the switch is controlled by variation of the key residual. +// isAdaptiveSolver: isAdaptiveSolver = 0 indicates the generic Navier-Stokes solver, // nm: Equation number of the physics, but is out of commision now. // 4 -- for 2D. // 5 -- for 3D. @@ -875,7 +892,7 @@ int monitorNegativeConstant = 0; // 2 -- Argon. // 3 -- Nitrogen. // nEnergyRecycle: The type of EnergyModel Recycle. -// 0 -- not used . +// 0 -- not used. // 1 -- used. // nDensityModify: The type of densitymodify. // 0 -- not used. @@ -883,26 +900,25 @@ int monitorNegativeConstant = 0; // nchem: // 0 -- without chemical reaction flow. // 1 -- the chemical reaction flow is considered. -// nEquilibriumGas: the variable is valid when the condition of nchem=0 is satisfied. +// nEquilibriumGas: the variable is valid when the condition of nchem = 0 is satisfied. // 0 -- perfect gas. // 5, 7, 11 -- equilibrium gas, meanwhile, its value denotes the number of gas component. -// nPCWCycleStep: the maximum step number of iteration in the module of computing species mass fractions with the partial catalytic wall(PCW) condition. -// the value equals to or is greater than 1, and 3 is for default value. -// nRETCycleStep: the maximum step number of iteration in the module of computing radiation equilibrium temperature on wall. -// the value equals to or is greater than 1, and 3 is for default value. -// nSLIPCycleStep:the maximum step number of iteration in the module of computing slip temperature, slip velocity and slip species mass fraction. -// the value equals to or is greater than 1, and 3 is for default value. -// nSlipBCModel : The computational model of slip boundary conditions. - -// 0 -- no slip. -// 1 -- the conventional Maxwell slip conditions. -// 2 -- the Gokcen slip conditions. -// 3 -- the Knudsen-layer correction of the standard slip conditions proposed by Lockerby, et al. -// 4 -- the Kogan simplified slip conditions. -// nMeanFreePathType : the method to the mean free-path for the slip conditions. For the mixture, 0 is suggested. -// 0 -- the equivalent mean free-path is calculated by the simple hard sphere model(HS). -// 1 -- calculated by the definition that includes the variables of the number density and the molecule diameter. -// 2 -- the equivalent mean free-path is calculated by the variable hard sphere model(VHS). +// nPCWCycleStep: The maximum step number of iteration in the module of computing species mass fractions with the partial catalytic wall(PCW) condition. +// The value equals to or is greater than 1, and 3 is for default value. +// nRETCycleStep: The maximum step number of iteration in the module of computing radiation equilibrium temperature on wall. +// The value equals to or is greater than 1, and 3 is for default value. +// nSLIPCycleStep:The maximum step number of iteration in the module of computing slip temperature, slip velocity and slip species mass fraction. +// The value equals to or is greater than 1, and 3 is for default value. +// nSlipBCModel: The computational model of slip boundary conditions. +// 0 -- no slip. +// 1 -- the conventional Maxwell slip conditions. +// 2 -- the Gokcen slip conditions. +// 3 -- the Knudsen-layer correction of the standard slip conditions proposed by Lockerby, et al. +// 4 -- the Kogan simplified slip conditions. +// nMeanFreePathType: the method to the mean free-path for the slip conditions. For the mixture, 0 is suggested. +// 0 -- the equivalent mean free-path is calculated by the simple hard sphere model(HS). +// 1 -- calculated by the definition that includes the variables of the number density and the molecule diameter. +// 2 -- the equivalent mean free-path is calculated by the variable hard sphere model(VHS). // nchemsrc: // 0 -- the source terms are not computed. // 1 -- the source terms are computed. @@ -913,148 +929,151 @@ int monitorNegativeConstant = 0; // 1 -- One-temperature model. // 2 -- Two-temperature model. // 3 -- Three-temperature model. +// isUseNoneqCond: +// 0 -- compute the source terms without any conditions. +// 1 -- compute the source terms using the non-equilibrium condition. +// frozenCondition: the threshold value of frozen chemical flow condition, 0.1 is the default value. // nIdealState: whether take all gas species as ideal gas for gas-mixture process. // 0 -- No. -// 1 -- Yes. -// nTEnergyModel: the method to computing temperature energy model. +// 1 -- Yes. // nTEnergyModel: the method to computing temperature energy model. // 0 -- the energy term is computed using the conventional method. // 1 -- the energy term is computed using the polynomial fitting method. // 2 -- the energy term is computed using the piecewise polynomial fitting method. // parkVDPower: the power of translational-rotational temperature in the Park V-D(vibration-dissociation) coupling model. // The value is in range of [0.0, 1.0], DPLR suggests 0.5, LAURA suggests 0.7, while 0.6 is given as default value. // catalyticCoef: -// 0.0 -- full non-catalytic wall boundary condition. -// 1.0 -- full catalytic wall boundary condition. -// in range of (0.0, 1.0) -- partial catalytic condition, the value indicates the catalytic coefficient. -// nIsSuperCatalytic : the super catalytic condition for the fully catalytic wall, and assigned with the value of 1. -// 0 -- equilibrium condition for the fully catalytic wall where the mass fractions are assigned with the values of the free stream. -// 1 -- super catalytic condition for the fully catalytic wall where all the atomic components combine into molecular components. -// nTemperatureJump : the method to calculate the temperature jump. -// 0 -- calculated by the variables of heat conductivity and constant volume specific heat for each energy mode. -// 1 -- the general method where the iteration is calculated with the translation-rotation temperature. -// nSurfGradMethod : the method to compute the surface heating ratio. -// 0 -- the gradient of variable is computed with the first-order difference method. -// 1 -- the gradient of variable is computed with the Green-Guass integral method. -// nRapidFlowfield : initialize the flowfield using the rapid engineering method when it is greater than zero. -// nSurfHeatMonitor : To exam the surface heating change or not. 0 is no, 1 is yes. -// nInitPressureStep : the steps to initialize the boundary variables when the rapid method is used. 100 is the default value. -// nDumpCFLNumber : 1 indicates dumping the CFL number to file, 0 denotes no dumping. +// 0.0 -- full non-catalytic wall boundary condition. +// 1.0 -- full catalytic wall boundary condition. +// in range of (0.0, 1.0) -- partial catalytic condition, the value indicates the catalytic coefficient. +// nIsSuperCatalytic: the super catalytic condition for the fully catalytic wall, and assigned with the value of 1. +// 0 -- equilibrium condition for the fully catalytic wall where the mass fractions are assigned with the values of the free stream. +// 1 -- super catalytic condition for the fully catalytic wall where all the atomic components combine into molecular components. +// nTemperatureJump: the method to calculate the temperature jump. +// 0 -- calculated by the variables of heat conductivity and constant volume specific heat for each energy mode. +// 1 -- the general method where the iteration is calculated with the translation-rotation temperature. +// nSurfGradMethod: the method to compute the surface heating ratio. +// 0 -- the gradient of variable is computed with the first-order difference method. +// 1 -- the gradient of variable is computed with the Green-Guass integral method. +// nRapidFlowfield: initialize the flowfield using the rapid engineering method when it is greater than zero. +// nSurfHeatMonitor: To exam the surface heating change or not. 0 is no, 1 is yes. +// nInitPressureStep: the steps to initialize the boundary variables when the rapid method is used. 100 is the default value. +// nDumpCFLNumber: 1 indicates dumping the CFL number to file, 0 denotes no dumping. // sigmaVelocity: the coordination coefficient of tangential momentum for computation of slip velocity. The value is in range of (0.0, 2.0]. // sigmaTemperature: the heat coordination coefficient for computation of slip temperature. The value is in range of (0.0, 2.0]. // sigmaMassFraction: the species coordination coefficient for computation of slip mass fractions. The value is in range of (0.0, 2.0]. // velocitySlipCorrectConstant: the correction constant to the velocity slip condition. For the diffuse reflection, 1.0 is used. -// 1.0 -- proposed by Maxwell. -// sqrt(2/PI)~0.8 -- used for "micro-slip", namely the actual velocity slip at the wall. -// 1.146 -- proposed for an additional "fictitious" velocity slip. - -// chemicalRelaxCorf: The value is in range of [0.001, 1.0]. -// spectrumRadiusCoef: The value is in range of [0.0, 2.0]. -// staticPressureRelaxCorf: The value is in range of [0.1, 1.0]. -// nIsChemicalFreeze : the flag to freeze the chemical reactions. -// 0 -- not freeze, the chemical reaction sources will be calculated. -// 1 -- freezes the chemical reactions, the chemical reaction sources will not be calculated.// veTemperatureMin: The minimum of Tv and Te - -//maxViscous: the maximum of Viscous. -//trTemperatureMin: the minimum value of trTemperature. -//veTemperatureMin: the minimum value of veTemperature. -//densityMin: the minimum value of density. -//tAdjustmentFactor: magnification of temperature, this value is in range of (1.0, 10.0]. -// nDebug: cout the Wrong place and abort -// 0 -- not used. -// 1 -- used. +// 1.0 -- proposed by Maxwell. +// sqrt(2/PI)~0.8 -- used for "micro-slip", namely the actual velocity slip at the wall. +// 1.146 -- proposed for an additional "fictitious" velocity slip. +// chemicalRelaxCorf: The value is in range of [0.001, 1.0]. +// spectrumRadiusCoef: The value is in range of [0.0, 2.0]. +// staticPressureRelaxCorf: The value is in range of [0.1, 1.0]. +// nIsChemicalFreeze: the flag to freeze the chemical reactions. +// 0 -- not freeze, the chemical reaction sources will be calculated. +// 1 -- freezes the chemical reactions, the chemical reaction sources will not be calculated. +// veTemperatureMin: The minimum of Tv and Te. +// maxViscous: the maximum of Viscous. +// trTemperatureMin: the minimum value of trTemperature. +// veTemperatureMin: the minimum value of veTemperature. +// densityMin: the minimum value of density. +// tAdjustmentFactor: magnification of temperature, this value is in range of (1.0, 10.0]. +// nDebug: cout the Wrong place and abort +// 0 -- not used. +// 1 -- used. // nSpeciesLimit: limitter of gas species -// 0 -- not used. -// 1 -- used. -// nTurblenceForChemical: the coupled mode of Turblence and Chemical reaction -// 0 -- method 0. -// 1 -- method 1. -// nViscosityFluxSublevelModified: Modified for ViscosityFlux on Sublevel grid -// 0 -- not used. -// 1 -- used. -// nViscosityPeModified: Pe Modified for ViscosityCoef -// 0 -- not used. -// 1 -- used. -// nChemcalSourceModified: Modified on ChemcalSource -// 0 -- not used. -// 1 -- used. -// nChemcalSourceEsMethod: Modified on ChemcalSource -// 0 -- approximation algorithm 1 (Ori.) -// 1 -- approximation algorithm 2 (New) - +// 0 -- not used. +// 1 -- used. +// nTurblenceForChemical: the coupled mode of Turblence and Chemical reaction. +// 0 -- method 0. +// 1 -- method 1. +// nViscosityFluxSublevelModified: Modified for ViscosityFlux on Sublevel grid. +// 0 -- not used. +// 1 -- used. +// nViscosityPeModified: Pe Modified for ViscosityCoef. +// 0 -- not used. +// 1 -- used. +// nChemcalSourceModified: Modified on ChemcalSource. +// 0 -- not used. +// 1 -- used. +// nChemcalSourceEsMethod: Modified on ChemcalSource. +// 0 -- approximation algorithm 1 (Ori). +// 1 -- approximation algorithm 2 (New). // nMaxStepTemperature: the iterative steps of temperature. - -// veTemperatureMinModified: Modified on the minimum of Tve for Cvvs -// 0 -- not used -// 1 -- used - -// nDiagonalModified: Modified on Diagonal -// 0 -- not used -// 1 -- Ori. -// 2 -- new - -//nGradPrimtiveMethod: -// 0 -- Ori. -// 1 -- new +// veTemperatureMinModified: Modified on the minimum of Tve for Cvvs. +// 0 -- not used. +// 1 -- used. +// nDiagonalModified: Modified on Diagonal. +// 0 -- not used. +// 1 -- new. +// nDiagonalModifiedTurb: Modified on Diagonal for turbulence. +// 0 -- not used. +// 1 -- new. +// nGradPrimtiveMethod: +// 0 -- Ori. +// 1 -- new. // nAblation: -// 0 -- The wall ablation is not computed. -// 1 -- The wall ablation is computed. +// 0 -- The wall ablation is not computed. +// 1 -- The wall ablation is computed. // isInjection: -// 0 -- The injection velocity of ablation wall is not computed. -// 1 -- The injection velocity of ablation wall is computed. +// 0 -- The injection velocity of ablation wall is not computed. +// 1 -- The injection velocity of ablation wall is computed. // nViscosityModel: -// 0 -- Blottner fitting method(N89). -// 1 -- Gupta fitting method(N90). +// 0 -- Blottner fitting method(N89). +// 1 -- Gupta fitting method(N90). // nContinueModel: The new continue model can switch different computation model. -// 0 -- Not use the new continue model. -// 1 -- use the new continue model. +// 0 -- Not use the new continue model. +// 1 -- use the new continue model. // nSutherland: -// 0 -- stands for selecting the Blotter curve fits mode. -// 1 -- stands for Sutherland relation. +// 0 -- stands for selecting the Blotter curve fits mode. +// 1 -- stands for Sutherland relation. // gasfile: Indicates the gas model, 9 models are provided, namely "Gu5", "Gu7", "Gu11", "Pa5", "Pa7", "Pa11", "DK5", "DK7", "DK11". -// "Gu" -- indicates the Gupta Model, three-Type Models are embeded in the library, namely, the 5-species-6-reactions, the 7-species-9-reactions, the 11-species-20-reactions. -// "Pa" -- indicates the Park Model, three-Type Models are embeded in the library, namely, the 5-species-17-reactions, the 7-species-22-reactions, the 11-species-48-reactions. -// "DK" -- indicates the Dunn-Kang Model, three-Type Models are embeded in the library, namely, the 5-species-11-reactions, the 7-species-15-reactions, the 11-species-26-reactions. -// "Mars-Pa8" is for Park model of Mars gas, "Mars-Mc8" for McKenzie model of Mars gas. -// "Combustion-12" -- indicates the Combustion Chamber Gas Model which includes 12-species-20-reactions. -// "Gas-Mixture" -- indicates the process of mixing gas without reacting. -// for struct solver mixing two speciesSpeciesA, SpeciesB. -// for unstruct solver mixing multi-speciesO2 NO CO CO2 H2 N2 Air CH4. -// For self-definition model, the gasfile is used to indicate the file path of the new gas model. +// "Gu" -- indicates the Gupta Model, three-Type Models are embeded in the library, namely, the 5-species-6-reactions, the 7-species-9-reactions, the 11-species-20-reactions. +// "Pa" -- indicates the Park Model, three-Type Models are embeded in the library, namely, the 5-species-17-reactions, the 7-species-22-reactions, the 11-species-48-reactions. +// "DK" -- indicates the Dunn-Kang Model, three-Type Models are embeded in the library, namely, the 5-species-11-reactions, the 7-species-15-reactions, the 11-species-26-reactions. +// "Mars-Pa8" is for Park model of Mars gas, "Mars-Mc8" for McKenzie model of Mars gas. +// "Combustion-12" -- indicates the Combustion Chamber Gas Model which includes 12-species-20-reactions. +// "Gas-Mixture" -- indicates the process of mixing gas without reacting. +// for struct solver mixing two species��SpeciesA, SpeciesB��. +// for unstruct solver mixing multi-species��O2 NO CO CO2 H2 N2 Air CH4��. +// For self-definition model, the gasfile is used to indicate the file path of the new gas model. // speciesName: Used to list the names of each species, while each species name is separated by the symbol of comma. // initMassFraction: Used to list the initial mass fractions of species in accordance with the sequence of names in the parameter speciesName. // ifStartFromPerfectGasResults: The chemical reaction simulation is start from perfect gas flowfield or not, 0 is for no and else is for yes. -// nIterFirstStep : the maximum number of iteration in the first step for the self-adaptive calculation. -// nIterSecondStep : the maximum number of iteration in the second step for the self-adaptive calculation. -// nIterThirdStep : the maximum number of iteration in the third step for the self-adaptive calculation. -// nEnergyAssembly : the vibration energy is computed with combined method which includes the fitting method and the molecular kinetic theory. -// 0 -- no, -// 1 -- yes. +// nIterFirstStep : the maximum number of iteration in the first step for the self-adaptive calculation. +// nIterSecondStep: the maximum number of iteration in the second step for the self-adaptive calculation. +// nIterThirdStep : the maximum number of iteration in the third step for the self-adaptive calculation. +// nEnergyAssembly: the vibration energy is computed with combined method which includes the fitting method and the molecular kinetic theory. +// 0 -- no, +// 1 -- yes. // nControlVariable: the variable to computing the residual error that determines the convergence is meet or not in the one-temperature model. -// 0 -- the density. -// 1 -- the translation temperature. -// 2 -- the vibration temperature. -// 3 -- the electron temperature. -// 4 -- the pressure. -// 5 -- the mass fraction of oxygen. -// 6 -- the mass fraction of nitrogen. +// 0 -- the density. +// 1 -- the translation temperature. +// 2 -- the vibration temperature. +// 3 -- the electron temperature. +// 4 -- the pressure. +// 5 -- the mass fraction of oxygen. +// 6 -- the mass fraction of nitrogen. // firstStepError : the residual error of the first step iteration for the self-adaptive calculation. // secondStepError : the residual error of the second step iteration for the self-adaptive calculation. // thirdStepError : the residual error of the third step iteration for the self-adaptive calculation. -// useHyflowSetting : Setting for HyFLOW GUI. -// 0 -- PHengLEI -// 1 -- HyFLOW -// nProtectData : Use the continuation file data protection mechanism. -// 0 -- no -// 1 -- yes - +// nProtectData: Use the continuation file data protection mechanism. +// 0 -- no. +// 1 -- yes. +// nTvChange: Judge whether the Tv equals Ttr. +// 0 -- yes. +// 1 -- no. +// isMoleFractionType: 1 indicates the mass fractions, or else the mole fractions. +// nFraction: the initial fractions type of species. +// 0 -- mass fraction. +// 1 -- mole fraction. int dg_high_order = 0; int iapplication = 0; int isAdaptiveSolver = 0; -int nm = 5; +int nm = 5; int nEquilibriumGas = 0; -int nPCWCycleStep = 3; -int nRETCycleStep = 3; -int nSLIPCycleStep= 3; +int nPCWCycleStep = 3; +int nRETCycleStep = 3; +int nSLIPCycleStep = 3; int nIterFirstStep = 1000; int nIterSecondStep= 2000; int nIterThirdStep = 2000; @@ -1065,17 +1084,17 @@ double secondStepError = 0.001; double thirdStepError = 0.001; double predictCFLError = 0.1; -double refGama = 1.4; -double prl = 0.72; -double prt = 0.90; -double sc_l = 0.5; -double sc_t = 0.5; +double refGama = 1.4; +double prl = 0.72; +double prt = 0.90; +double sc_l = 0.5; +double sc_t = 0.5; -int nGasModel = 0; -int nchem = 0; -int nchemsrc = 1; -int nchemrad = 1; -int ntmodel = 1; +int nGasModel = 0; +int nchem = 0; +int nchemsrc = 1; +int nchemrad = 1; +int ntmodel = 1; int nIdealState = 0; int nEnergyRecycle = 1; @@ -1099,12 +1118,12 @@ double sigmaTemperature = 1.0; double sigmaMassFraction = 1.0; double velocitySlipCorrectConstant = 1.0; -double chemicalRelaxCorf = 1.0; +double chemicalRelaxCorf = 1.0; double chemicalSpectrumRadiusCoef = 1.0; double viscousSpectrumRadiusCoef = 1.5; double inviscidSpectrumRadiusCoef = 1.5; -double spectrumRadiusCoef = 0.5; -double staticPressureRelaxCorf = 0.2; +double spectrumRadiusCoef = 0.5; +double staticPressureRelaxCorf = 0.2; double maxViscous = 10000.0; double trTemperatureMin = 10.0; @@ -1114,31 +1133,35 @@ double densityMin = 1.0e-8; double densityMinFactor = 0.1; double tAdjustmentFactor = 10.0; double iniSpeedCoef = 1.0; +int iniSpeedMode = 0; -int nDebug = 0; -int nSpeciesLimit = 1; -int nTurblenceForChemical = 0; -int nViscosityFluxSublevelModified = 1; -int nViscosityPeModified = 0; -int nChemcalSourceModified = 2; -int nChemcalSourceEsMethod = 1; -int nMaxStepTemperature = 5; -int veTemperatureMinModified = 1; -int nDiagonalModified = 0; -int nGradPrimtiveMethod = 1; -int nInviscidFluxModify = 1; -int nQlLimitMethod = 2; -int nSpeciesForWallMethod = 1; -int nDensityForWallMethod = 0; +int nDebug = 0; +int nSpeciesLimit = 1; +int nTurblenceForChemical = 0; +int nViscosityFluxSublevelModified = 1; +int nViscosityPeModified = 0; +int nChemcalSourceModified = 2; +int nChemcalSourceEsMethod = 1; +int nMaxStepTemperature = 5; +int veTemperatureMinModified = 1; +int nDiagonalModified = 0; +int nDiagonalModifiedTurb = 0; +int nGradPrimtiveMethod = 1; +int nInviscidFluxModify = 1; +int nQlLimitMethod = 2; +int nSpeciesForWallMethod = 1; +int nDensityForWallMethod = 0; +int wallMultiTemperature = 0; -int nProtectData = 0; -int useHyflowSetting = 0; -int nAblation = 0; -int isInjection = 0; -int nViscosityModel = 0; -int nMarsModel = 0; -string gasfile = "DK5"; -//string gasfile = "./chemical/Dunn-Kang_air5s11r.dat"; +int nProtectData = 0; +int nAblation = 0; +int isInjection = 0; +int nViscosityModel = 0; +int nMarsModel = 0; +int nTvChange = 0; +int isMoleFractionType = 0; +string gasfile = "DK5"; +//string gasfile = "./chemical/Dunn-Kang_air5s11r.dat"; string speciesName = "O, O2, NO, N, N2"; string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.767"; @@ -1152,16 +1175,16 @@ string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.767"; //string speciesName = "O, O2, NO, N, N2, C, CO, CO2"; //string initMassFraction = "0.0015, 0.0429, 0.0, 0.0, 0.0, 0.0, 0.0777, 0.8779"; -//string gasfile = "Pa"; +//string gasfile = "Pa"; //string speciesName = "O, O2, NO, N, NO+, C, C2, CO, CO2, CN, N2, e-"; //string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.767, 0.0"; -//string gasfile = "Combustion-12"; +//string gasfile = "Combustion-12"; //string speciesName = "O, O2, NO, N, C, CO, CO2, H, H2, OH, H2O, N2"; //string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.767"; //string gasfile = "Gas-Mixture"; -//string speciesName ="SpeciesA, SpeciesB"; +//string speciesName = "SpeciesA, SpeciesB"; //string initMassFraction = "1.0, 0.0"; int nSutherland = 0; double gamaSpeciesA = 1.4; @@ -1173,9 +1196,17 @@ double molecularWeightSpeciesB = 30.0; //string speciesName = "O2, N2"; //string initMassFraction = "1.0, 0.0"; +int nFraction = 0; int nContinueModel = 0; int nChemicalFlowStep = 0; int ifStartFromPerfectGasResults = 0; +int isUseNoneqCond = 0; +double frozenCondition = 0.01; + +int nLeakageMonitor = 0; +double totalLeakageVolume = 1000.0; +double monitorThresholdValue = 0.05; +double sprayFactor = 0.0; ######################################################################### // Multi-Grid parameters. @@ -1196,7 +1227,6 @@ int ifStartFromPerfectGasResults = 0; // 1 -- zero order. // 2 -- first-order. (default) // mgCorrectionLimit: Multi-grid correction limit. - int nMGLevel = 1; int MGCoarsestIteration = 1; int MGPreIteration = 1; @@ -1218,20 +1248,20 @@ int ismooth_turb = 0; int SAProductType = 2; // ----------------- Overset Grid parameter ----------------------------- -int codeOfDigHoles = 1; -int codeOfTurbulentModel = 0; -string masterFileName = "./grid/searchFile.inp"; -string holeBasicFileName = "./grid/holeBasicFile.inp"; -string holeFullFileName = "./grid/holeFullFile.dat"; -string linkFileName = "./grid/topology.dat"; -string zoneInverseFileName = "./grid/zoneInverseMapping.inp"; +int codeOfDigHoles = 1; +int codeOfTurbulentModel = 0; +string masterFileName = "./grid/searchFile.inp"; +string holeBasicFileName = "./grid/holeBasicFile.inp"; +string holeFullFileName = "./grid/holeFullFile.dat"; +string linkFileName = "./grid/topology.dat"; +string zoneInverseFileName = "./grid/zoneInverseMapping.inp"; -######################################################################### -# High Order Struct Solver # -######################################################################### +#************************************************************************ +# High Order Struct Solver * +#************************************************************************ // isFVMOrFDM: -// 0 -- NSSolverStruct using Finite Volume Method. -// 1 -- NSSolverStruct using Finite Differ Method. +// 0 -- NSSolverStruct using Finite Volume Method. +// 1 -- NSSolverStruct using Finite Differ Method. // SolverStructOrder: Spatial discretisation order of NS equations with struct grid. // <= 2 -- finite volume method. // >= 3 -- finite difference order. (to be completed) @@ -1273,30 +1303,48 @@ int allReduceStep = 1; // codeOfOversetGrid: Overlapping(overset) grid or not. // 0 -- NON-overlapping grid. // 1 -- Overlapping grid. -// oversetInterpolationMethod: the method of overset interpolation while field simulation +// oversetInterpolationMethod: the method of overset interpolation while field simulation. // 0 -- set the acceptor cell value by donor cell value. // 1 -- set the acceptor cell value by distance weight of donor cell value. - -int codeOfOversetGrid = 0; -int oversetInterpolationMethod = 0; -int readOversetFileOrNot = 0; -int symetryOrNot = 0; -int readInAuxiliaryInnerGrid = 0; -int readInAuxiliaryOuterGrid = 0; -int readInSklFileOrNot = 0; -string auxiliaryInnerGrid0 = "./grid/aux-upper.fts"; -string auxiliaryInnerGrid1 = "./grid/aux-lower.fts"; -string auxiliaryInnerGrid2 = ""; -string oversetGridFileName = "./grid/iblank.ovs"; -double walldistMainZone = 1.0 -double toleranceForOversetSearch = 1.0e-3; -double toleranceForOversetBox = 1.0e-3; -int twoOrderInterpolationOrNot = 0; -int keyEnlargeOfActiveNodes = 0; -int outTecplotOverset = 0; -int outPutOversetVisualization = 0; - -int numberOfMovingBodies = 2; +// readOversetFileOrNo: Whether to read overset-file(.ovs) that has been generated. +// 0 -- no. +// 1 -- yes. +// symetryOrNot: If there exist symetryplanes(XY plane, the coordinate of Z direction is 0) in +// the current overset grid(only for three dimension). +// 0 -- no. +// 1 -- yes. +// readInAuxiliaryInnerGrid: Whether to read auxiliary inner grid. +// 0 -- no. +// 1 -- yes. +// walldistMainZone: The initial value of background grid which does not exist wall boundary condition. +// toleranceForOversetSearch: The tolerance of overset searching zone to judge whether the obtained node is in the current computing cell. +// toleranceForOversetBox: The tolerance of building the minimum box of computing cells in the overlapping region. +// twoOrderInterpolationOrNot: The number of interpolated cell layers in the overlapping boundary. +// 0 -- one layer. +// 1 -- two layers. +// keyEnlargeOfActiveNodes: The number of enlarged overset-boundary layers in the buffer region. +// outTecplotOverset: Whether to dump out the flowfield data after the progress of overset configure. +// 0 -- no. +// 1 -- yes. +int codeOfOversetGrid = 0; +int oversetInterpolationMethod = 0; +int readOversetFileOrNot = 0; +int symetryOrNot = 0; +int readInAuxiliaryInnerGrid = 0; +int readInAuxiliaryOuterGrid = 0; +int readInSklFileOrNot = 0; +string auxiliaryInnerGrid0 = "./grid/aux-upper.fts"; +string auxiliaryInnerGrid1 = "./grid/aux-lower.fts"; +string auxiliaryInnerGrid2 = ""; +string oversetGridFileName = "./grid/iblank.ovs"; +double walldistMainZone = 1.0 +double toleranceForOversetSearch = 1.0e-3; +double toleranceForOversetBox = 1.0e-3; +int twoOrderInterpolationOrNot = 0; +int keyEnlargeOfActiveNodes = 0; +int outTecplotOverset = 0; +int outPutOversetVisualization = 0; +int numberOfMovingBodies = 2; // ----------------- ALE configuration ------------------------------ int codeOfAleModel = 0; @@ -1306,36 +1354,42 @@ double referenceLength = 1.0; double referenceVelocity = 1.0; double referenceDensity = 1.0; -int strategyForFaceNormalVelocity = 0; //0-By Sweeping volume; 1-By face center 1st; 2-By face center 2nd; -int strategyForGCLSource = 0; //0-present; 1-Ahn; +int strategyForFaceNormalVelocity = 0; // 0-By Sweeping volume; 1-By face center 1st; 2-By face center 2nd. +int strategyForGCLSource = 0; // 0-present; 1-Ahn. -//0:1st-Admas-Bashforth; 1:2nd-Admas-Bashforth; 2:1st-Implicit-Euler; 3:2nd-Implicit Euler; 4:2nd-Adams-Moulton; 5:3rd-Adams-Moulton +// 0: 1st-Admas-Bashforth; 1: 2nd-Admas-Bashforth; 2: 1st-Implicit-Euler; 3: 2nd-Implicit Euler; 4: 2nd-Adams-Moulton; 5: 3rd-Adams-Moulton. int methodForKineticEquation = 0; double relaxParameterOfKinetic = 1.0; -######################################################################### -# motive information # -######################################################################### +#************************************************************************ +# motive information * +#************************************************************************ int numberOfMovingBodies = 1; ############################## body0 ############################## -//mass of parts -double mass_0 = 1.0; -//mass matrix of parts Ixx Iyy Izz Ixy Ixz Iyz -double massMatrix_0[] = 1e-7, 1e-6, 1e-6, 0.0, 0.0, 0.0; -//initial six DOF position information of parts. xc yc zc -double massCenter_0[] = 0.0 , 0.0, 0.0; -//initial six DOF position information of parts. angleX angleY angleZ -double attitudeAngle_0[] = 0.0 , 0.0, 0.0; -//initial six DOF move information of parts. vc vy vz -double massCenterVelocity_0[] = 0.0, 0.0, 0.0; -//initial six DOF move information of parts. omigX omigY omigZ -double angularVelocity_0[] = 0.0, 0.0, 0.0; -//the object that the parts belong to. -int fartherIndex_0 = -1; -//the assembly position of the parts. xc yc zc angleX angleY angleZ -double configPamameter_0[] = 0.0 ,0.0 ,0.0 ,0.0 ,0.0 ,0.0; -//the move pattern of the parts. +// mass of parts. +double mass_0 = 1.0; +// gravity of parts (along negative direction in Y-axis, eg. 9.8). +double gravity_0 = 0.0; +// mass matrix of parts Ixx Iyy Izz Ixy Ixz Iyz. +double massMatrix_0[] = 1e-7, 1e-6, 1e-6, 0.0, 0.0, 0.0; +// initial six DOF position information of parts. xc yc zc. +double massCenter_0[] = 0.0, 0.0, 0.0; +// if reset mass center while restart. +int resetMassCenter_0 = 0; +// position offset of parts. dx dy dz. +double massCenterDxyz_0[] = 0.0, 0.0, 0.0; +// initial six DOF position information of parts. angleX angleY angleZ. +double attitudeAngle_0[] = 0.0, 0.0, 0.0; +// initial six DOF move information of parts. vc vy vz. +double massCenterVelocity_0[] = 0.0, 0.0, 0.0; +// initial six DOF move information of parts. omigX omigY omigZ. +double angularVelocity_0[] = 0.0, 0.0, 0.0; +// the object that the parts belong to. +int fartherIndex_0 = -1; +// the assembly position of the parts. xc yc zc angleX angleY angleZ. +double configPamameter_0[] = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0; +// the move pattern of the parts. // -1 given motion partten. // 0 still. // 1 six DOF motion. @@ -1346,51 +1400,68 @@ double configPamameter_0[] = 0.0 ,0.0 ,0.0 ,0.0 ,0.0 // 14 forced pitch motion. // 15 forced yaw motion. // 16 forced roll motion. -int RBDMethod_0 = 0; -double amplitude_0 = 0.0; -double reduceFrequency_0 = 0.0; -//direction of rotation +int RBDMethod_0 = 0; +double amplitude_0 = 0.0; +double reduceFrequency_0 = 0.0; +// direction of rotation. // 1 -- clockwise from the point of view along the positive x axis. // -1 -- anticlockwise from the point of view along the positive x axis. -int direction_0 = -1; -double rotateFrequency_0 = 0.0; -//string uDFSixDofFileName_0 = "./Bin/UDFSixDof.Parameter"; -//additional force (system axis) fX fY fZ -double addedForce_0[] = 0.0 ,0.0 ,0.0 ; -//additional moment of Force (system axis) mX mY mZ -double addedMoment_0[] = 0.0 ,0.0 ,0.0 ; -//the deformation method of the parts. -int morphing_0 = 0; - -// post indentify -int integralOrder = 4; +int direction_0 = -1; +double rotateFrequency_0 = 0.0; +//string uDFSixDofFileName_0 = "./Bin/UDFSixDof.Parameter"; +// dimensional physical time for additional force(s). +double addedForceTime_0[] = 0.0; +// additional force(inertia system) fX fY fZ. +double addedForce_0[] = 0.0, 0.0, 0.0; +// additional moment(inertia system) mX mY mZ. +double addedMoment_0[] = 0.0, 0.0, 0.0; +// the deformation method of the parts. +int morphing_0 = 0; +// post indentify. +int integralOrder = 4; // ---------------- ATP read -------------------------------------------- -//@int inflowParaType = 0; +//@int inflowParaType = 0; //@double refReNumber = 6.5e6; //@double refDimensionalTemperature = 288.15; //@double freestream_vibration_temperature = 300.00; -//@double refDimensionalPressure = 0; -//@double height = 0; -//@int nsubsonicInlet = 0; -//@int nsubsonicOutlet = 0; -//@string inLetFileName = "./bin/subsonicInlet.hypara"; -//@string outLetFileName = "./bin/subsonicOutlet.hypara"; +//@double refDimensionalPressure = 0; +//@double height = 0; +//@int nsubsonicInlet = 0; +//@int nsubsonicOutlet = 0; +//@string inLetFileName = "./bin/subsonicInlet.hypara"; +//@string outLetFileName = "./bin/subsonicOutlet.hypara"; //@double refDimensionalVelocity = 0; //@double refDimensionalDensity = 0; - -######################################################################### -# Old Parameter # -######################################################################### +//@string weatherDataFilePath = "./WRFData/"; +//@double longitude = 110.95 +//@double latitude = 19.61; +#************************************************************************ +# Old Parameter * +#************************************************************************ int isPlotVolumeField = 0; +#************************************************************************ +# partial flow field setting Parameter * +#************************************************************************ +//int nPartialParameter = 0; // 0/1/2 +//int nNumberOfPartialField = 0; // +//int nStartGridIndex[] = [0]; +//int nEndGridIndex[] = [0]; -######################################################################### -# Incompressible Parameter # -######################################################################### +//double partialCFL[] = [0.0]; +//double partialSpeedCoef[] = [0.0]; +//double partialSpeed[] = [0.0]; +//double partialAttackd[] = [0.0]; +//double partialSlide[] = [0.0]; +//double partialPressure[] = [0.0]; +//double partialTemperature[] = [0.0]; +//double partialMassFractions[] = [0.0]; +#************************************************************************ +# Incompressible Parameter * +#************************************************************************ int isSolveEnergyEquation = 0; int isSolveTurbEquation = 0; -int isSolveSpeciesEquation = 0; - +int isSolveSpeciesEquation = 0; \ No newline at end of file diff --git a/A01_TwoD_Plate_Laminar_Struct_1CPU/bin/grid_para.hypara b/A01_TwoD_Plate_Laminar_Struct_1CPU/bin/grid_para.hypara index ad0e590..c995a53 100644 --- a/A01_TwoD_Plate_Laminar_Struct_1CPU/bin/grid_para.hypara +++ b/A01_TwoD_Plate_Laminar_Struct_1CPU/bin/grid_para.hypara @@ -4,9 +4,12 @@ // gridtype: Grid type for generation, conversion, reconstruction, merging. // 0 -- Unstructured grid. // 1 -- Structured grid. -// axisup: Type of Cartisien coordinates system, used in grid conversion. -// 1 -- Y upward. (default) -// 2 -- Z upward. +// nAxisRotateTimes: number of axis rotating times, zero (default) meaning without rotating. +// axisRotateOrder : axis rotating order. +// 1 -- X-axis. +// 2 -- Y-axis. +// 3 -- Z-axis. +// axisRotateAngles: axis rotating angles (degree), which are corresponding to the axis rotating order. // from_gtype: Type of grid data type in grid conversion process. // -1 -- MULTI_TYPE. // 1 -- PHengLEI, *.fts. @@ -18,7 +21,9 @@ // 7 -- Hybrid, include both of unstructured and structured grid, *.fts. // 8 -- GMSH, *.msh. int gridtype = 1; -int axisup = 1; +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; int from_gtype = 3; ######################################################################### diff --git a/A02_TwoD_Plate_Laminar_Ma5_Struct_1CPU/bin/cfd_para.hypara b/A02_TwoD_Plate_Laminar_Ma5_Struct_1CPU/bin/cfd_para.hypara index c344658..f903a5a 100644 --- a/A02_TwoD_Plate_Laminar_Ma5_Struct_1CPU/bin/cfd_para.hypara +++ b/A02_TwoD_Plate_Laminar_Ma5_Struct_1CPU/bin/cfd_para.hypara @@ -8,23 +8,24 @@ // Platform for Hybrid Engineering Simulation of Flows + // China Aerodynamics Research and Development Center + // (C) Copyright, Since 2010 + +// PHengLEI 2212 + //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ########################################################################### # Default parameters for Grid conversion # ########################################################################### // gridtype: Grid type for generation, conversion, reconstruction, merging. -// 0 -- Unstructured grid. -// 1 -- Structured grid. -// 2 -- Hybrid grid, include both of unstructured and structured grid. -// gridobj: Task type of grid treatment. -// 0 -- Grid generation of typical case, such as cylinder, flat plate, etc. -// 1 -- Grid conversion, from other grid data to PHenglEI, such as Fluent, CGNS. -// 2 -- Grid refinement. -// 3 -- Grid merging, merge two blocks into one block. -// 4 -- Grid deformation, achieve unstructured grid deformation. -// 5 -- Grid repairing, repair the original grid in order to remove the negative volume cells. -// 6 -- Grid mirroring, mirror a symmetry grid to whole grid. -// 7 -- Grid type change, convert structured grid to unstructured grid. +// 0 -- Unstructured grid. +// 1 -- Structured grid. +// 2 -- Hybrid grid, include both of unstructured and structured grid. +// gridobj: Task type of grid treatment. +// 0 -- Grid generation of typical case, such as cylinder, flat plate, etc. +// 1 -- Grid conversion, from other grid data to PHenglEI, such as Fluent, CGNS. +// 2 -- Grid refinement. +// 3 -- Grid merging, merge two blocks into one block. +// 4 -- Grid deformation, achieve unstructured grid deformation. +// 5 -- Grid repairing, repair the original grid in order to remove the negative volume cells. +// 6 -- Grid mirroring, mirror a symmetry grid to whole grid. +// 7 -- Grid type change, convert structured grid to unstructured grid. // multiblock: Multi-block grid or not, only for structured grid conversion. // 0 -- Not. // 1 -- Yes. @@ -46,19 +47,24 @@ int gridobj = 1; int multiblock = 0; int iadapt = 0; int SymmetryFaceVector = 1; - int gridReorder = 0; int faceReorderMethod = 0; -// axisup: Type of Cartisien coordinates system, used in grid conversion. -// 1 -- Y upward. (default) -// 2 -- Z upward. -int axisup = 1; +// nAxisRotateTimes: number of axis rotating times, zero (default) meaning without rotating. +// axisRotateOrder : axis rotating order. +// 1 -- X-axis. +// 2 -- Y-axis. +// 3 -- Z-axis. +// axisRotateAngles: axis rotating angles (degree), which are corresponding to the axis rotating order. +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; // omit_no_bound_bc: What's boundary condition for the type of "no_boundary_condition". // 0 -- Interface. (default) // 1 -- Physical boundary condition, used in Hybrid solver. int omit_no_bound_bc = 0; +int omitRepeatInterface = 1; //----------------------------------------------------------------------- # Grid data type # @@ -87,10 +93,9 @@ int dumpOldGrid = 0; // from_gfile: path of original data file for unstructure grid convert from. // out_gfile: path of target file for grid convert to, *.fts type of file usually. int numberOfGridFile = 1; -string from_gfile = "./grid/rae2822_hybrid2d.cas"; -string from_gfile1= ""; - -string out_gfile = "./grid/flat_laminr_133_85_2d.fts"; +string from_gfile = "./grid/rae2822_hybrid2d.cas"; +string from_gfile1 = ""; +string out_gfile = "./grid/flat_laminr_133_85_2d.fts"; // ----------------- some advanced choices ------------------------------ // iunsteady: The Grid is for unsteady simulation or not. @@ -103,9 +108,9 @@ int fileformat = 0; // Parameters for hybrid solver. // mixgrid_uns: path of unstructure grid file for hybrid solver, *.fts type. -// mixgrid_str: path of structure grid file for hybrid solver, *.fts type. -string mixgrid_uns = "./grid/rae2822_uns2d_4.fts"; -string mixgrid_str = "./grid/flat_laminr_133_85_2d.fts"; +// mixgrid_str: path of structure grid file for hybrid solver, *.fts type. +string mixgrid_uns = "./grid/rae2822_uns2d_4.fts"; +string mixgrid_str = "./grid/flat_laminr_133_85_2d.fts"; // Some parameters for structured overlapping grid. int codeOfDigHoles = 1; @@ -119,31 +124,31 @@ string zoneInverseFileName = "./oversetGridView/zoneInverseMapping.inp"; // 0 -- Not. (default) // 1 -- Yes. // geometryUnit: Geometry unit. -// 1 -- meter. -// 2 -- millimeter. -// 3 -- inch. +// 1 -- meter. +// 2 -- millimeter. +// 3 -- inch. // exclusiveCase: Parallel projection exclusive case. -// 0 -- NON case. -// 1 -- JSM-C2-NPOFF case. -// 2 -- CHNT. +// 0 -- NON case. +// 1 -- JSM-C2-NPOFF case. +// 2 -- CHNT. // projectOrgPoint: If the original wall points need to be projected or not. -int anisoRefine = 0; -int geometryUnit = 1; -int isProject = 0; -int readDist = 0; -int isDeform = 0; +int anisoRefine = 0; +int geometryUnit = 1; +int isProject = 0; +int readDist = 0; +int isDeform = 0; int exclusiveCase = 0; int projectOrgPoint = 0; string geometryFileName = "./grid/jsm.igs"; // ----------------- Grid Deform Parameters ----------------------------- // deformationMethod: Grid Deform. -// 1 -- SPRING. -// 2 -- RBF. +// 1 -- SPRING. +// 2 -- RBF. // stationalGridFile: Original grid file. // visualFileName : The visualization file path of deform grid. // nDeformStep : The max deform step. -// flapAngle : The max flap angle. +// flapAngle : The max flap angle. // rotatePostionZ : Rotate postion. // rotatePostionY : Rotate postion. // gridSlice : If dump slice grid. @@ -163,10 +168,10 @@ int sliceAxis = 1; double slicePosition = 13; // ----------------- RBF Parameters ------------------------------------- -// numberOfReferenceCP : Number of reference Control Points. -// influencePara : The RBF influence radius parameter. +// numberOfReferenceCP: Number of reference Control Points. +// influencePara : The RBF influence radius parameter. int numberOfReferenceCP = 40; -double influencePara = 25.0; +double influencePara = 25.0; // ----------------- Periodic Parameters -------------------------------- // Notice: Rotational periodicity only support rotation along the X axis! @@ -178,9 +183,8 @@ double influencePara = 25.0; which only support one direction. // rotationAngle: The relative angle between two periodic face. which is recorded in degrees. - int periodicType = 0; -double translationLength[] = [0.0,0.0,0.0]; +double translationLength[] = [0.0, 0.0, 0.0]; double rotationAngle = 0.0; ######################################################################### @@ -192,7 +196,6 @@ double rotationAngle = 0.0; // 2 -- refine structured grid. // maxproc: The number of partition zones that want to be divided into. // numberOfMultifile: The number of partition grid files that want to be dumped out. - int pgridtype = 0; int maxproc = 4; int numberOfMultifile = 1; @@ -201,20 +204,20 @@ int numberOfMultifile = 1; // 0 -- Not. // 1 -- Yes. // blockIndexOfMark: the block index of mark, only for structured grid partition. -// cellIndexOfMark: the cell index of mark, only for structured grid partition. +// cellIndexOfMark : the cell index of mark, only for structured grid partition. int traceMark = 0; int blockIndexOfMark = 0; -int cellIndexOfMark[] = [185,30,1]; +int cellIndexOfMark[] = [185, 30, 1]; -// parallel Strategy: -//! -# 0 : each zone is assigned to the one that defined in grid partition procedure. -//! -# 1 : random assigned for each zone or by some else ways. -int parallelStrategy = 1; +// parallelStrategy: +// 0 -- each zone is assigned to the one that defined in grid partition procedure. +// 1 -- random assigned for each zone or by some else ways. +int parallelStrategy = 1; //----------------------------------------------------------------------- # File path # //----------------------------------------------------------------------- -// original_grid_file: Original grid file that want to be divided(PHengLEI type, *.fts). +// original_grid_file: Original grid file that want to be divided(PHengLEI type, *.fts). // partition_grid_file: Target partition grid file(PHengLEI type, *.fts). string original_grid_file = "./grid/sphere_mixed.fts"; string partition_grid_file = "./grid/sphere_mixed__4.fts"; @@ -232,11 +235,10 @@ string partition_grid_file = "./grid/sphere_mixed__4.fts"; // 1 -- perfect balance. // maxproc -- perfect imbalance. // 1.05 -- recommended. - int omit_no_bound_bc = 0; int npartmethod = 1; int parallelPartitionMethod = 2; -double parmetisBalance = 1.05; +double parmetisBalance = 1.05; // numberOfMultigrid: Number of multi-grid levels, ONLY used for structured grid. // 1 -- single level. @@ -248,29 +250,35 @@ int numberOfMultigrid = 1; # Default parameters for CFD simulation # ######################################################################### // maxSimuStep: The max simulation step, don't care simulation is restart or not. -// intervalStepFlow: The step intervals for flow variables file 'flow.dat' saved. -// intervalStepPlot: The step intervals for tecplot visual file 'tecflow.dat' saved. +// intervalStepFlow: The step intervals for flow variables file 'flow.dat' saved. +// intervalStepPlot: The step intervals for tecplot visual file 'tecflow.dat' saved. // intervalStepSample: The step intervals for monitored probes variables file 'sample.dat' saved. -// intervalStepForce: The step intervals for aerodynamics coefficients file 'aircoef.dat' saved. -// intervalStepRes: The step intervals for residual file 'res.dat' saved. -// ifLowSpeedPrecon: Precondition process to accelerate convergence for low speed flow. -// 0 -- no precondition process. (default, mach > 0.3) -// 1 -- carry out precondition process. (mach number <= 0.3) - -int maxSimuStep = 20000; - -int intervalStepFlow = 1000; -int intervalStepPlot = 1000; +// intervalStepForce: The step intervals for aerodynamics coefficients file 'aircoef.dat' saved. +// intervalStepRes: The step intervals for residual file 'res.dat' saved. +int maxSimuStep = 20000; +int intervalStepFlow = 1000; +int intervalStepPlot = 1000; int intervalStepSample = 1000; -int intervalStepForce = 100; -int intervalStepRes = 10; -int ifLowSpeedPrecon = 0; +int intervalStepForce = 100; +int intervalStepRes = 10; // compressible: // 0 -- incompressible flow. // 1 -- compressible flow. (default) int compressible = 1; +// ifLowSpeedPrecon: Precondition process to accelerate convergence for low speed flow. +// 0 -- no precondition process. (default, mach > 0.3) +// 1 -- carry out precondition process. (mach number <= 0.3) +// Kprec: The coefficient K for the cut-off velocity. +// 1.0~3.0 is suggested. (default, 3.0) +// preconFarfieldBCMethod: The precondition method for farfield boundary condition. +// 0 -- precondition far-field boundary based on riemann invariants. +// 1 -- Turkel's simplified far-field boundary condition. +int ifLowSpeedPrecon = 0; +double Kprec = 3.0; +int preconFarfieldBCMethod = 1; + //----------------------------------------------------------------------- # CFD Control Parameter # //----------------------------------------------------------------------- @@ -281,33 +289,36 @@ int compressible = 1; // 0 -- the nondimensional conditions. // 1 -- the flight conditions. // 2 -- the experiment conditions. -// 3 -- the subsonic boundary conditions. +// 3 -- the subsonic boundary conditions. (Useless!) // 4 -- the condition that the velocity, temperature and density are given. // 5 -- the condition that the velocity, temperature and pressure are given. +//flowInitMethod: Flow field initialization method. +// 0 -- The entire flow field is initialized according to Infinite velocity. +// 1 -- The velocity near the wall is initialized according to the boundary layer of the plate. // refReNumber: Reynolds number, which is based unit length, unit of 1/m. // refDimensionalTemperature: Dimensional reference temperature, or the total temperature only for the experiment condition. // freestream_vibration_temperature: Dimensional freestream vibration temperature. // refDimensionalPressure: Dimensional reference pressure, or the total pressure only for the experiment condition. // height: Fly height, unit of km. // wallTemperature: Temprature of the solid wall, minus value is for adiabatic boundary condition. -// gridScaleFactor: The customizable unit of the grid, default value is 1.0 for meter.Common dimensions like: -// 1 dm = 0.1 m. -// 1 cm = 0.01 m. -// 1 mm = 0.001m. -// 1 inch = 0.0254m. -// 1 foot = 12 inches = 0.3048m. -// 1 yard = 3 feet = 0.9144m. +// gridScaleFactor: The customizable unit of the grid, default value is 1.0 for meter. Common dimensions like: +// 1 dm = 0.1 m. +// 1 cm = 0.01 m. +// 1 mm = 0.001 m. +// 1 inch = 0.0254 m. +// 1 foot = 12 inches = 0.3048 m. +// 1 yard = 3 feet = 0.9144 m. // forceReferenceLength, forceReferenceLengthSpanWise, forceReferenceArea: Reference length, SpanWise length and area, independent of grid unit. // TorqueRefX, TorqueRefY, TorqueRefZ: Reference point, independent of grid unit. // radiationCoef: The radiation coefficient on wall, it is used to compute the radiation heat flux on wall when the boundary // condition is radiation equilibrium temperature, and 0.8 is the default value. -// refMolecularWeight : the reference molecular weight of gas used for perfect gas. The unit is g/mol. +// refMolecularWeight: the reference molecular weight of gas used for perfect gas. The unit is g/mol. // Generally, the gas is air. Sometimes, it is experiment gas, such as Nitrogen, Argon, and so on. - -int directionMethod = 0; +int directionMethod = 0; double refMachNumber = 0.73; double attackd = 2.79; double angleSlide = 0.00; +int flowInitMethod = 0; int inflowParaType = 0; double refReNumber = 6.5e6; @@ -321,29 +332,27 @@ double freestream_vibration_temperature = 300.00; //double refDimensionalTemperature = 6051.024; // The total temperature, T*(1+(refGama-1)*M*M/2). //double refDimensionalPressure = 4.299696E09; // The total pressure, p*(T0/T)^(refGama/(refGama-1)). -//int inflowParaType = 3; -//int nsubsonicInlet = 1; -//int nsubsonicOutlet = 1; -//string inLetFileName = "./bin/subsonicInlet.hypara"; -//string outLetFileName = "./bin/subsonicOutlet.hypara"; -//double refDimensionalTemperature = 288.144; -//double refDimensionalPressure = 1.01313E05; - -//The velocity, temperature and density are fixed. +// The velocity, temperature and density are fixed. //int inflowParaType = 4; //double refDimensionalVelocity = 1000.0; -//double refDimensionalDensity = 1.0e3; +//double refDimensionalDensity = 1.0e3; -//The velocity, temperature and pressure are fixed. +// The velocity, temperature and pressure are fixed. //int inflowParaType = 5; //double refDimensionalVelocity = 1000.0; //double refDimensionalPressure = 1.0e5; -//The MachNumber, temperature and pressure are fixed. +// The MachNumber, temperature and pressure are fixed. //int inflowParaType = 6; -//double refDimensionalTemperature = 293; +//double refDimensionalTemperature = 293.0; //double refDimensionalPressure = 8886.06; +// The velocity, temperature and pressure are read from file. +//int inflowParaType = 7; +//string weatherDataFilePath = "./WRFData/"; +//double longitude = 110.95 +//double latitude = 19.61; + double wallTemperature = -1.0; double radiationCoef = 0.8; @@ -357,41 +366,41 @@ double forceReferenceArea = 1.0; // unit of meter^2. double TorqueRefX = 0.0; // unit of meter. double TorqueRefY = 0.0; // unit of meter. double TorqueRefZ = 0.0; // unit of meter. +double knudsenLength = 1.0; // unit of meter. double refMolecularWeight = 28.9644; // unit of g/mol. //----------------------------------------------------------------------- # Spatial Discretisation # //----------------------------------------------------------------------- -#******************************************************************* -# Struct Solver * -#******************************************************************* +#************************************************************************ +# Struct Solver * +#************************************************************************ // inviscidSchemeName: Spatial discretisation scheme of struct grid. // Using this when solve structered grid or hybrid. -// -- "vanleer", "steger", "hlle", "lax_f". -// -- "roe", "modified_roe". +// -- "vanleer", "steger", "hlle", "lax_f", +// -- "roe", "modified_roe", // -- "ausm+", "ausm+w", "ausm+up", "ausmdv", "ausmpw", "ausmpw+". // isWennScheme: If using WENN Scheme of struct grid. -// 0 -- NO. (default) -// 1 -- Yes. +// 0 -- NO. (default) +// 1 -- Yes. // str_limiter_name: Limiter of struct grid. -// -- "vanalbada", "vanleer", "minmod", "smooth", "minvan", "3rdsmooth", "3rd_minmod_smooth". -// -- "nolim", no limiter. -// -- "vanalbada_clz", clz supersonic version. -// -- "weno3_js", "wenn3_prm211", "wenn3_zm", "wenn3_zes2", "wenn3_zes3" - +// -- "vanalbada", "vanleer", "minmod", "smooth", "minvan", "3rdsmooth", "3rd_minmod_smooth", +// -- "nolim", no limiter, +// -- "vanalbada_clz", clz supersonic version, +// -- "weno3_js", "wenn3_prm211", "wenn3_zm", "wenn3_zes2", "wenn3_zes3". string inviscidSchemeName = "roe"; int isWennScheme = 0; -string str_limiter_name = "vanalbada"; +string str_limiter_name = "vanalbada"; -#******************************************************************* -# UnStruct Solver or Common * -#******************************************************************* +#************************************************************************ +# UnStruct Solver or Common * +#************************************************************************ // viscousType: Viscous model. -// 0 -- Euler. -// 1 -- Lamilar. -// 2 -- Algebraic. -// 3 -- 1eq turbulent. -// 4 -- 2eq turbulent. +// 0 -- Euler. +// 1 -- Lamilar. +// 2 -- Algebraic. +// 3 -- 1eq turbulent. +// 4 -- 2eq turbulent. // viscousName: Laminar or tubulent model. // -- "0eq-bl". // -- "1eq-sa". @@ -410,16 +419,16 @@ string str_limiter_name = "vanalbada"; // 3 -- IDDES. // uns_scheme_name: Spatial discretisation scheme of Unstruct grid. // Using this when solve Unstructered grid or hybrid. -// -- "vanleer", "roe", "steger", "kfvs", "lax_f", "hlle". +// -- "vanleer", "roe", "GMRESRoe", "GMRESSteger", "steger", "kfvs", "lax_f", "hlle", // -- "ausm+", "ausmdv", "ausm+w", "ausmpw", "ausmpw+". // uns_limiter_name: Limiter of Unstruct grid. -// -- "barth", "vencat", "vanleer", "minmod". -// -- "vanalbada", "smooth", "nnd", "lpz", "1st". +// -- "barth", "vencat", "vanleer", "minmod", +// -- "vanalbada", "smooth", "nnd", "lpz", "1st", // -- "nolim", no limiter. // uns_vis_name: Discretisation method of viscous term. // -- "std", "test", "aver", "new1", "new2". // gradientName: Gradient reconstruction method. -// -- "default", "ggcell", "ggnode", "lsq". +// -- "default", "ggcell", "ggnode", "lsq". // ivencat: Variation of vencat limiter. // 0 -- org method, it is independent of grid scale. // 1 -- new method, it is dependent of grid scale. @@ -442,18 +451,18 @@ string str_limiter_name = "vanalbada"; // 3 -- Harten type, which is default used. // roeEntropyScale: Entropy fix (correction) coefficient scale, default is 1.0. // It is used to scale the default Roe entropy fix coefficients. -// AusmpwPlusLimiter: A Limiter to make "function w" not change acutely in AusmpwPlus scheme, default is 1.0 +// AusmpwPlusLimiter: A Limiter to make "function w" not change acutely in AusmpwPlus scheme, default is 1.0. -//int viscousType = 0; +//int viscousType = 0; //string viscousName = "Euler"; -//int viscousType = 1; +//int viscousType = 1; //string viscousName = "laminar"; -int viscousType = 3; +int viscousType = 3; string viscousName = "1eq-sa"; -//int viscousType = 4; +//int viscousType = 4; //string viscousName = "2eq-kw-menter-sst"; int DESType = 0; @@ -463,7 +472,7 @@ string uns_limiter_name = "vencat"; string uns_vis_name = "test"; string gradientName = "ggnode"; -int ivencat = 7; +int ivencat = 7; double venkatCoeff = 5.0; int reconmeth = 1; int limitVariables = 0; @@ -475,9 +484,9 @@ double roeEntropyScale = 1.0; double AusmpwPlusLimiter = 1.0; -//----------------------------------------------------------------------- -# Temporal Discretisation # -//----------------------------------------------------------------------- +#************************************************************************ +# Temporal Discretisation * +#************************************************************************ // iunsteady: Steady or unsteady. // 0 -- steady. // 1 -- unsteay. @@ -490,51 +499,57 @@ double AusmpwPlusLimiter = 1.0; // statisticalTimePeriod: Used as time period of statistic analysis. // when the value is negative, time period is treated as infinite. // statisticMethod: Statistic reynolds stress method. -// 0 -- tau = - ^2 -// 1 -- tau = +// 0 -- tau = - ^2 +// 1 -- tau = // min_sub_iter: The min sub iteration of unsteady simulation. // max_sub_iter: The max sub iteration of unsteady simulation. // tol_sub_iter: The tolerance of sub iteration of unsteady simulation. // tscheme: Temporal Discretisation method. -// 1 -- Runge-Kutta Multi-State. -// 2 -- Point implicit. -// 3 -- Full implicit. -// 4 -- LU-SGS. -// 5 -- Block LU-SGS. -// 6 -- Jacobian iteration. -// 7 -- Line LU-SGS. -// 8 -- Matrix LU-SGS. +// 1 -- Runge-Kutta Multi-State. +// 2 -- Point implicit. +// 3 -- Full implicit. +// 4 -- LU-SGS. +// 5 -- Block LU-SGS. +// 6 -- Jacobian iteration. +// 7 -- Line LU-SGS. +// 8 -- Matrix LU-SGS. +// 9 -- GMRES. // iSimplifyViscousTerm: Simplify the computation of viscous term in the Block LU-SGS method. The default value assigns 1 that could speed up the computation. // Otherwise, the viscous Jacobian matrix Mv should be computed that will increase the memory and time in iteration of the BLUSGS method. // CFLStart: Started cfl number. // CFLEnd: End cfl number. // CFLVaryStep: The number of step when cfl increase from CFLStart to CFLEnd. +// GMRESCFLScale : CFL = CFLStart * GMRESCFLScal^iteration. +// OriginalTscheme : Used for LUSGS and GMres hybrid computing. +// useLUSGSprecond: Initialize flow field for GMRES. +// 0 --Initialize by first order Jacobian matrix. +// 1 --Initialize by LUSGS. +// GMRESInitStep : the number of iteration step of irst order Jacobian matrix or LUSGS for initialize flow field. // ktmax: Dtratio. dt[i] = MIN(dt[i], ktmax * dtmin / vol[i]) // swapDq: Communication dq between forward/backward sweep of LUSGS or not, default is 0. // nLUSGSSweeps: Sub iteration of LU-SGS or Block LU-SGS. // LUSGSTolerance: Sub iter tolerance of LU-SGS or Block LU-SGS. // ifLocalTimeStep: Time step method. -// 0 --Local. -// 1 --Global. +// 0 --Local. +// 1 --Global. // isUseLocalCFL: use variable number of CFL or not. -// 0 -- global unified CFL number. -// 1 -- local CFL number. +// 0 -- global unified CFL number. +// 1 -- local CFL number. // isUsePreTwall: use the previous temperatures on wall. 1 indicates yes, and 0 indicates no. // visl_min: Minimum value of laminar viscosity coefficient. // turbCFLScale: Turbulence model cfl number factor. // codeOfAleModel: Arbitrary Lagrangian-Eulerian method. -// 0 -- no ALE method. -// 1 -- ALE method for non-moving grids. -// 2 -- ALE method for moving grids. -// 3 -- ALE method for deforming grids. +// 0 -- no ALE method. +// 1 -- ALE method for non-moving grids. +// 2 -- ALE method for moving grids. +// 3 -- ALE method for deforming grids. // wallFunctionType: The type of wall function to implement. -// 0 -- no wall function. (default) -// 1 -- standard wall function. -// 2 -- Pab3D wall function. +// 0 -- no wall function. (default) +// 1 -- standard wall function. +// 2 -- Pab3D wall function. // RKStage: The number of Runge-Kutta step. // lamda: Cofficient of Runge-Kutta step. - -int iunsteady = 0; +int iunsteady = 0; double physicalTimeStep = 0.01; double physicalTimeStepDimensional = -0.001; int ifStartFromSteadyResults = 0; @@ -543,39 +558,42 @@ int ifStaticsReynoldsStress = 0; int startStatisticStep = 800000; double statisticalTimePeriod = -1.0; int statisticMethod = 0; -int linearTwoStepMethods = 1; // 1--BDF1; 2--C-N; 3--BDF2; +int linearTwoStepMethods = 1; // 1--BDF1; 2--C-N; 3--BDF2. int methodOfDualTime = 3; int min_sub_iter = 50; int max_sub_iter = 50; double tol_sub_iter = 0.01; -int tscheme = 4; +int tscheme = 4; int iSimplifyViscousTerm = 1; int ifLocalTimeStep = 0; int isUseLocalCFL = 0; int isUsePreTwall = 0; -double CFLStart = 0.01; -double CFLEnd = 10.0; -int CFLVaryStep = 500; - +double CFLStart = 0.01; +double CFLEnd = 10.0; +int CFLVaryStep = 500; +double GMRESCFLScale = 1.0; +int OriginalTscheme = 9; +int useLUSGSprecond = 1; +int GMRESInitStep = 1000; double pMaxForCFL = 0.2; double pMinForCFL = 0.1; double deltaMaxForCFL = 0.2; double magnifyFactorForCFL = 1.1; double reduceFactorForCFL = 0.5; -double ktmax = 1.0e10; +double ktmax = 1.0e10; -int swapDq = 1; +int swapDq = 1; int nLUSGSSweeps = 1; double LUSGSTolerance = 0.01; -int order = 2; +int order = 2; double visl_min = 0.01; double turbCFLScale = 1.0; -double csrv = 2.0; +double csrv = 1.0; double timemax = 1.0e10; double dtsave = -1.0; int maxale = 10; @@ -591,10 +609,9 @@ double lamda[] = [0.5, 1.0]; //int RKStage = 4; //double lamda[] = [0.25, 0.33333333333, 0.5, 1.0]; - -//----------------------------------------------------------------------- -# File In or Out # -//----------------------------------------------------------------------- +#************************************************************************ +# File In or Out * +#************************************************************************ // numberOfGridGroups: The number of grid groups. // gridfile: The partitioned Grid file path, using relative path, // which is relative to the working directory. @@ -611,20 +628,18 @@ double lamda[] = [0.5, 1.0]; // aircoeffile: The file path to save the aerodynamic force coefficients convergence process, write data for every default (intervalStepForce) steps. // restartNSFile: The file path to write restart flowfield variables, write data for every default (intervalStepFlow) steps. // turbfile: The file path to write restart flowfield variables of turbulence , write data for every default(intervalStepFlow) steps. -// visualfile: The visualization file path of flowfield , write data for every default (intervalStepPlot) steps. +// visualfile: The visualization file path of flowfield, write data for every default (intervalStepPlot) steps. // wall_aircoefile: The file path to save flowfield variables of wall, write data for every default steps. // nDumpSurfaceInfo = 0 the "wall_varfile" write the informations including heat flux. // nDumpSurfaceInfo = 1 the "wall_varfile" write the informations without heat flux. // nIsComputeWallDist: Whether to compute the wall distance. // 0 -- Compute wall distance. // 1 -- Not compute. -// -// protectionFile0 and protectionFile1 : Two continuation file of the data protection mechanism. -// wall_heatfluxfile : The file to output the MaxHeatFlux of wall. - -int numberOfGridGroups = 1; -string gridfile = "./grid/rae2822_hybrid2d__4.fts"; -string wallTemperaturefile= ""; +// protectionFile0 and protectionFile1: Two continuation file of the data protection mechanism. +// wall_heatfluxfile: The file to output the MaxHeatFlux of wall. +int numberOfGridGroups = 1; +string gridfile = "./grid/rae2822_hybrid2d__4.fts"; +string wallTemperaturefile = ""; int nIsComputeWallDist = 0; int walldistMethod = 1; @@ -632,10 +647,12 @@ int cellMethodOrNodeMethod = 0; string resSaveFile = "results/res.dat"; string turbresfile = "results/turbres.dat"; +string transitionResFile = "results/transitionRes.dat"; string aircoeffile = "results/aircoef.dat"; string restartNSFile = "results/flow.dat"; string turbfile = "results/turb.dat"; +string transitionFile = "results/transition.dat"; string visualfile = "results/tecflow.plt"; string wall_aircoefile = "results/wall_aircoef.dat"; @@ -645,10 +662,14 @@ string protectionFile0 = "results/flow0.dat"; string protectionFile1 = "results/flow1.dat"; string wall_heatfluxfile = "results/wall_heatflux.dat"; -int nDumpSurfaceInfo = 0; -string wall_varfile = ""; +string protectionTurbFile0 = "results/turb0.dat"; +string protectionTurbFile1 = "results/turb1.dat"; -string jetDefineFile = "bin/jet.hypara"; +string protectionTransitionFile0 = "results/transition0.dat"; +string protectionTransitionFile1 = "results/transition1.dat"; + +int nDumpSurfaceInfo = 0; +string wall_varfile = ""; string sixDofFileName = "results/sixDofInfo.dat"; string derivativeFileName = "results/identify.dat"; @@ -659,7 +680,8 @@ int plotFieldType = 0; // visualfileType: The file type of visualfile. // 0 -- Tecplot binary. // 1 -- Tecplot ASCII. - +// 2 -- Ensight binary. +// 3 -- Ensight ASCII. int visualfileType = 1; // samplefileMode: The dump mode of sample file. @@ -697,21 +719,21 @@ double upperPlotFieldBox[] = [1.0 1.0 1.0]; // -- vibration temperature(Tv, 33), electron temperature(Te, 34), vibrational energy(Ev, 35), electric energy(Ee, 36), // -- number density of electron(Ne, 37), dimensioanl density(rho, 38), dimensioanl pressure(p, 39), dimensioanl temperature(T, 40), // -- gradientUx(41), gradientUy(42), gradientVx(43), gradientVy(44), streamline_u(45), streamline_v(46), streamline_w(47), -// -- transition intermittency(intermittency, 51), -transition momentum thickness reynolds(MomentumThicknessReynolds, 52), -// -- overlap iblank(iblank, 81) - -// -- specific heat ratio(gama, 56) +// -- transition intermittency(intermittency, 51), transition momentum thickness reynolds(MomentumThicknessReynolds, 52), +// -- local CFL Number(localCFL, 57), minimal CFL Number(minCFL, 58), +// -- overlap iblank(iblank, 81), +// -- specific heat ratio(gama, 56), Knudsen number(kn, 60), Damkohler number(Da, 61), vibrational nonequilibrium number(Vi, 62). // Important Warning: Array size of visualVariables MUST be equal to nVisualVariables!!! // Variables order must from small to big. //-----------the optional parameters list for the wall boundary condition---------------- // nVisualWallVariables: The number of visual variables on wall. // visualWallVariables : dumped variable types, listed as following: -// -coefficient of pressure(cp, 0), -coefficient of friction(cf, 1), yplus(2), -non-dimensional heat flux(Q_NonDim, 3), -dimensional heat flux(Q_Dim, 4), -// -pressure on wall(pw, 5), -temperature on wall(Tw, 6), -density on wall(rhow, 7), -heat flux of translational-rotational temperature term(Qtr, 8), -// -heat flux of species diffusion term(Qs, 9), -heat flux of vibrational temperature term(Qv, 10), -heat flux of electron temperature term(Qe, 11), -// -species mass fractions(Ns, 12), -x component of wall velocity(Vx, 13), -y component of wall velocity(Vy, 14), -z component of wall velocity(Vz, 15) -// -slip translational-rotational temperature(Tts, 16), -slip vibrational temperature(Tvs, 17), -slip electron temperature(Tes, 18), -absolute wall velocity(Vs, 19) -// -Stanton number(St, 20), -coefficient of heat rate(Ch, 21), -temperature jump(deltaT, 22), -Grid Reynolds number on wall(Re_w, 23) +// -- coefficient of pressure(cp, 0), coefficient of friction(cf, 1), yplus(2), non-dimensional heat flux(Q_NonDim, 3), dimensional heat flux(Q_Dim, 4), +// -- pressure on wall(pw, 5), temperature on wall(Tw, 6), density on wall(rhow, 7), heat flux of translational-rotational temperature term(Qtr, 8), +// -- heat flux of species diffusion term(Qs, 9), heat flux of vibrational temperature term(Qv, 10), heat flux of electron temperature term(Qe, 11), +// -- species mass fractions(Ns, 12), x component of wall velocity(Vx, 13), y component of wall velocity(Vy, 14), z component of wall velocity(Vz, 15), +// -- slip translational-rotational temperature(Tts, 16), slip vibrational temperature(Tvs, 17), slip electron temperature(Tes, 18), absolute wall velocity(Vs, 19), +// -- Stanton number(St, 20), coefficient of heat rate(Ch, 21), temperature jump(deltaT, 22), Grid Reynolds number on wall(Re_w, 23), Knudsen number(Kn_wall, 24). int nVisualVariables = 8; int visualVariables[] = [0, 1, 2, 3, 4, 5, 6, 15]; @@ -739,16 +761,18 @@ int dumpStandardModel = 0; // 1 -- Real cell where the probe is located. // nProbeVariables: Number of variables want to be dumped for probes monitered. // probeVariables : Variable types dumped, listed as following: -// -- density(0), u(1), v(2), w(3), pressure(4), temperature(5), mach(6). +// -- density(0), u(1), v(2), w(3), pressure(4), temperature(5), mach(6), +// -- dimensioanl_density(7), dimensioanl_u(8), dimensioanl_v(9), +// -- dimensioanl_w(10), dimensioanl_pressure(11), dimensioanl_temperature(12). // Important Warning: Array size of probeVariables MUST be equal to nProbeVariables!!! // probeVariables order must from small to big. // probeVariablesInterpolationMethod: Interpolation method used to compute the probe variables. -// 0 -- Take the value of probe's cell as probe real value. -// 1 -- Interpolation from probe's and neighbouring cell to probe. -// 2 -- Interpolation from probe's cell nodes to probe. +// 0 -- Take the value of probe's cell as probe real value. +// 1 -- Interpolation from probe's and neighbouring cell to probe. +// 2 -- Interpolation from probe's cell nodes to probe. int ifSetDataMonitor = 0; -int dataMonitorType = 0; +int dataMonitorType = 0; string probesDefineFile = "bin/probes_XYZ.dat"; //int dataMonitorType = 1; @@ -761,28 +785,26 @@ string probesDefineFile = "bin/probes_XYZ.dat"; int searchCellsMethod = 0; -int nProbeVariables = 7; -int probeVariables[] = [0, 1, 2, 3, 4, 5, 6]; -int probeVariablesInterpolationMethod = 0; -//----------------------------------------------------------------------- -# Turbulence Parameter # -//----------------------------------------------------------------------- +int nProbeVariables = 14; +int probeVariables[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]; +int probeVariablesInterpolationMethod = 0; + +#************************************************************************ +# Turbulence Parameter * +#************************************************************************ // turbInterval: Iteration number of turbulence. // kindOfTurbSource: Kinds of turbulent source. // 0 -- Original. // mod_turb_res: If modify the residuals for the cells next to the wall or not, default is 0. -// transitionType: transition model type +// transitionType: transition model type // 0 -- none. // 2 -- gama-re-theta. -// turbIntensity: (valid while greater than 0.0 ) turbulent intensity of free stream(*100) in transition -// freeturbIntensitySRModify: to use SR modify in free stream turbulent intensity decay or not - - +// turbIntensity: (valid while greater than 0.0 ) turbulent intensity of free stream(*100) in transition. +// freeturbIntensitySRModify: to use SR modify in free stream turbulent intensity decay or not. int turbInterval = 1; int turbOrderStruct = 2; int kindOfTurbSource = 0; int mod_turb_res = 0; -double turb_relax = 1.0; double freeStreamViscosity = 1.0e-3; double muoo = 3.0; double kwoo = 5.0; @@ -790,29 +812,28 @@ int transitionType = 0; double turbIntensity = -1.0; int freeturbIntensitySRModify = 0; double freeDecayXLocation = 0.0; -int compressibleCorrection = 0; -int prandtlNumberCorrection = 0; +int compressibleCorrection = 0; int transitionMaFix = 1; -# maximum eddy viscosity (myt/my) max. +// maximum eddy viscosity (myt/my) max. double eddyViscosityLimit = 1.0e10; int monitor_vistmax = 0; -//----------------------------------------------------------------------- -# LES Parameter # -//----------------------------------------------------------------------- +#************************************************************************ +# LES Parameter * +#************************************************************************ // iLES: Create LESSolver or not. -// = 1 - Create LESSolver; -// != 1 - not. +// = 1 -- Create LESSolver; +// != 1 -- not. // amplitudeofDisturb: Amplitude of adding disturb. // disturbstep: Unsteady time step or steady iteration of adding random disturb. // iterdisturb: Add random disturb in every sub-iter or only first sub-iter. -// = 0 - in only first sub-iter; -// != 0 - in every sub-iter. +// = 0 -- in only first sub-iter; +// != 0 -- in every sub-iter. // ipraddisturb: Add density and pressure disturb or not. // ibodyforce: Add body force in source flux of NS equations or not. -// = 0 - not; -// != 0 - Add body force. +// = 0 -- not; +// != 0 -- Add body force. // bodyforce: Body force in source flux of NS equations or not. // utau: friction velocity, using in DNSDisturb. // sgsmodel: subgrid scale model. @@ -820,23 +841,22 @@ int monitor_vistmax = 0; // = "dsmCom"; // = "wale"; // = "sigma". -// deltaFunctionType: = 1 - MAX(deltai, deltaj, deltak); -// = 2 - pow(deltai * deltaj *deltak, 1/3); -// = 3 - Devloped by Scotti. -// wallDampingFunctionType: = 0 - no wall function; -// = 1 - van Driest; -// = 2 - developed by Dr. Deng Xiaobing; -// = 3 - developed by Piomelli. +// deltaFunctionType: = 1 -- MAX(deltai, deltaj, deltak); +// = 2 -- pow(deltai * deltaj *deltak, 1/3); +// = 3 -- Devloped by Scotti. +// wallDampingFunctionType: = 0 -- no wall function; +// = 1 -- van Driest; +// = 2 -- developed by Dr. Deng Xiaobing; +// = 3 -- developed by Piomelli. // turbViscousCutType: turbulent viscosity cut type. -// = 0 - mu_total = mut + mul; -// = 1 - mu_total = max(mut-mul,0)+ mul; -// = 2 - mu_total = max(mut ,0)+ mul. +// = 0 -- mu_total = mut + mul; +// = 1 -- mu_total = max(mut-mul, 0) + mul; +// = 2 -- mu_total = max(mut , 0) + mul. // smagConstant: constant of smagorinsky model. // waleConstant: constant of wale model. -// filterDirection[3]: filter variables in i, j, k direction or not. +// filterDirection [3]: filter variables in i, j, k direction or not. // averageDirection[3]: average variables in i, j, k direction or not. // isotropicConstant: constant of isotropic part of SGS stress. - int iLES = 0; string sgsmodel = "smagorinsky"; int deltaFunctionType = 2; @@ -852,19 +872,16 @@ double testFilterScale = 2.0; int averageWidth = 1; int monitorNegativeConstant = 0; -//----------------------------------------------------------------------- -# Other Parameters for Hypersonic Non-equilibrium Gas # -//----------------------------------------------------------------------- +#************************************************************************ +# Other Parameters for Hypersonic Non-equilibrium Gas * +#************************************************************************ // dg_high_order: // 0 -- generic order accuracy. // 1 -- high order accuracy. // iapplication: // 0 -- gas model is fixed in the codes. // 1 -- gas model is imported from library files. -// isAdaptiveSolver: isAdaptiveSolver=0 indicates the generic Navier-Stokes solver, -// isAdaptiveSolver>0 indicates the HyFlow self-adaptive solver. -// 1 -- using HyFlow self-adaptive solver where the switch is controlled by the total iteration steps. -// 2 -- using HyFlow self-adaptive solver where the switch is controlled by variation of the key residual. +// isAdaptiveSolver: isAdaptiveSolver = 0 indicates the generic Navier-Stokes solver, // nm: Equation number of the physics, but is out of commision now. // 4 -- for 2D. // 5 -- for 3D. @@ -875,7 +892,7 @@ int monitorNegativeConstant = 0; // 2 -- Argon. // 3 -- Nitrogen. // nEnergyRecycle: The type of EnergyModel Recycle. -// 0 -- not used . +// 0 -- not used. // 1 -- used. // nDensityModify: The type of densitymodify. // 0 -- not used. @@ -883,26 +900,25 @@ int monitorNegativeConstant = 0; // nchem: // 0 -- without chemical reaction flow. // 1 -- the chemical reaction flow is considered. -// nEquilibriumGas: the variable is valid when the condition of nchem=0 is satisfied. +// nEquilibriumGas: the variable is valid when the condition of nchem = 0 is satisfied. // 0 -- perfect gas. // 5, 7, 11 -- equilibrium gas, meanwhile, its value denotes the number of gas component. -// nPCWCycleStep: the maximum step number of iteration in the module of computing species mass fractions with the partial catalytic wall(PCW) condition. -// the value equals to or is greater than 1, and 3 is for default value. -// nRETCycleStep: the maximum step number of iteration in the module of computing radiation equilibrium temperature on wall. -// the value equals to or is greater than 1, and 3 is for default value. -// nSLIPCycleStep:the maximum step number of iteration in the module of computing slip temperature, slip velocity and slip species mass fraction. -// the value equals to or is greater than 1, and 3 is for default value. -// nSlipBCModel : The computational model of slip boundary conditions. - -// 0 -- no slip. -// 1 -- the conventional Maxwell slip conditions. -// 2 -- the Gokcen slip conditions. -// 3 -- the Knudsen-layer correction of the standard slip conditions proposed by Lockerby, et al. -// 4 -- the Kogan simplified slip conditions. -// nMeanFreePathType : the method to the mean free-path for the slip conditions. For the mixture, 0 is suggested. -// 0 -- the equivalent mean free-path is calculated by the simple hard sphere model(HS). -// 1 -- calculated by the definition that includes the variables of the number density and the molecule diameter. -// 2 -- the equivalent mean free-path is calculated by the variable hard sphere model(VHS). +// nPCWCycleStep: The maximum step number of iteration in the module of computing species mass fractions with the partial catalytic wall(PCW) condition. +// The value equals to or is greater than 1, and 3 is for default value. +// nRETCycleStep: The maximum step number of iteration in the module of computing radiation equilibrium temperature on wall. +// The value equals to or is greater than 1, and 3 is for default value. +// nSLIPCycleStep:The maximum step number of iteration in the module of computing slip temperature, slip velocity and slip species mass fraction. +// The value equals to or is greater than 1, and 3 is for default value. +// nSlipBCModel: The computational model of slip boundary conditions. +// 0 -- no slip. +// 1 -- the conventional Maxwell slip conditions. +// 2 -- the Gokcen slip conditions. +// 3 -- the Knudsen-layer correction of the standard slip conditions proposed by Lockerby, et al. +// 4 -- the Kogan simplified slip conditions. +// nMeanFreePathType: the method to the mean free-path for the slip conditions. For the mixture, 0 is suggested. +// 0 -- the equivalent mean free-path is calculated by the simple hard sphere model(HS). +// 1 -- calculated by the definition that includes the variables of the number density and the molecule diameter. +// 2 -- the equivalent mean free-path is calculated by the variable hard sphere model(VHS). // nchemsrc: // 0 -- the source terms are not computed. // 1 -- the source terms are computed. @@ -913,148 +929,151 @@ int monitorNegativeConstant = 0; // 1 -- One-temperature model. // 2 -- Two-temperature model. // 3 -- Three-temperature model. +// isUseNoneqCond: +// 0 -- compute the source terms without any conditions. +// 1 -- compute the source terms using the non-equilibrium condition. +// frozenCondition: the threshold value of frozen chemical flow condition, 0.1 is the default value. // nIdealState: whether take all gas species as ideal gas for gas-mixture process. // 0 -- No. -// 1 -- Yes. -// nTEnergyModel: the method to computing temperature energy model. +// 1 -- Yes. // nTEnergyModel: the method to computing temperature energy model. // 0 -- the energy term is computed using the conventional method. // 1 -- the energy term is computed using the polynomial fitting method. // 2 -- the energy term is computed using the piecewise polynomial fitting method. // parkVDPower: the power of translational-rotational temperature in the Park V-D(vibration-dissociation) coupling model. // The value is in range of [0.0, 1.0], DPLR suggests 0.5, LAURA suggests 0.7, while 0.6 is given as default value. // catalyticCoef: -// 0.0 -- full non-catalytic wall boundary condition. -// 1.0 -- full catalytic wall boundary condition. -// in range of (0.0, 1.0) -- partial catalytic condition, the value indicates the catalytic coefficient. -// nIsSuperCatalytic : the super catalytic condition for the fully catalytic wall, and assigned with the value of 1. -// 0 -- equilibrium condition for the fully catalytic wall where the mass fractions are assigned with the values of the free stream. -// 1 -- super catalytic condition for the fully catalytic wall where all the atomic components combine into molecular components. -// nTemperatureJump : the method to calculate the temperature jump. -// 0 -- calculated by the variables of heat conductivity and constant volume specific heat for each energy mode. -// 1 -- the general method where the iteration is calculated with the translation-rotation temperature. -// nSurfGradMethod : the method to compute the surface heating ratio. -// 0 -- the gradient of variable is computed with the first-order difference method. -// 1 -- the gradient of variable is computed with the Green-Guass integral method. -// nRapidFlowfield : initialize the flowfield using the rapid engineering method when it is greater than zero. -// nSurfHeatMonitor : To exam the surface heating change or not. 0 is no, 1 is yes. -// nInitPressureStep : the steps to initialize the boundary variables when the rapid method is used. 100 is the default value. -// nDumpCFLNumber : 1 indicates dumping the CFL number to file, 0 denotes no dumping. +// 0.0 -- full non-catalytic wall boundary condition. +// 1.0 -- full catalytic wall boundary condition. +// in range of (0.0, 1.0) -- partial catalytic condition, the value indicates the catalytic coefficient. +// nIsSuperCatalytic: the super catalytic condition for the fully catalytic wall, and assigned with the value of 1. +// 0 -- equilibrium condition for the fully catalytic wall where the mass fractions are assigned with the values of the free stream. +// 1 -- super catalytic condition for the fully catalytic wall where all the atomic components combine into molecular components. +// nTemperatureJump: the method to calculate the temperature jump. +// 0 -- calculated by the variables of heat conductivity and constant volume specific heat for each energy mode. +// 1 -- the general method where the iteration is calculated with the translation-rotation temperature. +// nSurfGradMethod: the method to compute the surface heating ratio. +// 0 -- the gradient of variable is computed with the first-order difference method. +// 1 -- the gradient of variable is computed with the Green-Guass integral method. +// nRapidFlowfield: initialize the flowfield using the rapid engineering method when it is greater than zero. +// nSurfHeatMonitor: To exam the surface heating change or not. 0 is no, 1 is yes. +// nInitPressureStep: the steps to initialize the boundary variables when the rapid method is used. 100 is the default value. +// nDumpCFLNumber: 1 indicates dumping the CFL number to file, 0 denotes no dumping. // sigmaVelocity: the coordination coefficient of tangential momentum for computation of slip velocity. The value is in range of (0.0, 2.0]. // sigmaTemperature: the heat coordination coefficient for computation of slip temperature. The value is in range of (0.0, 2.0]. // sigmaMassFraction: the species coordination coefficient for computation of slip mass fractions. The value is in range of (0.0, 2.0]. // velocitySlipCorrectConstant: the correction constant to the velocity slip condition. For the diffuse reflection, 1.0 is used. -// 1.0 -- proposed by Maxwell. -// sqrt(2/PI)~0.8 -- used for "micro-slip", namely the actual velocity slip at the wall. -// 1.146 -- proposed for an additional "fictitious" velocity slip. - -// chemicalRelaxCorf: The value is in range of [0.001, 1.0]. -// spectrumRadiusCoef: The value is in range of [0.0, 2.0]. -// staticPressureRelaxCorf: The value is in range of [0.1, 1.0]. -// nIsChemicalFreeze : the flag to freeze the chemical reactions. -// 0 -- not freeze, the chemical reaction sources will be calculated. -// 1 -- freezes the chemical reactions, the chemical reaction sources will not be calculated.// veTemperatureMin: The minimum of Tv and Te - -//maxViscous: the maximum of Viscous. -//trTemperatureMin: the minimum value of trTemperature. -//veTemperatureMin: the minimum value of veTemperature. -//densityMin: the minimum value of density. -//tAdjustmentFactor: magnification of temperature, this value is in range of (1.0, 10.0]. -// nDebug: cout the Wrong place and abort -// 0 -- not used. -// 1 -- used. +// 1.0 -- proposed by Maxwell. +// sqrt(2/PI)~0.8 -- used for "micro-slip", namely the actual velocity slip at the wall. +// 1.146 -- proposed for an additional "fictitious" velocity slip. +// chemicalRelaxCorf: The value is in range of [0.001, 1.0]. +// spectrumRadiusCoef: The value is in range of [0.0, 2.0]. +// staticPressureRelaxCorf: The value is in range of [0.1, 1.0]. +// nIsChemicalFreeze: the flag to freeze the chemical reactions. +// 0 -- not freeze, the chemical reaction sources will be calculated. +// 1 -- freezes the chemical reactions, the chemical reaction sources will not be calculated. +// veTemperatureMin: The minimum of Tv and Te. +// maxViscous: the maximum of Viscous. +// trTemperatureMin: the minimum value of trTemperature. +// veTemperatureMin: the minimum value of veTemperature. +// densityMin: the minimum value of density. +// tAdjustmentFactor: magnification of temperature, this value is in range of (1.0, 10.0]. +// nDebug: cout the Wrong place and abort +// 0 -- not used. +// 1 -- used. // nSpeciesLimit: limitter of gas species -// 0 -- not used. -// 1 -- used. -// nTurblenceForChemical: the coupled mode of Turblence and Chemical reaction -// 0 -- method 0. -// 1 -- method 1. -// nViscosityFluxSublevelModified: Modified for ViscosityFlux on Sublevel grid -// 0 -- not used. -// 1 -- used. -// nViscosityPeModified: Pe Modified for ViscosityCoef -// 0 -- not used. -// 1 -- used. -// nChemcalSourceModified: Modified on ChemcalSource -// 0 -- not used. -// 1 -- used. -// nChemcalSourceEsMethod: Modified on ChemcalSource -// 0 -- approximation algorithm 1 (Ori.) -// 1 -- approximation algorithm 2 (New) - +// 0 -- not used. +// 1 -- used. +// nTurblenceForChemical: the coupled mode of Turblence and Chemical reaction. +// 0 -- method 0. +// 1 -- method 1. +// nViscosityFluxSublevelModified: Modified for ViscosityFlux on Sublevel grid. +// 0 -- not used. +// 1 -- used. +// nViscosityPeModified: Pe Modified for ViscosityCoef. +// 0 -- not used. +// 1 -- used. +// nChemcalSourceModified: Modified on ChemcalSource. +// 0 -- not used. +// 1 -- used. +// nChemcalSourceEsMethod: Modified on ChemcalSource. +// 0 -- approximation algorithm 1 (Ori). +// 1 -- approximation algorithm 2 (New). // nMaxStepTemperature: the iterative steps of temperature. - -// veTemperatureMinModified: Modified on the minimum of Tve for Cvvs -// 0 -- not used -// 1 -- used - -// nDiagonalModified: Modified on Diagonal -// 0 -- not used -// 1 -- Ori. -// 2 -- new - -//nGradPrimtiveMethod: -// 0 -- Ori. -// 1 -- new +// veTemperatureMinModified: Modified on the minimum of Tve for Cvvs. +// 0 -- not used. +// 1 -- used. +// nDiagonalModified: Modified on Diagonal. +// 0 -- not used. +// 1 -- new. +// nDiagonalModifiedTurb: Modified on Diagonal for turbulence. +// 0 -- not used. +// 1 -- new. +// nGradPrimtiveMethod: +// 0 -- Ori. +// 1 -- new. // nAblation: -// 0 -- The wall ablation is not computed. -// 1 -- The wall ablation is computed. +// 0 -- The wall ablation is not computed. +// 1 -- The wall ablation is computed. // isInjection: -// 0 -- The injection velocity of ablation wall is not computed. -// 1 -- The injection velocity of ablation wall is computed. +// 0 -- The injection velocity of ablation wall is not computed. +// 1 -- The injection velocity of ablation wall is computed. // nViscosityModel: -// 0 -- Blottner fitting method(N89). -// 1 -- Gupta fitting method(N90). +// 0 -- Blottner fitting method(N89). +// 1 -- Gupta fitting method(N90). // nContinueModel: The new continue model can switch different computation model. -// 0 -- Not use the new continue model. -// 1 -- use the new continue model. +// 0 -- Not use the new continue model. +// 1 -- use the new continue model. // nSutherland: -// 0 -- stands for selecting the Blotter curve fits mode. -// 1 -- stands for Sutherland relation. +// 0 -- stands for selecting the Blotter curve fits mode. +// 1 -- stands for Sutherland relation. // gasfile: Indicates the gas model, 9 models are provided, namely "Gu5", "Gu7", "Gu11", "Pa5", "Pa7", "Pa11", "DK5", "DK7", "DK11". -// "Gu" -- indicates the Gupta Model, three-Type Models are embeded in the library, namely, the 5-species-6-reactions, the 7-species-9-reactions, the 11-species-20-reactions. -// "Pa" -- indicates the Park Model, three-Type Models are embeded in the library, namely, the 5-species-17-reactions, the 7-species-22-reactions, the 11-species-48-reactions. -// "DK" -- indicates the Dunn-Kang Model, three-Type Models are embeded in the library, namely, the 5-species-11-reactions, the 7-species-15-reactions, the 11-species-26-reactions. -// "Mars-Pa8" is for Park model of Mars gas, "Mars-Mc8" for McKenzie model of Mars gas. -// "Combustion-12" -- indicates the Combustion Chamber Gas Model which includes 12-species-20-reactions. -// "Gas-Mixture" -- indicates the process of mixing gas without reacting. -// for struct solver mixing two speciesSpeciesA, SpeciesB. -// for unstruct solver mixing multi-speciesO2 NO CO CO2 H2 N2 Air CH4. -// For self-definition model, the gasfile is used to indicate the file path of the new gas model. +// "Gu" -- indicates the Gupta Model, three-Type Models are embeded in the library, namely, the 5-species-6-reactions, the 7-species-9-reactions, the 11-species-20-reactions. +// "Pa" -- indicates the Park Model, three-Type Models are embeded in the library, namely, the 5-species-17-reactions, the 7-species-22-reactions, the 11-species-48-reactions. +// "DK" -- indicates the Dunn-Kang Model, three-Type Models are embeded in the library, namely, the 5-species-11-reactions, the 7-species-15-reactions, the 11-species-26-reactions. +// "Mars-Pa8" is for Park model of Mars gas, "Mars-Mc8" for McKenzie model of Mars gas. +// "Combustion-12" -- indicates the Combustion Chamber Gas Model which includes 12-species-20-reactions. +// "Gas-Mixture" -- indicates the process of mixing gas without reacting. +// for struct solver mixing two species��SpeciesA, SpeciesB��. +// for unstruct solver mixing multi-species��O2 NO CO CO2 H2 N2 Air CH4��. +// For self-definition model, the gasfile is used to indicate the file path of the new gas model. // speciesName: Used to list the names of each species, while each species name is separated by the symbol of comma. // initMassFraction: Used to list the initial mass fractions of species in accordance with the sequence of names in the parameter speciesName. // ifStartFromPerfectGasResults: The chemical reaction simulation is start from perfect gas flowfield or not, 0 is for no and else is for yes. -// nIterFirstStep : the maximum number of iteration in the first step for the self-adaptive calculation. -// nIterSecondStep : the maximum number of iteration in the second step for the self-adaptive calculation. -// nIterThirdStep : the maximum number of iteration in the third step for the self-adaptive calculation. -// nEnergyAssembly : the vibration energy is computed with combined method which includes the fitting method and the molecular kinetic theory. -// 0 -- no, -// 1 -- yes. +// nIterFirstStep : the maximum number of iteration in the first step for the self-adaptive calculation. +// nIterSecondStep: the maximum number of iteration in the second step for the self-adaptive calculation. +// nIterThirdStep : the maximum number of iteration in the third step for the self-adaptive calculation. +// nEnergyAssembly: the vibration energy is computed with combined method which includes the fitting method and the molecular kinetic theory. +// 0 -- no, +// 1 -- yes. // nControlVariable: the variable to computing the residual error that determines the convergence is meet or not in the one-temperature model. -// 0 -- the density. -// 1 -- the translation temperature. -// 2 -- the vibration temperature. -// 3 -- the electron temperature. -// 4 -- the pressure. -// 5 -- the mass fraction of oxygen. -// 6 -- the mass fraction of nitrogen. +// 0 -- the density. +// 1 -- the translation temperature. +// 2 -- the vibration temperature. +// 3 -- the electron temperature. +// 4 -- the pressure. +// 5 -- the mass fraction of oxygen. +// 6 -- the mass fraction of nitrogen. // firstStepError : the residual error of the first step iteration for the self-adaptive calculation. // secondStepError : the residual error of the second step iteration for the self-adaptive calculation. // thirdStepError : the residual error of the third step iteration for the self-adaptive calculation. -// useHyflowSetting : Setting for HyFLOW GUI. -// 0 -- PHengLEI -// 1 -- HyFLOW -// nProtectData : Use the continuation file data protection mechanism. -// 0 -- no -// 1 -- yes - +// nProtectData: Use the continuation file data protection mechanism. +// 0 -- no. +// 1 -- yes. +// nTvChange: Judge whether the Tv equals Ttr. +// 0 -- yes. +// 1 -- no. +// isMoleFractionType: 1 indicates the mass fractions, or else the mole fractions. +// nFraction: the initial fractions type of species. +// 0 -- mass fraction. +// 1 -- mole fraction. int dg_high_order = 0; int iapplication = 0; int isAdaptiveSolver = 0; -int nm = 5; +int nm = 5; int nEquilibriumGas = 0; -int nPCWCycleStep = 3; -int nRETCycleStep = 3; -int nSLIPCycleStep= 3; +int nPCWCycleStep = 3; +int nRETCycleStep = 3; +int nSLIPCycleStep = 3; int nIterFirstStep = 1000; int nIterSecondStep= 2000; int nIterThirdStep = 2000; @@ -1065,17 +1084,17 @@ double secondStepError = 0.001; double thirdStepError = 0.001; double predictCFLError = 0.1; -double refGama = 1.4; -double prl = 0.72; -double prt = 0.90; -double sc_l = 0.5; -double sc_t = 0.5; +double refGama = 1.4; +double prl = 0.72; +double prt = 0.90; +double sc_l = 0.5; +double sc_t = 0.5; -int nGasModel = 0; -int nchem = 0; -int nchemsrc = 1; -int nchemrad = 1; -int ntmodel = 1; +int nGasModel = 0; +int nchem = 0; +int nchemsrc = 1; +int nchemrad = 1; +int ntmodel = 1; int nIdealState = 0; int nEnergyRecycle = 1; @@ -1099,12 +1118,12 @@ double sigmaTemperature = 1.0; double sigmaMassFraction = 1.0; double velocitySlipCorrectConstant = 1.0; -double chemicalRelaxCorf = 1.0; +double chemicalRelaxCorf = 1.0; double chemicalSpectrumRadiusCoef = 1.0; double viscousSpectrumRadiusCoef = 1.5; double inviscidSpectrumRadiusCoef = 1.5; -double spectrumRadiusCoef = 0.5; -double staticPressureRelaxCorf = 0.2; +double spectrumRadiusCoef = 0.5; +double staticPressureRelaxCorf = 0.2; double maxViscous = 10000.0; double trTemperatureMin = 10.0; @@ -1114,31 +1133,35 @@ double densityMin = 1.0e-8; double densityMinFactor = 0.1; double tAdjustmentFactor = 10.0; double iniSpeedCoef = 1.0; +int iniSpeedMode = 0; -int nDebug = 0; -int nSpeciesLimit = 1; -int nTurblenceForChemical = 0; -int nViscosityFluxSublevelModified = 1; -int nViscosityPeModified = 0; -int nChemcalSourceModified = 2; -int nChemcalSourceEsMethod = 1; -int nMaxStepTemperature = 5; -int veTemperatureMinModified = 1; -int nDiagonalModified = 0; -int nGradPrimtiveMethod = 1; -int nInviscidFluxModify = 1; -int nQlLimitMethod = 2; -int nSpeciesForWallMethod = 1; -int nDensityForWallMethod = 0; +int nDebug = 0; +int nSpeciesLimit = 1; +int nTurblenceForChemical = 0; +int nViscosityFluxSublevelModified = 1; +int nViscosityPeModified = 0; +int nChemcalSourceModified = 2; +int nChemcalSourceEsMethod = 1; +int nMaxStepTemperature = 5; +int veTemperatureMinModified = 1; +int nDiagonalModified = 0; +int nDiagonalModifiedTurb = 0; +int nGradPrimtiveMethod = 1; +int nInviscidFluxModify = 1; +int nQlLimitMethod = 2; +int nSpeciesForWallMethod = 1; +int nDensityForWallMethod = 0; +int wallMultiTemperature = 0; -int nProtectData = 0; -int useHyflowSetting = 0; -int nAblation = 0; -int isInjection = 0; -int nViscosityModel = 0; -int nMarsModel = 0; -string gasfile = "DK5"; -//string gasfile = "./chemical/Dunn-Kang_air5s11r.dat"; +int nProtectData = 0; +int nAblation = 0; +int isInjection = 0; +int nViscosityModel = 0; +int nMarsModel = 0; +int nTvChange = 0; +int isMoleFractionType = 0; +string gasfile = "DK5"; +//string gasfile = "./chemical/Dunn-Kang_air5s11r.dat"; string speciesName = "O, O2, NO, N, N2"; string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.767"; @@ -1152,16 +1175,16 @@ string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.767"; //string speciesName = "O, O2, NO, N, N2, C, CO, CO2"; //string initMassFraction = "0.0015, 0.0429, 0.0, 0.0, 0.0, 0.0, 0.0777, 0.8779"; -//string gasfile = "Pa"; +//string gasfile = "Pa"; //string speciesName = "O, O2, NO, N, NO+, C, C2, CO, CO2, CN, N2, e-"; //string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.767, 0.0"; -//string gasfile = "Combustion-12"; +//string gasfile = "Combustion-12"; //string speciesName = "O, O2, NO, N, C, CO, CO2, H, H2, OH, H2O, N2"; //string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.767"; //string gasfile = "Gas-Mixture"; -//string speciesName ="SpeciesA, SpeciesB"; +//string speciesName = "SpeciesA, SpeciesB"; //string initMassFraction = "1.0, 0.0"; int nSutherland = 0; double gamaSpeciesA = 1.4; @@ -1173,9 +1196,17 @@ double molecularWeightSpeciesB = 30.0; //string speciesName = "O2, N2"; //string initMassFraction = "1.0, 0.0"; +int nFraction = 0; int nContinueModel = 0; int nChemicalFlowStep = 0; int ifStartFromPerfectGasResults = 0; +int isUseNoneqCond = 0; +double frozenCondition = 0.01; + +int nLeakageMonitor = 0; +double totalLeakageVolume = 1000.0; +double monitorThresholdValue = 0.05; +double sprayFactor = 0.0; ######################################################################### // Multi-Grid parameters. @@ -1196,7 +1227,6 @@ int ifStartFromPerfectGasResults = 0; // 1 -- zero order. // 2 -- first-order. (default) // mgCorrectionLimit: Multi-grid correction limit. - int nMGLevel = 1; int MGCoarsestIteration = 1; int MGPreIteration = 1; @@ -1218,20 +1248,20 @@ int ismooth_turb = 0; int SAProductType = 2; // ----------------- Overset Grid parameter ----------------------------- -int codeOfDigHoles = 1; -int codeOfTurbulentModel = 0; -string masterFileName = "./grid/searchFile.inp"; -string holeBasicFileName = "./grid/holeBasicFile.inp"; -string holeFullFileName = "./grid/holeFullFile.dat"; -string linkFileName = "./grid/topology.dat"; -string zoneInverseFileName = "./grid/zoneInverseMapping.inp"; +int codeOfDigHoles = 1; +int codeOfTurbulentModel = 0; +string masterFileName = "./grid/searchFile.inp"; +string holeBasicFileName = "./grid/holeBasicFile.inp"; +string holeFullFileName = "./grid/holeFullFile.dat"; +string linkFileName = "./grid/topology.dat"; +string zoneInverseFileName = "./grid/zoneInverseMapping.inp"; -######################################################################### -# High Order Struct Solver # -######################################################################### +#************************************************************************ +# High Order Struct Solver * +#************************************************************************ // isFVMOrFDM: -// 0 -- NSSolverStruct using Finite Volume Method. -// 1 -- NSSolverStruct using Finite Differ Method. +// 0 -- NSSolverStruct using Finite Volume Method. +// 1 -- NSSolverStruct using Finite Differ Method. // SolverStructOrder: Spatial discretisation order of NS equations with struct grid. // <= 2 -- finite volume method. // >= 3 -- finite difference order. (to be completed) @@ -1273,30 +1303,48 @@ int allReduceStep = 1; // codeOfOversetGrid: Overlapping(overset) grid or not. // 0 -- NON-overlapping grid. // 1 -- Overlapping grid. -// oversetInterpolationMethod: the method of overset interpolation while field simulation +// oversetInterpolationMethod: the method of overset interpolation while field simulation. // 0 -- set the acceptor cell value by donor cell value. // 1 -- set the acceptor cell value by distance weight of donor cell value. - -int codeOfOversetGrid = 0; -int oversetInterpolationMethod = 0; -int readOversetFileOrNot = 0; -int symetryOrNot = 0; -int readInAuxiliaryInnerGrid = 0; -int readInAuxiliaryOuterGrid = 0; -int readInSklFileOrNot = 0; -string auxiliaryInnerGrid0 = "./grid/aux-upper.fts"; -string auxiliaryInnerGrid1 = "./grid/aux-lower.fts"; -string auxiliaryInnerGrid2 = ""; -string oversetGridFileName = "./grid/iblank.ovs"; -double walldistMainZone = 1.0 -double toleranceForOversetSearch = 1.0e-3; -double toleranceForOversetBox = 1.0e-3; -int twoOrderInterpolationOrNot = 0; -int keyEnlargeOfActiveNodes = 0; -int outTecplotOverset = 0; -int outPutOversetVisualization = 0; - -int numberOfMovingBodies = 2; +// readOversetFileOrNo: Whether to read overset-file(.ovs) that has been generated. +// 0 -- no. +// 1 -- yes. +// symetryOrNot: If there exist symetryplanes(XY plane, the coordinate of Z direction is 0) in +// the current overset grid(only for three dimension). +// 0 -- no. +// 1 -- yes. +// readInAuxiliaryInnerGrid: Whether to read auxiliary inner grid. +// 0 -- no. +// 1 -- yes. +// walldistMainZone: The initial value of background grid which does not exist wall boundary condition. +// toleranceForOversetSearch: The tolerance of overset searching zone to judge whether the obtained node is in the current computing cell. +// toleranceForOversetBox: The tolerance of building the minimum box of computing cells in the overlapping region. +// twoOrderInterpolationOrNot: The number of interpolated cell layers in the overlapping boundary. +// 0 -- one layer. +// 1 -- two layers. +// keyEnlargeOfActiveNodes: The number of enlarged overset-boundary layers in the buffer region. +// outTecplotOverset: Whether to dump out the flowfield data after the progress of overset configure. +// 0 -- no. +// 1 -- yes. +int codeOfOversetGrid = 0; +int oversetInterpolationMethod = 0; +int readOversetFileOrNot = 0; +int symetryOrNot = 0; +int readInAuxiliaryInnerGrid = 0; +int readInAuxiliaryOuterGrid = 0; +int readInSklFileOrNot = 0; +string auxiliaryInnerGrid0 = "./grid/aux-upper.fts"; +string auxiliaryInnerGrid1 = "./grid/aux-lower.fts"; +string auxiliaryInnerGrid2 = ""; +string oversetGridFileName = "./grid/iblank.ovs"; +double walldistMainZone = 1.0 +double toleranceForOversetSearch = 1.0e-3; +double toleranceForOversetBox = 1.0e-3; +int twoOrderInterpolationOrNot = 0; +int keyEnlargeOfActiveNodes = 0; +int outTecplotOverset = 0; +int outPutOversetVisualization = 0; +int numberOfMovingBodies = 2; // ----------------- ALE configuration ------------------------------ int codeOfAleModel = 0; @@ -1306,36 +1354,42 @@ double referenceLength = 1.0; double referenceVelocity = 1.0; double referenceDensity = 1.0; -int strategyForFaceNormalVelocity = 0; //0-By Sweeping volume; 1-By face center 1st; 2-By face center 2nd; -int strategyForGCLSource = 0; //0-present; 1-Ahn; +int strategyForFaceNormalVelocity = 0; // 0-By Sweeping volume; 1-By face center 1st; 2-By face center 2nd. +int strategyForGCLSource = 0; // 0-present; 1-Ahn. -//0:1st-Admas-Bashforth; 1:2nd-Admas-Bashforth; 2:1st-Implicit-Euler; 3:2nd-Implicit Euler; 4:2nd-Adams-Moulton; 5:3rd-Adams-Moulton +// 0: 1st-Admas-Bashforth; 1: 2nd-Admas-Bashforth; 2: 1st-Implicit-Euler; 3: 2nd-Implicit Euler; 4: 2nd-Adams-Moulton; 5: 3rd-Adams-Moulton. int methodForKineticEquation = 0; double relaxParameterOfKinetic = 1.0; -######################################################################### -# motive information # -######################################################################### +#************************************************************************ +# motive information * +#************************************************************************ int numberOfMovingBodies = 1; ############################## body0 ############################## -//mass of parts -double mass_0 = 1.0; -//mass matrix of parts Ixx Iyy Izz Ixy Ixz Iyz -double massMatrix_0[] = 1e-7, 1e-6, 1e-6, 0.0, 0.0, 0.0; -//initial six DOF position information of parts. xc yc zc -double massCenter_0[] = 0.0 , 0.0, 0.0; -//initial six DOF position information of parts. angleX angleY angleZ -double attitudeAngle_0[] = 0.0 , 0.0, 0.0; -//initial six DOF move information of parts. vc vy vz -double massCenterVelocity_0[] = 0.0, 0.0, 0.0; -//initial six DOF move information of parts. omigX omigY omigZ -double angularVelocity_0[] = 0.0, 0.0, 0.0; -//the object that the parts belong to. -int fartherIndex_0 = -1; -//the assembly position of the parts. xc yc zc angleX angleY angleZ -double configPamameter_0[] = 0.0 ,0.0 ,0.0 ,0.0 ,0.0 ,0.0; -//the move pattern of the parts. +// mass of parts. +double mass_0 = 1.0; +// gravity of parts (along negative direction in Y-axis, eg. 9.8). +double gravity_0 = 0.0; +// mass matrix of parts Ixx Iyy Izz Ixy Ixz Iyz. +double massMatrix_0[] = 1e-7, 1e-6, 1e-6, 0.0, 0.0, 0.0; +// initial six DOF position information of parts. xc yc zc. +double massCenter_0[] = 0.0, 0.0, 0.0; +// if reset mass center while restart. +int resetMassCenter_0 = 0; +// position offset of parts. dx dy dz. +double massCenterDxyz_0[] = 0.0, 0.0, 0.0; +// initial six DOF position information of parts. angleX angleY angleZ. +double attitudeAngle_0[] = 0.0, 0.0, 0.0; +// initial six DOF move information of parts. vc vy vz. +double massCenterVelocity_0[] = 0.0, 0.0, 0.0; +// initial six DOF move information of parts. omigX omigY omigZ. +double angularVelocity_0[] = 0.0, 0.0, 0.0; +// the object that the parts belong to. +int fartherIndex_0 = -1; +// the assembly position of the parts. xc yc zc angleX angleY angleZ. +double configPamameter_0[] = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0; +// the move pattern of the parts. // -1 given motion partten. // 0 still. // 1 six DOF motion. @@ -1346,51 +1400,68 @@ double configPamameter_0[] = 0.0 ,0.0 ,0.0 ,0.0 ,0.0 // 14 forced pitch motion. // 15 forced yaw motion. // 16 forced roll motion. -int RBDMethod_0 = 0; -double amplitude_0 = 0.0; -double reduceFrequency_0 = 0.0; -//direction of rotation +int RBDMethod_0 = 0; +double amplitude_0 = 0.0; +double reduceFrequency_0 = 0.0; +// direction of rotation. // 1 -- clockwise from the point of view along the positive x axis. // -1 -- anticlockwise from the point of view along the positive x axis. -int direction_0 = -1; -double rotateFrequency_0 = 0.0; -//string uDFSixDofFileName_0 = "./Bin/UDFSixDof.Parameter"; -//additional force (system axis) fX fY fZ -double addedForce_0[] = 0.0 ,0.0 ,0.0 ; -//additional moment of Force (system axis) mX mY mZ -double addedMoment_0[] = 0.0 ,0.0 ,0.0 ; -//the deformation method of the parts. -int morphing_0 = 0; - -// post indentify -int integralOrder = 4; +int direction_0 = -1; +double rotateFrequency_0 = 0.0; +//string uDFSixDofFileName_0 = "./Bin/UDFSixDof.Parameter"; +// dimensional physical time for additional force(s). +double addedForceTime_0[] = 0.0; +// additional force(inertia system) fX fY fZ. +double addedForce_0[] = 0.0, 0.0, 0.0; +// additional moment(inertia system) mX mY mZ. +double addedMoment_0[] = 0.0, 0.0, 0.0; +// the deformation method of the parts. +int morphing_0 = 0; +// post indentify. +int integralOrder = 4; // ---------------- ATP read -------------------------------------------- -//@int inflowParaType = 0; +//@int inflowParaType = 0; //@double refReNumber = 6.5e6; //@double refDimensionalTemperature = 288.15; //@double freestream_vibration_temperature = 300.00; -//@double refDimensionalPressure = 0; -//@double height = 0; -//@int nsubsonicInlet = 0; -//@int nsubsonicOutlet = 0; -//@string inLetFileName = "./bin/subsonicInlet.hypara"; -//@string outLetFileName = "./bin/subsonicOutlet.hypara"; +//@double refDimensionalPressure = 0; +//@double height = 0; +//@int nsubsonicInlet = 0; +//@int nsubsonicOutlet = 0; +//@string inLetFileName = "./bin/subsonicInlet.hypara"; +//@string outLetFileName = "./bin/subsonicOutlet.hypara"; //@double refDimensionalVelocity = 0; //@double refDimensionalDensity = 0; - -######################################################################### -# Old Parameter # -######################################################################### +//@string weatherDataFilePath = "./WRFData/"; +//@double longitude = 110.95 +//@double latitude = 19.61; +#************************************************************************ +# Old Parameter * +#************************************************************************ int isPlotVolumeField = 0; +#************************************************************************ +# partial flow field setting Parameter * +#************************************************************************ +//int nPartialParameter = 0; // 0/1/2 +//int nNumberOfPartialField = 0; // +//int nStartGridIndex[] = [0]; +//int nEndGridIndex[] = [0]; -######################################################################### -# Incompressible Parameter # -######################################################################### +//double partialCFL[] = [0.0]; +//double partialSpeedCoef[] = [0.0]; +//double partialSpeed[] = [0.0]; +//double partialAttackd[] = [0.0]; +//double partialSlide[] = [0.0]; +//double partialPressure[] = [0.0]; +//double partialTemperature[] = [0.0]; +//double partialMassFractions[] = [0.0]; +#************************************************************************ +# Incompressible Parameter * +#************************************************************************ int isSolveEnergyEquation = 0; int isSolveTurbEquation = 0; -int isSolveSpeciesEquation = 0; - +int isSolveSpeciesEquation = 0; \ No newline at end of file diff --git a/A02_TwoD_Plate_Laminar_Ma5_Struct_1CPU/bin/grid_para.hypara b/A02_TwoD_Plate_Laminar_Ma5_Struct_1CPU/bin/grid_para.hypara index c592e4b..9c07ac6 100644 --- a/A02_TwoD_Plate_Laminar_Ma5_Struct_1CPU/bin/grid_para.hypara +++ b/A02_TwoD_Plate_Laminar_Ma5_Struct_1CPU/bin/grid_para.hypara @@ -4,9 +4,12 @@ // gridtype: Grid type for generation, conversion, reconstruction, merging. // 0 -- Unstructured grid. // 1 -- Structured grid. -// axisup: Type of Cartisien coordinates system, used in grid conversion. -// 1 -- Y upward. (default) -// 2 -- Z upward. +// nAxisRotateTimes: number of axis rotating times, zero (default) meaning without rotating. +// axisRotateOrder : axis rotating order. +// 1 -- X-axis. +// 2 -- Y-axis. +// 3 -- Z-axis. +// axisRotateAngles: axis rotating angles (degree), which are corresponding to the axis rotating order. // from_gtype: Type of grid data type in grid conversion process. // -1 -- MULTI_TYPE. // 1 -- PHengLEI, *.fts. @@ -18,7 +21,9 @@ // 7 -- Hybrid, include both of unstructured and structured grid, *.fts. // 8 -- GMSH, *.msh. int gridtype = 1; -int axisup = 1; +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; int from_gtype = 3; ######################################################################### diff --git a/A03_TwoD_plate_SST_LowMach_Struct/bin/cfd_para.hypara b/A03_TwoD_plate_SST_LowMach_Struct/bin/cfd_para.hypara index c344658..f903a5a 100644 --- a/A03_TwoD_plate_SST_LowMach_Struct/bin/cfd_para.hypara +++ b/A03_TwoD_plate_SST_LowMach_Struct/bin/cfd_para.hypara @@ -8,23 +8,24 @@ // Platform for Hybrid Engineering Simulation of Flows + // China Aerodynamics Research and Development Center + // (C) Copyright, Since 2010 + +// PHengLEI 2212 + //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ########################################################################### # Default parameters for Grid conversion # ########################################################################### // gridtype: Grid type for generation, conversion, reconstruction, merging. -// 0 -- Unstructured grid. -// 1 -- Structured grid. -// 2 -- Hybrid grid, include both of unstructured and structured grid. -// gridobj: Task type of grid treatment. -// 0 -- Grid generation of typical case, such as cylinder, flat plate, etc. -// 1 -- Grid conversion, from other grid data to PHenglEI, such as Fluent, CGNS. -// 2 -- Grid refinement. -// 3 -- Grid merging, merge two blocks into one block. -// 4 -- Grid deformation, achieve unstructured grid deformation. -// 5 -- Grid repairing, repair the original grid in order to remove the negative volume cells. -// 6 -- Grid mirroring, mirror a symmetry grid to whole grid. -// 7 -- Grid type change, convert structured grid to unstructured grid. +// 0 -- Unstructured grid. +// 1 -- Structured grid. +// 2 -- Hybrid grid, include both of unstructured and structured grid. +// gridobj: Task type of grid treatment. +// 0 -- Grid generation of typical case, such as cylinder, flat plate, etc. +// 1 -- Grid conversion, from other grid data to PHenglEI, such as Fluent, CGNS. +// 2 -- Grid refinement. +// 3 -- Grid merging, merge two blocks into one block. +// 4 -- Grid deformation, achieve unstructured grid deformation. +// 5 -- Grid repairing, repair the original grid in order to remove the negative volume cells. +// 6 -- Grid mirroring, mirror a symmetry grid to whole grid. +// 7 -- Grid type change, convert structured grid to unstructured grid. // multiblock: Multi-block grid or not, only for structured grid conversion. // 0 -- Not. // 1 -- Yes. @@ -46,19 +47,24 @@ int gridobj = 1; int multiblock = 0; int iadapt = 0; int SymmetryFaceVector = 1; - int gridReorder = 0; int faceReorderMethod = 0; -// axisup: Type of Cartisien coordinates system, used in grid conversion. -// 1 -- Y upward. (default) -// 2 -- Z upward. -int axisup = 1; +// nAxisRotateTimes: number of axis rotating times, zero (default) meaning without rotating. +// axisRotateOrder : axis rotating order. +// 1 -- X-axis. +// 2 -- Y-axis. +// 3 -- Z-axis. +// axisRotateAngles: axis rotating angles (degree), which are corresponding to the axis rotating order. +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; // omit_no_bound_bc: What's boundary condition for the type of "no_boundary_condition". // 0 -- Interface. (default) // 1 -- Physical boundary condition, used in Hybrid solver. int omit_no_bound_bc = 0; +int omitRepeatInterface = 1; //----------------------------------------------------------------------- # Grid data type # @@ -87,10 +93,9 @@ int dumpOldGrid = 0; // from_gfile: path of original data file for unstructure grid convert from. // out_gfile: path of target file for grid convert to, *.fts type of file usually. int numberOfGridFile = 1; -string from_gfile = "./grid/rae2822_hybrid2d.cas"; -string from_gfile1= ""; - -string out_gfile = "./grid/flat_laminr_133_85_2d.fts"; +string from_gfile = "./grid/rae2822_hybrid2d.cas"; +string from_gfile1 = ""; +string out_gfile = "./grid/flat_laminr_133_85_2d.fts"; // ----------------- some advanced choices ------------------------------ // iunsteady: The Grid is for unsteady simulation or not. @@ -103,9 +108,9 @@ int fileformat = 0; // Parameters for hybrid solver. // mixgrid_uns: path of unstructure grid file for hybrid solver, *.fts type. -// mixgrid_str: path of structure grid file for hybrid solver, *.fts type. -string mixgrid_uns = "./grid/rae2822_uns2d_4.fts"; -string mixgrid_str = "./grid/flat_laminr_133_85_2d.fts"; +// mixgrid_str: path of structure grid file for hybrid solver, *.fts type. +string mixgrid_uns = "./grid/rae2822_uns2d_4.fts"; +string mixgrid_str = "./grid/flat_laminr_133_85_2d.fts"; // Some parameters for structured overlapping grid. int codeOfDigHoles = 1; @@ -119,31 +124,31 @@ string zoneInverseFileName = "./oversetGridView/zoneInverseMapping.inp"; // 0 -- Not. (default) // 1 -- Yes. // geometryUnit: Geometry unit. -// 1 -- meter. -// 2 -- millimeter. -// 3 -- inch. +// 1 -- meter. +// 2 -- millimeter. +// 3 -- inch. // exclusiveCase: Parallel projection exclusive case. -// 0 -- NON case. -// 1 -- JSM-C2-NPOFF case. -// 2 -- CHNT. +// 0 -- NON case. +// 1 -- JSM-C2-NPOFF case. +// 2 -- CHNT. // projectOrgPoint: If the original wall points need to be projected or not. -int anisoRefine = 0; -int geometryUnit = 1; -int isProject = 0; -int readDist = 0; -int isDeform = 0; +int anisoRefine = 0; +int geometryUnit = 1; +int isProject = 0; +int readDist = 0; +int isDeform = 0; int exclusiveCase = 0; int projectOrgPoint = 0; string geometryFileName = "./grid/jsm.igs"; // ----------------- Grid Deform Parameters ----------------------------- // deformationMethod: Grid Deform. -// 1 -- SPRING. -// 2 -- RBF. +// 1 -- SPRING. +// 2 -- RBF. // stationalGridFile: Original grid file. // visualFileName : The visualization file path of deform grid. // nDeformStep : The max deform step. -// flapAngle : The max flap angle. +// flapAngle : The max flap angle. // rotatePostionZ : Rotate postion. // rotatePostionY : Rotate postion. // gridSlice : If dump slice grid. @@ -163,10 +168,10 @@ int sliceAxis = 1; double slicePosition = 13; // ----------------- RBF Parameters ------------------------------------- -// numberOfReferenceCP : Number of reference Control Points. -// influencePara : The RBF influence radius parameter. +// numberOfReferenceCP: Number of reference Control Points. +// influencePara : The RBF influence radius parameter. int numberOfReferenceCP = 40; -double influencePara = 25.0; +double influencePara = 25.0; // ----------------- Periodic Parameters -------------------------------- // Notice: Rotational periodicity only support rotation along the X axis! @@ -178,9 +183,8 @@ double influencePara = 25.0; which only support one direction. // rotationAngle: The relative angle between two periodic face. which is recorded in degrees. - int periodicType = 0; -double translationLength[] = [0.0,0.0,0.0]; +double translationLength[] = [0.0, 0.0, 0.0]; double rotationAngle = 0.0; ######################################################################### @@ -192,7 +196,6 @@ double rotationAngle = 0.0; // 2 -- refine structured grid. // maxproc: The number of partition zones that want to be divided into. // numberOfMultifile: The number of partition grid files that want to be dumped out. - int pgridtype = 0; int maxproc = 4; int numberOfMultifile = 1; @@ -201,20 +204,20 @@ int numberOfMultifile = 1; // 0 -- Not. // 1 -- Yes. // blockIndexOfMark: the block index of mark, only for structured grid partition. -// cellIndexOfMark: the cell index of mark, only for structured grid partition. +// cellIndexOfMark : the cell index of mark, only for structured grid partition. int traceMark = 0; int blockIndexOfMark = 0; -int cellIndexOfMark[] = [185,30,1]; +int cellIndexOfMark[] = [185, 30, 1]; -// parallel Strategy: -//! -# 0 : each zone is assigned to the one that defined in grid partition procedure. -//! -# 1 : random assigned for each zone or by some else ways. -int parallelStrategy = 1; +// parallelStrategy: +// 0 -- each zone is assigned to the one that defined in grid partition procedure. +// 1 -- random assigned for each zone or by some else ways. +int parallelStrategy = 1; //----------------------------------------------------------------------- # File path # //----------------------------------------------------------------------- -// original_grid_file: Original grid file that want to be divided(PHengLEI type, *.fts). +// original_grid_file: Original grid file that want to be divided(PHengLEI type, *.fts). // partition_grid_file: Target partition grid file(PHengLEI type, *.fts). string original_grid_file = "./grid/sphere_mixed.fts"; string partition_grid_file = "./grid/sphere_mixed__4.fts"; @@ -232,11 +235,10 @@ string partition_grid_file = "./grid/sphere_mixed__4.fts"; // 1 -- perfect balance. // maxproc -- perfect imbalance. // 1.05 -- recommended. - int omit_no_bound_bc = 0; int npartmethod = 1; int parallelPartitionMethod = 2; -double parmetisBalance = 1.05; +double parmetisBalance = 1.05; // numberOfMultigrid: Number of multi-grid levels, ONLY used for structured grid. // 1 -- single level. @@ -248,29 +250,35 @@ int numberOfMultigrid = 1; # Default parameters for CFD simulation # ######################################################################### // maxSimuStep: The max simulation step, don't care simulation is restart or not. -// intervalStepFlow: The step intervals for flow variables file 'flow.dat' saved. -// intervalStepPlot: The step intervals for tecplot visual file 'tecflow.dat' saved. +// intervalStepFlow: The step intervals for flow variables file 'flow.dat' saved. +// intervalStepPlot: The step intervals for tecplot visual file 'tecflow.dat' saved. // intervalStepSample: The step intervals for monitored probes variables file 'sample.dat' saved. -// intervalStepForce: The step intervals for aerodynamics coefficients file 'aircoef.dat' saved. -// intervalStepRes: The step intervals for residual file 'res.dat' saved. -// ifLowSpeedPrecon: Precondition process to accelerate convergence for low speed flow. -// 0 -- no precondition process. (default, mach > 0.3) -// 1 -- carry out precondition process. (mach number <= 0.3) - -int maxSimuStep = 20000; - -int intervalStepFlow = 1000; -int intervalStepPlot = 1000; +// intervalStepForce: The step intervals for aerodynamics coefficients file 'aircoef.dat' saved. +// intervalStepRes: The step intervals for residual file 'res.dat' saved. +int maxSimuStep = 20000; +int intervalStepFlow = 1000; +int intervalStepPlot = 1000; int intervalStepSample = 1000; -int intervalStepForce = 100; -int intervalStepRes = 10; -int ifLowSpeedPrecon = 0; +int intervalStepForce = 100; +int intervalStepRes = 10; // compressible: // 0 -- incompressible flow. // 1 -- compressible flow. (default) int compressible = 1; +// ifLowSpeedPrecon: Precondition process to accelerate convergence for low speed flow. +// 0 -- no precondition process. (default, mach > 0.3) +// 1 -- carry out precondition process. (mach number <= 0.3) +// Kprec: The coefficient K for the cut-off velocity. +// 1.0~3.0 is suggested. (default, 3.0) +// preconFarfieldBCMethod: The precondition method for farfield boundary condition. +// 0 -- precondition far-field boundary based on riemann invariants. +// 1 -- Turkel's simplified far-field boundary condition. +int ifLowSpeedPrecon = 0; +double Kprec = 3.0; +int preconFarfieldBCMethod = 1; + //----------------------------------------------------------------------- # CFD Control Parameter # //----------------------------------------------------------------------- @@ -281,33 +289,36 @@ int compressible = 1; // 0 -- the nondimensional conditions. // 1 -- the flight conditions. // 2 -- the experiment conditions. -// 3 -- the subsonic boundary conditions. +// 3 -- the subsonic boundary conditions. (Useless!) // 4 -- the condition that the velocity, temperature and density are given. // 5 -- the condition that the velocity, temperature and pressure are given. +//flowInitMethod: Flow field initialization method. +// 0 -- The entire flow field is initialized according to Infinite velocity. +// 1 -- The velocity near the wall is initialized according to the boundary layer of the plate. // refReNumber: Reynolds number, which is based unit length, unit of 1/m. // refDimensionalTemperature: Dimensional reference temperature, or the total temperature only for the experiment condition. // freestream_vibration_temperature: Dimensional freestream vibration temperature. // refDimensionalPressure: Dimensional reference pressure, or the total pressure only for the experiment condition. // height: Fly height, unit of km. // wallTemperature: Temprature of the solid wall, minus value is for adiabatic boundary condition. -// gridScaleFactor: The customizable unit of the grid, default value is 1.0 for meter.Common dimensions like: -// 1 dm = 0.1 m. -// 1 cm = 0.01 m. -// 1 mm = 0.001m. -// 1 inch = 0.0254m. -// 1 foot = 12 inches = 0.3048m. -// 1 yard = 3 feet = 0.9144m. +// gridScaleFactor: The customizable unit of the grid, default value is 1.0 for meter. Common dimensions like: +// 1 dm = 0.1 m. +// 1 cm = 0.01 m. +// 1 mm = 0.001 m. +// 1 inch = 0.0254 m. +// 1 foot = 12 inches = 0.3048 m. +// 1 yard = 3 feet = 0.9144 m. // forceReferenceLength, forceReferenceLengthSpanWise, forceReferenceArea: Reference length, SpanWise length and area, independent of grid unit. // TorqueRefX, TorqueRefY, TorqueRefZ: Reference point, independent of grid unit. // radiationCoef: The radiation coefficient on wall, it is used to compute the radiation heat flux on wall when the boundary // condition is radiation equilibrium temperature, and 0.8 is the default value. -// refMolecularWeight : the reference molecular weight of gas used for perfect gas. The unit is g/mol. +// refMolecularWeight: the reference molecular weight of gas used for perfect gas. The unit is g/mol. // Generally, the gas is air. Sometimes, it is experiment gas, such as Nitrogen, Argon, and so on. - -int directionMethod = 0; +int directionMethod = 0; double refMachNumber = 0.73; double attackd = 2.79; double angleSlide = 0.00; +int flowInitMethod = 0; int inflowParaType = 0; double refReNumber = 6.5e6; @@ -321,29 +332,27 @@ double freestream_vibration_temperature = 300.00; //double refDimensionalTemperature = 6051.024; // The total temperature, T*(1+(refGama-1)*M*M/2). //double refDimensionalPressure = 4.299696E09; // The total pressure, p*(T0/T)^(refGama/(refGama-1)). -//int inflowParaType = 3; -//int nsubsonicInlet = 1; -//int nsubsonicOutlet = 1; -//string inLetFileName = "./bin/subsonicInlet.hypara"; -//string outLetFileName = "./bin/subsonicOutlet.hypara"; -//double refDimensionalTemperature = 288.144; -//double refDimensionalPressure = 1.01313E05; - -//The velocity, temperature and density are fixed. +// The velocity, temperature and density are fixed. //int inflowParaType = 4; //double refDimensionalVelocity = 1000.0; -//double refDimensionalDensity = 1.0e3; +//double refDimensionalDensity = 1.0e3; -//The velocity, temperature and pressure are fixed. +// The velocity, temperature and pressure are fixed. //int inflowParaType = 5; //double refDimensionalVelocity = 1000.0; //double refDimensionalPressure = 1.0e5; -//The MachNumber, temperature and pressure are fixed. +// The MachNumber, temperature and pressure are fixed. //int inflowParaType = 6; -//double refDimensionalTemperature = 293; +//double refDimensionalTemperature = 293.0; //double refDimensionalPressure = 8886.06; +// The velocity, temperature and pressure are read from file. +//int inflowParaType = 7; +//string weatherDataFilePath = "./WRFData/"; +//double longitude = 110.95 +//double latitude = 19.61; + double wallTemperature = -1.0; double radiationCoef = 0.8; @@ -357,41 +366,41 @@ double forceReferenceArea = 1.0; // unit of meter^2. double TorqueRefX = 0.0; // unit of meter. double TorqueRefY = 0.0; // unit of meter. double TorqueRefZ = 0.0; // unit of meter. +double knudsenLength = 1.0; // unit of meter. double refMolecularWeight = 28.9644; // unit of g/mol. //----------------------------------------------------------------------- # Spatial Discretisation # //----------------------------------------------------------------------- -#******************************************************************* -# Struct Solver * -#******************************************************************* +#************************************************************************ +# Struct Solver * +#************************************************************************ // inviscidSchemeName: Spatial discretisation scheme of struct grid. // Using this when solve structered grid or hybrid. -// -- "vanleer", "steger", "hlle", "lax_f". -// -- "roe", "modified_roe". +// -- "vanleer", "steger", "hlle", "lax_f", +// -- "roe", "modified_roe", // -- "ausm+", "ausm+w", "ausm+up", "ausmdv", "ausmpw", "ausmpw+". // isWennScheme: If using WENN Scheme of struct grid. -// 0 -- NO. (default) -// 1 -- Yes. +// 0 -- NO. (default) +// 1 -- Yes. // str_limiter_name: Limiter of struct grid. -// -- "vanalbada", "vanleer", "minmod", "smooth", "minvan", "3rdsmooth", "3rd_minmod_smooth". -// -- "nolim", no limiter. -// -- "vanalbada_clz", clz supersonic version. -// -- "weno3_js", "wenn3_prm211", "wenn3_zm", "wenn3_zes2", "wenn3_zes3" - +// -- "vanalbada", "vanleer", "minmod", "smooth", "minvan", "3rdsmooth", "3rd_minmod_smooth", +// -- "nolim", no limiter, +// -- "vanalbada_clz", clz supersonic version, +// -- "weno3_js", "wenn3_prm211", "wenn3_zm", "wenn3_zes2", "wenn3_zes3". string inviscidSchemeName = "roe"; int isWennScheme = 0; -string str_limiter_name = "vanalbada"; +string str_limiter_name = "vanalbada"; -#******************************************************************* -# UnStruct Solver or Common * -#******************************************************************* +#************************************************************************ +# UnStruct Solver or Common * +#************************************************************************ // viscousType: Viscous model. -// 0 -- Euler. -// 1 -- Lamilar. -// 2 -- Algebraic. -// 3 -- 1eq turbulent. -// 4 -- 2eq turbulent. +// 0 -- Euler. +// 1 -- Lamilar. +// 2 -- Algebraic. +// 3 -- 1eq turbulent. +// 4 -- 2eq turbulent. // viscousName: Laminar or tubulent model. // -- "0eq-bl". // -- "1eq-sa". @@ -410,16 +419,16 @@ string str_limiter_name = "vanalbada"; // 3 -- IDDES. // uns_scheme_name: Spatial discretisation scheme of Unstruct grid. // Using this when solve Unstructered grid or hybrid. -// -- "vanleer", "roe", "steger", "kfvs", "lax_f", "hlle". +// -- "vanleer", "roe", "GMRESRoe", "GMRESSteger", "steger", "kfvs", "lax_f", "hlle", // -- "ausm+", "ausmdv", "ausm+w", "ausmpw", "ausmpw+". // uns_limiter_name: Limiter of Unstruct grid. -// -- "barth", "vencat", "vanleer", "minmod". -// -- "vanalbada", "smooth", "nnd", "lpz", "1st". +// -- "barth", "vencat", "vanleer", "minmod", +// -- "vanalbada", "smooth", "nnd", "lpz", "1st", // -- "nolim", no limiter. // uns_vis_name: Discretisation method of viscous term. // -- "std", "test", "aver", "new1", "new2". // gradientName: Gradient reconstruction method. -// -- "default", "ggcell", "ggnode", "lsq". +// -- "default", "ggcell", "ggnode", "lsq". // ivencat: Variation of vencat limiter. // 0 -- org method, it is independent of grid scale. // 1 -- new method, it is dependent of grid scale. @@ -442,18 +451,18 @@ string str_limiter_name = "vanalbada"; // 3 -- Harten type, which is default used. // roeEntropyScale: Entropy fix (correction) coefficient scale, default is 1.0. // It is used to scale the default Roe entropy fix coefficients. -// AusmpwPlusLimiter: A Limiter to make "function w" not change acutely in AusmpwPlus scheme, default is 1.0 +// AusmpwPlusLimiter: A Limiter to make "function w" not change acutely in AusmpwPlus scheme, default is 1.0. -//int viscousType = 0; +//int viscousType = 0; //string viscousName = "Euler"; -//int viscousType = 1; +//int viscousType = 1; //string viscousName = "laminar"; -int viscousType = 3; +int viscousType = 3; string viscousName = "1eq-sa"; -//int viscousType = 4; +//int viscousType = 4; //string viscousName = "2eq-kw-menter-sst"; int DESType = 0; @@ -463,7 +472,7 @@ string uns_limiter_name = "vencat"; string uns_vis_name = "test"; string gradientName = "ggnode"; -int ivencat = 7; +int ivencat = 7; double venkatCoeff = 5.0; int reconmeth = 1; int limitVariables = 0; @@ -475,9 +484,9 @@ double roeEntropyScale = 1.0; double AusmpwPlusLimiter = 1.0; -//----------------------------------------------------------------------- -# Temporal Discretisation # -//----------------------------------------------------------------------- +#************************************************************************ +# Temporal Discretisation * +#************************************************************************ // iunsteady: Steady or unsteady. // 0 -- steady. // 1 -- unsteay. @@ -490,51 +499,57 @@ double AusmpwPlusLimiter = 1.0; // statisticalTimePeriod: Used as time period of statistic analysis. // when the value is negative, time period is treated as infinite. // statisticMethod: Statistic reynolds stress method. -// 0 -- tau = - ^2 -// 1 -- tau = +// 0 -- tau = - ^2 +// 1 -- tau = // min_sub_iter: The min sub iteration of unsteady simulation. // max_sub_iter: The max sub iteration of unsteady simulation. // tol_sub_iter: The tolerance of sub iteration of unsteady simulation. // tscheme: Temporal Discretisation method. -// 1 -- Runge-Kutta Multi-State. -// 2 -- Point implicit. -// 3 -- Full implicit. -// 4 -- LU-SGS. -// 5 -- Block LU-SGS. -// 6 -- Jacobian iteration. -// 7 -- Line LU-SGS. -// 8 -- Matrix LU-SGS. +// 1 -- Runge-Kutta Multi-State. +// 2 -- Point implicit. +// 3 -- Full implicit. +// 4 -- LU-SGS. +// 5 -- Block LU-SGS. +// 6 -- Jacobian iteration. +// 7 -- Line LU-SGS. +// 8 -- Matrix LU-SGS. +// 9 -- GMRES. // iSimplifyViscousTerm: Simplify the computation of viscous term in the Block LU-SGS method. The default value assigns 1 that could speed up the computation. // Otherwise, the viscous Jacobian matrix Mv should be computed that will increase the memory and time in iteration of the BLUSGS method. // CFLStart: Started cfl number. // CFLEnd: End cfl number. // CFLVaryStep: The number of step when cfl increase from CFLStart to CFLEnd. +// GMRESCFLScale : CFL = CFLStart * GMRESCFLScal^iteration. +// OriginalTscheme : Used for LUSGS and GMres hybrid computing. +// useLUSGSprecond: Initialize flow field for GMRES. +// 0 --Initialize by first order Jacobian matrix. +// 1 --Initialize by LUSGS. +// GMRESInitStep : the number of iteration step of irst order Jacobian matrix or LUSGS for initialize flow field. // ktmax: Dtratio. dt[i] = MIN(dt[i], ktmax * dtmin / vol[i]) // swapDq: Communication dq between forward/backward sweep of LUSGS or not, default is 0. // nLUSGSSweeps: Sub iteration of LU-SGS or Block LU-SGS. // LUSGSTolerance: Sub iter tolerance of LU-SGS or Block LU-SGS. // ifLocalTimeStep: Time step method. -// 0 --Local. -// 1 --Global. +// 0 --Local. +// 1 --Global. // isUseLocalCFL: use variable number of CFL or not. -// 0 -- global unified CFL number. -// 1 -- local CFL number. +// 0 -- global unified CFL number. +// 1 -- local CFL number. // isUsePreTwall: use the previous temperatures on wall. 1 indicates yes, and 0 indicates no. // visl_min: Minimum value of laminar viscosity coefficient. // turbCFLScale: Turbulence model cfl number factor. // codeOfAleModel: Arbitrary Lagrangian-Eulerian method. -// 0 -- no ALE method. -// 1 -- ALE method for non-moving grids. -// 2 -- ALE method for moving grids. -// 3 -- ALE method for deforming grids. +// 0 -- no ALE method. +// 1 -- ALE method for non-moving grids. +// 2 -- ALE method for moving grids. +// 3 -- ALE method for deforming grids. // wallFunctionType: The type of wall function to implement. -// 0 -- no wall function. (default) -// 1 -- standard wall function. -// 2 -- Pab3D wall function. +// 0 -- no wall function. (default) +// 1 -- standard wall function. +// 2 -- Pab3D wall function. // RKStage: The number of Runge-Kutta step. // lamda: Cofficient of Runge-Kutta step. - -int iunsteady = 0; +int iunsteady = 0; double physicalTimeStep = 0.01; double physicalTimeStepDimensional = -0.001; int ifStartFromSteadyResults = 0; @@ -543,39 +558,42 @@ int ifStaticsReynoldsStress = 0; int startStatisticStep = 800000; double statisticalTimePeriod = -1.0; int statisticMethod = 0; -int linearTwoStepMethods = 1; // 1--BDF1; 2--C-N; 3--BDF2; +int linearTwoStepMethods = 1; // 1--BDF1; 2--C-N; 3--BDF2. int methodOfDualTime = 3; int min_sub_iter = 50; int max_sub_iter = 50; double tol_sub_iter = 0.01; -int tscheme = 4; +int tscheme = 4; int iSimplifyViscousTerm = 1; int ifLocalTimeStep = 0; int isUseLocalCFL = 0; int isUsePreTwall = 0; -double CFLStart = 0.01; -double CFLEnd = 10.0; -int CFLVaryStep = 500; - +double CFLStart = 0.01; +double CFLEnd = 10.0; +int CFLVaryStep = 500; +double GMRESCFLScale = 1.0; +int OriginalTscheme = 9; +int useLUSGSprecond = 1; +int GMRESInitStep = 1000; double pMaxForCFL = 0.2; double pMinForCFL = 0.1; double deltaMaxForCFL = 0.2; double magnifyFactorForCFL = 1.1; double reduceFactorForCFL = 0.5; -double ktmax = 1.0e10; +double ktmax = 1.0e10; -int swapDq = 1; +int swapDq = 1; int nLUSGSSweeps = 1; double LUSGSTolerance = 0.01; -int order = 2; +int order = 2; double visl_min = 0.01; double turbCFLScale = 1.0; -double csrv = 2.0; +double csrv = 1.0; double timemax = 1.0e10; double dtsave = -1.0; int maxale = 10; @@ -591,10 +609,9 @@ double lamda[] = [0.5, 1.0]; //int RKStage = 4; //double lamda[] = [0.25, 0.33333333333, 0.5, 1.0]; - -//----------------------------------------------------------------------- -# File In or Out # -//----------------------------------------------------------------------- +#************************************************************************ +# File In or Out * +#************************************************************************ // numberOfGridGroups: The number of grid groups. // gridfile: The partitioned Grid file path, using relative path, // which is relative to the working directory. @@ -611,20 +628,18 @@ double lamda[] = [0.5, 1.0]; // aircoeffile: The file path to save the aerodynamic force coefficients convergence process, write data for every default (intervalStepForce) steps. // restartNSFile: The file path to write restart flowfield variables, write data for every default (intervalStepFlow) steps. // turbfile: The file path to write restart flowfield variables of turbulence , write data for every default(intervalStepFlow) steps. -// visualfile: The visualization file path of flowfield , write data for every default (intervalStepPlot) steps. +// visualfile: The visualization file path of flowfield, write data for every default (intervalStepPlot) steps. // wall_aircoefile: The file path to save flowfield variables of wall, write data for every default steps. // nDumpSurfaceInfo = 0 the "wall_varfile" write the informations including heat flux. // nDumpSurfaceInfo = 1 the "wall_varfile" write the informations without heat flux. // nIsComputeWallDist: Whether to compute the wall distance. // 0 -- Compute wall distance. // 1 -- Not compute. -// -// protectionFile0 and protectionFile1 : Two continuation file of the data protection mechanism. -// wall_heatfluxfile : The file to output the MaxHeatFlux of wall. - -int numberOfGridGroups = 1; -string gridfile = "./grid/rae2822_hybrid2d__4.fts"; -string wallTemperaturefile= ""; +// protectionFile0 and protectionFile1: Two continuation file of the data protection mechanism. +// wall_heatfluxfile: The file to output the MaxHeatFlux of wall. +int numberOfGridGroups = 1; +string gridfile = "./grid/rae2822_hybrid2d__4.fts"; +string wallTemperaturefile = ""; int nIsComputeWallDist = 0; int walldistMethod = 1; @@ -632,10 +647,12 @@ int cellMethodOrNodeMethod = 0; string resSaveFile = "results/res.dat"; string turbresfile = "results/turbres.dat"; +string transitionResFile = "results/transitionRes.dat"; string aircoeffile = "results/aircoef.dat"; string restartNSFile = "results/flow.dat"; string turbfile = "results/turb.dat"; +string transitionFile = "results/transition.dat"; string visualfile = "results/tecflow.plt"; string wall_aircoefile = "results/wall_aircoef.dat"; @@ -645,10 +662,14 @@ string protectionFile0 = "results/flow0.dat"; string protectionFile1 = "results/flow1.dat"; string wall_heatfluxfile = "results/wall_heatflux.dat"; -int nDumpSurfaceInfo = 0; -string wall_varfile = ""; +string protectionTurbFile0 = "results/turb0.dat"; +string protectionTurbFile1 = "results/turb1.dat"; -string jetDefineFile = "bin/jet.hypara"; +string protectionTransitionFile0 = "results/transition0.dat"; +string protectionTransitionFile1 = "results/transition1.dat"; + +int nDumpSurfaceInfo = 0; +string wall_varfile = ""; string sixDofFileName = "results/sixDofInfo.dat"; string derivativeFileName = "results/identify.dat"; @@ -659,7 +680,8 @@ int plotFieldType = 0; // visualfileType: The file type of visualfile. // 0 -- Tecplot binary. // 1 -- Tecplot ASCII. - +// 2 -- Ensight binary. +// 3 -- Ensight ASCII. int visualfileType = 1; // samplefileMode: The dump mode of sample file. @@ -697,21 +719,21 @@ double upperPlotFieldBox[] = [1.0 1.0 1.0]; // -- vibration temperature(Tv, 33), electron temperature(Te, 34), vibrational energy(Ev, 35), electric energy(Ee, 36), // -- number density of electron(Ne, 37), dimensioanl density(rho, 38), dimensioanl pressure(p, 39), dimensioanl temperature(T, 40), // -- gradientUx(41), gradientUy(42), gradientVx(43), gradientVy(44), streamline_u(45), streamline_v(46), streamline_w(47), -// -- transition intermittency(intermittency, 51), -transition momentum thickness reynolds(MomentumThicknessReynolds, 52), -// -- overlap iblank(iblank, 81) - -// -- specific heat ratio(gama, 56) +// -- transition intermittency(intermittency, 51), transition momentum thickness reynolds(MomentumThicknessReynolds, 52), +// -- local CFL Number(localCFL, 57), minimal CFL Number(minCFL, 58), +// -- overlap iblank(iblank, 81), +// -- specific heat ratio(gama, 56), Knudsen number(kn, 60), Damkohler number(Da, 61), vibrational nonequilibrium number(Vi, 62). // Important Warning: Array size of visualVariables MUST be equal to nVisualVariables!!! // Variables order must from small to big. //-----------the optional parameters list for the wall boundary condition---------------- // nVisualWallVariables: The number of visual variables on wall. // visualWallVariables : dumped variable types, listed as following: -// -coefficient of pressure(cp, 0), -coefficient of friction(cf, 1), yplus(2), -non-dimensional heat flux(Q_NonDim, 3), -dimensional heat flux(Q_Dim, 4), -// -pressure on wall(pw, 5), -temperature on wall(Tw, 6), -density on wall(rhow, 7), -heat flux of translational-rotational temperature term(Qtr, 8), -// -heat flux of species diffusion term(Qs, 9), -heat flux of vibrational temperature term(Qv, 10), -heat flux of electron temperature term(Qe, 11), -// -species mass fractions(Ns, 12), -x component of wall velocity(Vx, 13), -y component of wall velocity(Vy, 14), -z component of wall velocity(Vz, 15) -// -slip translational-rotational temperature(Tts, 16), -slip vibrational temperature(Tvs, 17), -slip electron temperature(Tes, 18), -absolute wall velocity(Vs, 19) -// -Stanton number(St, 20), -coefficient of heat rate(Ch, 21), -temperature jump(deltaT, 22), -Grid Reynolds number on wall(Re_w, 23) +// -- coefficient of pressure(cp, 0), coefficient of friction(cf, 1), yplus(2), non-dimensional heat flux(Q_NonDim, 3), dimensional heat flux(Q_Dim, 4), +// -- pressure on wall(pw, 5), temperature on wall(Tw, 6), density on wall(rhow, 7), heat flux of translational-rotational temperature term(Qtr, 8), +// -- heat flux of species diffusion term(Qs, 9), heat flux of vibrational temperature term(Qv, 10), heat flux of electron temperature term(Qe, 11), +// -- species mass fractions(Ns, 12), x component of wall velocity(Vx, 13), y component of wall velocity(Vy, 14), z component of wall velocity(Vz, 15), +// -- slip translational-rotational temperature(Tts, 16), slip vibrational temperature(Tvs, 17), slip electron temperature(Tes, 18), absolute wall velocity(Vs, 19), +// -- Stanton number(St, 20), coefficient of heat rate(Ch, 21), temperature jump(deltaT, 22), Grid Reynolds number on wall(Re_w, 23), Knudsen number(Kn_wall, 24). int nVisualVariables = 8; int visualVariables[] = [0, 1, 2, 3, 4, 5, 6, 15]; @@ -739,16 +761,18 @@ int dumpStandardModel = 0; // 1 -- Real cell where the probe is located. // nProbeVariables: Number of variables want to be dumped for probes monitered. // probeVariables : Variable types dumped, listed as following: -// -- density(0), u(1), v(2), w(3), pressure(4), temperature(5), mach(6). +// -- density(0), u(1), v(2), w(3), pressure(4), temperature(5), mach(6), +// -- dimensioanl_density(7), dimensioanl_u(8), dimensioanl_v(9), +// -- dimensioanl_w(10), dimensioanl_pressure(11), dimensioanl_temperature(12). // Important Warning: Array size of probeVariables MUST be equal to nProbeVariables!!! // probeVariables order must from small to big. // probeVariablesInterpolationMethod: Interpolation method used to compute the probe variables. -// 0 -- Take the value of probe's cell as probe real value. -// 1 -- Interpolation from probe's and neighbouring cell to probe. -// 2 -- Interpolation from probe's cell nodes to probe. +// 0 -- Take the value of probe's cell as probe real value. +// 1 -- Interpolation from probe's and neighbouring cell to probe. +// 2 -- Interpolation from probe's cell nodes to probe. int ifSetDataMonitor = 0; -int dataMonitorType = 0; +int dataMonitorType = 0; string probesDefineFile = "bin/probes_XYZ.dat"; //int dataMonitorType = 1; @@ -761,28 +785,26 @@ string probesDefineFile = "bin/probes_XYZ.dat"; int searchCellsMethod = 0; -int nProbeVariables = 7; -int probeVariables[] = [0, 1, 2, 3, 4, 5, 6]; -int probeVariablesInterpolationMethod = 0; -//----------------------------------------------------------------------- -# Turbulence Parameter # -//----------------------------------------------------------------------- +int nProbeVariables = 14; +int probeVariables[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]; +int probeVariablesInterpolationMethod = 0; + +#************************************************************************ +# Turbulence Parameter * +#************************************************************************ // turbInterval: Iteration number of turbulence. // kindOfTurbSource: Kinds of turbulent source. // 0 -- Original. // mod_turb_res: If modify the residuals for the cells next to the wall or not, default is 0. -// transitionType: transition model type +// transitionType: transition model type // 0 -- none. // 2 -- gama-re-theta. -// turbIntensity: (valid while greater than 0.0 ) turbulent intensity of free stream(*100) in transition -// freeturbIntensitySRModify: to use SR modify in free stream turbulent intensity decay or not - - +// turbIntensity: (valid while greater than 0.0 ) turbulent intensity of free stream(*100) in transition. +// freeturbIntensitySRModify: to use SR modify in free stream turbulent intensity decay or not. int turbInterval = 1; int turbOrderStruct = 2; int kindOfTurbSource = 0; int mod_turb_res = 0; -double turb_relax = 1.0; double freeStreamViscosity = 1.0e-3; double muoo = 3.0; double kwoo = 5.0; @@ -790,29 +812,28 @@ int transitionType = 0; double turbIntensity = -1.0; int freeturbIntensitySRModify = 0; double freeDecayXLocation = 0.0; -int compressibleCorrection = 0; -int prandtlNumberCorrection = 0; +int compressibleCorrection = 0; int transitionMaFix = 1; -# maximum eddy viscosity (myt/my) max. +// maximum eddy viscosity (myt/my) max. double eddyViscosityLimit = 1.0e10; int monitor_vistmax = 0; -//----------------------------------------------------------------------- -# LES Parameter # -//----------------------------------------------------------------------- +#************************************************************************ +# LES Parameter * +#************************************************************************ // iLES: Create LESSolver or not. -// = 1 - Create LESSolver; -// != 1 - not. +// = 1 -- Create LESSolver; +// != 1 -- not. // amplitudeofDisturb: Amplitude of adding disturb. // disturbstep: Unsteady time step or steady iteration of adding random disturb. // iterdisturb: Add random disturb in every sub-iter or only first sub-iter. -// = 0 - in only first sub-iter; -// != 0 - in every sub-iter. +// = 0 -- in only first sub-iter; +// != 0 -- in every sub-iter. // ipraddisturb: Add density and pressure disturb or not. // ibodyforce: Add body force in source flux of NS equations or not. -// = 0 - not; -// != 0 - Add body force. +// = 0 -- not; +// != 0 -- Add body force. // bodyforce: Body force in source flux of NS equations or not. // utau: friction velocity, using in DNSDisturb. // sgsmodel: subgrid scale model. @@ -820,23 +841,22 @@ int monitor_vistmax = 0; // = "dsmCom"; // = "wale"; // = "sigma". -// deltaFunctionType: = 1 - MAX(deltai, deltaj, deltak); -// = 2 - pow(deltai * deltaj *deltak, 1/3); -// = 3 - Devloped by Scotti. -// wallDampingFunctionType: = 0 - no wall function; -// = 1 - van Driest; -// = 2 - developed by Dr. Deng Xiaobing; -// = 3 - developed by Piomelli. +// deltaFunctionType: = 1 -- MAX(deltai, deltaj, deltak); +// = 2 -- pow(deltai * deltaj *deltak, 1/3); +// = 3 -- Devloped by Scotti. +// wallDampingFunctionType: = 0 -- no wall function; +// = 1 -- van Driest; +// = 2 -- developed by Dr. Deng Xiaobing; +// = 3 -- developed by Piomelli. // turbViscousCutType: turbulent viscosity cut type. -// = 0 - mu_total = mut + mul; -// = 1 - mu_total = max(mut-mul,0)+ mul; -// = 2 - mu_total = max(mut ,0)+ mul. +// = 0 -- mu_total = mut + mul; +// = 1 -- mu_total = max(mut-mul, 0) + mul; +// = 2 -- mu_total = max(mut , 0) + mul. // smagConstant: constant of smagorinsky model. // waleConstant: constant of wale model. -// filterDirection[3]: filter variables in i, j, k direction or not. +// filterDirection [3]: filter variables in i, j, k direction or not. // averageDirection[3]: average variables in i, j, k direction or not. // isotropicConstant: constant of isotropic part of SGS stress. - int iLES = 0; string sgsmodel = "smagorinsky"; int deltaFunctionType = 2; @@ -852,19 +872,16 @@ double testFilterScale = 2.0; int averageWidth = 1; int monitorNegativeConstant = 0; -//----------------------------------------------------------------------- -# Other Parameters for Hypersonic Non-equilibrium Gas # -//----------------------------------------------------------------------- +#************************************************************************ +# Other Parameters for Hypersonic Non-equilibrium Gas * +#************************************************************************ // dg_high_order: // 0 -- generic order accuracy. // 1 -- high order accuracy. // iapplication: // 0 -- gas model is fixed in the codes. // 1 -- gas model is imported from library files. -// isAdaptiveSolver: isAdaptiveSolver=0 indicates the generic Navier-Stokes solver, -// isAdaptiveSolver>0 indicates the HyFlow self-adaptive solver. -// 1 -- using HyFlow self-adaptive solver where the switch is controlled by the total iteration steps. -// 2 -- using HyFlow self-adaptive solver where the switch is controlled by variation of the key residual. +// isAdaptiveSolver: isAdaptiveSolver = 0 indicates the generic Navier-Stokes solver, // nm: Equation number of the physics, but is out of commision now. // 4 -- for 2D. // 5 -- for 3D. @@ -875,7 +892,7 @@ int monitorNegativeConstant = 0; // 2 -- Argon. // 3 -- Nitrogen. // nEnergyRecycle: The type of EnergyModel Recycle. -// 0 -- not used . +// 0 -- not used. // 1 -- used. // nDensityModify: The type of densitymodify. // 0 -- not used. @@ -883,26 +900,25 @@ int monitorNegativeConstant = 0; // nchem: // 0 -- without chemical reaction flow. // 1 -- the chemical reaction flow is considered. -// nEquilibriumGas: the variable is valid when the condition of nchem=0 is satisfied. +// nEquilibriumGas: the variable is valid when the condition of nchem = 0 is satisfied. // 0 -- perfect gas. // 5, 7, 11 -- equilibrium gas, meanwhile, its value denotes the number of gas component. -// nPCWCycleStep: the maximum step number of iteration in the module of computing species mass fractions with the partial catalytic wall(PCW) condition. -// the value equals to or is greater than 1, and 3 is for default value. -// nRETCycleStep: the maximum step number of iteration in the module of computing radiation equilibrium temperature on wall. -// the value equals to or is greater than 1, and 3 is for default value. -// nSLIPCycleStep:the maximum step number of iteration in the module of computing slip temperature, slip velocity and slip species mass fraction. -// the value equals to or is greater than 1, and 3 is for default value. -// nSlipBCModel : The computational model of slip boundary conditions. - -// 0 -- no slip. -// 1 -- the conventional Maxwell slip conditions. -// 2 -- the Gokcen slip conditions. -// 3 -- the Knudsen-layer correction of the standard slip conditions proposed by Lockerby, et al. -// 4 -- the Kogan simplified slip conditions. -// nMeanFreePathType : the method to the mean free-path for the slip conditions. For the mixture, 0 is suggested. -// 0 -- the equivalent mean free-path is calculated by the simple hard sphere model(HS). -// 1 -- calculated by the definition that includes the variables of the number density and the molecule diameter. -// 2 -- the equivalent mean free-path is calculated by the variable hard sphere model(VHS). +// nPCWCycleStep: The maximum step number of iteration in the module of computing species mass fractions with the partial catalytic wall(PCW) condition. +// The value equals to or is greater than 1, and 3 is for default value. +// nRETCycleStep: The maximum step number of iteration in the module of computing radiation equilibrium temperature on wall. +// The value equals to or is greater than 1, and 3 is for default value. +// nSLIPCycleStep:The maximum step number of iteration in the module of computing slip temperature, slip velocity and slip species mass fraction. +// The value equals to or is greater than 1, and 3 is for default value. +// nSlipBCModel: The computational model of slip boundary conditions. +// 0 -- no slip. +// 1 -- the conventional Maxwell slip conditions. +// 2 -- the Gokcen slip conditions. +// 3 -- the Knudsen-layer correction of the standard slip conditions proposed by Lockerby, et al. +// 4 -- the Kogan simplified slip conditions. +// nMeanFreePathType: the method to the mean free-path for the slip conditions. For the mixture, 0 is suggested. +// 0 -- the equivalent mean free-path is calculated by the simple hard sphere model(HS). +// 1 -- calculated by the definition that includes the variables of the number density and the molecule diameter. +// 2 -- the equivalent mean free-path is calculated by the variable hard sphere model(VHS). // nchemsrc: // 0 -- the source terms are not computed. // 1 -- the source terms are computed. @@ -913,148 +929,151 @@ int monitorNegativeConstant = 0; // 1 -- One-temperature model. // 2 -- Two-temperature model. // 3 -- Three-temperature model. +// isUseNoneqCond: +// 0 -- compute the source terms without any conditions. +// 1 -- compute the source terms using the non-equilibrium condition. +// frozenCondition: the threshold value of frozen chemical flow condition, 0.1 is the default value. // nIdealState: whether take all gas species as ideal gas for gas-mixture process. // 0 -- No. -// 1 -- Yes. -// nTEnergyModel: the method to computing temperature energy model. +// 1 -- Yes. // nTEnergyModel: the method to computing temperature energy model. // 0 -- the energy term is computed using the conventional method. // 1 -- the energy term is computed using the polynomial fitting method. // 2 -- the energy term is computed using the piecewise polynomial fitting method. // parkVDPower: the power of translational-rotational temperature in the Park V-D(vibration-dissociation) coupling model. // The value is in range of [0.0, 1.0], DPLR suggests 0.5, LAURA suggests 0.7, while 0.6 is given as default value. // catalyticCoef: -// 0.0 -- full non-catalytic wall boundary condition. -// 1.0 -- full catalytic wall boundary condition. -// in range of (0.0, 1.0) -- partial catalytic condition, the value indicates the catalytic coefficient. -// nIsSuperCatalytic : the super catalytic condition for the fully catalytic wall, and assigned with the value of 1. -// 0 -- equilibrium condition for the fully catalytic wall where the mass fractions are assigned with the values of the free stream. -// 1 -- super catalytic condition for the fully catalytic wall where all the atomic components combine into molecular components. -// nTemperatureJump : the method to calculate the temperature jump. -// 0 -- calculated by the variables of heat conductivity and constant volume specific heat for each energy mode. -// 1 -- the general method where the iteration is calculated with the translation-rotation temperature. -// nSurfGradMethod : the method to compute the surface heating ratio. -// 0 -- the gradient of variable is computed with the first-order difference method. -// 1 -- the gradient of variable is computed with the Green-Guass integral method. -// nRapidFlowfield : initialize the flowfield using the rapid engineering method when it is greater than zero. -// nSurfHeatMonitor : To exam the surface heating change or not. 0 is no, 1 is yes. -// nInitPressureStep : the steps to initialize the boundary variables when the rapid method is used. 100 is the default value. -// nDumpCFLNumber : 1 indicates dumping the CFL number to file, 0 denotes no dumping. +// 0.0 -- full non-catalytic wall boundary condition. +// 1.0 -- full catalytic wall boundary condition. +// in range of (0.0, 1.0) -- partial catalytic condition, the value indicates the catalytic coefficient. +// nIsSuperCatalytic: the super catalytic condition for the fully catalytic wall, and assigned with the value of 1. +// 0 -- equilibrium condition for the fully catalytic wall where the mass fractions are assigned with the values of the free stream. +// 1 -- super catalytic condition for the fully catalytic wall where all the atomic components combine into molecular components. +// nTemperatureJump: the method to calculate the temperature jump. +// 0 -- calculated by the variables of heat conductivity and constant volume specific heat for each energy mode. +// 1 -- the general method where the iteration is calculated with the translation-rotation temperature. +// nSurfGradMethod: the method to compute the surface heating ratio. +// 0 -- the gradient of variable is computed with the first-order difference method. +// 1 -- the gradient of variable is computed with the Green-Guass integral method. +// nRapidFlowfield: initialize the flowfield using the rapid engineering method when it is greater than zero. +// nSurfHeatMonitor: To exam the surface heating change or not. 0 is no, 1 is yes. +// nInitPressureStep: the steps to initialize the boundary variables when the rapid method is used. 100 is the default value. +// nDumpCFLNumber: 1 indicates dumping the CFL number to file, 0 denotes no dumping. // sigmaVelocity: the coordination coefficient of tangential momentum for computation of slip velocity. The value is in range of (0.0, 2.0]. // sigmaTemperature: the heat coordination coefficient for computation of slip temperature. The value is in range of (0.0, 2.0]. // sigmaMassFraction: the species coordination coefficient for computation of slip mass fractions. The value is in range of (0.0, 2.0]. // velocitySlipCorrectConstant: the correction constant to the velocity slip condition. For the diffuse reflection, 1.0 is used. -// 1.0 -- proposed by Maxwell. -// sqrt(2/PI)~0.8 -- used for "micro-slip", namely the actual velocity slip at the wall. -// 1.146 -- proposed for an additional "fictitious" velocity slip. - -// chemicalRelaxCorf: The value is in range of [0.001, 1.0]. -// spectrumRadiusCoef: The value is in range of [0.0, 2.0]. -// staticPressureRelaxCorf: The value is in range of [0.1, 1.0]. -// nIsChemicalFreeze : the flag to freeze the chemical reactions. -// 0 -- not freeze, the chemical reaction sources will be calculated. -// 1 -- freezes the chemical reactions, the chemical reaction sources will not be calculated.// veTemperatureMin: The minimum of Tv and Te - -//maxViscous: the maximum of Viscous. -//trTemperatureMin: the minimum value of trTemperature. -//veTemperatureMin: the minimum value of veTemperature. -//densityMin: the minimum value of density. -//tAdjustmentFactor: magnification of temperature, this value is in range of (1.0, 10.0]. -// nDebug: cout the Wrong place and abort -// 0 -- not used. -// 1 -- used. +// 1.0 -- proposed by Maxwell. +// sqrt(2/PI)~0.8 -- used for "micro-slip", namely the actual velocity slip at the wall. +// 1.146 -- proposed for an additional "fictitious" velocity slip. +// chemicalRelaxCorf: The value is in range of [0.001, 1.0]. +// spectrumRadiusCoef: The value is in range of [0.0, 2.0]. +// staticPressureRelaxCorf: The value is in range of [0.1, 1.0]. +// nIsChemicalFreeze: the flag to freeze the chemical reactions. +// 0 -- not freeze, the chemical reaction sources will be calculated. +// 1 -- freezes the chemical reactions, the chemical reaction sources will not be calculated. +// veTemperatureMin: The minimum of Tv and Te. +// maxViscous: the maximum of Viscous. +// trTemperatureMin: the minimum value of trTemperature. +// veTemperatureMin: the minimum value of veTemperature. +// densityMin: the minimum value of density. +// tAdjustmentFactor: magnification of temperature, this value is in range of (1.0, 10.0]. +// nDebug: cout the Wrong place and abort +// 0 -- not used. +// 1 -- used. // nSpeciesLimit: limitter of gas species -// 0 -- not used. -// 1 -- used. -// nTurblenceForChemical: the coupled mode of Turblence and Chemical reaction -// 0 -- method 0. -// 1 -- method 1. -// nViscosityFluxSublevelModified: Modified for ViscosityFlux on Sublevel grid -// 0 -- not used. -// 1 -- used. -// nViscosityPeModified: Pe Modified for ViscosityCoef -// 0 -- not used. -// 1 -- used. -// nChemcalSourceModified: Modified on ChemcalSource -// 0 -- not used. -// 1 -- used. -// nChemcalSourceEsMethod: Modified on ChemcalSource -// 0 -- approximation algorithm 1 (Ori.) -// 1 -- approximation algorithm 2 (New) - +// 0 -- not used. +// 1 -- used. +// nTurblenceForChemical: the coupled mode of Turblence and Chemical reaction. +// 0 -- method 0. +// 1 -- method 1. +// nViscosityFluxSublevelModified: Modified for ViscosityFlux on Sublevel grid. +// 0 -- not used. +// 1 -- used. +// nViscosityPeModified: Pe Modified for ViscosityCoef. +// 0 -- not used. +// 1 -- used. +// nChemcalSourceModified: Modified on ChemcalSource. +// 0 -- not used. +// 1 -- used. +// nChemcalSourceEsMethod: Modified on ChemcalSource. +// 0 -- approximation algorithm 1 (Ori). +// 1 -- approximation algorithm 2 (New). // nMaxStepTemperature: the iterative steps of temperature. - -// veTemperatureMinModified: Modified on the minimum of Tve for Cvvs -// 0 -- not used -// 1 -- used - -// nDiagonalModified: Modified on Diagonal -// 0 -- not used -// 1 -- Ori. -// 2 -- new - -//nGradPrimtiveMethod: -// 0 -- Ori. -// 1 -- new +// veTemperatureMinModified: Modified on the minimum of Tve for Cvvs. +// 0 -- not used. +// 1 -- used. +// nDiagonalModified: Modified on Diagonal. +// 0 -- not used. +// 1 -- new. +// nDiagonalModifiedTurb: Modified on Diagonal for turbulence. +// 0 -- not used. +// 1 -- new. +// nGradPrimtiveMethod: +// 0 -- Ori. +// 1 -- new. // nAblation: -// 0 -- The wall ablation is not computed. -// 1 -- The wall ablation is computed. +// 0 -- The wall ablation is not computed. +// 1 -- The wall ablation is computed. // isInjection: -// 0 -- The injection velocity of ablation wall is not computed. -// 1 -- The injection velocity of ablation wall is computed. +// 0 -- The injection velocity of ablation wall is not computed. +// 1 -- The injection velocity of ablation wall is computed. // nViscosityModel: -// 0 -- Blottner fitting method(N89). -// 1 -- Gupta fitting method(N90). +// 0 -- Blottner fitting method(N89). +// 1 -- Gupta fitting method(N90). // nContinueModel: The new continue model can switch different computation model. -// 0 -- Not use the new continue model. -// 1 -- use the new continue model. +// 0 -- Not use the new continue model. +// 1 -- use the new continue model. // nSutherland: -// 0 -- stands for selecting the Blotter curve fits mode. -// 1 -- stands for Sutherland relation. +// 0 -- stands for selecting the Blotter curve fits mode. +// 1 -- stands for Sutherland relation. // gasfile: Indicates the gas model, 9 models are provided, namely "Gu5", "Gu7", "Gu11", "Pa5", "Pa7", "Pa11", "DK5", "DK7", "DK11". -// "Gu" -- indicates the Gupta Model, three-Type Models are embeded in the library, namely, the 5-species-6-reactions, the 7-species-9-reactions, the 11-species-20-reactions. -// "Pa" -- indicates the Park Model, three-Type Models are embeded in the library, namely, the 5-species-17-reactions, the 7-species-22-reactions, the 11-species-48-reactions. -// "DK" -- indicates the Dunn-Kang Model, three-Type Models are embeded in the library, namely, the 5-species-11-reactions, the 7-species-15-reactions, the 11-species-26-reactions. -// "Mars-Pa8" is for Park model of Mars gas, "Mars-Mc8" for McKenzie model of Mars gas. -// "Combustion-12" -- indicates the Combustion Chamber Gas Model which includes 12-species-20-reactions. -// "Gas-Mixture" -- indicates the process of mixing gas without reacting. -// for struct solver mixing two speciesSpeciesA, SpeciesB. -// for unstruct solver mixing multi-speciesO2 NO CO CO2 H2 N2 Air CH4. -// For self-definition model, the gasfile is used to indicate the file path of the new gas model. +// "Gu" -- indicates the Gupta Model, three-Type Models are embeded in the library, namely, the 5-species-6-reactions, the 7-species-9-reactions, the 11-species-20-reactions. +// "Pa" -- indicates the Park Model, three-Type Models are embeded in the library, namely, the 5-species-17-reactions, the 7-species-22-reactions, the 11-species-48-reactions. +// "DK" -- indicates the Dunn-Kang Model, three-Type Models are embeded in the library, namely, the 5-species-11-reactions, the 7-species-15-reactions, the 11-species-26-reactions. +// "Mars-Pa8" is for Park model of Mars gas, "Mars-Mc8" for McKenzie model of Mars gas. +// "Combustion-12" -- indicates the Combustion Chamber Gas Model which includes 12-species-20-reactions. +// "Gas-Mixture" -- indicates the process of mixing gas without reacting. +// for struct solver mixing two species��SpeciesA, SpeciesB��. +// for unstruct solver mixing multi-species��O2 NO CO CO2 H2 N2 Air CH4��. +// For self-definition model, the gasfile is used to indicate the file path of the new gas model. // speciesName: Used to list the names of each species, while each species name is separated by the symbol of comma. // initMassFraction: Used to list the initial mass fractions of species in accordance with the sequence of names in the parameter speciesName. // ifStartFromPerfectGasResults: The chemical reaction simulation is start from perfect gas flowfield or not, 0 is for no and else is for yes. -// nIterFirstStep : the maximum number of iteration in the first step for the self-adaptive calculation. -// nIterSecondStep : the maximum number of iteration in the second step for the self-adaptive calculation. -// nIterThirdStep : the maximum number of iteration in the third step for the self-adaptive calculation. -// nEnergyAssembly : the vibration energy is computed with combined method which includes the fitting method and the molecular kinetic theory. -// 0 -- no, -// 1 -- yes. +// nIterFirstStep : the maximum number of iteration in the first step for the self-adaptive calculation. +// nIterSecondStep: the maximum number of iteration in the second step for the self-adaptive calculation. +// nIterThirdStep : the maximum number of iteration in the third step for the self-adaptive calculation. +// nEnergyAssembly: the vibration energy is computed with combined method which includes the fitting method and the molecular kinetic theory. +// 0 -- no, +// 1 -- yes. // nControlVariable: the variable to computing the residual error that determines the convergence is meet or not in the one-temperature model. -// 0 -- the density. -// 1 -- the translation temperature. -// 2 -- the vibration temperature. -// 3 -- the electron temperature. -// 4 -- the pressure. -// 5 -- the mass fraction of oxygen. -// 6 -- the mass fraction of nitrogen. +// 0 -- the density. +// 1 -- the translation temperature. +// 2 -- the vibration temperature. +// 3 -- the electron temperature. +// 4 -- the pressure. +// 5 -- the mass fraction of oxygen. +// 6 -- the mass fraction of nitrogen. // firstStepError : the residual error of the first step iteration for the self-adaptive calculation. // secondStepError : the residual error of the second step iteration for the self-adaptive calculation. // thirdStepError : the residual error of the third step iteration for the self-adaptive calculation. -// useHyflowSetting : Setting for HyFLOW GUI. -// 0 -- PHengLEI -// 1 -- HyFLOW -// nProtectData : Use the continuation file data protection mechanism. -// 0 -- no -// 1 -- yes - +// nProtectData: Use the continuation file data protection mechanism. +// 0 -- no. +// 1 -- yes. +// nTvChange: Judge whether the Tv equals Ttr. +// 0 -- yes. +// 1 -- no. +// isMoleFractionType: 1 indicates the mass fractions, or else the mole fractions. +// nFraction: the initial fractions type of species. +// 0 -- mass fraction. +// 1 -- mole fraction. int dg_high_order = 0; int iapplication = 0; int isAdaptiveSolver = 0; -int nm = 5; +int nm = 5; int nEquilibriumGas = 0; -int nPCWCycleStep = 3; -int nRETCycleStep = 3; -int nSLIPCycleStep= 3; +int nPCWCycleStep = 3; +int nRETCycleStep = 3; +int nSLIPCycleStep = 3; int nIterFirstStep = 1000; int nIterSecondStep= 2000; int nIterThirdStep = 2000; @@ -1065,17 +1084,17 @@ double secondStepError = 0.001; double thirdStepError = 0.001; double predictCFLError = 0.1; -double refGama = 1.4; -double prl = 0.72; -double prt = 0.90; -double sc_l = 0.5; -double sc_t = 0.5; +double refGama = 1.4; +double prl = 0.72; +double prt = 0.90; +double sc_l = 0.5; +double sc_t = 0.5; -int nGasModel = 0; -int nchem = 0; -int nchemsrc = 1; -int nchemrad = 1; -int ntmodel = 1; +int nGasModel = 0; +int nchem = 0; +int nchemsrc = 1; +int nchemrad = 1; +int ntmodel = 1; int nIdealState = 0; int nEnergyRecycle = 1; @@ -1099,12 +1118,12 @@ double sigmaTemperature = 1.0; double sigmaMassFraction = 1.0; double velocitySlipCorrectConstant = 1.0; -double chemicalRelaxCorf = 1.0; +double chemicalRelaxCorf = 1.0; double chemicalSpectrumRadiusCoef = 1.0; double viscousSpectrumRadiusCoef = 1.5; double inviscidSpectrumRadiusCoef = 1.5; -double spectrumRadiusCoef = 0.5; -double staticPressureRelaxCorf = 0.2; +double spectrumRadiusCoef = 0.5; +double staticPressureRelaxCorf = 0.2; double maxViscous = 10000.0; double trTemperatureMin = 10.0; @@ -1114,31 +1133,35 @@ double densityMin = 1.0e-8; double densityMinFactor = 0.1; double tAdjustmentFactor = 10.0; double iniSpeedCoef = 1.0; +int iniSpeedMode = 0; -int nDebug = 0; -int nSpeciesLimit = 1; -int nTurblenceForChemical = 0; -int nViscosityFluxSublevelModified = 1; -int nViscosityPeModified = 0; -int nChemcalSourceModified = 2; -int nChemcalSourceEsMethod = 1; -int nMaxStepTemperature = 5; -int veTemperatureMinModified = 1; -int nDiagonalModified = 0; -int nGradPrimtiveMethod = 1; -int nInviscidFluxModify = 1; -int nQlLimitMethod = 2; -int nSpeciesForWallMethod = 1; -int nDensityForWallMethod = 0; +int nDebug = 0; +int nSpeciesLimit = 1; +int nTurblenceForChemical = 0; +int nViscosityFluxSublevelModified = 1; +int nViscosityPeModified = 0; +int nChemcalSourceModified = 2; +int nChemcalSourceEsMethod = 1; +int nMaxStepTemperature = 5; +int veTemperatureMinModified = 1; +int nDiagonalModified = 0; +int nDiagonalModifiedTurb = 0; +int nGradPrimtiveMethod = 1; +int nInviscidFluxModify = 1; +int nQlLimitMethod = 2; +int nSpeciesForWallMethod = 1; +int nDensityForWallMethod = 0; +int wallMultiTemperature = 0; -int nProtectData = 0; -int useHyflowSetting = 0; -int nAblation = 0; -int isInjection = 0; -int nViscosityModel = 0; -int nMarsModel = 0; -string gasfile = "DK5"; -//string gasfile = "./chemical/Dunn-Kang_air5s11r.dat"; +int nProtectData = 0; +int nAblation = 0; +int isInjection = 0; +int nViscosityModel = 0; +int nMarsModel = 0; +int nTvChange = 0; +int isMoleFractionType = 0; +string gasfile = "DK5"; +//string gasfile = "./chemical/Dunn-Kang_air5s11r.dat"; string speciesName = "O, O2, NO, N, N2"; string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.767"; @@ -1152,16 +1175,16 @@ string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.767"; //string speciesName = "O, O2, NO, N, N2, C, CO, CO2"; //string initMassFraction = "0.0015, 0.0429, 0.0, 0.0, 0.0, 0.0, 0.0777, 0.8779"; -//string gasfile = "Pa"; +//string gasfile = "Pa"; //string speciesName = "O, O2, NO, N, NO+, C, C2, CO, CO2, CN, N2, e-"; //string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.767, 0.0"; -//string gasfile = "Combustion-12"; +//string gasfile = "Combustion-12"; //string speciesName = "O, O2, NO, N, C, CO, CO2, H, H2, OH, H2O, N2"; //string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.767"; //string gasfile = "Gas-Mixture"; -//string speciesName ="SpeciesA, SpeciesB"; +//string speciesName = "SpeciesA, SpeciesB"; //string initMassFraction = "1.0, 0.0"; int nSutherland = 0; double gamaSpeciesA = 1.4; @@ -1173,9 +1196,17 @@ double molecularWeightSpeciesB = 30.0; //string speciesName = "O2, N2"; //string initMassFraction = "1.0, 0.0"; +int nFraction = 0; int nContinueModel = 0; int nChemicalFlowStep = 0; int ifStartFromPerfectGasResults = 0; +int isUseNoneqCond = 0; +double frozenCondition = 0.01; + +int nLeakageMonitor = 0; +double totalLeakageVolume = 1000.0; +double monitorThresholdValue = 0.05; +double sprayFactor = 0.0; ######################################################################### // Multi-Grid parameters. @@ -1196,7 +1227,6 @@ int ifStartFromPerfectGasResults = 0; // 1 -- zero order. // 2 -- first-order. (default) // mgCorrectionLimit: Multi-grid correction limit. - int nMGLevel = 1; int MGCoarsestIteration = 1; int MGPreIteration = 1; @@ -1218,20 +1248,20 @@ int ismooth_turb = 0; int SAProductType = 2; // ----------------- Overset Grid parameter ----------------------------- -int codeOfDigHoles = 1; -int codeOfTurbulentModel = 0; -string masterFileName = "./grid/searchFile.inp"; -string holeBasicFileName = "./grid/holeBasicFile.inp"; -string holeFullFileName = "./grid/holeFullFile.dat"; -string linkFileName = "./grid/topology.dat"; -string zoneInverseFileName = "./grid/zoneInverseMapping.inp"; +int codeOfDigHoles = 1; +int codeOfTurbulentModel = 0; +string masterFileName = "./grid/searchFile.inp"; +string holeBasicFileName = "./grid/holeBasicFile.inp"; +string holeFullFileName = "./grid/holeFullFile.dat"; +string linkFileName = "./grid/topology.dat"; +string zoneInverseFileName = "./grid/zoneInverseMapping.inp"; -######################################################################### -# High Order Struct Solver # -######################################################################### +#************************************************************************ +# High Order Struct Solver * +#************************************************************************ // isFVMOrFDM: -// 0 -- NSSolverStruct using Finite Volume Method. -// 1 -- NSSolverStruct using Finite Differ Method. +// 0 -- NSSolverStruct using Finite Volume Method. +// 1 -- NSSolverStruct using Finite Differ Method. // SolverStructOrder: Spatial discretisation order of NS equations with struct grid. // <= 2 -- finite volume method. // >= 3 -- finite difference order. (to be completed) @@ -1273,30 +1303,48 @@ int allReduceStep = 1; // codeOfOversetGrid: Overlapping(overset) grid or not. // 0 -- NON-overlapping grid. // 1 -- Overlapping grid. -// oversetInterpolationMethod: the method of overset interpolation while field simulation +// oversetInterpolationMethod: the method of overset interpolation while field simulation. // 0 -- set the acceptor cell value by donor cell value. // 1 -- set the acceptor cell value by distance weight of donor cell value. - -int codeOfOversetGrid = 0; -int oversetInterpolationMethod = 0; -int readOversetFileOrNot = 0; -int symetryOrNot = 0; -int readInAuxiliaryInnerGrid = 0; -int readInAuxiliaryOuterGrid = 0; -int readInSklFileOrNot = 0; -string auxiliaryInnerGrid0 = "./grid/aux-upper.fts"; -string auxiliaryInnerGrid1 = "./grid/aux-lower.fts"; -string auxiliaryInnerGrid2 = ""; -string oversetGridFileName = "./grid/iblank.ovs"; -double walldistMainZone = 1.0 -double toleranceForOversetSearch = 1.0e-3; -double toleranceForOversetBox = 1.0e-3; -int twoOrderInterpolationOrNot = 0; -int keyEnlargeOfActiveNodes = 0; -int outTecplotOverset = 0; -int outPutOversetVisualization = 0; - -int numberOfMovingBodies = 2; +// readOversetFileOrNo: Whether to read overset-file(.ovs) that has been generated. +// 0 -- no. +// 1 -- yes. +// symetryOrNot: If there exist symetryplanes(XY plane, the coordinate of Z direction is 0) in +// the current overset grid(only for three dimension). +// 0 -- no. +// 1 -- yes. +// readInAuxiliaryInnerGrid: Whether to read auxiliary inner grid. +// 0 -- no. +// 1 -- yes. +// walldistMainZone: The initial value of background grid which does not exist wall boundary condition. +// toleranceForOversetSearch: The tolerance of overset searching zone to judge whether the obtained node is in the current computing cell. +// toleranceForOversetBox: The tolerance of building the minimum box of computing cells in the overlapping region. +// twoOrderInterpolationOrNot: The number of interpolated cell layers in the overlapping boundary. +// 0 -- one layer. +// 1 -- two layers. +// keyEnlargeOfActiveNodes: The number of enlarged overset-boundary layers in the buffer region. +// outTecplotOverset: Whether to dump out the flowfield data after the progress of overset configure. +// 0 -- no. +// 1 -- yes. +int codeOfOversetGrid = 0; +int oversetInterpolationMethod = 0; +int readOversetFileOrNot = 0; +int symetryOrNot = 0; +int readInAuxiliaryInnerGrid = 0; +int readInAuxiliaryOuterGrid = 0; +int readInSklFileOrNot = 0; +string auxiliaryInnerGrid0 = "./grid/aux-upper.fts"; +string auxiliaryInnerGrid1 = "./grid/aux-lower.fts"; +string auxiliaryInnerGrid2 = ""; +string oversetGridFileName = "./grid/iblank.ovs"; +double walldistMainZone = 1.0 +double toleranceForOversetSearch = 1.0e-3; +double toleranceForOversetBox = 1.0e-3; +int twoOrderInterpolationOrNot = 0; +int keyEnlargeOfActiveNodes = 0; +int outTecplotOverset = 0; +int outPutOversetVisualization = 0; +int numberOfMovingBodies = 2; // ----------------- ALE configuration ------------------------------ int codeOfAleModel = 0; @@ -1306,36 +1354,42 @@ double referenceLength = 1.0; double referenceVelocity = 1.0; double referenceDensity = 1.0; -int strategyForFaceNormalVelocity = 0; //0-By Sweeping volume; 1-By face center 1st; 2-By face center 2nd; -int strategyForGCLSource = 0; //0-present; 1-Ahn; +int strategyForFaceNormalVelocity = 0; // 0-By Sweeping volume; 1-By face center 1st; 2-By face center 2nd. +int strategyForGCLSource = 0; // 0-present; 1-Ahn. -//0:1st-Admas-Bashforth; 1:2nd-Admas-Bashforth; 2:1st-Implicit-Euler; 3:2nd-Implicit Euler; 4:2nd-Adams-Moulton; 5:3rd-Adams-Moulton +// 0: 1st-Admas-Bashforth; 1: 2nd-Admas-Bashforth; 2: 1st-Implicit-Euler; 3: 2nd-Implicit Euler; 4: 2nd-Adams-Moulton; 5: 3rd-Adams-Moulton. int methodForKineticEquation = 0; double relaxParameterOfKinetic = 1.0; -######################################################################### -# motive information # -######################################################################### +#************************************************************************ +# motive information * +#************************************************************************ int numberOfMovingBodies = 1; ############################## body0 ############################## -//mass of parts -double mass_0 = 1.0; -//mass matrix of parts Ixx Iyy Izz Ixy Ixz Iyz -double massMatrix_0[] = 1e-7, 1e-6, 1e-6, 0.0, 0.0, 0.0; -//initial six DOF position information of parts. xc yc zc -double massCenter_0[] = 0.0 , 0.0, 0.0; -//initial six DOF position information of parts. angleX angleY angleZ -double attitudeAngle_0[] = 0.0 , 0.0, 0.0; -//initial six DOF move information of parts. vc vy vz -double massCenterVelocity_0[] = 0.0, 0.0, 0.0; -//initial six DOF move information of parts. omigX omigY omigZ -double angularVelocity_0[] = 0.0, 0.0, 0.0; -//the object that the parts belong to. -int fartherIndex_0 = -1; -//the assembly position of the parts. xc yc zc angleX angleY angleZ -double configPamameter_0[] = 0.0 ,0.0 ,0.0 ,0.0 ,0.0 ,0.0; -//the move pattern of the parts. +// mass of parts. +double mass_0 = 1.0; +// gravity of parts (along negative direction in Y-axis, eg. 9.8). +double gravity_0 = 0.0; +// mass matrix of parts Ixx Iyy Izz Ixy Ixz Iyz. +double massMatrix_0[] = 1e-7, 1e-6, 1e-6, 0.0, 0.0, 0.0; +// initial six DOF position information of parts. xc yc zc. +double massCenter_0[] = 0.0, 0.0, 0.0; +// if reset mass center while restart. +int resetMassCenter_0 = 0; +// position offset of parts. dx dy dz. +double massCenterDxyz_0[] = 0.0, 0.0, 0.0; +// initial six DOF position information of parts. angleX angleY angleZ. +double attitudeAngle_0[] = 0.0, 0.0, 0.0; +// initial six DOF move information of parts. vc vy vz. +double massCenterVelocity_0[] = 0.0, 0.0, 0.0; +// initial six DOF move information of parts. omigX omigY omigZ. +double angularVelocity_0[] = 0.0, 0.0, 0.0; +// the object that the parts belong to. +int fartherIndex_0 = -1; +// the assembly position of the parts. xc yc zc angleX angleY angleZ. +double configPamameter_0[] = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0; +// the move pattern of the parts. // -1 given motion partten. // 0 still. // 1 six DOF motion. @@ -1346,51 +1400,68 @@ double configPamameter_0[] = 0.0 ,0.0 ,0.0 ,0.0 ,0.0 // 14 forced pitch motion. // 15 forced yaw motion. // 16 forced roll motion. -int RBDMethod_0 = 0; -double amplitude_0 = 0.0; -double reduceFrequency_0 = 0.0; -//direction of rotation +int RBDMethod_0 = 0; +double amplitude_0 = 0.0; +double reduceFrequency_0 = 0.0; +// direction of rotation. // 1 -- clockwise from the point of view along the positive x axis. // -1 -- anticlockwise from the point of view along the positive x axis. -int direction_0 = -1; -double rotateFrequency_0 = 0.0; -//string uDFSixDofFileName_0 = "./Bin/UDFSixDof.Parameter"; -//additional force (system axis) fX fY fZ -double addedForce_0[] = 0.0 ,0.0 ,0.0 ; -//additional moment of Force (system axis) mX mY mZ -double addedMoment_0[] = 0.0 ,0.0 ,0.0 ; -//the deformation method of the parts. -int morphing_0 = 0; - -// post indentify -int integralOrder = 4; +int direction_0 = -1; +double rotateFrequency_0 = 0.0; +//string uDFSixDofFileName_0 = "./Bin/UDFSixDof.Parameter"; +// dimensional physical time for additional force(s). +double addedForceTime_0[] = 0.0; +// additional force(inertia system) fX fY fZ. +double addedForce_0[] = 0.0, 0.0, 0.0; +// additional moment(inertia system) mX mY mZ. +double addedMoment_0[] = 0.0, 0.0, 0.0; +// the deformation method of the parts. +int morphing_0 = 0; +// post indentify. +int integralOrder = 4; // ---------------- ATP read -------------------------------------------- -//@int inflowParaType = 0; +//@int inflowParaType = 0; //@double refReNumber = 6.5e6; //@double refDimensionalTemperature = 288.15; //@double freestream_vibration_temperature = 300.00; -//@double refDimensionalPressure = 0; -//@double height = 0; -//@int nsubsonicInlet = 0; -//@int nsubsonicOutlet = 0; -//@string inLetFileName = "./bin/subsonicInlet.hypara"; -//@string outLetFileName = "./bin/subsonicOutlet.hypara"; +//@double refDimensionalPressure = 0; +//@double height = 0; +//@int nsubsonicInlet = 0; +//@int nsubsonicOutlet = 0; +//@string inLetFileName = "./bin/subsonicInlet.hypara"; +//@string outLetFileName = "./bin/subsonicOutlet.hypara"; //@double refDimensionalVelocity = 0; //@double refDimensionalDensity = 0; - -######################################################################### -# Old Parameter # -######################################################################### +//@string weatherDataFilePath = "./WRFData/"; +//@double longitude = 110.95 +//@double latitude = 19.61; +#************************************************************************ +# Old Parameter * +#************************************************************************ int isPlotVolumeField = 0; +#************************************************************************ +# partial flow field setting Parameter * +#************************************************************************ +//int nPartialParameter = 0; // 0/1/2 +//int nNumberOfPartialField = 0; // +//int nStartGridIndex[] = [0]; +//int nEndGridIndex[] = [0]; -######################################################################### -# Incompressible Parameter # -######################################################################### +//double partialCFL[] = [0.0]; +//double partialSpeedCoef[] = [0.0]; +//double partialSpeed[] = [0.0]; +//double partialAttackd[] = [0.0]; +//double partialSlide[] = [0.0]; +//double partialPressure[] = [0.0]; +//double partialTemperature[] = [0.0]; +//double partialMassFractions[] = [0.0]; +#************************************************************************ +# Incompressible Parameter * +#************************************************************************ int isSolveEnergyEquation = 0; int isSolveTurbEquation = 0; -int isSolveSpeciesEquation = 0; - +int isSolveSpeciesEquation = 0; \ No newline at end of file diff --git a/A03_TwoD_plate_SST_LowMach_Struct/bin/grid_para.hypara b/A03_TwoD_plate_SST_LowMach_Struct/bin/grid_para.hypara index 9309eb4..2cd00bd 100644 --- a/A03_TwoD_plate_SST_LowMach_Struct/bin/grid_para.hypara +++ b/A03_TwoD_plate_SST_LowMach_Struct/bin/grid_para.hypara @@ -4,9 +4,12 @@ // gridtype: Grid type for generation, conversion, reconstruction, merging. // 0 -- Unstructured grid. // 1 -- Structured grid. -// axisup: Type of Cartisien coordinates system, used in grid conversion. -// 1 -- Y upward. (default) -// 2 -- Z upward. +// nAxisRotateTimes: number of axis rotating times, zero (default) meaning without rotating. +// axisRotateOrder : axis rotating order. +// 1 -- X-axis. +// 2 -- Y-axis. +// 3 -- Z-axis. +// axisRotateAngles: axis rotating angles (degree), which are corresponding to the axis rotating order. // from_gtype: Type of grid data type in grid conversion process. // -1 -- MULTI_TYPE. // 1 -- PHengLEI, *.fts. @@ -18,7 +21,9 @@ // 7 -- Hybrid, include both of unstructured and structured grid, *.fts. // 8 -- GMSH, *.msh. int gridtype = 1; -int axisup = 1; +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; int from_gtype = 3; ######################################################################### diff --git a/A04_TwoD_Plate_SST_Ma5_Struct_1CPU/bin/cfd_para.hypara b/A04_TwoD_Plate_SST_Ma5_Struct_1CPU/bin/cfd_para.hypara index c344658..f903a5a 100644 --- a/A04_TwoD_Plate_SST_Ma5_Struct_1CPU/bin/cfd_para.hypara +++ b/A04_TwoD_Plate_SST_Ma5_Struct_1CPU/bin/cfd_para.hypara @@ -8,23 +8,24 @@ // Platform for Hybrid Engineering Simulation of Flows + // China Aerodynamics Research and Development Center + // (C) Copyright, Since 2010 + +// PHengLEI 2212 + //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ########################################################################### # Default parameters for Grid conversion # ########################################################################### // gridtype: Grid type for generation, conversion, reconstruction, merging. -// 0 -- Unstructured grid. -// 1 -- Structured grid. -// 2 -- Hybrid grid, include both of unstructured and structured grid. -// gridobj: Task type of grid treatment. -// 0 -- Grid generation of typical case, such as cylinder, flat plate, etc. -// 1 -- Grid conversion, from other grid data to PHenglEI, such as Fluent, CGNS. -// 2 -- Grid refinement. -// 3 -- Grid merging, merge two blocks into one block. -// 4 -- Grid deformation, achieve unstructured grid deformation. -// 5 -- Grid repairing, repair the original grid in order to remove the negative volume cells. -// 6 -- Grid mirroring, mirror a symmetry grid to whole grid. -// 7 -- Grid type change, convert structured grid to unstructured grid. +// 0 -- Unstructured grid. +// 1 -- Structured grid. +// 2 -- Hybrid grid, include both of unstructured and structured grid. +// gridobj: Task type of grid treatment. +// 0 -- Grid generation of typical case, such as cylinder, flat plate, etc. +// 1 -- Grid conversion, from other grid data to PHenglEI, such as Fluent, CGNS. +// 2 -- Grid refinement. +// 3 -- Grid merging, merge two blocks into one block. +// 4 -- Grid deformation, achieve unstructured grid deformation. +// 5 -- Grid repairing, repair the original grid in order to remove the negative volume cells. +// 6 -- Grid mirroring, mirror a symmetry grid to whole grid. +// 7 -- Grid type change, convert structured grid to unstructured grid. // multiblock: Multi-block grid or not, only for structured grid conversion. // 0 -- Not. // 1 -- Yes. @@ -46,19 +47,24 @@ int gridobj = 1; int multiblock = 0; int iadapt = 0; int SymmetryFaceVector = 1; - int gridReorder = 0; int faceReorderMethod = 0; -// axisup: Type of Cartisien coordinates system, used in grid conversion. -// 1 -- Y upward. (default) -// 2 -- Z upward. -int axisup = 1; +// nAxisRotateTimes: number of axis rotating times, zero (default) meaning without rotating. +// axisRotateOrder : axis rotating order. +// 1 -- X-axis. +// 2 -- Y-axis. +// 3 -- Z-axis. +// axisRotateAngles: axis rotating angles (degree), which are corresponding to the axis rotating order. +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; // omit_no_bound_bc: What's boundary condition for the type of "no_boundary_condition". // 0 -- Interface. (default) // 1 -- Physical boundary condition, used in Hybrid solver. int omit_no_bound_bc = 0; +int omitRepeatInterface = 1; //----------------------------------------------------------------------- # Grid data type # @@ -87,10 +93,9 @@ int dumpOldGrid = 0; // from_gfile: path of original data file for unstructure grid convert from. // out_gfile: path of target file for grid convert to, *.fts type of file usually. int numberOfGridFile = 1; -string from_gfile = "./grid/rae2822_hybrid2d.cas"; -string from_gfile1= ""; - -string out_gfile = "./grid/flat_laminr_133_85_2d.fts"; +string from_gfile = "./grid/rae2822_hybrid2d.cas"; +string from_gfile1 = ""; +string out_gfile = "./grid/flat_laminr_133_85_2d.fts"; // ----------------- some advanced choices ------------------------------ // iunsteady: The Grid is for unsteady simulation or not. @@ -103,9 +108,9 @@ int fileformat = 0; // Parameters for hybrid solver. // mixgrid_uns: path of unstructure grid file for hybrid solver, *.fts type. -// mixgrid_str: path of structure grid file for hybrid solver, *.fts type. -string mixgrid_uns = "./grid/rae2822_uns2d_4.fts"; -string mixgrid_str = "./grid/flat_laminr_133_85_2d.fts"; +// mixgrid_str: path of structure grid file for hybrid solver, *.fts type. +string mixgrid_uns = "./grid/rae2822_uns2d_4.fts"; +string mixgrid_str = "./grid/flat_laminr_133_85_2d.fts"; // Some parameters for structured overlapping grid. int codeOfDigHoles = 1; @@ -119,31 +124,31 @@ string zoneInverseFileName = "./oversetGridView/zoneInverseMapping.inp"; // 0 -- Not. (default) // 1 -- Yes. // geometryUnit: Geometry unit. -// 1 -- meter. -// 2 -- millimeter. -// 3 -- inch. +// 1 -- meter. +// 2 -- millimeter. +// 3 -- inch. // exclusiveCase: Parallel projection exclusive case. -// 0 -- NON case. -// 1 -- JSM-C2-NPOFF case. -// 2 -- CHNT. +// 0 -- NON case. +// 1 -- JSM-C2-NPOFF case. +// 2 -- CHNT. // projectOrgPoint: If the original wall points need to be projected or not. -int anisoRefine = 0; -int geometryUnit = 1; -int isProject = 0; -int readDist = 0; -int isDeform = 0; +int anisoRefine = 0; +int geometryUnit = 1; +int isProject = 0; +int readDist = 0; +int isDeform = 0; int exclusiveCase = 0; int projectOrgPoint = 0; string geometryFileName = "./grid/jsm.igs"; // ----------------- Grid Deform Parameters ----------------------------- // deformationMethod: Grid Deform. -// 1 -- SPRING. -// 2 -- RBF. +// 1 -- SPRING. +// 2 -- RBF. // stationalGridFile: Original grid file. // visualFileName : The visualization file path of deform grid. // nDeformStep : The max deform step. -// flapAngle : The max flap angle. +// flapAngle : The max flap angle. // rotatePostionZ : Rotate postion. // rotatePostionY : Rotate postion. // gridSlice : If dump slice grid. @@ -163,10 +168,10 @@ int sliceAxis = 1; double slicePosition = 13; // ----------------- RBF Parameters ------------------------------------- -// numberOfReferenceCP : Number of reference Control Points. -// influencePara : The RBF influence radius parameter. +// numberOfReferenceCP: Number of reference Control Points. +// influencePara : The RBF influence radius parameter. int numberOfReferenceCP = 40; -double influencePara = 25.0; +double influencePara = 25.0; // ----------------- Periodic Parameters -------------------------------- // Notice: Rotational periodicity only support rotation along the X axis! @@ -178,9 +183,8 @@ double influencePara = 25.0; which only support one direction. // rotationAngle: The relative angle between two periodic face. which is recorded in degrees. - int periodicType = 0; -double translationLength[] = [0.0,0.0,0.0]; +double translationLength[] = [0.0, 0.0, 0.0]; double rotationAngle = 0.0; ######################################################################### @@ -192,7 +196,6 @@ double rotationAngle = 0.0; // 2 -- refine structured grid. // maxproc: The number of partition zones that want to be divided into. // numberOfMultifile: The number of partition grid files that want to be dumped out. - int pgridtype = 0; int maxproc = 4; int numberOfMultifile = 1; @@ -201,20 +204,20 @@ int numberOfMultifile = 1; // 0 -- Not. // 1 -- Yes. // blockIndexOfMark: the block index of mark, only for structured grid partition. -// cellIndexOfMark: the cell index of mark, only for structured grid partition. +// cellIndexOfMark : the cell index of mark, only for structured grid partition. int traceMark = 0; int blockIndexOfMark = 0; -int cellIndexOfMark[] = [185,30,1]; +int cellIndexOfMark[] = [185, 30, 1]; -// parallel Strategy: -//! -# 0 : each zone is assigned to the one that defined in grid partition procedure. -//! -# 1 : random assigned for each zone or by some else ways. -int parallelStrategy = 1; +// parallelStrategy: +// 0 -- each zone is assigned to the one that defined in grid partition procedure. +// 1 -- random assigned for each zone or by some else ways. +int parallelStrategy = 1; //----------------------------------------------------------------------- # File path # //----------------------------------------------------------------------- -// original_grid_file: Original grid file that want to be divided(PHengLEI type, *.fts). +// original_grid_file: Original grid file that want to be divided(PHengLEI type, *.fts). // partition_grid_file: Target partition grid file(PHengLEI type, *.fts). string original_grid_file = "./grid/sphere_mixed.fts"; string partition_grid_file = "./grid/sphere_mixed__4.fts"; @@ -232,11 +235,10 @@ string partition_grid_file = "./grid/sphere_mixed__4.fts"; // 1 -- perfect balance. // maxproc -- perfect imbalance. // 1.05 -- recommended. - int omit_no_bound_bc = 0; int npartmethod = 1; int parallelPartitionMethod = 2; -double parmetisBalance = 1.05; +double parmetisBalance = 1.05; // numberOfMultigrid: Number of multi-grid levels, ONLY used for structured grid. // 1 -- single level. @@ -248,29 +250,35 @@ int numberOfMultigrid = 1; # Default parameters for CFD simulation # ######################################################################### // maxSimuStep: The max simulation step, don't care simulation is restart or not. -// intervalStepFlow: The step intervals for flow variables file 'flow.dat' saved. -// intervalStepPlot: The step intervals for tecplot visual file 'tecflow.dat' saved. +// intervalStepFlow: The step intervals for flow variables file 'flow.dat' saved. +// intervalStepPlot: The step intervals for tecplot visual file 'tecflow.dat' saved. // intervalStepSample: The step intervals for monitored probes variables file 'sample.dat' saved. -// intervalStepForce: The step intervals for aerodynamics coefficients file 'aircoef.dat' saved. -// intervalStepRes: The step intervals for residual file 'res.dat' saved. -// ifLowSpeedPrecon: Precondition process to accelerate convergence for low speed flow. -// 0 -- no precondition process. (default, mach > 0.3) -// 1 -- carry out precondition process. (mach number <= 0.3) - -int maxSimuStep = 20000; - -int intervalStepFlow = 1000; -int intervalStepPlot = 1000; +// intervalStepForce: The step intervals for aerodynamics coefficients file 'aircoef.dat' saved. +// intervalStepRes: The step intervals for residual file 'res.dat' saved. +int maxSimuStep = 20000; +int intervalStepFlow = 1000; +int intervalStepPlot = 1000; int intervalStepSample = 1000; -int intervalStepForce = 100; -int intervalStepRes = 10; -int ifLowSpeedPrecon = 0; +int intervalStepForce = 100; +int intervalStepRes = 10; // compressible: // 0 -- incompressible flow. // 1 -- compressible flow. (default) int compressible = 1; +// ifLowSpeedPrecon: Precondition process to accelerate convergence for low speed flow. +// 0 -- no precondition process. (default, mach > 0.3) +// 1 -- carry out precondition process. (mach number <= 0.3) +// Kprec: The coefficient K for the cut-off velocity. +// 1.0~3.0 is suggested. (default, 3.0) +// preconFarfieldBCMethod: The precondition method for farfield boundary condition. +// 0 -- precondition far-field boundary based on riemann invariants. +// 1 -- Turkel's simplified far-field boundary condition. +int ifLowSpeedPrecon = 0; +double Kprec = 3.0; +int preconFarfieldBCMethod = 1; + //----------------------------------------------------------------------- # CFD Control Parameter # //----------------------------------------------------------------------- @@ -281,33 +289,36 @@ int compressible = 1; // 0 -- the nondimensional conditions. // 1 -- the flight conditions. // 2 -- the experiment conditions. -// 3 -- the subsonic boundary conditions. +// 3 -- the subsonic boundary conditions. (Useless!) // 4 -- the condition that the velocity, temperature and density are given. // 5 -- the condition that the velocity, temperature and pressure are given. +//flowInitMethod: Flow field initialization method. +// 0 -- The entire flow field is initialized according to Infinite velocity. +// 1 -- The velocity near the wall is initialized according to the boundary layer of the plate. // refReNumber: Reynolds number, which is based unit length, unit of 1/m. // refDimensionalTemperature: Dimensional reference temperature, or the total temperature only for the experiment condition. // freestream_vibration_temperature: Dimensional freestream vibration temperature. // refDimensionalPressure: Dimensional reference pressure, or the total pressure only for the experiment condition. // height: Fly height, unit of km. // wallTemperature: Temprature of the solid wall, minus value is for adiabatic boundary condition. -// gridScaleFactor: The customizable unit of the grid, default value is 1.0 for meter.Common dimensions like: -// 1 dm = 0.1 m. -// 1 cm = 0.01 m. -// 1 mm = 0.001m. -// 1 inch = 0.0254m. -// 1 foot = 12 inches = 0.3048m. -// 1 yard = 3 feet = 0.9144m. +// gridScaleFactor: The customizable unit of the grid, default value is 1.0 for meter. Common dimensions like: +// 1 dm = 0.1 m. +// 1 cm = 0.01 m. +// 1 mm = 0.001 m. +// 1 inch = 0.0254 m. +// 1 foot = 12 inches = 0.3048 m. +// 1 yard = 3 feet = 0.9144 m. // forceReferenceLength, forceReferenceLengthSpanWise, forceReferenceArea: Reference length, SpanWise length and area, independent of grid unit. // TorqueRefX, TorqueRefY, TorqueRefZ: Reference point, independent of grid unit. // radiationCoef: The radiation coefficient on wall, it is used to compute the radiation heat flux on wall when the boundary // condition is radiation equilibrium temperature, and 0.8 is the default value. -// refMolecularWeight : the reference molecular weight of gas used for perfect gas. The unit is g/mol. +// refMolecularWeight: the reference molecular weight of gas used for perfect gas. The unit is g/mol. // Generally, the gas is air. Sometimes, it is experiment gas, such as Nitrogen, Argon, and so on. - -int directionMethod = 0; +int directionMethod = 0; double refMachNumber = 0.73; double attackd = 2.79; double angleSlide = 0.00; +int flowInitMethod = 0; int inflowParaType = 0; double refReNumber = 6.5e6; @@ -321,29 +332,27 @@ double freestream_vibration_temperature = 300.00; //double refDimensionalTemperature = 6051.024; // The total temperature, T*(1+(refGama-1)*M*M/2). //double refDimensionalPressure = 4.299696E09; // The total pressure, p*(T0/T)^(refGama/(refGama-1)). -//int inflowParaType = 3; -//int nsubsonicInlet = 1; -//int nsubsonicOutlet = 1; -//string inLetFileName = "./bin/subsonicInlet.hypara"; -//string outLetFileName = "./bin/subsonicOutlet.hypara"; -//double refDimensionalTemperature = 288.144; -//double refDimensionalPressure = 1.01313E05; - -//The velocity, temperature and density are fixed. +// The velocity, temperature and density are fixed. //int inflowParaType = 4; //double refDimensionalVelocity = 1000.0; -//double refDimensionalDensity = 1.0e3; +//double refDimensionalDensity = 1.0e3; -//The velocity, temperature and pressure are fixed. +// The velocity, temperature and pressure are fixed. //int inflowParaType = 5; //double refDimensionalVelocity = 1000.0; //double refDimensionalPressure = 1.0e5; -//The MachNumber, temperature and pressure are fixed. +// The MachNumber, temperature and pressure are fixed. //int inflowParaType = 6; -//double refDimensionalTemperature = 293; +//double refDimensionalTemperature = 293.0; //double refDimensionalPressure = 8886.06; +// The velocity, temperature and pressure are read from file. +//int inflowParaType = 7; +//string weatherDataFilePath = "./WRFData/"; +//double longitude = 110.95 +//double latitude = 19.61; + double wallTemperature = -1.0; double radiationCoef = 0.8; @@ -357,41 +366,41 @@ double forceReferenceArea = 1.0; // unit of meter^2. double TorqueRefX = 0.0; // unit of meter. double TorqueRefY = 0.0; // unit of meter. double TorqueRefZ = 0.0; // unit of meter. +double knudsenLength = 1.0; // unit of meter. double refMolecularWeight = 28.9644; // unit of g/mol. //----------------------------------------------------------------------- # Spatial Discretisation # //----------------------------------------------------------------------- -#******************************************************************* -# Struct Solver * -#******************************************************************* +#************************************************************************ +# Struct Solver * +#************************************************************************ // inviscidSchemeName: Spatial discretisation scheme of struct grid. // Using this when solve structered grid or hybrid. -// -- "vanleer", "steger", "hlle", "lax_f". -// -- "roe", "modified_roe". +// -- "vanleer", "steger", "hlle", "lax_f", +// -- "roe", "modified_roe", // -- "ausm+", "ausm+w", "ausm+up", "ausmdv", "ausmpw", "ausmpw+". // isWennScheme: If using WENN Scheme of struct grid. -// 0 -- NO. (default) -// 1 -- Yes. +// 0 -- NO. (default) +// 1 -- Yes. // str_limiter_name: Limiter of struct grid. -// -- "vanalbada", "vanleer", "minmod", "smooth", "minvan", "3rdsmooth", "3rd_minmod_smooth". -// -- "nolim", no limiter. -// -- "vanalbada_clz", clz supersonic version. -// -- "weno3_js", "wenn3_prm211", "wenn3_zm", "wenn3_zes2", "wenn3_zes3" - +// -- "vanalbada", "vanleer", "minmod", "smooth", "minvan", "3rdsmooth", "3rd_minmod_smooth", +// -- "nolim", no limiter, +// -- "vanalbada_clz", clz supersonic version, +// -- "weno3_js", "wenn3_prm211", "wenn3_zm", "wenn3_zes2", "wenn3_zes3". string inviscidSchemeName = "roe"; int isWennScheme = 0; -string str_limiter_name = "vanalbada"; +string str_limiter_name = "vanalbada"; -#******************************************************************* -# UnStruct Solver or Common * -#******************************************************************* +#************************************************************************ +# UnStruct Solver or Common * +#************************************************************************ // viscousType: Viscous model. -// 0 -- Euler. -// 1 -- Lamilar. -// 2 -- Algebraic. -// 3 -- 1eq turbulent. -// 4 -- 2eq turbulent. +// 0 -- Euler. +// 1 -- Lamilar. +// 2 -- Algebraic. +// 3 -- 1eq turbulent. +// 4 -- 2eq turbulent. // viscousName: Laminar or tubulent model. // -- "0eq-bl". // -- "1eq-sa". @@ -410,16 +419,16 @@ string str_limiter_name = "vanalbada"; // 3 -- IDDES. // uns_scheme_name: Spatial discretisation scheme of Unstruct grid. // Using this when solve Unstructered grid or hybrid. -// -- "vanleer", "roe", "steger", "kfvs", "lax_f", "hlle". +// -- "vanleer", "roe", "GMRESRoe", "GMRESSteger", "steger", "kfvs", "lax_f", "hlle", // -- "ausm+", "ausmdv", "ausm+w", "ausmpw", "ausmpw+". // uns_limiter_name: Limiter of Unstruct grid. -// -- "barth", "vencat", "vanleer", "minmod". -// -- "vanalbada", "smooth", "nnd", "lpz", "1st". +// -- "barth", "vencat", "vanleer", "minmod", +// -- "vanalbada", "smooth", "nnd", "lpz", "1st", // -- "nolim", no limiter. // uns_vis_name: Discretisation method of viscous term. // -- "std", "test", "aver", "new1", "new2". // gradientName: Gradient reconstruction method. -// -- "default", "ggcell", "ggnode", "lsq". +// -- "default", "ggcell", "ggnode", "lsq". // ivencat: Variation of vencat limiter. // 0 -- org method, it is independent of grid scale. // 1 -- new method, it is dependent of grid scale. @@ -442,18 +451,18 @@ string str_limiter_name = "vanalbada"; // 3 -- Harten type, which is default used. // roeEntropyScale: Entropy fix (correction) coefficient scale, default is 1.0. // It is used to scale the default Roe entropy fix coefficients. -// AusmpwPlusLimiter: A Limiter to make "function w" not change acutely in AusmpwPlus scheme, default is 1.0 +// AusmpwPlusLimiter: A Limiter to make "function w" not change acutely in AusmpwPlus scheme, default is 1.0. -//int viscousType = 0; +//int viscousType = 0; //string viscousName = "Euler"; -//int viscousType = 1; +//int viscousType = 1; //string viscousName = "laminar"; -int viscousType = 3; +int viscousType = 3; string viscousName = "1eq-sa"; -//int viscousType = 4; +//int viscousType = 4; //string viscousName = "2eq-kw-menter-sst"; int DESType = 0; @@ -463,7 +472,7 @@ string uns_limiter_name = "vencat"; string uns_vis_name = "test"; string gradientName = "ggnode"; -int ivencat = 7; +int ivencat = 7; double venkatCoeff = 5.0; int reconmeth = 1; int limitVariables = 0; @@ -475,9 +484,9 @@ double roeEntropyScale = 1.0; double AusmpwPlusLimiter = 1.0; -//----------------------------------------------------------------------- -# Temporal Discretisation # -//----------------------------------------------------------------------- +#************************************************************************ +# Temporal Discretisation * +#************************************************************************ // iunsteady: Steady or unsteady. // 0 -- steady. // 1 -- unsteay. @@ -490,51 +499,57 @@ double AusmpwPlusLimiter = 1.0; // statisticalTimePeriod: Used as time period of statistic analysis. // when the value is negative, time period is treated as infinite. // statisticMethod: Statistic reynolds stress method. -// 0 -- tau = - ^2 -// 1 -- tau = +// 0 -- tau = - ^2 +// 1 -- tau = // min_sub_iter: The min sub iteration of unsteady simulation. // max_sub_iter: The max sub iteration of unsteady simulation. // tol_sub_iter: The tolerance of sub iteration of unsteady simulation. // tscheme: Temporal Discretisation method. -// 1 -- Runge-Kutta Multi-State. -// 2 -- Point implicit. -// 3 -- Full implicit. -// 4 -- LU-SGS. -// 5 -- Block LU-SGS. -// 6 -- Jacobian iteration. -// 7 -- Line LU-SGS. -// 8 -- Matrix LU-SGS. +// 1 -- Runge-Kutta Multi-State. +// 2 -- Point implicit. +// 3 -- Full implicit. +// 4 -- LU-SGS. +// 5 -- Block LU-SGS. +// 6 -- Jacobian iteration. +// 7 -- Line LU-SGS. +// 8 -- Matrix LU-SGS. +// 9 -- GMRES. // iSimplifyViscousTerm: Simplify the computation of viscous term in the Block LU-SGS method. The default value assigns 1 that could speed up the computation. // Otherwise, the viscous Jacobian matrix Mv should be computed that will increase the memory and time in iteration of the BLUSGS method. // CFLStart: Started cfl number. // CFLEnd: End cfl number. // CFLVaryStep: The number of step when cfl increase from CFLStart to CFLEnd. +// GMRESCFLScale : CFL = CFLStart * GMRESCFLScal^iteration. +// OriginalTscheme : Used for LUSGS and GMres hybrid computing. +// useLUSGSprecond: Initialize flow field for GMRES. +// 0 --Initialize by first order Jacobian matrix. +// 1 --Initialize by LUSGS. +// GMRESInitStep : the number of iteration step of irst order Jacobian matrix or LUSGS for initialize flow field. // ktmax: Dtratio. dt[i] = MIN(dt[i], ktmax * dtmin / vol[i]) // swapDq: Communication dq between forward/backward sweep of LUSGS or not, default is 0. // nLUSGSSweeps: Sub iteration of LU-SGS or Block LU-SGS. // LUSGSTolerance: Sub iter tolerance of LU-SGS or Block LU-SGS. // ifLocalTimeStep: Time step method. -// 0 --Local. -// 1 --Global. +// 0 --Local. +// 1 --Global. // isUseLocalCFL: use variable number of CFL or not. -// 0 -- global unified CFL number. -// 1 -- local CFL number. +// 0 -- global unified CFL number. +// 1 -- local CFL number. // isUsePreTwall: use the previous temperatures on wall. 1 indicates yes, and 0 indicates no. // visl_min: Minimum value of laminar viscosity coefficient. // turbCFLScale: Turbulence model cfl number factor. // codeOfAleModel: Arbitrary Lagrangian-Eulerian method. -// 0 -- no ALE method. -// 1 -- ALE method for non-moving grids. -// 2 -- ALE method for moving grids. -// 3 -- ALE method for deforming grids. +// 0 -- no ALE method. +// 1 -- ALE method for non-moving grids. +// 2 -- ALE method for moving grids. +// 3 -- ALE method for deforming grids. // wallFunctionType: The type of wall function to implement. -// 0 -- no wall function. (default) -// 1 -- standard wall function. -// 2 -- Pab3D wall function. +// 0 -- no wall function. (default) +// 1 -- standard wall function. +// 2 -- Pab3D wall function. // RKStage: The number of Runge-Kutta step. // lamda: Cofficient of Runge-Kutta step. - -int iunsteady = 0; +int iunsteady = 0; double physicalTimeStep = 0.01; double physicalTimeStepDimensional = -0.001; int ifStartFromSteadyResults = 0; @@ -543,39 +558,42 @@ int ifStaticsReynoldsStress = 0; int startStatisticStep = 800000; double statisticalTimePeriod = -1.0; int statisticMethod = 0; -int linearTwoStepMethods = 1; // 1--BDF1; 2--C-N; 3--BDF2; +int linearTwoStepMethods = 1; // 1--BDF1; 2--C-N; 3--BDF2. int methodOfDualTime = 3; int min_sub_iter = 50; int max_sub_iter = 50; double tol_sub_iter = 0.01; -int tscheme = 4; +int tscheme = 4; int iSimplifyViscousTerm = 1; int ifLocalTimeStep = 0; int isUseLocalCFL = 0; int isUsePreTwall = 0; -double CFLStart = 0.01; -double CFLEnd = 10.0; -int CFLVaryStep = 500; - +double CFLStart = 0.01; +double CFLEnd = 10.0; +int CFLVaryStep = 500; +double GMRESCFLScale = 1.0; +int OriginalTscheme = 9; +int useLUSGSprecond = 1; +int GMRESInitStep = 1000; double pMaxForCFL = 0.2; double pMinForCFL = 0.1; double deltaMaxForCFL = 0.2; double magnifyFactorForCFL = 1.1; double reduceFactorForCFL = 0.5; -double ktmax = 1.0e10; +double ktmax = 1.0e10; -int swapDq = 1; +int swapDq = 1; int nLUSGSSweeps = 1; double LUSGSTolerance = 0.01; -int order = 2; +int order = 2; double visl_min = 0.01; double turbCFLScale = 1.0; -double csrv = 2.0; +double csrv = 1.0; double timemax = 1.0e10; double dtsave = -1.0; int maxale = 10; @@ -591,10 +609,9 @@ double lamda[] = [0.5, 1.0]; //int RKStage = 4; //double lamda[] = [0.25, 0.33333333333, 0.5, 1.0]; - -//----------------------------------------------------------------------- -# File In or Out # -//----------------------------------------------------------------------- +#************************************************************************ +# File In or Out * +#************************************************************************ // numberOfGridGroups: The number of grid groups. // gridfile: The partitioned Grid file path, using relative path, // which is relative to the working directory. @@ -611,20 +628,18 @@ double lamda[] = [0.5, 1.0]; // aircoeffile: The file path to save the aerodynamic force coefficients convergence process, write data for every default (intervalStepForce) steps. // restartNSFile: The file path to write restart flowfield variables, write data for every default (intervalStepFlow) steps. // turbfile: The file path to write restart flowfield variables of turbulence , write data for every default(intervalStepFlow) steps. -// visualfile: The visualization file path of flowfield , write data for every default (intervalStepPlot) steps. +// visualfile: The visualization file path of flowfield, write data for every default (intervalStepPlot) steps. // wall_aircoefile: The file path to save flowfield variables of wall, write data for every default steps. // nDumpSurfaceInfo = 0 the "wall_varfile" write the informations including heat flux. // nDumpSurfaceInfo = 1 the "wall_varfile" write the informations without heat flux. // nIsComputeWallDist: Whether to compute the wall distance. // 0 -- Compute wall distance. // 1 -- Not compute. -// -// protectionFile0 and protectionFile1 : Two continuation file of the data protection mechanism. -// wall_heatfluxfile : The file to output the MaxHeatFlux of wall. - -int numberOfGridGroups = 1; -string gridfile = "./grid/rae2822_hybrid2d__4.fts"; -string wallTemperaturefile= ""; +// protectionFile0 and protectionFile1: Two continuation file of the data protection mechanism. +// wall_heatfluxfile: The file to output the MaxHeatFlux of wall. +int numberOfGridGroups = 1; +string gridfile = "./grid/rae2822_hybrid2d__4.fts"; +string wallTemperaturefile = ""; int nIsComputeWallDist = 0; int walldistMethod = 1; @@ -632,10 +647,12 @@ int cellMethodOrNodeMethod = 0; string resSaveFile = "results/res.dat"; string turbresfile = "results/turbres.dat"; +string transitionResFile = "results/transitionRes.dat"; string aircoeffile = "results/aircoef.dat"; string restartNSFile = "results/flow.dat"; string turbfile = "results/turb.dat"; +string transitionFile = "results/transition.dat"; string visualfile = "results/tecflow.plt"; string wall_aircoefile = "results/wall_aircoef.dat"; @@ -645,10 +662,14 @@ string protectionFile0 = "results/flow0.dat"; string protectionFile1 = "results/flow1.dat"; string wall_heatfluxfile = "results/wall_heatflux.dat"; -int nDumpSurfaceInfo = 0; -string wall_varfile = ""; +string protectionTurbFile0 = "results/turb0.dat"; +string protectionTurbFile1 = "results/turb1.dat"; -string jetDefineFile = "bin/jet.hypara"; +string protectionTransitionFile0 = "results/transition0.dat"; +string protectionTransitionFile1 = "results/transition1.dat"; + +int nDumpSurfaceInfo = 0; +string wall_varfile = ""; string sixDofFileName = "results/sixDofInfo.dat"; string derivativeFileName = "results/identify.dat"; @@ -659,7 +680,8 @@ int plotFieldType = 0; // visualfileType: The file type of visualfile. // 0 -- Tecplot binary. // 1 -- Tecplot ASCII. - +// 2 -- Ensight binary. +// 3 -- Ensight ASCII. int visualfileType = 1; // samplefileMode: The dump mode of sample file. @@ -697,21 +719,21 @@ double upperPlotFieldBox[] = [1.0 1.0 1.0]; // -- vibration temperature(Tv, 33), electron temperature(Te, 34), vibrational energy(Ev, 35), electric energy(Ee, 36), // -- number density of electron(Ne, 37), dimensioanl density(rho, 38), dimensioanl pressure(p, 39), dimensioanl temperature(T, 40), // -- gradientUx(41), gradientUy(42), gradientVx(43), gradientVy(44), streamline_u(45), streamline_v(46), streamline_w(47), -// -- transition intermittency(intermittency, 51), -transition momentum thickness reynolds(MomentumThicknessReynolds, 52), -// -- overlap iblank(iblank, 81) - -// -- specific heat ratio(gama, 56) +// -- transition intermittency(intermittency, 51), transition momentum thickness reynolds(MomentumThicknessReynolds, 52), +// -- local CFL Number(localCFL, 57), minimal CFL Number(minCFL, 58), +// -- overlap iblank(iblank, 81), +// -- specific heat ratio(gama, 56), Knudsen number(kn, 60), Damkohler number(Da, 61), vibrational nonequilibrium number(Vi, 62). // Important Warning: Array size of visualVariables MUST be equal to nVisualVariables!!! // Variables order must from small to big. //-----------the optional parameters list for the wall boundary condition---------------- // nVisualWallVariables: The number of visual variables on wall. // visualWallVariables : dumped variable types, listed as following: -// -coefficient of pressure(cp, 0), -coefficient of friction(cf, 1), yplus(2), -non-dimensional heat flux(Q_NonDim, 3), -dimensional heat flux(Q_Dim, 4), -// -pressure on wall(pw, 5), -temperature on wall(Tw, 6), -density on wall(rhow, 7), -heat flux of translational-rotational temperature term(Qtr, 8), -// -heat flux of species diffusion term(Qs, 9), -heat flux of vibrational temperature term(Qv, 10), -heat flux of electron temperature term(Qe, 11), -// -species mass fractions(Ns, 12), -x component of wall velocity(Vx, 13), -y component of wall velocity(Vy, 14), -z component of wall velocity(Vz, 15) -// -slip translational-rotational temperature(Tts, 16), -slip vibrational temperature(Tvs, 17), -slip electron temperature(Tes, 18), -absolute wall velocity(Vs, 19) -// -Stanton number(St, 20), -coefficient of heat rate(Ch, 21), -temperature jump(deltaT, 22), -Grid Reynolds number on wall(Re_w, 23) +// -- coefficient of pressure(cp, 0), coefficient of friction(cf, 1), yplus(2), non-dimensional heat flux(Q_NonDim, 3), dimensional heat flux(Q_Dim, 4), +// -- pressure on wall(pw, 5), temperature on wall(Tw, 6), density on wall(rhow, 7), heat flux of translational-rotational temperature term(Qtr, 8), +// -- heat flux of species diffusion term(Qs, 9), heat flux of vibrational temperature term(Qv, 10), heat flux of electron temperature term(Qe, 11), +// -- species mass fractions(Ns, 12), x component of wall velocity(Vx, 13), y component of wall velocity(Vy, 14), z component of wall velocity(Vz, 15), +// -- slip translational-rotational temperature(Tts, 16), slip vibrational temperature(Tvs, 17), slip electron temperature(Tes, 18), absolute wall velocity(Vs, 19), +// -- Stanton number(St, 20), coefficient of heat rate(Ch, 21), temperature jump(deltaT, 22), Grid Reynolds number on wall(Re_w, 23), Knudsen number(Kn_wall, 24). int nVisualVariables = 8; int visualVariables[] = [0, 1, 2, 3, 4, 5, 6, 15]; @@ -739,16 +761,18 @@ int dumpStandardModel = 0; // 1 -- Real cell where the probe is located. // nProbeVariables: Number of variables want to be dumped for probes monitered. // probeVariables : Variable types dumped, listed as following: -// -- density(0), u(1), v(2), w(3), pressure(4), temperature(5), mach(6). +// -- density(0), u(1), v(2), w(3), pressure(4), temperature(5), mach(6), +// -- dimensioanl_density(7), dimensioanl_u(8), dimensioanl_v(9), +// -- dimensioanl_w(10), dimensioanl_pressure(11), dimensioanl_temperature(12). // Important Warning: Array size of probeVariables MUST be equal to nProbeVariables!!! // probeVariables order must from small to big. // probeVariablesInterpolationMethod: Interpolation method used to compute the probe variables. -// 0 -- Take the value of probe's cell as probe real value. -// 1 -- Interpolation from probe's and neighbouring cell to probe. -// 2 -- Interpolation from probe's cell nodes to probe. +// 0 -- Take the value of probe's cell as probe real value. +// 1 -- Interpolation from probe's and neighbouring cell to probe. +// 2 -- Interpolation from probe's cell nodes to probe. int ifSetDataMonitor = 0; -int dataMonitorType = 0; +int dataMonitorType = 0; string probesDefineFile = "bin/probes_XYZ.dat"; //int dataMonitorType = 1; @@ -761,28 +785,26 @@ string probesDefineFile = "bin/probes_XYZ.dat"; int searchCellsMethod = 0; -int nProbeVariables = 7; -int probeVariables[] = [0, 1, 2, 3, 4, 5, 6]; -int probeVariablesInterpolationMethod = 0; -//----------------------------------------------------------------------- -# Turbulence Parameter # -//----------------------------------------------------------------------- +int nProbeVariables = 14; +int probeVariables[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]; +int probeVariablesInterpolationMethod = 0; + +#************************************************************************ +# Turbulence Parameter * +#************************************************************************ // turbInterval: Iteration number of turbulence. // kindOfTurbSource: Kinds of turbulent source. // 0 -- Original. // mod_turb_res: If modify the residuals for the cells next to the wall or not, default is 0. -// transitionType: transition model type +// transitionType: transition model type // 0 -- none. // 2 -- gama-re-theta. -// turbIntensity: (valid while greater than 0.0 ) turbulent intensity of free stream(*100) in transition -// freeturbIntensitySRModify: to use SR modify in free stream turbulent intensity decay or not - - +// turbIntensity: (valid while greater than 0.0 ) turbulent intensity of free stream(*100) in transition. +// freeturbIntensitySRModify: to use SR modify in free stream turbulent intensity decay or not. int turbInterval = 1; int turbOrderStruct = 2; int kindOfTurbSource = 0; int mod_turb_res = 0; -double turb_relax = 1.0; double freeStreamViscosity = 1.0e-3; double muoo = 3.0; double kwoo = 5.0; @@ -790,29 +812,28 @@ int transitionType = 0; double turbIntensity = -1.0; int freeturbIntensitySRModify = 0; double freeDecayXLocation = 0.0; -int compressibleCorrection = 0; -int prandtlNumberCorrection = 0; +int compressibleCorrection = 0; int transitionMaFix = 1; -# maximum eddy viscosity (myt/my) max. +// maximum eddy viscosity (myt/my) max. double eddyViscosityLimit = 1.0e10; int monitor_vistmax = 0; -//----------------------------------------------------------------------- -# LES Parameter # -//----------------------------------------------------------------------- +#************************************************************************ +# LES Parameter * +#************************************************************************ // iLES: Create LESSolver or not. -// = 1 - Create LESSolver; -// != 1 - not. +// = 1 -- Create LESSolver; +// != 1 -- not. // amplitudeofDisturb: Amplitude of adding disturb. // disturbstep: Unsteady time step or steady iteration of adding random disturb. // iterdisturb: Add random disturb in every sub-iter or only first sub-iter. -// = 0 - in only first sub-iter; -// != 0 - in every sub-iter. +// = 0 -- in only first sub-iter; +// != 0 -- in every sub-iter. // ipraddisturb: Add density and pressure disturb or not. // ibodyforce: Add body force in source flux of NS equations or not. -// = 0 - not; -// != 0 - Add body force. +// = 0 -- not; +// != 0 -- Add body force. // bodyforce: Body force in source flux of NS equations or not. // utau: friction velocity, using in DNSDisturb. // sgsmodel: subgrid scale model. @@ -820,23 +841,22 @@ int monitor_vistmax = 0; // = "dsmCom"; // = "wale"; // = "sigma". -// deltaFunctionType: = 1 - MAX(deltai, deltaj, deltak); -// = 2 - pow(deltai * deltaj *deltak, 1/3); -// = 3 - Devloped by Scotti. -// wallDampingFunctionType: = 0 - no wall function; -// = 1 - van Driest; -// = 2 - developed by Dr. Deng Xiaobing; -// = 3 - developed by Piomelli. +// deltaFunctionType: = 1 -- MAX(deltai, deltaj, deltak); +// = 2 -- pow(deltai * deltaj *deltak, 1/3); +// = 3 -- Devloped by Scotti. +// wallDampingFunctionType: = 0 -- no wall function; +// = 1 -- van Driest; +// = 2 -- developed by Dr. Deng Xiaobing; +// = 3 -- developed by Piomelli. // turbViscousCutType: turbulent viscosity cut type. -// = 0 - mu_total = mut + mul; -// = 1 - mu_total = max(mut-mul,0)+ mul; -// = 2 - mu_total = max(mut ,0)+ mul. +// = 0 -- mu_total = mut + mul; +// = 1 -- mu_total = max(mut-mul, 0) + mul; +// = 2 -- mu_total = max(mut , 0) + mul. // smagConstant: constant of smagorinsky model. // waleConstant: constant of wale model. -// filterDirection[3]: filter variables in i, j, k direction or not. +// filterDirection [3]: filter variables in i, j, k direction or not. // averageDirection[3]: average variables in i, j, k direction or not. // isotropicConstant: constant of isotropic part of SGS stress. - int iLES = 0; string sgsmodel = "smagorinsky"; int deltaFunctionType = 2; @@ -852,19 +872,16 @@ double testFilterScale = 2.0; int averageWidth = 1; int monitorNegativeConstant = 0; -//----------------------------------------------------------------------- -# Other Parameters for Hypersonic Non-equilibrium Gas # -//----------------------------------------------------------------------- +#************************************************************************ +# Other Parameters for Hypersonic Non-equilibrium Gas * +#************************************************************************ // dg_high_order: // 0 -- generic order accuracy. // 1 -- high order accuracy. // iapplication: // 0 -- gas model is fixed in the codes. // 1 -- gas model is imported from library files. -// isAdaptiveSolver: isAdaptiveSolver=0 indicates the generic Navier-Stokes solver, -// isAdaptiveSolver>0 indicates the HyFlow self-adaptive solver. -// 1 -- using HyFlow self-adaptive solver where the switch is controlled by the total iteration steps. -// 2 -- using HyFlow self-adaptive solver where the switch is controlled by variation of the key residual. +// isAdaptiveSolver: isAdaptiveSolver = 0 indicates the generic Navier-Stokes solver, // nm: Equation number of the physics, but is out of commision now. // 4 -- for 2D. // 5 -- for 3D. @@ -875,7 +892,7 @@ int monitorNegativeConstant = 0; // 2 -- Argon. // 3 -- Nitrogen. // nEnergyRecycle: The type of EnergyModel Recycle. -// 0 -- not used . +// 0 -- not used. // 1 -- used. // nDensityModify: The type of densitymodify. // 0 -- not used. @@ -883,26 +900,25 @@ int monitorNegativeConstant = 0; // nchem: // 0 -- without chemical reaction flow. // 1 -- the chemical reaction flow is considered. -// nEquilibriumGas: the variable is valid when the condition of nchem=0 is satisfied. +// nEquilibriumGas: the variable is valid when the condition of nchem = 0 is satisfied. // 0 -- perfect gas. // 5, 7, 11 -- equilibrium gas, meanwhile, its value denotes the number of gas component. -// nPCWCycleStep: the maximum step number of iteration in the module of computing species mass fractions with the partial catalytic wall(PCW) condition. -// the value equals to or is greater than 1, and 3 is for default value. -// nRETCycleStep: the maximum step number of iteration in the module of computing radiation equilibrium temperature on wall. -// the value equals to or is greater than 1, and 3 is for default value. -// nSLIPCycleStep:the maximum step number of iteration in the module of computing slip temperature, slip velocity and slip species mass fraction. -// the value equals to or is greater than 1, and 3 is for default value. -// nSlipBCModel : The computational model of slip boundary conditions. - -// 0 -- no slip. -// 1 -- the conventional Maxwell slip conditions. -// 2 -- the Gokcen slip conditions. -// 3 -- the Knudsen-layer correction of the standard slip conditions proposed by Lockerby, et al. -// 4 -- the Kogan simplified slip conditions. -// nMeanFreePathType : the method to the mean free-path for the slip conditions. For the mixture, 0 is suggested. -// 0 -- the equivalent mean free-path is calculated by the simple hard sphere model(HS). -// 1 -- calculated by the definition that includes the variables of the number density and the molecule diameter. -// 2 -- the equivalent mean free-path is calculated by the variable hard sphere model(VHS). +// nPCWCycleStep: The maximum step number of iteration in the module of computing species mass fractions with the partial catalytic wall(PCW) condition. +// The value equals to or is greater than 1, and 3 is for default value. +// nRETCycleStep: The maximum step number of iteration in the module of computing radiation equilibrium temperature on wall. +// The value equals to or is greater than 1, and 3 is for default value. +// nSLIPCycleStep:The maximum step number of iteration in the module of computing slip temperature, slip velocity and slip species mass fraction. +// The value equals to or is greater than 1, and 3 is for default value. +// nSlipBCModel: The computational model of slip boundary conditions. +// 0 -- no slip. +// 1 -- the conventional Maxwell slip conditions. +// 2 -- the Gokcen slip conditions. +// 3 -- the Knudsen-layer correction of the standard slip conditions proposed by Lockerby, et al. +// 4 -- the Kogan simplified slip conditions. +// nMeanFreePathType: the method to the mean free-path for the slip conditions. For the mixture, 0 is suggested. +// 0 -- the equivalent mean free-path is calculated by the simple hard sphere model(HS). +// 1 -- calculated by the definition that includes the variables of the number density and the molecule diameter. +// 2 -- the equivalent mean free-path is calculated by the variable hard sphere model(VHS). // nchemsrc: // 0 -- the source terms are not computed. // 1 -- the source terms are computed. @@ -913,148 +929,151 @@ int monitorNegativeConstant = 0; // 1 -- One-temperature model. // 2 -- Two-temperature model. // 3 -- Three-temperature model. +// isUseNoneqCond: +// 0 -- compute the source terms without any conditions. +// 1 -- compute the source terms using the non-equilibrium condition. +// frozenCondition: the threshold value of frozen chemical flow condition, 0.1 is the default value. // nIdealState: whether take all gas species as ideal gas for gas-mixture process. // 0 -- No. -// 1 -- Yes. -// nTEnergyModel: the method to computing temperature energy model. +// 1 -- Yes. // nTEnergyModel: the method to computing temperature energy model. // 0 -- the energy term is computed using the conventional method. // 1 -- the energy term is computed using the polynomial fitting method. // 2 -- the energy term is computed using the piecewise polynomial fitting method. // parkVDPower: the power of translational-rotational temperature in the Park V-D(vibration-dissociation) coupling model. // The value is in range of [0.0, 1.0], DPLR suggests 0.5, LAURA suggests 0.7, while 0.6 is given as default value. // catalyticCoef: -// 0.0 -- full non-catalytic wall boundary condition. -// 1.0 -- full catalytic wall boundary condition. -// in range of (0.0, 1.0) -- partial catalytic condition, the value indicates the catalytic coefficient. -// nIsSuperCatalytic : the super catalytic condition for the fully catalytic wall, and assigned with the value of 1. -// 0 -- equilibrium condition for the fully catalytic wall where the mass fractions are assigned with the values of the free stream. -// 1 -- super catalytic condition for the fully catalytic wall where all the atomic components combine into molecular components. -// nTemperatureJump : the method to calculate the temperature jump. -// 0 -- calculated by the variables of heat conductivity and constant volume specific heat for each energy mode. -// 1 -- the general method where the iteration is calculated with the translation-rotation temperature. -// nSurfGradMethod : the method to compute the surface heating ratio. -// 0 -- the gradient of variable is computed with the first-order difference method. -// 1 -- the gradient of variable is computed with the Green-Guass integral method. -// nRapidFlowfield : initialize the flowfield using the rapid engineering method when it is greater than zero. -// nSurfHeatMonitor : To exam the surface heating change or not. 0 is no, 1 is yes. -// nInitPressureStep : the steps to initialize the boundary variables when the rapid method is used. 100 is the default value. -// nDumpCFLNumber : 1 indicates dumping the CFL number to file, 0 denotes no dumping. +// 0.0 -- full non-catalytic wall boundary condition. +// 1.0 -- full catalytic wall boundary condition. +// in range of (0.0, 1.0) -- partial catalytic condition, the value indicates the catalytic coefficient. +// nIsSuperCatalytic: the super catalytic condition for the fully catalytic wall, and assigned with the value of 1. +// 0 -- equilibrium condition for the fully catalytic wall where the mass fractions are assigned with the values of the free stream. +// 1 -- super catalytic condition for the fully catalytic wall where all the atomic components combine into molecular components. +// nTemperatureJump: the method to calculate the temperature jump. +// 0 -- calculated by the variables of heat conductivity and constant volume specific heat for each energy mode. +// 1 -- the general method where the iteration is calculated with the translation-rotation temperature. +// nSurfGradMethod: the method to compute the surface heating ratio. +// 0 -- the gradient of variable is computed with the first-order difference method. +// 1 -- the gradient of variable is computed with the Green-Guass integral method. +// nRapidFlowfield: initialize the flowfield using the rapid engineering method when it is greater than zero. +// nSurfHeatMonitor: To exam the surface heating change or not. 0 is no, 1 is yes. +// nInitPressureStep: the steps to initialize the boundary variables when the rapid method is used. 100 is the default value. +// nDumpCFLNumber: 1 indicates dumping the CFL number to file, 0 denotes no dumping. // sigmaVelocity: the coordination coefficient of tangential momentum for computation of slip velocity. The value is in range of (0.0, 2.0]. // sigmaTemperature: the heat coordination coefficient for computation of slip temperature. The value is in range of (0.0, 2.0]. // sigmaMassFraction: the species coordination coefficient for computation of slip mass fractions. The value is in range of (0.0, 2.0]. // velocitySlipCorrectConstant: the correction constant to the velocity slip condition. For the diffuse reflection, 1.0 is used. -// 1.0 -- proposed by Maxwell. -// sqrt(2/PI)~0.8 -- used for "micro-slip", namely the actual velocity slip at the wall. -// 1.146 -- proposed for an additional "fictitious" velocity slip. - -// chemicalRelaxCorf: The value is in range of [0.001, 1.0]. -// spectrumRadiusCoef: The value is in range of [0.0, 2.0]. -// staticPressureRelaxCorf: The value is in range of [0.1, 1.0]. -// nIsChemicalFreeze : the flag to freeze the chemical reactions. -// 0 -- not freeze, the chemical reaction sources will be calculated. -// 1 -- freezes the chemical reactions, the chemical reaction sources will not be calculated.// veTemperatureMin: The minimum of Tv and Te - -//maxViscous: the maximum of Viscous. -//trTemperatureMin: the minimum value of trTemperature. -//veTemperatureMin: the minimum value of veTemperature. -//densityMin: the minimum value of density. -//tAdjustmentFactor: magnification of temperature, this value is in range of (1.0, 10.0]. -// nDebug: cout the Wrong place and abort -// 0 -- not used. -// 1 -- used. +// 1.0 -- proposed by Maxwell. +// sqrt(2/PI)~0.8 -- used for "micro-slip", namely the actual velocity slip at the wall. +// 1.146 -- proposed for an additional "fictitious" velocity slip. +// chemicalRelaxCorf: The value is in range of [0.001, 1.0]. +// spectrumRadiusCoef: The value is in range of [0.0, 2.0]. +// staticPressureRelaxCorf: The value is in range of [0.1, 1.0]. +// nIsChemicalFreeze: the flag to freeze the chemical reactions. +// 0 -- not freeze, the chemical reaction sources will be calculated. +// 1 -- freezes the chemical reactions, the chemical reaction sources will not be calculated. +// veTemperatureMin: The minimum of Tv and Te. +// maxViscous: the maximum of Viscous. +// trTemperatureMin: the minimum value of trTemperature. +// veTemperatureMin: the minimum value of veTemperature. +// densityMin: the minimum value of density. +// tAdjustmentFactor: magnification of temperature, this value is in range of (1.0, 10.0]. +// nDebug: cout the Wrong place and abort +// 0 -- not used. +// 1 -- used. // nSpeciesLimit: limitter of gas species -// 0 -- not used. -// 1 -- used. -// nTurblenceForChemical: the coupled mode of Turblence and Chemical reaction -// 0 -- method 0. -// 1 -- method 1. -// nViscosityFluxSublevelModified: Modified for ViscosityFlux on Sublevel grid -// 0 -- not used. -// 1 -- used. -// nViscosityPeModified: Pe Modified for ViscosityCoef -// 0 -- not used. -// 1 -- used. -// nChemcalSourceModified: Modified on ChemcalSource -// 0 -- not used. -// 1 -- used. -// nChemcalSourceEsMethod: Modified on ChemcalSource -// 0 -- approximation algorithm 1 (Ori.) -// 1 -- approximation algorithm 2 (New) - +// 0 -- not used. +// 1 -- used. +// nTurblenceForChemical: the coupled mode of Turblence and Chemical reaction. +// 0 -- method 0. +// 1 -- method 1. +// nViscosityFluxSublevelModified: Modified for ViscosityFlux on Sublevel grid. +// 0 -- not used. +// 1 -- used. +// nViscosityPeModified: Pe Modified for ViscosityCoef. +// 0 -- not used. +// 1 -- used. +// nChemcalSourceModified: Modified on ChemcalSource. +// 0 -- not used. +// 1 -- used. +// nChemcalSourceEsMethod: Modified on ChemcalSource. +// 0 -- approximation algorithm 1 (Ori). +// 1 -- approximation algorithm 2 (New). // nMaxStepTemperature: the iterative steps of temperature. - -// veTemperatureMinModified: Modified on the minimum of Tve for Cvvs -// 0 -- not used -// 1 -- used - -// nDiagonalModified: Modified on Diagonal -// 0 -- not used -// 1 -- Ori. -// 2 -- new - -//nGradPrimtiveMethod: -// 0 -- Ori. -// 1 -- new +// veTemperatureMinModified: Modified on the minimum of Tve for Cvvs. +// 0 -- not used. +// 1 -- used. +// nDiagonalModified: Modified on Diagonal. +// 0 -- not used. +// 1 -- new. +// nDiagonalModifiedTurb: Modified on Diagonal for turbulence. +// 0 -- not used. +// 1 -- new. +// nGradPrimtiveMethod: +// 0 -- Ori. +// 1 -- new. // nAblation: -// 0 -- The wall ablation is not computed. -// 1 -- The wall ablation is computed. +// 0 -- The wall ablation is not computed. +// 1 -- The wall ablation is computed. // isInjection: -// 0 -- The injection velocity of ablation wall is not computed. -// 1 -- The injection velocity of ablation wall is computed. +// 0 -- The injection velocity of ablation wall is not computed. +// 1 -- The injection velocity of ablation wall is computed. // nViscosityModel: -// 0 -- Blottner fitting method(N89). -// 1 -- Gupta fitting method(N90). +// 0 -- Blottner fitting method(N89). +// 1 -- Gupta fitting method(N90). // nContinueModel: The new continue model can switch different computation model. -// 0 -- Not use the new continue model. -// 1 -- use the new continue model. +// 0 -- Not use the new continue model. +// 1 -- use the new continue model. // nSutherland: -// 0 -- stands for selecting the Blotter curve fits mode. -// 1 -- stands for Sutherland relation. +// 0 -- stands for selecting the Blotter curve fits mode. +// 1 -- stands for Sutherland relation. // gasfile: Indicates the gas model, 9 models are provided, namely "Gu5", "Gu7", "Gu11", "Pa5", "Pa7", "Pa11", "DK5", "DK7", "DK11". -// "Gu" -- indicates the Gupta Model, three-Type Models are embeded in the library, namely, the 5-species-6-reactions, the 7-species-9-reactions, the 11-species-20-reactions. -// "Pa" -- indicates the Park Model, three-Type Models are embeded in the library, namely, the 5-species-17-reactions, the 7-species-22-reactions, the 11-species-48-reactions. -// "DK" -- indicates the Dunn-Kang Model, three-Type Models are embeded in the library, namely, the 5-species-11-reactions, the 7-species-15-reactions, the 11-species-26-reactions. -// "Mars-Pa8" is for Park model of Mars gas, "Mars-Mc8" for McKenzie model of Mars gas. -// "Combustion-12" -- indicates the Combustion Chamber Gas Model which includes 12-species-20-reactions. -// "Gas-Mixture" -- indicates the process of mixing gas without reacting. -// for struct solver mixing two speciesSpeciesA, SpeciesB. -// for unstruct solver mixing multi-speciesO2 NO CO CO2 H2 N2 Air CH4. -// For self-definition model, the gasfile is used to indicate the file path of the new gas model. +// "Gu" -- indicates the Gupta Model, three-Type Models are embeded in the library, namely, the 5-species-6-reactions, the 7-species-9-reactions, the 11-species-20-reactions. +// "Pa" -- indicates the Park Model, three-Type Models are embeded in the library, namely, the 5-species-17-reactions, the 7-species-22-reactions, the 11-species-48-reactions. +// "DK" -- indicates the Dunn-Kang Model, three-Type Models are embeded in the library, namely, the 5-species-11-reactions, the 7-species-15-reactions, the 11-species-26-reactions. +// "Mars-Pa8" is for Park model of Mars gas, "Mars-Mc8" for McKenzie model of Mars gas. +// "Combustion-12" -- indicates the Combustion Chamber Gas Model which includes 12-species-20-reactions. +// "Gas-Mixture" -- indicates the process of mixing gas without reacting. +// for struct solver mixing two species��SpeciesA, SpeciesB��. +// for unstruct solver mixing multi-species��O2 NO CO CO2 H2 N2 Air CH4��. +// For self-definition model, the gasfile is used to indicate the file path of the new gas model. // speciesName: Used to list the names of each species, while each species name is separated by the symbol of comma. // initMassFraction: Used to list the initial mass fractions of species in accordance with the sequence of names in the parameter speciesName. // ifStartFromPerfectGasResults: The chemical reaction simulation is start from perfect gas flowfield or not, 0 is for no and else is for yes. -// nIterFirstStep : the maximum number of iteration in the first step for the self-adaptive calculation. -// nIterSecondStep : the maximum number of iteration in the second step for the self-adaptive calculation. -// nIterThirdStep : the maximum number of iteration in the third step for the self-adaptive calculation. -// nEnergyAssembly : the vibration energy is computed with combined method which includes the fitting method and the molecular kinetic theory. -// 0 -- no, -// 1 -- yes. +// nIterFirstStep : the maximum number of iteration in the first step for the self-adaptive calculation. +// nIterSecondStep: the maximum number of iteration in the second step for the self-adaptive calculation. +// nIterThirdStep : the maximum number of iteration in the third step for the self-adaptive calculation. +// nEnergyAssembly: the vibration energy is computed with combined method which includes the fitting method and the molecular kinetic theory. +// 0 -- no, +// 1 -- yes. // nControlVariable: the variable to computing the residual error that determines the convergence is meet or not in the one-temperature model. -// 0 -- the density. -// 1 -- the translation temperature. -// 2 -- the vibration temperature. -// 3 -- the electron temperature. -// 4 -- the pressure. -// 5 -- the mass fraction of oxygen. -// 6 -- the mass fraction of nitrogen. +// 0 -- the density. +// 1 -- the translation temperature. +// 2 -- the vibration temperature. +// 3 -- the electron temperature. +// 4 -- the pressure. +// 5 -- the mass fraction of oxygen. +// 6 -- the mass fraction of nitrogen. // firstStepError : the residual error of the first step iteration for the self-adaptive calculation. // secondStepError : the residual error of the second step iteration for the self-adaptive calculation. // thirdStepError : the residual error of the third step iteration for the self-adaptive calculation. -// useHyflowSetting : Setting for HyFLOW GUI. -// 0 -- PHengLEI -// 1 -- HyFLOW -// nProtectData : Use the continuation file data protection mechanism. -// 0 -- no -// 1 -- yes - +// nProtectData: Use the continuation file data protection mechanism. +// 0 -- no. +// 1 -- yes. +// nTvChange: Judge whether the Tv equals Ttr. +// 0 -- yes. +// 1 -- no. +// isMoleFractionType: 1 indicates the mass fractions, or else the mole fractions. +// nFraction: the initial fractions type of species. +// 0 -- mass fraction. +// 1 -- mole fraction. int dg_high_order = 0; int iapplication = 0; int isAdaptiveSolver = 0; -int nm = 5; +int nm = 5; int nEquilibriumGas = 0; -int nPCWCycleStep = 3; -int nRETCycleStep = 3; -int nSLIPCycleStep= 3; +int nPCWCycleStep = 3; +int nRETCycleStep = 3; +int nSLIPCycleStep = 3; int nIterFirstStep = 1000; int nIterSecondStep= 2000; int nIterThirdStep = 2000; @@ -1065,17 +1084,17 @@ double secondStepError = 0.001; double thirdStepError = 0.001; double predictCFLError = 0.1; -double refGama = 1.4; -double prl = 0.72; -double prt = 0.90; -double sc_l = 0.5; -double sc_t = 0.5; +double refGama = 1.4; +double prl = 0.72; +double prt = 0.90; +double sc_l = 0.5; +double sc_t = 0.5; -int nGasModel = 0; -int nchem = 0; -int nchemsrc = 1; -int nchemrad = 1; -int ntmodel = 1; +int nGasModel = 0; +int nchem = 0; +int nchemsrc = 1; +int nchemrad = 1; +int ntmodel = 1; int nIdealState = 0; int nEnergyRecycle = 1; @@ -1099,12 +1118,12 @@ double sigmaTemperature = 1.0; double sigmaMassFraction = 1.0; double velocitySlipCorrectConstant = 1.0; -double chemicalRelaxCorf = 1.0; +double chemicalRelaxCorf = 1.0; double chemicalSpectrumRadiusCoef = 1.0; double viscousSpectrumRadiusCoef = 1.5; double inviscidSpectrumRadiusCoef = 1.5; -double spectrumRadiusCoef = 0.5; -double staticPressureRelaxCorf = 0.2; +double spectrumRadiusCoef = 0.5; +double staticPressureRelaxCorf = 0.2; double maxViscous = 10000.0; double trTemperatureMin = 10.0; @@ -1114,31 +1133,35 @@ double densityMin = 1.0e-8; double densityMinFactor = 0.1; double tAdjustmentFactor = 10.0; double iniSpeedCoef = 1.0; +int iniSpeedMode = 0; -int nDebug = 0; -int nSpeciesLimit = 1; -int nTurblenceForChemical = 0; -int nViscosityFluxSublevelModified = 1; -int nViscosityPeModified = 0; -int nChemcalSourceModified = 2; -int nChemcalSourceEsMethod = 1; -int nMaxStepTemperature = 5; -int veTemperatureMinModified = 1; -int nDiagonalModified = 0; -int nGradPrimtiveMethod = 1; -int nInviscidFluxModify = 1; -int nQlLimitMethod = 2; -int nSpeciesForWallMethod = 1; -int nDensityForWallMethod = 0; +int nDebug = 0; +int nSpeciesLimit = 1; +int nTurblenceForChemical = 0; +int nViscosityFluxSublevelModified = 1; +int nViscosityPeModified = 0; +int nChemcalSourceModified = 2; +int nChemcalSourceEsMethod = 1; +int nMaxStepTemperature = 5; +int veTemperatureMinModified = 1; +int nDiagonalModified = 0; +int nDiagonalModifiedTurb = 0; +int nGradPrimtiveMethod = 1; +int nInviscidFluxModify = 1; +int nQlLimitMethod = 2; +int nSpeciesForWallMethod = 1; +int nDensityForWallMethod = 0; +int wallMultiTemperature = 0; -int nProtectData = 0; -int useHyflowSetting = 0; -int nAblation = 0; -int isInjection = 0; -int nViscosityModel = 0; -int nMarsModel = 0; -string gasfile = "DK5"; -//string gasfile = "./chemical/Dunn-Kang_air5s11r.dat"; +int nProtectData = 0; +int nAblation = 0; +int isInjection = 0; +int nViscosityModel = 0; +int nMarsModel = 0; +int nTvChange = 0; +int isMoleFractionType = 0; +string gasfile = "DK5"; +//string gasfile = "./chemical/Dunn-Kang_air5s11r.dat"; string speciesName = "O, O2, NO, N, N2"; string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.767"; @@ -1152,16 +1175,16 @@ string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.767"; //string speciesName = "O, O2, NO, N, N2, C, CO, CO2"; //string initMassFraction = "0.0015, 0.0429, 0.0, 0.0, 0.0, 0.0, 0.0777, 0.8779"; -//string gasfile = "Pa"; +//string gasfile = "Pa"; //string speciesName = "O, O2, NO, N, NO+, C, C2, CO, CO2, CN, N2, e-"; //string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.767, 0.0"; -//string gasfile = "Combustion-12"; +//string gasfile = "Combustion-12"; //string speciesName = "O, O2, NO, N, C, CO, CO2, H, H2, OH, H2O, N2"; //string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.767"; //string gasfile = "Gas-Mixture"; -//string speciesName ="SpeciesA, SpeciesB"; +//string speciesName = "SpeciesA, SpeciesB"; //string initMassFraction = "1.0, 0.0"; int nSutherland = 0; double gamaSpeciesA = 1.4; @@ -1173,9 +1196,17 @@ double molecularWeightSpeciesB = 30.0; //string speciesName = "O2, N2"; //string initMassFraction = "1.0, 0.0"; +int nFraction = 0; int nContinueModel = 0; int nChemicalFlowStep = 0; int ifStartFromPerfectGasResults = 0; +int isUseNoneqCond = 0; +double frozenCondition = 0.01; + +int nLeakageMonitor = 0; +double totalLeakageVolume = 1000.0; +double monitorThresholdValue = 0.05; +double sprayFactor = 0.0; ######################################################################### // Multi-Grid parameters. @@ -1196,7 +1227,6 @@ int ifStartFromPerfectGasResults = 0; // 1 -- zero order. // 2 -- first-order. (default) // mgCorrectionLimit: Multi-grid correction limit. - int nMGLevel = 1; int MGCoarsestIteration = 1; int MGPreIteration = 1; @@ -1218,20 +1248,20 @@ int ismooth_turb = 0; int SAProductType = 2; // ----------------- Overset Grid parameter ----------------------------- -int codeOfDigHoles = 1; -int codeOfTurbulentModel = 0; -string masterFileName = "./grid/searchFile.inp"; -string holeBasicFileName = "./grid/holeBasicFile.inp"; -string holeFullFileName = "./grid/holeFullFile.dat"; -string linkFileName = "./grid/topology.dat"; -string zoneInverseFileName = "./grid/zoneInverseMapping.inp"; +int codeOfDigHoles = 1; +int codeOfTurbulentModel = 0; +string masterFileName = "./grid/searchFile.inp"; +string holeBasicFileName = "./grid/holeBasicFile.inp"; +string holeFullFileName = "./grid/holeFullFile.dat"; +string linkFileName = "./grid/topology.dat"; +string zoneInverseFileName = "./grid/zoneInverseMapping.inp"; -######################################################################### -# High Order Struct Solver # -######################################################################### +#************************************************************************ +# High Order Struct Solver * +#************************************************************************ // isFVMOrFDM: -// 0 -- NSSolverStruct using Finite Volume Method. -// 1 -- NSSolverStruct using Finite Differ Method. +// 0 -- NSSolverStruct using Finite Volume Method. +// 1 -- NSSolverStruct using Finite Differ Method. // SolverStructOrder: Spatial discretisation order of NS equations with struct grid. // <= 2 -- finite volume method. // >= 3 -- finite difference order. (to be completed) @@ -1273,30 +1303,48 @@ int allReduceStep = 1; // codeOfOversetGrid: Overlapping(overset) grid or not. // 0 -- NON-overlapping grid. // 1 -- Overlapping grid. -// oversetInterpolationMethod: the method of overset interpolation while field simulation +// oversetInterpolationMethod: the method of overset interpolation while field simulation. // 0 -- set the acceptor cell value by donor cell value. // 1 -- set the acceptor cell value by distance weight of donor cell value. - -int codeOfOversetGrid = 0; -int oversetInterpolationMethod = 0; -int readOversetFileOrNot = 0; -int symetryOrNot = 0; -int readInAuxiliaryInnerGrid = 0; -int readInAuxiliaryOuterGrid = 0; -int readInSklFileOrNot = 0; -string auxiliaryInnerGrid0 = "./grid/aux-upper.fts"; -string auxiliaryInnerGrid1 = "./grid/aux-lower.fts"; -string auxiliaryInnerGrid2 = ""; -string oversetGridFileName = "./grid/iblank.ovs"; -double walldistMainZone = 1.0 -double toleranceForOversetSearch = 1.0e-3; -double toleranceForOversetBox = 1.0e-3; -int twoOrderInterpolationOrNot = 0; -int keyEnlargeOfActiveNodes = 0; -int outTecplotOverset = 0; -int outPutOversetVisualization = 0; - -int numberOfMovingBodies = 2; +// readOversetFileOrNo: Whether to read overset-file(.ovs) that has been generated. +// 0 -- no. +// 1 -- yes. +// symetryOrNot: If there exist symetryplanes(XY plane, the coordinate of Z direction is 0) in +// the current overset grid(only for three dimension). +// 0 -- no. +// 1 -- yes. +// readInAuxiliaryInnerGrid: Whether to read auxiliary inner grid. +// 0 -- no. +// 1 -- yes. +// walldistMainZone: The initial value of background grid which does not exist wall boundary condition. +// toleranceForOversetSearch: The tolerance of overset searching zone to judge whether the obtained node is in the current computing cell. +// toleranceForOversetBox: The tolerance of building the minimum box of computing cells in the overlapping region. +// twoOrderInterpolationOrNot: The number of interpolated cell layers in the overlapping boundary. +// 0 -- one layer. +// 1 -- two layers. +// keyEnlargeOfActiveNodes: The number of enlarged overset-boundary layers in the buffer region. +// outTecplotOverset: Whether to dump out the flowfield data after the progress of overset configure. +// 0 -- no. +// 1 -- yes. +int codeOfOversetGrid = 0; +int oversetInterpolationMethod = 0; +int readOversetFileOrNot = 0; +int symetryOrNot = 0; +int readInAuxiliaryInnerGrid = 0; +int readInAuxiliaryOuterGrid = 0; +int readInSklFileOrNot = 0; +string auxiliaryInnerGrid0 = "./grid/aux-upper.fts"; +string auxiliaryInnerGrid1 = "./grid/aux-lower.fts"; +string auxiliaryInnerGrid2 = ""; +string oversetGridFileName = "./grid/iblank.ovs"; +double walldistMainZone = 1.0 +double toleranceForOversetSearch = 1.0e-3; +double toleranceForOversetBox = 1.0e-3; +int twoOrderInterpolationOrNot = 0; +int keyEnlargeOfActiveNodes = 0; +int outTecplotOverset = 0; +int outPutOversetVisualization = 0; +int numberOfMovingBodies = 2; // ----------------- ALE configuration ------------------------------ int codeOfAleModel = 0; @@ -1306,36 +1354,42 @@ double referenceLength = 1.0; double referenceVelocity = 1.0; double referenceDensity = 1.0; -int strategyForFaceNormalVelocity = 0; //0-By Sweeping volume; 1-By face center 1st; 2-By face center 2nd; -int strategyForGCLSource = 0; //0-present; 1-Ahn; +int strategyForFaceNormalVelocity = 0; // 0-By Sweeping volume; 1-By face center 1st; 2-By face center 2nd. +int strategyForGCLSource = 0; // 0-present; 1-Ahn. -//0:1st-Admas-Bashforth; 1:2nd-Admas-Bashforth; 2:1st-Implicit-Euler; 3:2nd-Implicit Euler; 4:2nd-Adams-Moulton; 5:3rd-Adams-Moulton +// 0: 1st-Admas-Bashforth; 1: 2nd-Admas-Bashforth; 2: 1st-Implicit-Euler; 3: 2nd-Implicit Euler; 4: 2nd-Adams-Moulton; 5: 3rd-Adams-Moulton. int methodForKineticEquation = 0; double relaxParameterOfKinetic = 1.0; -######################################################################### -# motive information # -######################################################################### +#************************************************************************ +# motive information * +#************************************************************************ int numberOfMovingBodies = 1; ############################## body0 ############################## -//mass of parts -double mass_0 = 1.0; -//mass matrix of parts Ixx Iyy Izz Ixy Ixz Iyz -double massMatrix_0[] = 1e-7, 1e-6, 1e-6, 0.0, 0.0, 0.0; -//initial six DOF position information of parts. xc yc zc -double massCenter_0[] = 0.0 , 0.0, 0.0; -//initial six DOF position information of parts. angleX angleY angleZ -double attitudeAngle_0[] = 0.0 , 0.0, 0.0; -//initial six DOF move information of parts. vc vy vz -double massCenterVelocity_0[] = 0.0, 0.0, 0.0; -//initial six DOF move information of parts. omigX omigY omigZ -double angularVelocity_0[] = 0.0, 0.0, 0.0; -//the object that the parts belong to. -int fartherIndex_0 = -1; -//the assembly position of the parts. xc yc zc angleX angleY angleZ -double configPamameter_0[] = 0.0 ,0.0 ,0.0 ,0.0 ,0.0 ,0.0; -//the move pattern of the parts. +// mass of parts. +double mass_0 = 1.0; +// gravity of parts (along negative direction in Y-axis, eg. 9.8). +double gravity_0 = 0.0; +// mass matrix of parts Ixx Iyy Izz Ixy Ixz Iyz. +double massMatrix_0[] = 1e-7, 1e-6, 1e-6, 0.0, 0.0, 0.0; +// initial six DOF position information of parts. xc yc zc. +double massCenter_0[] = 0.0, 0.0, 0.0; +// if reset mass center while restart. +int resetMassCenter_0 = 0; +// position offset of parts. dx dy dz. +double massCenterDxyz_0[] = 0.0, 0.0, 0.0; +// initial six DOF position information of parts. angleX angleY angleZ. +double attitudeAngle_0[] = 0.0, 0.0, 0.0; +// initial six DOF move information of parts. vc vy vz. +double massCenterVelocity_0[] = 0.0, 0.0, 0.0; +// initial six DOF move information of parts. omigX omigY omigZ. +double angularVelocity_0[] = 0.0, 0.0, 0.0; +// the object that the parts belong to. +int fartherIndex_0 = -1; +// the assembly position of the parts. xc yc zc angleX angleY angleZ. +double configPamameter_0[] = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0; +// the move pattern of the parts. // -1 given motion partten. // 0 still. // 1 six DOF motion. @@ -1346,51 +1400,68 @@ double configPamameter_0[] = 0.0 ,0.0 ,0.0 ,0.0 ,0.0 // 14 forced pitch motion. // 15 forced yaw motion. // 16 forced roll motion. -int RBDMethod_0 = 0; -double amplitude_0 = 0.0; -double reduceFrequency_0 = 0.0; -//direction of rotation +int RBDMethod_0 = 0; +double amplitude_0 = 0.0; +double reduceFrequency_0 = 0.0; +// direction of rotation. // 1 -- clockwise from the point of view along the positive x axis. // -1 -- anticlockwise from the point of view along the positive x axis. -int direction_0 = -1; -double rotateFrequency_0 = 0.0; -//string uDFSixDofFileName_0 = "./Bin/UDFSixDof.Parameter"; -//additional force (system axis) fX fY fZ -double addedForce_0[] = 0.0 ,0.0 ,0.0 ; -//additional moment of Force (system axis) mX mY mZ -double addedMoment_0[] = 0.0 ,0.0 ,0.0 ; -//the deformation method of the parts. -int morphing_0 = 0; - -// post indentify -int integralOrder = 4; +int direction_0 = -1; +double rotateFrequency_0 = 0.0; +//string uDFSixDofFileName_0 = "./Bin/UDFSixDof.Parameter"; +// dimensional physical time for additional force(s). +double addedForceTime_0[] = 0.0; +// additional force(inertia system) fX fY fZ. +double addedForce_0[] = 0.0, 0.0, 0.0; +// additional moment(inertia system) mX mY mZ. +double addedMoment_0[] = 0.0, 0.0, 0.0; +// the deformation method of the parts. +int morphing_0 = 0; +// post indentify. +int integralOrder = 4; // ---------------- ATP read -------------------------------------------- -//@int inflowParaType = 0; +//@int inflowParaType = 0; //@double refReNumber = 6.5e6; //@double refDimensionalTemperature = 288.15; //@double freestream_vibration_temperature = 300.00; -//@double refDimensionalPressure = 0; -//@double height = 0; -//@int nsubsonicInlet = 0; -//@int nsubsonicOutlet = 0; -//@string inLetFileName = "./bin/subsonicInlet.hypara"; -//@string outLetFileName = "./bin/subsonicOutlet.hypara"; +//@double refDimensionalPressure = 0; +//@double height = 0; +//@int nsubsonicInlet = 0; +//@int nsubsonicOutlet = 0; +//@string inLetFileName = "./bin/subsonicInlet.hypara"; +//@string outLetFileName = "./bin/subsonicOutlet.hypara"; //@double refDimensionalVelocity = 0; //@double refDimensionalDensity = 0; - -######################################################################### -# Old Parameter # -######################################################################### +//@string weatherDataFilePath = "./WRFData/"; +//@double longitude = 110.95 +//@double latitude = 19.61; +#************************************************************************ +# Old Parameter * +#************************************************************************ int isPlotVolumeField = 0; +#************************************************************************ +# partial flow field setting Parameter * +#************************************************************************ +//int nPartialParameter = 0; // 0/1/2 +//int nNumberOfPartialField = 0; // +//int nStartGridIndex[] = [0]; +//int nEndGridIndex[] = [0]; -######################################################################### -# Incompressible Parameter # -######################################################################### +//double partialCFL[] = [0.0]; +//double partialSpeedCoef[] = [0.0]; +//double partialSpeed[] = [0.0]; +//double partialAttackd[] = [0.0]; +//double partialSlide[] = [0.0]; +//double partialPressure[] = [0.0]; +//double partialTemperature[] = [0.0]; +//double partialMassFractions[] = [0.0]; +#************************************************************************ +# Incompressible Parameter * +#************************************************************************ int isSolveEnergyEquation = 0; int isSolveTurbEquation = 0; -int isSolveSpeciesEquation = 0; - +int isSolveSpeciesEquation = 0; \ No newline at end of file diff --git a/A04_TwoD_Plate_SST_Ma5_Struct_1CPU/bin/grid_para.hypara b/A04_TwoD_Plate_SST_Ma5_Struct_1CPU/bin/grid_para.hypara index 9309eb4..8b54fdc 100644 --- a/A04_TwoD_Plate_SST_Ma5_Struct_1CPU/bin/grid_para.hypara +++ b/A04_TwoD_Plate_SST_Ma5_Struct_1CPU/bin/grid_para.hypara @@ -4,9 +4,12 @@ // gridtype: Grid type for generation, conversion, reconstruction, merging. // 0 -- Unstructured grid. // 1 -- Structured grid. -// axisup: Type of Cartisien coordinates system, used in grid conversion. -// 1 -- Y upward. (default) -// 2 -- Z upward. +// nAxisRotateTimes: number of axis rotating times, zero (default) meaning without rotating. +// axisRotateOrder : axis rotating order. +// 1 -- X-axis. +// 2 -- Y-axis. +// 3 -- Z-axis. +// axisRotateAngles: axis rotating angles (degree), which are corresponding to the axis rotating order. // from_gtype: Type of grid data type in grid conversion process. // -1 -- MULTI_TYPE. // 1 -- PHengLEI, *.fts. @@ -18,7 +21,9 @@ // 7 -- Hybrid, include both of unstructured and structured grid, *.fts. // 8 -- GMSH, *.msh. int gridtype = 1; -int axisup = 1; +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; int from_gtype = 3; ######################################################################### diff --git a/A05_TwoD_Cylinder_Laminar_Ma8d03_Struct/bin/cfd_para.hypara b/A05_TwoD_Cylinder_Laminar_Ma8d03_Struct/bin/cfd_para.hypara index c344658..f903a5a 100644 --- a/A05_TwoD_Cylinder_Laminar_Ma8d03_Struct/bin/cfd_para.hypara +++ b/A05_TwoD_Cylinder_Laminar_Ma8d03_Struct/bin/cfd_para.hypara @@ -8,23 +8,24 @@ // Platform for Hybrid Engineering Simulation of Flows + // China Aerodynamics Research and Development Center + // (C) Copyright, Since 2010 + +// PHengLEI 2212 + //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ########################################################################### # Default parameters for Grid conversion # ########################################################################### // gridtype: Grid type for generation, conversion, reconstruction, merging. -// 0 -- Unstructured grid. -// 1 -- Structured grid. -// 2 -- Hybrid grid, include both of unstructured and structured grid. -// gridobj: Task type of grid treatment. -// 0 -- Grid generation of typical case, such as cylinder, flat plate, etc. -// 1 -- Grid conversion, from other grid data to PHenglEI, such as Fluent, CGNS. -// 2 -- Grid refinement. -// 3 -- Grid merging, merge two blocks into one block. -// 4 -- Grid deformation, achieve unstructured grid deformation. -// 5 -- Grid repairing, repair the original grid in order to remove the negative volume cells. -// 6 -- Grid mirroring, mirror a symmetry grid to whole grid. -// 7 -- Grid type change, convert structured grid to unstructured grid. +// 0 -- Unstructured grid. +// 1 -- Structured grid. +// 2 -- Hybrid grid, include both of unstructured and structured grid. +// gridobj: Task type of grid treatment. +// 0 -- Grid generation of typical case, such as cylinder, flat plate, etc. +// 1 -- Grid conversion, from other grid data to PHenglEI, such as Fluent, CGNS. +// 2 -- Grid refinement. +// 3 -- Grid merging, merge two blocks into one block. +// 4 -- Grid deformation, achieve unstructured grid deformation. +// 5 -- Grid repairing, repair the original grid in order to remove the negative volume cells. +// 6 -- Grid mirroring, mirror a symmetry grid to whole grid. +// 7 -- Grid type change, convert structured grid to unstructured grid. // multiblock: Multi-block grid or not, only for structured grid conversion. // 0 -- Not. // 1 -- Yes. @@ -46,19 +47,24 @@ int gridobj = 1; int multiblock = 0; int iadapt = 0; int SymmetryFaceVector = 1; - int gridReorder = 0; int faceReorderMethod = 0; -// axisup: Type of Cartisien coordinates system, used in grid conversion. -// 1 -- Y upward. (default) -// 2 -- Z upward. -int axisup = 1; +// nAxisRotateTimes: number of axis rotating times, zero (default) meaning without rotating. +// axisRotateOrder : axis rotating order. +// 1 -- X-axis. +// 2 -- Y-axis. +// 3 -- Z-axis. +// axisRotateAngles: axis rotating angles (degree), which are corresponding to the axis rotating order. +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; // omit_no_bound_bc: What's boundary condition for the type of "no_boundary_condition". // 0 -- Interface. (default) // 1 -- Physical boundary condition, used in Hybrid solver. int omit_no_bound_bc = 0; +int omitRepeatInterface = 1; //----------------------------------------------------------------------- # Grid data type # @@ -87,10 +93,9 @@ int dumpOldGrid = 0; // from_gfile: path of original data file for unstructure grid convert from. // out_gfile: path of target file for grid convert to, *.fts type of file usually. int numberOfGridFile = 1; -string from_gfile = "./grid/rae2822_hybrid2d.cas"; -string from_gfile1= ""; - -string out_gfile = "./grid/flat_laminr_133_85_2d.fts"; +string from_gfile = "./grid/rae2822_hybrid2d.cas"; +string from_gfile1 = ""; +string out_gfile = "./grid/flat_laminr_133_85_2d.fts"; // ----------------- some advanced choices ------------------------------ // iunsteady: The Grid is for unsteady simulation or not. @@ -103,9 +108,9 @@ int fileformat = 0; // Parameters for hybrid solver. // mixgrid_uns: path of unstructure grid file for hybrid solver, *.fts type. -// mixgrid_str: path of structure grid file for hybrid solver, *.fts type. -string mixgrid_uns = "./grid/rae2822_uns2d_4.fts"; -string mixgrid_str = "./grid/flat_laminr_133_85_2d.fts"; +// mixgrid_str: path of structure grid file for hybrid solver, *.fts type. +string mixgrid_uns = "./grid/rae2822_uns2d_4.fts"; +string mixgrid_str = "./grid/flat_laminr_133_85_2d.fts"; // Some parameters for structured overlapping grid. int codeOfDigHoles = 1; @@ -119,31 +124,31 @@ string zoneInverseFileName = "./oversetGridView/zoneInverseMapping.inp"; // 0 -- Not. (default) // 1 -- Yes. // geometryUnit: Geometry unit. -// 1 -- meter. -// 2 -- millimeter. -// 3 -- inch. +// 1 -- meter. +// 2 -- millimeter. +// 3 -- inch. // exclusiveCase: Parallel projection exclusive case. -// 0 -- NON case. -// 1 -- JSM-C2-NPOFF case. -// 2 -- CHNT. +// 0 -- NON case. +// 1 -- JSM-C2-NPOFF case. +// 2 -- CHNT. // projectOrgPoint: If the original wall points need to be projected or not. -int anisoRefine = 0; -int geometryUnit = 1; -int isProject = 0; -int readDist = 0; -int isDeform = 0; +int anisoRefine = 0; +int geometryUnit = 1; +int isProject = 0; +int readDist = 0; +int isDeform = 0; int exclusiveCase = 0; int projectOrgPoint = 0; string geometryFileName = "./grid/jsm.igs"; // ----------------- Grid Deform Parameters ----------------------------- // deformationMethod: Grid Deform. -// 1 -- SPRING. -// 2 -- RBF. +// 1 -- SPRING. +// 2 -- RBF. // stationalGridFile: Original grid file. // visualFileName : The visualization file path of deform grid. // nDeformStep : The max deform step. -// flapAngle : The max flap angle. +// flapAngle : The max flap angle. // rotatePostionZ : Rotate postion. // rotatePostionY : Rotate postion. // gridSlice : If dump slice grid. @@ -163,10 +168,10 @@ int sliceAxis = 1; double slicePosition = 13; // ----------------- RBF Parameters ------------------------------------- -// numberOfReferenceCP : Number of reference Control Points. -// influencePara : The RBF influence radius parameter. +// numberOfReferenceCP: Number of reference Control Points. +// influencePara : The RBF influence radius parameter. int numberOfReferenceCP = 40; -double influencePara = 25.0; +double influencePara = 25.0; // ----------------- Periodic Parameters -------------------------------- // Notice: Rotational periodicity only support rotation along the X axis! @@ -178,9 +183,8 @@ double influencePara = 25.0; which only support one direction. // rotationAngle: The relative angle between two periodic face. which is recorded in degrees. - int periodicType = 0; -double translationLength[] = [0.0,0.0,0.0]; +double translationLength[] = [0.0, 0.0, 0.0]; double rotationAngle = 0.0; ######################################################################### @@ -192,7 +196,6 @@ double rotationAngle = 0.0; // 2 -- refine structured grid. // maxproc: The number of partition zones that want to be divided into. // numberOfMultifile: The number of partition grid files that want to be dumped out. - int pgridtype = 0; int maxproc = 4; int numberOfMultifile = 1; @@ -201,20 +204,20 @@ int numberOfMultifile = 1; // 0 -- Not. // 1 -- Yes. // blockIndexOfMark: the block index of mark, only for structured grid partition. -// cellIndexOfMark: the cell index of mark, only for structured grid partition. +// cellIndexOfMark : the cell index of mark, only for structured grid partition. int traceMark = 0; int blockIndexOfMark = 0; -int cellIndexOfMark[] = [185,30,1]; +int cellIndexOfMark[] = [185, 30, 1]; -// parallel Strategy: -//! -# 0 : each zone is assigned to the one that defined in grid partition procedure. -//! -# 1 : random assigned for each zone or by some else ways. -int parallelStrategy = 1; +// parallelStrategy: +// 0 -- each zone is assigned to the one that defined in grid partition procedure. +// 1 -- random assigned for each zone or by some else ways. +int parallelStrategy = 1; //----------------------------------------------------------------------- # File path # //----------------------------------------------------------------------- -// original_grid_file: Original grid file that want to be divided(PHengLEI type, *.fts). +// original_grid_file: Original grid file that want to be divided(PHengLEI type, *.fts). // partition_grid_file: Target partition grid file(PHengLEI type, *.fts). string original_grid_file = "./grid/sphere_mixed.fts"; string partition_grid_file = "./grid/sphere_mixed__4.fts"; @@ -232,11 +235,10 @@ string partition_grid_file = "./grid/sphere_mixed__4.fts"; // 1 -- perfect balance. // maxproc -- perfect imbalance. // 1.05 -- recommended. - int omit_no_bound_bc = 0; int npartmethod = 1; int parallelPartitionMethod = 2; -double parmetisBalance = 1.05; +double parmetisBalance = 1.05; // numberOfMultigrid: Number of multi-grid levels, ONLY used for structured grid. // 1 -- single level. @@ -248,29 +250,35 @@ int numberOfMultigrid = 1; # Default parameters for CFD simulation # ######################################################################### // maxSimuStep: The max simulation step, don't care simulation is restart or not. -// intervalStepFlow: The step intervals for flow variables file 'flow.dat' saved. -// intervalStepPlot: The step intervals for tecplot visual file 'tecflow.dat' saved. +// intervalStepFlow: The step intervals for flow variables file 'flow.dat' saved. +// intervalStepPlot: The step intervals for tecplot visual file 'tecflow.dat' saved. // intervalStepSample: The step intervals for monitored probes variables file 'sample.dat' saved. -// intervalStepForce: The step intervals for aerodynamics coefficients file 'aircoef.dat' saved. -// intervalStepRes: The step intervals for residual file 'res.dat' saved. -// ifLowSpeedPrecon: Precondition process to accelerate convergence for low speed flow. -// 0 -- no precondition process. (default, mach > 0.3) -// 1 -- carry out precondition process. (mach number <= 0.3) - -int maxSimuStep = 20000; - -int intervalStepFlow = 1000; -int intervalStepPlot = 1000; +// intervalStepForce: The step intervals for aerodynamics coefficients file 'aircoef.dat' saved. +// intervalStepRes: The step intervals for residual file 'res.dat' saved. +int maxSimuStep = 20000; +int intervalStepFlow = 1000; +int intervalStepPlot = 1000; int intervalStepSample = 1000; -int intervalStepForce = 100; -int intervalStepRes = 10; -int ifLowSpeedPrecon = 0; +int intervalStepForce = 100; +int intervalStepRes = 10; // compressible: // 0 -- incompressible flow. // 1 -- compressible flow. (default) int compressible = 1; +// ifLowSpeedPrecon: Precondition process to accelerate convergence for low speed flow. +// 0 -- no precondition process. (default, mach > 0.3) +// 1 -- carry out precondition process. (mach number <= 0.3) +// Kprec: The coefficient K for the cut-off velocity. +// 1.0~3.0 is suggested. (default, 3.0) +// preconFarfieldBCMethod: The precondition method for farfield boundary condition. +// 0 -- precondition far-field boundary based on riemann invariants. +// 1 -- Turkel's simplified far-field boundary condition. +int ifLowSpeedPrecon = 0; +double Kprec = 3.0; +int preconFarfieldBCMethod = 1; + //----------------------------------------------------------------------- # CFD Control Parameter # //----------------------------------------------------------------------- @@ -281,33 +289,36 @@ int compressible = 1; // 0 -- the nondimensional conditions. // 1 -- the flight conditions. // 2 -- the experiment conditions. -// 3 -- the subsonic boundary conditions. +// 3 -- the subsonic boundary conditions. (Useless!) // 4 -- the condition that the velocity, temperature and density are given. // 5 -- the condition that the velocity, temperature and pressure are given. +//flowInitMethod: Flow field initialization method. +// 0 -- The entire flow field is initialized according to Infinite velocity. +// 1 -- The velocity near the wall is initialized according to the boundary layer of the plate. // refReNumber: Reynolds number, which is based unit length, unit of 1/m. // refDimensionalTemperature: Dimensional reference temperature, or the total temperature only for the experiment condition. // freestream_vibration_temperature: Dimensional freestream vibration temperature. // refDimensionalPressure: Dimensional reference pressure, or the total pressure only for the experiment condition. // height: Fly height, unit of km. // wallTemperature: Temprature of the solid wall, minus value is for adiabatic boundary condition. -// gridScaleFactor: The customizable unit of the grid, default value is 1.0 for meter.Common dimensions like: -// 1 dm = 0.1 m. -// 1 cm = 0.01 m. -// 1 mm = 0.001m. -// 1 inch = 0.0254m. -// 1 foot = 12 inches = 0.3048m. -// 1 yard = 3 feet = 0.9144m. +// gridScaleFactor: The customizable unit of the grid, default value is 1.0 for meter. Common dimensions like: +// 1 dm = 0.1 m. +// 1 cm = 0.01 m. +// 1 mm = 0.001 m. +// 1 inch = 0.0254 m. +// 1 foot = 12 inches = 0.3048 m. +// 1 yard = 3 feet = 0.9144 m. // forceReferenceLength, forceReferenceLengthSpanWise, forceReferenceArea: Reference length, SpanWise length and area, independent of grid unit. // TorqueRefX, TorqueRefY, TorqueRefZ: Reference point, independent of grid unit. // radiationCoef: The radiation coefficient on wall, it is used to compute the radiation heat flux on wall when the boundary // condition is radiation equilibrium temperature, and 0.8 is the default value. -// refMolecularWeight : the reference molecular weight of gas used for perfect gas. The unit is g/mol. +// refMolecularWeight: the reference molecular weight of gas used for perfect gas. The unit is g/mol. // Generally, the gas is air. Sometimes, it is experiment gas, such as Nitrogen, Argon, and so on. - -int directionMethod = 0; +int directionMethod = 0; double refMachNumber = 0.73; double attackd = 2.79; double angleSlide = 0.00; +int flowInitMethod = 0; int inflowParaType = 0; double refReNumber = 6.5e6; @@ -321,29 +332,27 @@ double freestream_vibration_temperature = 300.00; //double refDimensionalTemperature = 6051.024; // The total temperature, T*(1+(refGama-1)*M*M/2). //double refDimensionalPressure = 4.299696E09; // The total pressure, p*(T0/T)^(refGama/(refGama-1)). -//int inflowParaType = 3; -//int nsubsonicInlet = 1; -//int nsubsonicOutlet = 1; -//string inLetFileName = "./bin/subsonicInlet.hypara"; -//string outLetFileName = "./bin/subsonicOutlet.hypara"; -//double refDimensionalTemperature = 288.144; -//double refDimensionalPressure = 1.01313E05; - -//The velocity, temperature and density are fixed. +// The velocity, temperature and density are fixed. //int inflowParaType = 4; //double refDimensionalVelocity = 1000.0; -//double refDimensionalDensity = 1.0e3; +//double refDimensionalDensity = 1.0e3; -//The velocity, temperature and pressure are fixed. +// The velocity, temperature and pressure are fixed. //int inflowParaType = 5; //double refDimensionalVelocity = 1000.0; //double refDimensionalPressure = 1.0e5; -//The MachNumber, temperature and pressure are fixed. +// The MachNumber, temperature and pressure are fixed. //int inflowParaType = 6; -//double refDimensionalTemperature = 293; +//double refDimensionalTemperature = 293.0; //double refDimensionalPressure = 8886.06; +// The velocity, temperature and pressure are read from file. +//int inflowParaType = 7; +//string weatherDataFilePath = "./WRFData/"; +//double longitude = 110.95 +//double latitude = 19.61; + double wallTemperature = -1.0; double radiationCoef = 0.8; @@ -357,41 +366,41 @@ double forceReferenceArea = 1.0; // unit of meter^2. double TorqueRefX = 0.0; // unit of meter. double TorqueRefY = 0.0; // unit of meter. double TorqueRefZ = 0.0; // unit of meter. +double knudsenLength = 1.0; // unit of meter. double refMolecularWeight = 28.9644; // unit of g/mol. //----------------------------------------------------------------------- # Spatial Discretisation # //----------------------------------------------------------------------- -#******************************************************************* -# Struct Solver * -#******************************************************************* +#************************************************************************ +# Struct Solver * +#************************************************************************ // inviscidSchemeName: Spatial discretisation scheme of struct grid. // Using this when solve structered grid or hybrid. -// -- "vanleer", "steger", "hlle", "lax_f". -// -- "roe", "modified_roe". +// -- "vanleer", "steger", "hlle", "lax_f", +// -- "roe", "modified_roe", // -- "ausm+", "ausm+w", "ausm+up", "ausmdv", "ausmpw", "ausmpw+". // isWennScheme: If using WENN Scheme of struct grid. -// 0 -- NO. (default) -// 1 -- Yes. +// 0 -- NO. (default) +// 1 -- Yes. // str_limiter_name: Limiter of struct grid. -// -- "vanalbada", "vanleer", "minmod", "smooth", "minvan", "3rdsmooth", "3rd_minmod_smooth". -// -- "nolim", no limiter. -// -- "vanalbada_clz", clz supersonic version. -// -- "weno3_js", "wenn3_prm211", "wenn3_zm", "wenn3_zes2", "wenn3_zes3" - +// -- "vanalbada", "vanleer", "minmod", "smooth", "minvan", "3rdsmooth", "3rd_minmod_smooth", +// -- "nolim", no limiter, +// -- "vanalbada_clz", clz supersonic version, +// -- "weno3_js", "wenn3_prm211", "wenn3_zm", "wenn3_zes2", "wenn3_zes3". string inviscidSchemeName = "roe"; int isWennScheme = 0; -string str_limiter_name = "vanalbada"; +string str_limiter_name = "vanalbada"; -#******************************************************************* -# UnStruct Solver or Common * -#******************************************************************* +#************************************************************************ +# UnStruct Solver or Common * +#************************************************************************ // viscousType: Viscous model. -// 0 -- Euler. -// 1 -- Lamilar. -// 2 -- Algebraic. -// 3 -- 1eq turbulent. -// 4 -- 2eq turbulent. +// 0 -- Euler. +// 1 -- Lamilar. +// 2 -- Algebraic. +// 3 -- 1eq turbulent. +// 4 -- 2eq turbulent. // viscousName: Laminar or tubulent model. // -- "0eq-bl". // -- "1eq-sa". @@ -410,16 +419,16 @@ string str_limiter_name = "vanalbada"; // 3 -- IDDES. // uns_scheme_name: Spatial discretisation scheme of Unstruct grid. // Using this when solve Unstructered grid or hybrid. -// -- "vanleer", "roe", "steger", "kfvs", "lax_f", "hlle". +// -- "vanleer", "roe", "GMRESRoe", "GMRESSteger", "steger", "kfvs", "lax_f", "hlle", // -- "ausm+", "ausmdv", "ausm+w", "ausmpw", "ausmpw+". // uns_limiter_name: Limiter of Unstruct grid. -// -- "barth", "vencat", "vanleer", "minmod". -// -- "vanalbada", "smooth", "nnd", "lpz", "1st". +// -- "barth", "vencat", "vanleer", "minmod", +// -- "vanalbada", "smooth", "nnd", "lpz", "1st", // -- "nolim", no limiter. // uns_vis_name: Discretisation method of viscous term. // -- "std", "test", "aver", "new1", "new2". // gradientName: Gradient reconstruction method. -// -- "default", "ggcell", "ggnode", "lsq". +// -- "default", "ggcell", "ggnode", "lsq". // ivencat: Variation of vencat limiter. // 0 -- org method, it is independent of grid scale. // 1 -- new method, it is dependent of grid scale. @@ -442,18 +451,18 @@ string str_limiter_name = "vanalbada"; // 3 -- Harten type, which is default used. // roeEntropyScale: Entropy fix (correction) coefficient scale, default is 1.0. // It is used to scale the default Roe entropy fix coefficients. -// AusmpwPlusLimiter: A Limiter to make "function w" not change acutely in AusmpwPlus scheme, default is 1.0 +// AusmpwPlusLimiter: A Limiter to make "function w" not change acutely in AusmpwPlus scheme, default is 1.0. -//int viscousType = 0; +//int viscousType = 0; //string viscousName = "Euler"; -//int viscousType = 1; +//int viscousType = 1; //string viscousName = "laminar"; -int viscousType = 3; +int viscousType = 3; string viscousName = "1eq-sa"; -//int viscousType = 4; +//int viscousType = 4; //string viscousName = "2eq-kw-menter-sst"; int DESType = 0; @@ -463,7 +472,7 @@ string uns_limiter_name = "vencat"; string uns_vis_name = "test"; string gradientName = "ggnode"; -int ivencat = 7; +int ivencat = 7; double venkatCoeff = 5.0; int reconmeth = 1; int limitVariables = 0; @@ -475,9 +484,9 @@ double roeEntropyScale = 1.0; double AusmpwPlusLimiter = 1.0; -//----------------------------------------------------------------------- -# Temporal Discretisation # -//----------------------------------------------------------------------- +#************************************************************************ +# Temporal Discretisation * +#************************************************************************ // iunsteady: Steady or unsteady. // 0 -- steady. // 1 -- unsteay. @@ -490,51 +499,57 @@ double AusmpwPlusLimiter = 1.0; // statisticalTimePeriod: Used as time period of statistic analysis. // when the value is negative, time period is treated as infinite. // statisticMethod: Statistic reynolds stress method. -// 0 -- tau = - ^2 -// 1 -- tau = +// 0 -- tau = - ^2 +// 1 -- tau = // min_sub_iter: The min sub iteration of unsteady simulation. // max_sub_iter: The max sub iteration of unsteady simulation. // tol_sub_iter: The tolerance of sub iteration of unsteady simulation. // tscheme: Temporal Discretisation method. -// 1 -- Runge-Kutta Multi-State. -// 2 -- Point implicit. -// 3 -- Full implicit. -// 4 -- LU-SGS. -// 5 -- Block LU-SGS. -// 6 -- Jacobian iteration. -// 7 -- Line LU-SGS. -// 8 -- Matrix LU-SGS. +// 1 -- Runge-Kutta Multi-State. +// 2 -- Point implicit. +// 3 -- Full implicit. +// 4 -- LU-SGS. +// 5 -- Block LU-SGS. +// 6 -- Jacobian iteration. +// 7 -- Line LU-SGS. +// 8 -- Matrix LU-SGS. +// 9 -- GMRES. // iSimplifyViscousTerm: Simplify the computation of viscous term in the Block LU-SGS method. The default value assigns 1 that could speed up the computation. // Otherwise, the viscous Jacobian matrix Mv should be computed that will increase the memory and time in iteration of the BLUSGS method. // CFLStart: Started cfl number. // CFLEnd: End cfl number. // CFLVaryStep: The number of step when cfl increase from CFLStart to CFLEnd. +// GMRESCFLScale : CFL = CFLStart * GMRESCFLScal^iteration. +// OriginalTscheme : Used for LUSGS and GMres hybrid computing. +// useLUSGSprecond: Initialize flow field for GMRES. +// 0 --Initialize by first order Jacobian matrix. +// 1 --Initialize by LUSGS. +// GMRESInitStep : the number of iteration step of irst order Jacobian matrix or LUSGS for initialize flow field. // ktmax: Dtratio. dt[i] = MIN(dt[i], ktmax * dtmin / vol[i]) // swapDq: Communication dq between forward/backward sweep of LUSGS or not, default is 0. // nLUSGSSweeps: Sub iteration of LU-SGS or Block LU-SGS. // LUSGSTolerance: Sub iter tolerance of LU-SGS or Block LU-SGS. // ifLocalTimeStep: Time step method. -// 0 --Local. -// 1 --Global. +// 0 --Local. +// 1 --Global. // isUseLocalCFL: use variable number of CFL or not. -// 0 -- global unified CFL number. -// 1 -- local CFL number. +// 0 -- global unified CFL number. +// 1 -- local CFL number. // isUsePreTwall: use the previous temperatures on wall. 1 indicates yes, and 0 indicates no. // visl_min: Minimum value of laminar viscosity coefficient. // turbCFLScale: Turbulence model cfl number factor. // codeOfAleModel: Arbitrary Lagrangian-Eulerian method. -// 0 -- no ALE method. -// 1 -- ALE method for non-moving grids. -// 2 -- ALE method for moving grids. -// 3 -- ALE method for deforming grids. +// 0 -- no ALE method. +// 1 -- ALE method for non-moving grids. +// 2 -- ALE method for moving grids. +// 3 -- ALE method for deforming grids. // wallFunctionType: The type of wall function to implement. -// 0 -- no wall function. (default) -// 1 -- standard wall function. -// 2 -- Pab3D wall function. +// 0 -- no wall function. (default) +// 1 -- standard wall function. +// 2 -- Pab3D wall function. // RKStage: The number of Runge-Kutta step. // lamda: Cofficient of Runge-Kutta step. - -int iunsteady = 0; +int iunsteady = 0; double physicalTimeStep = 0.01; double physicalTimeStepDimensional = -0.001; int ifStartFromSteadyResults = 0; @@ -543,39 +558,42 @@ int ifStaticsReynoldsStress = 0; int startStatisticStep = 800000; double statisticalTimePeriod = -1.0; int statisticMethod = 0; -int linearTwoStepMethods = 1; // 1--BDF1; 2--C-N; 3--BDF2; +int linearTwoStepMethods = 1; // 1--BDF1; 2--C-N; 3--BDF2. int methodOfDualTime = 3; int min_sub_iter = 50; int max_sub_iter = 50; double tol_sub_iter = 0.01; -int tscheme = 4; +int tscheme = 4; int iSimplifyViscousTerm = 1; int ifLocalTimeStep = 0; int isUseLocalCFL = 0; int isUsePreTwall = 0; -double CFLStart = 0.01; -double CFLEnd = 10.0; -int CFLVaryStep = 500; - +double CFLStart = 0.01; +double CFLEnd = 10.0; +int CFLVaryStep = 500; +double GMRESCFLScale = 1.0; +int OriginalTscheme = 9; +int useLUSGSprecond = 1; +int GMRESInitStep = 1000; double pMaxForCFL = 0.2; double pMinForCFL = 0.1; double deltaMaxForCFL = 0.2; double magnifyFactorForCFL = 1.1; double reduceFactorForCFL = 0.5; -double ktmax = 1.0e10; +double ktmax = 1.0e10; -int swapDq = 1; +int swapDq = 1; int nLUSGSSweeps = 1; double LUSGSTolerance = 0.01; -int order = 2; +int order = 2; double visl_min = 0.01; double turbCFLScale = 1.0; -double csrv = 2.0; +double csrv = 1.0; double timemax = 1.0e10; double dtsave = -1.0; int maxale = 10; @@ -591,10 +609,9 @@ double lamda[] = [0.5, 1.0]; //int RKStage = 4; //double lamda[] = [0.25, 0.33333333333, 0.5, 1.0]; - -//----------------------------------------------------------------------- -# File In or Out # -//----------------------------------------------------------------------- +#************************************************************************ +# File In or Out * +#************************************************************************ // numberOfGridGroups: The number of grid groups. // gridfile: The partitioned Grid file path, using relative path, // which is relative to the working directory. @@ -611,20 +628,18 @@ double lamda[] = [0.5, 1.0]; // aircoeffile: The file path to save the aerodynamic force coefficients convergence process, write data for every default (intervalStepForce) steps. // restartNSFile: The file path to write restart flowfield variables, write data for every default (intervalStepFlow) steps. // turbfile: The file path to write restart flowfield variables of turbulence , write data for every default(intervalStepFlow) steps. -// visualfile: The visualization file path of flowfield , write data for every default (intervalStepPlot) steps. +// visualfile: The visualization file path of flowfield, write data for every default (intervalStepPlot) steps. // wall_aircoefile: The file path to save flowfield variables of wall, write data for every default steps. // nDumpSurfaceInfo = 0 the "wall_varfile" write the informations including heat flux. // nDumpSurfaceInfo = 1 the "wall_varfile" write the informations without heat flux. // nIsComputeWallDist: Whether to compute the wall distance. // 0 -- Compute wall distance. // 1 -- Not compute. -// -// protectionFile0 and protectionFile1 : Two continuation file of the data protection mechanism. -// wall_heatfluxfile : The file to output the MaxHeatFlux of wall. - -int numberOfGridGroups = 1; -string gridfile = "./grid/rae2822_hybrid2d__4.fts"; -string wallTemperaturefile= ""; +// protectionFile0 and protectionFile1: Two continuation file of the data protection mechanism. +// wall_heatfluxfile: The file to output the MaxHeatFlux of wall. +int numberOfGridGroups = 1; +string gridfile = "./grid/rae2822_hybrid2d__4.fts"; +string wallTemperaturefile = ""; int nIsComputeWallDist = 0; int walldistMethod = 1; @@ -632,10 +647,12 @@ int cellMethodOrNodeMethod = 0; string resSaveFile = "results/res.dat"; string turbresfile = "results/turbres.dat"; +string transitionResFile = "results/transitionRes.dat"; string aircoeffile = "results/aircoef.dat"; string restartNSFile = "results/flow.dat"; string turbfile = "results/turb.dat"; +string transitionFile = "results/transition.dat"; string visualfile = "results/tecflow.plt"; string wall_aircoefile = "results/wall_aircoef.dat"; @@ -645,10 +662,14 @@ string protectionFile0 = "results/flow0.dat"; string protectionFile1 = "results/flow1.dat"; string wall_heatfluxfile = "results/wall_heatflux.dat"; -int nDumpSurfaceInfo = 0; -string wall_varfile = ""; +string protectionTurbFile0 = "results/turb0.dat"; +string protectionTurbFile1 = "results/turb1.dat"; -string jetDefineFile = "bin/jet.hypara"; +string protectionTransitionFile0 = "results/transition0.dat"; +string protectionTransitionFile1 = "results/transition1.dat"; + +int nDumpSurfaceInfo = 0; +string wall_varfile = ""; string sixDofFileName = "results/sixDofInfo.dat"; string derivativeFileName = "results/identify.dat"; @@ -659,7 +680,8 @@ int plotFieldType = 0; // visualfileType: The file type of visualfile. // 0 -- Tecplot binary. // 1 -- Tecplot ASCII. - +// 2 -- Ensight binary. +// 3 -- Ensight ASCII. int visualfileType = 1; // samplefileMode: The dump mode of sample file. @@ -697,21 +719,21 @@ double upperPlotFieldBox[] = [1.0 1.0 1.0]; // -- vibration temperature(Tv, 33), electron temperature(Te, 34), vibrational energy(Ev, 35), electric energy(Ee, 36), // -- number density of electron(Ne, 37), dimensioanl density(rho, 38), dimensioanl pressure(p, 39), dimensioanl temperature(T, 40), // -- gradientUx(41), gradientUy(42), gradientVx(43), gradientVy(44), streamline_u(45), streamline_v(46), streamline_w(47), -// -- transition intermittency(intermittency, 51), -transition momentum thickness reynolds(MomentumThicknessReynolds, 52), -// -- overlap iblank(iblank, 81) - -// -- specific heat ratio(gama, 56) +// -- transition intermittency(intermittency, 51), transition momentum thickness reynolds(MomentumThicknessReynolds, 52), +// -- local CFL Number(localCFL, 57), minimal CFL Number(minCFL, 58), +// -- overlap iblank(iblank, 81), +// -- specific heat ratio(gama, 56), Knudsen number(kn, 60), Damkohler number(Da, 61), vibrational nonequilibrium number(Vi, 62). // Important Warning: Array size of visualVariables MUST be equal to nVisualVariables!!! // Variables order must from small to big. //-----------the optional parameters list for the wall boundary condition---------------- // nVisualWallVariables: The number of visual variables on wall. // visualWallVariables : dumped variable types, listed as following: -// -coefficient of pressure(cp, 0), -coefficient of friction(cf, 1), yplus(2), -non-dimensional heat flux(Q_NonDim, 3), -dimensional heat flux(Q_Dim, 4), -// -pressure on wall(pw, 5), -temperature on wall(Tw, 6), -density on wall(rhow, 7), -heat flux of translational-rotational temperature term(Qtr, 8), -// -heat flux of species diffusion term(Qs, 9), -heat flux of vibrational temperature term(Qv, 10), -heat flux of electron temperature term(Qe, 11), -// -species mass fractions(Ns, 12), -x component of wall velocity(Vx, 13), -y component of wall velocity(Vy, 14), -z component of wall velocity(Vz, 15) -// -slip translational-rotational temperature(Tts, 16), -slip vibrational temperature(Tvs, 17), -slip electron temperature(Tes, 18), -absolute wall velocity(Vs, 19) -// -Stanton number(St, 20), -coefficient of heat rate(Ch, 21), -temperature jump(deltaT, 22), -Grid Reynolds number on wall(Re_w, 23) +// -- coefficient of pressure(cp, 0), coefficient of friction(cf, 1), yplus(2), non-dimensional heat flux(Q_NonDim, 3), dimensional heat flux(Q_Dim, 4), +// -- pressure on wall(pw, 5), temperature on wall(Tw, 6), density on wall(rhow, 7), heat flux of translational-rotational temperature term(Qtr, 8), +// -- heat flux of species diffusion term(Qs, 9), heat flux of vibrational temperature term(Qv, 10), heat flux of electron temperature term(Qe, 11), +// -- species mass fractions(Ns, 12), x component of wall velocity(Vx, 13), y component of wall velocity(Vy, 14), z component of wall velocity(Vz, 15), +// -- slip translational-rotational temperature(Tts, 16), slip vibrational temperature(Tvs, 17), slip electron temperature(Tes, 18), absolute wall velocity(Vs, 19), +// -- Stanton number(St, 20), coefficient of heat rate(Ch, 21), temperature jump(deltaT, 22), Grid Reynolds number on wall(Re_w, 23), Knudsen number(Kn_wall, 24). int nVisualVariables = 8; int visualVariables[] = [0, 1, 2, 3, 4, 5, 6, 15]; @@ -739,16 +761,18 @@ int dumpStandardModel = 0; // 1 -- Real cell where the probe is located. // nProbeVariables: Number of variables want to be dumped for probes monitered. // probeVariables : Variable types dumped, listed as following: -// -- density(0), u(1), v(2), w(3), pressure(4), temperature(5), mach(6). +// -- density(0), u(1), v(2), w(3), pressure(4), temperature(5), mach(6), +// -- dimensioanl_density(7), dimensioanl_u(8), dimensioanl_v(9), +// -- dimensioanl_w(10), dimensioanl_pressure(11), dimensioanl_temperature(12). // Important Warning: Array size of probeVariables MUST be equal to nProbeVariables!!! // probeVariables order must from small to big. // probeVariablesInterpolationMethod: Interpolation method used to compute the probe variables. -// 0 -- Take the value of probe's cell as probe real value. -// 1 -- Interpolation from probe's and neighbouring cell to probe. -// 2 -- Interpolation from probe's cell nodes to probe. +// 0 -- Take the value of probe's cell as probe real value. +// 1 -- Interpolation from probe's and neighbouring cell to probe. +// 2 -- Interpolation from probe's cell nodes to probe. int ifSetDataMonitor = 0; -int dataMonitorType = 0; +int dataMonitorType = 0; string probesDefineFile = "bin/probes_XYZ.dat"; //int dataMonitorType = 1; @@ -761,28 +785,26 @@ string probesDefineFile = "bin/probes_XYZ.dat"; int searchCellsMethod = 0; -int nProbeVariables = 7; -int probeVariables[] = [0, 1, 2, 3, 4, 5, 6]; -int probeVariablesInterpolationMethod = 0; -//----------------------------------------------------------------------- -# Turbulence Parameter # -//----------------------------------------------------------------------- +int nProbeVariables = 14; +int probeVariables[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]; +int probeVariablesInterpolationMethod = 0; + +#************************************************************************ +# Turbulence Parameter * +#************************************************************************ // turbInterval: Iteration number of turbulence. // kindOfTurbSource: Kinds of turbulent source. // 0 -- Original. // mod_turb_res: If modify the residuals for the cells next to the wall or not, default is 0. -// transitionType: transition model type +// transitionType: transition model type // 0 -- none. // 2 -- gama-re-theta. -// turbIntensity: (valid while greater than 0.0 ) turbulent intensity of free stream(*100) in transition -// freeturbIntensitySRModify: to use SR modify in free stream turbulent intensity decay or not - - +// turbIntensity: (valid while greater than 0.0 ) turbulent intensity of free stream(*100) in transition. +// freeturbIntensitySRModify: to use SR modify in free stream turbulent intensity decay or not. int turbInterval = 1; int turbOrderStruct = 2; int kindOfTurbSource = 0; int mod_turb_res = 0; -double turb_relax = 1.0; double freeStreamViscosity = 1.0e-3; double muoo = 3.0; double kwoo = 5.0; @@ -790,29 +812,28 @@ int transitionType = 0; double turbIntensity = -1.0; int freeturbIntensitySRModify = 0; double freeDecayXLocation = 0.0; -int compressibleCorrection = 0; -int prandtlNumberCorrection = 0; +int compressibleCorrection = 0; int transitionMaFix = 1; -# maximum eddy viscosity (myt/my) max. +// maximum eddy viscosity (myt/my) max. double eddyViscosityLimit = 1.0e10; int monitor_vistmax = 0; -//----------------------------------------------------------------------- -# LES Parameter # -//----------------------------------------------------------------------- +#************************************************************************ +# LES Parameter * +#************************************************************************ // iLES: Create LESSolver or not. -// = 1 - Create LESSolver; -// != 1 - not. +// = 1 -- Create LESSolver; +// != 1 -- not. // amplitudeofDisturb: Amplitude of adding disturb. // disturbstep: Unsteady time step or steady iteration of adding random disturb. // iterdisturb: Add random disturb in every sub-iter or only first sub-iter. -// = 0 - in only first sub-iter; -// != 0 - in every sub-iter. +// = 0 -- in only first sub-iter; +// != 0 -- in every sub-iter. // ipraddisturb: Add density and pressure disturb or not. // ibodyforce: Add body force in source flux of NS equations or not. -// = 0 - not; -// != 0 - Add body force. +// = 0 -- not; +// != 0 -- Add body force. // bodyforce: Body force in source flux of NS equations or not. // utau: friction velocity, using in DNSDisturb. // sgsmodel: subgrid scale model. @@ -820,23 +841,22 @@ int monitor_vistmax = 0; // = "dsmCom"; // = "wale"; // = "sigma". -// deltaFunctionType: = 1 - MAX(deltai, deltaj, deltak); -// = 2 - pow(deltai * deltaj *deltak, 1/3); -// = 3 - Devloped by Scotti. -// wallDampingFunctionType: = 0 - no wall function; -// = 1 - van Driest; -// = 2 - developed by Dr. Deng Xiaobing; -// = 3 - developed by Piomelli. +// deltaFunctionType: = 1 -- MAX(deltai, deltaj, deltak); +// = 2 -- pow(deltai * deltaj *deltak, 1/3); +// = 3 -- Devloped by Scotti. +// wallDampingFunctionType: = 0 -- no wall function; +// = 1 -- van Driest; +// = 2 -- developed by Dr. Deng Xiaobing; +// = 3 -- developed by Piomelli. // turbViscousCutType: turbulent viscosity cut type. -// = 0 - mu_total = mut + mul; -// = 1 - mu_total = max(mut-mul,0)+ mul; -// = 2 - mu_total = max(mut ,0)+ mul. +// = 0 -- mu_total = mut + mul; +// = 1 -- mu_total = max(mut-mul, 0) + mul; +// = 2 -- mu_total = max(mut , 0) + mul. // smagConstant: constant of smagorinsky model. // waleConstant: constant of wale model. -// filterDirection[3]: filter variables in i, j, k direction or not. +// filterDirection [3]: filter variables in i, j, k direction or not. // averageDirection[3]: average variables in i, j, k direction or not. // isotropicConstant: constant of isotropic part of SGS stress. - int iLES = 0; string sgsmodel = "smagorinsky"; int deltaFunctionType = 2; @@ -852,19 +872,16 @@ double testFilterScale = 2.0; int averageWidth = 1; int monitorNegativeConstant = 0; -//----------------------------------------------------------------------- -# Other Parameters for Hypersonic Non-equilibrium Gas # -//----------------------------------------------------------------------- +#************************************************************************ +# Other Parameters for Hypersonic Non-equilibrium Gas * +#************************************************************************ // dg_high_order: // 0 -- generic order accuracy. // 1 -- high order accuracy. // iapplication: // 0 -- gas model is fixed in the codes. // 1 -- gas model is imported from library files. -// isAdaptiveSolver: isAdaptiveSolver=0 indicates the generic Navier-Stokes solver, -// isAdaptiveSolver>0 indicates the HyFlow self-adaptive solver. -// 1 -- using HyFlow self-adaptive solver where the switch is controlled by the total iteration steps. -// 2 -- using HyFlow self-adaptive solver where the switch is controlled by variation of the key residual. +// isAdaptiveSolver: isAdaptiveSolver = 0 indicates the generic Navier-Stokes solver, // nm: Equation number of the physics, but is out of commision now. // 4 -- for 2D. // 5 -- for 3D. @@ -875,7 +892,7 @@ int monitorNegativeConstant = 0; // 2 -- Argon. // 3 -- Nitrogen. // nEnergyRecycle: The type of EnergyModel Recycle. -// 0 -- not used . +// 0 -- not used. // 1 -- used. // nDensityModify: The type of densitymodify. // 0 -- not used. @@ -883,26 +900,25 @@ int monitorNegativeConstant = 0; // nchem: // 0 -- without chemical reaction flow. // 1 -- the chemical reaction flow is considered. -// nEquilibriumGas: the variable is valid when the condition of nchem=0 is satisfied. +// nEquilibriumGas: the variable is valid when the condition of nchem = 0 is satisfied. // 0 -- perfect gas. // 5, 7, 11 -- equilibrium gas, meanwhile, its value denotes the number of gas component. -// nPCWCycleStep: the maximum step number of iteration in the module of computing species mass fractions with the partial catalytic wall(PCW) condition. -// the value equals to or is greater than 1, and 3 is for default value. -// nRETCycleStep: the maximum step number of iteration in the module of computing radiation equilibrium temperature on wall. -// the value equals to or is greater than 1, and 3 is for default value. -// nSLIPCycleStep:the maximum step number of iteration in the module of computing slip temperature, slip velocity and slip species mass fraction. -// the value equals to or is greater than 1, and 3 is for default value. -// nSlipBCModel : The computational model of slip boundary conditions. - -// 0 -- no slip. -// 1 -- the conventional Maxwell slip conditions. -// 2 -- the Gokcen slip conditions. -// 3 -- the Knudsen-layer correction of the standard slip conditions proposed by Lockerby, et al. -// 4 -- the Kogan simplified slip conditions. -// nMeanFreePathType : the method to the mean free-path for the slip conditions. For the mixture, 0 is suggested. -// 0 -- the equivalent mean free-path is calculated by the simple hard sphere model(HS). -// 1 -- calculated by the definition that includes the variables of the number density and the molecule diameter. -// 2 -- the equivalent mean free-path is calculated by the variable hard sphere model(VHS). +// nPCWCycleStep: The maximum step number of iteration in the module of computing species mass fractions with the partial catalytic wall(PCW) condition. +// The value equals to or is greater than 1, and 3 is for default value. +// nRETCycleStep: The maximum step number of iteration in the module of computing radiation equilibrium temperature on wall. +// The value equals to or is greater than 1, and 3 is for default value. +// nSLIPCycleStep:The maximum step number of iteration in the module of computing slip temperature, slip velocity and slip species mass fraction. +// The value equals to or is greater than 1, and 3 is for default value. +// nSlipBCModel: The computational model of slip boundary conditions. +// 0 -- no slip. +// 1 -- the conventional Maxwell slip conditions. +// 2 -- the Gokcen slip conditions. +// 3 -- the Knudsen-layer correction of the standard slip conditions proposed by Lockerby, et al. +// 4 -- the Kogan simplified slip conditions. +// nMeanFreePathType: the method to the mean free-path for the slip conditions. For the mixture, 0 is suggested. +// 0 -- the equivalent mean free-path is calculated by the simple hard sphere model(HS). +// 1 -- calculated by the definition that includes the variables of the number density and the molecule diameter. +// 2 -- the equivalent mean free-path is calculated by the variable hard sphere model(VHS). // nchemsrc: // 0 -- the source terms are not computed. // 1 -- the source terms are computed. @@ -913,148 +929,151 @@ int monitorNegativeConstant = 0; // 1 -- One-temperature model. // 2 -- Two-temperature model. // 3 -- Three-temperature model. +// isUseNoneqCond: +// 0 -- compute the source terms without any conditions. +// 1 -- compute the source terms using the non-equilibrium condition. +// frozenCondition: the threshold value of frozen chemical flow condition, 0.1 is the default value. // nIdealState: whether take all gas species as ideal gas for gas-mixture process. // 0 -- No. -// 1 -- Yes. -// nTEnergyModel: the method to computing temperature energy model. +// 1 -- Yes. // nTEnergyModel: the method to computing temperature energy model. // 0 -- the energy term is computed using the conventional method. // 1 -- the energy term is computed using the polynomial fitting method. // 2 -- the energy term is computed using the piecewise polynomial fitting method. // parkVDPower: the power of translational-rotational temperature in the Park V-D(vibration-dissociation) coupling model. // The value is in range of [0.0, 1.0], DPLR suggests 0.5, LAURA suggests 0.7, while 0.6 is given as default value. // catalyticCoef: -// 0.0 -- full non-catalytic wall boundary condition. -// 1.0 -- full catalytic wall boundary condition. -// in range of (0.0, 1.0) -- partial catalytic condition, the value indicates the catalytic coefficient. -// nIsSuperCatalytic : the super catalytic condition for the fully catalytic wall, and assigned with the value of 1. -// 0 -- equilibrium condition for the fully catalytic wall where the mass fractions are assigned with the values of the free stream. -// 1 -- super catalytic condition for the fully catalytic wall where all the atomic components combine into molecular components. -// nTemperatureJump : the method to calculate the temperature jump. -// 0 -- calculated by the variables of heat conductivity and constant volume specific heat for each energy mode. -// 1 -- the general method where the iteration is calculated with the translation-rotation temperature. -// nSurfGradMethod : the method to compute the surface heating ratio. -// 0 -- the gradient of variable is computed with the first-order difference method. -// 1 -- the gradient of variable is computed with the Green-Guass integral method. -// nRapidFlowfield : initialize the flowfield using the rapid engineering method when it is greater than zero. -// nSurfHeatMonitor : To exam the surface heating change or not. 0 is no, 1 is yes. -// nInitPressureStep : the steps to initialize the boundary variables when the rapid method is used. 100 is the default value. -// nDumpCFLNumber : 1 indicates dumping the CFL number to file, 0 denotes no dumping. +// 0.0 -- full non-catalytic wall boundary condition. +// 1.0 -- full catalytic wall boundary condition. +// in range of (0.0, 1.0) -- partial catalytic condition, the value indicates the catalytic coefficient. +// nIsSuperCatalytic: the super catalytic condition for the fully catalytic wall, and assigned with the value of 1. +// 0 -- equilibrium condition for the fully catalytic wall where the mass fractions are assigned with the values of the free stream. +// 1 -- super catalytic condition for the fully catalytic wall where all the atomic components combine into molecular components. +// nTemperatureJump: the method to calculate the temperature jump. +// 0 -- calculated by the variables of heat conductivity and constant volume specific heat for each energy mode. +// 1 -- the general method where the iteration is calculated with the translation-rotation temperature. +// nSurfGradMethod: the method to compute the surface heating ratio. +// 0 -- the gradient of variable is computed with the first-order difference method. +// 1 -- the gradient of variable is computed with the Green-Guass integral method. +// nRapidFlowfield: initialize the flowfield using the rapid engineering method when it is greater than zero. +// nSurfHeatMonitor: To exam the surface heating change or not. 0 is no, 1 is yes. +// nInitPressureStep: the steps to initialize the boundary variables when the rapid method is used. 100 is the default value. +// nDumpCFLNumber: 1 indicates dumping the CFL number to file, 0 denotes no dumping. // sigmaVelocity: the coordination coefficient of tangential momentum for computation of slip velocity. The value is in range of (0.0, 2.0]. // sigmaTemperature: the heat coordination coefficient for computation of slip temperature. The value is in range of (0.0, 2.0]. // sigmaMassFraction: the species coordination coefficient for computation of slip mass fractions. The value is in range of (0.0, 2.0]. // velocitySlipCorrectConstant: the correction constant to the velocity slip condition. For the diffuse reflection, 1.0 is used. -// 1.0 -- proposed by Maxwell. -// sqrt(2/PI)~0.8 -- used for "micro-slip", namely the actual velocity slip at the wall. -// 1.146 -- proposed for an additional "fictitious" velocity slip. - -// chemicalRelaxCorf: The value is in range of [0.001, 1.0]. -// spectrumRadiusCoef: The value is in range of [0.0, 2.0]. -// staticPressureRelaxCorf: The value is in range of [0.1, 1.0]. -// nIsChemicalFreeze : the flag to freeze the chemical reactions. -// 0 -- not freeze, the chemical reaction sources will be calculated. -// 1 -- freezes the chemical reactions, the chemical reaction sources will not be calculated.// veTemperatureMin: The minimum of Tv and Te - -//maxViscous: the maximum of Viscous. -//trTemperatureMin: the minimum value of trTemperature. -//veTemperatureMin: the minimum value of veTemperature. -//densityMin: the minimum value of density. -//tAdjustmentFactor: magnification of temperature, this value is in range of (1.0, 10.0]. -// nDebug: cout the Wrong place and abort -// 0 -- not used. -// 1 -- used. +// 1.0 -- proposed by Maxwell. +// sqrt(2/PI)~0.8 -- used for "micro-slip", namely the actual velocity slip at the wall. +// 1.146 -- proposed for an additional "fictitious" velocity slip. +// chemicalRelaxCorf: The value is in range of [0.001, 1.0]. +// spectrumRadiusCoef: The value is in range of [0.0, 2.0]. +// staticPressureRelaxCorf: The value is in range of [0.1, 1.0]. +// nIsChemicalFreeze: the flag to freeze the chemical reactions. +// 0 -- not freeze, the chemical reaction sources will be calculated. +// 1 -- freezes the chemical reactions, the chemical reaction sources will not be calculated. +// veTemperatureMin: The minimum of Tv and Te. +// maxViscous: the maximum of Viscous. +// trTemperatureMin: the minimum value of trTemperature. +// veTemperatureMin: the minimum value of veTemperature. +// densityMin: the minimum value of density. +// tAdjustmentFactor: magnification of temperature, this value is in range of (1.0, 10.0]. +// nDebug: cout the Wrong place and abort +// 0 -- not used. +// 1 -- used. // nSpeciesLimit: limitter of gas species -// 0 -- not used. -// 1 -- used. -// nTurblenceForChemical: the coupled mode of Turblence and Chemical reaction -// 0 -- method 0. -// 1 -- method 1. -// nViscosityFluxSublevelModified: Modified for ViscosityFlux on Sublevel grid -// 0 -- not used. -// 1 -- used. -// nViscosityPeModified: Pe Modified for ViscosityCoef -// 0 -- not used. -// 1 -- used. -// nChemcalSourceModified: Modified on ChemcalSource -// 0 -- not used. -// 1 -- used. -// nChemcalSourceEsMethod: Modified on ChemcalSource -// 0 -- approximation algorithm 1 (Ori.) -// 1 -- approximation algorithm 2 (New) - +// 0 -- not used. +// 1 -- used. +// nTurblenceForChemical: the coupled mode of Turblence and Chemical reaction. +// 0 -- method 0. +// 1 -- method 1. +// nViscosityFluxSublevelModified: Modified for ViscosityFlux on Sublevel grid. +// 0 -- not used. +// 1 -- used. +// nViscosityPeModified: Pe Modified for ViscosityCoef. +// 0 -- not used. +// 1 -- used. +// nChemcalSourceModified: Modified on ChemcalSource. +// 0 -- not used. +// 1 -- used. +// nChemcalSourceEsMethod: Modified on ChemcalSource. +// 0 -- approximation algorithm 1 (Ori). +// 1 -- approximation algorithm 2 (New). // nMaxStepTemperature: the iterative steps of temperature. - -// veTemperatureMinModified: Modified on the minimum of Tve for Cvvs -// 0 -- not used -// 1 -- used - -// nDiagonalModified: Modified on Diagonal -// 0 -- not used -// 1 -- Ori. -// 2 -- new - -//nGradPrimtiveMethod: -// 0 -- Ori. -// 1 -- new +// veTemperatureMinModified: Modified on the minimum of Tve for Cvvs. +// 0 -- not used. +// 1 -- used. +// nDiagonalModified: Modified on Diagonal. +// 0 -- not used. +// 1 -- new. +// nDiagonalModifiedTurb: Modified on Diagonal for turbulence. +// 0 -- not used. +// 1 -- new. +// nGradPrimtiveMethod: +// 0 -- Ori. +// 1 -- new. // nAblation: -// 0 -- The wall ablation is not computed. -// 1 -- The wall ablation is computed. +// 0 -- The wall ablation is not computed. +// 1 -- The wall ablation is computed. // isInjection: -// 0 -- The injection velocity of ablation wall is not computed. -// 1 -- The injection velocity of ablation wall is computed. +// 0 -- The injection velocity of ablation wall is not computed. +// 1 -- The injection velocity of ablation wall is computed. // nViscosityModel: -// 0 -- Blottner fitting method(N89). -// 1 -- Gupta fitting method(N90). +// 0 -- Blottner fitting method(N89). +// 1 -- Gupta fitting method(N90). // nContinueModel: The new continue model can switch different computation model. -// 0 -- Not use the new continue model. -// 1 -- use the new continue model. +// 0 -- Not use the new continue model. +// 1 -- use the new continue model. // nSutherland: -// 0 -- stands for selecting the Blotter curve fits mode. -// 1 -- stands for Sutherland relation. +// 0 -- stands for selecting the Blotter curve fits mode. +// 1 -- stands for Sutherland relation. // gasfile: Indicates the gas model, 9 models are provided, namely "Gu5", "Gu7", "Gu11", "Pa5", "Pa7", "Pa11", "DK5", "DK7", "DK11". -// "Gu" -- indicates the Gupta Model, three-Type Models are embeded in the library, namely, the 5-species-6-reactions, the 7-species-9-reactions, the 11-species-20-reactions. -// "Pa" -- indicates the Park Model, three-Type Models are embeded in the library, namely, the 5-species-17-reactions, the 7-species-22-reactions, the 11-species-48-reactions. -// "DK" -- indicates the Dunn-Kang Model, three-Type Models are embeded in the library, namely, the 5-species-11-reactions, the 7-species-15-reactions, the 11-species-26-reactions. -// "Mars-Pa8" is for Park model of Mars gas, "Mars-Mc8" for McKenzie model of Mars gas. -// "Combustion-12" -- indicates the Combustion Chamber Gas Model which includes 12-species-20-reactions. -// "Gas-Mixture" -- indicates the process of mixing gas without reacting. -// for struct solver mixing two speciesSpeciesA, SpeciesB. -// for unstruct solver mixing multi-speciesO2 NO CO CO2 H2 N2 Air CH4. -// For self-definition model, the gasfile is used to indicate the file path of the new gas model. +// "Gu" -- indicates the Gupta Model, three-Type Models are embeded in the library, namely, the 5-species-6-reactions, the 7-species-9-reactions, the 11-species-20-reactions. +// "Pa" -- indicates the Park Model, three-Type Models are embeded in the library, namely, the 5-species-17-reactions, the 7-species-22-reactions, the 11-species-48-reactions. +// "DK" -- indicates the Dunn-Kang Model, three-Type Models are embeded in the library, namely, the 5-species-11-reactions, the 7-species-15-reactions, the 11-species-26-reactions. +// "Mars-Pa8" is for Park model of Mars gas, "Mars-Mc8" for McKenzie model of Mars gas. +// "Combustion-12" -- indicates the Combustion Chamber Gas Model which includes 12-species-20-reactions. +// "Gas-Mixture" -- indicates the process of mixing gas without reacting. +// for struct solver mixing two species��SpeciesA, SpeciesB��. +// for unstruct solver mixing multi-species��O2 NO CO CO2 H2 N2 Air CH4��. +// For self-definition model, the gasfile is used to indicate the file path of the new gas model. // speciesName: Used to list the names of each species, while each species name is separated by the symbol of comma. // initMassFraction: Used to list the initial mass fractions of species in accordance with the sequence of names in the parameter speciesName. // ifStartFromPerfectGasResults: The chemical reaction simulation is start from perfect gas flowfield or not, 0 is for no and else is for yes. -// nIterFirstStep : the maximum number of iteration in the first step for the self-adaptive calculation. -// nIterSecondStep : the maximum number of iteration in the second step for the self-adaptive calculation. -// nIterThirdStep : the maximum number of iteration in the third step for the self-adaptive calculation. -// nEnergyAssembly : the vibration energy is computed with combined method which includes the fitting method and the molecular kinetic theory. -// 0 -- no, -// 1 -- yes. +// nIterFirstStep : the maximum number of iteration in the first step for the self-adaptive calculation. +// nIterSecondStep: the maximum number of iteration in the second step for the self-adaptive calculation. +// nIterThirdStep : the maximum number of iteration in the third step for the self-adaptive calculation. +// nEnergyAssembly: the vibration energy is computed with combined method which includes the fitting method and the molecular kinetic theory. +// 0 -- no, +// 1 -- yes. // nControlVariable: the variable to computing the residual error that determines the convergence is meet or not in the one-temperature model. -// 0 -- the density. -// 1 -- the translation temperature. -// 2 -- the vibration temperature. -// 3 -- the electron temperature. -// 4 -- the pressure. -// 5 -- the mass fraction of oxygen. -// 6 -- the mass fraction of nitrogen. +// 0 -- the density. +// 1 -- the translation temperature. +// 2 -- the vibration temperature. +// 3 -- the electron temperature. +// 4 -- the pressure. +// 5 -- the mass fraction of oxygen. +// 6 -- the mass fraction of nitrogen. // firstStepError : the residual error of the first step iteration for the self-adaptive calculation. // secondStepError : the residual error of the second step iteration for the self-adaptive calculation. // thirdStepError : the residual error of the third step iteration for the self-adaptive calculation. -// useHyflowSetting : Setting for HyFLOW GUI. -// 0 -- PHengLEI -// 1 -- HyFLOW -// nProtectData : Use the continuation file data protection mechanism. -// 0 -- no -// 1 -- yes - +// nProtectData: Use the continuation file data protection mechanism. +// 0 -- no. +// 1 -- yes. +// nTvChange: Judge whether the Tv equals Ttr. +// 0 -- yes. +// 1 -- no. +// isMoleFractionType: 1 indicates the mass fractions, or else the mole fractions. +// nFraction: the initial fractions type of species. +// 0 -- mass fraction. +// 1 -- mole fraction. int dg_high_order = 0; int iapplication = 0; int isAdaptiveSolver = 0; -int nm = 5; +int nm = 5; int nEquilibriumGas = 0; -int nPCWCycleStep = 3; -int nRETCycleStep = 3; -int nSLIPCycleStep= 3; +int nPCWCycleStep = 3; +int nRETCycleStep = 3; +int nSLIPCycleStep = 3; int nIterFirstStep = 1000; int nIterSecondStep= 2000; int nIterThirdStep = 2000; @@ -1065,17 +1084,17 @@ double secondStepError = 0.001; double thirdStepError = 0.001; double predictCFLError = 0.1; -double refGama = 1.4; -double prl = 0.72; -double prt = 0.90; -double sc_l = 0.5; -double sc_t = 0.5; +double refGama = 1.4; +double prl = 0.72; +double prt = 0.90; +double sc_l = 0.5; +double sc_t = 0.5; -int nGasModel = 0; -int nchem = 0; -int nchemsrc = 1; -int nchemrad = 1; -int ntmodel = 1; +int nGasModel = 0; +int nchem = 0; +int nchemsrc = 1; +int nchemrad = 1; +int ntmodel = 1; int nIdealState = 0; int nEnergyRecycle = 1; @@ -1099,12 +1118,12 @@ double sigmaTemperature = 1.0; double sigmaMassFraction = 1.0; double velocitySlipCorrectConstant = 1.0; -double chemicalRelaxCorf = 1.0; +double chemicalRelaxCorf = 1.0; double chemicalSpectrumRadiusCoef = 1.0; double viscousSpectrumRadiusCoef = 1.5; double inviscidSpectrumRadiusCoef = 1.5; -double spectrumRadiusCoef = 0.5; -double staticPressureRelaxCorf = 0.2; +double spectrumRadiusCoef = 0.5; +double staticPressureRelaxCorf = 0.2; double maxViscous = 10000.0; double trTemperatureMin = 10.0; @@ -1114,31 +1133,35 @@ double densityMin = 1.0e-8; double densityMinFactor = 0.1; double tAdjustmentFactor = 10.0; double iniSpeedCoef = 1.0; +int iniSpeedMode = 0; -int nDebug = 0; -int nSpeciesLimit = 1; -int nTurblenceForChemical = 0; -int nViscosityFluxSublevelModified = 1; -int nViscosityPeModified = 0; -int nChemcalSourceModified = 2; -int nChemcalSourceEsMethod = 1; -int nMaxStepTemperature = 5; -int veTemperatureMinModified = 1; -int nDiagonalModified = 0; -int nGradPrimtiveMethod = 1; -int nInviscidFluxModify = 1; -int nQlLimitMethod = 2; -int nSpeciesForWallMethod = 1; -int nDensityForWallMethod = 0; +int nDebug = 0; +int nSpeciesLimit = 1; +int nTurblenceForChemical = 0; +int nViscosityFluxSublevelModified = 1; +int nViscosityPeModified = 0; +int nChemcalSourceModified = 2; +int nChemcalSourceEsMethod = 1; +int nMaxStepTemperature = 5; +int veTemperatureMinModified = 1; +int nDiagonalModified = 0; +int nDiagonalModifiedTurb = 0; +int nGradPrimtiveMethod = 1; +int nInviscidFluxModify = 1; +int nQlLimitMethod = 2; +int nSpeciesForWallMethod = 1; +int nDensityForWallMethod = 0; +int wallMultiTemperature = 0; -int nProtectData = 0; -int useHyflowSetting = 0; -int nAblation = 0; -int isInjection = 0; -int nViscosityModel = 0; -int nMarsModel = 0; -string gasfile = "DK5"; -//string gasfile = "./chemical/Dunn-Kang_air5s11r.dat"; +int nProtectData = 0; +int nAblation = 0; +int isInjection = 0; +int nViscosityModel = 0; +int nMarsModel = 0; +int nTvChange = 0; +int isMoleFractionType = 0; +string gasfile = "DK5"; +//string gasfile = "./chemical/Dunn-Kang_air5s11r.dat"; string speciesName = "O, O2, NO, N, N2"; string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.767"; @@ -1152,16 +1175,16 @@ string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.767"; //string speciesName = "O, O2, NO, N, N2, C, CO, CO2"; //string initMassFraction = "0.0015, 0.0429, 0.0, 0.0, 0.0, 0.0, 0.0777, 0.8779"; -//string gasfile = "Pa"; +//string gasfile = "Pa"; //string speciesName = "O, O2, NO, N, NO+, C, C2, CO, CO2, CN, N2, e-"; //string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.767, 0.0"; -//string gasfile = "Combustion-12"; +//string gasfile = "Combustion-12"; //string speciesName = "O, O2, NO, N, C, CO, CO2, H, H2, OH, H2O, N2"; //string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.767"; //string gasfile = "Gas-Mixture"; -//string speciesName ="SpeciesA, SpeciesB"; +//string speciesName = "SpeciesA, SpeciesB"; //string initMassFraction = "1.0, 0.0"; int nSutherland = 0; double gamaSpeciesA = 1.4; @@ -1173,9 +1196,17 @@ double molecularWeightSpeciesB = 30.0; //string speciesName = "O2, N2"; //string initMassFraction = "1.0, 0.0"; +int nFraction = 0; int nContinueModel = 0; int nChemicalFlowStep = 0; int ifStartFromPerfectGasResults = 0; +int isUseNoneqCond = 0; +double frozenCondition = 0.01; + +int nLeakageMonitor = 0; +double totalLeakageVolume = 1000.0; +double monitorThresholdValue = 0.05; +double sprayFactor = 0.0; ######################################################################### // Multi-Grid parameters. @@ -1196,7 +1227,6 @@ int ifStartFromPerfectGasResults = 0; // 1 -- zero order. // 2 -- first-order. (default) // mgCorrectionLimit: Multi-grid correction limit. - int nMGLevel = 1; int MGCoarsestIteration = 1; int MGPreIteration = 1; @@ -1218,20 +1248,20 @@ int ismooth_turb = 0; int SAProductType = 2; // ----------------- Overset Grid parameter ----------------------------- -int codeOfDigHoles = 1; -int codeOfTurbulentModel = 0; -string masterFileName = "./grid/searchFile.inp"; -string holeBasicFileName = "./grid/holeBasicFile.inp"; -string holeFullFileName = "./grid/holeFullFile.dat"; -string linkFileName = "./grid/topology.dat"; -string zoneInverseFileName = "./grid/zoneInverseMapping.inp"; +int codeOfDigHoles = 1; +int codeOfTurbulentModel = 0; +string masterFileName = "./grid/searchFile.inp"; +string holeBasicFileName = "./grid/holeBasicFile.inp"; +string holeFullFileName = "./grid/holeFullFile.dat"; +string linkFileName = "./grid/topology.dat"; +string zoneInverseFileName = "./grid/zoneInverseMapping.inp"; -######################################################################### -# High Order Struct Solver # -######################################################################### +#************************************************************************ +# High Order Struct Solver * +#************************************************************************ // isFVMOrFDM: -// 0 -- NSSolverStruct using Finite Volume Method. -// 1 -- NSSolverStruct using Finite Differ Method. +// 0 -- NSSolverStruct using Finite Volume Method. +// 1 -- NSSolverStruct using Finite Differ Method. // SolverStructOrder: Spatial discretisation order of NS equations with struct grid. // <= 2 -- finite volume method. // >= 3 -- finite difference order. (to be completed) @@ -1273,30 +1303,48 @@ int allReduceStep = 1; // codeOfOversetGrid: Overlapping(overset) grid or not. // 0 -- NON-overlapping grid. // 1 -- Overlapping grid. -// oversetInterpolationMethod: the method of overset interpolation while field simulation +// oversetInterpolationMethod: the method of overset interpolation while field simulation. // 0 -- set the acceptor cell value by donor cell value. // 1 -- set the acceptor cell value by distance weight of donor cell value. - -int codeOfOversetGrid = 0; -int oversetInterpolationMethod = 0; -int readOversetFileOrNot = 0; -int symetryOrNot = 0; -int readInAuxiliaryInnerGrid = 0; -int readInAuxiliaryOuterGrid = 0; -int readInSklFileOrNot = 0; -string auxiliaryInnerGrid0 = "./grid/aux-upper.fts"; -string auxiliaryInnerGrid1 = "./grid/aux-lower.fts"; -string auxiliaryInnerGrid2 = ""; -string oversetGridFileName = "./grid/iblank.ovs"; -double walldistMainZone = 1.0 -double toleranceForOversetSearch = 1.0e-3; -double toleranceForOversetBox = 1.0e-3; -int twoOrderInterpolationOrNot = 0; -int keyEnlargeOfActiveNodes = 0; -int outTecplotOverset = 0; -int outPutOversetVisualization = 0; - -int numberOfMovingBodies = 2; +// readOversetFileOrNo: Whether to read overset-file(.ovs) that has been generated. +// 0 -- no. +// 1 -- yes. +// symetryOrNot: If there exist symetryplanes(XY plane, the coordinate of Z direction is 0) in +// the current overset grid(only for three dimension). +// 0 -- no. +// 1 -- yes. +// readInAuxiliaryInnerGrid: Whether to read auxiliary inner grid. +// 0 -- no. +// 1 -- yes. +// walldistMainZone: The initial value of background grid which does not exist wall boundary condition. +// toleranceForOversetSearch: The tolerance of overset searching zone to judge whether the obtained node is in the current computing cell. +// toleranceForOversetBox: The tolerance of building the minimum box of computing cells in the overlapping region. +// twoOrderInterpolationOrNot: The number of interpolated cell layers in the overlapping boundary. +// 0 -- one layer. +// 1 -- two layers. +// keyEnlargeOfActiveNodes: The number of enlarged overset-boundary layers in the buffer region. +// outTecplotOverset: Whether to dump out the flowfield data after the progress of overset configure. +// 0 -- no. +// 1 -- yes. +int codeOfOversetGrid = 0; +int oversetInterpolationMethod = 0; +int readOversetFileOrNot = 0; +int symetryOrNot = 0; +int readInAuxiliaryInnerGrid = 0; +int readInAuxiliaryOuterGrid = 0; +int readInSklFileOrNot = 0; +string auxiliaryInnerGrid0 = "./grid/aux-upper.fts"; +string auxiliaryInnerGrid1 = "./grid/aux-lower.fts"; +string auxiliaryInnerGrid2 = ""; +string oversetGridFileName = "./grid/iblank.ovs"; +double walldistMainZone = 1.0 +double toleranceForOversetSearch = 1.0e-3; +double toleranceForOversetBox = 1.0e-3; +int twoOrderInterpolationOrNot = 0; +int keyEnlargeOfActiveNodes = 0; +int outTecplotOverset = 0; +int outPutOversetVisualization = 0; +int numberOfMovingBodies = 2; // ----------------- ALE configuration ------------------------------ int codeOfAleModel = 0; @@ -1306,36 +1354,42 @@ double referenceLength = 1.0; double referenceVelocity = 1.0; double referenceDensity = 1.0; -int strategyForFaceNormalVelocity = 0; //0-By Sweeping volume; 1-By face center 1st; 2-By face center 2nd; -int strategyForGCLSource = 0; //0-present; 1-Ahn; +int strategyForFaceNormalVelocity = 0; // 0-By Sweeping volume; 1-By face center 1st; 2-By face center 2nd. +int strategyForGCLSource = 0; // 0-present; 1-Ahn. -//0:1st-Admas-Bashforth; 1:2nd-Admas-Bashforth; 2:1st-Implicit-Euler; 3:2nd-Implicit Euler; 4:2nd-Adams-Moulton; 5:3rd-Adams-Moulton +// 0: 1st-Admas-Bashforth; 1: 2nd-Admas-Bashforth; 2: 1st-Implicit-Euler; 3: 2nd-Implicit Euler; 4: 2nd-Adams-Moulton; 5: 3rd-Adams-Moulton. int methodForKineticEquation = 0; double relaxParameterOfKinetic = 1.0; -######################################################################### -# motive information # -######################################################################### +#************************************************************************ +# motive information * +#************************************************************************ int numberOfMovingBodies = 1; ############################## body0 ############################## -//mass of parts -double mass_0 = 1.0; -//mass matrix of parts Ixx Iyy Izz Ixy Ixz Iyz -double massMatrix_0[] = 1e-7, 1e-6, 1e-6, 0.0, 0.0, 0.0; -//initial six DOF position information of parts. xc yc zc -double massCenter_0[] = 0.0 , 0.0, 0.0; -//initial six DOF position information of parts. angleX angleY angleZ -double attitudeAngle_0[] = 0.0 , 0.0, 0.0; -//initial six DOF move information of parts. vc vy vz -double massCenterVelocity_0[] = 0.0, 0.0, 0.0; -//initial six DOF move information of parts. omigX omigY omigZ -double angularVelocity_0[] = 0.0, 0.0, 0.0; -//the object that the parts belong to. -int fartherIndex_0 = -1; -//the assembly position of the parts. xc yc zc angleX angleY angleZ -double configPamameter_0[] = 0.0 ,0.0 ,0.0 ,0.0 ,0.0 ,0.0; -//the move pattern of the parts. +// mass of parts. +double mass_0 = 1.0; +// gravity of parts (along negative direction in Y-axis, eg. 9.8). +double gravity_0 = 0.0; +// mass matrix of parts Ixx Iyy Izz Ixy Ixz Iyz. +double massMatrix_0[] = 1e-7, 1e-6, 1e-6, 0.0, 0.0, 0.0; +// initial six DOF position information of parts. xc yc zc. +double massCenter_0[] = 0.0, 0.0, 0.0; +// if reset mass center while restart. +int resetMassCenter_0 = 0; +// position offset of parts. dx dy dz. +double massCenterDxyz_0[] = 0.0, 0.0, 0.0; +// initial six DOF position information of parts. angleX angleY angleZ. +double attitudeAngle_0[] = 0.0, 0.0, 0.0; +// initial six DOF move information of parts. vc vy vz. +double massCenterVelocity_0[] = 0.0, 0.0, 0.0; +// initial six DOF move information of parts. omigX omigY omigZ. +double angularVelocity_0[] = 0.0, 0.0, 0.0; +// the object that the parts belong to. +int fartherIndex_0 = -1; +// the assembly position of the parts. xc yc zc angleX angleY angleZ. +double configPamameter_0[] = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0; +// the move pattern of the parts. // -1 given motion partten. // 0 still. // 1 six DOF motion. @@ -1346,51 +1400,68 @@ double configPamameter_0[] = 0.0 ,0.0 ,0.0 ,0.0 ,0.0 // 14 forced pitch motion. // 15 forced yaw motion. // 16 forced roll motion. -int RBDMethod_0 = 0; -double amplitude_0 = 0.0; -double reduceFrequency_0 = 0.0; -//direction of rotation +int RBDMethod_0 = 0; +double amplitude_0 = 0.0; +double reduceFrequency_0 = 0.0; +// direction of rotation. // 1 -- clockwise from the point of view along the positive x axis. // -1 -- anticlockwise from the point of view along the positive x axis. -int direction_0 = -1; -double rotateFrequency_0 = 0.0; -//string uDFSixDofFileName_0 = "./Bin/UDFSixDof.Parameter"; -//additional force (system axis) fX fY fZ -double addedForce_0[] = 0.0 ,0.0 ,0.0 ; -//additional moment of Force (system axis) mX mY mZ -double addedMoment_0[] = 0.0 ,0.0 ,0.0 ; -//the deformation method of the parts. -int morphing_0 = 0; - -// post indentify -int integralOrder = 4; +int direction_0 = -1; +double rotateFrequency_0 = 0.0; +//string uDFSixDofFileName_0 = "./Bin/UDFSixDof.Parameter"; +// dimensional physical time for additional force(s). +double addedForceTime_0[] = 0.0; +// additional force(inertia system) fX fY fZ. +double addedForce_0[] = 0.0, 0.0, 0.0; +// additional moment(inertia system) mX mY mZ. +double addedMoment_0[] = 0.0, 0.0, 0.0; +// the deformation method of the parts. +int morphing_0 = 0; +// post indentify. +int integralOrder = 4; // ---------------- ATP read -------------------------------------------- -//@int inflowParaType = 0; +//@int inflowParaType = 0; //@double refReNumber = 6.5e6; //@double refDimensionalTemperature = 288.15; //@double freestream_vibration_temperature = 300.00; -//@double refDimensionalPressure = 0; -//@double height = 0; -//@int nsubsonicInlet = 0; -//@int nsubsonicOutlet = 0; -//@string inLetFileName = "./bin/subsonicInlet.hypara"; -//@string outLetFileName = "./bin/subsonicOutlet.hypara"; +//@double refDimensionalPressure = 0; +//@double height = 0; +//@int nsubsonicInlet = 0; +//@int nsubsonicOutlet = 0; +//@string inLetFileName = "./bin/subsonicInlet.hypara"; +//@string outLetFileName = "./bin/subsonicOutlet.hypara"; //@double refDimensionalVelocity = 0; //@double refDimensionalDensity = 0; - -######################################################################### -# Old Parameter # -######################################################################### +//@string weatherDataFilePath = "./WRFData/"; +//@double longitude = 110.95 +//@double latitude = 19.61; +#************************************************************************ +# Old Parameter * +#************************************************************************ int isPlotVolumeField = 0; +#************************************************************************ +# partial flow field setting Parameter * +#************************************************************************ +//int nPartialParameter = 0; // 0/1/2 +//int nNumberOfPartialField = 0; // +//int nStartGridIndex[] = [0]; +//int nEndGridIndex[] = [0]; -######################################################################### -# Incompressible Parameter # -######################################################################### +//double partialCFL[] = [0.0]; +//double partialSpeedCoef[] = [0.0]; +//double partialSpeed[] = [0.0]; +//double partialAttackd[] = [0.0]; +//double partialSlide[] = [0.0]; +//double partialPressure[] = [0.0]; +//double partialTemperature[] = [0.0]; +//double partialMassFractions[] = [0.0]; +#************************************************************************ +# Incompressible Parameter * +#************************************************************************ int isSolveEnergyEquation = 0; int isSolveTurbEquation = 0; -int isSolveSpeciesEquation = 0; - +int isSolveSpeciesEquation = 0; \ No newline at end of file diff --git a/A05_TwoD_Cylinder_Laminar_Ma8d03_Struct/bin/grid_para.hypara b/A05_TwoD_Cylinder_Laminar_Ma8d03_Struct/bin/grid_para.hypara index 7beb562..6c7b6fb 100644 --- a/A05_TwoD_Cylinder_Laminar_Ma8d03_Struct/bin/grid_para.hypara +++ b/A05_TwoD_Cylinder_Laminar_Ma8d03_Struct/bin/grid_para.hypara @@ -4,9 +4,12 @@ // gridtype: Grid type for generation, conversion, reconstruction, merging. // 0 -- Unstructured grid. // 1 -- Structured grid. -// axisup: Type of Cartisien coordinates system, used in grid conversion. -// 1 -- Y upward. (default) -// 2 -- Z upward. +// nAxisRotateTimes: number of axis rotating times, zero (default) meaning without rotating. +// axisRotateOrder : axis rotating order. +// 1 -- X-axis. +// 2 -- Y-axis. +// 3 -- Z-axis. +// axisRotateAngles: axis rotating angles (degree), which are corresponding to the axis rotating order. // from_gtype: Type of grid data type in grid conversion process. // -1 -- MULTI_TYPE. // 1 -- PHengLEI, *.fts. @@ -18,7 +21,9 @@ // 7 -- Hybrid, include both of unstructured and structured grid, *.fts. // 8 -- GMSH, *.msh. int gridtype = 1; -int axisup = 1; +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; int from_gtype = 3; ######################################################################### diff --git a/A06_ThreeD_NACA0012_SA_Struct_4CPU/bin/cfd_para.hypara b/A06_ThreeD_NACA0012_SA_Struct_4CPU/bin/cfd_para.hypara index c344658..f903a5a 100644 --- a/A06_ThreeD_NACA0012_SA_Struct_4CPU/bin/cfd_para.hypara +++ b/A06_ThreeD_NACA0012_SA_Struct_4CPU/bin/cfd_para.hypara @@ -8,23 +8,24 @@ // Platform for Hybrid Engineering Simulation of Flows + // China Aerodynamics Research and Development Center + // (C) Copyright, Since 2010 + +// PHengLEI 2212 + //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ########################################################################### # Default parameters for Grid conversion # ########################################################################### // gridtype: Grid type for generation, conversion, reconstruction, merging. -// 0 -- Unstructured grid. -// 1 -- Structured grid. -// 2 -- Hybrid grid, include both of unstructured and structured grid. -// gridobj: Task type of grid treatment. -// 0 -- Grid generation of typical case, such as cylinder, flat plate, etc. -// 1 -- Grid conversion, from other grid data to PHenglEI, such as Fluent, CGNS. -// 2 -- Grid refinement. -// 3 -- Grid merging, merge two blocks into one block. -// 4 -- Grid deformation, achieve unstructured grid deformation. -// 5 -- Grid repairing, repair the original grid in order to remove the negative volume cells. -// 6 -- Grid mirroring, mirror a symmetry grid to whole grid. -// 7 -- Grid type change, convert structured grid to unstructured grid. +// 0 -- Unstructured grid. +// 1 -- Structured grid. +// 2 -- Hybrid grid, include both of unstructured and structured grid. +// gridobj: Task type of grid treatment. +// 0 -- Grid generation of typical case, such as cylinder, flat plate, etc. +// 1 -- Grid conversion, from other grid data to PHenglEI, such as Fluent, CGNS. +// 2 -- Grid refinement. +// 3 -- Grid merging, merge two blocks into one block. +// 4 -- Grid deformation, achieve unstructured grid deformation. +// 5 -- Grid repairing, repair the original grid in order to remove the negative volume cells. +// 6 -- Grid mirroring, mirror a symmetry grid to whole grid. +// 7 -- Grid type change, convert structured grid to unstructured grid. // multiblock: Multi-block grid or not, only for structured grid conversion. // 0 -- Not. // 1 -- Yes. @@ -46,19 +47,24 @@ int gridobj = 1; int multiblock = 0; int iadapt = 0; int SymmetryFaceVector = 1; - int gridReorder = 0; int faceReorderMethod = 0; -// axisup: Type of Cartisien coordinates system, used in grid conversion. -// 1 -- Y upward. (default) -// 2 -- Z upward. -int axisup = 1; +// nAxisRotateTimes: number of axis rotating times, zero (default) meaning without rotating. +// axisRotateOrder : axis rotating order. +// 1 -- X-axis. +// 2 -- Y-axis. +// 3 -- Z-axis. +// axisRotateAngles: axis rotating angles (degree), which are corresponding to the axis rotating order. +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; // omit_no_bound_bc: What's boundary condition for the type of "no_boundary_condition". // 0 -- Interface. (default) // 1 -- Physical boundary condition, used in Hybrid solver. int omit_no_bound_bc = 0; +int omitRepeatInterface = 1; //----------------------------------------------------------------------- # Grid data type # @@ -87,10 +93,9 @@ int dumpOldGrid = 0; // from_gfile: path of original data file for unstructure grid convert from. // out_gfile: path of target file for grid convert to, *.fts type of file usually. int numberOfGridFile = 1; -string from_gfile = "./grid/rae2822_hybrid2d.cas"; -string from_gfile1= ""; - -string out_gfile = "./grid/flat_laminr_133_85_2d.fts"; +string from_gfile = "./grid/rae2822_hybrid2d.cas"; +string from_gfile1 = ""; +string out_gfile = "./grid/flat_laminr_133_85_2d.fts"; // ----------------- some advanced choices ------------------------------ // iunsteady: The Grid is for unsteady simulation or not. @@ -103,9 +108,9 @@ int fileformat = 0; // Parameters for hybrid solver. // mixgrid_uns: path of unstructure grid file for hybrid solver, *.fts type. -// mixgrid_str: path of structure grid file for hybrid solver, *.fts type. -string mixgrid_uns = "./grid/rae2822_uns2d_4.fts"; -string mixgrid_str = "./grid/flat_laminr_133_85_2d.fts"; +// mixgrid_str: path of structure grid file for hybrid solver, *.fts type. +string mixgrid_uns = "./grid/rae2822_uns2d_4.fts"; +string mixgrid_str = "./grid/flat_laminr_133_85_2d.fts"; // Some parameters for structured overlapping grid. int codeOfDigHoles = 1; @@ -119,31 +124,31 @@ string zoneInverseFileName = "./oversetGridView/zoneInverseMapping.inp"; // 0 -- Not. (default) // 1 -- Yes. // geometryUnit: Geometry unit. -// 1 -- meter. -// 2 -- millimeter. -// 3 -- inch. +// 1 -- meter. +// 2 -- millimeter. +// 3 -- inch. // exclusiveCase: Parallel projection exclusive case. -// 0 -- NON case. -// 1 -- JSM-C2-NPOFF case. -// 2 -- CHNT. +// 0 -- NON case. +// 1 -- JSM-C2-NPOFF case. +// 2 -- CHNT. // projectOrgPoint: If the original wall points need to be projected or not. -int anisoRefine = 0; -int geometryUnit = 1; -int isProject = 0; -int readDist = 0; -int isDeform = 0; +int anisoRefine = 0; +int geometryUnit = 1; +int isProject = 0; +int readDist = 0; +int isDeform = 0; int exclusiveCase = 0; int projectOrgPoint = 0; string geometryFileName = "./grid/jsm.igs"; // ----------------- Grid Deform Parameters ----------------------------- // deformationMethod: Grid Deform. -// 1 -- SPRING. -// 2 -- RBF. +// 1 -- SPRING. +// 2 -- RBF. // stationalGridFile: Original grid file. // visualFileName : The visualization file path of deform grid. // nDeformStep : The max deform step. -// flapAngle : The max flap angle. +// flapAngle : The max flap angle. // rotatePostionZ : Rotate postion. // rotatePostionY : Rotate postion. // gridSlice : If dump slice grid. @@ -163,10 +168,10 @@ int sliceAxis = 1; double slicePosition = 13; // ----------------- RBF Parameters ------------------------------------- -// numberOfReferenceCP : Number of reference Control Points. -// influencePara : The RBF influence radius parameter. +// numberOfReferenceCP: Number of reference Control Points. +// influencePara : The RBF influence radius parameter. int numberOfReferenceCP = 40; -double influencePara = 25.0; +double influencePara = 25.0; // ----------------- Periodic Parameters -------------------------------- // Notice: Rotational periodicity only support rotation along the X axis! @@ -178,9 +183,8 @@ double influencePara = 25.0; which only support one direction. // rotationAngle: The relative angle between two periodic face. which is recorded in degrees. - int periodicType = 0; -double translationLength[] = [0.0,0.0,0.0]; +double translationLength[] = [0.0, 0.0, 0.0]; double rotationAngle = 0.0; ######################################################################### @@ -192,7 +196,6 @@ double rotationAngle = 0.0; // 2 -- refine structured grid. // maxproc: The number of partition zones that want to be divided into. // numberOfMultifile: The number of partition grid files that want to be dumped out. - int pgridtype = 0; int maxproc = 4; int numberOfMultifile = 1; @@ -201,20 +204,20 @@ int numberOfMultifile = 1; // 0 -- Not. // 1 -- Yes. // blockIndexOfMark: the block index of mark, only for structured grid partition. -// cellIndexOfMark: the cell index of mark, only for structured grid partition. +// cellIndexOfMark : the cell index of mark, only for structured grid partition. int traceMark = 0; int blockIndexOfMark = 0; -int cellIndexOfMark[] = [185,30,1]; +int cellIndexOfMark[] = [185, 30, 1]; -// parallel Strategy: -//! -# 0 : each zone is assigned to the one that defined in grid partition procedure. -//! -# 1 : random assigned for each zone or by some else ways. -int parallelStrategy = 1; +// parallelStrategy: +// 0 -- each zone is assigned to the one that defined in grid partition procedure. +// 1 -- random assigned for each zone or by some else ways. +int parallelStrategy = 1; //----------------------------------------------------------------------- # File path # //----------------------------------------------------------------------- -// original_grid_file: Original grid file that want to be divided(PHengLEI type, *.fts). +// original_grid_file: Original grid file that want to be divided(PHengLEI type, *.fts). // partition_grid_file: Target partition grid file(PHengLEI type, *.fts). string original_grid_file = "./grid/sphere_mixed.fts"; string partition_grid_file = "./grid/sphere_mixed__4.fts"; @@ -232,11 +235,10 @@ string partition_grid_file = "./grid/sphere_mixed__4.fts"; // 1 -- perfect balance. // maxproc -- perfect imbalance. // 1.05 -- recommended. - int omit_no_bound_bc = 0; int npartmethod = 1; int parallelPartitionMethod = 2; -double parmetisBalance = 1.05; +double parmetisBalance = 1.05; // numberOfMultigrid: Number of multi-grid levels, ONLY used for structured grid. // 1 -- single level. @@ -248,29 +250,35 @@ int numberOfMultigrid = 1; # Default parameters for CFD simulation # ######################################################################### // maxSimuStep: The max simulation step, don't care simulation is restart or not. -// intervalStepFlow: The step intervals for flow variables file 'flow.dat' saved. -// intervalStepPlot: The step intervals for tecplot visual file 'tecflow.dat' saved. +// intervalStepFlow: The step intervals for flow variables file 'flow.dat' saved. +// intervalStepPlot: The step intervals for tecplot visual file 'tecflow.dat' saved. // intervalStepSample: The step intervals for monitored probes variables file 'sample.dat' saved. -// intervalStepForce: The step intervals for aerodynamics coefficients file 'aircoef.dat' saved. -// intervalStepRes: The step intervals for residual file 'res.dat' saved. -// ifLowSpeedPrecon: Precondition process to accelerate convergence for low speed flow. -// 0 -- no precondition process. (default, mach > 0.3) -// 1 -- carry out precondition process. (mach number <= 0.3) - -int maxSimuStep = 20000; - -int intervalStepFlow = 1000; -int intervalStepPlot = 1000; +// intervalStepForce: The step intervals for aerodynamics coefficients file 'aircoef.dat' saved. +// intervalStepRes: The step intervals for residual file 'res.dat' saved. +int maxSimuStep = 20000; +int intervalStepFlow = 1000; +int intervalStepPlot = 1000; int intervalStepSample = 1000; -int intervalStepForce = 100; -int intervalStepRes = 10; -int ifLowSpeedPrecon = 0; +int intervalStepForce = 100; +int intervalStepRes = 10; // compressible: // 0 -- incompressible flow. // 1 -- compressible flow. (default) int compressible = 1; +// ifLowSpeedPrecon: Precondition process to accelerate convergence for low speed flow. +// 0 -- no precondition process. (default, mach > 0.3) +// 1 -- carry out precondition process. (mach number <= 0.3) +// Kprec: The coefficient K for the cut-off velocity. +// 1.0~3.0 is suggested. (default, 3.0) +// preconFarfieldBCMethod: The precondition method for farfield boundary condition. +// 0 -- precondition far-field boundary based on riemann invariants. +// 1 -- Turkel's simplified far-field boundary condition. +int ifLowSpeedPrecon = 0; +double Kprec = 3.0; +int preconFarfieldBCMethod = 1; + //----------------------------------------------------------------------- # CFD Control Parameter # //----------------------------------------------------------------------- @@ -281,33 +289,36 @@ int compressible = 1; // 0 -- the nondimensional conditions. // 1 -- the flight conditions. // 2 -- the experiment conditions. -// 3 -- the subsonic boundary conditions. +// 3 -- the subsonic boundary conditions. (Useless!) // 4 -- the condition that the velocity, temperature and density are given. // 5 -- the condition that the velocity, temperature and pressure are given. +//flowInitMethod: Flow field initialization method. +// 0 -- The entire flow field is initialized according to Infinite velocity. +// 1 -- The velocity near the wall is initialized according to the boundary layer of the plate. // refReNumber: Reynolds number, which is based unit length, unit of 1/m. // refDimensionalTemperature: Dimensional reference temperature, or the total temperature only for the experiment condition. // freestream_vibration_temperature: Dimensional freestream vibration temperature. // refDimensionalPressure: Dimensional reference pressure, or the total pressure only for the experiment condition. // height: Fly height, unit of km. // wallTemperature: Temprature of the solid wall, minus value is for adiabatic boundary condition. -// gridScaleFactor: The customizable unit of the grid, default value is 1.0 for meter.Common dimensions like: -// 1 dm = 0.1 m. -// 1 cm = 0.01 m. -// 1 mm = 0.001m. -// 1 inch = 0.0254m. -// 1 foot = 12 inches = 0.3048m. -// 1 yard = 3 feet = 0.9144m. +// gridScaleFactor: The customizable unit of the grid, default value is 1.0 for meter. Common dimensions like: +// 1 dm = 0.1 m. +// 1 cm = 0.01 m. +// 1 mm = 0.001 m. +// 1 inch = 0.0254 m. +// 1 foot = 12 inches = 0.3048 m. +// 1 yard = 3 feet = 0.9144 m. // forceReferenceLength, forceReferenceLengthSpanWise, forceReferenceArea: Reference length, SpanWise length and area, independent of grid unit. // TorqueRefX, TorqueRefY, TorqueRefZ: Reference point, independent of grid unit. // radiationCoef: The radiation coefficient on wall, it is used to compute the radiation heat flux on wall when the boundary // condition is radiation equilibrium temperature, and 0.8 is the default value. -// refMolecularWeight : the reference molecular weight of gas used for perfect gas. The unit is g/mol. +// refMolecularWeight: the reference molecular weight of gas used for perfect gas. The unit is g/mol. // Generally, the gas is air. Sometimes, it is experiment gas, such as Nitrogen, Argon, and so on. - -int directionMethod = 0; +int directionMethod = 0; double refMachNumber = 0.73; double attackd = 2.79; double angleSlide = 0.00; +int flowInitMethod = 0; int inflowParaType = 0; double refReNumber = 6.5e6; @@ -321,29 +332,27 @@ double freestream_vibration_temperature = 300.00; //double refDimensionalTemperature = 6051.024; // The total temperature, T*(1+(refGama-1)*M*M/2). //double refDimensionalPressure = 4.299696E09; // The total pressure, p*(T0/T)^(refGama/(refGama-1)). -//int inflowParaType = 3; -//int nsubsonicInlet = 1; -//int nsubsonicOutlet = 1; -//string inLetFileName = "./bin/subsonicInlet.hypara"; -//string outLetFileName = "./bin/subsonicOutlet.hypara"; -//double refDimensionalTemperature = 288.144; -//double refDimensionalPressure = 1.01313E05; - -//The velocity, temperature and density are fixed. +// The velocity, temperature and density are fixed. //int inflowParaType = 4; //double refDimensionalVelocity = 1000.0; -//double refDimensionalDensity = 1.0e3; +//double refDimensionalDensity = 1.0e3; -//The velocity, temperature and pressure are fixed. +// The velocity, temperature and pressure are fixed. //int inflowParaType = 5; //double refDimensionalVelocity = 1000.0; //double refDimensionalPressure = 1.0e5; -//The MachNumber, temperature and pressure are fixed. +// The MachNumber, temperature and pressure are fixed. //int inflowParaType = 6; -//double refDimensionalTemperature = 293; +//double refDimensionalTemperature = 293.0; //double refDimensionalPressure = 8886.06; +// The velocity, temperature and pressure are read from file. +//int inflowParaType = 7; +//string weatherDataFilePath = "./WRFData/"; +//double longitude = 110.95 +//double latitude = 19.61; + double wallTemperature = -1.0; double radiationCoef = 0.8; @@ -357,41 +366,41 @@ double forceReferenceArea = 1.0; // unit of meter^2. double TorqueRefX = 0.0; // unit of meter. double TorqueRefY = 0.0; // unit of meter. double TorqueRefZ = 0.0; // unit of meter. +double knudsenLength = 1.0; // unit of meter. double refMolecularWeight = 28.9644; // unit of g/mol. //----------------------------------------------------------------------- # Spatial Discretisation # //----------------------------------------------------------------------- -#******************************************************************* -# Struct Solver * -#******************************************************************* +#************************************************************************ +# Struct Solver * +#************************************************************************ // inviscidSchemeName: Spatial discretisation scheme of struct grid. // Using this when solve structered grid or hybrid. -// -- "vanleer", "steger", "hlle", "lax_f". -// -- "roe", "modified_roe". +// -- "vanleer", "steger", "hlle", "lax_f", +// -- "roe", "modified_roe", // -- "ausm+", "ausm+w", "ausm+up", "ausmdv", "ausmpw", "ausmpw+". // isWennScheme: If using WENN Scheme of struct grid. -// 0 -- NO. (default) -// 1 -- Yes. +// 0 -- NO. (default) +// 1 -- Yes. // str_limiter_name: Limiter of struct grid. -// -- "vanalbada", "vanleer", "minmod", "smooth", "minvan", "3rdsmooth", "3rd_minmod_smooth". -// -- "nolim", no limiter. -// -- "vanalbada_clz", clz supersonic version. -// -- "weno3_js", "wenn3_prm211", "wenn3_zm", "wenn3_zes2", "wenn3_zes3" - +// -- "vanalbada", "vanleer", "minmod", "smooth", "minvan", "3rdsmooth", "3rd_minmod_smooth", +// -- "nolim", no limiter, +// -- "vanalbada_clz", clz supersonic version, +// -- "weno3_js", "wenn3_prm211", "wenn3_zm", "wenn3_zes2", "wenn3_zes3". string inviscidSchemeName = "roe"; int isWennScheme = 0; -string str_limiter_name = "vanalbada"; +string str_limiter_name = "vanalbada"; -#******************************************************************* -# UnStruct Solver or Common * -#******************************************************************* +#************************************************************************ +# UnStruct Solver or Common * +#************************************************************************ // viscousType: Viscous model. -// 0 -- Euler. -// 1 -- Lamilar. -// 2 -- Algebraic. -// 3 -- 1eq turbulent. -// 4 -- 2eq turbulent. +// 0 -- Euler. +// 1 -- Lamilar. +// 2 -- Algebraic. +// 3 -- 1eq turbulent. +// 4 -- 2eq turbulent. // viscousName: Laminar or tubulent model. // -- "0eq-bl". // -- "1eq-sa". @@ -410,16 +419,16 @@ string str_limiter_name = "vanalbada"; // 3 -- IDDES. // uns_scheme_name: Spatial discretisation scheme of Unstruct grid. // Using this when solve Unstructered grid or hybrid. -// -- "vanleer", "roe", "steger", "kfvs", "lax_f", "hlle". +// -- "vanleer", "roe", "GMRESRoe", "GMRESSteger", "steger", "kfvs", "lax_f", "hlle", // -- "ausm+", "ausmdv", "ausm+w", "ausmpw", "ausmpw+". // uns_limiter_name: Limiter of Unstruct grid. -// -- "barth", "vencat", "vanleer", "minmod". -// -- "vanalbada", "smooth", "nnd", "lpz", "1st". +// -- "barth", "vencat", "vanleer", "minmod", +// -- "vanalbada", "smooth", "nnd", "lpz", "1st", // -- "nolim", no limiter. // uns_vis_name: Discretisation method of viscous term. // -- "std", "test", "aver", "new1", "new2". // gradientName: Gradient reconstruction method. -// -- "default", "ggcell", "ggnode", "lsq". +// -- "default", "ggcell", "ggnode", "lsq". // ivencat: Variation of vencat limiter. // 0 -- org method, it is independent of grid scale. // 1 -- new method, it is dependent of grid scale. @@ -442,18 +451,18 @@ string str_limiter_name = "vanalbada"; // 3 -- Harten type, which is default used. // roeEntropyScale: Entropy fix (correction) coefficient scale, default is 1.0. // It is used to scale the default Roe entropy fix coefficients. -// AusmpwPlusLimiter: A Limiter to make "function w" not change acutely in AusmpwPlus scheme, default is 1.0 +// AusmpwPlusLimiter: A Limiter to make "function w" not change acutely in AusmpwPlus scheme, default is 1.0. -//int viscousType = 0; +//int viscousType = 0; //string viscousName = "Euler"; -//int viscousType = 1; +//int viscousType = 1; //string viscousName = "laminar"; -int viscousType = 3; +int viscousType = 3; string viscousName = "1eq-sa"; -//int viscousType = 4; +//int viscousType = 4; //string viscousName = "2eq-kw-menter-sst"; int DESType = 0; @@ -463,7 +472,7 @@ string uns_limiter_name = "vencat"; string uns_vis_name = "test"; string gradientName = "ggnode"; -int ivencat = 7; +int ivencat = 7; double venkatCoeff = 5.0; int reconmeth = 1; int limitVariables = 0; @@ -475,9 +484,9 @@ double roeEntropyScale = 1.0; double AusmpwPlusLimiter = 1.0; -//----------------------------------------------------------------------- -# Temporal Discretisation # -//----------------------------------------------------------------------- +#************************************************************************ +# Temporal Discretisation * +#************************************************************************ // iunsteady: Steady or unsteady. // 0 -- steady. // 1 -- unsteay. @@ -490,51 +499,57 @@ double AusmpwPlusLimiter = 1.0; // statisticalTimePeriod: Used as time period of statistic analysis. // when the value is negative, time period is treated as infinite. // statisticMethod: Statistic reynolds stress method. -// 0 -- tau = - ^2 -// 1 -- tau = +// 0 -- tau = - ^2 +// 1 -- tau = // min_sub_iter: The min sub iteration of unsteady simulation. // max_sub_iter: The max sub iteration of unsteady simulation. // tol_sub_iter: The tolerance of sub iteration of unsteady simulation. // tscheme: Temporal Discretisation method. -// 1 -- Runge-Kutta Multi-State. -// 2 -- Point implicit. -// 3 -- Full implicit. -// 4 -- LU-SGS. -// 5 -- Block LU-SGS. -// 6 -- Jacobian iteration. -// 7 -- Line LU-SGS. -// 8 -- Matrix LU-SGS. +// 1 -- Runge-Kutta Multi-State. +// 2 -- Point implicit. +// 3 -- Full implicit. +// 4 -- LU-SGS. +// 5 -- Block LU-SGS. +// 6 -- Jacobian iteration. +// 7 -- Line LU-SGS. +// 8 -- Matrix LU-SGS. +// 9 -- GMRES. // iSimplifyViscousTerm: Simplify the computation of viscous term in the Block LU-SGS method. The default value assigns 1 that could speed up the computation. // Otherwise, the viscous Jacobian matrix Mv should be computed that will increase the memory and time in iteration of the BLUSGS method. // CFLStart: Started cfl number. // CFLEnd: End cfl number. // CFLVaryStep: The number of step when cfl increase from CFLStart to CFLEnd. +// GMRESCFLScale : CFL = CFLStart * GMRESCFLScal^iteration. +// OriginalTscheme : Used for LUSGS and GMres hybrid computing. +// useLUSGSprecond: Initialize flow field for GMRES. +// 0 --Initialize by first order Jacobian matrix. +// 1 --Initialize by LUSGS. +// GMRESInitStep : the number of iteration step of irst order Jacobian matrix or LUSGS for initialize flow field. // ktmax: Dtratio. dt[i] = MIN(dt[i], ktmax * dtmin / vol[i]) // swapDq: Communication dq between forward/backward sweep of LUSGS or not, default is 0. // nLUSGSSweeps: Sub iteration of LU-SGS or Block LU-SGS. // LUSGSTolerance: Sub iter tolerance of LU-SGS or Block LU-SGS. // ifLocalTimeStep: Time step method. -// 0 --Local. -// 1 --Global. +// 0 --Local. +// 1 --Global. // isUseLocalCFL: use variable number of CFL or not. -// 0 -- global unified CFL number. -// 1 -- local CFL number. +// 0 -- global unified CFL number. +// 1 -- local CFL number. // isUsePreTwall: use the previous temperatures on wall. 1 indicates yes, and 0 indicates no. // visl_min: Minimum value of laminar viscosity coefficient. // turbCFLScale: Turbulence model cfl number factor. // codeOfAleModel: Arbitrary Lagrangian-Eulerian method. -// 0 -- no ALE method. -// 1 -- ALE method for non-moving grids. -// 2 -- ALE method for moving grids. -// 3 -- ALE method for deforming grids. +// 0 -- no ALE method. +// 1 -- ALE method for non-moving grids. +// 2 -- ALE method for moving grids. +// 3 -- ALE method for deforming grids. // wallFunctionType: The type of wall function to implement. -// 0 -- no wall function. (default) -// 1 -- standard wall function. -// 2 -- Pab3D wall function. +// 0 -- no wall function. (default) +// 1 -- standard wall function. +// 2 -- Pab3D wall function. // RKStage: The number of Runge-Kutta step. // lamda: Cofficient of Runge-Kutta step. - -int iunsteady = 0; +int iunsteady = 0; double physicalTimeStep = 0.01; double physicalTimeStepDimensional = -0.001; int ifStartFromSteadyResults = 0; @@ -543,39 +558,42 @@ int ifStaticsReynoldsStress = 0; int startStatisticStep = 800000; double statisticalTimePeriod = -1.0; int statisticMethod = 0; -int linearTwoStepMethods = 1; // 1--BDF1; 2--C-N; 3--BDF2; +int linearTwoStepMethods = 1; // 1--BDF1; 2--C-N; 3--BDF2. int methodOfDualTime = 3; int min_sub_iter = 50; int max_sub_iter = 50; double tol_sub_iter = 0.01; -int tscheme = 4; +int tscheme = 4; int iSimplifyViscousTerm = 1; int ifLocalTimeStep = 0; int isUseLocalCFL = 0; int isUsePreTwall = 0; -double CFLStart = 0.01; -double CFLEnd = 10.0; -int CFLVaryStep = 500; - +double CFLStart = 0.01; +double CFLEnd = 10.0; +int CFLVaryStep = 500; +double GMRESCFLScale = 1.0; +int OriginalTscheme = 9; +int useLUSGSprecond = 1; +int GMRESInitStep = 1000; double pMaxForCFL = 0.2; double pMinForCFL = 0.1; double deltaMaxForCFL = 0.2; double magnifyFactorForCFL = 1.1; double reduceFactorForCFL = 0.5; -double ktmax = 1.0e10; +double ktmax = 1.0e10; -int swapDq = 1; +int swapDq = 1; int nLUSGSSweeps = 1; double LUSGSTolerance = 0.01; -int order = 2; +int order = 2; double visl_min = 0.01; double turbCFLScale = 1.0; -double csrv = 2.0; +double csrv = 1.0; double timemax = 1.0e10; double dtsave = -1.0; int maxale = 10; @@ -591,10 +609,9 @@ double lamda[] = [0.5, 1.0]; //int RKStage = 4; //double lamda[] = [0.25, 0.33333333333, 0.5, 1.0]; - -//----------------------------------------------------------------------- -# File In or Out # -//----------------------------------------------------------------------- +#************************************************************************ +# File In or Out * +#************************************************************************ // numberOfGridGroups: The number of grid groups. // gridfile: The partitioned Grid file path, using relative path, // which is relative to the working directory. @@ -611,20 +628,18 @@ double lamda[] = [0.5, 1.0]; // aircoeffile: The file path to save the aerodynamic force coefficients convergence process, write data for every default (intervalStepForce) steps. // restartNSFile: The file path to write restart flowfield variables, write data for every default (intervalStepFlow) steps. // turbfile: The file path to write restart flowfield variables of turbulence , write data for every default(intervalStepFlow) steps. -// visualfile: The visualization file path of flowfield , write data for every default (intervalStepPlot) steps. +// visualfile: The visualization file path of flowfield, write data for every default (intervalStepPlot) steps. // wall_aircoefile: The file path to save flowfield variables of wall, write data for every default steps. // nDumpSurfaceInfo = 0 the "wall_varfile" write the informations including heat flux. // nDumpSurfaceInfo = 1 the "wall_varfile" write the informations without heat flux. // nIsComputeWallDist: Whether to compute the wall distance. // 0 -- Compute wall distance. // 1 -- Not compute. -// -// protectionFile0 and protectionFile1 : Two continuation file of the data protection mechanism. -// wall_heatfluxfile : The file to output the MaxHeatFlux of wall. - -int numberOfGridGroups = 1; -string gridfile = "./grid/rae2822_hybrid2d__4.fts"; -string wallTemperaturefile= ""; +// protectionFile0 and protectionFile1: Two continuation file of the data protection mechanism. +// wall_heatfluxfile: The file to output the MaxHeatFlux of wall. +int numberOfGridGroups = 1; +string gridfile = "./grid/rae2822_hybrid2d__4.fts"; +string wallTemperaturefile = ""; int nIsComputeWallDist = 0; int walldistMethod = 1; @@ -632,10 +647,12 @@ int cellMethodOrNodeMethod = 0; string resSaveFile = "results/res.dat"; string turbresfile = "results/turbres.dat"; +string transitionResFile = "results/transitionRes.dat"; string aircoeffile = "results/aircoef.dat"; string restartNSFile = "results/flow.dat"; string turbfile = "results/turb.dat"; +string transitionFile = "results/transition.dat"; string visualfile = "results/tecflow.plt"; string wall_aircoefile = "results/wall_aircoef.dat"; @@ -645,10 +662,14 @@ string protectionFile0 = "results/flow0.dat"; string protectionFile1 = "results/flow1.dat"; string wall_heatfluxfile = "results/wall_heatflux.dat"; -int nDumpSurfaceInfo = 0; -string wall_varfile = ""; +string protectionTurbFile0 = "results/turb0.dat"; +string protectionTurbFile1 = "results/turb1.dat"; -string jetDefineFile = "bin/jet.hypara"; +string protectionTransitionFile0 = "results/transition0.dat"; +string protectionTransitionFile1 = "results/transition1.dat"; + +int nDumpSurfaceInfo = 0; +string wall_varfile = ""; string sixDofFileName = "results/sixDofInfo.dat"; string derivativeFileName = "results/identify.dat"; @@ -659,7 +680,8 @@ int plotFieldType = 0; // visualfileType: The file type of visualfile. // 0 -- Tecplot binary. // 1 -- Tecplot ASCII. - +// 2 -- Ensight binary. +// 3 -- Ensight ASCII. int visualfileType = 1; // samplefileMode: The dump mode of sample file. @@ -697,21 +719,21 @@ double upperPlotFieldBox[] = [1.0 1.0 1.0]; // -- vibration temperature(Tv, 33), electron temperature(Te, 34), vibrational energy(Ev, 35), electric energy(Ee, 36), // -- number density of electron(Ne, 37), dimensioanl density(rho, 38), dimensioanl pressure(p, 39), dimensioanl temperature(T, 40), // -- gradientUx(41), gradientUy(42), gradientVx(43), gradientVy(44), streamline_u(45), streamline_v(46), streamline_w(47), -// -- transition intermittency(intermittency, 51), -transition momentum thickness reynolds(MomentumThicknessReynolds, 52), -// -- overlap iblank(iblank, 81) - -// -- specific heat ratio(gama, 56) +// -- transition intermittency(intermittency, 51), transition momentum thickness reynolds(MomentumThicknessReynolds, 52), +// -- local CFL Number(localCFL, 57), minimal CFL Number(minCFL, 58), +// -- overlap iblank(iblank, 81), +// -- specific heat ratio(gama, 56), Knudsen number(kn, 60), Damkohler number(Da, 61), vibrational nonequilibrium number(Vi, 62). // Important Warning: Array size of visualVariables MUST be equal to nVisualVariables!!! // Variables order must from small to big. //-----------the optional parameters list for the wall boundary condition---------------- // nVisualWallVariables: The number of visual variables on wall. // visualWallVariables : dumped variable types, listed as following: -// -coefficient of pressure(cp, 0), -coefficient of friction(cf, 1), yplus(2), -non-dimensional heat flux(Q_NonDim, 3), -dimensional heat flux(Q_Dim, 4), -// -pressure on wall(pw, 5), -temperature on wall(Tw, 6), -density on wall(rhow, 7), -heat flux of translational-rotational temperature term(Qtr, 8), -// -heat flux of species diffusion term(Qs, 9), -heat flux of vibrational temperature term(Qv, 10), -heat flux of electron temperature term(Qe, 11), -// -species mass fractions(Ns, 12), -x component of wall velocity(Vx, 13), -y component of wall velocity(Vy, 14), -z component of wall velocity(Vz, 15) -// -slip translational-rotational temperature(Tts, 16), -slip vibrational temperature(Tvs, 17), -slip electron temperature(Tes, 18), -absolute wall velocity(Vs, 19) -// -Stanton number(St, 20), -coefficient of heat rate(Ch, 21), -temperature jump(deltaT, 22), -Grid Reynolds number on wall(Re_w, 23) +// -- coefficient of pressure(cp, 0), coefficient of friction(cf, 1), yplus(2), non-dimensional heat flux(Q_NonDim, 3), dimensional heat flux(Q_Dim, 4), +// -- pressure on wall(pw, 5), temperature on wall(Tw, 6), density on wall(rhow, 7), heat flux of translational-rotational temperature term(Qtr, 8), +// -- heat flux of species diffusion term(Qs, 9), heat flux of vibrational temperature term(Qv, 10), heat flux of electron temperature term(Qe, 11), +// -- species mass fractions(Ns, 12), x component of wall velocity(Vx, 13), y component of wall velocity(Vy, 14), z component of wall velocity(Vz, 15), +// -- slip translational-rotational temperature(Tts, 16), slip vibrational temperature(Tvs, 17), slip electron temperature(Tes, 18), absolute wall velocity(Vs, 19), +// -- Stanton number(St, 20), coefficient of heat rate(Ch, 21), temperature jump(deltaT, 22), Grid Reynolds number on wall(Re_w, 23), Knudsen number(Kn_wall, 24). int nVisualVariables = 8; int visualVariables[] = [0, 1, 2, 3, 4, 5, 6, 15]; @@ -739,16 +761,18 @@ int dumpStandardModel = 0; // 1 -- Real cell where the probe is located. // nProbeVariables: Number of variables want to be dumped for probes monitered. // probeVariables : Variable types dumped, listed as following: -// -- density(0), u(1), v(2), w(3), pressure(4), temperature(5), mach(6). +// -- density(0), u(1), v(2), w(3), pressure(4), temperature(5), mach(6), +// -- dimensioanl_density(7), dimensioanl_u(8), dimensioanl_v(9), +// -- dimensioanl_w(10), dimensioanl_pressure(11), dimensioanl_temperature(12). // Important Warning: Array size of probeVariables MUST be equal to nProbeVariables!!! // probeVariables order must from small to big. // probeVariablesInterpolationMethod: Interpolation method used to compute the probe variables. -// 0 -- Take the value of probe's cell as probe real value. -// 1 -- Interpolation from probe's and neighbouring cell to probe. -// 2 -- Interpolation from probe's cell nodes to probe. +// 0 -- Take the value of probe's cell as probe real value. +// 1 -- Interpolation from probe's and neighbouring cell to probe. +// 2 -- Interpolation from probe's cell nodes to probe. int ifSetDataMonitor = 0; -int dataMonitorType = 0; +int dataMonitorType = 0; string probesDefineFile = "bin/probes_XYZ.dat"; //int dataMonitorType = 1; @@ -761,28 +785,26 @@ string probesDefineFile = "bin/probes_XYZ.dat"; int searchCellsMethod = 0; -int nProbeVariables = 7; -int probeVariables[] = [0, 1, 2, 3, 4, 5, 6]; -int probeVariablesInterpolationMethod = 0; -//----------------------------------------------------------------------- -# Turbulence Parameter # -//----------------------------------------------------------------------- +int nProbeVariables = 14; +int probeVariables[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]; +int probeVariablesInterpolationMethod = 0; + +#************************************************************************ +# Turbulence Parameter * +#************************************************************************ // turbInterval: Iteration number of turbulence. // kindOfTurbSource: Kinds of turbulent source. // 0 -- Original. // mod_turb_res: If modify the residuals for the cells next to the wall or not, default is 0. -// transitionType: transition model type +// transitionType: transition model type // 0 -- none. // 2 -- gama-re-theta. -// turbIntensity: (valid while greater than 0.0 ) turbulent intensity of free stream(*100) in transition -// freeturbIntensitySRModify: to use SR modify in free stream turbulent intensity decay or not - - +// turbIntensity: (valid while greater than 0.0 ) turbulent intensity of free stream(*100) in transition. +// freeturbIntensitySRModify: to use SR modify in free stream turbulent intensity decay or not. int turbInterval = 1; int turbOrderStruct = 2; int kindOfTurbSource = 0; int mod_turb_res = 0; -double turb_relax = 1.0; double freeStreamViscosity = 1.0e-3; double muoo = 3.0; double kwoo = 5.0; @@ -790,29 +812,28 @@ int transitionType = 0; double turbIntensity = -1.0; int freeturbIntensitySRModify = 0; double freeDecayXLocation = 0.0; -int compressibleCorrection = 0; -int prandtlNumberCorrection = 0; +int compressibleCorrection = 0; int transitionMaFix = 1; -# maximum eddy viscosity (myt/my) max. +// maximum eddy viscosity (myt/my) max. double eddyViscosityLimit = 1.0e10; int monitor_vistmax = 0; -//----------------------------------------------------------------------- -# LES Parameter # -//----------------------------------------------------------------------- +#************************************************************************ +# LES Parameter * +#************************************************************************ // iLES: Create LESSolver or not. -// = 1 - Create LESSolver; -// != 1 - not. +// = 1 -- Create LESSolver; +// != 1 -- not. // amplitudeofDisturb: Amplitude of adding disturb. // disturbstep: Unsteady time step or steady iteration of adding random disturb. // iterdisturb: Add random disturb in every sub-iter or only first sub-iter. -// = 0 - in only first sub-iter; -// != 0 - in every sub-iter. +// = 0 -- in only first sub-iter; +// != 0 -- in every sub-iter. // ipraddisturb: Add density and pressure disturb or not. // ibodyforce: Add body force in source flux of NS equations or not. -// = 0 - not; -// != 0 - Add body force. +// = 0 -- not; +// != 0 -- Add body force. // bodyforce: Body force in source flux of NS equations or not. // utau: friction velocity, using in DNSDisturb. // sgsmodel: subgrid scale model. @@ -820,23 +841,22 @@ int monitor_vistmax = 0; // = "dsmCom"; // = "wale"; // = "sigma". -// deltaFunctionType: = 1 - MAX(deltai, deltaj, deltak); -// = 2 - pow(deltai * deltaj *deltak, 1/3); -// = 3 - Devloped by Scotti. -// wallDampingFunctionType: = 0 - no wall function; -// = 1 - van Driest; -// = 2 - developed by Dr. Deng Xiaobing; -// = 3 - developed by Piomelli. +// deltaFunctionType: = 1 -- MAX(deltai, deltaj, deltak); +// = 2 -- pow(deltai * deltaj *deltak, 1/3); +// = 3 -- Devloped by Scotti. +// wallDampingFunctionType: = 0 -- no wall function; +// = 1 -- van Driest; +// = 2 -- developed by Dr. Deng Xiaobing; +// = 3 -- developed by Piomelli. // turbViscousCutType: turbulent viscosity cut type. -// = 0 - mu_total = mut + mul; -// = 1 - mu_total = max(mut-mul,0)+ mul; -// = 2 - mu_total = max(mut ,0)+ mul. +// = 0 -- mu_total = mut + mul; +// = 1 -- mu_total = max(mut-mul, 0) + mul; +// = 2 -- mu_total = max(mut , 0) + mul. // smagConstant: constant of smagorinsky model. // waleConstant: constant of wale model. -// filterDirection[3]: filter variables in i, j, k direction or not. +// filterDirection [3]: filter variables in i, j, k direction or not. // averageDirection[3]: average variables in i, j, k direction or not. // isotropicConstant: constant of isotropic part of SGS stress. - int iLES = 0; string sgsmodel = "smagorinsky"; int deltaFunctionType = 2; @@ -852,19 +872,16 @@ double testFilterScale = 2.0; int averageWidth = 1; int monitorNegativeConstant = 0; -//----------------------------------------------------------------------- -# Other Parameters for Hypersonic Non-equilibrium Gas # -//----------------------------------------------------------------------- +#************************************************************************ +# Other Parameters for Hypersonic Non-equilibrium Gas * +#************************************************************************ // dg_high_order: // 0 -- generic order accuracy. // 1 -- high order accuracy. // iapplication: // 0 -- gas model is fixed in the codes. // 1 -- gas model is imported from library files. -// isAdaptiveSolver: isAdaptiveSolver=0 indicates the generic Navier-Stokes solver, -// isAdaptiveSolver>0 indicates the HyFlow self-adaptive solver. -// 1 -- using HyFlow self-adaptive solver where the switch is controlled by the total iteration steps. -// 2 -- using HyFlow self-adaptive solver where the switch is controlled by variation of the key residual. +// isAdaptiveSolver: isAdaptiveSolver = 0 indicates the generic Navier-Stokes solver, // nm: Equation number of the physics, but is out of commision now. // 4 -- for 2D. // 5 -- for 3D. @@ -875,7 +892,7 @@ int monitorNegativeConstant = 0; // 2 -- Argon. // 3 -- Nitrogen. // nEnergyRecycle: The type of EnergyModel Recycle. -// 0 -- not used . +// 0 -- not used. // 1 -- used. // nDensityModify: The type of densitymodify. // 0 -- not used. @@ -883,26 +900,25 @@ int monitorNegativeConstant = 0; // nchem: // 0 -- without chemical reaction flow. // 1 -- the chemical reaction flow is considered. -// nEquilibriumGas: the variable is valid when the condition of nchem=0 is satisfied. +// nEquilibriumGas: the variable is valid when the condition of nchem = 0 is satisfied. // 0 -- perfect gas. // 5, 7, 11 -- equilibrium gas, meanwhile, its value denotes the number of gas component. -// nPCWCycleStep: the maximum step number of iteration in the module of computing species mass fractions with the partial catalytic wall(PCW) condition. -// the value equals to or is greater than 1, and 3 is for default value. -// nRETCycleStep: the maximum step number of iteration in the module of computing radiation equilibrium temperature on wall. -// the value equals to or is greater than 1, and 3 is for default value. -// nSLIPCycleStep:the maximum step number of iteration in the module of computing slip temperature, slip velocity and slip species mass fraction. -// the value equals to or is greater than 1, and 3 is for default value. -// nSlipBCModel : The computational model of slip boundary conditions. - -// 0 -- no slip. -// 1 -- the conventional Maxwell slip conditions. -// 2 -- the Gokcen slip conditions. -// 3 -- the Knudsen-layer correction of the standard slip conditions proposed by Lockerby, et al. -// 4 -- the Kogan simplified slip conditions. -// nMeanFreePathType : the method to the mean free-path for the slip conditions. For the mixture, 0 is suggested. -// 0 -- the equivalent mean free-path is calculated by the simple hard sphere model(HS). -// 1 -- calculated by the definition that includes the variables of the number density and the molecule diameter. -// 2 -- the equivalent mean free-path is calculated by the variable hard sphere model(VHS). +// nPCWCycleStep: The maximum step number of iteration in the module of computing species mass fractions with the partial catalytic wall(PCW) condition. +// The value equals to or is greater than 1, and 3 is for default value. +// nRETCycleStep: The maximum step number of iteration in the module of computing radiation equilibrium temperature on wall. +// The value equals to or is greater than 1, and 3 is for default value. +// nSLIPCycleStep:The maximum step number of iteration in the module of computing slip temperature, slip velocity and slip species mass fraction. +// The value equals to or is greater than 1, and 3 is for default value. +// nSlipBCModel: The computational model of slip boundary conditions. +// 0 -- no slip. +// 1 -- the conventional Maxwell slip conditions. +// 2 -- the Gokcen slip conditions. +// 3 -- the Knudsen-layer correction of the standard slip conditions proposed by Lockerby, et al. +// 4 -- the Kogan simplified slip conditions. +// nMeanFreePathType: the method to the mean free-path for the slip conditions. For the mixture, 0 is suggested. +// 0 -- the equivalent mean free-path is calculated by the simple hard sphere model(HS). +// 1 -- calculated by the definition that includes the variables of the number density and the molecule diameter. +// 2 -- the equivalent mean free-path is calculated by the variable hard sphere model(VHS). // nchemsrc: // 0 -- the source terms are not computed. // 1 -- the source terms are computed. @@ -913,148 +929,151 @@ int monitorNegativeConstant = 0; // 1 -- One-temperature model. // 2 -- Two-temperature model. // 3 -- Three-temperature model. +// isUseNoneqCond: +// 0 -- compute the source terms without any conditions. +// 1 -- compute the source terms using the non-equilibrium condition. +// frozenCondition: the threshold value of frozen chemical flow condition, 0.1 is the default value. // nIdealState: whether take all gas species as ideal gas for gas-mixture process. // 0 -- No. -// 1 -- Yes. -// nTEnergyModel: the method to computing temperature energy model. +// 1 -- Yes. // nTEnergyModel: the method to computing temperature energy model. // 0 -- the energy term is computed using the conventional method. // 1 -- the energy term is computed using the polynomial fitting method. // 2 -- the energy term is computed using the piecewise polynomial fitting method. // parkVDPower: the power of translational-rotational temperature in the Park V-D(vibration-dissociation) coupling model. // The value is in range of [0.0, 1.0], DPLR suggests 0.5, LAURA suggests 0.7, while 0.6 is given as default value. // catalyticCoef: -// 0.0 -- full non-catalytic wall boundary condition. -// 1.0 -- full catalytic wall boundary condition. -// in range of (0.0, 1.0) -- partial catalytic condition, the value indicates the catalytic coefficient. -// nIsSuperCatalytic : the super catalytic condition for the fully catalytic wall, and assigned with the value of 1. -// 0 -- equilibrium condition for the fully catalytic wall where the mass fractions are assigned with the values of the free stream. -// 1 -- super catalytic condition for the fully catalytic wall where all the atomic components combine into molecular components. -// nTemperatureJump : the method to calculate the temperature jump. -// 0 -- calculated by the variables of heat conductivity and constant volume specific heat for each energy mode. -// 1 -- the general method where the iteration is calculated with the translation-rotation temperature. -// nSurfGradMethod : the method to compute the surface heating ratio. -// 0 -- the gradient of variable is computed with the first-order difference method. -// 1 -- the gradient of variable is computed with the Green-Guass integral method. -// nRapidFlowfield : initialize the flowfield using the rapid engineering method when it is greater than zero. -// nSurfHeatMonitor : To exam the surface heating change or not. 0 is no, 1 is yes. -// nInitPressureStep : the steps to initialize the boundary variables when the rapid method is used. 100 is the default value. -// nDumpCFLNumber : 1 indicates dumping the CFL number to file, 0 denotes no dumping. +// 0.0 -- full non-catalytic wall boundary condition. +// 1.0 -- full catalytic wall boundary condition. +// in range of (0.0, 1.0) -- partial catalytic condition, the value indicates the catalytic coefficient. +// nIsSuperCatalytic: the super catalytic condition for the fully catalytic wall, and assigned with the value of 1. +// 0 -- equilibrium condition for the fully catalytic wall where the mass fractions are assigned with the values of the free stream. +// 1 -- super catalytic condition for the fully catalytic wall where all the atomic components combine into molecular components. +// nTemperatureJump: the method to calculate the temperature jump. +// 0 -- calculated by the variables of heat conductivity and constant volume specific heat for each energy mode. +// 1 -- the general method where the iteration is calculated with the translation-rotation temperature. +// nSurfGradMethod: the method to compute the surface heating ratio. +// 0 -- the gradient of variable is computed with the first-order difference method. +// 1 -- the gradient of variable is computed with the Green-Guass integral method. +// nRapidFlowfield: initialize the flowfield using the rapid engineering method when it is greater than zero. +// nSurfHeatMonitor: To exam the surface heating change or not. 0 is no, 1 is yes. +// nInitPressureStep: the steps to initialize the boundary variables when the rapid method is used. 100 is the default value. +// nDumpCFLNumber: 1 indicates dumping the CFL number to file, 0 denotes no dumping. // sigmaVelocity: the coordination coefficient of tangential momentum for computation of slip velocity. The value is in range of (0.0, 2.0]. // sigmaTemperature: the heat coordination coefficient for computation of slip temperature. The value is in range of (0.0, 2.0]. // sigmaMassFraction: the species coordination coefficient for computation of slip mass fractions. The value is in range of (0.0, 2.0]. // velocitySlipCorrectConstant: the correction constant to the velocity slip condition. For the diffuse reflection, 1.0 is used. -// 1.0 -- proposed by Maxwell. -// sqrt(2/PI)~0.8 -- used for "micro-slip", namely the actual velocity slip at the wall. -// 1.146 -- proposed for an additional "fictitious" velocity slip. - -// chemicalRelaxCorf: The value is in range of [0.001, 1.0]. -// spectrumRadiusCoef: The value is in range of [0.0, 2.0]. -// staticPressureRelaxCorf: The value is in range of [0.1, 1.0]. -// nIsChemicalFreeze : the flag to freeze the chemical reactions. -// 0 -- not freeze, the chemical reaction sources will be calculated. -// 1 -- freezes the chemical reactions, the chemical reaction sources will not be calculated.// veTemperatureMin: The minimum of Tv and Te - -//maxViscous: the maximum of Viscous. -//trTemperatureMin: the minimum value of trTemperature. -//veTemperatureMin: the minimum value of veTemperature. -//densityMin: the minimum value of density. -//tAdjustmentFactor: magnification of temperature, this value is in range of (1.0, 10.0]. -// nDebug: cout the Wrong place and abort -// 0 -- not used. -// 1 -- used. +// 1.0 -- proposed by Maxwell. +// sqrt(2/PI)~0.8 -- used for "micro-slip", namely the actual velocity slip at the wall. +// 1.146 -- proposed for an additional "fictitious" velocity slip. +// chemicalRelaxCorf: The value is in range of [0.001, 1.0]. +// spectrumRadiusCoef: The value is in range of [0.0, 2.0]. +// staticPressureRelaxCorf: The value is in range of [0.1, 1.0]. +// nIsChemicalFreeze: the flag to freeze the chemical reactions. +// 0 -- not freeze, the chemical reaction sources will be calculated. +// 1 -- freezes the chemical reactions, the chemical reaction sources will not be calculated. +// veTemperatureMin: The minimum of Tv and Te. +// maxViscous: the maximum of Viscous. +// trTemperatureMin: the minimum value of trTemperature. +// veTemperatureMin: the minimum value of veTemperature. +// densityMin: the minimum value of density. +// tAdjustmentFactor: magnification of temperature, this value is in range of (1.0, 10.0]. +// nDebug: cout the Wrong place and abort +// 0 -- not used. +// 1 -- used. // nSpeciesLimit: limitter of gas species -// 0 -- not used. -// 1 -- used. -// nTurblenceForChemical: the coupled mode of Turblence and Chemical reaction -// 0 -- method 0. -// 1 -- method 1. -// nViscosityFluxSublevelModified: Modified for ViscosityFlux on Sublevel grid -// 0 -- not used. -// 1 -- used. -// nViscosityPeModified: Pe Modified for ViscosityCoef -// 0 -- not used. -// 1 -- used. -// nChemcalSourceModified: Modified on ChemcalSource -// 0 -- not used. -// 1 -- used. -// nChemcalSourceEsMethod: Modified on ChemcalSource -// 0 -- approximation algorithm 1 (Ori.) -// 1 -- approximation algorithm 2 (New) - +// 0 -- not used. +// 1 -- used. +// nTurblenceForChemical: the coupled mode of Turblence and Chemical reaction. +// 0 -- method 0. +// 1 -- method 1. +// nViscosityFluxSublevelModified: Modified for ViscosityFlux on Sublevel grid. +// 0 -- not used. +// 1 -- used. +// nViscosityPeModified: Pe Modified for ViscosityCoef. +// 0 -- not used. +// 1 -- used. +// nChemcalSourceModified: Modified on ChemcalSource. +// 0 -- not used. +// 1 -- used. +// nChemcalSourceEsMethod: Modified on ChemcalSource. +// 0 -- approximation algorithm 1 (Ori). +// 1 -- approximation algorithm 2 (New). // nMaxStepTemperature: the iterative steps of temperature. - -// veTemperatureMinModified: Modified on the minimum of Tve for Cvvs -// 0 -- not used -// 1 -- used - -// nDiagonalModified: Modified on Diagonal -// 0 -- not used -// 1 -- Ori. -// 2 -- new - -//nGradPrimtiveMethod: -// 0 -- Ori. -// 1 -- new +// veTemperatureMinModified: Modified on the minimum of Tve for Cvvs. +// 0 -- not used. +// 1 -- used. +// nDiagonalModified: Modified on Diagonal. +// 0 -- not used. +// 1 -- new. +// nDiagonalModifiedTurb: Modified on Diagonal for turbulence. +// 0 -- not used. +// 1 -- new. +// nGradPrimtiveMethod: +// 0 -- Ori. +// 1 -- new. // nAblation: -// 0 -- The wall ablation is not computed. -// 1 -- The wall ablation is computed. +// 0 -- The wall ablation is not computed. +// 1 -- The wall ablation is computed. // isInjection: -// 0 -- The injection velocity of ablation wall is not computed. -// 1 -- The injection velocity of ablation wall is computed. +// 0 -- The injection velocity of ablation wall is not computed. +// 1 -- The injection velocity of ablation wall is computed. // nViscosityModel: -// 0 -- Blottner fitting method(N89). -// 1 -- Gupta fitting method(N90). +// 0 -- Blottner fitting method(N89). +// 1 -- Gupta fitting method(N90). // nContinueModel: The new continue model can switch different computation model. -// 0 -- Not use the new continue model. -// 1 -- use the new continue model. +// 0 -- Not use the new continue model. +// 1 -- use the new continue model. // nSutherland: -// 0 -- stands for selecting the Blotter curve fits mode. -// 1 -- stands for Sutherland relation. +// 0 -- stands for selecting the Blotter curve fits mode. +// 1 -- stands for Sutherland relation. // gasfile: Indicates the gas model, 9 models are provided, namely "Gu5", "Gu7", "Gu11", "Pa5", "Pa7", "Pa11", "DK5", "DK7", "DK11". -// "Gu" -- indicates the Gupta Model, three-Type Models are embeded in the library, namely, the 5-species-6-reactions, the 7-species-9-reactions, the 11-species-20-reactions. -// "Pa" -- indicates the Park Model, three-Type Models are embeded in the library, namely, the 5-species-17-reactions, the 7-species-22-reactions, the 11-species-48-reactions. -// "DK" -- indicates the Dunn-Kang Model, three-Type Models are embeded in the library, namely, the 5-species-11-reactions, the 7-species-15-reactions, the 11-species-26-reactions. -// "Mars-Pa8" is for Park model of Mars gas, "Mars-Mc8" for McKenzie model of Mars gas. -// "Combustion-12" -- indicates the Combustion Chamber Gas Model which includes 12-species-20-reactions. -// "Gas-Mixture" -- indicates the process of mixing gas without reacting. -// for struct solver mixing two speciesSpeciesA, SpeciesB. -// for unstruct solver mixing multi-speciesO2 NO CO CO2 H2 N2 Air CH4. -// For self-definition model, the gasfile is used to indicate the file path of the new gas model. +// "Gu" -- indicates the Gupta Model, three-Type Models are embeded in the library, namely, the 5-species-6-reactions, the 7-species-9-reactions, the 11-species-20-reactions. +// "Pa" -- indicates the Park Model, three-Type Models are embeded in the library, namely, the 5-species-17-reactions, the 7-species-22-reactions, the 11-species-48-reactions. +// "DK" -- indicates the Dunn-Kang Model, three-Type Models are embeded in the library, namely, the 5-species-11-reactions, the 7-species-15-reactions, the 11-species-26-reactions. +// "Mars-Pa8" is for Park model of Mars gas, "Mars-Mc8" for McKenzie model of Mars gas. +// "Combustion-12" -- indicates the Combustion Chamber Gas Model which includes 12-species-20-reactions. +// "Gas-Mixture" -- indicates the process of mixing gas without reacting. +// for struct solver mixing two species��SpeciesA, SpeciesB��. +// for unstruct solver mixing multi-species��O2 NO CO CO2 H2 N2 Air CH4��. +// For self-definition model, the gasfile is used to indicate the file path of the new gas model. // speciesName: Used to list the names of each species, while each species name is separated by the symbol of comma. // initMassFraction: Used to list the initial mass fractions of species in accordance with the sequence of names in the parameter speciesName. // ifStartFromPerfectGasResults: The chemical reaction simulation is start from perfect gas flowfield or not, 0 is for no and else is for yes. -// nIterFirstStep : the maximum number of iteration in the first step for the self-adaptive calculation. -// nIterSecondStep : the maximum number of iteration in the second step for the self-adaptive calculation. -// nIterThirdStep : the maximum number of iteration in the third step for the self-adaptive calculation. -// nEnergyAssembly : the vibration energy is computed with combined method which includes the fitting method and the molecular kinetic theory. -// 0 -- no, -// 1 -- yes. +// nIterFirstStep : the maximum number of iteration in the first step for the self-adaptive calculation. +// nIterSecondStep: the maximum number of iteration in the second step for the self-adaptive calculation. +// nIterThirdStep : the maximum number of iteration in the third step for the self-adaptive calculation. +// nEnergyAssembly: the vibration energy is computed with combined method which includes the fitting method and the molecular kinetic theory. +// 0 -- no, +// 1 -- yes. // nControlVariable: the variable to computing the residual error that determines the convergence is meet or not in the one-temperature model. -// 0 -- the density. -// 1 -- the translation temperature. -// 2 -- the vibration temperature. -// 3 -- the electron temperature. -// 4 -- the pressure. -// 5 -- the mass fraction of oxygen. -// 6 -- the mass fraction of nitrogen. +// 0 -- the density. +// 1 -- the translation temperature. +// 2 -- the vibration temperature. +// 3 -- the electron temperature. +// 4 -- the pressure. +// 5 -- the mass fraction of oxygen. +// 6 -- the mass fraction of nitrogen. // firstStepError : the residual error of the first step iteration for the self-adaptive calculation. // secondStepError : the residual error of the second step iteration for the self-adaptive calculation. // thirdStepError : the residual error of the third step iteration for the self-adaptive calculation. -// useHyflowSetting : Setting for HyFLOW GUI. -// 0 -- PHengLEI -// 1 -- HyFLOW -// nProtectData : Use the continuation file data protection mechanism. -// 0 -- no -// 1 -- yes - +// nProtectData: Use the continuation file data protection mechanism. +// 0 -- no. +// 1 -- yes. +// nTvChange: Judge whether the Tv equals Ttr. +// 0 -- yes. +// 1 -- no. +// isMoleFractionType: 1 indicates the mass fractions, or else the mole fractions. +// nFraction: the initial fractions type of species. +// 0 -- mass fraction. +// 1 -- mole fraction. int dg_high_order = 0; int iapplication = 0; int isAdaptiveSolver = 0; -int nm = 5; +int nm = 5; int nEquilibriumGas = 0; -int nPCWCycleStep = 3; -int nRETCycleStep = 3; -int nSLIPCycleStep= 3; +int nPCWCycleStep = 3; +int nRETCycleStep = 3; +int nSLIPCycleStep = 3; int nIterFirstStep = 1000; int nIterSecondStep= 2000; int nIterThirdStep = 2000; @@ -1065,17 +1084,17 @@ double secondStepError = 0.001; double thirdStepError = 0.001; double predictCFLError = 0.1; -double refGama = 1.4; -double prl = 0.72; -double prt = 0.90; -double sc_l = 0.5; -double sc_t = 0.5; +double refGama = 1.4; +double prl = 0.72; +double prt = 0.90; +double sc_l = 0.5; +double sc_t = 0.5; -int nGasModel = 0; -int nchem = 0; -int nchemsrc = 1; -int nchemrad = 1; -int ntmodel = 1; +int nGasModel = 0; +int nchem = 0; +int nchemsrc = 1; +int nchemrad = 1; +int ntmodel = 1; int nIdealState = 0; int nEnergyRecycle = 1; @@ -1099,12 +1118,12 @@ double sigmaTemperature = 1.0; double sigmaMassFraction = 1.0; double velocitySlipCorrectConstant = 1.0; -double chemicalRelaxCorf = 1.0; +double chemicalRelaxCorf = 1.0; double chemicalSpectrumRadiusCoef = 1.0; double viscousSpectrumRadiusCoef = 1.5; double inviscidSpectrumRadiusCoef = 1.5; -double spectrumRadiusCoef = 0.5; -double staticPressureRelaxCorf = 0.2; +double spectrumRadiusCoef = 0.5; +double staticPressureRelaxCorf = 0.2; double maxViscous = 10000.0; double trTemperatureMin = 10.0; @@ -1114,31 +1133,35 @@ double densityMin = 1.0e-8; double densityMinFactor = 0.1; double tAdjustmentFactor = 10.0; double iniSpeedCoef = 1.0; +int iniSpeedMode = 0; -int nDebug = 0; -int nSpeciesLimit = 1; -int nTurblenceForChemical = 0; -int nViscosityFluxSublevelModified = 1; -int nViscosityPeModified = 0; -int nChemcalSourceModified = 2; -int nChemcalSourceEsMethod = 1; -int nMaxStepTemperature = 5; -int veTemperatureMinModified = 1; -int nDiagonalModified = 0; -int nGradPrimtiveMethod = 1; -int nInviscidFluxModify = 1; -int nQlLimitMethod = 2; -int nSpeciesForWallMethod = 1; -int nDensityForWallMethod = 0; +int nDebug = 0; +int nSpeciesLimit = 1; +int nTurblenceForChemical = 0; +int nViscosityFluxSublevelModified = 1; +int nViscosityPeModified = 0; +int nChemcalSourceModified = 2; +int nChemcalSourceEsMethod = 1; +int nMaxStepTemperature = 5; +int veTemperatureMinModified = 1; +int nDiagonalModified = 0; +int nDiagonalModifiedTurb = 0; +int nGradPrimtiveMethod = 1; +int nInviscidFluxModify = 1; +int nQlLimitMethod = 2; +int nSpeciesForWallMethod = 1; +int nDensityForWallMethod = 0; +int wallMultiTemperature = 0; -int nProtectData = 0; -int useHyflowSetting = 0; -int nAblation = 0; -int isInjection = 0; -int nViscosityModel = 0; -int nMarsModel = 0; -string gasfile = "DK5"; -//string gasfile = "./chemical/Dunn-Kang_air5s11r.dat"; +int nProtectData = 0; +int nAblation = 0; +int isInjection = 0; +int nViscosityModel = 0; +int nMarsModel = 0; +int nTvChange = 0; +int isMoleFractionType = 0; +string gasfile = "DK5"; +//string gasfile = "./chemical/Dunn-Kang_air5s11r.dat"; string speciesName = "O, O2, NO, N, N2"; string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.767"; @@ -1152,16 +1175,16 @@ string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.767"; //string speciesName = "O, O2, NO, N, N2, C, CO, CO2"; //string initMassFraction = "0.0015, 0.0429, 0.0, 0.0, 0.0, 0.0, 0.0777, 0.8779"; -//string gasfile = "Pa"; +//string gasfile = "Pa"; //string speciesName = "O, O2, NO, N, NO+, C, C2, CO, CO2, CN, N2, e-"; //string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.767, 0.0"; -//string gasfile = "Combustion-12"; +//string gasfile = "Combustion-12"; //string speciesName = "O, O2, NO, N, C, CO, CO2, H, H2, OH, H2O, N2"; //string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.767"; //string gasfile = "Gas-Mixture"; -//string speciesName ="SpeciesA, SpeciesB"; +//string speciesName = "SpeciesA, SpeciesB"; //string initMassFraction = "1.0, 0.0"; int nSutherland = 0; double gamaSpeciesA = 1.4; @@ -1173,9 +1196,17 @@ double molecularWeightSpeciesB = 30.0; //string speciesName = "O2, N2"; //string initMassFraction = "1.0, 0.0"; +int nFraction = 0; int nContinueModel = 0; int nChemicalFlowStep = 0; int ifStartFromPerfectGasResults = 0; +int isUseNoneqCond = 0; +double frozenCondition = 0.01; + +int nLeakageMonitor = 0; +double totalLeakageVolume = 1000.0; +double monitorThresholdValue = 0.05; +double sprayFactor = 0.0; ######################################################################### // Multi-Grid parameters. @@ -1196,7 +1227,6 @@ int ifStartFromPerfectGasResults = 0; // 1 -- zero order. // 2 -- first-order. (default) // mgCorrectionLimit: Multi-grid correction limit. - int nMGLevel = 1; int MGCoarsestIteration = 1; int MGPreIteration = 1; @@ -1218,20 +1248,20 @@ int ismooth_turb = 0; int SAProductType = 2; // ----------------- Overset Grid parameter ----------------------------- -int codeOfDigHoles = 1; -int codeOfTurbulentModel = 0; -string masterFileName = "./grid/searchFile.inp"; -string holeBasicFileName = "./grid/holeBasicFile.inp"; -string holeFullFileName = "./grid/holeFullFile.dat"; -string linkFileName = "./grid/topology.dat"; -string zoneInverseFileName = "./grid/zoneInverseMapping.inp"; +int codeOfDigHoles = 1; +int codeOfTurbulentModel = 0; +string masterFileName = "./grid/searchFile.inp"; +string holeBasicFileName = "./grid/holeBasicFile.inp"; +string holeFullFileName = "./grid/holeFullFile.dat"; +string linkFileName = "./grid/topology.dat"; +string zoneInverseFileName = "./grid/zoneInverseMapping.inp"; -######################################################################### -# High Order Struct Solver # -######################################################################### +#************************************************************************ +# High Order Struct Solver * +#************************************************************************ // isFVMOrFDM: -// 0 -- NSSolverStruct using Finite Volume Method. -// 1 -- NSSolverStruct using Finite Differ Method. +// 0 -- NSSolverStruct using Finite Volume Method. +// 1 -- NSSolverStruct using Finite Differ Method. // SolverStructOrder: Spatial discretisation order of NS equations with struct grid. // <= 2 -- finite volume method. // >= 3 -- finite difference order. (to be completed) @@ -1273,30 +1303,48 @@ int allReduceStep = 1; // codeOfOversetGrid: Overlapping(overset) grid or not. // 0 -- NON-overlapping grid. // 1 -- Overlapping grid. -// oversetInterpolationMethod: the method of overset interpolation while field simulation +// oversetInterpolationMethod: the method of overset interpolation while field simulation. // 0 -- set the acceptor cell value by donor cell value. // 1 -- set the acceptor cell value by distance weight of donor cell value. - -int codeOfOversetGrid = 0; -int oversetInterpolationMethod = 0; -int readOversetFileOrNot = 0; -int symetryOrNot = 0; -int readInAuxiliaryInnerGrid = 0; -int readInAuxiliaryOuterGrid = 0; -int readInSklFileOrNot = 0; -string auxiliaryInnerGrid0 = "./grid/aux-upper.fts"; -string auxiliaryInnerGrid1 = "./grid/aux-lower.fts"; -string auxiliaryInnerGrid2 = ""; -string oversetGridFileName = "./grid/iblank.ovs"; -double walldistMainZone = 1.0 -double toleranceForOversetSearch = 1.0e-3; -double toleranceForOversetBox = 1.0e-3; -int twoOrderInterpolationOrNot = 0; -int keyEnlargeOfActiveNodes = 0; -int outTecplotOverset = 0; -int outPutOversetVisualization = 0; - -int numberOfMovingBodies = 2; +// readOversetFileOrNo: Whether to read overset-file(.ovs) that has been generated. +// 0 -- no. +// 1 -- yes. +// symetryOrNot: If there exist symetryplanes(XY plane, the coordinate of Z direction is 0) in +// the current overset grid(only for three dimension). +// 0 -- no. +// 1 -- yes. +// readInAuxiliaryInnerGrid: Whether to read auxiliary inner grid. +// 0 -- no. +// 1 -- yes. +// walldistMainZone: The initial value of background grid which does not exist wall boundary condition. +// toleranceForOversetSearch: The tolerance of overset searching zone to judge whether the obtained node is in the current computing cell. +// toleranceForOversetBox: The tolerance of building the minimum box of computing cells in the overlapping region. +// twoOrderInterpolationOrNot: The number of interpolated cell layers in the overlapping boundary. +// 0 -- one layer. +// 1 -- two layers. +// keyEnlargeOfActiveNodes: The number of enlarged overset-boundary layers in the buffer region. +// outTecplotOverset: Whether to dump out the flowfield data after the progress of overset configure. +// 0 -- no. +// 1 -- yes. +int codeOfOversetGrid = 0; +int oversetInterpolationMethod = 0; +int readOversetFileOrNot = 0; +int symetryOrNot = 0; +int readInAuxiliaryInnerGrid = 0; +int readInAuxiliaryOuterGrid = 0; +int readInSklFileOrNot = 0; +string auxiliaryInnerGrid0 = "./grid/aux-upper.fts"; +string auxiliaryInnerGrid1 = "./grid/aux-lower.fts"; +string auxiliaryInnerGrid2 = ""; +string oversetGridFileName = "./grid/iblank.ovs"; +double walldistMainZone = 1.0 +double toleranceForOversetSearch = 1.0e-3; +double toleranceForOversetBox = 1.0e-3; +int twoOrderInterpolationOrNot = 0; +int keyEnlargeOfActiveNodes = 0; +int outTecplotOverset = 0; +int outPutOversetVisualization = 0; +int numberOfMovingBodies = 2; // ----------------- ALE configuration ------------------------------ int codeOfAleModel = 0; @@ -1306,36 +1354,42 @@ double referenceLength = 1.0; double referenceVelocity = 1.0; double referenceDensity = 1.0; -int strategyForFaceNormalVelocity = 0; //0-By Sweeping volume; 1-By face center 1st; 2-By face center 2nd; -int strategyForGCLSource = 0; //0-present; 1-Ahn; +int strategyForFaceNormalVelocity = 0; // 0-By Sweeping volume; 1-By face center 1st; 2-By face center 2nd. +int strategyForGCLSource = 0; // 0-present; 1-Ahn. -//0:1st-Admas-Bashforth; 1:2nd-Admas-Bashforth; 2:1st-Implicit-Euler; 3:2nd-Implicit Euler; 4:2nd-Adams-Moulton; 5:3rd-Adams-Moulton +// 0: 1st-Admas-Bashforth; 1: 2nd-Admas-Bashforth; 2: 1st-Implicit-Euler; 3: 2nd-Implicit Euler; 4: 2nd-Adams-Moulton; 5: 3rd-Adams-Moulton. int methodForKineticEquation = 0; double relaxParameterOfKinetic = 1.0; -######################################################################### -# motive information # -######################################################################### +#************************************************************************ +# motive information * +#************************************************************************ int numberOfMovingBodies = 1; ############################## body0 ############################## -//mass of parts -double mass_0 = 1.0; -//mass matrix of parts Ixx Iyy Izz Ixy Ixz Iyz -double massMatrix_0[] = 1e-7, 1e-6, 1e-6, 0.0, 0.0, 0.0; -//initial six DOF position information of parts. xc yc zc -double massCenter_0[] = 0.0 , 0.0, 0.0; -//initial six DOF position information of parts. angleX angleY angleZ -double attitudeAngle_0[] = 0.0 , 0.0, 0.0; -//initial six DOF move information of parts. vc vy vz -double massCenterVelocity_0[] = 0.0, 0.0, 0.0; -//initial six DOF move information of parts. omigX omigY omigZ -double angularVelocity_0[] = 0.0, 0.0, 0.0; -//the object that the parts belong to. -int fartherIndex_0 = -1; -//the assembly position of the parts. xc yc zc angleX angleY angleZ -double configPamameter_0[] = 0.0 ,0.0 ,0.0 ,0.0 ,0.0 ,0.0; -//the move pattern of the parts. +// mass of parts. +double mass_0 = 1.0; +// gravity of parts (along negative direction in Y-axis, eg. 9.8). +double gravity_0 = 0.0; +// mass matrix of parts Ixx Iyy Izz Ixy Ixz Iyz. +double massMatrix_0[] = 1e-7, 1e-6, 1e-6, 0.0, 0.0, 0.0; +// initial six DOF position information of parts. xc yc zc. +double massCenter_0[] = 0.0, 0.0, 0.0; +// if reset mass center while restart. +int resetMassCenter_0 = 0; +// position offset of parts. dx dy dz. +double massCenterDxyz_0[] = 0.0, 0.0, 0.0; +// initial six DOF position information of parts. angleX angleY angleZ. +double attitudeAngle_0[] = 0.0, 0.0, 0.0; +// initial six DOF move information of parts. vc vy vz. +double massCenterVelocity_0[] = 0.0, 0.0, 0.0; +// initial six DOF move information of parts. omigX omigY omigZ. +double angularVelocity_0[] = 0.0, 0.0, 0.0; +// the object that the parts belong to. +int fartherIndex_0 = -1; +// the assembly position of the parts. xc yc zc angleX angleY angleZ. +double configPamameter_0[] = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0; +// the move pattern of the parts. // -1 given motion partten. // 0 still. // 1 six DOF motion. @@ -1346,51 +1400,68 @@ double configPamameter_0[] = 0.0 ,0.0 ,0.0 ,0.0 ,0.0 // 14 forced pitch motion. // 15 forced yaw motion. // 16 forced roll motion. -int RBDMethod_0 = 0; -double amplitude_0 = 0.0; -double reduceFrequency_0 = 0.0; -//direction of rotation +int RBDMethod_0 = 0; +double amplitude_0 = 0.0; +double reduceFrequency_0 = 0.0; +// direction of rotation. // 1 -- clockwise from the point of view along the positive x axis. // -1 -- anticlockwise from the point of view along the positive x axis. -int direction_0 = -1; -double rotateFrequency_0 = 0.0; -//string uDFSixDofFileName_0 = "./Bin/UDFSixDof.Parameter"; -//additional force (system axis) fX fY fZ -double addedForce_0[] = 0.0 ,0.0 ,0.0 ; -//additional moment of Force (system axis) mX mY mZ -double addedMoment_0[] = 0.0 ,0.0 ,0.0 ; -//the deformation method of the parts. -int morphing_0 = 0; - -// post indentify -int integralOrder = 4; +int direction_0 = -1; +double rotateFrequency_0 = 0.0; +//string uDFSixDofFileName_0 = "./Bin/UDFSixDof.Parameter"; +// dimensional physical time for additional force(s). +double addedForceTime_0[] = 0.0; +// additional force(inertia system) fX fY fZ. +double addedForce_0[] = 0.0, 0.0, 0.0; +// additional moment(inertia system) mX mY mZ. +double addedMoment_0[] = 0.0, 0.0, 0.0; +// the deformation method of the parts. +int morphing_0 = 0; +// post indentify. +int integralOrder = 4; // ---------------- ATP read -------------------------------------------- -//@int inflowParaType = 0; +//@int inflowParaType = 0; //@double refReNumber = 6.5e6; //@double refDimensionalTemperature = 288.15; //@double freestream_vibration_temperature = 300.00; -//@double refDimensionalPressure = 0; -//@double height = 0; -//@int nsubsonicInlet = 0; -//@int nsubsonicOutlet = 0; -//@string inLetFileName = "./bin/subsonicInlet.hypara"; -//@string outLetFileName = "./bin/subsonicOutlet.hypara"; +//@double refDimensionalPressure = 0; +//@double height = 0; +//@int nsubsonicInlet = 0; +//@int nsubsonicOutlet = 0; +//@string inLetFileName = "./bin/subsonicInlet.hypara"; +//@string outLetFileName = "./bin/subsonicOutlet.hypara"; //@double refDimensionalVelocity = 0; //@double refDimensionalDensity = 0; - -######################################################################### -# Old Parameter # -######################################################################### +//@string weatherDataFilePath = "./WRFData/"; +//@double longitude = 110.95 +//@double latitude = 19.61; +#************************************************************************ +# Old Parameter * +#************************************************************************ int isPlotVolumeField = 0; +#************************************************************************ +# partial flow field setting Parameter * +#************************************************************************ +//int nPartialParameter = 0; // 0/1/2 +//int nNumberOfPartialField = 0; // +//int nStartGridIndex[] = [0]; +//int nEndGridIndex[] = [0]; -######################################################################### -# Incompressible Parameter # -######################################################################### +//double partialCFL[] = [0.0]; +//double partialSpeedCoef[] = [0.0]; +//double partialSpeed[] = [0.0]; +//double partialAttackd[] = [0.0]; +//double partialSlide[] = [0.0]; +//double partialPressure[] = [0.0]; +//double partialTemperature[] = [0.0]; +//double partialMassFractions[] = [0.0]; +#************************************************************************ +# Incompressible Parameter * +#************************************************************************ int isSolveEnergyEquation = 0; int isSolveTurbEquation = 0; -int isSolveSpeciesEquation = 0; - +int isSolveSpeciesEquation = 0; \ No newline at end of file diff --git a/A06_ThreeD_NACA0012_SA_Struct_4CPU/bin/grid_para.hypara b/A06_ThreeD_NACA0012_SA_Struct_4CPU/bin/grid_para.hypara index 68b03f0..2f0ea32 100644 --- a/A06_ThreeD_NACA0012_SA_Struct_4CPU/bin/grid_para.hypara +++ b/A06_ThreeD_NACA0012_SA_Struct_4CPU/bin/grid_para.hypara @@ -4,9 +4,12 @@ // gridtype: Grid type for generation, conversion, reconstruction, merging. // 0 -- Unstructured grid. // 1 -- Structured grid. -// axisup: Type of Cartisien coordinates system, used in grid conversion. -// 1 -- Y upward. (default) -// 2 -- Z upward. +// nAxisRotateTimes: number of axis rotating times, zero (default) meaning without rotating. +// axisRotateOrder : axis rotating order. +// 1 -- X-axis. +// 2 -- Y-axis. +// 3 -- Z-axis. +// axisRotateAngles: axis rotating angles (degree), which are corresponding to the axis rotating order. // from_gtype: Type of grid data type in grid conversion process. // -1 -- MULTI_TYPE. // 1 -- PHengLEI, *.fts. @@ -18,7 +21,9 @@ // 7 -- Hybrid, include both of unstructured and structured grid, *.fts. // 8 -- GMSH, *.msh. int gridtype = 1; -int axisup = 1; +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; int from_gtype = 3; ######################################################################### diff --git a/A07_TwoD_Rae2822_SST_Struct_4CPU/bin/cfd_para.hypara b/A07_TwoD_Rae2822_SST_Struct_4CPU/bin/cfd_para.hypara index c344658..f903a5a 100644 --- a/A07_TwoD_Rae2822_SST_Struct_4CPU/bin/cfd_para.hypara +++ b/A07_TwoD_Rae2822_SST_Struct_4CPU/bin/cfd_para.hypara @@ -8,23 +8,24 @@ // Platform for Hybrid Engineering Simulation of Flows + // China Aerodynamics Research and Development Center + // (C) Copyright, Since 2010 + +// PHengLEI 2212 + //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ########################################################################### # Default parameters for Grid conversion # ########################################################################### // gridtype: Grid type for generation, conversion, reconstruction, merging. -// 0 -- Unstructured grid. -// 1 -- Structured grid. -// 2 -- Hybrid grid, include both of unstructured and structured grid. -// gridobj: Task type of grid treatment. -// 0 -- Grid generation of typical case, such as cylinder, flat plate, etc. -// 1 -- Grid conversion, from other grid data to PHenglEI, such as Fluent, CGNS. -// 2 -- Grid refinement. -// 3 -- Grid merging, merge two blocks into one block. -// 4 -- Grid deformation, achieve unstructured grid deformation. -// 5 -- Grid repairing, repair the original grid in order to remove the negative volume cells. -// 6 -- Grid mirroring, mirror a symmetry grid to whole grid. -// 7 -- Grid type change, convert structured grid to unstructured grid. +// 0 -- Unstructured grid. +// 1 -- Structured grid. +// 2 -- Hybrid grid, include both of unstructured and structured grid. +// gridobj: Task type of grid treatment. +// 0 -- Grid generation of typical case, such as cylinder, flat plate, etc. +// 1 -- Grid conversion, from other grid data to PHenglEI, such as Fluent, CGNS. +// 2 -- Grid refinement. +// 3 -- Grid merging, merge two blocks into one block. +// 4 -- Grid deformation, achieve unstructured grid deformation. +// 5 -- Grid repairing, repair the original grid in order to remove the negative volume cells. +// 6 -- Grid mirroring, mirror a symmetry grid to whole grid. +// 7 -- Grid type change, convert structured grid to unstructured grid. // multiblock: Multi-block grid or not, only for structured grid conversion. // 0 -- Not. // 1 -- Yes. @@ -46,19 +47,24 @@ int gridobj = 1; int multiblock = 0; int iadapt = 0; int SymmetryFaceVector = 1; - int gridReorder = 0; int faceReorderMethod = 0; -// axisup: Type of Cartisien coordinates system, used in grid conversion. -// 1 -- Y upward. (default) -// 2 -- Z upward. -int axisup = 1; +// nAxisRotateTimes: number of axis rotating times, zero (default) meaning without rotating. +// axisRotateOrder : axis rotating order. +// 1 -- X-axis. +// 2 -- Y-axis. +// 3 -- Z-axis. +// axisRotateAngles: axis rotating angles (degree), which are corresponding to the axis rotating order. +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; // omit_no_bound_bc: What's boundary condition for the type of "no_boundary_condition". // 0 -- Interface. (default) // 1 -- Physical boundary condition, used in Hybrid solver. int omit_no_bound_bc = 0; +int omitRepeatInterface = 1; //----------------------------------------------------------------------- # Grid data type # @@ -87,10 +93,9 @@ int dumpOldGrid = 0; // from_gfile: path of original data file for unstructure grid convert from. // out_gfile: path of target file for grid convert to, *.fts type of file usually. int numberOfGridFile = 1; -string from_gfile = "./grid/rae2822_hybrid2d.cas"; -string from_gfile1= ""; - -string out_gfile = "./grid/flat_laminr_133_85_2d.fts"; +string from_gfile = "./grid/rae2822_hybrid2d.cas"; +string from_gfile1 = ""; +string out_gfile = "./grid/flat_laminr_133_85_2d.fts"; // ----------------- some advanced choices ------------------------------ // iunsteady: The Grid is for unsteady simulation or not. @@ -103,9 +108,9 @@ int fileformat = 0; // Parameters for hybrid solver. // mixgrid_uns: path of unstructure grid file for hybrid solver, *.fts type. -// mixgrid_str: path of structure grid file for hybrid solver, *.fts type. -string mixgrid_uns = "./grid/rae2822_uns2d_4.fts"; -string mixgrid_str = "./grid/flat_laminr_133_85_2d.fts"; +// mixgrid_str: path of structure grid file for hybrid solver, *.fts type. +string mixgrid_uns = "./grid/rae2822_uns2d_4.fts"; +string mixgrid_str = "./grid/flat_laminr_133_85_2d.fts"; // Some parameters for structured overlapping grid. int codeOfDigHoles = 1; @@ -119,31 +124,31 @@ string zoneInverseFileName = "./oversetGridView/zoneInverseMapping.inp"; // 0 -- Not. (default) // 1 -- Yes. // geometryUnit: Geometry unit. -// 1 -- meter. -// 2 -- millimeter. -// 3 -- inch. +// 1 -- meter. +// 2 -- millimeter. +// 3 -- inch. // exclusiveCase: Parallel projection exclusive case. -// 0 -- NON case. -// 1 -- JSM-C2-NPOFF case. -// 2 -- CHNT. +// 0 -- NON case. +// 1 -- JSM-C2-NPOFF case. +// 2 -- CHNT. // projectOrgPoint: If the original wall points need to be projected or not. -int anisoRefine = 0; -int geometryUnit = 1; -int isProject = 0; -int readDist = 0; -int isDeform = 0; +int anisoRefine = 0; +int geometryUnit = 1; +int isProject = 0; +int readDist = 0; +int isDeform = 0; int exclusiveCase = 0; int projectOrgPoint = 0; string geometryFileName = "./grid/jsm.igs"; // ----------------- Grid Deform Parameters ----------------------------- // deformationMethod: Grid Deform. -// 1 -- SPRING. -// 2 -- RBF. +// 1 -- SPRING. +// 2 -- RBF. // stationalGridFile: Original grid file. // visualFileName : The visualization file path of deform grid. // nDeformStep : The max deform step. -// flapAngle : The max flap angle. +// flapAngle : The max flap angle. // rotatePostionZ : Rotate postion. // rotatePostionY : Rotate postion. // gridSlice : If dump slice grid. @@ -163,10 +168,10 @@ int sliceAxis = 1; double slicePosition = 13; // ----------------- RBF Parameters ------------------------------------- -// numberOfReferenceCP : Number of reference Control Points. -// influencePara : The RBF influence radius parameter. +// numberOfReferenceCP: Number of reference Control Points. +// influencePara : The RBF influence radius parameter. int numberOfReferenceCP = 40; -double influencePara = 25.0; +double influencePara = 25.0; // ----------------- Periodic Parameters -------------------------------- // Notice: Rotational periodicity only support rotation along the X axis! @@ -178,9 +183,8 @@ double influencePara = 25.0; which only support one direction. // rotationAngle: The relative angle between two periodic face. which is recorded in degrees. - int periodicType = 0; -double translationLength[] = [0.0,0.0,0.0]; +double translationLength[] = [0.0, 0.0, 0.0]; double rotationAngle = 0.0; ######################################################################### @@ -192,7 +196,6 @@ double rotationAngle = 0.0; // 2 -- refine structured grid. // maxproc: The number of partition zones that want to be divided into. // numberOfMultifile: The number of partition grid files that want to be dumped out. - int pgridtype = 0; int maxproc = 4; int numberOfMultifile = 1; @@ -201,20 +204,20 @@ int numberOfMultifile = 1; // 0 -- Not. // 1 -- Yes. // blockIndexOfMark: the block index of mark, only for structured grid partition. -// cellIndexOfMark: the cell index of mark, only for structured grid partition. +// cellIndexOfMark : the cell index of mark, only for structured grid partition. int traceMark = 0; int blockIndexOfMark = 0; -int cellIndexOfMark[] = [185,30,1]; +int cellIndexOfMark[] = [185, 30, 1]; -// parallel Strategy: -//! -# 0 : each zone is assigned to the one that defined in grid partition procedure. -//! -# 1 : random assigned for each zone or by some else ways. -int parallelStrategy = 1; +// parallelStrategy: +// 0 -- each zone is assigned to the one that defined in grid partition procedure. +// 1 -- random assigned for each zone or by some else ways. +int parallelStrategy = 1; //----------------------------------------------------------------------- # File path # //----------------------------------------------------------------------- -// original_grid_file: Original grid file that want to be divided(PHengLEI type, *.fts). +// original_grid_file: Original grid file that want to be divided(PHengLEI type, *.fts). // partition_grid_file: Target partition grid file(PHengLEI type, *.fts). string original_grid_file = "./grid/sphere_mixed.fts"; string partition_grid_file = "./grid/sphere_mixed__4.fts"; @@ -232,11 +235,10 @@ string partition_grid_file = "./grid/sphere_mixed__4.fts"; // 1 -- perfect balance. // maxproc -- perfect imbalance. // 1.05 -- recommended. - int omit_no_bound_bc = 0; int npartmethod = 1; int parallelPartitionMethod = 2; -double parmetisBalance = 1.05; +double parmetisBalance = 1.05; // numberOfMultigrid: Number of multi-grid levels, ONLY used for structured grid. // 1 -- single level. @@ -248,29 +250,35 @@ int numberOfMultigrid = 1; # Default parameters for CFD simulation # ######################################################################### // maxSimuStep: The max simulation step, don't care simulation is restart or not. -// intervalStepFlow: The step intervals for flow variables file 'flow.dat' saved. -// intervalStepPlot: The step intervals for tecplot visual file 'tecflow.dat' saved. +// intervalStepFlow: The step intervals for flow variables file 'flow.dat' saved. +// intervalStepPlot: The step intervals for tecplot visual file 'tecflow.dat' saved. // intervalStepSample: The step intervals for monitored probes variables file 'sample.dat' saved. -// intervalStepForce: The step intervals for aerodynamics coefficients file 'aircoef.dat' saved. -// intervalStepRes: The step intervals for residual file 'res.dat' saved. -// ifLowSpeedPrecon: Precondition process to accelerate convergence for low speed flow. -// 0 -- no precondition process. (default, mach > 0.3) -// 1 -- carry out precondition process. (mach number <= 0.3) - -int maxSimuStep = 20000; - -int intervalStepFlow = 1000; -int intervalStepPlot = 1000; +// intervalStepForce: The step intervals for aerodynamics coefficients file 'aircoef.dat' saved. +// intervalStepRes: The step intervals for residual file 'res.dat' saved. +int maxSimuStep = 20000; +int intervalStepFlow = 1000; +int intervalStepPlot = 1000; int intervalStepSample = 1000; -int intervalStepForce = 100; -int intervalStepRes = 10; -int ifLowSpeedPrecon = 0; +int intervalStepForce = 100; +int intervalStepRes = 10; // compressible: // 0 -- incompressible flow. // 1 -- compressible flow. (default) int compressible = 1; +// ifLowSpeedPrecon: Precondition process to accelerate convergence for low speed flow. +// 0 -- no precondition process. (default, mach > 0.3) +// 1 -- carry out precondition process. (mach number <= 0.3) +// Kprec: The coefficient K for the cut-off velocity. +// 1.0~3.0 is suggested. (default, 3.0) +// preconFarfieldBCMethod: The precondition method for farfield boundary condition. +// 0 -- precondition far-field boundary based on riemann invariants. +// 1 -- Turkel's simplified far-field boundary condition. +int ifLowSpeedPrecon = 0; +double Kprec = 3.0; +int preconFarfieldBCMethod = 1; + //----------------------------------------------------------------------- # CFD Control Parameter # //----------------------------------------------------------------------- @@ -281,33 +289,36 @@ int compressible = 1; // 0 -- the nondimensional conditions. // 1 -- the flight conditions. // 2 -- the experiment conditions. -// 3 -- the subsonic boundary conditions. +// 3 -- the subsonic boundary conditions. (Useless!) // 4 -- the condition that the velocity, temperature and density are given. // 5 -- the condition that the velocity, temperature and pressure are given. +//flowInitMethod: Flow field initialization method. +// 0 -- The entire flow field is initialized according to Infinite velocity. +// 1 -- The velocity near the wall is initialized according to the boundary layer of the plate. // refReNumber: Reynolds number, which is based unit length, unit of 1/m. // refDimensionalTemperature: Dimensional reference temperature, or the total temperature only for the experiment condition. // freestream_vibration_temperature: Dimensional freestream vibration temperature. // refDimensionalPressure: Dimensional reference pressure, or the total pressure only for the experiment condition. // height: Fly height, unit of km. // wallTemperature: Temprature of the solid wall, minus value is for adiabatic boundary condition. -// gridScaleFactor: The customizable unit of the grid, default value is 1.0 for meter.Common dimensions like: -// 1 dm = 0.1 m. -// 1 cm = 0.01 m. -// 1 mm = 0.001m. -// 1 inch = 0.0254m. -// 1 foot = 12 inches = 0.3048m. -// 1 yard = 3 feet = 0.9144m. +// gridScaleFactor: The customizable unit of the grid, default value is 1.0 for meter. Common dimensions like: +// 1 dm = 0.1 m. +// 1 cm = 0.01 m. +// 1 mm = 0.001 m. +// 1 inch = 0.0254 m. +// 1 foot = 12 inches = 0.3048 m. +// 1 yard = 3 feet = 0.9144 m. // forceReferenceLength, forceReferenceLengthSpanWise, forceReferenceArea: Reference length, SpanWise length and area, independent of grid unit. // TorqueRefX, TorqueRefY, TorqueRefZ: Reference point, independent of grid unit. // radiationCoef: The radiation coefficient on wall, it is used to compute the radiation heat flux on wall when the boundary // condition is radiation equilibrium temperature, and 0.8 is the default value. -// refMolecularWeight : the reference molecular weight of gas used for perfect gas. The unit is g/mol. +// refMolecularWeight: the reference molecular weight of gas used for perfect gas. The unit is g/mol. // Generally, the gas is air. Sometimes, it is experiment gas, such as Nitrogen, Argon, and so on. - -int directionMethod = 0; +int directionMethod = 0; double refMachNumber = 0.73; double attackd = 2.79; double angleSlide = 0.00; +int flowInitMethod = 0; int inflowParaType = 0; double refReNumber = 6.5e6; @@ -321,29 +332,27 @@ double freestream_vibration_temperature = 300.00; //double refDimensionalTemperature = 6051.024; // The total temperature, T*(1+(refGama-1)*M*M/2). //double refDimensionalPressure = 4.299696E09; // The total pressure, p*(T0/T)^(refGama/(refGama-1)). -//int inflowParaType = 3; -//int nsubsonicInlet = 1; -//int nsubsonicOutlet = 1; -//string inLetFileName = "./bin/subsonicInlet.hypara"; -//string outLetFileName = "./bin/subsonicOutlet.hypara"; -//double refDimensionalTemperature = 288.144; -//double refDimensionalPressure = 1.01313E05; - -//The velocity, temperature and density are fixed. +// The velocity, temperature and density are fixed. //int inflowParaType = 4; //double refDimensionalVelocity = 1000.0; -//double refDimensionalDensity = 1.0e3; +//double refDimensionalDensity = 1.0e3; -//The velocity, temperature and pressure are fixed. +// The velocity, temperature and pressure are fixed. //int inflowParaType = 5; //double refDimensionalVelocity = 1000.0; //double refDimensionalPressure = 1.0e5; -//The MachNumber, temperature and pressure are fixed. +// The MachNumber, temperature and pressure are fixed. //int inflowParaType = 6; -//double refDimensionalTemperature = 293; +//double refDimensionalTemperature = 293.0; //double refDimensionalPressure = 8886.06; +// The velocity, temperature and pressure are read from file. +//int inflowParaType = 7; +//string weatherDataFilePath = "./WRFData/"; +//double longitude = 110.95 +//double latitude = 19.61; + double wallTemperature = -1.0; double radiationCoef = 0.8; @@ -357,41 +366,41 @@ double forceReferenceArea = 1.0; // unit of meter^2. double TorqueRefX = 0.0; // unit of meter. double TorqueRefY = 0.0; // unit of meter. double TorqueRefZ = 0.0; // unit of meter. +double knudsenLength = 1.0; // unit of meter. double refMolecularWeight = 28.9644; // unit of g/mol. //----------------------------------------------------------------------- # Spatial Discretisation # //----------------------------------------------------------------------- -#******************************************************************* -# Struct Solver * -#******************************************************************* +#************************************************************************ +# Struct Solver * +#************************************************************************ // inviscidSchemeName: Spatial discretisation scheme of struct grid. // Using this when solve structered grid or hybrid. -// -- "vanleer", "steger", "hlle", "lax_f". -// -- "roe", "modified_roe". +// -- "vanleer", "steger", "hlle", "lax_f", +// -- "roe", "modified_roe", // -- "ausm+", "ausm+w", "ausm+up", "ausmdv", "ausmpw", "ausmpw+". // isWennScheme: If using WENN Scheme of struct grid. -// 0 -- NO. (default) -// 1 -- Yes. +// 0 -- NO. (default) +// 1 -- Yes. // str_limiter_name: Limiter of struct grid. -// -- "vanalbada", "vanleer", "minmod", "smooth", "minvan", "3rdsmooth", "3rd_minmod_smooth". -// -- "nolim", no limiter. -// -- "vanalbada_clz", clz supersonic version. -// -- "weno3_js", "wenn3_prm211", "wenn3_zm", "wenn3_zes2", "wenn3_zes3" - +// -- "vanalbada", "vanleer", "minmod", "smooth", "minvan", "3rdsmooth", "3rd_minmod_smooth", +// -- "nolim", no limiter, +// -- "vanalbada_clz", clz supersonic version, +// -- "weno3_js", "wenn3_prm211", "wenn3_zm", "wenn3_zes2", "wenn3_zes3". string inviscidSchemeName = "roe"; int isWennScheme = 0; -string str_limiter_name = "vanalbada"; +string str_limiter_name = "vanalbada"; -#******************************************************************* -# UnStruct Solver or Common * -#******************************************************************* +#************************************************************************ +# UnStruct Solver or Common * +#************************************************************************ // viscousType: Viscous model. -// 0 -- Euler. -// 1 -- Lamilar. -// 2 -- Algebraic. -// 3 -- 1eq turbulent. -// 4 -- 2eq turbulent. +// 0 -- Euler. +// 1 -- Lamilar. +// 2 -- Algebraic. +// 3 -- 1eq turbulent. +// 4 -- 2eq turbulent. // viscousName: Laminar or tubulent model. // -- "0eq-bl". // -- "1eq-sa". @@ -410,16 +419,16 @@ string str_limiter_name = "vanalbada"; // 3 -- IDDES. // uns_scheme_name: Spatial discretisation scheme of Unstruct grid. // Using this when solve Unstructered grid or hybrid. -// -- "vanleer", "roe", "steger", "kfvs", "lax_f", "hlle". +// -- "vanleer", "roe", "GMRESRoe", "GMRESSteger", "steger", "kfvs", "lax_f", "hlle", // -- "ausm+", "ausmdv", "ausm+w", "ausmpw", "ausmpw+". // uns_limiter_name: Limiter of Unstruct grid. -// -- "barth", "vencat", "vanleer", "minmod". -// -- "vanalbada", "smooth", "nnd", "lpz", "1st". +// -- "barth", "vencat", "vanleer", "minmod", +// -- "vanalbada", "smooth", "nnd", "lpz", "1st", // -- "nolim", no limiter. // uns_vis_name: Discretisation method of viscous term. // -- "std", "test", "aver", "new1", "new2". // gradientName: Gradient reconstruction method. -// -- "default", "ggcell", "ggnode", "lsq". +// -- "default", "ggcell", "ggnode", "lsq". // ivencat: Variation of vencat limiter. // 0 -- org method, it is independent of grid scale. // 1 -- new method, it is dependent of grid scale. @@ -442,18 +451,18 @@ string str_limiter_name = "vanalbada"; // 3 -- Harten type, which is default used. // roeEntropyScale: Entropy fix (correction) coefficient scale, default is 1.0. // It is used to scale the default Roe entropy fix coefficients. -// AusmpwPlusLimiter: A Limiter to make "function w" not change acutely in AusmpwPlus scheme, default is 1.0 +// AusmpwPlusLimiter: A Limiter to make "function w" not change acutely in AusmpwPlus scheme, default is 1.0. -//int viscousType = 0; +//int viscousType = 0; //string viscousName = "Euler"; -//int viscousType = 1; +//int viscousType = 1; //string viscousName = "laminar"; -int viscousType = 3; +int viscousType = 3; string viscousName = "1eq-sa"; -//int viscousType = 4; +//int viscousType = 4; //string viscousName = "2eq-kw-menter-sst"; int DESType = 0; @@ -463,7 +472,7 @@ string uns_limiter_name = "vencat"; string uns_vis_name = "test"; string gradientName = "ggnode"; -int ivencat = 7; +int ivencat = 7; double venkatCoeff = 5.0; int reconmeth = 1; int limitVariables = 0; @@ -475,9 +484,9 @@ double roeEntropyScale = 1.0; double AusmpwPlusLimiter = 1.0; -//----------------------------------------------------------------------- -# Temporal Discretisation # -//----------------------------------------------------------------------- +#************************************************************************ +# Temporal Discretisation * +#************************************************************************ // iunsteady: Steady or unsteady. // 0 -- steady. // 1 -- unsteay. @@ -490,51 +499,57 @@ double AusmpwPlusLimiter = 1.0; // statisticalTimePeriod: Used as time period of statistic analysis. // when the value is negative, time period is treated as infinite. // statisticMethod: Statistic reynolds stress method. -// 0 -- tau = - ^2 -// 1 -- tau = +// 0 -- tau = - ^2 +// 1 -- tau = // min_sub_iter: The min sub iteration of unsteady simulation. // max_sub_iter: The max sub iteration of unsteady simulation. // tol_sub_iter: The tolerance of sub iteration of unsteady simulation. // tscheme: Temporal Discretisation method. -// 1 -- Runge-Kutta Multi-State. -// 2 -- Point implicit. -// 3 -- Full implicit. -// 4 -- LU-SGS. -// 5 -- Block LU-SGS. -// 6 -- Jacobian iteration. -// 7 -- Line LU-SGS. -// 8 -- Matrix LU-SGS. +// 1 -- Runge-Kutta Multi-State. +// 2 -- Point implicit. +// 3 -- Full implicit. +// 4 -- LU-SGS. +// 5 -- Block LU-SGS. +// 6 -- Jacobian iteration. +// 7 -- Line LU-SGS. +// 8 -- Matrix LU-SGS. +// 9 -- GMRES. // iSimplifyViscousTerm: Simplify the computation of viscous term in the Block LU-SGS method. The default value assigns 1 that could speed up the computation. // Otherwise, the viscous Jacobian matrix Mv should be computed that will increase the memory and time in iteration of the BLUSGS method. // CFLStart: Started cfl number. // CFLEnd: End cfl number. // CFLVaryStep: The number of step when cfl increase from CFLStart to CFLEnd. +// GMRESCFLScale : CFL = CFLStart * GMRESCFLScal^iteration. +// OriginalTscheme : Used for LUSGS and GMres hybrid computing. +// useLUSGSprecond: Initialize flow field for GMRES. +// 0 --Initialize by first order Jacobian matrix. +// 1 --Initialize by LUSGS. +// GMRESInitStep : the number of iteration step of irst order Jacobian matrix or LUSGS for initialize flow field. // ktmax: Dtratio. dt[i] = MIN(dt[i], ktmax * dtmin / vol[i]) // swapDq: Communication dq between forward/backward sweep of LUSGS or not, default is 0. // nLUSGSSweeps: Sub iteration of LU-SGS or Block LU-SGS. // LUSGSTolerance: Sub iter tolerance of LU-SGS or Block LU-SGS. // ifLocalTimeStep: Time step method. -// 0 --Local. -// 1 --Global. +// 0 --Local. +// 1 --Global. // isUseLocalCFL: use variable number of CFL or not. -// 0 -- global unified CFL number. -// 1 -- local CFL number. +// 0 -- global unified CFL number. +// 1 -- local CFL number. // isUsePreTwall: use the previous temperatures on wall. 1 indicates yes, and 0 indicates no. // visl_min: Minimum value of laminar viscosity coefficient. // turbCFLScale: Turbulence model cfl number factor. // codeOfAleModel: Arbitrary Lagrangian-Eulerian method. -// 0 -- no ALE method. -// 1 -- ALE method for non-moving grids. -// 2 -- ALE method for moving grids. -// 3 -- ALE method for deforming grids. +// 0 -- no ALE method. +// 1 -- ALE method for non-moving grids. +// 2 -- ALE method for moving grids. +// 3 -- ALE method for deforming grids. // wallFunctionType: The type of wall function to implement. -// 0 -- no wall function. (default) -// 1 -- standard wall function. -// 2 -- Pab3D wall function. +// 0 -- no wall function. (default) +// 1 -- standard wall function. +// 2 -- Pab3D wall function. // RKStage: The number of Runge-Kutta step. // lamda: Cofficient of Runge-Kutta step. - -int iunsteady = 0; +int iunsteady = 0; double physicalTimeStep = 0.01; double physicalTimeStepDimensional = -0.001; int ifStartFromSteadyResults = 0; @@ -543,39 +558,42 @@ int ifStaticsReynoldsStress = 0; int startStatisticStep = 800000; double statisticalTimePeriod = -1.0; int statisticMethod = 0; -int linearTwoStepMethods = 1; // 1--BDF1; 2--C-N; 3--BDF2; +int linearTwoStepMethods = 1; // 1--BDF1; 2--C-N; 3--BDF2. int methodOfDualTime = 3; int min_sub_iter = 50; int max_sub_iter = 50; double tol_sub_iter = 0.01; -int tscheme = 4; +int tscheme = 4; int iSimplifyViscousTerm = 1; int ifLocalTimeStep = 0; int isUseLocalCFL = 0; int isUsePreTwall = 0; -double CFLStart = 0.01; -double CFLEnd = 10.0; -int CFLVaryStep = 500; - +double CFLStart = 0.01; +double CFLEnd = 10.0; +int CFLVaryStep = 500; +double GMRESCFLScale = 1.0; +int OriginalTscheme = 9; +int useLUSGSprecond = 1; +int GMRESInitStep = 1000; double pMaxForCFL = 0.2; double pMinForCFL = 0.1; double deltaMaxForCFL = 0.2; double magnifyFactorForCFL = 1.1; double reduceFactorForCFL = 0.5; -double ktmax = 1.0e10; +double ktmax = 1.0e10; -int swapDq = 1; +int swapDq = 1; int nLUSGSSweeps = 1; double LUSGSTolerance = 0.01; -int order = 2; +int order = 2; double visl_min = 0.01; double turbCFLScale = 1.0; -double csrv = 2.0; +double csrv = 1.0; double timemax = 1.0e10; double dtsave = -1.0; int maxale = 10; @@ -591,10 +609,9 @@ double lamda[] = [0.5, 1.0]; //int RKStage = 4; //double lamda[] = [0.25, 0.33333333333, 0.5, 1.0]; - -//----------------------------------------------------------------------- -# File In or Out # -//----------------------------------------------------------------------- +#************************************************************************ +# File In or Out * +#************************************************************************ // numberOfGridGroups: The number of grid groups. // gridfile: The partitioned Grid file path, using relative path, // which is relative to the working directory. @@ -611,20 +628,18 @@ double lamda[] = [0.5, 1.0]; // aircoeffile: The file path to save the aerodynamic force coefficients convergence process, write data for every default (intervalStepForce) steps. // restartNSFile: The file path to write restart flowfield variables, write data for every default (intervalStepFlow) steps. // turbfile: The file path to write restart flowfield variables of turbulence , write data for every default(intervalStepFlow) steps. -// visualfile: The visualization file path of flowfield , write data for every default (intervalStepPlot) steps. +// visualfile: The visualization file path of flowfield, write data for every default (intervalStepPlot) steps. // wall_aircoefile: The file path to save flowfield variables of wall, write data for every default steps. // nDumpSurfaceInfo = 0 the "wall_varfile" write the informations including heat flux. // nDumpSurfaceInfo = 1 the "wall_varfile" write the informations without heat flux. // nIsComputeWallDist: Whether to compute the wall distance. // 0 -- Compute wall distance. // 1 -- Not compute. -// -// protectionFile0 and protectionFile1 : Two continuation file of the data protection mechanism. -// wall_heatfluxfile : The file to output the MaxHeatFlux of wall. - -int numberOfGridGroups = 1; -string gridfile = "./grid/rae2822_hybrid2d__4.fts"; -string wallTemperaturefile= ""; +// protectionFile0 and protectionFile1: Two continuation file of the data protection mechanism. +// wall_heatfluxfile: The file to output the MaxHeatFlux of wall. +int numberOfGridGroups = 1; +string gridfile = "./grid/rae2822_hybrid2d__4.fts"; +string wallTemperaturefile = ""; int nIsComputeWallDist = 0; int walldistMethod = 1; @@ -632,10 +647,12 @@ int cellMethodOrNodeMethod = 0; string resSaveFile = "results/res.dat"; string turbresfile = "results/turbres.dat"; +string transitionResFile = "results/transitionRes.dat"; string aircoeffile = "results/aircoef.dat"; string restartNSFile = "results/flow.dat"; string turbfile = "results/turb.dat"; +string transitionFile = "results/transition.dat"; string visualfile = "results/tecflow.plt"; string wall_aircoefile = "results/wall_aircoef.dat"; @@ -645,10 +662,14 @@ string protectionFile0 = "results/flow0.dat"; string protectionFile1 = "results/flow1.dat"; string wall_heatfluxfile = "results/wall_heatflux.dat"; -int nDumpSurfaceInfo = 0; -string wall_varfile = ""; +string protectionTurbFile0 = "results/turb0.dat"; +string protectionTurbFile1 = "results/turb1.dat"; -string jetDefineFile = "bin/jet.hypara"; +string protectionTransitionFile0 = "results/transition0.dat"; +string protectionTransitionFile1 = "results/transition1.dat"; + +int nDumpSurfaceInfo = 0; +string wall_varfile = ""; string sixDofFileName = "results/sixDofInfo.dat"; string derivativeFileName = "results/identify.dat"; @@ -659,7 +680,8 @@ int plotFieldType = 0; // visualfileType: The file type of visualfile. // 0 -- Tecplot binary. // 1 -- Tecplot ASCII. - +// 2 -- Ensight binary. +// 3 -- Ensight ASCII. int visualfileType = 1; // samplefileMode: The dump mode of sample file. @@ -697,21 +719,21 @@ double upperPlotFieldBox[] = [1.0 1.0 1.0]; // -- vibration temperature(Tv, 33), electron temperature(Te, 34), vibrational energy(Ev, 35), electric energy(Ee, 36), // -- number density of electron(Ne, 37), dimensioanl density(rho, 38), dimensioanl pressure(p, 39), dimensioanl temperature(T, 40), // -- gradientUx(41), gradientUy(42), gradientVx(43), gradientVy(44), streamline_u(45), streamline_v(46), streamline_w(47), -// -- transition intermittency(intermittency, 51), -transition momentum thickness reynolds(MomentumThicknessReynolds, 52), -// -- overlap iblank(iblank, 81) - -// -- specific heat ratio(gama, 56) +// -- transition intermittency(intermittency, 51), transition momentum thickness reynolds(MomentumThicknessReynolds, 52), +// -- local CFL Number(localCFL, 57), minimal CFL Number(minCFL, 58), +// -- overlap iblank(iblank, 81), +// -- specific heat ratio(gama, 56), Knudsen number(kn, 60), Damkohler number(Da, 61), vibrational nonequilibrium number(Vi, 62). // Important Warning: Array size of visualVariables MUST be equal to nVisualVariables!!! // Variables order must from small to big. //-----------the optional parameters list for the wall boundary condition---------------- // nVisualWallVariables: The number of visual variables on wall. // visualWallVariables : dumped variable types, listed as following: -// -coefficient of pressure(cp, 0), -coefficient of friction(cf, 1), yplus(2), -non-dimensional heat flux(Q_NonDim, 3), -dimensional heat flux(Q_Dim, 4), -// -pressure on wall(pw, 5), -temperature on wall(Tw, 6), -density on wall(rhow, 7), -heat flux of translational-rotational temperature term(Qtr, 8), -// -heat flux of species diffusion term(Qs, 9), -heat flux of vibrational temperature term(Qv, 10), -heat flux of electron temperature term(Qe, 11), -// -species mass fractions(Ns, 12), -x component of wall velocity(Vx, 13), -y component of wall velocity(Vy, 14), -z component of wall velocity(Vz, 15) -// -slip translational-rotational temperature(Tts, 16), -slip vibrational temperature(Tvs, 17), -slip electron temperature(Tes, 18), -absolute wall velocity(Vs, 19) -// -Stanton number(St, 20), -coefficient of heat rate(Ch, 21), -temperature jump(deltaT, 22), -Grid Reynolds number on wall(Re_w, 23) +// -- coefficient of pressure(cp, 0), coefficient of friction(cf, 1), yplus(2), non-dimensional heat flux(Q_NonDim, 3), dimensional heat flux(Q_Dim, 4), +// -- pressure on wall(pw, 5), temperature on wall(Tw, 6), density on wall(rhow, 7), heat flux of translational-rotational temperature term(Qtr, 8), +// -- heat flux of species diffusion term(Qs, 9), heat flux of vibrational temperature term(Qv, 10), heat flux of electron temperature term(Qe, 11), +// -- species mass fractions(Ns, 12), x component of wall velocity(Vx, 13), y component of wall velocity(Vy, 14), z component of wall velocity(Vz, 15), +// -- slip translational-rotational temperature(Tts, 16), slip vibrational temperature(Tvs, 17), slip electron temperature(Tes, 18), absolute wall velocity(Vs, 19), +// -- Stanton number(St, 20), coefficient of heat rate(Ch, 21), temperature jump(deltaT, 22), Grid Reynolds number on wall(Re_w, 23), Knudsen number(Kn_wall, 24). int nVisualVariables = 8; int visualVariables[] = [0, 1, 2, 3, 4, 5, 6, 15]; @@ -739,16 +761,18 @@ int dumpStandardModel = 0; // 1 -- Real cell where the probe is located. // nProbeVariables: Number of variables want to be dumped for probes monitered. // probeVariables : Variable types dumped, listed as following: -// -- density(0), u(1), v(2), w(3), pressure(4), temperature(5), mach(6). +// -- density(0), u(1), v(2), w(3), pressure(4), temperature(5), mach(6), +// -- dimensioanl_density(7), dimensioanl_u(8), dimensioanl_v(9), +// -- dimensioanl_w(10), dimensioanl_pressure(11), dimensioanl_temperature(12). // Important Warning: Array size of probeVariables MUST be equal to nProbeVariables!!! // probeVariables order must from small to big. // probeVariablesInterpolationMethod: Interpolation method used to compute the probe variables. -// 0 -- Take the value of probe's cell as probe real value. -// 1 -- Interpolation from probe's and neighbouring cell to probe. -// 2 -- Interpolation from probe's cell nodes to probe. +// 0 -- Take the value of probe's cell as probe real value. +// 1 -- Interpolation from probe's and neighbouring cell to probe. +// 2 -- Interpolation from probe's cell nodes to probe. int ifSetDataMonitor = 0; -int dataMonitorType = 0; +int dataMonitorType = 0; string probesDefineFile = "bin/probes_XYZ.dat"; //int dataMonitorType = 1; @@ -761,28 +785,26 @@ string probesDefineFile = "bin/probes_XYZ.dat"; int searchCellsMethod = 0; -int nProbeVariables = 7; -int probeVariables[] = [0, 1, 2, 3, 4, 5, 6]; -int probeVariablesInterpolationMethod = 0; -//----------------------------------------------------------------------- -# Turbulence Parameter # -//----------------------------------------------------------------------- +int nProbeVariables = 14; +int probeVariables[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]; +int probeVariablesInterpolationMethod = 0; + +#************************************************************************ +# Turbulence Parameter * +#************************************************************************ // turbInterval: Iteration number of turbulence. // kindOfTurbSource: Kinds of turbulent source. // 0 -- Original. // mod_turb_res: If modify the residuals for the cells next to the wall or not, default is 0. -// transitionType: transition model type +// transitionType: transition model type // 0 -- none. // 2 -- gama-re-theta. -// turbIntensity: (valid while greater than 0.0 ) turbulent intensity of free stream(*100) in transition -// freeturbIntensitySRModify: to use SR modify in free stream turbulent intensity decay or not - - +// turbIntensity: (valid while greater than 0.0 ) turbulent intensity of free stream(*100) in transition. +// freeturbIntensitySRModify: to use SR modify in free stream turbulent intensity decay or not. int turbInterval = 1; int turbOrderStruct = 2; int kindOfTurbSource = 0; int mod_turb_res = 0; -double turb_relax = 1.0; double freeStreamViscosity = 1.0e-3; double muoo = 3.0; double kwoo = 5.0; @@ -790,29 +812,28 @@ int transitionType = 0; double turbIntensity = -1.0; int freeturbIntensitySRModify = 0; double freeDecayXLocation = 0.0; -int compressibleCorrection = 0; -int prandtlNumberCorrection = 0; +int compressibleCorrection = 0; int transitionMaFix = 1; -# maximum eddy viscosity (myt/my) max. +// maximum eddy viscosity (myt/my) max. double eddyViscosityLimit = 1.0e10; int monitor_vistmax = 0; -//----------------------------------------------------------------------- -# LES Parameter # -//----------------------------------------------------------------------- +#************************************************************************ +# LES Parameter * +#************************************************************************ // iLES: Create LESSolver or not. -// = 1 - Create LESSolver; -// != 1 - not. +// = 1 -- Create LESSolver; +// != 1 -- not. // amplitudeofDisturb: Amplitude of adding disturb. // disturbstep: Unsteady time step or steady iteration of adding random disturb. // iterdisturb: Add random disturb in every sub-iter or only first sub-iter. -// = 0 - in only first sub-iter; -// != 0 - in every sub-iter. +// = 0 -- in only first sub-iter; +// != 0 -- in every sub-iter. // ipraddisturb: Add density and pressure disturb or not. // ibodyforce: Add body force in source flux of NS equations or not. -// = 0 - not; -// != 0 - Add body force. +// = 0 -- not; +// != 0 -- Add body force. // bodyforce: Body force in source flux of NS equations or not. // utau: friction velocity, using in DNSDisturb. // sgsmodel: subgrid scale model. @@ -820,23 +841,22 @@ int monitor_vistmax = 0; // = "dsmCom"; // = "wale"; // = "sigma". -// deltaFunctionType: = 1 - MAX(deltai, deltaj, deltak); -// = 2 - pow(deltai * deltaj *deltak, 1/3); -// = 3 - Devloped by Scotti. -// wallDampingFunctionType: = 0 - no wall function; -// = 1 - van Driest; -// = 2 - developed by Dr. Deng Xiaobing; -// = 3 - developed by Piomelli. +// deltaFunctionType: = 1 -- MAX(deltai, deltaj, deltak); +// = 2 -- pow(deltai * deltaj *deltak, 1/3); +// = 3 -- Devloped by Scotti. +// wallDampingFunctionType: = 0 -- no wall function; +// = 1 -- van Driest; +// = 2 -- developed by Dr. Deng Xiaobing; +// = 3 -- developed by Piomelli. // turbViscousCutType: turbulent viscosity cut type. -// = 0 - mu_total = mut + mul; -// = 1 - mu_total = max(mut-mul,0)+ mul; -// = 2 - mu_total = max(mut ,0)+ mul. +// = 0 -- mu_total = mut + mul; +// = 1 -- mu_total = max(mut-mul, 0) + mul; +// = 2 -- mu_total = max(mut , 0) + mul. // smagConstant: constant of smagorinsky model. // waleConstant: constant of wale model. -// filterDirection[3]: filter variables in i, j, k direction or not. +// filterDirection [3]: filter variables in i, j, k direction or not. // averageDirection[3]: average variables in i, j, k direction or not. // isotropicConstant: constant of isotropic part of SGS stress. - int iLES = 0; string sgsmodel = "smagorinsky"; int deltaFunctionType = 2; @@ -852,19 +872,16 @@ double testFilterScale = 2.0; int averageWidth = 1; int monitorNegativeConstant = 0; -//----------------------------------------------------------------------- -# Other Parameters for Hypersonic Non-equilibrium Gas # -//----------------------------------------------------------------------- +#************************************************************************ +# Other Parameters for Hypersonic Non-equilibrium Gas * +#************************************************************************ // dg_high_order: // 0 -- generic order accuracy. // 1 -- high order accuracy. // iapplication: // 0 -- gas model is fixed in the codes. // 1 -- gas model is imported from library files. -// isAdaptiveSolver: isAdaptiveSolver=0 indicates the generic Navier-Stokes solver, -// isAdaptiveSolver>0 indicates the HyFlow self-adaptive solver. -// 1 -- using HyFlow self-adaptive solver where the switch is controlled by the total iteration steps. -// 2 -- using HyFlow self-adaptive solver where the switch is controlled by variation of the key residual. +// isAdaptiveSolver: isAdaptiveSolver = 0 indicates the generic Navier-Stokes solver, // nm: Equation number of the physics, but is out of commision now. // 4 -- for 2D. // 5 -- for 3D. @@ -875,7 +892,7 @@ int monitorNegativeConstant = 0; // 2 -- Argon. // 3 -- Nitrogen. // nEnergyRecycle: The type of EnergyModel Recycle. -// 0 -- not used . +// 0 -- not used. // 1 -- used. // nDensityModify: The type of densitymodify. // 0 -- not used. @@ -883,26 +900,25 @@ int monitorNegativeConstant = 0; // nchem: // 0 -- without chemical reaction flow. // 1 -- the chemical reaction flow is considered. -// nEquilibriumGas: the variable is valid when the condition of nchem=0 is satisfied. +// nEquilibriumGas: the variable is valid when the condition of nchem = 0 is satisfied. // 0 -- perfect gas. // 5, 7, 11 -- equilibrium gas, meanwhile, its value denotes the number of gas component. -// nPCWCycleStep: the maximum step number of iteration in the module of computing species mass fractions with the partial catalytic wall(PCW) condition. -// the value equals to or is greater than 1, and 3 is for default value. -// nRETCycleStep: the maximum step number of iteration in the module of computing radiation equilibrium temperature on wall. -// the value equals to or is greater than 1, and 3 is for default value. -// nSLIPCycleStep:the maximum step number of iteration in the module of computing slip temperature, slip velocity and slip species mass fraction. -// the value equals to or is greater than 1, and 3 is for default value. -// nSlipBCModel : The computational model of slip boundary conditions. - -// 0 -- no slip. -// 1 -- the conventional Maxwell slip conditions. -// 2 -- the Gokcen slip conditions. -// 3 -- the Knudsen-layer correction of the standard slip conditions proposed by Lockerby, et al. -// 4 -- the Kogan simplified slip conditions. -// nMeanFreePathType : the method to the mean free-path for the slip conditions. For the mixture, 0 is suggested. -// 0 -- the equivalent mean free-path is calculated by the simple hard sphere model(HS). -// 1 -- calculated by the definition that includes the variables of the number density and the molecule diameter. -// 2 -- the equivalent mean free-path is calculated by the variable hard sphere model(VHS). +// nPCWCycleStep: The maximum step number of iteration in the module of computing species mass fractions with the partial catalytic wall(PCW) condition. +// The value equals to or is greater than 1, and 3 is for default value. +// nRETCycleStep: The maximum step number of iteration in the module of computing radiation equilibrium temperature on wall. +// The value equals to or is greater than 1, and 3 is for default value. +// nSLIPCycleStep:The maximum step number of iteration in the module of computing slip temperature, slip velocity and slip species mass fraction. +// The value equals to or is greater than 1, and 3 is for default value. +// nSlipBCModel: The computational model of slip boundary conditions. +// 0 -- no slip. +// 1 -- the conventional Maxwell slip conditions. +// 2 -- the Gokcen slip conditions. +// 3 -- the Knudsen-layer correction of the standard slip conditions proposed by Lockerby, et al. +// 4 -- the Kogan simplified slip conditions. +// nMeanFreePathType: the method to the mean free-path for the slip conditions. For the mixture, 0 is suggested. +// 0 -- the equivalent mean free-path is calculated by the simple hard sphere model(HS). +// 1 -- calculated by the definition that includes the variables of the number density and the molecule diameter. +// 2 -- the equivalent mean free-path is calculated by the variable hard sphere model(VHS). // nchemsrc: // 0 -- the source terms are not computed. // 1 -- the source terms are computed. @@ -913,148 +929,151 @@ int monitorNegativeConstant = 0; // 1 -- One-temperature model. // 2 -- Two-temperature model. // 3 -- Three-temperature model. +// isUseNoneqCond: +// 0 -- compute the source terms without any conditions. +// 1 -- compute the source terms using the non-equilibrium condition. +// frozenCondition: the threshold value of frozen chemical flow condition, 0.1 is the default value. // nIdealState: whether take all gas species as ideal gas for gas-mixture process. // 0 -- No. -// 1 -- Yes. -// nTEnergyModel: the method to computing temperature energy model. +// 1 -- Yes. // nTEnergyModel: the method to computing temperature energy model. // 0 -- the energy term is computed using the conventional method. // 1 -- the energy term is computed using the polynomial fitting method. // 2 -- the energy term is computed using the piecewise polynomial fitting method. // parkVDPower: the power of translational-rotational temperature in the Park V-D(vibration-dissociation) coupling model. // The value is in range of [0.0, 1.0], DPLR suggests 0.5, LAURA suggests 0.7, while 0.6 is given as default value. // catalyticCoef: -// 0.0 -- full non-catalytic wall boundary condition. -// 1.0 -- full catalytic wall boundary condition. -// in range of (0.0, 1.0) -- partial catalytic condition, the value indicates the catalytic coefficient. -// nIsSuperCatalytic : the super catalytic condition for the fully catalytic wall, and assigned with the value of 1. -// 0 -- equilibrium condition for the fully catalytic wall where the mass fractions are assigned with the values of the free stream. -// 1 -- super catalytic condition for the fully catalytic wall where all the atomic components combine into molecular components. -// nTemperatureJump : the method to calculate the temperature jump. -// 0 -- calculated by the variables of heat conductivity and constant volume specific heat for each energy mode. -// 1 -- the general method where the iteration is calculated with the translation-rotation temperature. -// nSurfGradMethod : the method to compute the surface heating ratio. -// 0 -- the gradient of variable is computed with the first-order difference method. -// 1 -- the gradient of variable is computed with the Green-Guass integral method. -// nRapidFlowfield : initialize the flowfield using the rapid engineering method when it is greater than zero. -// nSurfHeatMonitor : To exam the surface heating change or not. 0 is no, 1 is yes. -// nInitPressureStep : the steps to initialize the boundary variables when the rapid method is used. 100 is the default value. -// nDumpCFLNumber : 1 indicates dumping the CFL number to file, 0 denotes no dumping. +// 0.0 -- full non-catalytic wall boundary condition. +// 1.0 -- full catalytic wall boundary condition. +// in range of (0.0, 1.0) -- partial catalytic condition, the value indicates the catalytic coefficient. +// nIsSuperCatalytic: the super catalytic condition for the fully catalytic wall, and assigned with the value of 1. +// 0 -- equilibrium condition for the fully catalytic wall where the mass fractions are assigned with the values of the free stream. +// 1 -- super catalytic condition for the fully catalytic wall where all the atomic components combine into molecular components. +// nTemperatureJump: the method to calculate the temperature jump. +// 0 -- calculated by the variables of heat conductivity and constant volume specific heat for each energy mode. +// 1 -- the general method where the iteration is calculated with the translation-rotation temperature. +// nSurfGradMethod: the method to compute the surface heating ratio. +// 0 -- the gradient of variable is computed with the first-order difference method. +// 1 -- the gradient of variable is computed with the Green-Guass integral method. +// nRapidFlowfield: initialize the flowfield using the rapid engineering method when it is greater than zero. +// nSurfHeatMonitor: To exam the surface heating change or not. 0 is no, 1 is yes. +// nInitPressureStep: the steps to initialize the boundary variables when the rapid method is used. 100 is the default value. +// nDumpCFLNumber: 1 indicates dumping the CFL number to file, 0 denotes no dumping. // sigmaVelocity: the coordination coefficient of tangential momentum for computation of slip velocity. The value is in range of (0.0, 2.0]. // sigmaTemperature: the heat coordination coefficient for computation of slip temperature. The value is in range of (0.0, 2.0]. // sigmaMassFraction: the species coordination coefficient for computation of slip mass fractions. The value is in range of (0.0, 2.0]. // velocitySlipCorrectConstant: the correction constant to the velocity slip condition. For the diffuse reflection, 1.0 is used. -// 1.0 -- proposed by Maxwell. -// sqrt(2/PI)~0.8 -- used for "micro-slip", namely the actual velocity slip at the wall. -// 1.146 -- proposed for an additional "fictitious" velocity slip. - -// chemicalRelaxCorf: The value is in range of [0.001, 1.0]. -// spectrumRadiusCoef: The value is in range of [0.0, 2.0]. -// staticPressureRelaxCorf: The value is in range of [0.1, 1.0]. -// nIsChemicalFreeze : the flag to freeze the chemical reactions. -// 0 -- not freeze, the chemical reaction sources will be calculated. -// 1 -- freezes the chemical reactions, the chemical reaction sources will not be calculated.// veTemperatureMin: The minimum of Tv and Te - -//maxViscous: the maximum of Viscous. -//trTemperatureMin: the minimum value of trTemperature. -//veTemperatureMin: the minimum value of veTemperature. -//densityMin: the minimum value of density. -//tAdjustmentFactor: magnification of temperature, this value is in range of (1.0, 10.0]. -// nDebug: cout the Wrong place and abort -// 0 -- not used. -// 1 -- used. +// 1.0 -- proposed by Maxwell. +// sqrt(2/PI)~0.8 -- used for "micro-slip", namely the actual velocity slip at the wall. +// 1.146 -- proposed for an additional "fictitious" velocity slip. +// chemicalRelaxCorf: The value is in range of [0.001, 1.0]. +// spectrumRadiusCoef: The value is in range of [0.0, 2.0]. +// staticPressureRelaxCorf: The value is in range of [0.1, 1.0]. +// nIsChemicalFreeze: the flag to freeze the chemical reactions. +// 0 -- not freeze, the chemical reaction sources will be calculated. +// 1 -- freezes the chemical reactions, the chemical reaction sources will not be calculated. +// veTemperatureMin: The minimum of Tv and Te. +// maxViscous: the maximum of Viscous. +// trTemperatureMin: the minimum value of trTemperature. +// veTemperatureMin: the minimum value of veTemperature. +// densityMin: the minimum value of density. +// tAdjustmentFactor: magnification of temperature, this value is in range of (1.0, 10.0]. +// nDebug: cout the Wrong place and abort +// 0 -- not used. +// 1 -- used. // nSpeciesLimit: limitter of gas species -// 0 -- not used. -// 1 -- used. -// nTurblenceForChemical: the coupled mode of Turblence and Chemical reaction -// 0 -- method 0. -// 1 -- method 1. -// nViscosityFluxSublevelModified: Modified for ViscosityFlux on Sublevel grid -// 0 -- not used. -// 1 -- used. -// nViscosityPeModified: Pe Modified for ViscosityCoef -// 0 -- not used. -// 1 -- used. -// nChemcalSourceModified: Modified on ChemcalSource -// 0 -- not used. -// 1 -- used. -// nChemcalSourceEsMethod: Modified on ChemcalSource -// 0 -- approximation algorithm 1 (Ori.) -// 1 -- approximation algorithm 2 (New) - +// 0 -- not used. +// 1 -- used. +// nTurblenceForChemical: the coupled mode of Turblence and Chemical reaction. +// 0 -- method 0. +// 1 -- method 1. +// nViscosityFluxSublevelModified: Modified for ViscosityFlux on Sublevel grid. +// 0 -- not used. +// 1 -- used. +// nViscosityPeModified: Pe Modified for ViscosityCoef. +// 0 -- not used. +// 1 -- used. +// nChemcalSourceModified: Modified on ChemcalSource. +// 0 -- not used. +// 1 -- used. +// nChemcalSourceEsMethod: Modified on ChemcalSource. +// 0 -- approximation algorithm 1 (Ori). +// 1 -- approximation algorithm 2 (New). // nMaxStepTemperature: the iterative steps of temperature. - -// veTemperatureMinModified: Modified on the minimum of Tve for Cvvs -// 0 -- not used -// 1 -- used - -// nDiagonalModified: Modified on Diagonal -// 0 -- not used -// 1 -- Ori. -// 2 -- new - -//nGradPrimtiveMethod: -// 0 -- Ori. -// 1 -- new +// veTemperatureMinModified: Modified on the minimum of Tve for Cvvs. +// 0 -- not used. +// 1 -- used. +// nDiagonalModified: Modified on Diagonal. +// 0 -- not used. +// 1 -- new. +// nDiagonalModifiedTurb: Modified on Diagonal for turbulence. +// 0 -- not used. +// 1 -- new. +// nGradPrimtiveMethod: +// 0 -- Ori. +// 1 -- new. // nAblation: -// 0 -- The wall ablation is not computed. -// 1 -- The wall ablation is computed. +// 0 -- The wall ablation is not computed. +// 1 -- The wall ablation is computed. // isInjection: -// 0 -- The injection velocity of ablation wall is not computed. -// 1 -- The injection velocity of ablation wall is computed. +// 0 -- The injection velocity of ablation wall is not computed. +// 1 -- The injection velocity of ablation wall is computed. // nViscosityModel: -// 0 -- Blottner fitting method(N89). -// 1 -- Gupta fitting method(N90). +// 0 -- Blottner fitting method(N89). +// 1 -- Gupta fitting method(N90). // nContinueModel: The new continue model can switch different computation model. -// 0 -- Not use the new continue model. -// 1 -- use the new continue model. +// 0 -- Not use the new continue model. +// 1 -- use the new continue model. // nSutherland: -// 0 -- stands for selecting the Blotter curve fits mode. -// 1 -- stands for Sutherland relation. +// 0 -- stands for selecting the Blotter curve fits mode. +// 1 -- stands for Sutherland relation. // gasfile: Indicates the gas model, 9 models are provided, namely "Gu5", "Gu7", "Gu11", "Pa5", "Pa7", "Pa11", "DK5", "DK7", "DK11". -// "Gu" -- indicates the Gupta Model, three-Type Models are embeded in the library, namely, the 5-species-6-reactions, the 7-species-9-reactions, the 11-species-20-reactions. -// "Pa" -- indicates the Park Model, three-Type Models are embeded in the library, namely, the 5-species-17-reactions, the 7-species-22-reactions, the 11-species-48-reactions. -// "DK" -- indicates the Dunn-Kang Model, three-Type Models are embeded in the library, namely, the 5-species-11-reactions, the 7-species-15-reactions, the 11-species-26-reactions. -// "Mars-Pa8" is for Park model of Mars gas, "Mars-Mc8" for McKenzie model of Mars gas. -// "Combustion-12" -- indicates the Combustion Chamber Gas Model which includes 12-species-20-reactions. -// "Gas-Mixture" -- indicates the process of mixing gas without reacting. -// for struct solver mixing two speciesSpeciesA, SpeciesB. -// for unstruct solver mixing multi-speciesO2 NO CO CO2 H2 N2 Air CH4. -// For self-definition model, the gasfile is used to indicate the file path of the new gas model. +// "Gu" -- indicates the Gupta Model, three-Type Models are embeded in the library, namely, the 5-species-6-reactions, the 7-species-9-reactions, the 11-species-20-reactions. +// "Pa" -- indicates the Park Model, three-Type Models are embeded in the library, namely, the 5-species-17-reactions, the 7-species-22-reactions, the 11-species-48-reactions. +// "DK" -- indicates the Dunn-Kang Model, three-Type Models are embeded in the library, namely, the 5-species-11-reactions, the 7-species-15-reactions, the 11-species-26-reactions. +// "Mars-Pa8" is for Park model of Mars gas, "Mars-Mc8" for McKenzie model of Mars gas. +// "Combustion-12" -- indicates the Combustion Chamber Gas Model which includes 12-species-20-reactions. +// "Gas-Mixture" -- indicates the process of mixing gas without reacting. +// for struct solver mixing two species��SpeciesA, SpeciesB��. +// for unstruct solver mixing multi-species��O2 NO CO CO2 H2 N2 Air CH4��. +// For self-definition model, the gasfile is used to indicate the file path of the new gas model. // speciesName: Used to list the names of each species, while each species name is separated by the symbol of comma. // initMassFraction: Used to list the initial mass fractions of species in accordance with the sequence of names in the parameter speciesName. // ifStartFromPerfectGasResults: The chemical reaction simulation is start from perfect gas flowfield or not, 0 is for no and else is for yes. -// nIterFirstStep : the maximum number of iteration in the first step for the self-adaptive calculation. -// nIterSecondStep : the maximum number of iteration in the second step for the self-adaptive calculation. -// nIterThirdStep : the maximum number of iteration in the third step for the self-adaptive calculation. -// nEnergyAssembly : the vibration energy is computed with combined method which includes the fitting method and the molecular kinetic theory. -// 0 -- no, -// 1 -- yes. +// nIterFirstStep : the maximum number of iteration in the first step for the self-adaptive calculation. +// nIterSecondStep: the maximum number of iteration in the second step for the self-adaptive calculation. +// nIterThirdStep : the maximum number of iteration in the third step for the self-adaptive calculation. +// nEnergyAssembly: the vibration energy is computed with combined method which includes the fitting method and the molecular kinetic theory. +// 0 -- no, +// 1 -- yes. // nControlVariable: the variable to computing the residual error that determines the convergence is meet or not in the one-temperature model. -// 0 -- the density. -// 1 -- the translation temperature. -// 2 -- the vibration temperature. -// 3 -- the electron temperature. -// 4 -- the pressure. -// 5 -- the mass fraction of oxygen. -// 6 -- the mass fraction of nitrogen. +// 0 -- the density. +// 1 -- the translation temperature. +// 2 -- the vibration temperature. +// 3 -- the electron temperature. +// 4 -- the pressure. +// 5 -- the mass fraction of oxygen. +// 6 -- the mass fraction of nitrogen. // firstStepError : the residual error of the first step iteration for the self-adaptive calculation. // secondStepError : the residual error of the second step iteration for the self-adaptive calculation. // thirdStepError : the residual error of the third step iteration for the self-adaptive calculation. -// useHyflowSetting : Setting for HyFLOW GUI. -// 0 -- PHengLEI -// 1 -- HyFLOW -// nProtectData : Use the continuation file data protection mechanism. -// 0 -- no -// 1 -- yes - +// nProtectData: Use the continuation file data protection mechanism. +// 0 -- no. +// 1 -- yes. +// nTvChange: Judge whether the Tv equals Ttr. +// 0 -- yes. +// 1 -- no. +// isMoleFractionType: 1 indicates the mass fractions, or else the mole fractions. +// nFraction: the initial fractions type of species. +// 0 -- mass fraction. +// 1 -- mole fraction. int dg_high_order = 0; int iapplication = 0; int isAdaptiveSolver = 0; -int nm = 5; +int nm = 5; int nEquilibriumGas = 0; -int nPCWCycleStep = 3; -int nRETCycleStep = 3; -int nSLIPCycleStep= 3; +int nPCWCycleStep = 3; +int nRETCycleStep = 3; +int nSLIPCycleStep = 3; int nIterFirstStep = 1000; int nIterSecondStep= 2000; int nIterThirdStep = 2000; @@ -1065,17 +1084,17 @@ double secondStepError = 0.001; double thirdStepError = 0.001; double predictCFLError = 0.1; -double refGama = 1.4; -double prl = 0.72; -double prt = 0.90; -double sc_l = 0.5; -double sc_t = 0.5; +double refGama = 1.4; +double prl = 0.72; +double prt = 0.90; +double sc_l = 0.5; +double sc_t = 0.5; -int nGasModel = 0; -int nchem = 0; -int nchemsrc = 1; -int nchemrad = 1; -int ntmodel = 1; +int nGasModel = 0; +int nchem = 0; +int nchemsrc = 1; +int nchemrad = 1; +int ntmodel = 1; int nIdealState = 0; int nEnergyRecycle = 1; @@ -1099,12 +1118,12 @@ double sigmaTemperature = 1.0; double sigmaMassFraction = 1.0; double velocitySlipCorrectConstant = 1.0; -double chemicalRelaxCorf = 1.0; +double chemicalRelaxCorf = 1.0; double chemicalSpectrumRadiusCoef = 1.0; double viscousSpectrumRadiusCoef = 1.5; double inviscidSpectrumRadiusCoef = 1.5; -double spectrumRadiusCoef = 0.5; -double staticPressureRelaxCorf = 0.2; +double spectrumRadiusCoef = 0.5; +double staticPressureRelaxCorf = 0.2; double maxViscous = 10000.0; double trTemperatureMin = 10.0; @@ -1114,31 +1133,35 @@ double densityMin = 1.0e-8; double densityMinFactor = 0.1; double tAdjustmentFactor = 10.0; double iniSpeedCoef = 1.0; +int iniSpeedMode = 0; -int nDebug = 0; -int nSpeciesLimit = 1; -int nTurblenceForChemical = 0; -int nViscosityFluxSublevelModified = 1; -int nViscosityPeModified = 0; -int nChemcalSourceModified = 2; -int nChemcalSourceEsMethod = 1; -int nMaxStepTemperature = 5; -int veTemperatureMinModified = 1; -int nDiagonalModified = 0; -int nGradPrimtiveMethod = 1; -int nInviscidFluxModify = 1; -int nQlLimitMethod = 2; -int nSpeciesForWallMethod = 1; -int nDensityForWallMethod = 0; +int nDebug = 0; +int nSpeciesLimit = 1; +int nTurblenceForChemical = 0; +int nViscosityFluxSublevelModified = 1; +int nViscosityPeModified = 0; +int nChemcalSourceModified = 2; +int nChemcalSourceEsMethod = 1; +int nMaxStepTemperature = 5; +int veTemperatureMinModified = 1; +int nDiagonalModified = 0; +int nDiagonalModifiedTurb = 0; +int nGradPrimtiveMethod = 1; +int nInviscidFluxModify = 1; +int nQlLimitMethod = 2; +int nSpeciesForWallMethod = 1; +int nDensityForWallMethod = 0; +int wallMultiTemperature = 0; -int nProtectData = 0; -int useHyflowSetting = 0; -int nAblation = 0; -int isInjection = 0; -int nViscosityModel = 0; -int nMarsModel = 0; -string gasfile = "DK5"; -//string gasfile = "./chemical/Dunn-Kang_air5s11r.dat"; +int nProtectData = 0; +int nAblation = 0; +int isInjection = 0; +int nViscosityModel = 0; +int nMarsModel = 0; +int nTvChange = 0; +int isMoleFractionType = 0; +string gasfile = "DK5"; +//string gasfile = "./chemical/Dunn-Kang_air5s11r.dat"; string speciesName = "O, O2, NO, N, N2"; string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.767"; @@ -1152,16 +1175,16 @@ string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.767"; //string speciesName = "O, O2, NO, N, N2, C, CO, CO2"; //string initMassFraction = "0.0015, 0.0429, 0.0, 0.0, 0.0, 0.0, 0.0777, 0.8779"; -//string gasfile = "Pa"; +//string gasfile = "Pa"; //string speciesName = "O, O2, NO, N, NO+, C, C2, CO, CO2, CN, N2, e-"; //string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.767, 0.0"; -//string gasfile = "Combustion-12"; +//string gasfile = "Combustion-12"; //string speciesName = "O, O2, NO, N, C, CO, CO2, H, H2, OH, H2O, N2"; //string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.767"; //string gasfile = "Gas-Mixture"; -//string speciesName ="SpeciesA, SpeciesB"; +//string speciesName = "SpeciesA, SpeciesB"; //string initMassFraction = "1.0, 0.0"; int nSutherland = 0; double gamaSpeciesA = 1.4; @@ -1173,9 +1196,17 @@ double molecularWeightSpeciesB = 30.0; //string speciesName = "O2, N2"; //string initMassFraction = "1.0, 0.0"; +int nFraction = 0; int nContinueModel = 0; int nChemicalFlowStep = 0; int ifStartFromPerfectGasResults = 0; +int isUseNoneqCond = 0; +double frozenCondition = 0.01; + +int nLeakageMonitor = 0; +double totalLeakageVolume = 1000.0; +double monitorThresholdValue = 0.05; +double sprayFactor = 0.0; ######################################################################### // Multi-Grid parameters. @@ -1196,7 +1227,6 @@ int ifStartFromPerfectGasResults = 0; // 1 -- zero order. // 2 -- first-order. (default) // mgCorrectionLimit: Multi-grid correction limit. - int nMGLevel = 1; int MGCoarsestIteration = 1; int MGPreIteration = 1; @@ -1218,20 +1248,20 @@ int ismooth_turb = 0; int SAProductType = 2; // ----------------- Overset Grid parameter ----------------------------- -int codeOfDigHoles = 1; -int codeOfTurbulentModel = 0; -string masterFileName = "./grid/searchFile.inp"; -string holeBasicFileName = "./grid/holeBasicFile.inp"; -string holeFullFileName = "./grid/holeFullFile.dat"; -string linkFileName = "./grid/topology.dat"; -string zoneInverseFileName = "./grid/zoneInverseMapping.inp"; +int codeOfDigHoles = 1; +int codeOfTurbulentModel = 0; +string masterFileName = "./grid/searchFile.inp"; +string holeBasicFileName = "./grid/holeBasicFile.inp"; +string holeFullFileName = "./grid/holeFullFile.dat"; +string linkFileName = "./grid/topology.dat"; +string zoneInverseFileName = "./grid/zoneInverseMapping.inp"; -######################################################################### -# High Order Struct Solver # -######################################################################### +#************************************************************************ +# High Order Struct Solver * +#************************************************************************ // isFVMOrFDM: -// 0 -- NSSolverStruct using Finite Volume Method. -// 1 -- NSSolverStruct using Finite Differ Method. +// 0 -- NSSolverStruct using Finite Volume Method. +// 1 -- NSSolverStruct using Finite Differ Method. // SolverStructOrder: Spatial discretisation order of NS equations with struct grid. // <= 2 -- finite volume method. // >= 3 -- finite difference order. (to be completed) @@ -1273,30 +1303,48 @@ int allReduceStep = 1; // codeOfOversetGrid: Overlapping(overset) grid or not. // 0 -- NON-overlapping grid. // 1 -- Overlapping grid. -// oversetInterpolationMethod: the method of overset interpolation while field simulation +// oversetInterpolationMethod: the method of overset interpolation while field simulation. // 0 -- set the acceptor cell value by donor cell value. // 1 -- set the acceptor cell value by distance weight of donor cell value. - -int codeOfOversetGrid = 0; -int oversetInterpolationMethod = 0; -int readOversetFileOrNot = 0; -int symetryOrNot = 0; -int readInAuxiliaryInnerGrid = 0; -int readInAuxiliaryOuterGrid = 0; -int readInSklFileOrNot = 0; -string auxiliaryInnerGrid0 = "./grid/aux-upper.fts"; -string auxiliaryInnerGrid1 = "./grid/aux-lower.fts"; -string auxiliaryInnerGrid2 = ""; -string oversetGridFileName = "./grid/iblank.ovs"; -double walldistMainZone = 1.0 -double toleranceForOversetSearch = 1.0e-3; -double toleranceForOversetBox = 1.0e-3; -int twoOrderInterpolationOrNot = 0; -int keyEnlargeOfActiveNodes = 0; -int outTecplotOverset = 0; -int outPutOversetVisualization = 0; - -int numberOfMovingBodies = 2; +// readOversetFileOrNo: Whether to read overset-file(.ovs) that has been generated. +// 0 -- no. +// 1 -- yes. +// symetryOrNot: If there exist symetryplanes(XY plane, the coordinate of Z direction is 0) in +// the current overset grid(only for three dimension). +// 0 -- no. +// 1 -- yes. +// readInAuxiliaryInnerGrid: Whether to read auxiliary inner grid. +// 0 -- no. +// 1 -- yes. +// walldistMainZone: The initial value of background grid which does not exist wall boundary condition. +// toleranceForOversetSearch: The tolerance of overset searching zone to judge whether the obtained node is in the current computing cell. +// toleranceForOversetBox: The tolerance of building the minimum box of computing cells in the overlapping region. +// twoOrderInterpolationOrNot: The number of interpolated cell layers in the overlapping boundary. +// 0 -- one layer. +// 1 -- two layers. +// keyEnlargeOfActiveNodes: The number of enlarged overset-boundary layers in the buffer region. +// outTecplotOverset: Whether to dump out the flowfield data after the progress of overset configure. +// 0 -- no. +// 1 -- yes. +int codeOfOversetGrid = 0; +int oversetInterpolationMethod = 0; +int readOversetFileOrNot = 0; +int symetryOrNot = 0; +int readInAuxiliaryInnerGrid = 0; +int readInAuxiliaryOuterGrid = 0; +int readInSklFileOrNot = 0; +string auxiliaryInnerGrid0 = "./grid/aux-upper.fts"; +string auxiliaryInnerGrid1 = "./grid/aux-lower.fts"; +string auxiliaryInnerGrid2 = ""; +string oversetGridFileName = "./grid/iblank.ovs"; +double walldistMainZone = 1.0 +double toleranceForOversetSearch = 1.0e-3; +double toleranceForOversetBox = 1.0e-3; +int twoOrderInterpolationOrNot = 0; +int keyEnlargeOfActiveNodes = 0; +int outTecplotOverset = 0; +int outPutOversetVisualization = 0; +int numberOfMovingBodies = 2; // ----------------- ALE configuration ------------------------------ int codeOfAleModel = 0; @@ -1306,36 +1354,42 @@ double referenceLength = 1.0; double referenceVelocity = 1.0; double referenceDensity = 1.0; -int strategyForFaceNormalVelocity = 0; //0-By Sweeping volume; 1-By face center 1st; 2-By face center 2nd; -int strategyForGCLSource = 0; //0-present; 1-Ahn; +int strategyForFaceNormalVelocity = 0; // 0-By Sweeping volume; 1-By face center 1st; 2-By face center 2nd. +int strategyForGCLSource = 0; // 0-present; 1-Ahn. -//0:1st-Admas-Bashforth; 1:2nd-Admas-Bashforth; 2:1st-Implicit-Euler; 3:2nd-Implicit Euler; 4:2nd-Adams-Moulton; 5:3rd-Adams-Moulton +// 0: 1st-Admas-Bashforth; 1: 2nd-Admas-Bashforth; 2: 1st-Implicit-Euler; 3: 2nd-Implicit Euler; 4: 2nd-Adams-Moulton; 5: 3rd-Adams-Moulton. int methodForKineticEquation = 0; double relaxParameterOfKinetic = 1.0; -######################################################################### -# motive information # -######################################################################### +#************************************************************************ +# motive information * +#************************************************************************ int numberOfMovingBodies = 1; ############################## body0 ############################## -//mass of parts -double mass_0 = 1.0; -//mass matrix of parts Ixx Iyy Izz Ixy Ixz Iyz -double massMatrix_0[] = 1e-7, 1e-6, 1e-6, 0.0, 0.0, 0.0; -//initial six DOF position information of parts. xc yc zc -double massCenter_0[] = 0.0 , 0.0, 0.0; -//initial six DOF position information of parts. angleX angleY angleZ -double attitudeAngle_0[] = 0.0 , 0.0, 0.0; -//initial six DOF move information of parts. vc vy vz -double massCenterVelocity_0[] = 0.0, 0.0, 0.0; -//initial six DOF move information of parts. omigX omigY omigZ -double angularVelocity_0[] = 0.0, 0.0, 0.0; -//the object that the parts belong to. -int fartherIndex_0 = -1; -//the assembly position of the parts. xc yc zc angleX angleY angleZ -double configPamameter_0[] = 0.0 ,0.0 ,0.0 ,0.0 ,0.0 ,0.0; -//the move pattern of the parts. +// mass of parts. +double mass_0 = 1.0; +// gravity of parts (along negative direction in Y-axis, eg. 9.8). +double gravity_0 = 0.0; +// mass matrix of parts Ixx Iyy Izz Ixy Ixz Iyz. +double massMatrix_0[] = 1e-7, 1e-6, 1e-6, 0.0, 0.0, 0.0; +// initial six DOF position information of parts. xc yc zc. +double massCenter_0[] = 0.0, 0.0, 0.0; +// if reset mass center while restart. +int resetMassCenter_0 = 0; +// position offset of parts. dx dy dz. +double massCenterDxyz_0[] = 0.0, 0.0, 0.0; +// initial six DOF position information of parts. angleX angleY angleZ. +double attitudeAngle_0[] = 0.0, 0.0, 0.0; +// initial six DOF move information of parts. vc vy vz. +double massCenterVelocity_0[] = 0.0, 0.0, 0.0; +// initial six DOF move information of parts. omigX omigY omigZ. +double angularVelocity_0[] = 0.0, 0.0, 0.0; +// the object that the parts belong to. +int fartherIndex_0 = -1; +// the assembly position of the parts. xc yc zc angleX angleY angleZ. +double configPamameter_0[] = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0; +// the move pattern of the parts. // -1 given motion partten. // 0 still. // 1 six DOF motion. @@ -1346,51 +1400,68 @@ double configPamameter_0[] = 0.0 ,0.0 ,0.0 ,0.0 ,0.0 // 14 forced pitch motion. // 15 forced yaw motion. // 16 forced roll motion. -int RBDMethod_0 = 0; -double amplitude_0 = 0.0; -double reduceFrequency_0 = 0.0; -//direction of rotation +int RBDMethod_0 = 0; +double amplitude_0 = 0.0; +double reduceFrequency_0 = 0.0; +// direction of rotation. // 1 -- clockwise from the point of view along the positive x axis. // -1 -- anticlockwise from the point of view along the positive x axis. -int direction_0 = -1; -double rotateFrequency_0 = 0.0; -//string uDFSixDofFileName_0 = "./Bin/UDFSixDof.Parameter"; -//additional force (system axis) fX fY fZ -double addedForce_0[] = 0.0 ,0.0 ,0.0 ; -//additional moment of Force (system axis) mX mY mZ -double addedMoment_0[] = 0.0 ,0.0 ,0.0 ; -//the deformation method of the parts. -int morphing_0 = 0; - -// post indentify -int integralOrder = 4; +int direction_0 = -1; +double rotateFrequency_0 = 0.0; +//string uDFSixDofFileName_0 = "./Bin/UDFSixDof.Parameter"; +// dimensional physical time for additional force(s). +double addedForceTime_0[] = 0.0; +// additional force(inertia system) fX fY fZ. +double addedForce_0[] = 0.0, 0.0, 0.0; +// additional moment(inertia system) mX mY mZ. +double addedMoment_0[] = 0.0, 0.0, 0.0; +// the deformation method of the parts. +int morphing_0 = 0; +// post indentify. +int integralOrder = 4; // ---------------- ATP read -------------------------------------------- -//@int inflowParaType = 0; +//@int inflowParaType = 0; //@double refReNumber = 6.5e6; //@double refDimensionalTemperature = 288.15; //@double freestream_vibration_temperature = 300.00; -//@double refDimensionalPressure = 0; -//@double height = 0; -//@int nsubsonicInlet = 0; -//@int nsubsonicOutlet = 0; -//@string inLetFileName = "./bin/subsonicInlet.hypara"; -//@string outLetFileName = "./bin/subsonicOutlet.hypara"; +//@double refDimensionalPressure = 0; +//@double height = 0; +//@int nsubsonicInlet = 0; +//@int nsubsonicOutlet = 0; +//@string inLetFileName = "./bin/subsonicInlet.hypara"; +//@string outLetFileName = "./bin/subsonicOutlet.hypara"; //@double refDimensionalVelocity = 0; //@double refDimensionalDensity = 0; - -######################################################################### -# Old Parameter # -######################################################################### +//@string weatherDataFilePath = "./WRFData/"; +//@double longitude = 110.95 +//@double latitude = 19.61; +#************************************************************************ +# Old Parameter * +#************************************************************************ int isPlotVolumeField = 0; +#************************************************************************ +# partial flow field setting Parameter * +#************************************************************************ +//int nPartialParameter = 0; // 0/1/2 +//int nNumberOfPartialField = 0; // +//int nStartGridIndex[] = [0]; +//int nEndGridIndex[] = [0]; -######################################################################### -# Incompressible Parameter # -######################################################################### +//double partialCFL[] = [0.0]; +//double partialSpeedCoef[] = [0.0]; +//double partialSpeed[] = [0.0]; +//double partialAttackd[] = [0.0]; +//double partialSlide[] = [0.0]; +//double partialPressure[] = [0.0]; +//double partialTemperature[] = [0.0]; +//double partialMassFractions[] = [0.0]; +#************************************************************************ +# Incompressible Parameter * +#************************************************************************ int isSolveEnergyEquation = 0; int isSolveTurbEquation = 0; -int isSolveSpeciesEquation = 0; - +int isSolveSpeciesEquation = 0; \ No newline at end of file diff --git a/A07_TwoD_Rae2822_SST_Struct_4CPU/bin/grid_para.hypara b/A07_TwoD_Rae2822_SST_Struct_4CPU/bin/grid_para.hypara index a2dd6b3..a1268e6 100644 --- a/A07_TwoD_Rae2822_SST_Struct_4CPU/bin/grid_para.hypara +++ b/A07_TwoD_Rae2822_SST_Struct_4CPU/bin/grid_para.hypara @@ -4,9 +4,12 @@ // gridtype: Grid type for generation, conversion, reconstruction, merging. // 0 -- Unstructured grid. // 1 -- Structured grid. -// axisup: Type of Cartisien coordinates system, used in grid conversion. -// 1 -- Y upward. (default) -// 2 -- Z upward. +// nAxisRotateTimes: number of axis rotating times, zero (default) meaning without rotating. +// axisRotateOrder : axis rotating order. +// 1 -- X-axis. +// 2 -- Y-axis. +// 3 -- Z-axis. +// axisRotateAngles: axis rotating angles (degree), which are corresponding to the axis rotating order. // from_gtype: Type of grid data type in grid conversion process. // -1 -- MULTI_TYPE. // 1 -- PHengLEI, *.fts. @@ -18,7 +21,9 @@ // 7 -- Hybrid, include both of unstructured and structured grid, *.fts. // 8 -- GMSH, *.msh. int gridtype = 1; -int axisup = 1; +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; int from_gtype = 3; ######################################################################### diff --git a/A08_TwoD_30p30n_SST_Struct_4CPU/bin/cfd_para.hypara b/A08_TwoD_30p30n_SST_Struct_4CPU/bin/cfd_para.hypara index c344658..f903a5a 100644 --- a/A08_TwoD_30p30n_SST_Struct_4CPU/bin/cfd_para.hypara +++ b/A08_TwoD_30p30n_SST_Struct_4CPU/bin/cfd_para.hypara @@ -8,23 +8,24 @@ // Platform for Hybrid Engineering Simulation of Flows + // China Aerodynamics Research and Development Center + // (C) Copyright, Since 2010 + +// PHengLEI 2212 + //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ########################################################################### # Default parameters for Grid conversion # ########################################################################### // gridtype: Grid type for generation, conversion, reconstruction, merging. -// 0 -- Unstructured grid. -// 1 -- Structured grid. -// 2 -- Hybrid grid, include both of unstructured and structured grid. -// gridobj: Task type of grid treatment. -// 0 -- Grid generation of typical case, such as cylinder, flat plate, etc. -// 1 -- Grid conversion, from other grid data to PHenglEI, such as Fluent, CGNS. -// 2 -- Grid refinement. -// 3 -- Grid merging, merge two blocks into one block. -// 4 -- Grid deformation, achieve unstructured grid deformation. -// 5 -- Grid repairing, repair the original grid in order to remove the negative volume cells. -// 6 -- Grid mirroring, mirror a symmetry grid to whole grid. -// 7 -- Grid type change, convert structured grid to unstructured grid. +// 0 -- Unstructured grid. +// 1 -- Structured grid. +// 2 -- Hybrid grid, include both of unstructured and structured grid. +// gridobj: Task type of grid treatment. +// 0 -- Grid generation of typical case, such as cylinder, flat plate, etc. +// 1 -- Grid conversion, from other grid data to PHenglEI, such as Fluent, CGNS. +// 2 -- Grid refinement. +// 3 -- Grid merging, merge two blocks into one block. +// 4 -- Grid deformation, achieve unstructured grid deformation. +// 5 -- Grid repairing, repair the original grid in order to remove the negative volume cells. +// 6 -- Grid mirroring, mirror a symmetry grid to whole grid. +// 7 -- Grid type change, convert structured grid to unstructured grid. // multiblock: Multi-block grid or not, only for structured grid conversion. // 0 -- Not. // 1 -- Yes. @@ -46,19 +47,24 @@ int gridobj = 1; int multiblock = 0; int iadapt = 0; int SymmetryFaceVector = 1; - int gridReorder = 0; int faceReorderMethod = 0; -// axisup: Type of Cartisien coordinates system, used in grid conversion. -// 1 -- Y upward. (default) -// 2 -- Z upward. -int axisup = 1; +// nAxisRotateTimes: number of axis rotating times, zero (default) meaning without rotating. +// axisRotateOrder : axis rotating order. +// 1 -- X-axis. +// 2 -- Y-axis. +// 3 -- Z-axis. +// axisRotateAngles: axis rotating angles (degree), which are corresponding to the axis rotating order. +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; // omit_no_bound_bc: What's boundary condition for the type of "no_boundary_condition". // 0 -- Interface. (default) // 1 -- Physical boundary condition, used in Hybrid solver. int omit_no_bound_bc = 0; +int omitRepeatInterface = 1; //----------------------------------------------------------------------- # Grid data type # @@ -87,10 +93,9 @@ int dumpOldGrid = 0; // from_gfile: path of original data file for unstructure grid convert from. // out_gfile: path of target file for grid convert to, *.fts type of file usually. int numberOfGridFile = 1; -string from_gfile = "./grid/rae2822_hybrid2d.cas"; -string from_gfile1= ""; - -string out_gfile = "./grid/flat_laminr_133_85_2d.fts"; +string from_gfile = "./grid/rae2822_hybrid2d.cas"; +string from_gfile1 = ""; +string out_gfile = "./grid/flat_laminr_133_85_2d.fts"; // ----------------- some advanced choices ------------------------------ // iunsteady: The Grid is for unsteady simulation or not. @@ -103,9 +108,9 @@ int fileformat = 0; // Parameters for hybrid solver. // mixgrid_uns: path of unstructure grid file for hybrid solver, *.fts type. -// mixgrid_str: path of structure grid file for hybrid solver, *.fts type. -string mixgrid_uns = "./grid/rae2822_uns2d_4.fts"; -string mixgrid_str = "./grid/flat_laminr_133_85_2d.fts"; +// mixgrid_str: path of structure grid file for hybrid solver, *.fts type. +string mixgrid_uns = "./grid/rae2822_uns2d_4.fts"; +string mixgrid_str = "./grid/flat_laminr_133_85_2d.fts"; // Some parameters for structured overlapping grid. int codeOfDigHoles = 1; @@ -119,31 +124,31 @@ string zoneInverseFileName = "./oversetGridView/zoneInverseMapping.inp"; // 0 -- Not. (default) // 1 -- Yes. // geometryUnit: Geometry unit. -// 1 -- meter. -// 2 -- millimeter. -// 3 -- inch. +// 1 -- meter. +// 2 -- millimeter. +// 3 -- inch. // exclusiveCase: Parallel projection exclusive case. -// 0 -- NON case. -// 1 -- JSM-C2-NPOFF case. -// 2 -- CHNT. +// 0 -- NON case. +// 1 -- JSM-C2-NPOFF case. +// 2 -- CHNT. // projectOrgPoint: If the original wall points need to be projected or not. -int anisoRefine = 0; -int geometryUnit = 1; -int isProject = 0; -int readDist = 0; -int isDeform = 0; +int anisoRefine = 0; +int geometryUnit = 1; +int isProject = 0; +int readDist = 0; +int isDeform = 0; int exclusiveCase = 0; int projectOrgPoint = 0; string geometryFileName = "./grid/jsm.igs"; // ----------------- Grid Deform Parameters ----------------------------- // deformationMethod: Grid Deform. -// 1 -- SPRING. -// 2 -- RBF. +// 1 -- SPRING. +// 2 -- RBF. // stationalGridFile: Original grid file. // visualFileName : The visualization file path of deform grid. // nDeformStep : The max deform step. -// flapAngle : The max flap angle. +// flapAngle : The max flap angle. // rotatePostionZ : Rotate postion. // rotatePostionY : Rotate postion. // gridSlice : If dump slice grid. @@ -163,10 +168,10 @@ int sliceAxis = 1; double slicePosition = 13; // ----------------- RBF Parameters ------------------------------------- -// numberOfReferenceCP : Number of reference Control Points. -// influencePara : The RBF influence radius parameter. +// numberOfReferenceCP: Number of reference Control Points. +// influencePara : The RBF influence radius parameter. int numberOfReferenceCP = 40; -double influencePara = 25.0; +double influencePara = 25.0; // ----------------- Periodic Parameters -------------------------------- // Notice: Rotational periodicity only support rotation along the X axis! @@ -178,9 +183,8 @@ double influencePara = 25.0; which only support one direction. // rotationAngle: The relative angle between two periodic face. which is recorded in degrees. - int periodicType = 0; -double translationLength[] = [0.0,0.0,0.0]; +double translationLength[] = [0.0, 0.0, 0.0]; double rotationAngle = 0.0; ######################################################################### @@ -192,7 +196,6 @@ double rotationAngle = 0.0; // 2 -- refine structured grid. // maxproc: The number of partition zones that want to be divided into. // numberOfMultifile: The number of partition grid files that want to be dumped out. - int pgridtype = 0; int maxproc = 4; int numberOfMultifile = 1; @@ -201,20 +204,20 @@ int numberOfMultifile = 1; // 0 -- Not. // 1 -- Yes. // blockIndexOfMark: the block index of mark, only for structured grid partition. -// cellIndexOfMark: the cell index of mark, only for structured grid partition. +// cellIndexOfMark : the cell index of mark, only for structured grid partition. int traceMark = 0; int blockIndexOfMark = 0; -int cellIndexOfMark[] = [185,30,1]; +int cellIndexOfMark[] = [185, 30, 1]; -// parallel Strategy: -//! -# 0 : each zone is assigned to the one that defined in grid partition procedure. -//! -# 1 : random assigned for each zone or by some else ways. -int parallelStrategy = 1; +// parallelStrategy: +// 0 -- each zone is assigned to the one that defined in grid partition procedure. +// 1 -- random assigned for each zone or by some else ways. +int parallelStrategy = 1; //----------------------------------------------------------------------- # File path # //----------------------------------------------------------------------- -// original_grid_file: Original grid file that want to be divided(PHengLEI type, *.fts). +// original_grid_file: Original grid file that want to be divided(PHengLEI type, *.fts). // partition_grid_file: Target partition grid file(PHengLEI type, *.fts). string original_grid_file = "./grid/sphere_mixed.fts"; string partition_grid_file = "./grid/sphere_mixed__4.fts"; @@ -232,11 +235,10 @@ string partition_grid_file = "./grid/sphere_mixed__4.fts"; // 1 -- perfect balance. // maxproc -- perfect imbalance. // 1.05 -- recommended. - int omit_no_bound_bc = 0; int npartmethod = 1; int parallelPartitionMethod = 2; -double parmetisBalance = 1.05; +double parmetisBalance = 1.05; // numberOfMultigrid: Number of multi-grid levels, ONLY used for structured grid. // 1 -- single level. @@ -248,29 +250,35 @@ int numberOfMultigrid = 1; # Default parameters for CFD simulation # ######################################################################### // maxSimuStep: The max simulation step, don't care simulation is restart or not. -// intervalStepFlow: The step intervals for flow variables file 'flow.dat' saved. -// intervalStepPlot: The step intervals for tecplot visual file 'tecflow.dat' saved. +// intervalStepFlow: The step intervals for flow variables file 'flow.dat' saved. +// intervalStepPlot: The step intervals for tecplot visual file 'tecflow.dat' saved. // intervalStepSample: The step intervals for monitored probes variables file 'sample.dat' saved. -// intervalStepForce: The step intervals for aerodynamics coefficients file 'aircoef.dat' saved. -// intervalStepRes: The step intervals for residual file 'res.dat' saved. -// ifLowSpeedPrecon: Precondition process to accelerate convergence for low speed flow. -// 0 -- no precondition process. (default, mach > 0.3) -// 1 -- carry out precondition process. (mach number <= 0.3) - -int maxSimuStep = 20000; - -int intervalStepFlow = 1000; -int intervalStepPlot = 1000; +// intervalStepForce: The step intervals for aerodynamics coefficients file 'aircoef.dat' saved. +// intervalStepRes: The step intervals for residual file 'res.dat' saved. +int maxSimuStep = 20000; +int intervalStepFlow = 1000; +int intervalStepPlot = 1000; int intervalStepSample = 1000; -int intervalStepForce = 100; -int intervalStepRes = 10; -int ifLowSpeedPrecon = 0; +int intervalStepForce = 100; +int intervalStepRes = 10; // compressible: // 0 -- incompressible flow. // 1 -- compressible flow. (default) int compressible = 1; +// ifLowSpeedPrecon: Precondition process to accelerate convergence for low speed flow. +// 0 -- no precondition process. (default, mach > 0.3) +// 1 -- carry out precondition process. (mach number <= 0.3) +// Kprec: The coefficient K for the cut-off velocity. +// 1.0~3.0 is suggested. (default, 3.0) +// preconFarfieldBCMethod: The precondition method for farfield boundary condition. +// 0 -- precondition far-field boundary based on riemann invariants. +// 1 -- Turkel's simplified far-field boundary condition. +int ifLowSpeedPrecon = 0; +double Kprec = 3.0; +int preconFarfieldBCMethod = 1; + //----------------------------------------------------------------------- # CFD Control Parameter # //----------------------------------------------------------------------- @@ -281,33 +289,36 @@ int compressible = 1; // 0 -- the nondimensional conditions. // 1 -- the flight conditions. // 2 -- the experiment conditions. -// 3 -- the subsonic boundary conditions. +// 3 -- the subsonic boundary conditions. (Useless!) // 4 -- the condition that the velocity, temperature and density are given. // 5 -- the condition that the velocity, temperature and pressure are given. +//flowInitMethod: Flow field initialization method. +// 0 -- The entire flow field is initialized according to Infinite velocity. +// 1 -- The velocity near the wall is initialized according to the boundary layer of the plate. // refReNumber: Reynolds number, which is based unit length, unit of 1/m. // refDimensionalTemperature: Dimensional reference temperature, or the total temperature only for the experiment condition. // freestream_vibration_temperature: Dimensional freestream vibration temperature. // refDimensionalPressure: Dimensional reference pressure, or the total pressure only for the experiment condition. // height: Fly height, unit of km. // wallTemperature: Temprature of the solid wall, minus value is for adiabatic boundary condition. -// gridScaleFactor: The customizable unit of the grid, default value is 1.0 for meter.Common dimensions like: -// 1 dm = 0.1 m. -// 1 cm = 0.01 m. -// 1 mm = 0.001m. -// 1 inch = 0.0254m. -// 1 foot = 12 inches = 0.3048m. -// 1 yard = 3 feet = 0.9144m. +// gridScaleFactor: The customizable unit of the grid, default value is 1.0 for meter. Common dimensions like: +// 1 dm = 0.1 m. +// 1 cm = 0.01 m. +// 1 mm = 0.001 m. +// 1 inch = 0.0254 m. +// 1 foot = 12 inches = 0.3048 m. +// 1 yard = 3 feet = 0.9144 m. // forceReferenceLength, forceReferenceLengthSpanWise, forceReferenceArea: Reference length, SpanWise length and area, independent of grid unit. // TorqueRefX, TorqueRefY, TorqueRefZ: Reference point, independent of grid unit. // radiationCoef: The radiation coefficient on wall, it is used to compute the radiation heat flux on wall when the boundary // condition is radiation equilibrium temperature, and 0.8 is the default value. -// refMolecularWeight : the reference molecular weight of gas used for perfect gas. The unit is g/mol. +// refMolecularWeight: the reference molecular weight of gas used for perfect gas. The unit is g/mol. // Generally, the gas is air. Sometimes, it is experiment gas, such as Nitrogen, Argon, and so on. - -int directionMethod = 0; +int directionMethod = 0; double refMachNumber = 0.73; double attackd = 2.79; double angleSlide = 0.00; +int flowInitMethod = 0; int inflowParaType = 0; double refReNumber = 6.5e6; @@ -321,29 +332,27 @@ double freestream_vibration_temperature = 300.00; //double refDimensionalTemperature = 6051.024; // The total temperature, T*(1+(refGama-1)*M*M/2). //double refDimensionalPressure = 4.299696E09; // The total pressure, p*(T0/T)^(refGama/(refGama-1)). -//int inflowParaType = 3; -//int nsubsonicInlet = 1; -//int nsubsonicOutlet = 1; -//string inLetFileName = "./bin/subsonicInlet.hypara"; -//string outLetFileName = "./bin/subsonicOutlet.hypara"; -//double refDimensionalTemperature = 288.144; -//double refDimensionalPressure = 1.01313E05; - -//The velocity, temperature and density are fixed. +// The velocity, temperature and density are fixed. //int inflowParaType = 4; //double refDimensionalVelocity = 1000.0; -//double refDimensionalDensity = 1.0e3; +//double refDimensionalDensity = 1.0e3; -//The velocity, temperature and pressure are fixed. +// The velocity, temperature and pressure are fixed. //int inflowParaType = 5; //double refDimensionalVelocity = 1000.0; //double refDimensionalPressure = 1.0e5; -//The MachNumber, temperature and pressure are fixed. +// The MachNumber, temperature and pressure are fixed. //int inflowParaType = 6; -//double refDimensionalTemperature = 293; +//double refDimensionalTemperature = 293.0; //double refDimensionalPressure = 8886.06; +// The velocity, temperature and pressure are read from file. +//int inflowParaType = 7; +//string weatherDataFilePath = "./WRFData/"; +//double longitude = 110.95 +//double latitude = 19.61; + double wallTemperature = -1.0; double radiationCoef = 0.8; @@ -357,41 +366,41 @@ double forceReferenceArea = 1.0; // unit of meter^2. double TorqueRefX = 0.0; // unit of meter. double TorqueRefY = 0.0; // unit of meter. double TorqueRefZ = 0.0; // unit of meter. +double knudsenLength = 1.0; // unit of meter. double refMolecularWeight = 28.9644; // unit of g/mol. //----------------------------------------------------------------------- # Spatial Discretisation # //----------------------------------------------------------------------- -#******************************************************************* -# Struct Solver * -#******************************************************************* +#************************************************************************ +# Struct Solver * +#************************************************************************ // inviscidSchemeName: Spatial discretisation scheme of struct grid. // Using this when solve structered grid or hybrid. -// -- "vanleer", "steger", "hlle", "lax_f". -// -- "roe", "modified_roe". +// -- "vanleer", "steger", "hlle", "lax_f", +// -- "roe", "modified_roe", // -- "ausm+", "ausm+w", "ausm+up", "ausmdv", "ausmpw", "ausmpw+". // isWennScheme: If using WENN Scheme of struct grid. -// 0 -- NO. (default) -// 1 -- Yes. +// 0 -- NO. (default) +// 1 -- Yes. // str_limiter_name: Limiter of struct grid. -// -- "vanalbada", "vanleer", "minmod", "smooth", "minvan", "3rdsmooth", "3rd_minmod_smooth". -// -- "nolim", no limiter. -// -- "vanalbada_clz", clz supersonic version. -// -- "weno3_js", "wenn3_prm211", "wenn3_zm", "wenn3_zes2", "wenn3_zes3" - +// -- "vanalbada", "vanleer", "minmod", "smooth", "minvan", "3rdsmooth", "3rd_minmod_smooth", +// -- "nolim", no limiter, +// -- "vanalbada_clz", clz supersonic version, +// -- "weno3_js", "wenn3_prm211", "wenn3_zm", "wenn3_zes2", "wenn3_zes3". string inviscidSchemeName = "roe"; int isWennScheme = 0; -string str_limiter_name = "vanalbada"; +string str_limiter_name = "vanalbada"; -#******************************************************************* -# UnStruct Solver or Common * -#******************************************************************* +#************************************************************************ +# UnStruct Solver or Common * +#************************************************************************ // viscousType: Viscous model. -// 0 -- Euler. -// 1 -- Lamilar. -// 2 -- Algebraic. -// 3 -- 1eq turbulent. -// 4 -- 2eq turbulent. +// 0 -- Euler. +// 1 -- Lamilar. +// 2 -- Algebraic. +// 3 -- 1eq turbulent. +// 4 -- 2eq turbulent. // viscousName: Laminar or tubulent model. // -- "0eq-bl". // -- "1eq-sa". @@ -410,16 +419,16 @@ string str_limiter_name = "vanalbada"; // 3 -- IDDES. // uns_scheme_name: Spatial discretisation scheme of Unstruct grid. // Using this when solve Unstructered grid or hybrid. -// -- "vanleer", "roe", "steger", "kfvs", "lax_f", "hlle". +// -- "vanleer", "roe", "GMRESRoe", "GMRESSteger", "steger", "kfvs", "lax_f", "hlle", // -- "ausm+", "ausmdv", "ausm+w", "ausmpw", "ausmpw+". // uns_limiter_name: Limiter of Unstruct grid. -// -- "barth", "vencat", "vanleer", "minmod". -// -- "vanalbada", "smooth", "nnd", "lpz", "1st". +// -- "barth", "vencat", "vanleer", "minmod", +// -- "vanalbada", "smooth", "nnd", "lpz", "1st", // -- "nolim", no limiter. // uns_vis_name: Discretisation method of viscous term. // -- "std", "test", "aver", "new1", "new2". // gradientName: Gradient reconstruction method. -// -- "default", "ggcell", "ggnode", "lsq". +// -- "default", "ggcell", "ggnode", "lsq". // ivencat: Variation of vencat limiter. // 0 -- org method, it is independent of grid scale. // 1 -- new method, it is dependent of grid scale. @@ -442,18 +451,18 @@ string str_limiter_name = "vanalbada"; // 3 -- Harten type, which is default used. // roeEntropyScale: Entropy fix (correction) coefficient scale, default is 1.0. // It is used to scale the default Roe entropy fix coefficients. -// AusmpwPlusLimiter: A Limiter to make "function w" not change acutely in AusmpwPlus scheme, default is 1.0 +// AusmpwPlusLimiter: A Limiter to make "function w" not change acutely in AusmpwPlus scheme, default is 1.0. -//int viscousType = 0; +//int viscousType = 0; //string viscousName = "Euler"; -//int viscousType = 1; +//int viscousType = 1; //string viscousName = "laminar"; -int viscousType = 3; +int viscousType = 3; string viscousName = "1eq-sa"; -//int viscousType = 4; +//int viscousType = 4; //string viscousName = "2eq-kw-menter-sst"; int DESType = 0; @@ -463,7 +472,7 @@ string uns_limiter_name = "vencat"; string uns_vis_name = "test"; string gradientName = "ggnode"; -int ivencat = 7; +int ivencat = 7; double venkatCoeff = 5.0; int reconmeth = 1; int limitVariables = 0; @@ -475,9 +484,9 @@ double roeEntropyScale = 1.0; double AusmpwPlusLimiter = 1.0; -//----------------------------------------------------------------------- -# Temporal Discretisation # -//----------------------------------------------------------------------- +#************************************************************************ +# Temporal Discretisation * +#************************************************************************ // iunsteady: Steady or unsteady. // 0 -- steady. // 1 -- unsteay. @@ -490,51 +499,57 @@ double AusmpwPlusLimiter = 1.0; // statisticalTimePeriod: Used as time period of statistic analysis. // when the value is negative, time period is treated as infinite. // statisticMethod: Statistic reynolds stress method. -// 0 -- tau = - ^2 -// 1 -- tau = +// 0 -- tau = - ^2 +// 1 -- tau = // min_sub_iter: The min sub iteration of unsteady simulation. // max_sub_iter: The max sub iteration of unsteady simulation. // tol_sub_iter: The tolerance of sub iteration of unsteady simulation. // tscheme: Temporal Discretisation method. -// 1 -- Runge-Kutta Multi-State. -// 2 -- Point implicit. -// 3 -- Full implicit. -// 4 -- LU-SGS. -// 5 -- Block LU-SGS. -// 6 -- Jacobian iteration. -// 7 -- Line LU-SGS. -// 8 -- Matrix LU-SGS. +// 1 -- Runge-Kutta Multi-State. +// 2 -- Point implicit. +// 3 -- Full implicit. +// 4 -- LU-SGS. +// 5 -- Block LU-SGS. +// 6 -- Jacobian iteration. +// 7 -- Line LU-SGS. +// 8 -- Matrix LU-SGS. +// 9 -- GMRES. // iSimplifyViscousTerm: Simplify the computation of viscous term in the Block LU-SGS method. The default value assigns 1 that could speed up the computation. // Otherwise, the viscous Jacobian matrix Mv should be computed that will increase the memory and time in iteration of the BLUSGS method. // CFLStart: Started cfl number. // CFLEnd: End cfl number. // CFLVaryStep: The number of step when cfl increase from CFLStart to CFLEnd. +// GMRESCFLScale : CFL = CFLStart * GMRESCFLScal^iteration. +// OriginalTscheme : Used for LUSGS and GMres hybrid computing. +// useLUSGSprecond: Initialize flow field for GMRES. +// 0 --Initialize by first order Jacobian matrix. +// 1 --Initialize by LUSGS. +// GMRESInitStep : the number of iteration step of irst order Jacobian matrix or LUSGS for initialize flow field. // ktmax: Dtratio. dt[i] = MIN(dt[i], ktmax * dtmin / vol[i]) // swapDq: Communication dq between forward/backward sweep of LUSGS or not, default is 0. // nLUSGSSweeps: Sub iteration of LU-SGS or Block LU-SGS. // LUSGSTolerance: Sub iter tolerance of LU-SGS or Block LU-SGS. // ifLocalTimeStep: Time step method. -// 0 --Local. -// 1 --Global. +// 0 --Local. +// 1 --Global. // isUseLocalCFL: use variable number of CFL or not. -// 0 -- global unified CFL number. -// 1 -- local CFL number. +// 0 -- global unified CFL number. +// 1 -- local CFL number. // isUsePreTwall: use the previous temperatures on wall. 1 indicates yes, and 0 indicates no. // visl_min: Minimum value of laminar viscosity coefficient. // turbCFLScale: Turbulence model cfl number factor. // codeOfAleModel: Arbitrary Lagrangian-Eulerian method. -// 0 -- no ALE method. -// 1 -- ALE method for non-moving grids. -// 2 -- ALE method for moving grids. -// 3 -- ALE method for deforming grids. +// 0 -- no ALE method. +// 1 -- ALE method for non-moving grids. +// 2 -- ALE method for moving grids. +// 3 -- ALE method for deforming grids. // wallFunctionType: The type of wall function to implement. -// 0 -- no wall function. (default) -// 1 -- standard wall function. -// 2 -- Pab3D wall function. +// 0 -- no wall function. (default) +// 1 -- standard wall function. +// 2 -- Pab3D wall function. // RKStage: The number of Runge-Kutta step. // lamda: Cofficient of Runge-Kutta step. - -int iunsteady = 0; +int iunsteady = 0; double physicalTimeStep = 0.01; double physicalTimeStepDimensional = -0.001; int ifStartFromSteadyResults = 0; @@ -543,39 +558,42 @@ int ifStaticsReynoldsStress = 0; int startStatisticStep = 800000; double statisticalTimePeriod = -1.0; int statisticMethod = 0; -int linearTwoStepMethods = 1; // 1--BDF1; 2--C-N; 3--BDF2; +int linearTwoStepMethods = 1; // 1--BDF1; 2--C-N; 3--BDF2. int methodOfDualTime = 3; int min_sub_iter = 50; int max_sub_iter = 50; double tol_sub_iter = 0.01; -int tscheme = 4; +int tscheme = 4; int iSimplifyViscousTerm = 1; int ifLocalTimeStep = 0; int isUseLocalCFL = 0; int isUsePreTwall = 0; -double CFLStart = 0.01; -double CFLEnd = 10.0; -int CFLVaryStep = 500; - +double CFLStart = 0.01; +double CFLEnd = 10.0; +int CFLVaryStep = 500; +double GMRESCFLScale = 1.0; +int OriginalTscheme = 9; +int useLUSGSprecond = 1; +int GMRESInitStep = 1000; double pMaxForCFL = 0.2; double pMinForCFL = 0.1; double deltaMaxForCFL = 0.2; double magnifyFactorForCFL = 1.1; double reduceFactorForCFL = 0.5; -double ktmax = 1.0e10; +double ktmax = 1.0e10; -int swapDq = 1; +int swapDq = 1; int nLUSGSSweeps = 1; double LUSGSTolerance = 0.01; -int order = 2; +int order = 2; double visl_min = 0.01; double turbCFLScale = 1.0; -double csrv = 2.0; +double csrv = 1.0; double timemax = 1.0e10; double dtsave = -1.0; int maxale = 10; @@ -591,10 +609,9 @@ double lamda[] = [0.5, 1.0]; //int RKStage = 4; //double lamda[] = [0.25, 0.33333333333, 0.5, 1.0]; - -//----------------------------------------------------------------------- -# File In or Out # -//----------------------------------------------------------------------- +#************************************************************************ +# File In or Out * +#************************************************************************ // numberOfGridGroups: The number of grid groups. // gridfile: The partitioned Grid file path, using relative path, // which is relative to the working directory. @@ -611,20 +628,18 @@ double lamda[] = [0.5, 1.0]; // aircoeffile: The file path to save the aerodynamic force coefficients convergence process, write data for every default (intervalStepForce) steps. // restartNSFile: The file path to write restart flowfield variables, write data for every default (intervalStepFlow) steps. // turbfile: The file path to write restart flowfield variables of turbulence , write data for every default(intervalStepFlow) steps. -// visualfile: The visualization file path of flowfield , write data for every default (intervalStepPlot) steps. +// visualfile: The visualization file path of flowfield, write data for every default (intervalStepPlot) steps. // wall_aircoefile: The file path to save flowfield variables of wall, write data for every default steps. // nDumpSurfaceInfo = 0 the "wall_varfile" write the informations including heat flux. // nDumpSurfaceInfo = 1 the "wall_varfile" write the informations without heat flux. // nIsComputeWallDist: Whether to compute the wall distance. // 0 -- Compute wall distance. // 1 -- Not compute. -// -// protectionFile0 and protectionFile1 : Two continuation file of the data protection mechanism. -// wall_heatfluxfile : The file to output the MaxHeatFlux of wall. - -int numberOfGridGroups = 1; -string gridfile = "./grid/rae2822_hybrid2d__4.fts"; -string wallTemperaturefile= ""; +// protectionFile0 and protectionFile1: Two continuation file of the data protection mechanism. +// wall_heatfluxfile: The file to output the MaxHeatFlux of wall. +int numberOfGridGroups = 1; +string gridfile = "./grid/rae2822_hybrid2d__4.fts"; +string wallTemperaturefile = ""; int nIsComputeWallDist = 0; int walldistMethod = 1; @@ -632,10 +647,12 @@ int cellMethodOrNodeMethod = 0; string resSaveFile = "results/res.dat"; string turbresfile = "results/turbres.dat"; +string transitionResFile = "results/transitionRes.dat"; string aircoeffile = "results/aircoef.dat"; string restartNSFile = "results/flow.dat"; string turbfile = "results/turb.dat"; +string transitionFile = "results/transition.dat"; string visualfile = "results/tecflow.plt"; string wall_aircoefile = "results/wall_aircoef.dat"; @@ -645,10 +662,14 @@ string protectionFile0 = "results/flow0.dat"; string protectionFile1 = "results/flow1.dat"; string wall_heatfluxfile = "results/wall_heatflux.dat"; -int nDumpSurfaceInfo = 0; -string wall_varfile = ""; +string protectionTurbFile0 = "results/turb0.dat"; +string protectionTurbFile1 = "results/turb1.dat"; -string jetDefineFile = "bin/jet.hypara"; +string protectionTransitionFile0 = "results/transition0.dat"; +string protectionTransitionFile1 = "results/transition1.dat"; + +int nDumpSurfaceInfo = 0; +string wall_varfile = ""; string sixDofFileName = "results/sixDofInfo.dat"; string derivativeFileName = "results/identify.dat"; @@ -659,7 +680,8 @@ int plotFieldType = 0; // visualfileType: The file type of visualfile. // 0 -- Tecplot binary. // 1 -- Tecplot ASCII. - +// 2 -- Ensight binary. +// 3 -- Ensight ASCII. int visualfileType = 1; // samplefileMode: The dump mode of sample file. @@ -697,21 +719,21 @@ double upperPlotFieldBox[] = [1.0 1.0 1.0]; // -- vibration temperature(Tv, 33), electron temperature(Te, 34), vibrational energy(Ev, 35), electric energy(Ee, 36), // -- number density of electron(Ne, 37), dimensioanl density(rho, 38), dimensioanl pressure(p, 39), dimensioanl temperature(T, 40), // -- gradientUx(41), gradientUy(42), gradientVx(43), gradientVy(44), streamline_u(45), streamline_v(46), streamline_w(47), -// -- transition intermittency(intermittency, 51), -transition momentum thickness reynolds(MomentumThicknessReynolds, 52), -// -- overlap iblank(iblank, 81) - -// -- specific heat ratio(gama, 56) +// -- transition intermittency(intermittency, 51), transition momentum thickness reynolds(MomentumThicknessReynolds, 52), +// -- local CFL Number(localCFL, 57), minimal CFL Number(minCFL, 58), +// -- overlap iblank(iblank, 81), +// -- specific heat ratio(gama, 56), Knudsen number(kn, 60), Damkohler number(Da, 61), vibrational nonequilibrium number(Vi, 62). // Important Warning: Array size of visualVariables MUST be equal to nVisualVariables!!! // Variables order must from small to big. //-----------the optional parameters list for the wall boundary condition---------------- // nVisualWallVariables: The number of visual variables on wall. // visualWallVariables : dumped variable types, listed as following: -// -coefficient of pressure(cp, 0), -coefficient of friction(cf, 1), yplus(2), -non-dimensional heat flux(Q_NonDim, 3), -dimensional heat flux(Q_Dim, 4), -// -pressure on wall(pw, 5), -temperature on wall(Tw, 6), -density on wall(rhow, 7), -heat flux of translational-rotational temperature term(Qtr, 8), -// -heat flux of species diffusion term(Qs, 9), -heat flux of vibrational temperature term(Qv, 10), -heat flux of electron temperature term(Qe, 11), -// -species mass fractions(Ns, 12), -x component of wall velocity(Vx, 13), -y component of wall velocity(Vy, 14), -z component of wall velocity(Vz, 15) -// -slip translational-rotational temperature(Tts, 16), -slip vibrational temperature(Tvs, 17), -slip electron temperature(Tes, 18), -absolute wall velocity(Vs, 19) -// -Stanton number(St, 20), -coefficient of heat rate(Ch, 21), -temperature jump(deltaT, 22), -Grid Reynolds number on wall(Re_w, 23) +// -- coefficient of pressure(cp, 0), coefficient of friction(cf, 1), yplus(2), non-dimensional heat flux(Q_NonDim, 3), dimensional heat flux(Q_Dim, 4), +// -- pressure on wall(pw, 5), temperature on wall(Tw, 6), density on wall(rhow, 7), heat flux of translational-rotational temperature term(Qtr, 8), +// -- heat flux of species diffusion term(Qs, 9), heat flux of vibrational temperature term(Qv, 10), heat flux of electron temperature term(Qe, 11), +// -- species mass fractions(Ns, 12), x component of wall velocity(Vx, 13), y component of wall velocity(Vy, 14), z component of wall velocity(Vz, 15), +// -- slip translational-rotational temperature(Tts, 16), slip vibrational temperature(Tvs, 17), slip electron temperature(Tes, 18), absolute wall velocity(Vs, 19), +// -- Stanton number(St, 20), coefficient of heat rate(Ch, 21), temperature jump(deltaT, 22), Grid Reynolds number on wall(Re_w, 23), Knudsen number(Kn_wall, 24). int nVisualVariables = 8; int visualVariables[] = [0, 1, 2, 3, 4, 5, 6, 15]; @@ -739,16 +761,18 @@ int dumpStandardModel = 0; // 1 -- Real cell where the probe is located. // nProbeVariables: Number of variables want to be dumped for probes monitered. // probeVariables : Variable types dumped, listed as following: -// -- density(0), u(1), v(2), w(3), pressure(4), temperature(5), mach(6). +// -- density(0), u(1), v(2), w(3), pressure(4), temperature(5), mach(6), +// -- dimensioanl_density(7), dimensioanl_u(8), dimensioanl_v(9), +// -- dimensioanl_w(10), dimensioanl_pressure(11), dimensioanl_temperature(12). // Important Warning: Array size of probeVariables MUST be equal to nProbeVariables!!! // probeVariables order must from small to big. // probeVariablesInterpolationMethod: Interpolation method used to compute the probe variables. -// 0 -- Take the value of probe's cell as probe real value. -// 1 -- Interpolation from probe's and neighbouring cell to probe. -// 2 -- Interpolation from probe's cell nodes to probe. +// 0 -- Take the value of probe's cell as probe real value. +// 1 -- Interpolation from probe's and neighbouring cell to probe. +// 2 -- Interpolation from probe's cell nodes to probe. int ifSetDataMonitor = 0; -int dataMonitorType = 0; +int dataMonitorType = 0; string probesDefineFile = "bin/probes_XYZ.dat"; //int dataMonitorType = 1; @@ -761,28 +785,26 @@ string probesDefineFile = "bin/probes_XYZ.dat"; int searchCellsMethod = 0; -int nProbeVariables = 7; -int probeVariables[] = [0, 1, 2, 3, 4, 5, 6]; -int probeVariablesInterpolationMethod = 0; -//----------------------------------------------------------------------- -# Turbulence Parameter # -//----------------------------------------------------------------------- +int nProbeVariables = 14; +int probeVariables[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]; +int probeVariablesInterpolationMethod = 0; + +#************************************************************************ +# Turbulence Parameter * +#************************************************************************ // turbInterval: Iteration number of turbulence. // kindOfTurbSource: Kinds of turbulent source. // 0 -- Original. // mod_turb_res: If modify the residuals for the cells next to the wall or not, default is 0. -// transitionType: transition model type +// transitionType: transition model type // 0 -- none. // 2 -- gama-re-theta. -// turbIntensity: (valid while greater than 0.0 ) turbulent intensity of free stream(*100) in transition -// freeturbIntensitySRModify: to use SR modify in free stream turbulent intensity decay or not - - +// turbIntensity: (valid while greater than 0.0 ) turbulent intensity of free stream(*100) in transition. +// freeturbIntensitySRModify: to use SR modify in free stream turbulent intensity decay or not. int turbInterval = 1; int turbOrderStruct = 2; int kindOfTurbSource = 0; int mod_turb_res = 0; -double turb_relax = 1.0; double freeStreamViscosity = 1.0e-3; double muoo = 3.0; double kwoo = 5.0; @@ -790,29 +812,28 @@ int transitionType = 0; double turbIntensity = -1.0; int freeturbIntensitySRModify = 0; double freeDecayXLocation = 0.0; -int compressibleCorrection = 0; -int prandtlNumberCorrection = 0; +int compressibleCorrection = 0; int transitionMaFix = 1; -# maximum eddy viscosity (myt/my) max. +// maximum eddy viscosity (myt/my) max. double eddyViscosityLimit = 1.0e10; int monitor_vistmax = 0; -//----------------------------------------------------------------------- -# LES Parameter # -//----------------------------------------------------------------------- +#************************************************************************ +# LES Parameter * +#************************************************************************ // iLES: Create LESSolver or not. -// = 1 - Create LESSolver; -// != 1 - not. +// = 1 -- Create LESSolver; +// != 1 -- not. // amplitudeofDisturb: Amplitude of adding disturb. // disturbstep: Unsteady time step or steady iteration of adding random disturb. // iterdisturb: Add random disturb in every sub-iter or only first sub-iter. -// = 0 - in only first sub-iter; -// != 0 - in every sub-iter. +// = 0 -- in only first sub-iter; +// != 0 -- in every sub-iter. // ipraddisturb: Add density and pressure disturb or not. // ibodyforce: Add body force in source flux of NS equations or not. -// = 0 - not; -// != 0 - Add body force. +// = 0 -- not; +// != 0 -- Add body force. // bodyforce: Body force in source flux of NS equations or not. // utau: friction velocity, using in DNSDisturb. // sgsmodel: subgrid scale model. @@ -820,23 +841,22 @@ int monitor_vistmax = 0; // = "dsmCom"; // = "wale"; // = "sigma". -// deltaFunctionType: = 1 - MAX(deltai, deltaj, deltak); -// = 2 - pow(deltai * deltaj *deltak, 1/3); -// = 3 - Devloped by Scotti. -// wallDampingFunctionType: = 0 - no wall function; -// = 1 - van Driest; -// = 2 - developed by Dr. Deng Xiaobing; -// = 3 - developed by Piomelli. +// deltaFunctionType: = 1 -- MAX(deltai, deltaj, deltak); +// = 2 -- pow(deltai * deltaj *deltak, 1/3); +// = 3 -- Devloped by Scotti. +// wallDampingFunctionType: = 0 -- no wall function; +// = 1 -- van Driest; +// = 2 -- developed by Dr. Deng Xiaobing; +// = 3 -- developed by Piomelli. // turbViscousCutType: turbulent viscosity cut type. -// = 0 - mu_total = mut + mul; -// = 1 - mu_total = max(mut-mul,0)+ mul; -// = 2 - mu_total = max(mut ,0)+ mul. +// = 0 -- mu_total = mut + mul; +// = 1 -- mu_total = max(mut-mul, 0) + mul; +// = 2 -- mu_total = max(mut , 0) + mul. // smagConstant: constant of smagorinsky model. // waleConstant: constant of wale model. -// filterDirection[3]: filter variables in i, j, k direction or not. +// filterDirection [3]: filter variables in i, j, k direction or not. // averageDirection[3]: average variables in i, j, k direction or not. // isotropicConstant: constant of isotropic part of SGS stress. - int iLES = 0; string sgsmodel = "smagorinsky"; int deltaFunctionType = 2; @@ -852,19 +872,16 @@ double testFilterScale = 2.0; int averageWidth = 1; int monitorNegativeConstant = 0; -//----------------------------------------------------------------------- -# Other Parameters for Hypersonic Non-equilibrium Gas # -//----------------------------------------------------------------------- +#************************************************************************ +# Other Parameters for Hypersonic Non-equilibrium Gas * +#************************************************************************ // dg_high_order: // 0 -- generic order accuracy. // 1 -- high order accuracy. // iapplication: // 0 -- gas model is fixed in the codes. // 1 -- gas model is imported from library files. -// isAdaptiveSolver: isAdaptiveSolver=0 indicates the generic Navier-Stokes solver, -// isAdaptiveSolver>0 indicates the HyFlow self-adaptive solver. -// 1 -- using HyFlow self-adaptive solver where the switch is controlled by the total iteration steps. -// 2 -- using HyFlow self-adaptive solver where the switch is controlled by variation of the key residual. +// isAdaptiveSolver: isAdaptiveSolver = 0 indicates the generic Navier-Stokes solver, // nm: Equation number of the physics, but is out of commision now. // 4 -- for 2D. // 5 -- for 3D. @@ -875,7 +892,7 @@ int monitorNegativeConstant = 0; // 2 -- Argon. // 3 -- Nitrogen. // nEnergyRecycle: The type of EnergyModel Recycle. -// 0 -- not used . +// 0 -- not used. // 1 -- used. // nDensityModify: The type of densitymodify. // 0 -- not used. @@ -883,26 +900,25 @@ int monitorNegativeConstant = 0; // nchem: // 0 -- without chemical reaction flow. // 1 -- the chemical reaction flow is considered. -// nEquilibriumGas: the variable is valid when the condition of nchem=0 is satisfied. +// nEquilibriumGas: the variable is valid when the condition of nchem = 0 is satisfied. // 0 -- perfect gas. // 5, 7, 11 -- equilibrium gas, meanwhile, its value denotes the number of gas component. -// nPCWCycleStep: the maximum step number of iteration in the module of computing species mass fractions with the partial catalytic wall(PCW) condition. -// the value equals to or is greater than 1, and 3 is for default value. -// nRETCycleStep: the maximum step number of iteration in the module of computing radiation equilibrium temperature on wall. -// the value equals to or is greater than 1, and 3 is for default value. -// nSLIPCycleStep:the maximum step number of iteration in the module of computing slip temperature, slip velocity and slip species mass fraction. -// the value equals to or is greater than 1, and 3 is for default value. -// nSlipBCModel : The computational model of slip boundary conditions. - -// 0 -- no slip. -// 1 -- the conventional Maxwell slip conditions. -// 2 -- the Gokcen slip conditions. -// 3 -- the Knudsen-layer correction of the standard slip conditions proposed by Lockerby, et al. -// 4 -- the Kogan simplified slip conditions. -// nMeanFreePathType : the method to the mean free-path for the slip conditions. For the mixture, 0 is suggested. -// 0 -- the equivalent mean free-path is calculated by the simple hard sphere model(HS). -// 1 -- calculated by the definition that includes the variables of the number density and the molecule diameter. -// 2 -- the equivalent mean free-path is calculated by the variable hard sphere model(VHS). +// nPCWCycleStep: The maximum step number of iteration in the module of computing species mass fractions with the partial catalytic wall(PCW) condition. +// The value equals to or is greater than 1, and 3 is for default value. +// nRETCycleStep: The maximum step number of iteration in the module of computing radiation equilibrium temperature on wall. +// The value equals to or is greater than 1, and 3 is for default value. +// nSLIPCycleStep:The maximum step number of iteration in the module of computing slip temperature, slip velocity and slip species mass fraction. +// The value equals to or is greater than 1, and 3 is for default value. +// nSlipBCModel: The computational model of slip boundary conditions. +// 0 -- no slip. +// 1 -- the conventional Maxwell slip conditions. +// 2 -- the Gokcen slip conditions. +// 3 -- the Knudsen-layer correction of the standard slip conditions proposed by Lockerby, et al. +// 4 -- the Kogan simplified slip conditions. +// nMeanFreePathType: the method to the mean free-path for the slip conditions. For the mixture, 0 is suggested. +// 0 -- the equivalent mean free-path is calculated by the simple hard sphere model(HS). +// 1 -- calculated by the definition that includes the variables of the number density and the molecule diameter. +// 2 -- the equivalent mean free-path is calculated by the variable hard sphere model(VHS). // nchemsrc: // 0 -- the source terms are not computed. // 1 -- the source terms are computed. @@ -913,148 +929,151 @@ int monitorNegativeConstant = 0; // 1 -- One-temperature model. // 2 -- Two-temperature model. // 3 -- Three-temperature model. +// isUseNoneqCond: +// 0 -- compute the source terms without any conditions. +// 1 -- compute the source terms using the non-equilibrium condition. +// frozenCondition: the threshold value of frozen chemical flow condition, 0.1 is the default value. // nIdealState: whether take all gas species as ideal gas for gas-mixture process. // 0 -- No. -// 1 -- Yes. -// nTEnergyModel: the method to computing temperature energy model. +// 1 -- Yes. // nTEnergyModel: the method to computing temperature energy model. // 0 -- the energy term is computed using the conventional method. // 1 -- the energy term is computed using the polynomial fitting method. // 2 -- the energy term is computed using the piecewise polynomial fitting method. // parkVDPower: the power of translational-rotational temperature in the Park V-D(vibration-dissociation) coupling model. // The value is in range of [0.0, 1.0], DPLR suggests 0.5, LAURA suggests 0.7, while 0.6 is given as default value. // catalyticCoef: -// 0.0 -- full non-catalytic wall boundary condition. -// 1.0 -- full catalytic wall boundary condition. -// in range of (0.0, 1.0) -- partial catalytic condition, the value indicates the catalytic coefficient. -// nIsSuperCatalytic : the super catalytic condition for the fully catalytic wall, and assigned with the value of 1. -// 0 -- equilibrium condition for the fully catalytic wall where the mass fractions are assigned with the values of the free stream. -// 1 -- super catalytic condition for the fully catalytic wall where all the atomic components combine into molecular components. -// nTemperatureJump : the method to calculate the temperature jump. -// 0 -- calculated by the variables of heat conductivity and constant volume specific heat for each energy mode. -// 1 -- the general method where the iteration is calculated with the translation-rotation temperature. -// nSurfGradMethod : the method to compute the surface heating ratio. -// 0 -- the gradient of variable is computed with the first-order difference method. -// 1 -- the gradient of variable is computed with the Green-Guass integral method. -// nRapidFlowfield : initialize the flowfield using the rapid engineering method when it is greater than zero. -// nSurfHeatMonitor : To exam the surface heating change or not. 0 is no, 1 is yes. -// nInitPressureStep : the steps to initialize the boundary variables when the rapid method is used. 100 is the default value. -// nDumpCFLNumber : 1 indicates dumping the CFL number to file, 0 denotes no dumping. +// 0.0 -- full non-catalytic wall boundary condition. +// 1.0 -- full catalytic wall boundary condition. +// in range of (0.0, 1.0) -- partial catalytic condition, the value indicates the catalytic coefficient. +// nIsSuperCatalytic: the super catalytic condition for the fully catalytic wall, and assigned with the value of 1. +// 0 -- equilibrium condition for the fully catalytic wall where the mass fractions are assigned with the values of the free stream. +// 1 -- super catalytic condition for the fully catalytic wall where all the atomic components combine into molecular components. +// nTemperatureJump: the method to calculate the temperature jump. +// 0 -- calculated by the variables of heat conductivity and constant volume specific heat for each energy mode. +// 1 -- the general method where the iteration is calculated with the translation-rotation temperature. +// nSurfGradMethod: the method to compute the surface heating ratio. +// 0 -- the gradient of variable is computed with the first-order difference method. +// 1 -- the gradient of variable is computed with the Green-Guass integral method. +// nRapidFlowfield: initialize the flowfield using the rapid engineering method when it is greater than zero. +// nSurfHeatMonitor: To exam the surface heating change or not. 0 is no, 1 is yes. +// nInitPressureStep: the steps to initialize the boundary variables when the rapid method is used. 100 is the default value. +// nDumpCFLNumber: 1 indicates dumping the CFL number to file, 0 denotes no dumping. // sigmaVelocity: the coordination coefficient of tangential momentum for computation of slip velocity. The value is in range of (0.0, 2.0]. // sigmaTemperature: the heat coordination coefficient for computation of slip temperature. The value is in range of (0.0, 2.0]. // sigmaMassFraction: the species coordination coefficient for computation of slip mass fractions. The value is in range of (0.0, 2.0]. // velocitySlipCorrectConstant: the correction constant to the velocity slip condition. For the diffuse reflection, 1.0 is used. -// 1.0 -- proposed by Maxwell. -// sqrt(2/PI)~0.8 -- used for "micro-slip", namely the actual velocity slip at the wall. -// 1.146 -- proposed for an additional "fictitious" velocity slip. - -// chemicalRelaxCorf: The value is in range of [0.001, 1.0]. -// spectrumRadiusCoef: The value is in range of [0.0, 2.0]. -// staticPressureRelaxCorf: The value is in range of [0.1, 1.0]. -// nIsChemicalFreeze : the flag to freeze the chemical reactions. -// 0 -- not freeze, the chemical reaction sources will be calculated. -// 1 -- freezes the chemical reactions, the chemical reaction sources will not be calculated.// veTemperatureMin: The minimum of Tv and Te - -//maxViscous: the maximum of Viscous. -//trTemperatureMin: the minimum value of trTemperature. -//veTemperatureMin: the minimum value of veTemperature. -//densityMin: the minimum value of density. -//tAdjustmentFactor: magnification of temperature, this value is in range of (1.0, 10.0]. -// nDebug: cout the Wrong place and abort -// 0 -- not used. -// 1 -- used. +// 1.0 -- proposed by Maxwell. +// sqrt(2/PI)~0.8 -- used for "micro-slip", namely the actual velocity slip at the wall. +// 1.146 -- proposed for an additional "fictitious" velocity slip. +// chemicalRelaxCorf: The value is in range of [0.001, 1.0]. +// spectrumRadiusCoef: The value is in range of [0.0, 2.0]. +// staticPressureRelaxCorf: The value is in range of [0.1, 1.0]. +// nIsChemicalFreeze: the flag to freeze the chemical reactions. +// 0 -- not freeze, the chemical reaction sources will be calculated. +// 1 -- freezes the chemical reactions, the chemical reaction sources will not be calculated. +// veTemperatureMin: The minimum of Tv and Te. +// maxViscous: the maximum of Viscous. +// trTemperatureMin: the minimum value of trTemperature. +// veTemperatureMin: the minimum value of veTemperature. +// densityMin: the minimum value of density. +// tAdjustmentFactor: magnification of temperature, this value is in range of (1.0, 10.0]. +// nDebug: cout the Wrong place and abort +// 0 -- not used. +// 1 -- used. // nSpeciesLimit: limitter of gas species -// 0 -- not used. -// 1 -- used. -// nTurblenceForChemical: the coupled mode of Turblence and Chemical reaction -// 0 -- method 0. -// 1 -- method 1. -// nViscosityFluxSublevelModified: Modified for ViscosityFlux on Sublevel grid -// 0 -- not used. -// 1 -- used. -// nViscosityPeModified: Pe Modified for ViscosityCoef -// 0 -- not used. -// 1 -- used. -// nChemcalSourceModified: Modified on ChemcalSource -// 0 -- not used. -// 1 -- used. -// nChemcalSourceEsMethod: Modified on ChemcalSource -// 0 -- approximation algorithm 1 (Ori.) -// 1 -- approximation algorithm 2 (New) - +// 0 -- not used. +// 1 -- used. +// nTurblenceForChemical: the coupled mode of Turblence and Chemical reaction. +// 0 -- method 0. +// 1 -- method 1. +// nViscosityFluxSublevelModified: Modified for ViscosityFlux on Sublevel grid. +// 0 -- not used. +// 1 -- used. +// nViscosityPeModified: Pe Modified for ViscosityCoef. +// 0 -- not used. +// 1 -- used. +// nChemcalSourceModified: Modified on ChemcalSource. +// 0 -- not used. +// 1 -- used. +// nChemcalSourceEsMethod: Modified on ChemcalSource. +// 0 -- approximation algorithm 1 (Ori). +// 1 -- approximation algorithm 2 (New). // nMaxStepTemperature: the iterative steps of temperature. - -// veTemperatureMinModified: Modified on the minimum of Tve for Cvvs -// 0 -- not used -// 1 -- used - -// nDiagonalModified: Modified on Diagonal -// 0 -- not used -// 1 -- Ori. -// 2 -- new - -//nGradPrimtiveMethod: -// 0 -- Ori. -// 1 -- new +// veTemperatureMinModified: Modified on the minimum of Tve for Cvvs. +// 0 -- not used. +// 1 -- used. +// nDiagonalModified: Modified on Diagonal. +// 0 -- not used. +// 1 -- new. +// nDiagonalModifiedTurb: Modified on Diagonal for turbulence. +// 0 -- not used. +// 1 -- new. +// nGradPrimtiveMethod: +// 0 -- Ori. +// 1 -- new. // nAblation: -// 0 -- The wall ablation is not computed. -// 1 -- The wall ablation is computed. +// 0 -- The wall ablation is not computed. +// 1 -- The wall ablation is computed. // isInjection: -// 0 -- The injection velocity of ablation wall is not computed. -// 1 -- The injection velocity of ablation wall is computed. +// 0 -- The injection velocity of ablation wall is not computed. +// 1 -- The injection velocity of ablation wall is computed. // nViscosityModel: -// 0 -- Blottner fitting method(N89). -// 1 -- Gupta fitting method(N90). +// 0 -- Blottner fitting method(N89). +// 1 -- Gupta fitting method(N90). // nContinueModel: The new continue model can switch different computation model. -// 0 -- Not use the new continue model. -// 1 -- use the new continue model. +// 0 -- Not use the new continue model. +// 1 -- use the new continue model. // nSutherland: -// 0 -- stands for selecting the Blotter curve fits mode. -// 1 -- stands for Sutherland relation. +// 0 -- stands for selecting the Blotter curve fits mode. +// 1 -- stands for Sutherland relation. // gasfile: Indicates the gas model, 9 models are provided, namely "Gu5", "Gu7", "Gu11", "Pa5", "Pa7", "Pa11", "DK5", "DK7", "DK11". -// "Gu" -- indicates the Gupta Model, three-Type Models are embeded in the library, namely, the 5-species-6-reactions, the 7-species-9-reactions, the 11-species-20-reactions. -// "Pa" -- indicates the Park Model, three-Type Models are embeded in the library, namely, the 5-species-17-reactions, the 7-species-22-reactions, the 11-species-48-reactions. -// "DK" -- indicates the Dunn-Kang Model, three-Type Models are embeded in the library, namely, the 5-species-11-reactions, the 7-species-15-reactions, the 11-species-26-reactions. -// "Mars-Pa8" is for Park model of Mars gas, "Mars-Mc8" for McKenzie model of Mars gas. -// "Combustion-12" -- indicates the Combustion Chamber Gas Model which includes 12-species-20-reactions. -// "Gas-Mixture" -- indicates the process of mixing gas without reacting. -// for struct solver mixing two speciesSpeciesA, SpeciesB. -// for unstruct solver mixing multi-speciesO2 NO CO CO2 H2 N2 Air CH4. -// For self-definition model, the gasfile is used to indicate the file path of the new gas model. +// "Gu" -- indicates the Gupta Model, three-Type Models are embeded in the library, namely, the 5-species-6-reactions, the 7-species-9-reactions, the 11-species-20-reactions. +// "Pa" -- indicates the Park Model, three-Type Models are embeded in the library, namely, the 5-species-17-reactions, the 7-species-22-reactions, the 11-species-48-reactions. +// "DK" -- indicates the Dunn-Kang Model, three-Type Models are embeded in the library, namely, the 5-species-11-reactions, the 7-species-15-reactions, the 11-species-26-reactions. +// "Mars-Pa8" is for Park model of Mars gas, "Mars-Mc8" for McKenzie model of Mars gas. +// "Combustion-12" -- indicates the Combustion Chamber Gas Model which includes 12-species-20-reactions. +// "Gas-Mixture" -- indicates the process of mixing gas without reacting. +// for struct solver mixing two species��SpeciesA, SpeciesB��. +// for unstruct solver mixing multi-species��O2 NO CO CO2 H2 N2 Air CH4��. +// For self-definition model, the gasfile is used to indicate the file path of the new gas model. // speciesName: Used to list the names of each species, while each species name is separated by the symbol of comma. // initMassFraction: Used to list the initial mass fractions of species in accordance with the sequence of names in the parameter speciesName. // ifStartFromPerfectGasResults: The chemical reaction simulation is start from perfect gas flowfield or not, 0 is for no and else is for yes. -// nIterFirstStep : the maximum number of iteration in the first step for the self-adaptive calculation. -// nIterSecondStep : the maximum number of iteration in the second step for the self-adaptive calculation. -// nIterThirdStep : the maximum number of iteration in the third step for the self-adaptive calculation. -// nEnergyAssembly : the vibration energy is computed with combined method which includes the fitting method and the molecular kinetic theory. -// 0 -- no, -// 1 -- yes. +// nIterFirstStep : the maximum number of iteration in the first step for the self-adaptive calculation. +// nIterSecondStep: the maximum number of iteration in the second step for the self-adaptive calculation. +// nIterThirdStep : the maximum number of iteration in the third step for the self-adaptive calculation. +// nEnergyAssembly: the vibration energy is computed with combined method which includes the fitting method and the molecular kinetic theory. +// 0 -- no, +// 1 -- yes. // nControlVariable: the variable to computing the residual error that determines the convergence is meet or not in the one-temperature model. -// 0 -- the density. -// 1 -- the translation temperature. -// 2 -- the vibration temperature. -// 3 -- the electron temperature. -// 4 -- the pressure. -// 5 -- the mass fraction of oxygen. -// 6 -- the mass fraction of nitrogen. +// 0 -- the density. +// 1 -- the translation temperature. +// 2 -- the vibration temperature. +// 3 -- the electron temperature. +// 4 -- the pressure. +// 5 -- the mass fraction of oxygen. +// 6 -- the mass fraction of nitrogen. // firstStepError : the residual error of the first step iteration for the self-adaptive calculation. // secondStepError : the residual error of the second step iteration for the self-adaptive calculation. // thirdStepError : the residual error of the third step iteration for the self-adaptive calculation. -// useHyflowSetting : Setting for HyFLOW GUI. -// 0 -- PHengLEI -// 1 -- HyFLOW -// nProtectData : Use the continuation file data protection mechanism. -// 0 -- no -// 1 -- yes - +// nProtectData: Use the continuation file data protection mechanism. +// 0 -- no. +// 1 -- yes. +// nTvChange: Judge whether the Tv equals Ttr. +// 0 -- yes. +// 1 -- no. +// isMoleFractionType: 1 indicates the mass fractions, or else the mole fractions. +// nFraction: the initial fractions type of species. +// 0 -- mass fraction. +// 1 -- mole fraction. int dg_high_order = 0; int iapplication = 0; int isAdaptiveSolver = 0; -int nm = 5; +int nm = 5; int nEquilibriumGas = 0; -int nPCWCycleStep = 3; -int nRETCycleStep = 3; -int nSLIPCycleStep= 3; +int nPCWCycleStep = 3; +int nRETCycleStep = 3; +int nSLIPCycleStep = 3; int nIterFirstStep = 1000; int nIterSecondStep= 2000; int nIterThirdStep = 2000; @@ -1065,17 +1084,17 @@ double secondStepError = 0.001; double thirdStepError = 0.001; double predictCFLError = 0.1; -double refGama = 1.4; -double prl = 0.72; -double prt = 0.90; -double sc_l = 0.5; -double sc_t = 0.5; +double refGama = 1.4; +double prl = 0.72; +double prt = 0.90; +double sc_l = 0.5; +double sc_t = 0.5; -int nGasModel = 0; -int nchem = 0; -int nchemsrc = 1; -int nchemrad = 1; -int ntmodel = 1; +int nGasModel = 0; +int nchem = 0; +int nchemsrc = 1; +int nchemrad = 1; +int ntmodel = 1; int nIdealState = 0; int nEnergyRecycle = 1; @@ -1099,12 +1118,12 @@ double sigmaTemperature = 1.0; double sigmaMassFraction = 1.0; double velocitySlipCorrectConstant = 1.0; -double chemicalRelaxCorf = 1.0; +double chemicalRelaxCorf = 1.0; double chemicalSpectrumRadiusCoef = 1.0; double viscousSpectrumRadiusCoef = 1.5; double inviscidSpectrumRadiusCoef = 1.5; -double spectrumRadiusCoef = 0.5; -double staticPressureRelaxCorf = 0.2; +double spectrumRadiusCoef = 0.5; +double staticPressureRelaxCorf = 0.2; double maxViscous = 10000.0; double trTemperatureMin = 10.0; @@ -1114,31 +1133,35 @@ double densityMin = 1.0e-8; double densityMinFactor = 0.1; double tAdjustmentFactor = 10.0; double iniSpeedCoef = 1.0; +int iniSpeedMode = 0; -int nDebug = 0; -int nSpeciesLimit = 1; -int nTurblenceForChemical = 0; -int nViscosityFluxSublevelModified = 1; -int nViscosityPeModified = 0; -int nChemcalSourceModified = 2; -int nChemcalSourceEsMethod = 1; -int nMaxStepTemperature = 5; -int veTemperatureMinModified = 1; -int nDiagonalModified = 0; -int nGradPrimtiveMethod = 1; -int nInviscidFluxModify = 1; -int nQlLimitMethod = 2; -int nSpeciesForWallMethod = 1; -int nDensityForWallMethod = 0; +int nDebug = 0; +int nSpeciesLimit = 1; +int nTurblenceForChemical = 0; +int nViscosityFluxSublevelModified = 1; +int nViscosityPeModified = 0; +int nChemcalSourceModified = 2; +int nChemcalSourceEsMethod = 1; +int nMaxStepTemperature = 5; +int veTemperatureMinModified = 1; +int nDiagonalModified = 0; +int nDiagonalModifiedTurb = 0; +int nGradPrimtiveMethod = 1; +int nInviscidFluxModify = 1; +int nQlLimitMethod = 2; +int nSpeciesForWallMethod = 1; +int nDensityForWallMethod = 0; +int wallMultiTemperature = 0; -int nProtectData = 0; -int useHyflowSetting = 0; -int nAblation = 0; -int isInjection = 0; -int nViscosityModel = 0; -int nMarsModel = 0; -string gasfile = "DK5"; -//string gasfile = "./chemical/Dunn-Kang_air5s11r.dat"; +int nProtectData = 0; +int nAblation = 0; +int isInjection = 0; +int nViscosityModel = 0; +int nMarsModel = 0; +int nTvChange = 0; +int isMoleFractionType = 0; +string gasfile = "DK5"; +//string gasfile = "./chemical/Dunn-Kang_air5s11r.dat"; string speciesName = "O, O2, NO, N, N2"; string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.767"; @@ -1152,16 +1175,16 @@ string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.767"; //string speciesName = "O, O2, NO, N, N2, C, CO, CO2"; //string initMassFraction = "0.0015, 0.0429, 0.0, 0.0, 0.0, 0.0, 0.0777, 0.8779"; -//string gasfile = "Pa"; +//string gasfile = "Pa"; //string speciesName = "O, O2, NO, N, NO+, C, C2, CO, CO2, CN, N2, e-"; //string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.767, 0.0"; -//string gasfile = "Combustion-12"; +//string gasfile = "Combustion-12"; //string speciesName = "O, O2, NO, N, C, CO, CO2, H, H2, OH, H2O, N2"; //string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.767"; //string gasfile = "Gas-Mixture"; -//string speciesName ="SpeciesA, SpeciesB"; +//string speciesName = "SpeciesA, SpeciesB"; //string initMassFraction = "1.0, 0.0"; int nSutherland = 0; double gamaSpeciesA = 1.4; @@ -1173,9 +1196,17 @@ double molecularWeightSpeciesB = 30.0; //string speciesName = "O2, N2"; //string initMassFraction = "1.0, 0.0"; +int nFraction = 0; int nContinueModel = 0; int nChemicalFlowStep = 0; int ifStartFromPerfectGasResults = 0; +int isUseNoneqCond = 0; +double frozenCondition = 0.01; + +int nLeakageMonitor = 0; +double totalLeakageVolume = 1000.0; +double monitorThresholdValue = 0.05; +double sprayFactor = 0.0; ######################################################################### // Multi-Grid parameters. @@ -1196,7 +1227,6 @@ int ifStartFromPerfectGasResults = 0; // 1 -- zero order. // 2 -- first-order. (default) // mgCorrectionLimit: Multi-grid correction limit. - int nMGLevel = 1; int MGCoarsestIteration = 1; int MGPreIteration = 1; @@ -1218,20 +1248,20 @@ int ismooth_turb = 0; int SAProductType = 2; // ----------------- Overset Grid parameter ----------------------------- -int codeOfDigHoles = 1; -int codeOfTurbulentModel = 0; -string masterFileName = "./grid/searchFile.inp"; -string holeBasicFileName = "./grid/holeBasicFile.inp"; -string holeFullFileName = "./grid/holeFullFile.dat"; -string linkFileName = "./grid/topology.dat"; -string zoneInverseFileName = "./grid/zoneInverseMapping.inp"; +int codeOfDigHoles = 1; +int codeOfTurbulentModel = 0; +string masterFileName = "./grid/searchFile.inp"; +string holeBasicFileName = "./grid/holeBasicFile.inp"; +string holeFullFileName = "./grid/holeFullFile.dat"; +string linkFileName = "./grid/topology.dat"; +string zoneInverseFileName = "./grid/zoneInverseMapping.inp"; -######################################################################### -# High Order Struct Solver # -######################################################################### +#************************************************************************ +# High Order Struct Solver * +#************************************************************************ // isFVMOrFDM: -// 0 -- NSSolverStruct using Finite Volume Method. -// 1 -- NSSolverStruct using Finite Differ Method. +// 0 -- NSSolverStruct using Finite Volume Method. +// 1 -- NSSolverStruct using Finite Differ Method. // SolverStructOrder: Spatial discretisation order of NS equations with struct grid. // <= 2 -- finite volume method. // >= 3 -- finite difference order. (to be completed) @@ -1273,30 +1303,48 @@ int allReduceStep = 1; // codeOfOversetGrid: Overlapping(overset) grid or not. // 0 -- NON-overlapping grid. // 1 -- Overlapping grid. -// oversetInterpolationMethod: the method of overset interpolation while field simulation +// oversetInterpolationMethod: the method of overset interpolation while field simulation. // 0 -- set the acceptor cell value by donor cell value. // 1 -- set the acceptor cell value by distance weight of donor cell value. - -int codeOfOversetGrid = 0; -int oversetInterpolationMethod = 0; -int readOversetFileOrNot = 0; -int symetryOrNot = 0; -int readInAuxiliaryInnerGrid = 0; -int readInAuxiliaryOuterGrid = 0; -int readInSklFileOrNot = 0; -string auxiliaryInnerGrid0 = "./grid/aux-upper.fts"; -string auxiliaryInnerGrid1 = "./grid/aux-lower.fts"; -string auxiliaryInnerGrid2 = ""; -string oversetGridFileName = "./grid/iblank.ovs"; -double walldistMainZone = 1.0 -double toleranceForOversetSearch = 1.0e-3; -double toleranceForOversetBox = 1.0e-3; -int twoOrderInterpolationOrNot = 0; -int keyEnlargeOfActiveNodes = 0; -int outTecplotOverset = 0; -int outPutOversetVisualization = 0; - -int numberOfMovingBodies = 2; +// readOversetFileOrNo: Whether to read overset-file(.ovs) that has been generated. +// 0 -- no. +// 1 -- yes. +// symetryOrNot: If there exist symetryplanes(XY plane, the coordinate of Z direction is 0) in +// the current overset grid(only for three dimension). +// 0 -- no. +// 1 -- yes. +// readInAuxiliaryInnerGrid: Whether to read auxiliary inner grid. +// 0 -- no. +// 1 -- yes. +// walldistMainZone: The initial value of background grid which does not exist wall boundary condition. +// toleranceForOversetSearch: The tolerance of overset searching zone to judge whether the obtained node is in the current computing cell. +// toleranceForOversetBox: The tolerance of building the minimum box of computing cells in the overlapping region. +// twoOrderInterpolationOrNot: The number of interpolated cell layers in the overlapping boundary. +// 0 -- one layer. +// 1 -- two layers. +// keyEnlargeOfActiveNodes: The number of enlarged overset-boundary layers in the buffer region. +// outTecplotOverset: Whether to dump out the flowfield data after the progress of overset configure. +// 0 -- no. +// 1 -- yes. +int codeOfOversetGrid = 0; +int oversetInterpolationMethod = 0; +int readOversetFileOrNot = 0; +int symetryOrNot = 0; +int readInAuxiliaryInnerGrid = 0; +int readInAuxiliaryOuterGrid = 0; +int readInSklFileOrNot = 0; +string auxiliaryInnerGrid0 = "./grid/aux-upper.fts"; +string auxiliaryInnerGrid1 = "./grid/aux-lower.fts"; +string auxiliaryInnerGrid2 = ""; +string oversetGridFileName = "./grid/iblank.ovs"; +double walldistMainZone = 1.0 +double toleranceForOversetSearch = 1.0e-3; +double toleranceForOversetBox = 1.0e-3; +int twoOrderInterpolationOrNot = 0; +int keyEnlargeOfActiveNodes = 0; +int outTecplotOverset = 0; +int outPutOversetVisualization = 0; +int numberOfMovingBodies = 2; // ----------------- ALE configuration ------------------------------ int codeOfAleModel = 0; @@ -1306,36 +1354,42 @@ double referenceLength = 1.0; double referenceVelocity = 1.0; double referenceDensity = 1.0; -int strategyForFaceNormalVelocity = 0; //0-By Sweeping volume; 1-By face center 1st; 2-By face center 2nd; -int strategyForGCLSource = 0; //0-present; 1-Ahn; +int strategyForFaceNormalVelocity = 0; // 0-By Sweeping volume; 1-By face center 1st; 2-By face center 2nd. +int strategyForGCLSource = 0; // 0-present; 1-Ahn. -//0:1st-Admas-Bashforth; 1:2nd-Admas-Bashforth; 2:1st-Implicit-Euler; 3:2nd-Implicit Euler; 4:2nd-Adams-Moulton; 5:3rd-Adams-Moulton +// 0: 1st-Admas-Bashforth; 1: 2nd-Admas-Bashforth; 2: 1st-Implicit-Euler; 3: 2nd-Implicit Euler; 4: 2nd-Adams-Moulton; 5: 3rd-Adams-Moulton. int methodForKineticEquation = 0; double relaxParameterOfKinetic = 1.0; -######################################################################### -# motive information # -######################################################################### +#************************************************************************ +# motive information * +#************************************************************************ int numberOfMovingBodies = 1; ############################## body0 ############################## -//mass of parts -double mass_0 = 1.0; -//mass matrix of parts Ixx Iyy Izz Ixy Ixz Iyz -double massMatrix_0[] = 1e-7, 1e-6, 1e-6, 0.0, 0.0, 0.0; -//initial six DOF position information of parts. xc yc zc -double massCenter_0[] = 0.0 , 0.0, 0.0; -//initial six DOF position information of parts. angleX angleY angleZ -double attitudeAngle_0[] = 0.0 , 0.0, 0.0; -//initial six DOF move information of parts. vc vy vz -double massCenterVelocity_0[] = 0.0, 0.0, 0.0; -//initial six DOF move information of parts. omigX omigY omigZ -double angularVelocity_0[] = 0.0, 0.0, 0.0; -//the object that the parts belong to. -int fartherIndex_0 = -1; -//the assembly position of the parts. xc yc zc angleX angleY angleZ -double configPamameter_0[] = 0.0 ,0.0 ,0.0 ,0.0 ,0.0 ,0.0; -//the move pattern of the parts. +// mass of parts. +double mass_0 = 1.0; +// gravity of parts (along negative direction in Y-axis, eg. 9.8). +double gravity_0 = 0.0; +// mass matrix of parts Ixx Iyy Izz Ixy Ixz Iyz. +double massMatrix_0[] = 1e-7, 1e-6, 1e-6, 0.0, 0.0, 0.0; +// initial six DOF position information of parts. xc yc zc. +double massCenter_0[] = 0.0, 0.0, 0.0; +// if reset mass center while restart. +int resetMassCenter_0 = 0; +// position offset of parts. dx dy dz. +double massCenterDxyz_0[] = 0.0, 0.0, 0.0; +// initial six DOF position information of parts. angleX angleY angleZ. +double attitudeAngle_0[] = 0.0, 0.0, 0.0; +// initial six DOF move information of parts. vc vy vz. +double massCenterVelocity_0[] = 0.0, 0.0, 0.0; +// initial six DOF move information of parts. omigX omigY omigZ. +double angularVelocity_0[] = 0.0, 0.0, 0.0; +// the object that the parts belong to. +int fartherIndex_0 = -1; +// the assembly position of the parts. xc yc zc angleX angleY angleZ. +double configPamameter_0[] = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0; +// the move pattern of the parts. // -1 given motion partten. // 0 still. // 1 six DOF motion. @@ -1346,51 +1400,68 @@ double configPamameter_0[] = 0.0 ,0.0 ,0.0 ,0.0 ,0.0 // 14 forced pitch motion. // 15 forced yaw motion. // 16 forced roll motion. -int RBDMethod_0 = 0; -double amplitude_0 = 0.0; -double reduceFrequency_0 = 0.0; -//direction of rotation +int RBDMethod_0 = 0; +double amplitude_0 = 0.0; +double reduceFrequency_0 = 0.0; +// direction of rotation. // 1 -- clockwise from the point of view along the positive x axis. // -1 -- anticlockwise from the point of view along the positive x axis. -int direction_0 = -1; -double rotateFrequency_0 = 0.0; -//string uDFSixDofFileName_0 = "./Bin/UDFSixDof.Parameter"; -//additional force (system axis) fX fY fZ -double addedForce_0[] = 0.0 ,0.0 ,0.0 ; -//additional moment of Force (system axis) mX mY mZ -double addedMoment_0[] = 0.0 ,0.0 ,0.0 ; -//the deformation method of the parts. -int morphing_0 = 0; - -// post indentify -int integralOrder = 4; +int direction_0 = -1; +double rotateFrequency_0 = 0.0; +//string uDFSixDofFileName_0 = "./Bin/UDFSixDof.Parameter"; +// dimensional physical time for additional force(s). +double addedForceTime_0[] = 0.0; +// additional force(inertia system) fX fY fZ. +double addedForce_0[] = 0.0, 0.0, 0.0; +// additional moment(inertia system) mX mY mZ. +double addedMoment_0[] = 0.0, 0.0, 0.0; +// the deformation method of the parts. +int morphing_0 = 0; +// post indentify. +int integralOrder = 4; // ---------------- ATP read -------------------------------------------- -//@int inflowParaType = 0; +//@int inflowParaType = 0; //@double refReNumber = 6.5e6; //@double refDimensionalTemperature = 288.15; //@double freestream_vibration_temperature = 300.00; -//@double refDimensionalPressure = 0; -//@double height = 0; -//@int nsubsonicInlet = 0; -//@int nsubsonicOutlet = 0; -//@string inLetFileName = "./bin/subsonicInlet.hypara"; -//@string outLetFileName = "./bin/subsonicOutlet.hypara"; +//@double refDimensionalPressure = 0; +//@double height = 0; +//@int nsubsonicInlet = 0; +//@int nsubsonicOutlet = 0; +//@string inLetFileName = "./bin/subsonicInlet.hypara"; +//@string outLetFileName = "./bin/subsonicOutlet.hypara"; //@double refDimensionalVelocity = 0; //@double refDimensionalDensity = 0; - -######################################################################### -# Old Parameter # -######################################################################### +//@string weatherDataFilePath = "./WRFData/"; +//@double longitude = 110.95 +//@double latitude = 19.61; +#************************************************************************ +# Old Parameter * +#************************************************************************ int isPlotVolumeField = 0; +#************************************************************************ +# partial flow field setting Parameter * +#************************************************************************ +//int nPartialParameter = 0; // 0/1/2 +//int nNumberOfPartialField = 0; // +//int nStartGridIndex[] = [0]; +//int nEndGridIndex[] = [0]; -######################################################################### -# Incompressible Parameter # -######################################################################### +//double partialCFL[] = [0.0]; +//double partialSpeedCoef[] = [0.0]; +//double partialSpeed[] = [0.0]; +//double partialAttackd[] = [0.0]; +//double partialSlide[] = [0.0]; +//double partialPressure[] = [0.0]; +//double partialTemperature[] = [0.0]; +//double partialMassFractions[] = [0.0]; +#************************************************************************ +# Incompressible Parameter * +#************************************************************************ int isSolveEnergyEquation = 0; int isSolveTurbEquation = 0; -int isSolveSpeciesEquation = 0; - +int isSolveSpeciesEquation = 0; \ No newline at end of file diff --git a/A08_TwoD_30p30n_SST_Struct_4CPU/bin/grid_para.hypara b/A08_TwoD_30p30n_SST_Struct_4CPU/bin/grid_para.hypara index 05b08b9..380a737 100644 --- a/A08_TwoD_30p30n_SST_Struct_4CPU/bin/grid_para.hypara +++ b/A08_TwoD_30p30n_SST_Struct_4CPU/bin/grid_para.hypara @@ -4,9 +4,12 @@ // gridtype: Grid type for generation, conversion, reconstruction, merging. // 0 -- Unstructured grid. // 1 -- Structured grid. -// axisup: Type of Cartisien coordinates system, used in grid conversion. -// 1 -- Y upward. (default) -// 2 -- Z upward. +// nAxisRotateTimes: number of axis rotating times, zero (default) meaning without rotating. +// axisRotateOrder : axis rotating order. +// 1 -- X-axis. +// 2 -- Y-axis. +// 3 -- Z-axis. +// axisRotateAngles: axis rotating angles (degree), which are corresponding to the axis rotating order. // from_gtype: Type of grid data type in grid conversion process. // -1 -- MULTI_TYPE. // 1 -- PHengLEI, *.fts. @@ -18,7 +21,9 @@ // 7 -- Hybrid, include both of unstructured and structured grid, *.fts. // 8 -- GMSH, *.msh. int gridtype = 1; -int axisup = 1; +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; int from_gtype = 3; ######################################################################### diff --git a/A09_ThreeD_M6_SST_Struct_MG2_4CPU/bin/cfd_para.hypara b/A09_ThreeD_M6_SST_Struct_MG2_4CPU/bin/cfd_para.hypara index c344658..f903a5a 100644 --- a/A09_ThreeD_M6_SST_Struct_MG2_4CPU/bin/cfd_para.hypara +++ b/A09_ThreeD_M6_SST_Struct_MG2_4CPU/bin/cfd_para.hypara @@ -8,23 +8,24 @@ // Platform for Hybrid Engineering Simulation of Flows + // China Aerodynamics Research and Development Center + // (C) Copyright, Since 2010 + +// PHengLEI 2212 + //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ########################################################################### # Default parameters for Grid conversion # ########################################################################### // gridtype: Grid type for generation, conversion, reconstruction, merging. -// 0 -- Unstructured grid. -// 1 -- Structured grid. -// 2 -- Hybrid grid, include both of unstructured and structured grid. -// gridobj: Task type of grid treatment. -// 0 -- Grid generation of typical case, such as cylinder, flat plate, etc. -// 1 -- Grid conversion, from other grid data to PHenglEI, such as Fluent, CGNS. -// 2 -- Grid refinement. -// 3 -- Grid merging, merge two blocks into one block. -// 4 -- Grid deformation, achieve unstructured grid deformation. -// 5 -- Grid repairing, repair the original grid in order to remove the negative volume cells. -// 6 -- Grid mirroring, mirror a symmetry grid to whole grid. -// 7 -- Grid type change, convert structured grid to unstructured grid. +// 0 -- Unstructured grid. +// 1 -- Structured grid. +// 2 -- Hybrid grid, include both of unstructured and structured grid. +// gridobj: Task type of grid treatment. +// 0 -- Grid generation of typical case, such as cylinder, flat plate, etc. +// 1 -- Grid conversion, from other grid data to PHenglEI, such as Fluent, CGNS. +// 2 -- Grid refinement. +// 3 -- Grid merging, merge two blocks into one block. +// 4 -- Grid deformation, achieve unstructured grid deformation. +// 5 -- Grid repairing, repair the original grid in order to remove the negative volume cells. +// 6 -- Grid mirroring, mirror a symmetry grid to whole grid. +// 7 -- Grid type change, convert structured grid to unstructured grid. // multiblock: Multi-block grid or not, only for structured grid conversion. // 0 -- Not. // 1 -- Yes. @@ -46,19 +47,24 @@ int gridobj = 1; int multiblock = 0; int iadapt = 0; int SymmetryFaceVector = 1; - int gridReorder = 0; int faceReorderMethod = 0; -// axisup: Type of Cartisien coordinates system, used in grid conversion. -// 1 -- Y upward. (default) -// 2 -- Z upward. -int axisup = 1; +// nAxisRotateTimes: number of axis rotating times, zero (default) meaning without rotating. +// axisRotateOrder : axis rotating order. +// 1 -- X-axis. +// 2 -- Y-axis. +// 3 -- Z-axis. +// axisRotateAngles: axis rotating angles (degree), which are corresponding to the axis rotating order. +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; // omit_no_bound_bc: What's boundary condition for the type of "no_boundary_condition". // 0 -- Interface. (default) // 1 -- Physical boundary condition, used in Hybrid solver. int omit_no_bound_bc = 0; +int omitRepeatInterface = 1; //----------------------------------------------------------------------- # Grid data type # @@ -87,10 +93,9 @@ int dumpOldGrid = 0; // from_gfile: path of original data file for unstructure grid convert from. // out_gfile: path of target file for grid convert to, *.fts type of file usually. int numberOfGridFile = 1; -string from_gfile = "./grid/rae2822_hybrid2d.cas"; -string from_gfile1= ""; - -string out_gfile = "./grid/flat_laminr_133_85_2d.fts"; +string from_gfile = "./grid/rae2822_hybrid2d.cas"; +string from_gfile1 = ""; +string out_gfile = "./grid/flat_laminr_133_85_2d.fts"; // ----------------- some advanced choices ------------------------------ // iunsteady: The Grid is for unsteady simulation or not. @@ -103,9 +108,9 @@ int fileformat = 0; // Parameters for hybrid solver. // mixgrid_uns: path of unstructure grid file for hybrid solver, *.fts type. -// mixgrid_str: path of structure grid file for hybrid solver, *.fts type. -string mixgrid_uns = "./grid/rae2822_uns2d_4.fts"; -string mixgrid_str = "./grid/flat_laminr_133_85_2d.fts"; +// mixgrid_str: path of structure grid file for hybrid solver, *.fts type. +string mixgrid_uns = "./grid/rae2822_uns2d_4.fts"; +string mixgrid_str = "./grid/flat_laminr_133_85_2d.fts"; // Some parameters for structured overlapping grid. int codeOfDigHoles = 1; @@ -119,31 +124,31 @@ string zoneInverseFileName = "./oversetGridView/zoneInverseMapping.inp"; // 0 -- Not. (default) // 1 -- Yes. // geometryUnit: Geometry unit. -// 1 -- meter. -// 2 -- millimeter. -// 3 -- inch. +// 1 -- meter. +// 2 -- millimeter. +// 3 -- inch. // exclusiveCase: Parallel projection exclusive case. -// 0 -- NON case. -// 1 -- JSM-C2-NPOFF case. -// 2 -- CHNT. +// 0 -- NON case. +// 1 -- JSM-C2-NPOFF case. +// 2 -- CHNT. // projectOrgPoint: If the original wall points need to be projected or not. -int anisoRefine = 0; -int geometryUnit = 1; -int isProject = 0; -int readDist = 0; -int isDeform = 0; +int anisoRefine = 0; +int geometryUnit = 1; +int isProject = 0; +int readDist = 0; +int isDeform = 0; int exclusiveCase = 0; int projectOrgPoint = 0; string geometryFileName = "./grid/jsm.igs"; // ----------------- Grid Deform Parameters ----------------------------- // deformationMethod: Grid Deform. -// 1 -- SPRING. -// 2 -- RBF. +// 1 -- SPRING. +// 2 -- RBF. // stationalGridFile: Original grid file. // visualFileName : The visualization file path of deform grid. // nDeformStep : The max deform step. -// flapAngle : The max flap angle. +// flapAngle : The max flap angle. // rotatePostionZ : Rotate postion. // rotatePostionY : Rotate postion. // gridSlice : If dump slice grid. @@ -163,10 +168,10 @@ int sliceAxis = 1; double slicePosition = 13; // ----------------- RBF Parameters ------------------------------------- -// numberOfReferenceCP : Number of reference Control Points. -// influencePara : The RBF influence radius parameter. +// numberOfReferenceCP: Number of reference Control Points. +// influencePara : The RBF influence radius parameter. int numberOfReferenceCP = 40; -double influencePara = 25.0; +double influencePara = 25.0; // ----------------- Periodic Parameters -------------------------------- // Notice: Rotational periodicity only support rotation along the X axis! @@ -178,9 +183,8 @@ double influencePara = 25.0; which only support one direction. // rotationAngle: The relative angle between two periodic face. which is recorded in degrees. - int periodicType = 0; -double translationLength[] = [0.0,0.0,0.0]; +double translationLength[] = [0.0, 0.0, 0.0]; double rotationAngle = 0.0; ######################################################################### @@ -192,7 +196,6 @@ double rotationAngle = 0.0; // 2 -- refine structured grid. // maxproc: The number of partition zones that want to be divided into. // numberOfMultifile: The number of partition grid files that want to be dumped out. - int pgridtype = 0; int maxproc = 4; int numberOfMultifile = 1; @@ -201,20 +204,20 @@ int numberOfMultifile = 1; // 0 -- Not. // 1 -- Yes. // blockIndexOfMark: the block index of mark, only for structured grid partition. -// cellIndexOfMark: the cell index of mark, only for structured grid partition. +// cellIndexOfMark : the cell index of mark, only for structured grid partition. int traceMark = 0; int blockIndexOfMark = 0; -int cellIndexOfMark[] = [185,30,1]; +int cellIndexOfMark[] = [185, 30, 1]; -// parallel Strategy: -//! -# 0 : each zone is assigned to the one that defined in grid partition procedure. -//! -# 1 : random assigned for each zone or by some else ways. -int parallelStrategy = 1; +// parallelStrategy: +// 0 -- each zone is assigned to the one that defined in grid partition procedure. +// 1 -- random assigned for each zone or by some else ways. +int parallelStrategy = 1; //----------------------------------------------------------------------- # File path # //----------------------------------------------------------------------- -// original_grid_file: Original grid file that want to be divided(PHengLEI type, *.fts). +// original_grid_file: Original grid file that want to be divided(PHengLEI type, *.fts). // partition_grid_file: Target partition grid file(PHengLEI type, *.fts). string original_grid_file = "./grid/sphere_mixed.fts"; string partition_grid_file = "./grid/sphere_mixed__4.fts"; @@ -232,11 +235,10 @@ string partition_grid_file = "./grid/sphere_mixed__4.fts"; // 1 -- perfect balance. // maxproc -- perfect imbalance. // 1.05 -- recommended. - int omit_no_bound_bc = 0; int npartmethod = 1; int parallelPartitionMethod = 2; -double parmetisBalance = 1.05; +double parmetisBalance = 1.05; // numberOfMultigrid: Number of multi-grid levels, ONLY used for structured grid. // 1 -- single level. @@ -248,29 +250,35 @@ int numberOfMultigrid = 1; # Default parameters for CFD simulation # ######################################################################### // maxSimuStep: The max simulation step, don't care simulation is restart or not. -// intervalStepFlow: The step intervals for flow variables file 'flow.dat' saved. -// intervalStepPlot: The step intervals for tecplot visual file 'tecflow.dat' saved. +// intervalStepFlow: The step intervals for flow variables file 'flow.dat' saved. +// intervalStepPlot: The step intervals for tecplot visual file 'tecflow.dat' saved. // intervalStepSample: The step intervals for monitored probes variables file 'sample.dat' saved. -// intervalStepForce: The step intervals for aerodynamics coefficients file 'aircoef.dat' saved. -// intervalStepRes: The step intervals for residual file 'res.dat' saved. -// ifLowSpeedPrecon: Precondition process to accelerate convergence for low speed flow. -// 0 -- no precondition process. (default, mach > 0.3) -// 1 -- carry out precondition process. (mach number <= 0.3) - -int maxSimuStep = 20000; - -int intervalStepFlow = 1000; -int intervalStepPlot = 1000; +// intervalStepForce: The step intervals for aerodynamics coefficients file 'aircoef.dat' saved. +// intervalStepRes: The step intervals for residual file 'res.dat' saved. +int maxSimuStep = 20000; +int intervalStepFlow = 1000; +int intervalStepPlot = 1000; int intervalStepSample = 1000; -int intervalStepForce = 100; -int intervalStepRes = 10; -int ifLowSpeedPrecon = 0; +int intervalStepForce = 100; +int intervalStepRes = 10; // compressible: // 0 -- incompressible flow. // 1 -- compressible flow. (default) int compressible = 1; +// ifLowSpeedPrecon: Precondition process to accelerate convergence for low speed flow. +// 0 -- no precondition process. (default, mach > 0.3) +// 1 -- carry out precondition process. (mach number <= 0.3) +// Kprec: The coefficient K for the cut-off velocity. +// 1.0~3.0 is suggested. (default, 3.0) +// preconFarfieldBCMethod: The precondition method for farfield boundary condition. +// 0 -- precondition far-field boundary based on riemann invariants. +// 1 -- Turkel's simplified far-field boundary condition. +int ifLowSpeedPrecon = 0; +double Kprec = 3.0; +int preconFarfieldBCMethod = 1; + //----------------------------------------------------------------------- # CFD Control Parameter # //----------------------------------------------------------------------- @@ -281,33 +289,36 @@ int compressible = 1; // 0 -- the nondimensional conditions. // 1 -- the flight conditions. // 2 -- the experiment conditions. -// 3 -- the subsonic boundary conditions. +// 3 -- the subsonic boundary conditions. (Useless!) // 4 -- the condition that the velocity, temperature and density are given. // 5 -- the condition that the velocity, temperature and pressure are given. +//flowInitMethod: Flow field initialization method. +// 0 -- The entire flow field is initialized according to Infinite velocity. +// 1 -- The velocity near the wall is initialized according to the boundary layer of the plate. // refReNumber: Reynolds number, which is based unit length, unit of 1/m. // refDimensionalTemperature: Dimensional reference temperature, or the total temperature only for the experiment condition. // freestream_vibration_temperature: Dimensional freestream vibration temperature. // refDimensionalPressure: Dimensional reference pressure, or the total pressure only for the experiment condition. // height: Fly height, unit of km. // wallTemperature: Temprature of the solid wall, minus value is for adiabatic boundary condition. -// gridScaleFactor: The customizable unit of the grid, default value is 1.0 for meter.Common dimensions like: -// 1 dm = 0.1 m. -// 1 cm = 0.01 m. -// 1 mm = 0.001m. -// 1 inch = 0.0254m. -// 1 foot = 12 inches = 0.3048m. -// 1 yard = 3 feet = 0.9144m. +// gridScaleFactor: The customizable unit of the grid, default value is 1.0 for meter. Common dimensions like: +// 1 dm = 0.1 m. +// 1 cm = 0.01 m. +// 1 mm = 0.001 m. +// 1 inch = 0.0254 m. +// 1 foot = 12 inches = 0.3048 m. +// 1 yard = 3 feet = 0.9144 m. // forceReferenceLength, forceReferenceLengthSpanWise, forceReferenceArea: Reference length, SpanWise length and area, independent of grid unit. // TorqueRefX, TorqueRefY, TorqueRefZ: Reference point, independent of grid unit. // radiationCoef: The radiation coefficient on wall, it is used to compute the radiation heat flux on wall when the boundary // condition is radiation equilibrium temperature, and 0.8 is the default value. -// refMolecularWeight : the reference molecular weight of gas used for perfect gas. The unit is g/mol. +// refMolecularWeight: the reference molecular weight of gas used for perfect gas. The unit is g/mol. // Generally, the gas is air. Sometimes, it is experiment gas, such as Nitrogen, Argon, and so on. - -int directionMethod = 0; +int directionMethod = 0; double refMachNumber = 0.73; double attackd = 2.79; double angleSlide = 0.00; +int flowInitMethod = 0; int inflowParaType = 0; double refReNumber = 6.5e6; @@ -321,29 +332,27 @@ double freestream_vibration_temperature = 300.00; //double refDimensionalTemperature = 6051.024; // The total temperature, T*(1+(refGama-1)*M*M/2). //double refDimensionalPressure = 4.299696E09; // The total pressure, p*(T0/T)^(refGama/(refGama-1)). -//int inflowParaType = 3; -//int nsubsonicInlet = 1; -//int nsubsonicOutlet = 1; -//string inLetFileName = "./bin/subsonicInlet.hypara"; -//string outLetFileName = "./bin/subsonicOutlet.hypara"; -//double refDimensionalTemperature = 288.144; -//double refDimensionalPressure = 1.01313E05; - -//The velocity, temperature and density are fixed. +// The velocity, temperature and density are fixed. //int inflowParaType = 4; //double refDimensionalVelocity = 1000.0; -//double refDimensionalDensity = 1.0e3; +//double refDimensionalDensity = 1.0e3; -//The velocity, temperature and pressure are fixed. +// The velocity, temperature and pressure are fixed. //int inflowParaType = 5; //double refDimensionalVelocity = 1000.0; //double refDimensionalPressure = 1.0e5; -//The MachNumber, temperature and pressure are fixed. +// The MachNumber, temperature and pressure are fixed. //int inflowParaType = 6; -//double refDimensionalTemperature = 293; +//double refDimensionalTemperature = 293.0; //double refDimensionalPressure = 8886.06; +// The velocity, temperature and pressure are read from file. +//int inflowParaType = 7; +//string weatherDataFilePath = "./WRFData/"; +//double longitude = 110.95 +//double latitude = 19.61; + double wallTemperature = -1.0; double radiationCoef = 0.8; @@ -357,41 +366,41 @@ double forceReferenceArea = 1.0; // unit of meter^2. double TorqueRefX = 0.0; // unit of meter. double TorqueRefY = 0.0; // unit of meter. double TorqueRefZ = 0.0; // unit of meter. +double knudsenLength = 1.0; // unit of meter. double refMolecularWeight = 28.9644; // unit of g/mol. //----------------------------------------------------------------------- # Spatial Discretisation # //----------------------------------------------------------------------- -#******************************************************************* -# Struct Solver * -#******************************************************************* +#************************************************************************ +# Struct Solver * +#************************************************************************ // inviscidSchemeName: Spatial discretisation scheme of struct grid. // Using this when solve structered grid or hybrid. -// -- "vanleer", "steger", "hlle", "lax_f". -// -- "roe", "modified_roe". +// -- "vanleer", "steger", "hlle", "lax_f", +// -- "roe", "modified_roe", // -- "ausm+", "ausm+w", "ausm+up", "ausmdv", "ausmpw", "ausmpw+". // isWennScheme: If using WENN Scheme of struct grid. -// 0 -- NO. (default) -// 1 -- Yes. +// 0 -- NO. (default) +// 1 -- Yes. // str_limiter_name: Limiter of struct grid. -// -- "vanalbada", "vanleer", "minmod", "smooth", "minvan", "3rdsmooth", "3rd_minmod_smooth". -// -- "nolim", no limiter. -// -- "vanalbada_clz", clz supersonic version. -// -- "weno3_js", "wenn3_prm211", "wenn3_zm", "wenn3_zes2", "wenn3_zes3" - +// -- "vanalbada", "vanleer", "minmod", "smooth", "minvan", "3rdsmooth", "3rd_minmod_smooth", +// -- "nolim", no limiter, +// -- "vanalbada_clz", clz supersonic version, +// -- "weno3_js", "wenn3_prm211", "wenn3_zm", "wenn3_zes2", "wenn3_zes3". string inviscidSchemeName = "roe"; int isWennScheme = 0; -string str_limiter_name = "vanalbada"; +string str_limiter_name = "vanalbada"; -#******************************************************************* -# UnStruct Solver or Common * -#******************************************************************* +#************************************************************************ +# UnStruct Solver or Common * +#************************************************************************ // viscousType: Viscous model. -// 0 -- Euler. -// 1 -- Lamilar. -// 2 -- Algebraic. -// 3 -- 1eq turbulent. -// 4 -- 2eq turbulent. +// 0 -- Euler. +// 1 -- Lamilar. +// 2 -- Algebraic. +// 3 -- 1eq turbulent. +// 4 -- 2eq turbulent. // viscousName: Laminar or tubulent model. // -- "0eq-bl". // -- "1eq-sa". @@ -410,16 +419,16 @@ string str_limiter_name = "vanalbada"; // 3 -- IDDES. // uns_scheme_name: Spatial discretisation scheme of Unstruct grid. // Using this when solve Unstructered grid or hybrid. -// -- "vanleer", "roe", "steger", "kfvs", "lax_f", "hlle". +// -- "vanleer", "roe", "GMRESRoe", "GMRESSteger", "steger", "kfvs", "lax_f", "hlle", // -- "ausm+", "ausmdv", "ausm+w", "ausmpw", "ausmpw+". // uns_limiter_name: Limiter of Unstruct grid. -// -- "barth", "vencat", "vanleer", "minmod". -// -- "vanalbada", "smooth", "nnd", "lpz", "1st". +// -- "barth", "vencat", "vanleer", "minmod", +// -- "vanalbada", "smooth", "nnd", "lpz", "1st", // -- "nolim", no limiter. // uns_vis_name: Discretisation method of viscous term. // -- "std", "test", "aver", "new1", "new2". // gradientName: Gradient reconstruction method. -// -- "default", "ggcell", "ggnode", "lsq". +// -- "default", "ggcell", "ggnode", "lsq". // ivencat: Variation of vencat limiter. // 0 -- org method, it is independent of grid scale. // 1 -- new method, it is dependent of grid scale. @@ -442,18 +451,18 @@ string str_limiter_name = "vanalbada"; // 3 -- Harten type, which is default used. // roeEntropyScale: Entropy fix (correction) coefficient scale, default is 1.0. // It is used to scale the default Roe entropy fix coefficients. -// AusmpwPlusLimiter: A Limiter to make "function w" not change acutely in AusmpwPlus scheme, default is 1.0 +// AusmpwPlusLimiter: A Limiter to make "function w" not change acutely in AusmpwPlus scheme, default is 1.0. -//int viscousType = 0; +//int viscousType = 0; //string viscousName = "Euler"; -//int viscousType = 1; +//int viscousType = 1; //string viscousName = "laminar"; -int viscousType = 3; +int viscousType = 3; string viscousName = "1eq-sa"; -//int viscousType = 4; +//int viscousType = 4; //string viscousName = "2eq-kw-menter-sst"; int DESType = 0; @@ -463,7 +472,7 @@ string uns_limiter_name = "vencat"; string uns_vis_name = "test"; string gradientName = "ggnode"; -int ivencat = 7; +int ivencat = 7; double venkatCoeff = 5.0; int reconmeth = 1; int limitVariables = 0; @@ -475,9 +484,9 @@ double roeEntropyScale = 1.0; double AusmpwPlusLimiter = 1.0; -//----------------------------------------------------------------------- -# Temporal Discretisation # -//----------------------------------------------------------------------- +#************************************************************************ +# Temporal Discretisation * +#************************************************************************ // iunsteady: Steady or unsteady. // 0 -- steady. // 1 -- unsteay. @@ -490,51 +499,57 @@ double AusmpwPlusLimiter = 1.0; // statisticalTimePeriod: Used as time period of statistic analysis. // when the value is negative, time period is treated as infinite. // statisticMethod: Statistic reynolds stress method. -// 0 -- tau = - ^2 -// 1 -- tau = +// 0 -- tau = - ^2 +// 1 -- tau = // min_sub_iter: The min sub iteration of unsteady simulation. // max_sub_iter: The max sub iteration of unsteady simulation. // tol_sub_iter: The tolerance of sub iteration of unsteady simulation. // tscheme: Temporal Discretisation method. -// 1 -- Runge-Kutta Multi-State. -// 2 -- Point implicit. -// 3 -- Full implicit. -// 4 -- LU-SGS. -// 5 -- Block LU-SGS. -// 6 -- Jacobian iteration. -// 7 -- Line LU-SGS. -// 8 -- Matrix LU-SGS. +// 1 -- Runge-Kutta Multi-State. +// 2 -- Point implicit. +// 3 -- Full implicit. +// 4 -- LU-SGS. +// 5 -- Block LU-SGS. +// 6 -- Jacobian iteration. +// 7 -- Line LU-SGS. +// 8 -- Matrix LU-SGS. +// 9 -- GMRES. // iSimplifyViscousTerm: Simplify the computation of viscous term in the Block LU-SGS method. The default value assigns 1 that could speed up the computation. // Otherwise, the viscous Jacobian matrix Mv should be computed that will increase the memory and time in iteration of the BLUSGS method. // CFLStart: Started cfl number. // CFLEnd: End cfl number. // CFLVaryStep: The number of step when cfl increase from CFLStart to CFLEnd. +// GMRESCFLScale : CFL = CFLStart * GMRESCFLScal^iteration. +// OriginalTscheme : Used for LUSGS and GMres hybrid computing. +// useLUSGSprecond: Initialize flow field for GMRES. +// 0 --Initialize by first order Jacobian matrix. +// 1 --Initialize by LUSGS. +// GMRESInitStep : the number of iteration step of irst order Jacobian matrix or LUSGS for initialize flow field. // ktmax: Dtratio. dt[i] = MIN(dt[i], ktmax * dtmin / vol[i]) // swapDq: Communication dq between forward/backward sweep of LUSGS or not, default is 0. // nLUSGSSweeps: Sub iteration of LU-SGS or Block LU-SGS. // LUSGSTolerance: Sub iter tolerance of LU-SGS or Block LU-SGS. // ifLocalTimeStep: Time step method. -// 0 --Local. -// 1 --Global. +// 0 --Local. +// 1 --Global. // isUseLocalCFL: use variable number of CFL or not. -// 0 -- global unified CFL number. -// 1 -- local CFL number. +// 0 -- global unified CFL number. +// 1 -- local CFL number. // isUsePreTwall: use the previous temperatures on wall. 1 indicates yes, and 0 indicates no. // visl_min: Minimum value of laminar viscosity coefficient. // turbCFLScale: Turbulence model cfl number factor. // codeOfAleModel: Arbitrary Lagrangian-Eulerian method. -// 0 -- no ALE method. -// 1 -- ALE method for non-moving grids. -// 2 -- ALE method for moving grids. -// 3 -- ALE method for deforming grids. +// 0 -- no ALE method. +// 1 -- ALE method for non-moving grids. +// 2 -- ALE method for moving grids. +// 3 -- ALE method for deforming grids. // wallFunctionType: The type of wall function to implement. -// 0 -- no wall function. (default) -// 1 -- standard wall function. -// 2 -- Pab3D wall function. +// 0 -- no wall function. (default) +// 1 -- standard wall function. +// 2 -- Pab3D wall function. // RKStage: The number of Runge-Kutta step. // lamda: Cofficient of Runge-Kutta step. - -int iunsteady = 0; +int iunsteady = 0; double physicalTimeStep = 0.01; double physicalTimeStepDimensional = -0.001; int ifStartFromSteadyResults = 0; @@ -543,39 +558,42 @@ int ifStaticsReynoldsStress = 0; int startStatisticStep = 800000; double statisticalTimePeriod = -1.0; int statisticMethod = 0; -int linearTwoStepMethods = 1; // 1--BDF1; 2--C-N; 3--BDF2; +int linearTwoStepMethods = 1; // 1--BDF1; 2--C-N; 3--BDF2. int methodOfDualTime = 3; int min_sub_iter = 50; int max_sub_iter = 50; double tol_sub_iter = 0.01; -int tscheme = 4; +int tscheme = 4; int iSimplifyViscousTerm = 1; int ifLocalTimeStep = 0; int isUseLocalCFL = 0; int isUsePreTwall = 0; -double CFLStart = 0.01; -double CFLEnd = 10.0; -int CFLVaryStep = 500; - +double CFLStart = 0.01; +double CFLEnd = 10.0; +int CFLVaryStep = 500; +double GMRESCFLScale = 1.0; +int OriginalTscheme = 9; +int useLUSGSprecond = 1; +int GMRESInitStep = 1000; double pMaxForCFL = 0.2; double pMinForCFL = 0.1; double deltaMaxForCFL = 0.2; double magnifyFactorForCFL = 1.1; double reduceFactorForCFL = 0.5; -double ktmax = 1.0e10; +double ktmax = 1.0e10; -int swapDq = 1; +int swapDq = 1; int nLUSGSSweeps = 1; double LUSGSTolerance = 0.01; -int order = 2; +int order = 2; double visl_min = 0.01; double turbCFLScale = 1.0; -double csrv = 2.0; +double csrv = 1.0; double timemax = 1.0e10; double dtsave = -1.0; int maxale = 10; @@ -591,10 +609,9 @@ double lamda[] = [0.5, 1.0]; //int RKStage = 4; //double lamda[] = [0.25, 0.33333333333, 0.5, 1.0]; - -//----------------------------------------------------------------------- -# File In or Out # -//----------------------------------------------------------------------- +#************************************************************************ +# File In or Out * +#************************************************************************ // numberOfGridGroups: The number of grid groups. // gridfile: The partitioned Grid file path, using relative path, // which is relative to the working directory. @@ -611,20 +628,18 @@ double lamda[] = [0.5, 1.0]; // aircoeffile: The file path to save the aerodynamic force coefficients convergence process, write data for every default (intervalStepForce) steps. // restartNSFile: The file path to write restart flowfield variables, write data for every default (intervalStepFlow) steps. // turbfile: The file path to write restart flowfield variables of turbulence , write data for every default(intervalStepFlow) steps. -// visualfile: The visualization file path of flowfield , write data for every default (intervalStepPlot) steps. +// visualfile: The visualization file path of flowfield, write data for every default (intervalStepPlot) steps. // wall_aircoefile: The file path to save flowfield variables of wall, write data for every default steps. // nDumpSurfaceInfo = 0 the "wall_varfile" write the informations including heat flux. // nDumpSurfaceInfo = 1 the "wall_varfile" write the informations without heat flux. // nIsComputeWallDist: Whether to compute the wall distance. // 0 -- Compute wall distance. // 1 -- Not compute. -// -// protectionFile0 and protectionFile1 : Two continuation file of the data protection mechanism. -// wall_heatfluxfile : The file to output the MaxHeatFlux of wall. - -int numberOfGridGroups = 1; -string gridfile = "./grid/rae2822_hybrid2d__4.fts"; -string wallTemperaturefile= ""; +// protectionFile0 and protectionFile1: Two continuation file of the data protection mechanism. +// wall_heatfluxfile: The file to output the MaxHeatFlux of wall. +int numberOfGridGroups = 1; +string gridfile = "./grid/rae2822_hybrid2d__4.fts"; +string wallTemperaturefile = ""; int nIsComputeWallDist = 0; int walldistMethod = 1; @@ -632,10 +647,12 @@ int cellMethodOrNodeMethod = 0; string resSaveFile = "results/res.dat"; string turbresfile = "results/turbres.dat"; +string transitionResFile = "results/transitionRes.dat"; string aircoeffile = "results/aircoef.dat"; string restartNSFile = "results/flow.dat"; string turbfile = "results/turb.dat"; +string transitionFile = "results/transition.dat"; string visualfile = "results/tecflow.plt"; string wall_aircoefile = "results/wall_aircoef.dat"; @@ -645,10 +662,14 @@ string protectionFile0 = "results/flow0.dat"; string protectionFile1 = "results/flow1.dat"; string wall_heatfluxfile = "results/wall_heatflux.dat"; -int nDumpSurfaceInfo = 0; -string wall_varfile = ""; +string protectionTurbFile0 = "results/turb0.dat"; +string protectionTurbFile1 = "results/turb1.dat"; -string jetDefineFile = "bin/jet.hypara"; +string protectionTransitionFile0 = "results/transition0.dat"; +string protectionTransitionFile1 = "results/transition1.dat"; + +int nDumpSurfaceInfo = 0; +string wall_varfile = ""; string sixDofFileName = "results/sixDofInfo.dat"; string derivativeFileName = "results/identify.dat"; @@ -659,7 +680,8 @@ int plotFieldType = 0; // visualfileType: The file type of visualfile. // 0 -- Tecplot binary. // 1 -- Tecplot ASCII. - +// 2 -- Ensight binary. +// 3 -- Ensight ASCII. int visualfileType = 1; // samplefileMode: The dump mode of sample file. @@ -697,21 +719,21 @@ double upperPlotFieldBox[] = [1.0 1.0 1.0]; // -- vibration temperature(Tv, 33), electron temperature(Te, 34), vibrational energy(Ev, 35), electric energy(Ee, 36), // -- number density of electron(Ne, 37), dimensioanl density(rho, 38), dimensioanl pressure(p, 39), dimensioanl temperature(T, 40), // -- gradientUx(41), gradientUy(42), gradientVx(43), gradientVy(44), streamline_u(45), streamline_v(46), streamline_w(47), -// -- transition intermittency(intermittency, 51), -transition momentum thickness reynolds(MomentumThicknessReynolds, 52), -// -- overlap iblank(iblank, 81) - -// -- specific heat ratio(gama, 56) +// -- transition intermittency(intermittency, 51), transition momentum thickness reynolds(MomentumThicknessReynolds, 52), +// -- local CFL Number(localCFL, 57), minimal CFL Number(minCFL, 58), +// -- overlap iblank(iblank, 81), +// -- specific heat ratio(gama, 56), Knudsen number(kn, 60), Damkohler number(Da, 61), vibrational nonequilibrium number(Vi, 62). // Important Warning: Array size of visualVariables MUST be equal to nVisualVariables!!! // Variables order must from small to big. //-----------the optional parameters list for the wall boundary condition---------------- // nVisualWallVariables: The number of visual variables on wall. // visualWallVariables : dumped variable types, listed as following: -// -coefficient of pressure(cp, 0), -coefficient of friction(cf, 1), yplus(2), -non-dimensional heat flux(Q_NonDim, 3), -dimensional heat flux(Q_Dim, 4), -// -pressure on wall(pw, 5), -temperature on wall(Tw, 6), -density on wall(rhow, 7), -heat flux of translational-rotational temperature term(Qtr, 8), -// -heat flux of species diffusion term(Qs, 9), -heat flux of vibrational temperature term(Qv, 10), -heat flux of electron temperature term(Qe, 11), -// -species mass fractions(Ns, 12), -x component of wall velocity(Vx, 13), -y component of wall velocity(Vy, 14), -z component of wall velocity(Vz, 15) -// -slip translational-rotational temperature(Tts, 16), -slip vibrational temperature(Tvs, 17), -slip electron temperature(Tes, 18), -absolute wall velocity(Vs, 19) -// -Stanton number(St, 20), -coefficient of heat rate(Ch, 21), -temperature jump(deltaT, 22), -Grid Reynolds number on wall(Re_w, 23) +// -- coefficient of pressure(cp, 0), coefficient of friction(cf, 1), yplus(2), non-dimensional heat flux(Q_NonDim, 3), dimensional heat flux(Q_Dim, 4), +// -- pressure on wall(pw, 5), temperature on wall(Tw, 6), density on wall(rhow, 7), heat flux of translational-rotational temperature term(Qtr, 8), +// -- heat flux of species diffusion term(Qs, 9), heat flux of vibrational temperature term(Qv, 10), heat flux of electron temperature term(Qe, 11), +// -- species mass fractions(Ns, 12), x component of wall velocity(Vx, 13), y component of wall velocity(Vy, 14), z component of wall velocity(Vz, 15), +// -- slip translational-rotational temperature(Tts, 16), slip vibrational temperature(Tvs, 17), slip electron temperature(Tes, 18), absolute wall velocity(Vs, 19), +// -- Stanton number(St, 20), coefficient of heat rate(Ch, 21), temperature jump(deltaT, 22), Grid Reynolds number on wall(Re_w, 23), Knudsen number(Kn_wall, 24). int nVisualVariables = 8; int visualVariables[] = [0, 1, 2, 3, 4, 5, 6, 15]; @@ -739,16 +761,18 @@ int dumpStandardModel = 0; // 1 -- Real cell where the probe is located. // nProbeVariables: Number of variables want to be dumped for probes monitered. // probeVariables : Variable types dumped, listed as following: -// -- density(0), u(1), v(2), w(3), pressure(4), temperature(5), mach(6). +// -- density(0), u(1), v(2), w(3), pressure(4), temperature(5), mach(6), +// -- dimensioanl_density(7), dimensioanl_u(8), dimensioanl_v(9), +// -- dimensioanl_w(10), dimensioanl_pressure(11), dimensioanl_temperature(12). // Important Warning: Array size of probeVariables MUST be equal to nProbeVariables!!! // probeVariables order must from small to big. // probeVariablesInterpolationMethod: Interpolation method used to compute the probe variables. -// 0 -- Take the value of probe's cell as probe real value. -// 1 -- Interpolation from probe's and neighbouring cell to probe. -// 2 -- Interpolation from probe's cell nodes to probe. +// 0 -- Take the value of probe's cell as probe real value. +// 1 -- Interpolation from probe's and neighbouring cell to probe. +// 2 -- Interpolation from probe's cell nodes to probe. int ifSetDataMonitor = 0; -int dataMonitorType = 0; +int dataMonitorType = 0; string probesDefineFile = "bin/probes_XYZ.dat"; //int dataMonitorType = 1; @@ -761,28 +785,26 @@ string probesDefineFile = "bin/probes_XYZ.dat"; int searchCellsMethod = 0; -int nProbeVariables = 7; -int probeVariables[] = [0, 1, 2, 3, 4, 5, 6]; -int probeVariablesInterpolationMethod = 0; -//----------------------------------------------------------------------- -# Turbulence Parameter # -//----------------------------------------------------------------------- +int nProbeVariables = 14; +int probeVariables[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]; +int probeVariablesInterpolationMethod = 0; + +#************************************************************************ +# Turbulence Parameter * +#************************************************************************ // turbInterval: Iteration number of turbulence. // kindOfTurbSource: Kinds of turbulent source. // 0 -- Original. // mod_turb_res: If modify the residuals for the cells next to the wall or not, default is 0. -// transitionType: transition model type +// transitionType: transition model type // 0 -- none. // 2 -- gama-re-theta. -// turbIntensity: (valid while greater than 0.0 ) turbulent intensity of free stream(*100) in transition -// freeturbIntensitySRModify: to use SR modify in free stream turbulent intensity decay or not - - +// turbIntensity: (valid while greater than 0.0 ) turbulent intensity of free stream(*100) in transition. +// freeturbIntensitySRModify: to use SR modify in free stream turbulent intensity decay or not. int turbInterval = 1; int turbOrderStruct = 2; int kindOfTurbSource = 0; int mod_turb_res = 0; -double turb_relax = 1.0; double freeStreamViscosity = 1.0e-3; double muoo = 3.0; double kwoo = 5.0; @@ -790,29 +812,28 @@ int transitionType = 0; double turbIntensity = -1.0; int freeturbIntensitySRModify = 0; double freeDecayXLocation = 0.0; -int compressibleCorrection = 0; -int prandtlNumberCorrection = 0; +int compressibleCorrection = 0; int transitionMaFix = 1; -# maximum eddy viscosity (myt/my) max. +// maximum eddy viscosity (myt/my) max. double eddyViscosityLimit = 1.0e10; int monitor_vistmax = 0; -//----------------------------------------------------------------------- -# LES Parameter # -//----------------------------------------------------------------------- +#************************************************************************ +# LES Parameter * +#************************************************************************ // iLES: Create LESSolver or not. -// = 1 - Create LESSolver; -// != 1 - not. +// = 1 -- Create LESSolver; +// != 1 -- not. // amplitudeofDisturb: Amplitude of adding disturb. // disturbstep: Unsteady time step or steady iteration of adding random disturb. // iterdisturb: Add random disturb in every sub-iter or only first sub-iter. -// = 0 - in only first sub-iter; -// != 0 - in every sub-iter. +// = 0 -- in only first sub-iter; +// != 0 -- in every sub-iter. // ipraddisturb: Add density and pressure disturb or not. // ibodyforce: Add body force in source flux of NS equations or not. -// = 0 - not; -// != 0 - Add body force. +// = 0 -- not; +// != 0 -- Add body force. // bodyforce: Body force in source flux of NS equations or not. // utau: friction velocity, using in DNSDisturb. // sgsmodel: subgrid scale model. @@ -820,23 +841,22 @@ int monitor_vistmax = 0; // = "dsmCom"; // = "wale"; // = "sigma". -// deltaFunctionType: = 1 - MAX(deltai, deltaj, deltak); -// = 2 - pow(deltai * deltaj *deltak, 1/3); -// = 3 - Devloped by Scotti. -// wallDampingFunctionType: = 0 - no wall function; -// = 1 - van Driest; -// = 2 - developed by Dr. Deng Xiaobing; -// = 3 - developed by Piomelli. +// deltaFunctionType: = 1 -- MAX(deltai, deltaj, deltak); +// = 2 -- pow(deltai * deltaj *deltak, 1/3); +// = 3 -- Devloped by Scotti. +// wallDampingFunctionType: = 0 -- no wall function; +// = 1 -- van Driest; +// = 2 -- developed by Dr. Deng Xiaobing; +// = 3 -- developed by Piomelli. // turbViscousCutType: turbulent viscosity cut type. -// = 0 - mu_total = mut + mul; -// = 1 - mu_total = max(mut-mul,0)+ mul; -// = 2 - mu_total = max(mut ,0)+ mul. +// = 0 -- mu_total = mut + mul; +// = 1 -- mu_total = max(mut-mul, 0) + mul; +// = 2 -- mu_total = max(mut , 0) + mul. // smagConstant: constant of smagorinsky model. // waleConstant: constant of wale model. -// filterDirection[3]: filter variables in i, j, k direction or not. +// filterDirection [3]: filter variables in i, j, k direction or not. // averageDirection[3]: average variables in i, j, k direction or not. // isotropicConstant: constant of isotropic part of SGS stress. - int iLES = 0; string sgsmodel = "smagorinsky"; int deltaFunctionType = 2; @@ -852,19 +872,16 @@ double testFilterScale = 2.0; int averageWidth = 1; int monitorNegativeConstant = 0; -//----------------------------------------------------------------------- -# Other Parameters for Hypersonic Non-equilibrium Gas # -//----------------------------------------------------------------------- +#************************************************************************ +# Other Parameters for Hypersonic Non-equilibrium Gas * +#************************************************************************ // dg_high_order: // 0 -- generic order accuracy. // 1 -- high order accuracy. // iapplication: // 0 -- gas model is fixed in the codes. // 1 -- gas model is imported from library files. -// isAdaptiveSolver: isAdaptiveSolver=0 indicates the generic Navier-Stokes solver, -// isAdaptiveSolver>0 indicates the HyFlow self-adaptive solver. -// 1 -- using HyFlow self-adaptive solver where the switch is controlled by the total iteration steps. -// 2 -- using HyFlow self-adaptive solver where the switch is controlled by variation of the key residual. +// isAdaptiveSolver: isAdaptiveSolver = 0 indicates the generic Navier-Stokes solver, // nm: Equation number of the physics, but is out of commision now. // 4 -- for 2D. // 5 -- for 3D. @@ -875,7 +892,7 @@ int monitorNegativeConstant = 0; // 2 -- Argon. // 3 -- Nitrogen. // nEnergyRecycle: The type of EnergyModel Recycle. -// 0 -- not used . +// 0 -- not used. // 1 -- used. // nDensityModify: The type of densitymodify. // 0 -- not used. @@ -883,26 +900,25 @@ int monitorNegativeConstant = 0; // nchem: // 0 -- without chemical reaction flow. // 1 -- the chemical reaction flow is considered. -// nEquilibriumGas: the variable is valid when the condition of nchem=0 is satisfied. +// nEquilibriumGas: the variable is valid when the condition of nchem = 0 is satisfied. // 0 -- perfect gas. // 5, 7, 11 -- equilibrium gas, meanwhile, its value denotes the number of gas component. -// nPCWCycleStep: the maximum step number of iteration in the module of computing species mass fractions with the partial catalytic wall(PCW) condition. -// the value equals to or is greater than 1, and 3 is for default value. -// nRETCycleStep: the maximum step number of iteration in the module of computing radiation equilibrium temperature on wall. -// the value equals to or is greater than 1, and 3 is for default value. -// nSLIPCycleStep:the maximum step number of iteration in the module of computing slip temperature, slip velocity and slip species mass fraction. -// the value equals to or is greater than 1, and 3 is for default value. -// nSlipBCModel : The computational model of slip boundary conditions. - -// 0 -- no slip. -// 1 -- the conventional Maxwell slip conditions. -// 2 -- the Gokcen slip conditions. -// 3 -- the Knudsen-layer correction of the standard slip conditions proposed by Lockerby, et al. -// 4 -- the Kogan simplified slip conditions. -// nMeanFreePathType : the method to the mean free-path for the slip conditions. For the mixture, 0 is suggested. -// 0 -- the equivalent mean free-path is calculated by the simple hard sphere model(HS). -// 1 -- calculated by the definition that includes the variables of the number density and the molecule diameter. -// 2 -- the equivalent mean free-path is calculated by the variable hard sphere model(VHS). +// nPCWCycleStep: The maximum step number of iteration in the module of computing species mass fractions with the partial catalytic wall(PCW) condition. +// The value equals to or is greater than 1, and 3 is for default value. +// nRETCycleStep: The maximum step number of iteration in the module of computing radiation equilibrium temperature on wall. +// The value equals to or is greater than 1, and 3 is for default value. +// nSLIPCycleStep:The maximum step number of iteration in the module of computing slip temperature, slip velocity and slip species mass fraction. +// The value equals to or is greater than 1, and 3 is for default value. +// nSlipBCModel: The computational model of slip boundary conditions. +// 0 -- no slip. +// 1 -- the conventional Maxwell slip conditions. +// 2 -- the Gokcen slip conditions. +// 3 -- the Knudsen-layer correction of the standard slip conditions proposed by Lockerby, et al. +// 4 -- the Kogan simplified slip conditions. +// nMeanFreePathType: the method to the mean free-path for the slip conditions. For the mixture, 0 is suggested. +// 0 -- the equivalent mean free-path is calculated by the simple hard sphere model(HS). +// 1 -- calculated by the definition that includes the variables of the number density and the molecule diameter. +// 2 -- the equivalent mean free-path is calculated by the variable hard sphere model(VHS). // nchemsrc: // 0 -- the source terms are not computed. // 1 -- the source terms are computed. @@ -913,148 +929,151 @@ int monitorNegativeConstant = 0; // 1 -- One-temperature model. // 2 -- Two-temperature model. // 3 -- Three-temperature model. +// isUseNoneqCond: +// 0 -- compute the source terms without any conditions. +// 1 -- compute the source terms using the non-equilibrium condition. +// frozenCondition: the threshold value of frozen chemical flow condition, 0.1 is the default value. // nIdealState: whether take all gas species as ideal gas for gas-mixture process. // 0 -- No. -// 1 -- Yes. -// nTEnergyModel: the method to computing temperature energy model. +// 1 -- Yes. // nTEnergyModel: the method to computing temperature energy model. // 0 -- the energy term is computed using the conventional method. // 1 -- the energy term is computed using the polynomial fitting method. // 2 -- the energy term is computed using the piecewise polynomial fitting method. // parkVDPower: the power of translational-rotational temperature in the Park V-D(vibration-dissociation) coupling model. // The value is in range of [0.0, 1.0], DPLR suggests 0.5, LAURA suggests 0.7, while 0.6 is given as default value. // catalyticCoef: -// 0.0 -- full non-catalytic wall boundary condition. -// 1.0 -- full catalytic wall boundary condition. -// in range of (0.0, 1.0) -- partial catalytic condition, the value indicates the catalytic coefficient. -// nIsSuperCatalytic : the super catalytic condition for the fully catalytic wall, and assigned with the value of 1. -// 0 -- equilibrium condition for the fully catalytic wall where the mass fractions are assigned with the values of the free stream. -// 1 -- super catalytic condition for the fully catalytic wall where all the atomic components combine into molecular components. -// nTemperatureJump : the method to calculate the temperature jump. -// 0 -- calculated by the variables of heat conductivity and constant volume specific heat for each energy mode. -// 1 -- the general method where the iteration is calculated with the translation-rotation temperature. -// nSurfGradMethod : the method to compute the surface heating ratio. -// 0 -- the gradient of variable is computed with the first-order difference method. -// 1 -- the gradient of variable is computed with the Green-Guass integral method. -// nRapidFlowfield : initialize the flowfield using the rapid engineering method when it is greater than zero. -// nSurfHeatMonitor : To exam the surface heating change or not. 0 is no, 1 is yes. -// nInitPressureStep : the steps to initialize the boundary variables when the rapid method is used. 100 is the default value. -// nDumpCFLNumber : 1 indicates dumping the CFL number to file, 0 denotes no dumping. +// 0.0 -- full non-catalytic wall boundary condition. +// 1.0 -- full catalytic wall boundary condition. +// in range of (0.0, 1.0) -- partial catalytic condition, the value indicates the catalytic coefficient. +// nIsSuperCatalytic: the super catalytic condition for the fully catalytic wall, and assigned with the value of 1. +// 0 -- equilibrium condition for the fully catalytic wall where the mass fractions are assigned with the values of the free stream. +// 1 -- super catalytic condition for the fully catalytic wall where all the atomic components combine into molecular components. +// nTemperatureJump: the method to calculate the temperature jump. +// 0 -- calculated by the variables of heat conductivity and constant volume specific heat for each energy mode. +// 1 -- the general method where the iteration is calculated with the translation-rotation temperature. +// nSurfGradMethod: the method to compute the surface heating ratio. +// 0 -- the gradient of variable is computed with the first-order difference method. +// 1 -- the gradient of variable is computed with the Green-Guass integral method. +// nRapidFlowfield: initialize the flowfield using the rapid engineering method when it is greater than zero. +// nSurfHeatMonitor: To exam the surface heating change or not. 0 is no, 1 is yes. +// nInitPressureStep: the steps to initialize the boundary variables when the rapid method is used. 100 is the default value. +// nDumpCFLNumber: 1 indicates dumping the CFL number to file, 0 denotes no dumping. // sigmaVelocity: the coordination coefficient of tangential momentum for computation of slip velocity. The value is in range of (0.0, 2.0]. // sigmaTemperature: the heat coordination coefficient for computation of slip temperature. The value is in range of (0.0, 2.0]. // sigmaMassFraction: the species coordination coefficient for computation of slip mass fractions. The value is in range of (0.0, 2.0]. // velocitySlipCorrectConstant: the correction constant to the velocity slip condition. For the diffuse reflection, 1.0 is used. -// 1.0 -- proposed by Maxwell. -// sqrt(2/PI)~0.8 -- used for "micro-slip", namely the actual velocity slip at the wall. -// 1.146 -- proposed for an additional "fictitious" velocity slip. - -// chemicalRelaxCorf: The value is in range of [0.001, 1.0]. -// spectrumRadiusCoef: The value is in range of [0.0, 2.0]. -// staticPressureRelaxCorf: The value is in range of [0.1, 1.0]. -// nIsChemicalFreeze : the flag to freeze the chemical reactions. -// 0 -- not freeze, the chemical reaction sources will be calculated. -// 1 -- freezes the chemical reactions, the chemical reaction sources will not be calculated.// veTemperatureMin: The minimum of Tv and Te - -//maxViscous: the maximum of Viscous. -//trTemperatureMin: the minimum value of trTemperature. -//veTemperatureMin: the minimum value of veTemperature. -//densityMin: the minimum value of density. -//tAdjustmentFactor: magnification of temperature, this value is in range of (1.0, 10.0]. -// nDebug: cout the Wrong place and abort -// 0 -- not used. -// 1 -- used. +// 1.0 -- proposed by Maxwell. +// sqrt(2/PI)~0.8 -- used for "micro-slip", namely the actual velocity slip at the wall. +// 1.146 -- proposed for an additional "fictitious" velocity slip. +// chemicalRelaxCorf: The value is in range of [0.001, 1.0]. +// spectrumRadiusCoef: The value is in range of [0.0, 2.0]. +// staticPressureRelaxCorf: The value is in range of [0.1, 1.0]. +// nIsChemicalFreeze: the flag to freeze the chemical reactions. +// 0 -- not freeze, the chemical reaction sources will be calculated. +// 1 -- freezes the chemical reactions, the chemical reaction sources will not be calculated. +// veTemperatureMin: The minimum of Tv and Te. +// maxViscous: the maximum of Viscous. +// trTemperatureMin: the minimum value of trTemperature. +// veTemperatureMin: the minimum value of veTemperature. +// densityMin: the minimum value of density. +// tAdjustmentFactor: magnification of temperature, this value is in range of (1.0, 10.0]. +// nDebug: cout the Wrong place and abort +// 0 -- not used. +// 1 -- used. // nSpeciesLimit: limitter of gas species -// 0 -- not used. -// 1 -- used. -// nTurblenceForChemical: the coupled mode of Turblence and Chemical reaction -// 0 -- method 0. -// 1 -- method 1. -// nViscosityFluxSublevelModified: Modified for ViscosityFlux on Sublevel grid -// 0 -- not used. -// 1 -- used. -// nViscosityPeModified: Pe Modified for ViscosityCoef -// 0 -- not used. -// 1 -- used. -// nChemcalSourceModified: Modified on ChemcalSource -// 0 -- not used. -// 1 -- used. -// nChemcalSourceEsMethod: Modified on ChemcalSource -// 0 -- approximation algorithm 1 (Ori.) -// 1 -- approximation algorithm 2 (New) - +// 0 -- not used. +// 1 -- used. +// nTurblenceForChemical: the coupled mode of Turblence and Chemical reaction. +// 0 -- method 0. +// 1 -- method 1. +// nViscosityFluxSublevelModified: Modified for ViscosityFlux on Sublevel grid. +// 0 -- not used. +// 1 -- used. +// nViscosityPeModified: Pe Modified for ViscosityCoef. +// 0 -- not used. +// 1 -- used. +// nChemcalSourceModified: Modified on ChemcalSource. +// 0 -- not used. +// 1 -- used. +// nChemcalSourceEsMethod: Modified on ChemcalSource. +// 0 -- approximation algorithm 1 (Ori). +// 1 -- approximation algorithm 2 (New). // nMaxStepTemperature: the iterative steps of temperature. - -// veTemperatureMinModified: Modified on the minimum of Tve for Cvvs -// 0 -- not used -// 1 -- used - -// nDiagonalModified: Modified on Diagonal -// 0 -- not used -// 1 -- Ori. -// 2 -- new - -//nGradPrimtiveMethod: -// 0 -- Ori. -// 1 -- new +// veTemperatureMinModified: Modified on the minimum of Tve for Cvvs. +// 0 -- not used. +// 1 -- used. +// nDiagonalModified: Modified on Diagonal. +// 0 -- not used. +// 1 -- new. +// nDiagonalModifiedTurb: Modified on Diagonal for turbulence. +// 0 -- not used. +// 1 -- new. +// nGradPrimtiveMethod: +// 0 -- Ori. +// 1 -- new. // nAblation: -// 0 -- The wall ablation is not computed. -// 1 -- The wall ablation is computed. +// 0 -- The wall ablation is not computed. +// 1 -- The wall ablation is computed. // isInjection: -// 0 -- The injection velocity of ablation wall is not computed. -// 1 -- The injection velocity of ablation wall is computed. +// 0 -- The injection velocity of ablation wall is not computed. +// 1 -- The injection velocity of ablation wall is computed. // nViscosityModel: -// 0 -- Blottner fitting method(N89). -// 1 -- Gupta fitting method(N90). +// 0 -- Blottner fitting method(N89). +// 1 -- Gupta fitting method(N90). // nContinueModel: The new continue model can switch different computation model. -// 0 -- Not use the new continue model. -// 1 -- use the new continue model. +// 0 -- Not use the new continue model. +// 1 -- use the new continue model. // nSutherland: -// 0 -- stands for selecting the Blotter curve fits mode. -// 1 -- stands for Sutherland relation. +// 0 -- stands for selecting the Blotter curve fits mode. +// 1 -- stands for Sutherland relation. // gasfile: Indicates the gas model, 9 models are provided, namely "Gu5", "Gu7", "Gu11", "Pa5", "Pa7", "Pa11", "DK5", "DK7", "DK11". -// "Gu" -- indicates the Gupta Model, three-Type Models are embeded in the library, namely, the 5-species-6-reactions, the 7-species-9-reactions, the 11-species-20-reactions. -// "Pa" -- indicates the Park Model, three-Type Models are embeded in the library, namely, the 5-species-17-reactions, the 7-species-22-reactions, the 11-species-48-reactions. -// "DK" -- indicates the Dunn-Kang Model, three-Type Models are embeded in the library, namely, the 5-species-11-reactions, the 7-species-15-reactions, the 11-species-26-reactions. -// "Mars-Pa8" is for Park model of Mars gas, "Mars-Mc8" for McKenzie model of Mars gas. -// "Combustion-12" -- indicates the Combustion Chamber Gas Model which includes 12-species-20-reactions. -// "Gas-Mixture" -- indicates the process of mixing gas without reacting. -// for struct solver mixing two speciesSpeciesA, SpeciesB. -// for unstruct solver mixing multi-speciesO2 NO CO CO2 H2 N2 Air CH4. -// For self-definition model, the gasfile is used to indicate the file path of the new gas model. +// "Gu" -- indicates the Gupta Model, three-Type Models are embeded in the library, namely, the 5-species-6-reactions, the 7-species-9-reactions, the 11-species-20-reactions. +// "Pa" -- indicates the Park Model, three-Type Models are embeded in the library, namely, the 5-species-17-reactions, the 7-species-22-reactions, the 11-species-48-reactions. +// "DK" -- indicates the Dunn-Kang Model, three-Type Models are embeded in the library, namely, the 5-species-11-reactions, the 7-species-15-reactions, the 11-species-26-reactions. +// "Mars-Pa8" is for Park model of Mars gas, "Mars-Mc8" for McKenzie model of Mars gas. +// "Combustion-12" -- indicates the Combustion Chamber Gas Model which includes 12-species-20-reactions. +// "Gas-Mixture" -- indicates the process of mixing gas without reacting. +// for struct solver mixing two species��SpeciesA, SpeciesB��. +// for unstruct solver mixing multi-species��O2 NO CO CO2 H2 N2 Air CH4��. +// For self-definition model, the gasfile is used to indicate the file path of the new gas model. // speciesName: Used to list the names of each species, while each species name is separated by the symbol of comma. // initMassFraction: Used to list the initial mass fractions of species in accordance with the sequence of names in the parameter speciesName. // ifStartFromPerfectGasResults: The chemical reaction simulation is start from perfect gas flowfield or not, 0 is for no and else is for yes. -// nIterFirstStep : the maximum number of iteration in the first step for the self-adaptive calculation. -// nIterSecondStep : the maximum number of iteration in the second step for the self-adaptive calculation. -// nIterThirdStep : the maximum number of iteration in the third step for the self-adaptive calculation. -// nEnergyAssembly : the vibration energy is computed with combined method which includes the fitting method and the molecular kinetic theory. -// 0 -- no, -// 1 -- yes. +// nIterFirstStep : the maximum number of iteration in the first step for the self-adaptive calculation. +// nIterSecondStep: the maximum number of iteration in the second step for the self-adaptive calculation. +// nIterThirdStep : the maximum number of iteration in the third step for the self-adaptive calculation. +// nEnergyAssembly: the vibration energy is computed with combined method which includes the fitting method and the molecular kinetic theory. +// 0 -- no, +// 1 -- yes. // nControlVariable: the variable to computing the residual error that determines the convergence is meet or not in the one-temperature model. -// 0 -- the density. -// 1 -- the translation temperature. -// 2 -- the vibration temperature. -// 3 -- the electron temperature. -// 4 -- the pressure. -// 5 -- the mass fraction of oxygen. -// 6 -- the mass fraction of nitrogen. +// 0 -- the density. +// 1 -- the translation temperature. +// 2 -- the vibration temperature. +// 3 -- the electron temperature. +// 4 -- the pressure. +// 5 -- the mass fraction of oxygen. +// 6 -- the mass fraction of nitrogen. // firstStepError : the residual error of the first step iteration for the self-adaptive calculation. // secondStepError : the residual error of the second step iteration for the self-adaptive calculation. // thirdStepError : the residual error of the third step iteration for the self-adaptive calculation. -// useHyflowSetting : Setting for HyFLOW GUI. -// 0 -- PHengLEI -// 1 -- HyFLOW -// nProtectData : Use the continuation file data protection mechanism. -// 0 -- no -// 1 -- yes - +// nProtectData: Use the continuation file data protection mechanism. +// 0 -- no. +// 1 -- yes. +// nTvChange: Judge whether the Tv equals Ttr. +// 0 -- yes. +// 1 -- no. +// isMoleFractionType: 1 indicates the mass fractions, or else the mole fractions. +// nFraction: the initial fractions type of species. +// 0 -- mass fraction. +// 1 -- mole fraction. int dg_high_order = 0; int iapplication = 0; int isAdaptiveSolver = 0; -int nm = 5; +int nm = 5; int nEquilibriumGas = 0; -int nPCWCycleStep = 3; -int nRETCycleStep = 3; -int nSLIPCycleStep= 3; +int nPCWCycleStep = 3; +int nRETCycleStep = 3; +int nSLIPCycleStep = 3; int nIterFirstStep = 1000; int nIterSecondStep= 2000; int nIterThirdStep = 2000; @@ -1065,17 +1084,17 @@ double secondStepError = 0.001; double thirdStepError = 0.001; double predictCFLError = 0.1; -double refGama = 1.4; -double prl = 0.72; -double prt = 0.90; -double sc_l = 0.5; -double sc_t = 0.5; +double refGama = 1.4; +double prl = 0.72; +double prt = 0.90; +double sc_l = 0.5; +double sc_t = 0.5; -int nGasModel = 0; -int nchem = 0; -int nchemsrc = 1; -int nchemrad = 1; -int ntmodel = 1; +int nGasModel = 0; +int nchem = 0; +int nchemsrc = 1; +int nchemrad = 1; +int ntmodel = 1; int nIdealState = 0; int nEnergyRecycle = 1; @@ -1099,12 +1118,12 @@ double sigmaTemperature = 1.0; double sigmaMassFraction = 1.0; double velocitySlipCorrectConstant = 1.0; -double chemicalRelaxCorf = 1.0; +double chemicalRelaxCorf = 1.0; double chemicalSpectrumRadiusCoef = 1.0; double viscousSpectrumRadiusCoef = 1.5; double inviscidSpectrumRadiusCoef = 1.5; -double spectrumRadiusCoef = 0.5; -double staticPressureRelaxCorf = 0.2; +double spectrumRadiusCoef = 0.5; +double staticPressureRelaxCorf = 0.2; double maxViscous = 10000.0; double trTemperatureMin = 10.0; @@ -1114,31 +1133,35 @@ double densityMin = 1.0e-8; double densityMinFactor = 0.1; double tAdjustmentFactor = 10.0; double iniSpeedCoef = 1.0; +int iniSpeedMode = 0; -int nDebug = 0; -int nSpeciesLimit = 1; -int nTurblenceForChemical = 0; -int nViscosityFluxSublevelModified = 1; -int nViscosityPeModified = 0; -int nChemcalSourceModified = 2; -int nChemcalSourceEsMethod = 1; -int nMaxStepTemperature = 5; -int veTemperatureMinModified = 1; -int nDiagonalModified = 0; -int nGradPrimtiveMethod = 1; -int nInviscidFluxModify = 1; -int nQlLimitMethod = 2; -int nSpeciesForWallMethod = 1; -int nDensityForWallMethod = 0; +int nDebug = 0; +int nSpeciesLimit = 1; +int nTurblenceForChemical = 0; +int nViscosityFluxSublevelModified = 1; +int nViscosityPeModified = 0; +int nChemcalSourceModified = 2; +int nChemcalSourceEsMethod = 1; +int nMaxStepTemperature = 5; +int veTemperatureMinModified = 1; +int nDiagonalModified = 0; +int nDiagonalModifiedTurb = 0; +int nGradPrimtiveMethod = 1; +int nInviscidFluxModify = 1; +int nQlLimitMethod = 2; +int nSpeciesForWallMethod = 1; +int nDensityForWallMethod = 0; +int wallMultiTemperature = 0; -int nProtectData = 0; -int useHyflowSetting = 0; -int nAblation = 0; -int isInjection = 0; -int nViscosityModel = 0; -int nMarsModel = 0; -string gasfile = "DK5"; -//string gasfile = "./chemical/Dunn-Kang_air5s11r.dat"; +int nProtectData = 0; +int nAblation = 0; +int isInjection = 0; +int nViscosityModel = 0; +int nMarsModel = 0; +int nTvChange = 0; +int isMoleFractionType = 0; +string gasfile = "DK5"; +//string gasfile = "./chemical/Dunn-Kang_air5s11r.dat"; string speciesName = "O, O2, NO, N, N2"; string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.767"; @@ -1152,16 +1175,16 @@ string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.767"; //string speciesName = "O, O2, NO, N, N2, C, CO, CO2"; //string initMassFraction = "0.0015, 0.0429, 0.0, 0.0, 0.0, 0.0, 0.0777, 0.8779"; -//string gasfile = "Pa"; +//string gasfile = "Pa"; //string speciesName = "O, O2, NO, N, NO+, C, C2, CO, CO2, CN, N2, e-"; //string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.767, 0.0"; -//string gasfile = "Combustion-12"; +//string gasfile = "Combustion-12"; //string speciesName = "O, O2, NO, N, C, CO, CO2, H, H2, OH, H2O, N2"; //string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.767"; //string gasfile = "Gas-Mixture"; -//string speciesName ="SpeciesA, SpeciesB"; +//string speciesName = "SpeciesA, SpeciesB"; //string initMassFraction = "1.0, 0.0"; int nSutherland = 0; double gamaSpeciesA = 1.4; @@ -1173,9 +1196,17 @@ double molecularWeightSpeciesB = 30.0; //string speciesName = "O2, N2"; //string initMassFraction = "1.0, 0.0"; +int nFraction = 0; int nContinueModel = 0; int nChemicalFlowStep = 0; int ifStartFromPerfectGasResults = 0; +int isUseNoneqCond = 0; +double frozenCondition = 0.01; + +int nLeakageMonitor = 0; +double totalLeakageVolume = 1000.0; +double monitorThresholdValue = 0.05; +double sprayFactor = 0.0; ######################################################################### // Multi-Grid parameters. @@ -1196,7 +1227,6 @@ int ifStartFromPerfectGasResults = 0; // 1 -- zero order. // 2 -- first-order. (default) // mgCorrectionLimit: Multi-grid correction limit. - int nMGLevel = 1; int MGCoarsestIteration = 1; int MGPreIteration = 1; @@ -1218,20 +1248,20 @@ int ismooth_turb = 0; int SAProductType = 2; // ----------------- Overset Grid parameter ----------------------------- -int codeOfDigHoles = 1; -int codeOfTurbulentModel = 0; -string masterFileName = "./grid/searchFile.inp"; -string holeBasicFileName = "./grid/holeBasicFile.inp"; -string holeFullFileName = "./grid/holeFullFile.dat"; -string linkFileName = "./grid/topology.dat"; -string zoneInverseFileName = "./grid/zoneInverseMapping.inp"; +int codeOfDigHoles = 1; +int codeOfTurbulentModel = 0; +string masterFileName = "./grid/searchFile.inp"; +string holeBasicFileName = "./grid/holeBasicFile.inp"; +string holeFullFileName = "./grid/holeFullFile.dat"; +string linkFileName = "./grid/topology.dat"; +string zoneInverseFileName = "./grid/zoneInverseMapping.inp"; -######################################################################### -# High Order Struct Solver # -######################################################################### +#************************************************************************ +# High Order Struct Solver * +#************************************************************************ // isFVMOrFDM: -// 0 -- NSSolverStruct using Finite Volume Method. -// 1 -- NSSolverStruct using Finite Differ Method. +// 0 -- NSSolverStruct using Finite Volume Method. +// 1 -- NSSolverStruct using Finite Differ Method. // SolverStructOrder: Spatial discretisation order of NS equations with struct grid. // <= 2 -- finite volume method. // >= 3 -- finite difference order. (to be completed) @@ -1273,30 +1303,48 @@ int allReduceStep = 1; // codeOfOversetGrid: Overlapping(overset) grid or not. // 0 -- NON-overlapping grid. // 1 -- Overlapping grid. -// oversetInterpolationMethod: the method of overset interpolation while field simulation +// oversetInterpolationMethod: the method of overset interpolation while field simulation. // 0 -- set the acceptor cell value by donor cell value. // 1 -- set the acceptor cell value by distance weight of donor cell value. - -int codeOfOversetGrid = 0; -int oversetInterpolationMethod = 0; -int readOversetFileOrNot = 0; -int symetryOrNot = 0; -int readInAuxiliaryInnerGrid = 0; -int readInAuxiliaryOuterGrid = 0; -int readInSklFileOrNot = 0; -string auxiliaryInnerGrid0 = "./grid/aux-upper.fts"; -string auxiliaryInnerGrid1 = "./grid/aux-lower.fts"; -string auxiliaryInnerGrid2 = ""; -string oversetGridFileName = "./grid/iblank.ovs"; -double walldistMainZone = 1.0 -double toleranceForOversetSearch = 1.0e-3; -double toleranceForOversetBox = 1.0e-3; -int twoOrderInterpolationOrNot = 0; -int keyEnlargeOfActiveNodes = 0; -int outTecplotOverset = 0; -int outPutOversetVisualization = 0; - -int numberOfMovingBodies = 2; +// readOversetFileOrNo: Whether to read overset-file(.ovs) that has been generated. +// 0 -- no. +// 1 -- yes. +// symetryOrNot: If there exist symetryplanes(XY plane, the coordinate of Z direction is 0) in +// the current overset grid(only for three dimension). +// 0 -- no. +// 1 -- yes. +// readInAuxiliaryInnerGrid: Whether to read auxiliary inner grid. +// 0 -- no. +// 1 -- yes. +// walldistMainZone: The initial value of background grid which does not exist wall boundary condition. +// toleranceForOversetSearch: The tolerance of overset searching zone to judge whether the obtained node is in the current computing cell. +// toleranceForOversetBox: The tolerance of building the minimum box of computing cells in the overlapping region. +// twoOrderInterpolationOrNot: The number of interpolated cell layers in the overlapping boundary. +// 0 -- one layer. +// 1 -- two layers. +// keyEnlargeOfActiveNodes: The number of enlarged overset-boundary layers in the buffer region. +// outTecplotOverset: Whether to dump out the flowfield data after the progress of overset configure. +// 0 -- no. +// 1 -- yes. +int codeOfOversetGrid = 0; +int oversetInterpolationMethod = 0; +int readOversetFileOrNot = 0; +int symetryOrNot = 0; +int readInAuxiliaryInnerGrid = 0; +int readInAuxiliaryOuterGrid = 0; +int readInSklFileOrNot = 0; +string auxiliaryInnerGrid0 = "./grid/aux-upper.fts"; +string auxiliaryInnerGrid1 = "./grid/aux-lower.fts"; +string auxiliaryInnerGrid2 = ""; +string oversetGridFileName = "./grid/iblank.ovs"; +double walldistMainZone = 1.0 +double toleranceForOversetSearch = 1.0e-3; +double toleranceForOversetBox = 1.0e-3; +int twoOrderInterpolationOrNot = 0; +int keyEnlargeOfActiveNodes = 0; +int outTecplotOverset = 0; +int outPutOversetVisualization = 0; +int numberOfMovingBodies = 2; // ----------------- ALE configuration ------------------------------ int codeOfAleModel = 0; @@ -1306,36 +1354,42 @@ double referenceLength = 1.0; double referenceVelocity = 1.0; double referenceDensity = 1.0; -int strategyForFaceNormalVelocity = 0; //0-By Sweeping volume; 1-By face center 1st; 2-By face center 2nd; -int strategyForGCLSource = 0; //0-present; 1-Ahn; +int strategyForFaceNormalVelocity = 0; // 0-By Sweeping volume; 1-By face center 1st; 2-By face center 2nd. +int strategyForGCLSource = 0; // 0-present; 1-Ahn. -//0:1st-Admas-Bashforth; 1:2nd-Admas-Bashforth; 2:1st-Implicit-Euler; 3:2nd-Implicit Euler; 4:2nd-Adams-Moulton; 5:3rd-Adams-Moulton +// 0: 1st-Admas-Bashforth; 1: 2nd-Admas-Bashforth; 2: 1st-Implicit-Euler; 3: 2nd-Implicit Euler; 4: 2nd-Adams-Moulton; 5: 3rd-Adams-Moulton. int methodForKineticEquation = 0; double relaxParameterOfKinetic = 1.0; -######################################################################### -# motive information # -######################################################################### +#************************************************************************ +# motive information * +#************************************************************************ int numberOfMovingBodies = 1; ############################## body0 ############################## -//mass of parts -double mass_0 = 1.0; -//mass matrix of parts Ixx Iyy Izz Ixy Ixz Iyz -double massMatrix_0[] = 1e-7, 1e-6, 1e-6, 0.0, 0.0, 0.0; -//initial six DOF position information of parts. xc yc zc -double massCenter_0[] = 0.0 , 0.0, 0.0; -//initial six DOF position information of parts. angleX angleY angleZ -double attitudeAngle_0[] = 0.0 , 0.0, 0.0; -//initial six DOF move information of parts. vc vy vz -double massCenterVelocity_0[] = 0.0, 0.0, 0.0; -//initial six DOF move information of parts. omigX omigY omigZ -double angularVelocity_0[] = 0.0, 0.0, 0.0; -//the object that the parts belong to. -int fartherIndex_0 = -1; -//the assembly position of the parts. xc yc zc angleX angleY angleZ -double configPamameter_0[] = 0.0 ,0.0 ,0.0 ,0.0 ,0.0 ,0.0; -//the move pattern of the parts. +// mass of parts. +double mass_0 = 1.0; +// gravity of parts (along negative direction in Y-axis, eg. 9.8). +double gravity_0 = 0.0; +// mass matrix of parts Ixx Iyy Izz Ixy Ixz Iyz. +double massMatrix_0[] = 1e-7, 1e-6, 1e-6, 0.0, 0.0, 0.0; +// initial six DOF position information of parts. xc yc zc. +double massCenter_0[] = 0.0, 0.0, 0.0; +// if reset mass center while restart. +int resetMassCenter_0 = 0; +// position offset of parts. dx dy dz. +double massCenterDxyz_0[] = 0.0, 0.0, 0.0; +// initial six DOF position information of parts. angleX angleY angleZ. +double attitudeAngle_0[] = 0.0, 0.0, 0.0; +// initial six DOF move information of parts. vc vy vz. +double massCenterVelocity_0[] = 0.0, 0.0, 0.0; +// initial six DOF move information of parts. omigX omigY omigZ. +double angularVelocity_0[] = 0.0, 0.0, 0.0; +// the object that the parts belong to. +int fartherIndex_0 = -1; +// the assembly position of the parts. xc yc zc angleX angleY angleZ. +double configPamameter_0[] = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0; +// the move pattern of the parts. // -1 given motion partten. // 0 still. // 1 six DOF motion. @@ -1346,51 +1400,68 @@ double configPamameter_0[] = 0.0 ,0.0 ,0.0 ,0.0 ,0.0 // 14 forced pitch motion. // 15 forced yaw motion. // 16 forced roll motion. -int RBDMethod_0 = 0; -double amplitude_0 = 0.0; -double reduceFrequency_0 = 0.0; -//direction of rotation +int RBDMethod_0 = 0; +double amplitude_0 = 0.0; +double reduceFrequency_0 = 0.0; +// direction of rotation. // 1 -- clockwise from the point of view along the positive x axis. // -1 -- anticlockwise from the point of view along the positive x axis. -int direction_0 = -1; -double rotateFrequency_0 = 0.0; -//string uDFSixDofFileName_0 = "./Bin/UDFSixDof.Parameter"; -//additional force (system axis) fX fY fZ -double addedForce_0[] = 0.0 ,0.0 ,0.0 ; -//additional moment of Force (system axis) mX mY mZ -double addedMoment_0[] = 0.0 ,0.0 ,0.0 ; -//the deformation method of the parts. -int morphing_0 = 0; - -// post indentify -int integralOrder = 4; +int direction_0 = -1; +double rotateFrequency_0 = 0.0; +//string uDFSixDofFileName_0 = "./Bin/UDFSixDof.Parameter"; +// dimensional physical time for additional force(s). +double addedForceTime_0[] = 0.0; +// additional force(inertia system) fX fY fZ. +double addedForce_0[] = 0.0, 0.0, 0.0; +// additional moment(inertia system) mX mY mZ. +double addedMoment_0[] = 0.0, 0.0, 0.0; +// the deformation method of the parts. +int morphing_0 = 0; +// post indentify. +int integralOrder = 4; // ---------------- ATP read -------------------------------------------- -//@int inflowParaType = 0; +//@int inflowParaType = 0; //@double refReNumber = 6.5e6; //@double refDimensionalTemperature = 288.15; //@double freestream_vibration_temperature = 300.00; -//@double refDimensionalPressure = 0; -//@double height = 0; -//@int nsubsonicInlet = 0; -//@int nsubsonicOutlet = 0; -//@string inLetFileName = "./bin/subsonicInlet.hypara"; -//@string outLetFileName = "./bin/subsonicOutlet.hypara"; +//@double refDimensionalPressure = 0; +//@double height = 0; +//@int nsubsonicInlet = 0; +//@int nsubsonicOutlet = 0; +//@string inLetFileName = "./bin/subsonicInlet.hypara"; +//@string outLetFileName = "./bin/subsonicOutlet.hypara"; //@double refDimensionalVelocity = 0; //@double refDimensionalDensity = 0; - -######################################################################### -# Old Parameter # -######################################################################### +//@string weatherDataFilePath = "./WRFData/"; +//@double longitude = 110.95 +//@double latitude = 19.61; +#************************************************************************ +# Old Parameter * +#************************************************************************ int isPlotVolumeField = 0; +#************************************************************************ +# partial flow field setting Parameter * +#************************************************************************ +//int nPartialParameter = 0; // 0/1/2 +//int nNumberOfPartialField = 0; // +//int nStartGridIndex[] = [0]; +//int nEndGridIndex[] = [0]; -######################################################################### -# Incompressible Parameter # -######################################################################### +//double partialCFL[] = [0.0]; +//double partialSpeedCoef[] = [0.0]; +//double partialSpeed[] = [0.0]; +//double partialAttackd[] = [0.0]; +//double partialSlide[] = [0.0]; +//double partialPressure[] = [0.0]; +//double partialTemperature[] = [0.0]; +//double partialMassFractions[] = [0.0]; +#************************************************************************ +# Incompressible Parameter * +#************************************************************************ int isSolveEnergyEquation = 0; int isSolveTurbEquation = 0; -int isSolveSpeciesEquation = 0; - +int isSolveSpeciesEquation = 0; \ No newline at end of file diff --git a/A09_ThreeD_M6_SST_Struct_MG2_4CPU/bin/grid_para.hypara b/A09_ThreeD_M6_SST_Struct_MG2_4CPU/bin/grid_para.hypara index 2e232da..dd164cb 100644 --- a/A09_ThreeD_M6_SST_Struct_MG2_4CPU/bin/grid_para.hypara +++ b/A09_ThreeD_M6_SST_Struct_MG2_4CPU/bin/grid_para.hypara @@ -4,9 +4,12 @@ // gridtype: Grid type for generation, conversion, reconstruction, merging. // 0 -- Unstructured grid. // 1 -- Structured grid. -// axisup: Type of Cartisien coordinates system, used in grid conversion. -// 1 -- Y upward. (default) -// 2 -- Z upward. +// nAxisRotateTimes: number of axis rotating times, zero (default) meaning without rotating. +// axisRotateOrder : axis rotating order. +// 1 -- X-axis. +// 2 -- Y-axis. +// 3 -- Z-axis. +// axisRotateAngles: axis rotating angles (degree), which are corresponding to the axis rotating order. // from_gtype: Type of grid data type in grid conversion process. // -1 -- MULTI_TYPE. // 1 -- PHengLEI, *.fts. @@ -18,7 +21,9 @@ // 7 -- Hybrid, include both of unstructured and structured grid, *.fts. // 8 -- GMSH, *.msh. int gridtype = 1; -int axisup = 2; +int nAxisRotateTimes = 1; +int axisRotateOrder[] = [1]; +double axisRotateAngles[]= [90.0]; int from_gtype = 2; ######################################################################### diff --git a/A10_ThreeD_CHNT_SST_Struct_16CPU/bin/cfd_para.hypara b/A10_ThreeD_CHNT_SST_Struct_16CPU/bin/cfd_para.hypara index c344658..f903a5a 100644 --- a/A10_ThreeD_CHNT_SST_Struct_16CPU/bin/cfd_para.hypara +++ b/A10_ThreeD_CHNT_SST_Struct_16CPU/bin/cfd_para.hypara @@ -8,23 +8,24 @@ // Platform for Hybrid Engineering Simulation of Flows + // China Aerodynamics Research and Development Center + // (C) Copyright, Since 2010 + +// PHengLEI 2212 + //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ########################################################################### # Default parameters for Grid conversion # ########################################################################### // gridtype: Grid type for generation, conversion, reconstruction, merging. -// 0 -- Unstructured grid. -// 1 -- Structured grid. -// 2 -- Hybrid grid, include both of unstructured and structured grid. -// gridobj: Task type of grid treatment. -// 0 -- Grid generation of typical case, such as cylinder, flat plate, etc. -// 1 -- Grid conversion, from other grid data to PHenglEI, such as Fluent, CGNS. -// 2 -- Grid refinement. -// 3 -- Grid merging, merge two blocks into one block. -// 4 -- Grid deformation, achieve unstructured grid deformation. -// 5 -- Grid repairing, repair the original grid in order to remove the negative volume cells. -// 6 -- Grid mirroring, mirror a symmetry grid to whole grid. -// 7 -- Grid type change, convert structured grid to unstructured grid. +// 0 -- Unstructured grid. +// 1 -- Structured grid. +// 2 -- Hybrid grid, include both of unstructured and structured grid. +// gridobj: Task type of grid treatment. +// 0 -- Grid generation of typical case, such as cylinder, flat plate, etc. +// 1 -- Grid conversion, from other grid data to PHenglEI, such as Fluent, CGNS. +// 2 -- Grid refinement. +// 3 -- Grid merging, merge two blocks into one block. +// 4 -- Grid deformation, achieve unstructured grid deformation. +// 5 -- Grid repairing, repair the original grid in order to remove the negative volume cells. +// 6 -- Grid mirroring, mirror a symmetry grid to whole grid. +// 7 -- Grid type change, convert structured grid to unstructured grid. // multiblock: Multi-block grid or not, only for structured grid conversion. // 0 -- Not. // 1 -- Yes. @@ -46,19 +47,24 @@ int gridobj = 1; int multiblock = 0; int iadapt = 0; int SymmetryFaceVector = 1; - int gridReorder = 0; int faceReorderMethod = 0; -// axisup: Type of Cartisien coordinates system, used in grid conversion. -// 1 -- Y upward. (default) -// 2 -- Z upward. -int axisup = 1; +// nAxisRotateTimes: number of axis rotating times, zero (default) meaning without rotating. +// axisRotateOrder : axis rotating order. +// 1 -- X-axis. +// 2 -- Y-axis. +// 3 -- Z-axis. +// axisRotateAngles: axis rotating angles (degree), which are corresponding to the axis rotating order. +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; // omit_no_bound_bc: What's boundary condition for the type of "no_boundary_condition". // 0 -- Interface. (default) // 1 -- Physical boundary condition, used in Hybrid solver. int omit_no_bound_bc = 0; +int omitRepeatInterface = 1; //----------------------------------------------------------------------- # Grid data type # @@ -87,10 +93,9 @@ int dumpOldGrid = 0; // from_gfile: path of original data file for unstructure grid convert from. // out_gfile: path of target file for grid convert to, *.fts type of file usually. int numberOfGridFile = 1; -string from_gfile = "./grid/rae2822_hybrid2d.cas"; -string from_gfile1= ""; - -string out_gfile = "./grid/flat_laminr_133_85_2d.fts"; +string from_gfile = "./grid/rae2822_hybrid2d.cas"; +string from_gfile1 = ""; +string out_gfile = "./grid/flat_laminr_133_85_2d.fts"; // ----------------- some advanced choices ------------------------------ // iunsteady: The Grid is for unsteady simulation or not. @@ -103,9 +108,9 @@ int fileformat = 0; // Parameters for hybrid solver. // mixgrid_uns: path of unstructure grid file for hybrid solver, *.fts type. -// mixgrid_str: path of structure grid file for hybrid solver, *.fts type. -string mixgrid_uns = "./grid/rae2822_uns2d_4.fts"; -string mixgrid_str = "./grid/flat_laminr_133_85_2d.fts"; +// mixgrid_str: path of structure grid file for hybrid solver, *.fts type. +string mixgrid_uns = "./grid/rae2822_uns2d_4.fts"; +string mixgrid_str = "./grid/flat_laminr_133_85_2d.fts"; // Some parameters for structured overlapping grid. int codeOfDigHoles = 1; @@ -119,31 +124,31 @@ string zoneInverseFileName = "./oversetGridView/zoneInverseMapping.inp"; // 0 -- Not. (default) // 1 -- Yes. // geometryUnit: Geometry unit. -// 1 -- meter. -// 2 -- millimeter. -// 3 -- inch. +// 1 -- meter. +// 2 -- millimeter. +// 3 -- inch. // exclusiveCase: Parallel projection exclusive case. -// 0 -- NON case. -// 1 -- JSM-C2-NPOFF case. -// 2 -- CHNT. +// 0 -- NON case. +// 1 -- JSM-C2-NPOFF case. +// 2 -- CHNT. // projectOrgPoint: If the original wall points need to be projected or not. -int anisoRefine = 0; -int geometryUnit = 1; -int isProject = 0; -int readDist = 0; -int isDeform = 0; +int anisoRefine = 0; +int geometryUnit = 1; +int isProject = 0; +int readDist = 0; +int isDeform = 0; int exclusiveCase = 0; int projectOrgPoint = 0; string geometryFileName = "./grid/jsm.igs"; // ----------------- Grid Deform Parameters ----------------------------- // deformationMethod: Grid Deform. -// 1 -- SPRING. -// 2 -- RBF. +// 1 -- SPRING. +// 2 -- RBF. // stationalGridFile: Original grid file. // visualFileName : The visualization file path of deform grid. // nDeformStep : The max deform step. -// flapAngle : The max flap angle. +// flapAngle : The max flap angle. // rotatePostionZ : Rotate postion. // rotatePostionY : Rotate postion. // gridSlice : If dump slice grid. @@ -163,10 +168,10 @@ int sliceAxis = 1; double slicePosition = 13; // ----------------- RBF Parameters ------------------------------------- -// numberOfReferenceCP : Number of reference Control Points. -// influencePara : The RBF influence radius parameter. +// numberOfReferenceCP: Number of reference Control Points. +// influencePara : The RBF influence radius parameter. int numberOfReferenceCP = 40; -double influencePara = 25.0; +double influencePara = 25.0; // ----------------- Periodic Parameters -------------------------------- // Notice: Rotational periodicity only support rotation along the X axis! @@ -178,9 +183,8 @@ double influencePara = 25.0; which only support one direction. // rotationAngle: The relative angle between two periodic face. which is recorded in degrees. - int periodicType = 0; -double translationLength[] = [0.0,0.0,0.0]; +double translationLength[] = [0.0, 0.0, 0.0]; double rotationAngle = 0.0; ######################################################################### @@ -192,7 +196,6 @@ double rotationAngle = 0.0; // 2 -- refine structured grid. // maxproc: The number of partition zones that want to be divided into. // numberOfMultifile: The number of partition grid files that want to be dumped out. - int pgridtype = 0; int maxproc = 4; int numberOfMultifile = 1; @@ -201,20 +204,20 @@ int numberOfMultifile = 1; // 0 -- Not. // 1 -- Yes. // blockIndexOfMark: the block index of mark, only for structured grid partition. -// cellIndexOfMark: the cell index of mark, only for structured grid partition. +// cellIndexOfMark : the cell index of mark, only for structured grid partition. int traceMark = 0; int blockIndexOfMark = 0; -int cellIndexOfMark[] = [185,30,1]; +int cellIndexOfMark[] = [185, 30, 1]; -// parallel Strategy: -//! -# 0 : each zone is assigned to the one that defined in grid partition procedure. -//! -# 1 : random assigned for each zone or by some else ways. -int parallelStrategy = 1; +// parallelStrategy: +// 0 -- each zone is assigned to the one that defined in grid partition procedure. +// 1 -- random assigned for each zone or by some else ways. +int parallelStrategy = 1; //----------------------------------------------------------------------- # File path # //----------------------------------------------------------------------- -// original_grid_file: Original grid file that want to be divided(PHengLEI type, *.fts). +// original_grid_file: Original grid file that want to be divided(PHengLEI type, *.fts). // partition_grid_file: Target partition grid file(PHengLEI type, *.fts). string original_grid_file = "./grid/sphere_mixed.fts"; string partition_grid_file = "./grid/sphere_mixed__4.fts"; @@ -232,11 +235,10 @@ string partition_grid_file = "./grid/sphere_mixed__4.fts"; // 1 -- perfect balance. // maxproc -- perfect imbalance. // 1.05 -- recommended. - int omit_no_bound_bc = 0; int npartmethod = 1; int parallelPartitionMethod = 2; -double parmetisBalance = 1.05; +double parmetisBalance = 1.05; // numberOfMultigrid: Number of multi-grid levels, ONLY used for structured grid. // 1 -- single level. @@ -248,29 +250,35 @@ int numberOfMultigrid = 1; # Default parameters for CFD simulation # ######################################################################### // maxSimuStep: The max simulation step, don't care simulation is restart or not. -// intervalStepFlow: The step intervals for flow variables file 'flow.dat' saved. -// intervalStepPlot: The step intervals for tecplot visual file 'tecflow.dat' saved. +// intervalStepFlow: The step intervals for flow variables file 'flow.dat' saved. +// intervalStepPlot: The step intervals for tecplot visual file 'tecflow.dat' saved. // intervalStepSample: The step intervals for monitored probes variables file 'sample.dat' saved. -// intervalStepForce: The step intervals for aerodynamics coefficients file 'aircoef.dat' saved. -// intervalStepRes: The step intervals for residual file 'res.dat' saved. -// ifLowSpeedPrecon: Precondition process to accelerate convergence for low speed flow. -// 0 -- no precondition process. (default, mach > 0.3) -// 1 -- carry out precondition process. (mach number <= 0.3) - -int maxSimuStep = 20000; - -int intervalStepFlow = 1000; -int intervalStepPlot = 1000; +// intervalStepForce: The step intervals for aerodynamics coefficients file 'aircoef.dat' saved. +// intervalStepRes: The step intervals for residual file 'res.dat' saved. +int maxSimuStep = 20000; +int intervalStepFlow = 1000; +int intervalStepPlot = 1000; int intervalStepSample = 1000; -int intervalStepForce = 100; -int intervalStepRes = 10; -int ifLowSpeedPrecon = 0; +int intervalStepForce = 100; +int intervalStepRes = 10; // compressible: // 0 -- incompressible flow. // 1 -- compressible flow. (default) int compressible = 1; +// ifLowSpeedPrecon: Precondition process to accelerate convergence for low speed flow. +// 0 -- no precondition process. (default, mach > 0.3) +// 1 -- carry out precondition process. (mach number <= 0.3) +// Kprec: The coefficient K for the cut-off velocity. +// 1.0~3.0 is suggested. (default, 3.0) +// preconFarfieldBCMethod: The precondition method for farfield boundary condition. +// 0 -- precondition far-field boundary based on riemann invariants. +// 1 -- Turkel's simplified far-field boundary condition. +int ifLowSpeedPrecon = 0; +double Kprec = 3.0; +int preconFarfieldBCMethod = 1; + //----------------------------------------------------------------------- # CFD Control Parameter # //----------------------------------------------------------------------- @@ -281,33 +289,36 @@ int compressible = 1; // 0 -- the nondimensional conditions. // 1 -- the flight conditions. // 2 -- the experiment conditions. -// 3 -- the subsonic boundary conditions. +// 3 -- the subsonic boundary conditions. (Useless!) // 4 -- the condition that the velocity, temperature and density are given. // 5 -- the condition that the velocity, temperature and pressure are given. +//flowInitMethod: Flow field initialization method. +// 0 -- The entire flow field is initialized according to Infinite velocity. +// 1 -- The velocity near the wall is initialized according to the boundary layer of the plate. // refReNumber: Reynolds number, which is based unit length, unit of 1/m. // refDimensionalTemperature: Dimensional reference temperature, or the total temperature only for the experiment condition. // freestream_vibration_temperature: Dimensional freestream vibration temperature. // refDimensionalPressure: Dimensional reference pressure, or the total pressure only for the experiment condition. // height: Fly height, unit of km. // wallTemperature: Temprature of the solid wall, minus value is for adiabatic boundary condition. -// gridScaleFactor: The customizable unit of the grid, default value is 1.0 for meter.Common dimensions like: -// 1 dm = 0.1 m. -// 1 cm = 0.01 m. -// 1 mm = 0.001m. -// 1 inch = 0.0254m. -// 1 foot = 12 inches = 0.3048m. -// 1 yard = 3 feet = 0.9144m. +// gridScaleFactor: The customizable unit of the grid, default value is 1.0 for meter. Common dimensions like: +// 1 dm = 0.1 m. +// 1 cm = 0.01 m. +// 1 mm = 0.001 m. +// 1 inch = 0.0254 m. +// 1 foot = 12 inches = 0.3048 m. +// 1 yard = 3 feet = 0.9144 m. // forceReferenceLength, forceReferenceLengthSpanWise, forceReferenceArea: Reference length, SpanWise length and area, independent of grid unit. // TorqueRefX, TorqueRefY, TorqueRefZ: Reference point, independent of grid unit. // radiationCoef: The radiation coefficient on wall, it is used to compute the radiation heat flux on wall when the boundary // condition is radiation equilibrium temperature, and 0.8 is the default value. -// refMolecularWeight : the reference molecular weight of gas used for perfect gas. The unit is g/mol. +// refMolecularWeight: the reference molecular weight of gas used for perfect gas. The unit is g/mol. // Generally, the gas is air. Sometimes, it is experiment gas, such as Nitrogen, Argon, and so on. - -int directionMethod = 0; +int directionMethod = 0; double refMachNumber = 0.73; double attackd = 2.79; double angleSlide = 0.00; +int flowInitMethod = 0; int inflowParaType = 0; double refReNumber = 6.5e6; @@ -321,29 +332,27 @@ double freestream_vibration_temperature = 300.00; //double refDimensionalTemperature = 6051.024; // The total temperature, T*(1+(refGama-1)*M*M/2). //double refDimensionalPressure = 4.299696E09; // The total pressure, p*(T0/T)^(refGama/(refGama-1)). -//int inflowParaType = 3; -//int nsubsonicInlet = 1; -//int nsubsonicOutlet = 1; -//string inLetFileName = "./bin/subsonicInlet.hypara"; -//string outLetFileName = "./bin/subsonicOutlet.hypara"; -//double refDimensionalTemperature = 288.144; -//double refDimensionalPressure = 1.01313E05; - -//The velocity, temperature and density are fixed. +// The velocity, temperature and density are fixed. //int inflowParaType = 4; //double refDimensionalVelocity = 1000.0; -//double refDimensionalDensity = 1.0e3; +//double refDimensionalDensity = 1.0e3; -//The velocity, temperature and pressure are fixed. +// The velocity, temperature and pressure are fixed. //int inflowParaType = 5; //double refDimensionalVelocity = 1000.0; //double refDimensionalPressure = 1.0e5; -//The MachNumber, temperature and pressure are fixed. +// The MachNumber, temperature and pressure are fixed. //int inflowParaType = 6; -//double refDimensionalTemperature = 293; +//double refDimensionalTemperature = 293.0; //double refDimensionalPressure = 8886.06; +// The velocity, temperature and pressure are read from file. +//int inflowParaType = 7; +//string weatherDataFilePath = "./WRFData/"; +//double longitude = 110.95 +//double latitude = 19.61; + double wallTemperature = -1.0; double radiationCoef = 0.8; @@ -357,41 +366,41 @@ double forceReferenceArea = 1.0; // unit of meter^2. double TorqueRefX = 0.0; // unit of meter. double TorqueRefY = 0.0; // unit of meter. double TorqueRefZ = 0.0; // unit of meter. +double knudsenLength = 1.0; // unit of meter. double refMolecularWeight = 28.9644; // unit of g/mol. //----------------------------------------------------------------------- # Spatial Discretisation # //----------------------------------------------------------------------- -#******************************************************************* -# Struct Solver * -#******************************************************************* +#************************************************************************ +# Struct Solver * +#************************************************************************ // inviscidSchemeName: Spatial discretisation scheme of struct grid. // Using this when solve structered grid or hybrid. -// -- "vanleer", "steger", "hlle", "lax_f". -// -- "roe", "modified_roe". +// -- "vanleer", "steger", "hlle", "lax_f", +// -- "roe", "modified_roe", // -- "ausm+", "ausm+w", "ausm+up", "ausmdv", "ausmpw", "ausmpw+". // isWennScheme: If using WENN Scheme of struct grid. -// 0 -- NO. (default) -// 1 -- Yes. +// 0 -- NO. (default) +// 1 -- Yes. // str_limiter_name: Limiter of struct grid. -// -- "vanalbada", "vanleer", "minmod", "smooth", "minvan", "3rdsmooth", "3rd_minmod_smooth". -// -- "nolim", no limiter. -// -- "vanalbada_clz", clz supersonic version. -// -- "weno3_js", "wenn3_prm211", "wenn3_zm", "wenn3_zes2", "wenn3_zes3" - +// -- "vanalbada", "vanleer", "minmod", "smooth", "minvan", "3rdsmooth", "3rd_minmod_smooth", +// -- "nolim", no limiter, +// -- "vanalbada_clz", clz supersonic version, +// -- "weno3_js", "wenn3_prm211", "wenn3_zm", "wenn3_zes2", "wenn3_zes3". string inviscidSchemeName = "roe"; int isWennScheme = 0; -string str_limiter_name = "vanalbada"; +string str_limiter_name = "vanalbada"; -#******************************************************************* -# UnStruct Solver or Common * -#******************************************************************* +#************************************************************************ +# UnStruct Solver or Common * +#************************************************************************ // viscousType: Viscous model. -// 0 -- Euler. -// 1 -- Lamilar. -// 2 -- Algebraic. -// 3 -- 1eq turbulent. -// 4 -- 2eq turbulent. +// 0 -- Euler. +// 1 -- Lamilar. +// 2 -- Algebraic. +// 3 -- 1eq turbulent. +// 4 -- 2eq turbulent. // viscousName: Laminar or tubulent model. // -- "0eq-bl". // -- "1eq-sa". @@ -410,16 +419,16 @@ string str_limiter_name = "vanalbada"; // 3 -- IDDES. // uns_scheme_name: Spatial discretisation scheme of Unstruct grid. // Using this when solve Unstructered grid or hybrid. -// -- "vanleer", "roe", "steger", "kfvs", "lax_f", "hlle". +// -- "vanleer", "roe", "GMRESRoe", "GMRESSteger", "steger", "kfvs", "lax_f", "hlle", // -- "ausm+", "ausmdv", "ausm+w", "ausmpw", "ausmpw+". // uns_limiter_name: Limiter of Unstruct grid. -// -- "barth", "vencat", "vanleer", "minmod". -// -- "vanalbada", "smooth", "nnd", "lpz", "1st". +// -- "barth", "vencat", "vanleer", "minmod", +// -- "vanalbada", "smooth", "nnd", "lpz", "1st", // -- "nolim", no limiter. // uns_vis_name: Discretisation method of viscous term. // -- "std", "test", "aver", "new1", "new2". // gradientName: Gradient reconstruction method. -// -- "default", "ggcell", "ggnode", "lsq". +// -- "default", "ggcell", "ggnode", "lsq". // ivencat: Variation of vencat limiter. // 0 -- org method, it is independent of grid scale. // 1 -- new method, it is dependent of grid scale. @@ -442,18 +451,18 @@ string str_limiter_name = "vanalbada"; // 3 -- Harten type, which is default used. // roeEntropyScale: Entropy fix (correction) coefficient scale, default is 1.0. // It is used to scale the default Roe entropy fix coefficients. -// AusmpwPlusLimiter: A Limiter to make "function w" not change acutely in AusmpwPlus scheme, default is 1.0 +// AusmpwPlusLimiter: A Limiter to make "function w" not change acutely in AusmpwPlus scheme, default is 1.0. -//int viscousType = 0; +//int viscousType = 0; //string viscousName = "Euler"; -//int viscousType = 1; +//int viscousType = 1; //string viscousName = "laminar"; -int viscousType = 3; +int viscousType = 3; string viscousName = "1eq-sa"; -//int viscousType = 4; +//int viscousType = 4; //string viscousName = "2eq-kw-menter-sst"; int DESType = 0; @@ -463,7 +472,7 @@ string uns_limiter_name = "vencat"; string uns_vis_name = "test"; string gradientName = "ggnode"; -int ivencat = 7; +int ivencat = 7; double venkatCoeff = 5.0; int reconmeth = 1; int limitVariables = 0; @@ -475,9 +484,9 @@ double roeEntropyScale = 1.0; double AusmpwPlusLimiter = 1.0; -//----------------------------------------------------------------------- -# Temporal Discretisation # -//----------------------------------------------------------------------- +#************************************************************************ +# Temporal Discretisation * +#************************************************************************ // iunsteady: Steady or unsteady. // 0 -- steady. // 1 -- unsteay. @@ -490,51 +499,57 @@ double AusmpwPlusLimiter = 1.0; // statisticalTimePeriod: Used as time period of statistic analysis. // when the value is negative, time period is treated as infinite. // statisticMethod: Statistic reynolds stress method. -// 0 -- tau = - ^2 -// 1 -- tau = +// 0 -- tau = - ^2 +// 1 -- tau = // min_sub_iter: The min sub iteration of unsteady simulation. // max_sub_iter: The max sub iteration of unsteady simulation. // tol_sub_iter: The tolerance of sub iteration of unsteady simulation. // tscheme: Temporal Discretisation method. -// 1 -- Runge-Kutta Multi-State. -// 2 -- Point implicit. -// 3 -- Full implicit. -// 4 -- LU-SGS. -// 5 -- Block LU-SGS. -// 6 -- Jacobian iteration. -// 7 -- Line LU-SGS. -// 8 -- Matrix LU-SGS. +// 1 -- Runge-Kutta Multi-State. +// 2 -- Point implicit. +// 3 -- Full implicit. +// 4 -- LU-SGS. +// 5 -- Block LU-SGS. +// 6 -- Jacobian iteration. +// 7 -- Line LU-SGS. +// 8 -- Matrix LU-SGS. +// 9 -- GMRES. // iSimplifyViscousTerm: Simplify the computation of viscous term in the Block LU-SGS method. The default value assigns 1 that could speed up the computation. // Otherwise, the viscous Jacobian matrix Mv should be computed that will increase the memory and time in iteration of the BLUSGS method. // CFLStart: Started cfl number. // CFLEnd: End cfl number. // CFLVaryStep: The number of step when cfl increase from CFLStart to CFLEnd. +// GMRESCFLScale : CFL = CFLStart * GMRESCFLScal^iteration. +// OriginalTscheme : Used for LUSGS and GMres hybrid computing. +// useLUSGSprecond: Initialize flow field for GMRES. +// 0 --Initialize by first order Jacobian matrix. +// 1 --Initialize by LUSGS. +// GMRESInitStep : the number of iteration step of irst order Jacobian matrix or LUSGS for initialize flow field. // ktmax: Dtratio. dt[i] = MIN(dt[i], ktmax * dtmin / vol[i]) // swapDq: Communication dq between forward/backward sweep of LUSGS or not, default is 0. // nLUSGSSweeps: Sub iteration of LU-SGS or Block LU-SGS. // LUSGSTolerance: Sub iter tolerance of LU-SGS or Block LU-SGS. // ifLocalTimeStep: Time step method. -// 0 --Local. -// 1 --Global. +// 0 --Local. +// 1 --Global. // isUseLocalCFL: use variable number of CFL or not. -// 0 -- global unified CFL number. -// 1 -- local CFL number. +// 0 -- global unified CFL number. +// 1 -- local CFL number. // isUsePreTwall: use the previous temperatures on wall. 1 indicates yes, and 0 indicates no. // visl_min: Minimum value of laminar viscosity coefficient. // turbCFLScale: Turbulence model cfl number factor. // codeOfAleModel: Arbitrary Lagrangian-Eulerian method. -// 0 -- no ALE method. -// 1 -- ALE method for non-moving grids. -// 2 -- ALE method for moving grids. -// 3 -- ALE method for deforming grids. +// 0 -- no ALE method. +// 1 -- ALE method for non-moving grids. +// 2 -- ALE method for moving grids. +// 3 -- ALE method for deforming grids. // wallFunctionType: The type of wall function to implement. -// 0 -- no wall function. (default) -// 1 -- standard wall function. -// 2 -- Pab3D wall function. +// 0 -- no wall function. (default) +// 1 -- standard wall function. +// 2 -- Pab3D wall function. // RKStage: The number of Runge-Kutta step. // lamda: Cofficient of Runge-Kutta step. - -int iunsteady = 0; +int iunsteady = 0; double physicalTimeStep = 0.01; double physicalTimeStepDimensional = -0.001; int ifStartFromSteadyResults = 0; @@ -543,39 +558,42 @@ int ifStaticsReynoldsStress = 0; int startStatisticStep = 800000; double statisticalTimePeriod = -1.0; int statisticMethod = 0; -int linearTwoStepMethods = 1; // 1--BDF1; 2--C-N; 3--BDF2; +int linearTwoStepMethods = 1; // 1--BDF1; 2--C-N; 3--BDF2. int methodOfDualTime = 3; int min_sub_iter = 50; int max_sub_iter = 50; double tol_sub_iter = 0.01; -int tscheme = 4; +int tscheme = 4; int iSimplifyViscousTerm = 1; int ifLocalTimeStep = 0; int isUseLocalCFL = 0; int isUsePreTwall = 0; -double CFLStart = 0.01; -double CFLEnd = 10.0; -int CFLVaryStep = 500; - +double CFLStart = 0.01; +double CFLEnd = 10.0; +int CFLVaryStep = 500; +double GMRESCFLScale = 1.0; +int OriginalTscheme = 9; +int useLUSGSprecond = 1; +int GMRESInitStep = 1000; double pMaxForCFL = 0.2; double pMinForCFL = 0.1; double deltaMaxForCFL = 0.2; double magnifyFactorForCFL = 1.1; double reduceFactorForCFL = 0.5; -double ktmax = 1.0e10; +double ktmax = 1.0e10; -int swapDq = 1; +int swapDq = 1; int nLUSGSSweeps = 1; double LUSGSTolerance = 0.01; -int order = 2; +int order = 2; double visl_min = 0.01; double turbCFLScale = 1.0; -double csrv = 2.0; +double csrv = 1.0; double timemax = 1.0e10; double dtsave = -1.0; int maxale = 10; @@ -591,10 +609,9 @@ double lamda[] = [0.5, 1.0]; //int RKStage = 4; //double lamda[] = [0.25, 0.33333333333, 0.5, 1.0]; - -//----------------------------------------------------------------------- -# File In or Out # -//----------------------------------------------------------------------- +#************************************************************************ +# File In or Out * +#************************************************************************ // numberOfGridGroups: The number of grid groups. // gridfile: The partitioned Grid file path, using relative path, // which is relative to the working directory. @@ -611,20 +628,18 @@ double lamda[] = [0.5, 1.0]; // aircoeffile: The file path to save the aerodynamic force coefficients convergence process, write data for every default (intervalStepForce) steps. // restartNSFile: The file path to write restart flowfield variables, write data for every default (intervalStepFlow) steps. // turbfile: The file path to write restart flowfield variables of turbulence , write data for every default(intervalStepFlow) steps. -// visualfile: The visualization file path of flowfield , write data for every default (intervalStepPlot) steps. +// visualfile: The visualization file path of flowfield, write data for every default (intervalStepPlot) steps. // wall_aircoefile: The file path to save flowfield variables of wall, write data for every default steps. // nDumpSurfaceInfo = 0 the "wall_varfile" write the informations including heat flux. // nDumpSurfaceInfo = 1 the "wall_varfile" write the informations without heat flux. // nIsComputeWallDist: Whether to compute the wall distance. // 0 -- Compute wall distance. // 1 -- Not compute. -// -// protectionFile0 and protectionFile1 : Two continuation file of the data protection mechanism. -// wall_heatfluxfile : The file to output the MaxHeatFlux of wall. - -int numberOfGridGroups = 1; -string gridfile = "./grid/rae2822_hybrid2d__4.fts"; -string wallTemperaturefile= ""; +// protectionFile0 and protectionFile1: Two continuation file of the data protection mechanism. +// wall_heatfluxfile: The file to output the MaxHeatFlux of wall. +int numberOfGridGroups = 1; +string gridfile = "./grid/rae2822_hybrid2d__4.fts"; +string wallTemperaturefile = ""; int nIsComputeWallDist = 0; int walldistMethod = 1; @@ -632,10 +647,12 @@ int cellMethodOrNodeMethod = 0; string resSaveFile = "results/res.dat"; string turbresfile = "results/turbres.dat"; +string transitionResFile = "results/transitionRes.dat"; string aircoeffile = "results/aircoef.dat"; string restartNSFile = "results/flow.dat"; string turbfile = "results/turb.dat"; +string transitionFile = "results/transition.dat"; string visualfile = "results/tecflow.plt"; string wall_aircoefile = "results/wall_aircoef.dat"; @@ -645,10 +662,14 @@ string protectionFile0 = "results/flow0.dat"; string protectionFile1 = "results/flow1.dat"; string wall_heatfluxfile = "results/wall_heatflux.dat"; -int nDumpSurfaceInfo = 0; -string wall_varfile = ""; +string protectionTurbFile0 = "results/turb0.dat"; +string protectionTurbFile1 = "results/turb1.dat"; -string jetDefineFile = "bin/jet.hypara"; +string protectionTransitionFile0 = "results/transition0.dat"; +string protectionTransitionFile1 = "results/transition1.dat"; + +int nDumpSurfaceInfo = 0; +string wall_varfile = ""; string sixDofFileName = "results/sixDofInfo.dat"; string derivativeFileName = "results/identify.dat"; @@ -659,7 +680,8 @@ int plotFieldType = 0; // visualfileType: The file type of visualfile. // 0 -- Tecplot binary. // 1 -- Tecplot ASCII. - +// 2 -- Ensight binary. +// 3 -- Ensight ASCII. int visualfileType = 1; // samplefileMode: The dump mode of sample file. @@ -697,21 +719,21 @@ double upperPlotFieldBox[] = [1.0 1.0 1.0]; // -- vibration temperature(Tv, 33), electron temperature(Te, 34), vibrational energy(Ev, 35), electric energy(Ee, 36), // -- number density of electron(Ne, 37), dimensioanl density(rho, 38), dimensioanl pressure(p, 39), dimensioanl temperature(T, 40), // -- gradientUx(41), gradientUy(42), gradientVx(43), gradientVy(44), streamline_u(45), streamline_v(46), streamline_w(47), -// -- transition intermittency(intermittency, 51), -transition momentum thickness reynolds(MomentumThicknessReynolds, 52), -// -- overlap iblank(iblank, 81) - -// -- specific heat ratio(gama, 56) +// -- transition intermittency(intermittency, 51), transition momentum thickness reynolds(MomentumThicknessReynolds, 52), +// -- local CFL Number(localCFL, 57), minimal CFL Number(minCFL, 58), +// -- overlap iblank(iblank, 81), +// -- specific heat ratio(gama, 56), Knudsen number(kn, 60), Damkohler number(Da, 61), vibrational nonequilibrium number(Vi, 62). // Important Warning: Array size of visualVariables MUST be equal to nVisualVariables!!! // Variables order must from small to big. //-----------the optional parameters list for the wall boundary condition---------------- // nVisualWallVariables: The number of visual variables on wall. // visualWallVariables : dumped variable types, listed as following: -// -coefficient of pressure(cp, 0), -coefficient of friction(cf, 1), yplus(2), -non-dimensional heat flux(Q_NonDim, 3), -dimensional heat flux(Q_Dim, 4), -// -pressure on wall(pw, 5), -temperature on wall(Tw, 6), -density on wall(rhow, 7), -heat flux of translational-rotational temperature term(Qtr, 8), -// -heat flux of species diffusion term(Qs, 9), -heat flux of vibrational temperature term(Qv, 10), -heat flux of electron temperature term(Qe, 11), -// -species mass fractions(Ns, 12), -x component of wall velocity(Vx, 13), -y component of wall velocity(Vy, 14), -z component of wall velocity(Vz, 15) -// -slip translational-rotational temperature(Tts, 16), -slip vibrational temperature(Tvs, 17), -slip electron temperature(Tes, 18), -absolute wall velocity(Vs, 19) -// -Stanton number(St, 20), -coefficient of heat rate(Ch, 21), -temperature jump(deltaT, 22), -Grid Reynolds number on wall(Re_w, 23) +// -- coefficient of pressure(cp, 0), coefficient of friction(cf, 1), yplus(2), non-dimensional heat flux(Q_NonDim, 3), dimensional heat flux(Q_Dim, 4), +// -- pressure on wall(pw, 5), temperature on wall(Tw, 6), density on wall(rhow, 7), heat flux of translational-rotational temperature term(Qtr, 8), +// -- heat flux of species diffusion term(Qs, 9), heat flux of vibrational temperature term(Qv, 10), heat flux of electron temperature term(Qe, 11), +// -- species mass fractions(Ns, 12), x component of wall velocity(Vx, 13), y component of wall velocity(Vy, 14), z component of wall velocity(Vz, 15), +// -- slip translational-rotational temperature(Tts, 16), slip vibrational temperature(Tvs, 17), slip electron temperature(Tes, 18), absolute wall velocity(Vs, 19), +// -- Stanton number(St, 20), coefficient of heat rate(Ch, 21), temperature jump(deltaT, 22), Grid Reynolds number on wall(Re_w, 23), Knudsen number(Kn_wall, 24). int nVisualVariables = 8; int visualVariables[] = [0, 1, 2, 3, 4, 5, 6, 15]; @@ -739,16 +761,18 @@ int dumpStandardModel = 0; // 1 -- Real cell where the probe is located. // nProbeVariables: Number of variables want to be dumped for probes monitered. // probeVariables : Variable types dumped, listed as following: -// -- density(0), u(1), v(2), w(3), pressure(4), temperature(5), mach(6). +// -- density(0), u(1), v(2), w(3), pressure(4), temperature(5), mach(6), +// -- dimensioanl_density(7), dimensioanl_u(8), dimensioanl_v(9), +// -- dimensioanl_w(10), dimensioanl_pressure(11), dimensioanl_temperature(12). // Important Warning: Array size of probeVariables MUST be equal to nProbeVariables!!! // probeVariables order must from small to big. // probeVariablesInterpolationMethod: Interpolation method used to compute the probe variables. -// 0 -- Take the value of probe's cell as probe real value. -// 1 -- Interpolation from probe's and neighbouring cell to probe. -// 2 -- Interpolation from probe's cell nodes to probe. +// 0 -- Take the value of probe's cell as probe real value. +// 1 -- Interpolation from probe's and neighbouring cell to probe. +// 2 -- Interpolation from probe's cell nodes to probe. int ifSetDataMonitor = 0; -int dataMonitorType = 0; +int dataMonitorType = 0; string probesDefineFile = "bin/probes_XYZ.dat"; //int dataMonitorType = 1; @@ -761,28 +785,26 @@ string probesDefineFile = "bin/probes_XYZ.dat"; int searchCellsMethod = 0; -int nProbeVariables = 7; -int probeVariables[] = [0, 1, 2, 3, 4, 5, 6]; -int probeVariablesInterpolationMethod = 0; -//----------------------------------------------------------------------- -# Turbulence Parameter # -//----------------------------------------------------------------------- +int nProbeVariables = 14; +int probeVariables[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]; +int probeVariablesInterpolationMethod = 0; + +#************************************************************************ +# Turbulence Parameter * +#************************************************************************ // turbInterval: Iteration number of turbulence. // kindOfTurbSource: Kinds of turbulent source. // 0 -- Original. // mod_turb_res: If modify the residuals for the cells next to the wall or not, default is 0. -// transitionType: transition model type +// transitionType: transition model type // 0 -- none. // 2 -- gama-re-theta. -// turbIntensity: (valid while greater than 0.0 ) turbulent intensity of free stream(*100) in transition -// freeturbIntensitySRModify: to use SR modify in free stream turbulent intensity decay or not - - +// turbIntensity: (valid while greater than 0.0 ) turbulent intensity of free stream(*100) in transition. +// freeturbIntensitySRModify: to use SR modify in free stream turbulent intensity decay or not. int turbInterval = 1; int turbOrderStruct = 2; int kindOfTurbSource = 0; int mod_turb_res = 0; -double turb_relax = 1.0; double freeStreamViscosity = 1.0e-3; double muoo = 3.0; double kwoo = 5.0; @@ -790,29 +812,28 @@ int transitionType = 0; double turbIntensity = -1.0; int freeturbIntensitySRModify = 0; double freeDecayXLocation = 0.0; -int compressibleCorrection = 0; -int prandtlNumberCorrection = 0; +int compressibleCorrection = 0; int transitionMaFix = 1; -# maximum eddy viscosity (myt/my) max. +// maximum eddy viscosity (myt/my) max. double eddyViscosityLimit = 1.0e10; int monitor_vistmax = 0; -//----------------------------------------------------------------------- -# LES Parameter # -//----------------------------------------------------------------------- +#************************************************************************ +# LES Parameter * +#************************************************************************ // iLES: Create LESSolver or not. -// = 1 - Create LESSolver; -// != 1 - not. +// = 1 -- Create LESSolver; +// != 1 -- not. // amplitudeofDisturb: Amplitude of adding disturb. // disturbstep: Unsteady time step or steady iteration of adding random disturb. // iterdisturb: Add random disturb in every sub-iter or only first sub-iter. -// = 0 - in only first sub-iter; -// != 0 - in every sub-iter. +// = 0 -- in only first sub-iter; +// != 0 -- in every sub-iter. // ipraddisturb: Add density and pressure disturb or not. // ibodyforce: Add body force in source flux of NS equations or not. -// = 0 - not; -// != 0 - Add body force. +// = 0 -- not; +// != 0 -- Add body force. // bodyforce: Body force in source flux of NS equations or not. // utau: friction velocity, using in DNSDisturb. // sgsmodel: subgrid scale model. @@ -820,23 +841,22 @@ int monitor_vistmax = 0; // = "dsmCom"; // = "wale"; // = "sigma". -// deltaFunctionType: = 1 - MAX(deltai, deltaj, deltak); -// = 2 - pow(deltai * deltaj *deltak, 1/3); -// = 3 - Devloped by Scotti. -// wallDampingFunctionType: = 0 - no wall function; -// = 1 - van Driest; -// = 2 - developed by Dr. Deng Xiaobing; -// = 3 - developed by Piomelli. +// deltaFunctionType: = 1 -- MAX(deltai, deltaj, deltak); +// = 2 -- pow(deltai * deltaj *deltak, 1/3); +// = 3 -- Devloped by Scotti. +// wallDampingFunctionType: = 0 -- no wall function; +// = 1 -- van Driest; +// = 2 -- developed by Dr. Deng Xiaobing; +// = 3 -- developed by Piomelli. // turbViscousCutType: turbulent viscosity cut type. -// = 0 - mu_total = mut + mul; -// = 1 - mu_total = max(mut-mul,0)+ mul; -// = 2 - mu_total = max(mut ,0)+ mul. +// = 0 -- mu_total = mut + mul; +// = 1 -- mu_total = max(mut-mul, 0) + mul; +// = 2 -- mu_total = max(mut , 0) + mul. // smagConstant: constant of smagorinsky model. // waleConstant: constant of wale model. -// filterDirection[3]: filter variables in i, j, k direction or not. +// filterDirection [3]: filter variables in i, j, k direction or not. // averageDirection[3]: average variables in i, j, k direction or not. // isotropicConstant: constant of isotropic part of SGS stress. - int iLES = 0; string sgsmodel = "smagorinsky"; int deltaFunctionType = 2; @@ -852,19 +872,16 @@ double testFilterScale = 2.0; int averageWidth = 1; int monitorNegativeConstant = 0; -//----------------------------------------------------------------------- -# Other Parameters for Hypersonic Non-equilibrium Gas # -//----------------------------------------------------------------------- +#************************************************************************ +# Other Parameters for Hypersonic Non-equilibrium Gas * +#************************************************************************ // dg_high_order: // 0 -- generic order accuracy. // 1 -- high order accuracy. // iapplication: // 0 -- gas model is fixed in the codes. // 1 -- gas model is imported from library files. -// isAdaptiveSolver: isAdaptiveSolver=0 indicates the generic Navier-Stokes solver, -// isAdaptiveSolver>0 indicates the HyFlow self-adaptive solver. -// 1 -- using HyFlow self-adaptive solver where the switch is controlled by the total iteration steps. -// 2 -- using HyFlow self-adaptive solver where the switch is controlled by variation of the key residual. +// isAdaptiveSolver: isAdaptiveSolver = 0 indicates the generic Navier-Stokes solver, // nm: Equation number of the physics, but is out of commision now. // 4 -- for 2D. // 5 -- for 3D. @@ -875,7 +892,7 @@ int monitorNegativeConstant = 0; // 2 -- Argon. // 3 -- Nitrogen. // nEnergyRecycle: The type of EnergyModel Recycle. -// 0 -- not used . +// 0 -- not used. // 1 -- used. // nDensityModify: The type of densitymodify. // 0 -- not used. @@ -883,26 +900,25 @@ int monitorNegativeConstant = 0; // nchem: // 0 -- without chemical reaction flow. // 1 -- the chemical reaction flow is considered. -// nEquilibriumGas: the variable is valid when the condition of nchem=0 is satisfied. +// nEquilibriumGas: the variable is valid when the condition of nchem = 0 is satisfied. // 0 -- perfect gas. // 5, 7, 11 -- equilibrium gas, meanwhile, its value denotes the number of gas component. -// nPCWCycleStep: the maximum step number of iteration in the module of computing species mass fractions with the partial catalytic wall(PCW) condition. -// the value equals to or is greater than 1, and 3 is for default value. -// nRETCycleStep: the maximum step number of iteration in the module of computing radiation equilibrium temperature on wall. -// the value equals to or is greater than 1, and 3 is for default value. -// nSLIPCycleStep:the maximum step number of iteration in the module of computing slip temperature, slip velocity and slip species mass fraction. -// the value equals to or is greater than 1, and 3 is for default value. -// nSlipBCModel : The computational model of slip boundary conditions. - -// 0 -- no slip. -// 1 -- the conventional Maxwell slip conditions. -// 2 -- the Gokcen slip conditions. -// 3 -- the Knudsen-layer correction of the standard slip conditions proposed by Lockerby, et al. -// 4 -- the Kogan simplified slip conditions. -// nMeanFreePathType : the method to the mean free-path for the slip conditions. For the mixture, 0 is suggested. -// 0 -- the equivalent mean free-path is calculated by the simple hard sphere model(HS). -// 1 -- calculated by the definition that includes the variables of the number density and the molecule diameter. -// 2 -- the equivalent mean free-path is calculated by the variable hard sphere model(VHS). +// nPCWCycleStep: The maximum step number of iteration in the module of computing species mass fractions with the partial catalytic wall(PCW) condition. +// The value equals to or is greater than 1, and 3 is for default value. +// nRETCycleStep: The maximum step number of iteration in the module of computing radiation equilibrium temperature on wall. +// The value equals to or is greater than 1, and 3 is for default value. +// nSLIPCycleStep:The maximum step number of iteration in the module of computing slip temperature, slip velocity and slip species mass fraction. +// The value equals to or is greater than 1, and 3 is for default value. +// nSlipBCModel: The computational model of slip boundary conditions. +// 0 -- no slip. +// 1 -- the conventional Maxwell slip conditions. +// 2 -- the Gokcen slip conditions. +// 3 -- the Knudsen-layer correction of the standard slip conditions proposed by Lockerby, et al. +// 4 -- the Kogan simplified slip conditions. +// nMeanFreePathType: the method to the mean free-path for the slip conditions. For the mixture, 0 is suggested. +// 0 -- the equivalent mean free-path is calculated by the simple hard sphere model(HS). +// 1 -- calculated by the definition that includes the variables of the number density and the molecule diameter. +// 2 -- the equivalent mean free-path is calculated by the variable hard sphere model(VHS). // nchemsrc: // 0 -- the source terms are not computed. // 1 -- the source terms are computed. @@ -913,148 +929,151 @@ int monitorNegativeConstant = 0; // 1 -- One-temperature model. // 2 -- Two-temperature model. // 3 -- Three-temperature model. +// isUseNoneqCond: +// 0 -- compute the source terms without any conditions. +// 1 -- compute the source terms using the non-equilibrium condition. +// frozenCondition: the threshold value of frozen chemical flow condition, 0.1 is the default value. // nIdealState: whether take all gas species as ideal gas for gas-mixture process. // 0 -- No. -// 1 -- Yes. -// nTEnergyModel: the method to computing temperature energy model. +// 1 -- Yes. // nTEnergyModel: the method to computing temperature energy model. // 0 -- the energy term is computed using the conventional method. // 1 -- the energy term is computed using the polynomial fitting method. // 2 -- the energy term is computed using the piecewise polynomial fitting method. // parkVDPower: the power of translational-rotational temperature in the Park V-D(vibration-dissociation) coupling model. // The value is in range of [0.0, 1.0], DPLR suggests 0.5, LAURA suggests 0.7, while 0.6 is given as default value. // catalyticCoef: -// 0.0 -- full non-catalytic wall boundary condition. -// 1.0 -- full catalytic wall boundary condition. -// in range of (0.0, 1.0) -- partial catalytic condition, the value indicates the catalytic coefficient. -// nIsSuperCatalytic : the super catalytic condition for the fully catalytic wall, and assigned with the value of 1. -// 0 -- equilibrium condition for the fully catalytic wall where the mass fractions are assigned with the values of the free stream. -// 1 -- super catalytic condition for the fully catalytic wall where all the atomic components combine into molecular components. -// nTemperatureJump : the method to calculate the temperature jump. -// 0 -- calculated by the variables of heat conductivity and constant volume specific heat for each energy mode. -// 1 -- the general method where the iteration is calculated with the translation-rotation temperature. -// nSurfGradMethod : the method to compute the surface heating ratio. -// 0 -- the gradient of variable is computed with the first-order difference method. -// 1 -- the gradient of variable is computed with the Green-Guass integral method. -// nRapidFlowfield : initialize the flowfield using the rapid engineering method when it is greater than zero. -// nSurfHeatMonitor : To exam the surface heating change or not. 0 is no, 1 is yes. -// nInitPressureStep : the steps to initialize the boundary variables when the rapid method is used. 100 is the default value. -// nDumpCFLNumber : 1 indicates dumping the CFL number to file, 0 denotes no dumping. +// 0.0 -- full non-catalytic wall boundary condition. +// 1.0 -- full catalytic wall boundary condition. +// in range of (0.0, 1.0) -- partial catalytic condition, the value indicates the catalytic coefficient. +// nIsSuperCatalytic: the super catalytic condition for the fully catalytic wall, and assigned with the value of 1. +// 0 -- equilibrium condition for the fully catalytic wall where the mass fractions are assigned with the values of the free stream. +// 1 -- super catalytic condition for the fully catalytic wall where all the atomic components combine into molecular components. +// nTemperatureJump: the method to calculate the temperature jump. +// 0 -- calculated by the variables of heat conductivity and constant volume specific heat for each energy mode. +// 1 -- the general method where the iteration is calculated with the translation-rotation temperature. +// nSurfGradMethod: the method to compute the surface heating ratio. +// 0 -- the gradient of variable is computed with the first-order difference method. +// 1 -- the gradient of variable is computed with the Green-Guass integral method. +// nRapidFlowfield: initialize the flowfield using the rapid engineering method when it is greater than zero. +// nSurfHeatMonitor: To exam the surface heating change or not. 0 is no, 1 is yes. +// nInitPressureStep: the steps to initialize the boundary variables when the rapid method is used. 100 is the default value. +// nDumpCFLNumber: 1 indicates dumping the CFL number to file, 0 denotes no dumping. // sigmaVelocity: the coordination coefficient of tangential momentum for computation of slip velocity. The value is in range of (0.0, 2.0]. // sigmaTemperature: the heat coordination coefficient for computation of slip temperature. The value is in range of (0.0, 2.0]. // sigmaMassFraction: the species coordination coefficient for computation of slip mass fractions. The value is in range of (0.0, 2.0]. // velocitySlipCorrectConstant: the correction constant to the velocity slip condition. For the diffuse reflection, 1.0 is used. -// 1.0 -- proposed by Maxwell. -// sqrt(2/PI)~0.8 -- used for "micro-slip", namely the actual velocity slip at the wall. -// 1.146 -- proposed for an additional "fictitious" velocity slip. - -// chemicalRelaxCorf: The value is in range of [0.001, 1.0]. -// spectrumRadiusCoef: The value is in range of [0.0, 2.0]. -// staticPressureRelaxCorf: The value is in range of [0.1, 1.0]. -// nIsChemicalFreeze : the flag to freeze the chemical reactions. -// 0 -- not freeze, the chemical reaction sources will be calculated. -// 1 -- freezes the chemical reactions, the chemical reaction sources will not be calculated.// veTemperatureMin: The minimum of Tv and Te - -//maxViscous: the maximum of Viscous. -//trTemperatureMin: the minimum value of trTemperature. -//veTemperatureMin: the minimum value of veTemperature. -//densityMin: the minimum value of density. -//tAdjustmentFactor: magnification of temperature, this value is in range of (1.0, 10.0]. -// nDebug: cout the Wrong place and abort -// 0 -- not used. -// 1 -- used. +// 1.0 -- proposed by Maxwell. +// sqrt(2/PI)~0.8 -- used for "micro-slip", namely the actual velocity slip at the wall. +// 1.146 -- proposed for an additional "fictitious" velocity slip. +// chemicalRelaxCorf: The value is in range of [0.001, 1.0]. +// spectrumRadiusCoef: The value is in range of [0.0, 2.0]. +// staticPressureRelaxCorf: The value is in range of [0.1, 1.0]. +// nIsChemicalFreeze: the flag to freeze the chemical reactions. +// 0 -- not freeze, the chemical reaction sources will be calculated. +// 1 -- freezes the chemical reactions, the chemical reaction sources will not be calculated. +// veTemperatureMin: The minimum of Tv and Te. +// maxViscous: the maximum of Viscous. +// trTemperatureMin: the minimum value of trTemperature. +// veTemperatureMin: the minimum value of veTemperature. +// densityMin: the minimum value of density. +// tAdjustmentFactor: magnification of temperature, this value is in range of (1.0, 10.0]. +// nDebug: cout the Wrong place and abort +// 0 -- not used. +// 1 -- used. // nSpeciesLimit: limitter of gas species -// 0 -- not used. -// 1 -- used. -// nTurblenceForChemical: the coupled mode of Turblence and Chemical reaction -// 0 -- method 0. -// 1 -- method 1. -// nViscosityFluxSublevelModified: Modified for ViscosityFlux on Sublevel grid -// 0 -- not used. -// 1 -- used. -// nViscosityPeModified: Pe Modified for ViscosityCoef -// 0 -- not used. -// 1 -- used. -// nChemcalSourceModified: Modified on ChemcalSource -// 0 -- not used. -// 1 -- used. -// nChemcalSourceEsMethod: Modified on ChemcalSource -// 0 -- approximation algorithm 1 (Ori.) -// 1 -- approximation algorithm 2 (New) - +// 0 -- not used. +// 1 -- used. +// nTurblenceForChemical: the coupled mode of Turblence and Chemical reaction. +// 0 -- method 0. +// 1 -- method 1. +// nViscosityFluxSublevelModified: Modified for ViscosityFlux on Sublevel grid. +// 0 -- not used. +// 1 -- used. +// nViscosityPeModified: Pe Modified for ViscosityCoef. +// 0 -- not used. +// 1 -- used. +// nChemcalSourceModified: Modified on ChemcalSource. +// 0 -- not used. +// 1 -- used. +// nChemcalSourceEsMethod: Modified on ChemcalSource. +// 0 -- approximation algorithm 1 (Ori). +// 1 -- approximation algorithm 2 (New). // nMaxStepTemperature: the iterative steps of temperature. - -// veTemperatureMinModified: Modified on the minimum of Tve for Cvvs -// 0 -- not used -// 1 -- used - -// nDiagonalModified: Modified on Diagonal -// 0 -- not used -// 1 -- Ori. -// 2 -- new - -//nGradPrimtiveMethod: -// 0 -- Ori. -// 1 -- new +// veTemperatureMinModified: Modified on the minimum of Tve for Cvvs. +// 0 -- not used. +// 1 -- used. +// nDiagonalModified: Modified on Diagonal. +// 0 -- not used. +// 1 -- new. +// nDiagonalModifiedTurb: Modified on Diagonal for turbulence. +// 0 -- not used. +// 1 -- new. +// nGradPrimtiveMethod: +// 0 -- Ori. +// 1 -- new. // nAblation: -// 0 -- The wall ablation is not computed. -// 1 -- The wall ablation is computed. +// 0 -- The wall ablation is not computed. +// 1 -- The wall ablation is computed. // isInjection: -// 0 -- The injection velocity of ablation wall is not computed. -// 1 -- The injection velocity of ablation wall is computed. +// 0 -- The injection velocity of ablation wall is not computed. +// 1 -- The injection velocity of ablation wall is computed. // nViscosityModel: -// 0 -- Blottner fitting method(N89). -// 1 -- Gupta fitting method(N90). +// 0 -- Blottner fitting method(N89). +// 1 -- Gupta fitting method(N90). // nContinueModel: The new continue model can switch different computation model. -// 0 -- Not use the new continue model. -// 1 -- use the new continue model. +// 0 -- Not use the new continue model. +// 1 -- use the new continue model. // nSutherland: -// 0 -- stands for selecting the Blotter curve fits mode. -// 1 -- stands for Sutherland relation. +// 0 -- stands for selecting the Blotter curve fits mode. +// 1 -- stands for Sutherland relation. // gasfile: Indicates the gas model, 9 models are provided, namely "Gu5", "Gu7", "Gu11", "Pa5", "Pa7", "Pa11", "DK5", "DK7", "DK11". -// "Gu" -- indicates the Gupta Model, three-Type Models are embeded in the library, namely, the 5-species-6-reactions, the 7-species-9-reactions, the 11-species-20-reactions. -// "Pa" -- indicates the Park Model, three-Type Models are embeded in the library, namely, the 5-species-17-reactions, the 7-species-22-reactions, the 11-species-48-reactions. -// "DK" -- indicates the Dunn-Kang Model, three-Type Models are embeded in the library, namely, the 5-species-11-reactions, the 7-species-15-reactions, the 11-species-26-reactions. -// "Mars-Pa8" is for Park model of Mars gas, "Mars-Mc8" for McKenzie model of Mars gas. -// "Combustion-12" -- indicates the Combustion Chamber Gas Model which includes 12-species-20-reactions. -// "Gas-Mixture" -- indicates the process of mixing gas without reacting. -// for struct solver mixing two speciesSpeciesA, SpeciesB. -// for unstruct solver mixing multi-speciesO2 NO CO CO2 H2 N2 Air CH4. -// For self-definition model, the gasfile is used to indicate the file path of the new gas model. +// "Gu" -- indicates the Gupta Model, three-Type Models are embeded in the library, namely, the 5-species-6-reactions, the 7-species-9-reactions, the 11-species-20-reactions. +// "Pa" -- indicates the Park Model, three-Type Models are embeded in the library, namely, the 5-species-17-reactions, the 7-species-22-reactions, the 11-species-48-reactions. +// "DK" -- indicates the Dunn-Kang Model, three-Type Models are embeded in the library, namely, the 5-species-11-reactions, the 7-species-15-reactions, the 11-species-26-reactions. +// "Mars-Pa8" is for Park model of Mars gas, "Mars-Mc8" for McKenzie model of Mars gas. +// "Combustion-12" -- indicates the Combustion Chamber Gas Model which includes 12-species-20-reactions. +// "Gas-Mixture" -- indicates the process of mixing gas without reacting. +// for struct solver mixing two species��SpeciesA, SpeciesB��. +// for unstruct solver mixing multi-species��O2 NO CO CO2 H2 N2 Air CH4��. +// For self-definition model, the gasfile is used to indicate the file path of the new gas model. // speciesName: Used to list the names of each species, while each species name is separated by the symbol of comma. // initMassFraction: Used to list the initial mass fractions of species in accordance with the sequence of names in the parameter speciesName. // ifStartFromPerfectGasResults: The chemical reaction simulation is start from perfect gas flowfield or not, 0 is for no and else is for yes. -// nIterFirstStep : the maximum number of iteration in the first step for the self-adaptive calculation. -// nIterSecondStep : the maximum number of iteration in the second step for the self-adaptive calculation. -// nIterThirdStep : the maximum number of iteration in the third step for the self-adaptive calculation. -// nEnergyAssembly : the vibration energy is computed with combined method which includes the fitting method and the molecular kinetic theory. -// 0 -- no, -// 1 -- yes. +// nIterFirstStep : the maximum number of iteration in the first step for the self-adaptive calculation. +// nIterSecondStep: the maximum number of iteration in the second step for the self-adaptive calculation. +// nIterThirdStep : the maximum number of iteration in the third step for the self-adaptive calculation. +// nEnergyAssembly: the vibration energy is computed with combined method which includes the fitting method and the molecular kinetic theory. +// 0 -- no, +// 1 -- yes. // nControlVariable: the variable to computing the residual error that determines the convergence is meet or not in the one-temperature model. -// 0 -- the density. -// 1 -- the translation temperature. -// 2 -- the vibration temperature. -// 3 -- the electron temperature. -// 4 -- the pressure. -// 5 -- the mass fraction of oxygen. -// 6 -- the mass fraction of nitrogen. +// 0 -- the density. +// 1 -- the translation temperature. +// 2 -- the vibration temperature. +// 3 -- the electron temperature. +// 4 -- the pressure. +// 5 -- the mass fraction of oxygen. +// 6 -- the mass fraction of nitrogen. // firstStepError : the residual error of the first step iteration for the self-adaptive calculation. // secondStepError : the residual error of the second step iteration for the self-adaptive calculation. // thirdStepError : the residual error of the third step iteration for the self-adaptive calculation. -// useHyflowSetting : Setting for HyFLOW GUI. -// 0 -- PHengLEI -// 1 -- HyFLOW -// nProtectData : Use the continuation file data protection mechanism. -// 0 -- no -// 1 -- yes - +// nProtectData: Use the continuation file data protection mechanism. +// 0 -- no. +// 1 -- yes. +// nTvChange: Judge whether the Tv equals Ttr. +// 0 -- yes. +// 1 -- no. +// isMoleFractionType: 1 indicates the mass fractions, or else the mole fractions. +// nFraction: the initial fractions type of species. +// 0 -- mass fraction. +// 1 -- mole fraction. int dg_high_order = 0; int iapplication = 0; int isAdaptiveSolver = 0; -int nm = 5; +int nm = 5; int nEquilibriumGas = 0; -int nPCWCycleStep = 3; -int nRETCycleStep = 3; -int nSLIPCycleStep= 3; +int nPCWCycleStep = 3; +int nRETCycleStep = 3; +int nSLIPCycleStep = 3; int nIterFirstStep = 1000; int nIterSecondStep= 2000; int nIterThirdStep = 2000; @@ -1065,17 +1084,17 @@ double secondStepError = 0.001; double thirdStepError = 0.001; double predictCFLError = 0.1; -double refGama = 1.4; -double prl = 0.72; -double prt = 0.90; -double sc_l = 0.5; -double sc_t = 0.5; +double refGama = 1.4; +double prl = 0.72; +double prt = 0.90; +double sc_l = 0.5; +double sc_t = 0.5; -int nGasModel = 0; -int nchem = 0; -int nchemsrc = 1; -int nchemrad = 1; -int ntmodel = 1; +int nGasModel = 0; +int nchem = 0; +int nchemsrc = 1; +int nchemrad = 1; +int ntmodel = 1; int nIdealState = 0; int nEnergyRecycle = 1; @@ -1099,12 +1118,12 @@ double sigmaTemperature = 1.0; double sigmaMassFraction = 1.0; double velocitySlipCorrectConstant = 1.0; -double chemicalRelaxCorf = 1.0; +double chemicalRelaxCorf = 1.0; double chemicalSpectrumRadiusCoef = 1.0; double viscousSpectrumRadiusCoef = 1.5; double inviscidSpectrumRadiusCoef = 1.5; -double spectrumRadiusCoef = 0.5; -double staticPressureRelaxCorf = 0.2; +double spectrumRadiusCoef = 0.5; +double staticPressureRelaxCorf = 0.2; double maxViscous = 10000.0; double trTemperatureMin = 10.0; @@ -1114,31 +1133,35 @@ double densityMin = 1.0e-8; double densityMinFactor = 0.1; double tAdjustmentFactor = 10.0; double iniSpeedCoef = 1.0; +int iniSpeedMode = 0; -int nDebug = 0; -int nSpeciesLimit = 1; -int nTurblenceForChemical = 0; -int nViscosityFluxSublevelModified = 1; -int nViscosityPeModified = 0; -int nChemcalSourceModified = 2; -int nChemcalSourceEsMethod = 1; -int nMaxStepTemperature = 5; -int veTemperatureMinModified = 1; -int nDiagonalModified = 0; -int nGradPrimtiveMethod = 1; -int nInviscidFluxModify = 1; -int nQlLimitMethod = 2; -int nSpeciesForWallMethod = 1; -int nDensityForWallMethod = 0; +int nDebug = 0; +int nSpeciesLimit = 1; +int nTurblenceForChemical = 0; +int nViscosityFluxSublevelModified = 1; +int nViscosityPeModified = 0; +int nChemcalSourceModified = 2; +int nChemcalSourceEsMethod = 1; +int nMaxStepTemperature = 5; +int veTemperatureMinModified = 1; +int nDiagonalModified = 0; +int nDiagonalModifiedTurb = 0; +int nGradPrimtiveMethod = 1; +int nInviscidFluxModify = 1; +int nQlLimitMethod = 2; +int nSpeciesForWallMethod = 1; +int nDensityForWallMethod = 0; +int wallMultiTemperature = 0; -int nProtectData = 0; -int useHyflowSetting = 0; -int nAblation = 0; -int isInjection = 0; -int nViscosityModel = 0; -int nMarsModel = 0; -string gasfile = "DK5"; -//string gasfile = "./chemical/Dunn-Kang_air5s11r.dat"; +int nProtectData = 0; +int nAblation = 0; +int isInjection = 0; +int nViscosityModel = 0; +int nMarsModel = 0; +int nTvChange = 0; +int isMoleFractionType = 0; +string gasfile = "DK5"; +//string gasfile = "./chemical/Dunn-Kang_air5s11r.dat"; string speciesName = "O, O2, NO, N, N2"; string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.767"; @@ -1152,16 +1175,16 @@ string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.767"; //string speciesName = "O, O2, NO, N, N2, C, CO, CO2"; //string initMassFraction = "0.0015, 0.0429, 0.0, 0.0, 0.0, 0.0, 0.0777, 0.8779"; -//string gasfile = "Pa"; +//string gasfile = "Pa"; //string speciesName = "O, O2, NO, N, NO+, C, C2, CO, CO2, CN, N2, e-"; //string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.767, 0.0"; -//string gasfile = "Combustion-12"; +//string gasfile = "Combustion-12"; //string speciesName = "O, O2, NO, N, C, CO, CO2, H, H2, OH, H2O, N2"; //string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.767"; //string gasfile = "Gas-Mixture"; -//string speciesName ="SpeciesA, SpeciesB"; +//string speciesName = "SpeciesA, SpeciesB"; //string initMassFraction = "1.0, 0.0"; int nSutherland = 0; double gamaSpeciesA = 1.4; @@ -1173,9 +1196,17 @@ double molecularWeightSpeciesB = 30.0; //string speciesName = "O2, N2"; //string initMassFraction = "1.0, 0.0"; +int nFraction = 0; int nContinueModel = 0; int nChemicalFlowStep = 0; int ifStartFromPerfectGasResults = 0; +int isUseNoneqCond = 0; +double frozenCondition = 0.01; + +int nLeakageMonitor = 0; +double totalLeakageVolume = 1000.0; +double monitorThresholdValue = 0.05; +double sprayFactor = 0.0; ######################################################################### // Multi-Grid parameters. @@ -1196,7 +1227,6 @@ int ifStartFromPerfectGasResults = 0; // 1 -- zero order. // 2 -- first-order. (default) // mgCorrectionLimit: Multi-grid correction limit. - int nMGLevel = 1; int MGCoarsestIteration = 1; int MGPreIteration = 1; @@ -1218,20 +1248,20 @@ int ismooth_turb = 0; int SAProductType = 2; // ----------------- Overset Grid parameter ----------------------------- -int codeOfDigHoles = 1; -int codeOfTurbulentModel = 0; -string masterFileName = "./grid/searchFile.inp"; -string holeBasicFileName = "./grid/holeBasicFile.inp"; -string holeFullFileName = "./grid/holeFullFile.dat"; -string linkFileName = "./grid/topology.dat"; -string zoneInverseFileName = "./grid/zoneInverseMapping.inp"; +int codeOfDigHoles = 1; +int codeOfTurbulentModel = 0; +string masterFileName = "./grid/searchFile.inp"; +string holeBasicFileName = "./grid/holeBasicFile.inp"; +string holeFullFileName = "./grid/holeFullFile.dat"; +string linkFileName = "./grid/topology.dat"; +string zoneInverseFileName = "./grid/zoneInverseMapping.inp"; -######################################################################### -# High Order Struct Solver # -######################################################################### +#************************************************************************ +# High Order Struct Solver * +#************************************************************************ // isFVMOrFDM: -// 0 -- NSSolverStruct using Finite Volume Method. -// 1 -- NSSolverStruct using Finite Differ Method. +// 0 -- NSSolverStruct using Finite Volume Method. +// 1 -- NSSolverStruct using Finite Differ Method. // SolverStructOrder: Spatial discretisation order of NS equations with struct grid. // <= 2 -- finite volume method. // >= 3 -- finite difference order. (to be completed) @@ -1273,30 +1303,48 @@ int allReduceStep = 1; // codeOfOversetGrid: Overlapping(overset) grid or not. // 0 -- NON-overlapping grid. // 1 -- Overlapping grid. -// oversetInterpolationMethod: the method of overset interpolation while field simulation +// oversetInterpolationMethod: the method of overset interpolation while field simulation. // 0 -- set the acceptor cell value by donor cell value. // 1 -- set the acceptor cell value by distance weight of donor cell value. - -int codeOfOversetGrid = 0; -int oversetInterpolationMethod = 0; -int readOversetFileOrNot = 0; -int symetryOrNot = 0; -int readInAuxiliaryInnerGrid = 0; -int readInAuxiliaryOuterGrid = 0; -int readInSklFileOrNot = 0; -string auxiliaryInnerGrid0 = "./grid/aux-upper.fts"; -string auxiliaryInnerGrid1 = "./grid/aux-lower.fts"; -string auxiliaryInnerGrid2 = ""; -string oversetGridFileName = "./grid/iblank.ovs"; -double walldistMainZone = 1.0 -double toleranceForOversetSearch = 1.0e-3; -double toleranceForOversetBox = 1.0e-3; -int twoOrderInterpolationOrNot = 0; -int keyEnlargeOfActiveNodes = 0; -int outTecplotOverset = 0; -int outPutOversetVisualization = 0; - -int numberOfMovingBodies = 2; +// readOversetFileOrNo: Whether to read overset-file(.ovs) that has been generated. +// 0 -- no. +// 1 -- yes. +// symetryOrNot: If there exist symetryplanes(XY plane, the coordinate of Z direction is 0) in +// the current overset grid(only for three dimension). +// 0 -- no. +// 1 -- yes. +// readInAuxiliaryInnerGrid: Whether to read auxiliary inner grid. +// 0 -- no. +// 1 -- yes. +// walldistMainZone: The initial value of background grid which does not exist wall boundary condition. +// toleranceForOversetSearch: The tolerance of overset searching zone to judge whether the obtained node is in the current computing cell. +// toleranceForOversetBox: The tolerance of building the minimum box of computing cells in the overlapping region. +// twoOrderInterpolationOrNot: The number of interpolated cell layers in the overlapping boundary. +// 0 -- one layer. +// 1 -- two layers. +// keyEnlargeOfActiveNodes: The number of enlarged overset-boundary layers in the buffer region. +// outTecplotOverset: Whether to dump out the flowfield data after the progress of overset configure. +// 0 -- no. +// 1 -- yes. +int codeOfOversetGrid = 0; +int oversetInterpolationMethod = 0; +int readOversetFileOrNot = 0; +int symetryOrNot = 0; +int readInAuxiliaryInnerGrid = 0; +int readInAuxiliaryOuterGrid = 0; +int readInSklFileOrNot = 0; +string auxiliaryInnerGrid0 = "./grid/aux-upper.fts"; +string auxiliaryInnerGrid1 = "./grid/aux-lower.fts"; +string auxiliaryInnerGrid2 = ""; +string oversetGridFileName = "./grid/iblank.ovs"; +double walldistMainZone = 1.0 +double toleranceForOversetSearch = 1.0e-3; +double toleranceForOversetBox = 1.0e-3; +int twoOrderInterpolationOrNot = 0; +int keyEnlargeOfActiveNodes = 0; +int outTecplotOverset = 0; +int outPutOversetVisualization = 0; +int numberOfMovingBodies = 2; // ----------------- ALE configuration ------------------------------ int codeOfAleModel = 0; @@ -1306,36 +1354,42 @@ double referenceLength = 1.0; double referenceVelocity = 1.0; double referenceDensity = 1.0; -int strategyForFaceNormalVelocity = 0; //0-By Sweeping volume; 1-By face center 1st; 2-By face center 2nd; -int strategyForGCLSource = 0; //0-present; 1-Ahn; +int strategyForFaceNormalVelocity = 0; // 0-By Sweeping volume; 1-By face center 1st; 2-By face center 2nd. +int strategyForGCLSource = 0; // 0-present; 1-Ahn. -//0:1st-Admas-Bashforth; 1:2nd-Admas-Bashforth; 2:1st-Implicit-Euler; 3:2nd-Implicit Euler; 4:2nd-Adams-Moulton; 5:3rd-Adams-Moulton +// 0: 1st-Admas-Bashforth; 1: 2nd-Admas-Bashforth; 2: 1st-Implicit-Euler; 3: 2nd-Implicit Euler; 4: 2nd-Adams-Moulton; 5: 3rd-Adams-Moulton. int methodForKineticEquation = 0; double relaxParameterOfKinetic = 1.0; -######################################################################### -# motive information # -######################################################################### +#************************************************************************ +# motive information * +#************************************************************************ int numberOfMovingBodies = 1; ############################## body0 ############################## -//mass of parts -double mass_0 = 1.0; -//mass matrix of parts Ixx Iyy Izz Ixy Ixz Iyz -double massMatrix_0[] = 1e-7, 1e-6, 1e-6, 0.0, 0.0, 0.0; -//initial six DOF position information of parts. xc yc zc -double massCenter_0[] = 0.0 , 0.0, 0.0; -//initial six DOF position information of parts. angleX angleY angleZ -double attitudeAngle_0[] = 0.0 , 0.0, 0.0; -//initial six DOF move information of parts. vc vy vz -double massCenterVelocity_0[] = 0.0, 0.0, 0.0; -//initial six DOF move information of parts. omigX omigY omigZ -double angularVelocity_0[] = 0.0, 0.0, 0.0; -//the object that the parts belong to. -int fartherIndex_0 = -1; -//the assembly position of the parts. xc yc zc angleX angleY angleZ -double configPamameter_0[] = 0.0 ,0.0 ,0.0 ,0.0 ,0.0 ,0.0; -//the move pattern of the parts. +// mass of parts. +double mass_0 = 1.0; +// gravity of parts (along negative direction in Y-axis, eg. 9.8). +double gravity_0 = 0.0; +// mass matrix of parts Ixx Iyy Izz Ixy Ixz Iyz. +double massMatrix_0[] = 1e-7, 1e-6, 1e-6, 0.0, 0.0, 0.0; +// initial six DOF position information of parts. xc yc zc. +double massCenter_0[] = 0.0, 0.0, 0.0; +// if reset mass center while restart. +int resetMassCenter_0 = 0; +// position offset of parts. dx dy dz. +double massCenterDxyz_0[] = 0.0, 0.0, 0.0; +// initial six DOF position information of parts. angleX angleY angleZ. +double attitudeAngle_0[] = 0.0, 0.0, 0.0; +// initial six DOF move information of parts. vc vy vz. +double massCenterVelocity_0[] = 0.0, 0.0, 0.0; +// initial six DOF move information of parts. omigX omigY omigZ. +double angularVelocity_0[] = 0.0, 0.0, 0.0; +// the object that the parts belong to. +int fartherIndex_0 = -1; +// the assembly position of the parts. xc yc zc angleX angleY angleZ. +double configPamameter_0[] = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0; +// the move pattern of the parts. // -1 given motion partten. // 0 still. // 1 six DOF motion. @@ -1346,51 +1400,68 @@ double configPamameter_0[] = 0.0 ,0.0 ,0.0 ,0.0 ,0.0 // 14 forced pitch motion. // 15 forced yaw motion. // 16 forced roll motion. -int RBDMethod_0 = 0; -double amplitude_0 = 0.0; -double reduceFrequency_0 = 0.0; -//direction of rotation +int RBDMethod_0 = 0; +double amplitude_0 = 0.0; +double reduceFrequency_0 = 0.0; +// direction of rotation. // 1 -- clockwise from the point of view along the positive x axis. // -1 -- anticlockwise from the point of view along the positive x axis. -int direction_0 = -1; -double rotateFrequency_0 = 0.0; -//string uDFSixDofFileName_0 = "./Bin/UDFSixDof.Parameter"; -//additional force (system axis) fX fY fZ -double addedForce_0[] = 0.0 ,0.0 ,0.0 ; -//additional moment of Force (system axis) mX mY mZ -double addedMoment_0[] = 0.0 ,0.0 ,0.0 ; -//the deformation method of the parts. -int morphing_0 = 0; - -// post indentify -int integralOrder = 4; +int direction_0 = -1; +double rotateFrequency_0 = 0.0; +//string uDFSixDofFileName_0 = "./Bin/UDFSixDof.Parameter"; +// dimensional physical time for additional force(s). +double addedForceTime_0[] = 0.0; +// additional force(inertia system) fX fY fZ. +double addedForce_0[] = 0.0, 0.0, 0.0; +// additional moment(inertia system) mX mY mZ. +double addedMoment_0[] = 0.0, 0.0, 0.0; +// the deformation method of the parts. +int morphing_0 = 0; +// post indentify. +int integralOrder = 4; // ---------------- ATP read -------------------------------------------- -//@int inflowParaType = 0; +//@int inflowParaType = 0; //@double refReNumber = 6.5e6; //@double refDimensionalTemperature = 288.15; //@double freestream_vibration_temperature = 300.00; -//@double refDimensionalPressure = 0; -//@double height = 0; -//@int nsubsonicInlet = 0; -//@int nsubsonicOutlet = 0; -//@string inLetFileName = "./bin/subsonicInlet.hypara"; -//@string outLetFileName = "./bin/subsonicOutlet.hypara"; +//@double refDimensionalPressure = 0; +//@double height = 0; +//@int nsubsonicInlet = 0; +//@int nsubsonicOutlet = 0; +//@string inLetFileName = "./bin/subsonicInlet.hypara"; +//@string outLetFileName = "./bin/subsonicOutlet.hypara"; //@double refDimensionalVelocity = 0; //@double refDimensionalDensity = 0; - -######################################################################### -# Old Parameter # -######################################################################### +//@string weatherDataFilePath = "./WRFData/"; +//@double longitude = 110.95 +//@double latitude = 19.61; +#************************************************************************ +# Old Parameter * +#************************************************************************ int isPlotVolumeField = 0; +#************************************************************************ +# partial flow field setting Parameter * +#************************************************************************ +//int nPartialParameter = 0; // 0/1/2 +//int nNumberOfPartialField = 0; // +//int nStartGridIndex[] = [0]; +//int nEndGridIndex[] = [0]; -######################################################################### -# Incompressible Parameter # -######################################################################### +//double partialCFL[] = [0.0]; +//double partialSpeedCoef[] = [0.0]; +//double partialSpeed[] = [0.0]; +//double partialAttackd[] = [0.0]; +//double partialSlide[] = [0.0]; +//double partialPressure[] = [0.0]; +//double partialTemperature[] = [0.0]; +//double partialMassFractions[] = [0.0]; +#************************************************************************ +# Incompressible Parameter * +#************************************************************************ int isSolveEnergyEquation = 0; int isSolveTurbEquation = 0; -int isSolveSpeciesEquation = 0; - +int isSolveSpeciesEquation = 0; \ No newline at end of file diff --git a/A10_ThreeD_CHNT_SST_Struct_16CPU/bin/grid_para.hypara b/A10_ThreeD_CHNT_SST_Struct_16CPU/bin/grid_para.hypara index 8c9c2a3..d401594 100644 --- a/A10_ThreeD_CHNT_SST_Struct_16CPU/bin/grid_para.hypara +++ b/A10_ThreeD_CHNT_SST_Struct_16CPU/bin/grid_para.hypara @@ -4,9 +4,12 @@ // gridtype: Grid type for generation, conversion, reconstruction, merging. // 0 -- Unstructured grid. // 1 -- Structured grid. -// axisup: Type of Cartisien coordinates system, used in grid conversion. -// 1 -- Y upward. (default) -// 2 -- Z upward. +// nAxisRotateTimes: number of axis rotating times, zero (default) meaning without rotating. +// axisRotateOrder : axis rotating order. +// 1 -- X-axis. +// 2 -- Y-axis. +// 3 -- Z-axis. +// axisRotateAngles: axis rotating angles (degree), which are corresponding to the axis rotating order. // from_gtype: Type of grid data type in grid conversion process. // -1 -- MULTI_TYPE. // 1 -- PHengLEI, *.fts. @@ -18,7 +21,9 @@ // 7 -- Hybrid, include both of unstructured and structured grid, *.fts. // 8 -- GMSH, *.msh. int gridtype = 1; -int axisup = 1; +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; int from_gtype = 3; ######################################################################### diff --git a/A11_ThreeD_Sphere_Laminar_Ma10_Struct/bin/cfd_para.hypara b/A11_ThreeD_Sphere_Laminar_Ma10_Struct/bin/cfd_para.hypara index c344658..f903a5a 100644 --- a/A11_ThreeD_Sphere_Laminar_Ma10_Struct/bin/cfd_para.hypara +++ b/A11_ThreeD_Sphere_Laminar_Ma10_Struct/bin/cfd_para.hypara @@ -8,23 +8,24 @@ // Platform for Hybrid Engineering Simulation of Flows + // China Aerodynamics Research and Development Center + // (C) Copyright, Since 2010 + +// PHengLEI 2212 + //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ########################################################################### # Default parameters for Grid conversion # ########################################################################### // gridtype: Grid type for generation, conversion, reconstruction, merging. -// 0 -- Unstructured grid. -// 1 -- Structured grid. -// 2 -- Hybrid grid, include both of unstructured and structured grid. -// gridobj: Task type of grid treatment. -// 0 -- Grid generation of typical case, such as cylinder, flat plate, etc. -// 1 -- Grid conversion, from other grid data to PHenglEI, such as Fluent, CGNS. -// 2 -- Grid refinement. -// 3 -- Grid merging, merge two blocks into one block. -// 4 -- Grid deformation, achieve unstructured grid deformation. -// 5 -- Grid repairing, repair the original grid in order to remove the negative volume cells. -// 6 -- Grid mirroring, mirror a symmetry grid to whole grid. -// 7 -- Grid type change, convert structured grid to unstructured grid. +// 0 -- Unstructured grid. +// 1 -- Structured grid. +// 2 -- Hybrid grid, include both of unstructured and structured grid. +// gridobj: Task type of grid treatment. +// 0 -- Grid generation of typical case, such as cylinder, flat plate, etc. +// 1 -- Grid conversion, from other grid data to PHenglEI, such as Fluent, CGNS. +// 2 -- Grid refinement. +// 3 -- Grid merging, merge two blocks into one block. +// 4 -- Grid deformation, achieve unstructured grid deformation. +// 5 -- Grid repairing, repair the original grid in order to remove the negative volume cells. +// 6 -- Grid mirroring, mirror a symmetry grid to whole grid. +// 7 -- Grid type change, convert structured grid to unstructured grid. // multiblock: Multi-block grid or not, only for structured grid conversion. // 0 -- Not. // 1 -- Yes. @@ -46,19 +47,24 @@ int gridobj = 1; int multiblock = 0; int iadapt = 0; int SymmetryFaceVector = 1; - int gridReorder = 0; int faceReorderMethod = 0; -// axisup: Type of Cartisien coordinates system, used in grid conversion. -// 1 -- Y upward. (default) -// 2 -- Z upward. -int axisup = 1; +// nAxisRotateTimes: number of axis rotating times, zero (default) meaning without rotating. +// axisRotateOrder : axis rotating order. +// 1 -- X-axis. +// 2 -- Y-axis. +// 3 -- Z-axis. +// axisRotateAngles: axis rotating angles (degree), which are corresponding to the axis rotating order. +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; // omit_no_bound_bc: What's boundary condition for the type of "no_boundary_condition". // 0 -- Interface. (default) // 1 -- Physical boundary condition, used in Hybrid solver. int omit_no_bound_bc = 0; +int omitRepeatInterface = 1; //----------------------------------------------------------------------- # Grid data type # @@ -87,10 +93,9 @@ int dumpOldGrid = 0; // from_gfile: path of original data file for unstructure grid convert from. // out_gfile: path of target file for grid convert to, *.fts type of file usually. int numberOfGridFile = 1; -string from_gfile = "./grid/rae2822_hybrid2d.cas"; -string from_gfile1= ""; - -string out_gfile = "./grid/flat_laminr_133_85_2d.fts"; +string from_gfile = "./grid/rae2822_hybrid2d.cas"; +string from_gfile1 = ""; +string out_gfile = "./grid/flat_laminr_133_85_2d.fts"; // ----------------- some advanced choices ------------------------------ // iunsteady: The Grid is for unsteady simulation or not. @@ -103,9 +108,9 @@ int fileformat = 0; // Parameters for hybrid solver. // mixgrid_uns: path of unstructure grid file for hybrid solver, *.fts type. -// mixgrid_str: path of structure grid file for hybrid solver, *.fts type. -string mixgrid_uns = "./grid/rae2822_uns2d_4.fts"; -string mixgrid_str = "./grid/flat_laminr_133_85_2d.fts"; +// mixgrid_str: path of structure grid file for hybrid solver, *.fts type. +string mixgrid_uns = "./grid/rae2822_uns2d_4.fts"; +string mixgrid_str = "./grid/flat_laminr_133_85_2d.fts"; // Some parameters for structured overlapping grid. int codeOfDigHoles = 1; @@ -119,31 +124,31 @@ string zoneInverseFileName = "./oversetGridView/zoneInverseMapping.inp"; // 0 -- Not. (default) // 1 -- Yes. // geometryUnit: Geometry unit. -// 1 -- meter. -// 2 -- millimeter. -// 3 -- inch. +// 1 -- meter. +// 2 -- millimeter. +// 3 -- inch. // exclusiveCase: Parallel projection exclusive case. -// 0 -- NON case. -// 1 -- JSM-C2-NPOFF case. -// 2 -- CHNT. +// 0 -- NON case. +// 1 -- JSM-C2-NPOFF case. +// 2 -- CHNT. // projectOrgPoint: If the original wall points need to be projected or not. -int anisoRefine = 0; -int geometryUnit = 1; -int isProject = 0; -int readDist = 0; -int isDeform = 0; +int anisoRefine = 0; +int geometryUnit = 1; +int isProject = 0; +int readDist = 0; +int isDeform = 0; int exclusiveCase = 0; int projectOrgPoint = 0; string geometryFileName = "./grid/jsm.igs"; // ----------------- Grid Deform Parameters ----------------------------- // deformationMethod: Grid Deform. -// 1 -- SPRING. -// 2 -- RBF. +// 1 -- SPRING. +// 2 -- RBF. // stationalGridFile: Original grid file. // visualFileName : The visualization file path of deform grid. // nDeformStep : The max deform step. -// flapAngle : The max flap angle. +// flapAngle : The max flap angle. // rotatePostionZ : Rotate postion. // rotatePostionY : Rotate postion. // gridSlice : If dump slice grid. @@ -163,10 +168,10 @@ int sliceAxis = 1; double slicePosition = 13; // ----------------- RBF Parameters ------------------------------------- -// numberOfReferenceCP : Number of reference Control Points. -// influencePara : The RBF influence radius parameter. +// numberOfReferenceCP: Number of reference Control Points. +// influencePara : The RBF influence radius parameter. int numberOfReferenceCP = 40; -double influencePara = 25.0; +double influencePara = 25.0; // ----------------- Periodic Parameters -------------------------------- // Notice: Rotational periodicity only support rotation along the X axis! @@ -178,9 +183,8 @@ double influencePara = 25.0; which only support one direction. // rotationAngle: The relative angle between two periodic face. which is recorded in degrees. - int periodicType = 0; -double translationLength[] = [0.0,0.0,0.0]; +double translationLength[] = [0.0, 0.0, 0.0]; double rotationAngle = 0.0; ######################################################################### @@ -192,7 +196,6 @@ double rotationAngle = 0.0; // 2 -- refine structured grid. // maxproc: The number of partition zones that want to be divided into. // numberOfMultifile: The number of partition grid files that want to be dumped out. - int pgridtype = 0; int maxproc = 4; int numberOfMultifile = 1; @@ -201,20 +204,20 @@ int numberOfMultifile = 1; // 0 -- Not. // 1 -- Yes. // blockIndexOfMark: the block index of mark, only for structured grid partition. -// cellIndexOfMark: the cell index of mark, only for structured grid partition. +// cellIndexOfMark : the cell index of mark, only for structured grid partition. int traceMark = 0; int blockIndexOfMark = 0; -int cellIndexOfMark[] = [185,30,1]; +int cellIndexOfMark[] = [185, 30, 1]; -// parallel Strategy: -//! -# 0 : each zone is assigned to the one that defined in grid partition procedure. -//! -# 1 : random assigned for each zone or by some else ways. -int parallelStrategy = 1; +// parallelStrategy: +// 0 -- each zone is assigned to the one that defined in grid partition procedure. +// 1 -- random assigned for each zone or by some else ways. +int parallelStrategy = 1; //----------------------------------------------------------------------- # File path # //----------------------------------------------------------------------- -// original_grid_file: Original grid file that want to be divided(PHengLEI type, *.fts). +// original_grid_file: Original grid file that want to be divided(PHengLEI type, *.fts). // partition_grid_file: Target partition grid file(PHengLEI type, *.fts). string original_grid_file = "./grid/sphere_mixed.fts"; string partition_grid_file = "./grid/sphere_mixed__4.fts"; @@ -232,11 +235,10 @@ string partition_grid_file = "./grid/sphere_mixed__4.fts"; // 1 -- perfect balance. // maxproc -- perfect imbalance. // 1.05 -- recommended. - int omit_no_bound_bc = 0; int npartmethod = 1; int parallelPartitionMethod = 2; -double parmetisBalance = 1.05; +double parmetisBalance = 1.05; // numberOfMultigrid: Number of multi-grid levels, ONLY used for structured grid. // 1 -- single level. @@ -248,29 +250,35 @@ int numberOfMultigrid = 1; # Default parameters for CFD simulation # ######################################################################### // maxSimuStep: The max simulation step, don't care simulation is restart or not. -// intervalStepFlow: The step intervals for flow variables file 'flow.dat' saved. -// intervalStepPlot: The step intervals for tecplot visual file 'tecflow.dat' saved. +// intervalStepFlow: The step intervals for flow variables file 'flow.dat' saved. +// intervalStepPlot: The step intervals for tecplot visual file 'tecflow.dat' saved. // intervalStepSample: The step intervals for monitored probes variables file 'sample.dat' saved. -// intervalStepForce: The step intervals for aerodynamics coefficients file 'aircoef.dat' saved. -// intervalStepRes: The step intervals for residual file 'res.dat' saved. -// ifLowSpeedPrecon: Precondition process to accelerate convergence for low speed flow. -// 0 -- no precondition process. (default, mach > 0.3) -// 1 -- carry out precondition process. (mach number <= 0.3) - -int maxSimuStep = 20000; - -int intervalStepFlow = 1000; -int intervalStepPlot = 1000; +// intervalStepForce: The step intervals for aerodynamics coefficients file 'aircoef.dat' saved. +// intervalStepRes: The step intervals for residual file 'res.dat' saved. +int maxSimuStep = 20000; +int intervalStepFlow = 1000; +int intervalStepPlot = 1000; int intervalStepSample = 1000; -int intervalStepForce = 100; -int intervalStepRes = 10; -int ifLowSpeedPrecon = 0; +int intervalStepForce = 100; +int intervalStepRes = 10; // compressible: // 0 -- incompressible flow. // 1 -- compressible flow. (default) int compressible = 1; +// ifLowSpeedPrecon: Precondition process to accelerate convergence for low speed flow. +// 0 -- no precondition process. (default, mach > 0.3) +// 1 -- carry out precondition process. (mach number <= 0.3) +// Kprec: The coefficient K for the cut-off velocity. +// 1.0~3.0 is suggested. (default, 3.0) +// preconFarfieldBCMethod: The precondition method for farfield boundary condition. +// 0 -- precondition far-field boundary based on riemann invariants. +// 1 -- Turkel's simplified far-field boundary condition. +int ifLowSpeedPrecon = 0; +double Kprec = 3.0; +int preconFarfieldBCMethod = 1; + //----------------------------------------------------------------------- # CFD Control Parameter # //----------------------------------------------------------------------- @@ -281,33 +289,36 @@ int compressible = 1; // 0 -- the nondimensional conditions. // 1 -- the flight conditions. // 2 -- the experiment conditions. -// 3 -- the subsonic boundary conditions. +// 3 -- the subsonic boundary conditions. (Useless!) // 4 -- the condition that the velocity, temperature and density are given. // 5 -- the condition that the velocity, temperature and pressure are given. +//flowInitMethod: Flow field initialization method. +// 0 -- The entire flow field is initialized according to Infinite velocity. +// 1 -- The velocity near the wall is initialized according to the boundary layer of the plate. // refReNumber: Reynolds number, which is based unit length, unit of 1/m. // refDimensionalTemperature: Dimensional reference temperature, or the total temperature only for the experiment condition. // freestream_vibration_temperature: Dimensional freestream vibration temperature. // refDimensionalPressure: Dimensional reference pressure, or the total pressure only for the experiment condition. // height: Fly height, unit of km. // wallTemperature: Temprature of the solid wall, minus value is for adiabatic boundary condition. -// gridScaleFactor: The customizable unit of the grid, default value is 1.0 for meter.Common dimensions like: -// 1 dm = 0.1 m. -// 1 cm = 0.01 m. -// 1 mm = 0.001m. -// 1 inch = 0.0254m. -// 1 foot = 12 inches = 0.3048m. -// 1 yard = 3 feet = 0.9144m. +// gridScaleFactor: The customizable unit of the grid, default value is 1.0 for meter. Common dimensions like: +// 1 dm = 0.1 m. +// 1 cm = 0.01 m. +// 1 mm = 0.001 m. +// 1 inch = 0.0254 m. +// 1 foot = 12 inches = 0.3048 m. +// 1 yard = 3 feet = 0.9144 m. // forceReferenceLength, forceReferenceLengthSpanWise, forceReferenceArea: Reference length, SpanWise length and area, independent of grid unit. // TorqueRefX, TorqueRefY, TorqueRefZ: Reference point, independent of grid unit. // radiationCoef: The radiation coefficient on wall, it is used to compute the radiation heat flux on wall when the boundary // condition is radiation equilibrium temperature, and 0.8 is the default value. -// refMolecularWeight : the reference molecular weight of gas used for perfect gas. The unit is g/mol. +// refMolecularWeight: the reference molecular weight of gas used for perfect gas. The unit is g/mol. // Generally, the gas is air. Sometimes, it is experiment gas, such as Nitrogen, Argon, and so on. - -int directionMethod = 0; +int directionMethod = 0; double refMachNumber = 0.73; double attackd = 2.79; double angleSlide = 0.00; +int flowInitMethod = 0; int inflowParaType = 0; double refReNumber = 6.5e6; @@ -321,29 +332,27 @@ double freestream_vibration_temperature = 300.00; //double refDimensionalTemperature = 6051.024; // The total temperature, T*(1+(refGama-1)*M*M/2). //double refDimensionalPressure = 4.299696E09; // The total pressure, p*(T0/T)^(refGama/(refGama-1)). -//int inflowParaType = 3; -//int nsubsonicInlet = 1; -//int nsubsonicOutlet = 1; -//string inLetFileName = "./bin/subsonicInlet.hypara"; -//string outLetFileName = "./bin/subsonicOutlet.hypara"; -//double refDimensionalTemperature = 288.144; -//double refDimensionalPressure = 1.01313E05; - -//The velocity, temperature and density are fixed. +// The velocity, temperature and density are fixed. //int inflowParaType = 4; //double refDimensionalVelocity = 1000.0; -//double refDimensionalDensity = 1.0e3; +//double refDimensionalDensity = 1.0e3; -//The velocity, temperature and pressure are fixed. +// The velocity, temperature and pressure are fixed. //int inflowParaType = 5; //double refDimensionalVelocity = 1000.0; //double refDimensionalPressure = 1.0e5; -//The MachNumber, temperature and pressure are fixed. +// The MachNumber, temperature and pressure are fixed. //int inflowParaType = 6; -//double refDimensionalTemperature = 293; +//double refDimensionalTemperature = 293.0; //double refDimensionalPressure = 8886.06; +// The velocity, temperature and pressure are read from file. +//int inflowParaType = 7; +//string weatherDataFilePath = "./WRFData/"; +//double longitude = 110.95 +//double latitude = 19.61; + double wallTemperature = -1.0; double radiationCoef = 0.8; @@ -357,41 +366,41 @@ double forceReferenceArea = 1.0; // unit of meter^2. double TorqueRefX = 0.0; // unit of meter. double TorqueRefY = 0.0; // unit of meter. double TorqueRefZ = 0.0; // unit of meter. +double knudsenLength = 1.0; // unit of meter. double refMolecularWeight = 28.9644; // unit of g/mol. //----------------------------------------------------------------------- # Spatial Discretisation # //----------------------------------------------------------------------- -#******************************************************************* -# Struct Solver * -#******************************************************************* +#************************************************************************ +# Struct Solver * +#************************************************************************ // inviscidSchemeName: Spatial discretisation scheme of struct grid. // Using this when solve structered grid or hybrid. -// -- "vanleer", "steger", "hlle", "lax_f". -// -- "roe", "modified_roe". +// -- "vanleer", "steger", "hlle", "lax_f", +// -- "roe", "modified_roe", // -- "ausm+", "ausm+w", "ausm+up", "ausmdv", "ausmpw", "ausmpw+". // isWennScheme: If using WENN Scheme of struct grid. -// 0 -- NO. (default) -// 1 -- Yes. +// 0 -- NO. (default) +// 1 -- Yes. // str_limiter_name: Limiter of struct grid. -// -- "vanalbada", "vanleer", "minmod", "smooth", "minvan", "3rdsmooth", "3rd_minmod_smooth". -// -- "nolim", no limiter. -// -- "vanalbada_clz", clz supersonic version. -// -- "weno3_js", "wenn3_prm211", "wenn3_zm", "wenn3_zes2", "wenn3_zes3" - +// -- "vanalbada", "vanleer", "minmod", "smooth", "minvan", "3rdsmooth", "3rd_minmod_smooth", +// -- "nolim", no limiter, +// -- "vanalbada_clz", clz supersonic version, +// -- "weno3_js", "wenn3_prm211", "wenn3_zm", "wenn3_zes2", "wenn3_zes3". string inviscidSchemeName = "roe"; int isWennScheme = 0; -string str_limiter_name = "vanalbada"; +string str_limiter_name = "vanalbada"; -#******************************************************************* -# UnStruct Solver or Common * -#******************************************************************* +#************************************************************************ +# UnStruct Solver or Common * +#************************************************************************ // viscousType: Viscous model. -// 0 -- Euler. -// 1 -- Lamilar. -// 2 -- Algebraic. -// 3 -- 1eq turbulent. -// 4 -- 2eq turbulent. +// 0 -- Euler. +// 1 -- Lamilar. +// 2 -- Algebraic. +// 3 -- 1eq turbulent. +// 4 -- 2eq turbulent. // viscousName: Laminar or tubulent model. // -- "0eq-bl". // -- "1eq-sa". @@ -410,16 +419,16 @@ string str_limiter_name = "vanalbada"; // 3 -- IDDES. // uns_scheme_name: Spatial discretisation scheme of Unstruct grid. // Using this when solve Unstructered grid or hybrid. -// -- "vanleer", "roe", "steger", "kfvs", "lax_f", "hlle". +// -- "vanleer", "roe", "GMRESRoe", "GMRESSteger", "steger", "kfvs", "lax_f", "hlle", // -- "ausm+", "ausmdv", "ausm+w", "ausmpw", "ausmpw+". // uns_limiter_name: Limiter of Unstruct grid. -// -- "barth", "vencat", "vanleer", "minmod". -// -- "vanalbada", "smooth", "nnd", "lpz", "1st". +// -- "barth", "vencat", "vanleer", "minmod", +// -- "vanalbada", "smooth", "nnd", "lpz", "1st", // -- "nolim", no limiter. // uns_vis_name: Discretisation method of viscous term. // -- "std", "test", "aver", "new1", "new2". // gradientName: Gradient reconstruction method. -// -- "default", "ggcell", "ggnode", "lsq". +// -- "default", "ggcell", "ggnode", "lsq". // ivencat: Variation of vencat limiter. // 0 -- org method, it is independent of grid scale. // 1 -- new method, it is dependent of grid scale. @@ -442,18 +451,18 @@ string str_limiter_name = "vanalbada"; // 3 -- Harten type, which is default used. // roeEntropyScale: Entropy fix (correction) coefficient scale, default is 1.0. // It is used to scale the default Roe entropy fix coefficients. -// AusmpwPlusLimiter: A Limiter to make "function w" not change acutely in AusmpwPlus scheme, default is 1.0 +// AusmpwPlusLimiter: A Limiter to make "function w" not change acutely in AusmpwPlus scheme, default is 1.0. -//int viscousType = 0; +//int viscousType = 0; //string viscousName = "Euler"; -//int viscousType = 1; +//int viscousType = 1; //string viscousName = "laminar"; -int viscousType = 3; +int viscousType = 3; string viscousName = "1eq-sa"; -//int viscousType = 4; +//int viscousType = 4; //string viscousName = "2eq-kw-menter-sst"; int DESType = 0; @@ -463,7 +472,7 @@ string uns_limiter_name = "vencat"; string uns_vis_name = "test"; string gradientName = "ggnode"; -int ivencat = 7; +int ivencat = 7; double venkatCoeff = 5.0; int reconmeth = 1; int limitVariables = 0; @@ -475,9 +484,9 @@ double roeEntropyScale = 1.0; double AusmpwPlusLimiter = 1.0; -//----------------------------------------------------------------------- -# Temporal Discretisation # -//----------------------------------------------------------------------- +#************************************************************************ +# Temporal Discretisation * +#************************************************************************ // iunsteady: Steady or unsteady. // 0 -- steady. // 1 -- unsteay. @@ -490,51 +499,57 @@ double AusmpwPlusLimiter = 1.0; // statisticalTimePeriod: Used as time period of statistic analysis. // when the value is negative, time period is treated as infinite. // statisticMethod: Statistic reynolds stress method. -// 0 -- tau = - ^2 -// 1 -- tau = +// 0 -- tau = - ^2 +// 1 -- tau = // min_sub_iter: The min sub iteration of unsteady simulation. // max_sub_iter: The max sub iteration of unsteady simulation. // tol_sub_iter: The tolerance of sub iteration of unsteady simulation. // tscheme: Temporal Discretisation method. -// 1 -- Runge-Kutta Multi-State. -// 2 -- Point implicit. -// 3 -- Full implicit. -// 4 -- LU-SGS. -// 5 -- Block LU-SGS. -// 6 -- Jacobian iteration. -// 7 -- Line LU-SGS. -// 8 -- Matrix LU-SGS. +// 1 -- Runge-Kutta Multi-State. +// 2 -- Point implicit. +// 3 -- Full implicit. +// 4 -- LU-SGS. +// 5 -- Block LU-SGS. +// 6 -- Jacobian iteration. +// 7 -- Line LU-SGS. +// 8 -- Matrix LU-SGS. +// 9 -- GMRES. // iSimplifyViscousTerm: Simplify the computation of viscous term in the Block LU-SGS method. The default value assigns 1 that could speed up the computation. // Otherwise, the viscous Jacobian matrix Mv should be computed that will increase the memory and time in iteration of the BLUSGS method. // CFLStart: Started cfl number. // CFLEnd: End cfl number. // CFLVaryStep: The number of step when cfl increase from CFLStart to CFLEnd. +// GMRESCFLScale : CFL = CFLStart * GMRESCFLScal^iteration. +// OriginalTscheme : Used for LUSGS and GMres hybrid computing. +// useLUSGSprecond: Initialize flow field for GMRES. +// 0 --Initialize by first order Jacobian matrix. +// 1 --Initialize by LUSGS. +// GMRESInitStep : the number of iteration step of irst order Jacobian matrix or LUSGS for initialize flow field. // ktmax: Dtratio. dt[i] = MIN(dt[i], ktmax * dtmin / vol[i]) // swapDq: Communication dq between forward/backward sweep of LUSGS or not, default is 0. // nLUSGSSweeps: Sub iteration of LU-SGS or Block LU-SGS. // LUSGSTolerance: Sub iter tolerance of LU-SGS or Block LU-SGS. // ifLocalTimeStep: Time step method. -// 0 --Local. -// 1 --Global. +// 0 --Local. +// 1 --Global. // isUseLocalCFL: use variable number of CFL or not. -// 0 -- global unified CFL number. -// 1 -- local CFL number. +// 0 -- global unified CFL number. +// 1 -- local CFL number. // isUsePreTwall: use the previous temperatures on wall. 1 indicates yes, and 0 indicates no. // visl_min: Minimum value of laminar viscosity coefficient. // turbCFLScale: Turbulence model cfl number factor. // codeOfAleModel: Arbitrary Lagrangian-Eulerian method. -// 0 -- no ALE method. -// 1 -- ALE method for non-moving grids. -// 2 -- ALE method for moving grids. -// 3 -- ALE method for deforming grids. +// 0 -- no ALE method. +// 1 -- ALE method for non-moving grids. +// 2 -- ALE method for moving grids. +// 3 -- ALE method for deforming grids. // wallFunctionType: The type of wall function to implement. -// 0 -- no wall function. (default) -// 1 -- standard wall function. -// 2 -- Pab3D wall function. +// 0 -- no wall function. (default) +// 1 -- standard wall function. +// 2 -- Pab3D wall function. // RKStage: The number of Runge-Kutta step. // lamda: Cofficient of Runge-Kutta step. - -int iunsteady = 0; +int iunsteady = 0; double physicalTimeStep = 0.01; double physicalTimeStepDimensional = -0.001; int ifStartFromSteadyResults = 0; @@ -543,39 +558,42 @@ int ifStaticsReynoldsStress = 0; int startStatisticStep = 800000; double statisticalTimePeriod = -1.0; int statisticMethod = 0; -int linearTwoStepMethods = 1; // 1--BDF1; 2--C-N; 3--BDF2; +int linearTwoStepMethods = 1; // 1--BDF1; 2--C-N; 3--BDF2. int methodOfDualTime = 3; int min_sub_iter = 50; int max_sub_iter = 50; double tol_sub_iter = 0.01; -int tscheme = 4; +int tscheme = 4; int iSimplifyViscousTerm = 1; int ifLocalTimeStep = 0; int isUseLocalCFL = 0; int isUsePreTwall = 0; -double CFLStart = 0.01; -double CFLEnd = 10.0; -int CFLVaryStep = 500; - +double CFLStart = 0.01; +double CFLEnd = 10.0; +int CFLVaryStep = 500; +double GMRESCFLScale = 1.0; +int OriginalTscheme = 9; +int useLUSGSprecond = 1; +int GMRESInitStep = 1000; double pMaxForCFL = 0.2; double pMinForCFL = 0.1; double deltaMaxForCFL = 0.2; double magnifyFactorForCFL = 1.1; double reduceFactorForCFL = 0.5; -double ktmax = 1.0e10; +double ktmax = 1.0e10; -int swapDq = 1; +int swapDq = 1; int nLUSGSSweeps = 1; double LUSGSTolerance = 0.01; -int order = 2; +int order = 2; double visl_min = 0.01; double turbCFLScale = 1.0; -double csrv = 2.0; +double csrv = 1.0; double timemax = 1.0e10; double dtsave = -1.0; int maxale = 10; @@ -591,10 +609,9 @@ double lamda[] = [0.5, 1.0]; //int RKStage = 4; //double lamda[] = [0.25, 0.33333333333, 0.5, 1.0]; - -//----------------------------------------------------------------------- -# File In or Out # -//----------------------------------------------------------------------- +#************************************************************************ +# File In or Out * +#************************************************************************ // numberOfGridGroups: The number of grid groups. // gridfile: The partitioned Grid file path, using relative path, // which is relative to the working directory. @@ -611,20 +628,18 @@ double lamda[] = [0.5, 1.0]; // aircoeffile: The file path to save the aerodynamic force coefficients convergence process, write data for every default (intervalStepForce) steps. // restartNSFile: The file path to write restart flowfield variables, write data for every default (intervalStepFlow) steps. // turbfile: The file path to write restart flowfield variables of turbulence , write data for every default(intervalStepFlow) steps. -// visualfile: The visualization file path of flowfield , write data for every default (intervalStepPlot) steps. +// visualfile: The visualization file path of flowfield, write data for every default (intervalStepPlot) steps. // wall_aircoefile: The file path to save flowfield variables of wall, write data for every default steps. // nDumpSurfaceInfo = 0 the "wall_varfile" write the informations including heat flux. // nDumpSurfaceInfo = 1 the "wall_varfile" write the informations without heat flux. // nIsComputeWallDist: Whether to compute the wall distance. // 0 -- Compute wall distance. // 1 -- Not compute. -// -// protectionFile0 and protectionFile1 : Two continuation file of the data protection mechanism. -// wall_heatfluxfile : The file to output the MaxHeatFlux of wall. - -int numberOfGridGroups = 1; -string gridfile = "./grid/rae2822_hybrid2d__4.fts"; -string wallTemperaturefile= ""; +// protectionFile0 and protectionFile1: Two continuation file of the data protection mechanism. +// wall_heatfluxfile: The file to output the MaxHeatFlux of wall. +int numberOfGridGroups = 1; +string gridfile = "./grid/rae2822_hybrid2d__4.fts"; +string wallTemperaturefile = ""; int nIsComputeWallDist = 0; int walldistMethod = 1; @@ -632,10 +647,12 @@ int cellMethodOrNodeMethod = 0; string resSaveFile = "results/res.dat"; string turbresfile = "results/turbres.dat"; +string transitionResFile = "results/transitionRes.dat"; string aircoeffile = "results/aircoef.dat"; string restartNSFile = "results/flow.dat"; string turbfile = "results/turb.dat"; +string transitionFile = "results/transition.dat"; string visualfile = "results/tecflow.plt"; string wall_aircoefile = "results/wall_aircoef.dat"; @@ -645,10 +662,14 @@ string protectionFile0 = "results/flow0.dat"; string protectionFile1 = "results/flow1.dat"; string wall_heatfluxfile = "results/wall_heatflux.dat"; -int nDumpSurfaceInfo = 0; -string wall_varfile = ""; +string protectionTurbFile0 = "results/turb0.dat"; +string protectionTurbFile1 = "results/turb1.dat"; -string jetDefineFile = "bin/jet.hypara"; +string protectionTransitionFile0 = "results/transition0.dat"; +string protectionTransitionFile1 = "results/transition1.dat"; + +int nDumpSurfaceInfo = 0; +string wall_varfile = ""; string sixDofFileName = "results/sixDofInfo.dat"; string derivativeFileName = "results/identify.dat"; @@ -659,7 +680,8 @@ int plotFieldType = 0; // visualfileType: The file type of visualfile. // 0 -- Tecplot binary. // 1 -- Tecplot ASCII. - +// 2 -- Ensight binary. +// 3 -- Ensight ASCII. int visualfileType = 1; // samplefileMode: The dump mode of sample file. @@ -697,21 +719,21 @@ double upperPlotFieldBox[] = [1.0 1.0 1.0]; // -- vibration temperature(Tv, 33), electron temperature(Te, 34), vibrational energy(Ev, 35), electric energy(Ee, 36), // -- number density of electron(Ne, 37), dimensioanl density(rho, 38), dimensioanl pressure(p, 39), dimensioanl temperature(T, 40), // -- gradientUx(41), gradientUy(42), gradientVx(43), gradientVy(44), streamline_u(45), streamline_v(46), streamline_w(47), -// -- transition intermittency(intermittency, 51), -transition momentum thickness reynolds(MomentumThicknessReynolds, 52), -// -- overlap iblank(iblank, 81) - -// -- specific heat ratio(gama, 56) +// -- transition intermittency(intermittency, 51), transition momentum thickness reynolds(MomentumThicknessReynolds, 52), +// -- local CFL Number(localCFL, 57), minimal CFL Number(minCFL, 58), +// -- overlap iblank(iblank, 81), +// -- specific heat ratio(gama, 56), Knudsen number(kn, 60), Damkohler number(Da, 61), vibrational nonequilibrium number(Vi, 62). // Important Warning: Array size of visualVariables MUST be equal to nVisualVariables!!! // Variables order must from small to big. //-----------the optional parameters list for the wall boundary condition---------------- // nVisualWallVariables: The number of visual variables on wall. // visualWallVariables : dumped variable types, listed as following: -// -coefficient of pressure(cp, 0), -coefficient of friction(cf, 1), yplus(2), -non-dimensional heat flux(Q_NonDim, 3), -dimensional heat flux(Q_Dim, 4), -// -pressure on wall(pw, 5), -temperature on wall(Tw, 6), -density on wall(rhow, 7), -heat flux of translational-rotational temperature term(Qtr, 8), -// -heat flux of species diffusion term(Qs, 9), -heat flux of vibrational temperature term(Qv, 10), -heat flux of electron temperature term(Qe, 11), -// -species mass fractions(Ns, 12), -x component of wall velocity(Vx, 13), -y component of wall velocity(Vy, 14), -z component of wall velocity(Vz, 15) -// -slip translational-rotational temperature(Tts, 16), -slip vibrational temperature(Tvs, 17), -slip electron temperature(Tes, 18), -absolute wall velocity(Vs, 19) -// -Stanton number(St, 20), -coefficient of heat rate(Ch, 21), -temperature jump(deltaT, 22), -Grid Reynolds number on wall(Re_w, 23) +// -- coefficient of pressure(cp, 0), coefficient of friction(cf, 1), yplus(2), non-dimensional heat flux(Q_NonDim, 3), dimensional heat flux(Q_Dim, 4), +// -- pressure on wall(pw, 5), temperature on wall(Tw, 6), density on wall(rhow, 7), heat flux of translational-rotational temperature term(Qtr, 8), +// -- heat flux of species diffusion term(Qs, 9), heat flux of vibrational temperature term(Qv, 10), heat flux of electron temperature term(Qe, 11), +// -- species mass fractions(Ns, 12), x component of wall velocity(Vx, 13), y component of wall velocity(Vy, 14), z component of wall velocity(Vz, 15), +// -- slip translational-rotational temperature(Tts, 16), slip vibrational temperature(Tvs, 17), slip electron temperature(Tes, 18), absolute wall velocity(Vs, 19), +// -- Stanton number(St, 20), coefficient of heat rate(Ch, 21), temperature jump(deltaT, 22), Grid Reynolds number on wall(Re_w, 23), Knudsen number(Kn_wall, 24). int nVisualVariables = 8; int visualVariables[] = [0, 1, 2, 3, 4, 5, 6, 15]; @@ -739,16 +761,18 @@ int dumpStandardModel = 0; // 1 -- Real cell where the probe is located. // nProbeVariables: Number of variables want to be dumped for probes monitered. // probeVariables : Variable types dumped, listed as following: -// -- density(0), u(1), v(2), w(3), pressure(4), temperature(5), mach(6). +// -- density(0), u(1), v(2), w(3), pressure(4), temperature(5), mach(6), +// -- dimensioanl_density(7), dimensioanl_u(8), dimensioanl_v(9), +// -- dimensioanl_w(10), dimensioanl_pressure(11), dimensioanl_temperature(12). // Important Warning: Array size of probeVariables MUST be equal to nProbeVariables!!! // probeVariables order must from small to big. // probeVariablesInterpolationMethod: Interpolation method used to compute the probe variables. -// 0 -- Take the value of probe's cell as probe real value. -// 1 -- Interpolation from probe's and neighbouring cell to probe. -// 2 -- Interpolation from probe's cell nodes to probe. +// 0 -- Take the value of probe's cell as probe real value. +// 1 -- Interpolation from probe's and neighbouring cell to probe. +// 2 -- Interpolation from probe's cell nodes to probe. int ifSetDataMonitor = 0; -int dataMonitorType = 0; +int dataMonitorType = 0; string probesDefineFile = "bin/probes_XYZ.dat"; //int dataMonitorType = 1; @@ -761,28 +785,26 @@ string probesDefineFile = "bin/probes_XYZ.dat"; int searchCellsMethod = 0; -int nProbeVariables = 7; -int probeVariables[] = [0, 1, 2, 3, 4, 5, 6]; -int probeVariablesInterpolationMethod = 0; -//----------------------------------------------------------------------- -# Turbulence Parameter # -//----------------------------------------------------------------------- +int nProbeVariables = 14; +int probeVariables[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]; +int probeVariablesInterpolationMethod = 0; + +#************************************************************************ +# Turbulence Parameter * +#************************************************************************ // turbInterval: Iteration number of turbulence. // kindOfTurbSource: Kinds of turbulent source. // 0 -- Original. // mod_turb_res: If modify the residuals for the cells next to the wall or not, default is 0. -// transitionType: transition model type +// transitionType: transition model type // 0 -- none. // 2 -- gama-re-theta. -// turbIntensity: (valid while greater than 0.0 ) turbulent intensity of free stream(*100) in transition -// freeturbIntensitySRModify: to use SR modify in free stream turbulent intensity decay or not - - +// turbIntensity: (valid while greater than 0.0 ) turbulent intensity of free stream(*100) in transition. +// freeturbIntensitySRModify: to use SR modify in free stream turbulent intensity decay or not. int turbInterval = 1; int turbOrderStruct = 2; int kindOfTurbSource = 0; int mod_turb_res = 0; -double turb_relax = 1.0; double freeStreamViscosity = 1.0e-3; double muoo = 3.0; double kwoo = 5.0; @@ -790,29 +812,28 @@ int transitionType = 0; double turbIntensity = -1.0; int freeturbIntensitySRModify = 0; double freeDecayXLocation = 0.0; -int compressibleCorrection = 0; -int prandtlNumberCorrection = 0; +int compressibleCorrection = 0; int transitionMaFix = 1; -# maximum eddy viscosity (myt/my) max. +// maximum eddy viscosity (myt/my) max. double eddyViscosityLimit = 1.0e10; int monitor_vistmax = 0; -//----------------------------------------------------------------------- -# LES Parameter # -//----------------------------------------------------------------------- +#************************************************************************ +# LES Parameter * +#************************************************************************ // iLES: Create LESSolver or not. -// = 1 - Create LESSolver; -// != 1 - not. +// = 1 -- Create LESSolver; +// != 1 -- not. // amplitudeofDisturb: Amplitude of adding disturb. // disturbstep: Unsteady time step or steady iteration of adding random disturb. // iterdisturb: Add random disturb in every sub-iter or only first sub-iter. -// = 0 - in only first sub-iter; -// != 0 - in every sub-iter. +// = 0 -- in only first sub-iter; +// != 0 -- in every sub-iter. // ipraddisturb: Add density and pressure disturb or not. // ibodyforce: Add body force in source flux of NS equations or not. -// = 0 - not; -// != 0 - Add body force. +// = 0 -- not; +// != 0 -- Add body force. // bodyforce: Body force in source flux of NS equations or not. // utau: friction velocity, using in DNSDisturb. // sgsmodel: subgrid scale model. @@ -820,23 +841,22 @@ int monitor_vistmax = 0; // = "dsmCom"; // = "wale"; // = "sigma". -// deltaFunctionType: = 1 - MAX(deltai, deltaj, deltak); -// = 2 - pow(deltai * deltaj *deltak, 1/3); -// = 3 - Devloped by Scotti. -// wallDampingFunctionType: = 0 - no wall function; -// = 1 - van Driest; -// = 2 - developed by Dr. Deng Xiaobing; -// = 3 - developed by Piomelli. +// deltaFunctionType: = 1 -- MAX(deltai, deltaj, deltak); +// = 2 -- pow(deltai * deltaj *deltak, 1/3); +// = 3 -- Devloped by Scotti. +// wallDampingFunctionType: = 0 -- no wall function; +// = 1 -- van Driest; +// = 2 -- developed by Dr. Deng Xiaobing; +// = 3 -- developed by Piomelli. // turbViscousCutType: turbulent viscosity cut type. -// = 0 - mu_total = mut + mul; -// = 1 - mu_total = max(mut-mul,0)+ mul; -// = 2 - mu_total = max(mut ,0)+ mul. +// = 0 -- mu_total = mut + mul; +// = 1 -- mu_total = max(mut-mul, 0) + mul; +// = 2 -- mu_total = max(mut , 0) + mul. // smagConstant: constant of smagorinsky model. // waleConstant: constant of wale model. -// filterDirection[3]: filter variables in i, j, k direction or not. +// filterDirection [3]: filter variables in i, j, k direction or not. // averageDirection[3]: average variables in i, j, k direction or not. // isotropicConstant: constant of isotropic part of SGS stress. - int iLES = 0; string sgsmodel = "smagorinsky"; int deltaFunctionType = 2; @@ -852,19 +872,16 @@ double testFilterScale = 2.0; int averageWidth = 1; int monitorNegativeConstant = 0; -//----------------------------------------------------------------------- -# Other Parameters for Hypersonic Non-equilibrium Gas # -//----------------------------------------------------------------------- +#************************************************************************ +# Other Parameters for Hypersonic Non-equilibrium Gas * +#************************************************************************ // dg_high_order: // 0 -- generic order accuracy. // 1 -- high order accuracy. // iapplication: // 0 -- gas model is fixed in the codes. // 1 -- gas model is imported from library files. -// isAdaptiveSolver: isAdaptiveSolver=0 indicates the generic Navier-Stokes solver, -// isAdaptiveSolver>0 indicates the HyFlow self-adaptive solver. -// 1 -- using HyFlow self-adaptive solver where the switch is controlled by the total iteration steps. -// 2 -- using HyFlow self-adaptive solver where the switch is controlled by variation of the key residual. +// isAdaptiveSolver: isAdaptiveSolver = 0 indicates the generic Navier-Stokes solver, // nm: Equation number of the physics, but is out of commision now. // 4 -- for 2D. // 5 -- for 3D. @@ -875,7 +892,7 @@ int monitorNegativeConstant = 0; // 2 -- Argon. // 3 -- Nitrogen. // nEnergyRecycle: The type of EnergyModel Recycle. -// 0 -- not used . +// 0 -- not used. // 1 -- used. // nDensityModify: The type of densitymodify. // 0 -- not used. @@ -883,26 +900,25 @@ int monitorNegativeConstant = 0; // nchem: // 0 -- without chemical reaction flow. // 1 -- the chemical reaction flow is considered. -// nEquilibriumGas: the variable is valid when the condition of nchem=0 is satisfied. +// nEquilibriumGas: the variable is valid when the condition of nchem = 0 is satisfied. // 0 -- perfect gas. // 5, 7, 11 -- equilibrium gas, meanwhile, its value denotes the number of gas component. -// nPCWCycleStep: the maximum step number of iteration in the module of computing species mass fractions with the partial catalytic wall(PCW) condition. -// the value equals to or is greater than 1, and 3 is for default value. -// nRETCycleStep: the maximum step number of iteration in the module of computing radiation equilibrium temperature on wall. -// the value equals to or is greater than 1, and 3 is for default value. -// nSLIPCycleStep:the maximum step number of iteration in the module of computing slip temperature, slip velocity and slip species mass fraction. -// the value equals to or is greater than 1, and 3 is for default value. -// nSlipBCModel : The computational model of slip boundary conditions. - -// 0 -- no slip. -// 1 -- the conventional Maxwell slip conditions. -// 2 -- the Gokcen slip conditions. -// 3 -- the Knudsen-layer correction of the standard slip conditions proposed by Lockerby, et al. -// 4 -- the Kogan simplified slip conditions. -// nMeanFreePathType : the method to the mean free-path for the slip conditions. For the mixture, 0 is suggested. -// 0 -- the equivalent mean free-path is calculated by the simple hard sphere model(HS). -// 1 -- calculated by the definition that includes the variables of the number density and the molecule diameter. -// 2 -- the equivalent mean free-path is calculated by the variable hard sphere model(VHS). +// nPCWCycleStep: The maximum step number of iteration in the module of computing species mass fractions with the partial catalytic wall(PCW) condition. +// The value equals to or is greater than 1, and 3 is for default value. +// nRETCycleStep: The maximum step number of iteration in the module of computing radiation equilibrium temperature on wall. +// The value equals to or is greater than 1, and 3 is for default value. +// nSLIPCycleStep:The maximum step number of iteration in the module of computing slip temperature, slip velocity and slip species mass fraction. +// The value equals to or is greater than 1, and 3 is for default value. +// nSlipBCModel: The computational model of slip boundary conditions. +// 0 -- no slip. +// 1 -- the conventional Maxwell slip conditions. +// 2 -- the Gokcen slip conditions. +// 3 -- the Knudsen-layer correction of the standard slip conditions proposed by Lockerby, et al. +// 4 -- the Kogan simplified slip conditions. +// nMeanFreePathType: the method to the mean free-path for the slip conditions. For the mixture, 0 is suggested. +// 0 -- the equivalent mean free-path is calculated by the simple hard sphere model(HS). +// 1 -- calculated by the definition that includes the variables of the number density and the molecule diameter. +// 2 -- the equivalent mean free-path is calculated by the variable hard sphere model(VHS). // nchemsrc: // 0 -- the source terms are not computed. // 1 -- the source terms are computed. @@ -913,148 +929,151 @@ int monitorNegativeConstant = 0; // 1 -- One-temperature model. // 2 -- Two-temperature model. // 3 -- Three-temperature model. +// isUseNoneqCond: +// 0 -- compute the source terms without any conditions. +// 1 -- compute the source terms using the non-equilibrium condition. +// frozenCondition: the threshold value of frozen chemical flow condition, 0.1 is the default value. // nIdealState: whether take all gas species as ideal gas for gas-mixture process. // 0 -- No. -// 1 -- Yes. -// nTEnergyModel: the method to computing temperature energy model. +// 1 -- Yes. // nTEnergyModel: the method to computing temperature energy model. // 0 -- the energy term is computed using the conventional method. // 1 -- the energy term is computed using the polynomial fitting method. // 2 -- the energy term is computed using the piecewise polynomial fitting method. // parkVDPower: the power of translational-rotational temperature in the Park V-D(vibration-dissociation) coupling model. // The value is in range of [0.0, 1.0], DPLR suggests 0.5, LAURA suggests 0.7, while 0.6 is given as default value. // catalyticCoef: -// 0.0 -- full non-catalytic wall boundary condition. -// 1.0 -- full catalytic wall boundary condition. -// in range of (0.0, 1.0) -- partial catalytic condition, the value indicates the catalytic coefficient. -// nIsSuperCatalytic : the super catalytic condition for the fully catalytic wall, and assigned with the value of 1. -// 0 -- equilibrium condition for the fully catalytic wall where the mass fractions are assigned with the values of the free stream. -// 1 -- super catalytic condition for the fully catalytic wall where all the atomic components combine into molecular components. -// nTemperatureJump : the method to calculate the temperature jump. -// 0 -- calculated by the variables of heat conductivity and constant volume specific heat for each energy mode. -// 1 -- the general method where the iteration is calculated with the translation-rotation temperature. -// nSurfGradMethod : the method to compute the surface heating ratio. -// 0 -- the gradient of variable is computed with the first-order difference method. -// 1 -- the gradient of variable is computed with the Green-Guass integral method. -// nRapidFlowfield : initialize the flowfield using the rapid engineering method when it is greater than zero. -// nSurfHeatMonitor : To exam the surface heating change or not. 0 is no, 1 is yes. -// nInitPressureStep : the steps to initialize the boundary variables when the rapid method is used. 100 is the default value. -// nDumpCFLNumber : 1 indicates dumping the CFL number to file, 0 denotes no dumping. +// 0.0 -- full non-catalytic wall boundary condition. +// 1.0 -- full catalytic wall boundary condition. +// in range of (0.0, 1.0) -- partial catalytic condition, the value indicates the catalytic coefficient. +// nIsSuperCatalytic: the super catalytic condition for the fully catalytic wall, and assigned with the value of 1. +// 0 -- equilibrium condition for the fully catalytic wall where the mass fractions are assigned with the values of the free stream. +// 1 -- super catalytic condition for the fully catalytic wall where all the atomic components combine into molecular components. +// nTemperatureJump: the method to calculate the temperature jump. +// 0 -- calculated by the variables of heat conductivity and constant volume specific heat for each energy mode. +// 1 -- the general method where the iteration is calculated with the translation-rotation temperature. +// nSurfGradMethod: the method to compute the surface heating ratio. +// 0 -- the gradient of variable is computed with the first-order difference method. +// 1 -- the gradient of variable is computed with the Green-Guass integral method. +// nRapidFlowfield: initialize the flowfield using the rapid engineering method when it is greater than zero. +// nSurfHeatMonitor: To exam the surface heating change or not. 0 is no, 1 is yes. +// nInitPressureStep: the steps to initialize the boundary variables when the rapid method is used. 100 is the default value. +// nDumpCFLNumber: 1 indicates dumping the CFL number to file, 0 denotes no dumping. // sigmaVelocity: the coordination coefficient of tangential momentum for computation of slip velocity. The value is in range of (0.0, 2.0]. // sigmaTemperature: the heat coordination coefficient for computation of slip temperature. The value is in range of (0.0, 2.0]. // sigmaMassFraction: the species coordination coefficient for computation of slip mass fractions. The value is in range of (0.0, 2.0]. // velocitySlipCorrectConstant: the correction constant to the velocity slip condition. For the diffuse reflection, 1.0 is used. -// 1.0 -- proposed by Maxwell. -// sqrt(2/PI)~0.8 -- used for "micro-slip", namely the actual velocity slip at the wall. -// 1.146 -- proposed for an additional "fictitious" velocity slip. - -// chemicalRelaxCorf: The value is in range of [0.001, 1.0]. -// spectrumRadiusCoef: The value is in range of [0.0, 2.0]. -// staticPressureRelaxCorf: The value is in range of [0.1, 1.0]. -// nIsChemicalFreeze : the flag to freeze the chemical reactions. -// 0 -- not freeze, the chemical reaction sources will be calculated. -// 1 -- freezes the chemical reactions, the chemical reaction sources will not be calculated.// veTemperatureMin: The minimum of Tv and Te - -//maxViscous: the maximum of Viscous. -//trTemperatureMin: the minimum value of trTemperature. -//veTemperatureMin: the minimum value of veTemperature. -//densityMin: the minimum value of density. -//tAdjustmentFactor: magnification of temperature, this value is in range of (1.0, 10.0]. -// nDebug: cout the Wrong place and abort -// 0 -- not used. -// 1 -- used. +// 1.0 -- proposed by Maxwell. +// sqrt(2/PI)~0.8 -- used for "micro-slip", namely the actual velocity slip at the wall. +// 1.146 -- proposed for an additional "fictitious" velocity slip. +// chemicalRelaxCorf: The value is in range of [0.001, 1.0]. +// spectrumRadiusCoef: The value is in range of [0.0, 2.0]. +// staticPressureRelaxCorf: The value is in range of [0.1, 1.0]. +// nIsChemicalFreeze: the flag to freeze the chemical reactions. +// 0 -- not freeze, the chemical reaction sources will be calculated. +// 1 -- freezes the chemical reactions, the chemical reaction sources will not be calculated. +// veTemperatureMin: The minimum of Tv and Te. +// maxViscous: the maximum of Viscous. +// trTemperatureMin: the minimum value of trTemperature. +// veTemperatureMin: the minimum value of veTemperature. +// densityMin: the minimum value of density. +// tAdjustmentFactor: magnification of temperature, this value is in range of (1.0, 10.0]. +// nDebug: cout the Wrong place and abort +// 0 -- not used. +// 1 -- used. // nSpeciesLimit: limitter of gas species -// 0 -- not used. -// 1 -- used. -// nTurblenceForChemical: the coupled mode of Turblence and Chemical reaction -// 0 -- method 0. -// 1 -- method 1. -// nViscosityFluxSublevelModified: Modified for ViscosityFlux on Sublevel grid -// 0 -- not used. -// 1 -- used. -// nViscosityPeModified: Pe Modified for ViscosityCoef -// 0 -- not used. -// 1 -- used. -// nChemcalSourceModified: Modified on ChemcalSource -// 0 -- not used. -// 1 -- used. -// nChemcalSourceEsMethod: Modified on ChemcalSource -// 0 -- approximation algorithm 1 (Ori.) -// 1 -- approximation algorithm 2 (New) - +// 0 -- not used. +// 1 -- used. +// nTurblenceForChemical: the coupled mode of Turblence and Chemical reaction. +// 0 -- method 0. +// 1 -- method 1. +// nViscosityFluxSublevelModified: Modified for ViscosityFlux on Sublevel grid. +// 0 -- not used. +// 1 -- used. +// nViscosityPeModified: Pe Modified for ViscosityCoef. +// 0 -- not used. +// 1 -- used. +// nChemcalSourceModified: Modified on ChemcalSource. +// 0 -- not used. +// 1 -- used. +// nChemcalSourceEsMethod: Modified on ChemcalSource. +// 0 -- approximation algorithm 1 (Ori). +// 1 -- approximation algorithm 2 (New). // nMaxStepTemperature: the iterative steps of temperature. - -// veTemperatureMinModified: Modified on the minimum of Tve for Cvvs -// 0 -- not used -// 1 -- used - -// nDiagonalModified: Modified on Diagonal -// 0 -- not used -// 1 -- Ori. -// 2 -- new - -//nGradPrimtiveMethod: -// 0 -- Ori. -// 1 -- new +// veTemperatureMinModified: Modified on the minimum of Tve for Cvvs. +// 0 -- not used. +// 1 -- used. +// nDiagonalModified: Modified on Diagonal. +// 0 -- not used. +// 1 -- new. +// nDiagonalModifiedTurb: Modified on Diagonal for turbulence. +// 0 -- not used. +// 1 -- new. +// nGradPrimtiveMethod: +// 0 -- Ori. +// 1 -- new. // nAblation: -// 0 -- The wall ablation is not computed. -// 1 -- The wall ablation is computed. +// 0 -- The wall ablation is not computed. +// 1 -- The wall ablation is computed. // isInjection: -// 0 -- The injection velocity of ablation wall is not computed. -// 1 -- The injection velocity of ablation wall is computed. +// 0 -- The injection velocity of ablation wall is not computed. +// 1 -- The injection velocity of ablation wall is computed. // nViscosityModel: -// 0 -- Blottner fitting method(N89). -// 1 -- Gupta fitting method(N90). +// 0 -- Blottner fitting method(N89). +// 1 -- Gupta fitting method(N90). // nContinueModel: The new continue model can switch different computation model. -// 0 -- Not use the new continue model. -// 1 -- use the new continue model. +// 0 -- Not use the new continue model. +// 1 -- use the new continue model. // nSutherland: -// 0 -- stands for selecting the Blotter curve fits mode. -// 1 -- stands for Sutherland relation. +// 0 -- stands for selecting the Blotter curve fits mode. +// 1 -- stands for Sutherland relation. // gasfile: Indicates the gas model, 9 models are provided, namely "Gu5", "Gu7", "Gu11", "Pa5", "Pa7", "Pa11", "DK5", "DK7", "DK11". -// "Gu" -- indicates the Gupta Model, three-Type Models are embeded in the library, namely, the 5-species-6-reactions, the 7-species-9-reactions, the 11-species-20-reactions. -// "Pa" -- indicates the Park Model, three-Type Models are embeded in the library, namely, the 5-species-17-reactions, the 7-species-22-reactions, the 11-species-48-reactions. -// "DK" -- indicates the Dunn-Kang Model, three-Type Models are embeded in the library, namely, the 5-species-11-reactions, the 7-species-15-reactions, the 11-species-26-reactions. -// "Mars-Pa8" is for Park model of Mars gas, "Mars-Mc8" for McKenzie model of Mars gas. -// "Combustion-12" -- indicates the Combustion Chamber Gas Model which includes 12-species-20-reactions. -// "Gas-Mixture" -- indicates the process of mixing gas without reacting. -// for struct solver mixing two speciesSpeciesA, SpeciesB. -// for unstruct solver mixing multi-speciesO2 NO CO CO2 H2 N2 Air CH4. -// For self-definition model, the gasfile is used to indicate the file path of the new gas model. +// "Gu" -- indicates the Gupta Model, three-Type Models are embeded in the library, namely, the 5-species-6-reactions, the 7-species-9-reactions, the 11-species-20-reactions. +// "Pa" -- indicates the Park Model, three-Type Models are embeded in the library, namely, the 5-species-17-reactions, the 7-species-22-reactions, the 11-species-48-reactions. +// "DK" -- indicates the Dunn-Kang Model, three-Type Models are embeded in the library, namely, the 5-species-11-reactions, the 7-species-15-reactions, the 11-species-26-reactions. +// "Mars-Pa8" is for Park model of Mars gas, "Mars-Mc8" for McKenzie model of Mars gas. +// "Combustion-12" -- indicates the Combustion Chamber Gas Model which includes 12-species-20-reactions. +// "Gas-Mixture" -- indicates the process of mixing gas without reacting. +// for struct solver mixing two species��SpeciesA, SpeciesB��. +// for unstruct solver mixing multi-species��O2 NO CO CO2 H2 N2 Air CH4��. +// For self-definition model, the gasfile is used to indicate the file path of the new gas model. // speciesName: Used to list the names of each species, while each species name is separated by the symbol of comma. // initMassFraction: Used to list the initial mass fractions of species in accordance with the sequence of names in the parameter speciesName. // ifStartFromPerfectGasResults: The chemical reaction simulation is start from perfect gas flowfield or not, 0 is for no and else is for yes. -// nIterFirstStep : the maximum number of iteration in the first step for the self-adaptive calculation. -// nIterSecondStep : the maximum number of iteration in the second step for the self-adaptive calculation. -// nIterThirdStep : the maximum number of iteration in the third step for the self-adaptive calculation. -// nEnergyAssembly : the vibration energy is computed with combined method which includes the fitting method and the molecular kinetic theory. -// 0 -- no, -// 1 -- yes. +// nIterFirstStep : the maximum number of iteration in the first step for the self-adaptive calculation. +// nIterSecondStep: the maximum number of iteration in the second step for the self-adaptive calculation. +// nIterThirdStep : the maximum number of iteration in the third step for the self-adaptive calculation. +// nEnergyAssembly: the vibration energy is computed with combined method which includes the fitting method and the molecular kinetic theory. +// 0 -- no, +// 1 -- yes. // nControlVariable: the variable to computing the residual error that determines the convergence is meet or not in the one-temperature model. -// 0 -- the density. -// 1 -- the translation temperature. -// 2 -- the vibration temperature. -// 3 -- the electron temperature. -// 4 -- the pressure. -// 5 -- the mass fraction of oxygen. -// 6 -- the mass fraction of nitrogen. +// 0 -- the density. +// 1 -- the translation temperature. +// 2 -- the vibration temperature. +// 3 -- the electron temperature. +// 4 -- the pressure. +// 5 -- the mass fraction of oxygen. +// 6 -- the mass fraction of nitrogen. // firstStepError : the residual error of the first step iteration for the self-adaptive calculation. // secondStepError : the residual error of the second step iteration for the self-adaptive calculation. // thirdStepError : the residual error of the third step iteration for the self-adaptive calculation. -// useHyflowSetting : Setting for HyFLOW GUI. -// 0 -- PHengLEI -// 1 -- HyFLOW -// nProtectData : Use the continuation file data protection mechanism. -// 0 -- no -// 1 -- yes - +// nProtectData: Use the continuation file data protection mechanism. +// 0 -- no. +// 1 -- yes. +// nTvChange: Judge whether the Tv equals Ttr. +// 0 -- yes. +// 1 -- no. +// isMoleFractionType: 1 indicates the mass fractions, or else the mole fractions. +// nFraction: the initial fractions type of species. +// 0 -- mass fraction. +// 1 -- mole fraction. int dg_high_order = 0; int iapplication = 0; int isAdaptiveSolver = 0; -int nm = 5; +int nm = 5; int nEquilibriumGas = 0; -int nPCWCycleStep = 3; -int nRETCycleStep = 3; -int nSLIPCycleStep= 3; +int nPCWCycleStep = 3; +int nRETCycleStep = 3; +int nSLIPCycleStep = 3; int nIterFirstStep = 1000; int nIterSecondStep= 2000; int nIterThirdStep = 2000; @@ -1065,17 +1084,17 @@ double secondStepError = 0.001; double thirdStepError = 0.001; double predictCFLError = 0.1; -double refGama = 1.4; -double prl = 0.72; -double prt = 0.90; -double sc_l = 0.5; -double sc_t = 0.5; +double refGama = 1.4; +double prl = 0.72; +double prt = 0.90; +double sc_l = 0.5; +double sc_t = 0.5; -int nGasModel = 0; -int nchem = 0; -int nchemsrc = 1; -int nchemrad = 1; -int ntmodel = 1; +int nGasModel = 0; +int nchem = 0; +int nchemsrc = 1; +int nchemrad = 1; +int ntmodel = 1; int nIdealState = 0; int nEnergyRecycle = 1; @@ -1099,12 +1118,12 @@ double sigmaTemperature = 1.0; double sigmaMassFraction = 1.0; double velocitySlipCorrectConstant = 1.0; -double chemicalRelaxCorf = 1.0; +double chemicalRelaxCorf = 1.0; double chemicalSpectrumRadiusCoef = 1.0; double viscousSpectrumRadiusCoef = 1.5; double inviscidSpectrumRadiusCoef = 1.5; -double spectrumRadiusCoef = 0.5; -double staticPressureRelaxCorf = 0.2; +double spectrumRadiusCoef = 0.5; +double staticPressureRelaxCorf = 0.2; double maxViscous = 10000.0; double trTemperatureMin = 10.0; @@ -1114,31 +1133,35 @@ double densityMin = 1.0e-8; double densityMinFactor = 0.1; double tAdjustmentFactor = 10.0; double iniSpeedCoef = 1.0; +int iniSpeedMode = 0; -int nDebug = 0; -int nSpeciesLimit = 1; -int nTurblenceForChemical = 0; -int nViscosityFluxSublevelModified = 1; -int nViscosityPeModified = 0; -int nChemcalSourceModified = 2; -int nChemcalSourceEsMethod = 1; -int nMaxStepTemperature = 5; -int veTemperatureMinModified = 1; -int nDiagonalModified = 0; -int nGradPrimtiveMethod = 1; -int nInviscidFluxModify = 1; -int nQlLimitMethod = 2; -int nSpeciesForWallMethod = 1; -int nDensityForWallMethod = 0; +int nDebug = 0; +int nSpeciesLimit = 1; +int nTurblenceForChemical = 0; +int nViscosityFluxSublevelModified = 1; +int nViscosityPeModified = 0; +int nChemcalSourceModified = 2; +int nChemcalSourceEsMethod = 1; +int nMaxStepTemperature = 5; +int veTemperatureMinModified = 1; +int nDiagonalModified = 0; +int nDiagonalModifiedTurb = 0; +int nGradPrimtiveMethod = 1; +int nInviscidFluxModify = 1; +int nQlLimitMethod = 2; +int nSpeciesForWallMethod = 1; +int nDensityForWallMethod = 0; +int wallMultiTemperature = 0; -int nProtectData = 0; -int useHyflowSetting = 0; -int nAblation = 0; -int isInjection = 0; -int nViscosityModel = 0; -int nMarsModel = 0; -string gasfile = "DK5"; -//string gasfile = "./chemical/Dunn-Kang_air5s11r.dat"; +int nProtectData = 0; +int nAblation = 0; +int isInjection = 0; +int nViscosityModel = 0; +int nMarsModel = 0; +int nTvChange = 0; +int isMoleFractionType = 0; +string gasfile = "DK5"; +//string gasfile = "./chemical/Dunn-Kang_air5s11r.dat"; string speciesName = "O, O2, NO, N, N2"; string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.767"; @@ -1152,16 +1175,16 @@ string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.767"; //string speciesName = "O, O2, NO, N, N2, C, CO, CO2"; //string initMassFraction = "0.0015, 0.0429, 0.0, 0.0, 0.0, 0.0, 0.0777, 0.8779"; -//string gasfile = "Pa"; +//string gasfile = "Pa"; //string speciesName = "O, O2, NO, N, NO+, C, C2, CO, CO2, CN, N2, e-"; //string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.767, 0.0"; -//string gasfile = "Combustion-12"; +//string gasfile = "Combustion-12"; //string speciesName = "O, O2, NO, N, C, CO, CO2, H, H2, OH, H2O, N2"; //string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.767"; //string gasfile = "Gas-Mixture"; -//string speciesName ="SpeciesA, SpeciesB"; +//string speciesName = "SpeciesA, SpeciesB"; //string initMassFraction = "1.0, 0.0"; int nSutherland = 0; double gamaSpeciesA = 1.4; @@ -1173,9 +1196,17 @@ double molecularWeightSpeciesB = 30.0; //string speciesName = "O2, N2"; //string initMassFraction = "1.0, 0.0"; +int nFraction = 0; int nContinueModel = 0; int nChemicalFlowStep = 0; int ifStartFromPerfectGasResults = 0; +int isUseNoneqCond = 0; +double frozenCondition = 0.01; + +int nLeakageMonitor = 0; +double totalLeakageVolume = 1000.0; +double monitorThresholdValue = 0.05; +double sprayFactor = 0.0; ######################################################################### // Multi-Grid parameters. @@ -1196,7 +1227,6 @@ int ifStartFromPerfectGasResults = 0; // 1 -- zero order. // 2 -- first-order. (default) // mgCorrectionLimit: Multi-grid correction limit. - int nMGLevel = 1; int MGCoarsestIteration = 1; int MGPreIteration = 1; @@ -1218,20 +1248,20 @@ int ismooth_turb = 0; int SAProductType = 2; // ----------------- Overset Grid parameter ----------------------------- -int codeOfDigHoles = 1; -int codeOfTurbulentModel = 0; -string masterFileName = "./grid/searchFile.inp"; -string holeBasicFileName = "./grid/holeBasicFile.inp"; -string holeFullFileName = "./grid/holeFullFile.dat"; -string linkFileName = "./grid/topology.dat"; -string zoneInverseFileName = "./grid/zoneInverseMapping.inp"; +int codeOfDigHoles = 1; +int codeOfTurbulentModel = 0; +string masterFileName = "./grid/searchFile.inp"; +string holeBasicFileName = "./grid/holeBasicFile.inp"; +string holeFullFileName = "./grid/holeFullFile.dat"; +string linkFileName = "./grid/topology.dat"; +string zoneInverseFileName = "./grid/zoneInverseMapping.inp"; -######################################################################### -# High Order Struct Solver # -######################################################################### +#************************************************************************ +# High Order Struct Solver * +#************************************************************************ // isFVMOrFDM: -// 0 -- NSSolverStruct using Finite Volume Method. -// 1 -- NSSolverStruct using Finite Differ Method. +// 0 -- NSSolverStruct using Finite Volume Method. +// 1 -- NSSolverStruct using Finite Differ Method. // SolverStructOrder: Spatial discretisation order of NS equations with struct grid. // <= 2 -- finite volume method. // >= 3 -- finite difference order. (to be completed) @@ -1273,30 +1303,48 @@ int allReduceStep = 1; // codeOfOversetGrid: Overlapping(overset) grid or not. // 0 -- NON-overlapping grid. // 1 -- Overlapping grid. -// oversetInterpolationMethod: the method of overset interpolation while field simulation +// oversetInterpolationMethod: the method of overset interpolation while field simulation. // 0 -- set the acceptor cell value by donor cell value. // 1 -- set the acceptor cell value by distance weight of donor cell value. - -int codeOfOversetGrid = 0; -int oversetInterpolationMethod = 0; -int readOversetFileOrNot = 0; -int symetryOrNot = 0; -int readInAuxiliaryInnerGrid = 0; -int readInAuxiliaryOuterGrid = 0; -int readInSklFileOrNot = 0; -string auxiliaryInnerGrid0 = "./grid/aux-upper.fts"; -string auxiliaryInnerGrid1 = "./grid/aux-lower.fts"; -string auxiliaryInnerGrid2 = ""; -string oversetGridFileName = "./grid/iblank.ovs"; -double walldistMainZone = 1.0 -double toleranceForOversetSearch = 1.0e-3; -double toleranceForOversetBox = 1.0e-3; -int twoOrderInterpolationOrNot = 0; -int keyEnlargeOfActiveNodes = 0; -int outTecplotOverset = 0; -int outPutOversetVisualization = 0; - -int numberOfMovingBodies = 2; +// readOversetFileOrNo: Whether to read overset-file(.ovs) that has been generated. +// 0 -- no. +// 1 -- yes. +// symetryOrNot: If there exist symetryplanes(XY plane, the coordinate of Z direction is 0) in +// the current overset grid(only for three dimension). +// 0 -- no. +// 1 -- yes. +// readInAuxiliaryInnerGrid: Whether to read auxiliary inner grid. +// 0 -- no. +// 1 -- yes. +// walldistMainZone: The initial value of background grid which does not exist wall boundary condition. +// toleranceForOversetSearch: The tolerance of overset searching zone to judge whether the obtained node is in the current computing cell. +// toleranceForOversetBox: The tolerance of building the minimum box of computing cells in the overlapping region. +// twoOrderInterpolationOrNot: The number of interpolated cell layers in the overlapping boundary. +// 0 -- one layer. +// 1 -- two layers. +// keyEnlargeOfActiveNodes: The number of enlarged overset-boundary layers in the buffer region. +// outTecplotOverset: Whether to dump out the flowfield data after the progress of overset configure. +// 0 -- no. +// 1 -- yes. +int codeOfOversetGrid = 0; +int oversetInterpolationMethod = 0; +int readOversetFileOrNot = 0; +int symetryOrNot = 0; +int readInAuxiliaryInnerGrid = 0; +int readInAuxiliaryOuterGrid = 0; +int readInSklFileOrNot = 0; +string auxiliaryInnerGrid0 = "./grid/aux-upper.fts"; +string auxiliaryInnerGrid1 = "./grid/aux-lower.fts"; +string auxiliaryInnerGrid2 = ""; +string oversetGridFileName = "./grid/iblank.ovs"; +double walldistMainZone = 1.0 +double toleranceForOversetSearch = 1.0e-3; +double toleranceForOversetBox = 1.0e-3; +int twoOrderInterpolationOrNot = 0; +int keyEnlargeOfActiveNodes = 0; +int outTecplotOverset = 0; +int outPutOversetVisualization = 0; +int numberOfMovingBodies = 2; // ----------------- ALE configuration ------------------------------ int codeOfAleModel = 0; @@ -1306,36 +1354,42 @@ double referenceLength = 1.0; double referenceVelocity = 1.0; double referenceDensity = 1.0; -int strategyForFaceNormalVelocity = 0; //0-By Sweeping volume; 1-By face center 1st; 2-By face center 2nd; -int strategyForGCLSource = 0; //0-present; 1-Ahn; +int strategyForFaceNormalVelocity = 0; // 0-By Sweeping volume; 1-By face center 1st; 2-By face center 2nd. +int strategyForGCLSource = 0; // 0-present; 1-Ahn. -//0:1st-Admas-Bashforth; 1:2nd-Admas-Bashforth; 2:1st-Implicit-Euler; 3:2nd-Implicit Euler; 4:2nd-Adams-Moulton; 5:3rd-Adams-Moulton +// 0: 1st-Admas-Bashforth; 1: 2nd-Admas-Bashforth; 2: 1st-Implicit-Euler; 3: 2nd-Implicit Euler; 4: 2nd-Adams-Moulton; 5: 3rd-Adams-Moulton. int methodForKineticEquation = 0; double relaxParameterOfKinetic = 1.0; -######################################################################### -# motive information # -######################################################################### +#************************************************************************ +# motive information * +#************************************************************************ int numberOfMovingBodies = 1; ############################## body0 ############################## -//mass of parts -double mass_0 = 1.0; -//mass matrix of parts Ixx Iyy Izz Ixy Ixz Iyz -double massMatrix_0[] = 1e-7, 1e-6, 1e-6, 0.0, 0.0, 0.0; -//initial six DOF position information of parts. xc yc zc -double massCenter_0[] = 0.0 , 0.0, 0.0; -//initial six DOF position information of parts. angleX angleY angleZ -double attitudeAngle_0[] = 0.0 , 0.0, 0.0; -//initial six DOF move information of parts. vc vy vz -double massCenterVelocity_0[] = 0.0, 0.0, 0.0; -//initial six DOF move information of parts. omigX omigY omigZ -double angularVelocity_0[] = 0.0, 0.0, 0.0; -//the object that the parts belong to. -int fartherIndex_0 = -1; -//the assembly position of the parts. xc yc zc angleX angleY angleZ -double configPamameter_0[] = 0.0 ,0.0 ,0.0 ,0.0 ,0.0 ,0.0; -//the move pattern of the parts. +// mass of parts. +double mass_0 = 1.0; +// gravity of parts (along negative direction in Y-axis, eg. 9.8). +double gravity_0 = 0.0; +// mass matrix of parts Ixx Iyy Izz Ixy Ixz Iyz. +double massMatrix_0[] = 1e-7, 1e-6, 1e-6, 0.0, 0.0, 0.0; +// initial six DOF position information of parts. xc yc zc. +double massCenter_0[] = 0.0, 0.0, 0.0; +// if reset mass center while restart. +int resetMassCenter_0 = 0; +// position offset of parts. dx dy dz. +double massCenterDxyz_0[] = 0.0, 0.0, 0.0; +// initial six DOF position information of parts. angleX angleY angleZ. +double attitudeAngle_0[] = 0.0, 0.0, 0.0; +// initial six DOF move information of parts. vc vy vz. +double massCenterVelocity_0[] = 0.0, 0.0, 0.0; +// initial six DOF move information of parts. omigX omigY omigZ. +double angularVelocity_0[] = 0.0, 0.0, 0.0; +// the object that the parts belong to. +int fartherIndex_0 = -1; +// the assembly position of the parts. xc yc zc angleX angleY angleZ. +double configPamameter_0[] = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0; +// the move pattern of the parts. // -1 given motion partten. // 0 still. // 1 six DOF motion. @@ -1346,51 +1400,68 @@ double configPamameter_0[] = 0.0 ,0.0 ,0.0 ,0.0 ,0.0 // 14 forced pitch motion. // 15 forced yaw motion. // 16 forced roll motion. -int RBDMethod_0 = 0; -double amplitude_0 = 0.0; -double reduceFrequency_0 = 0.0; -//direction of rotation +int RBDMethod_0 = 0; +double amplitude_0 = 0.0; +double reduceFrequency_0 = 0.0; +// direction of rotation. // 1 -- clockwise from the point of view along the positive x axis. // -1 -- anticlockwise from the point of view along the positive x axis. -int direction_0 = -1; -double rotateFrequency_0 = 0.0; -//string uDFSixDofFileName_0 = "./Bin/UDFSixDof.Parameter"; -//additional force (system axis) fX fY fZ -double addedForce_0[] = 0.0 ,0.0 ,0.0 ; -//additional moment of Force (system axis) mX mY mZ -double addedMoment_0[] = 0.0 ,0.0 ,0.0 ; -//the deformation method of the parts. -int morphing_0 = 0; - -// post indentify -int integralOrder = 4; +int direction_0 = -1; +double rotateFrequency_0 = 0.0; +//string uDFSixDofFileName_0 = "./Bin/UDFSixDof.Parameter"; +// dimensional physical time for additional force(s). +double addedForceTime_0[] = 0.0; +// additional force(inertia system) fX fY fZ. +double addedForce_0[] = 0.0, 0.0, 0.0; +// additional moment(inertia system) mX mY mZ. +double addedMoment_0[] = 0.0, 0.0, 0.0; +// the deformation method of the parts. +int morphing_0 = 0; +// post indentify. +int integralOrder = 4; // ---------------- ATP read -------------------------------------------- -//@int inflowParaType = 0; +//@int inflowParaType = 0; //@double refReNumber = 6.5e6; //@double refDimensionalTemperature = 288.15; //@double freestream_vibration_temperature = 300.00; -//@double refDimensionalPressure = 0; -//@double height = 0; -//@int nsubsonicInlet = 0; -//@int nsubsonicOutlet = 0; -//@string inLetFileName = "./bin/subsonicInlet.hypara"; -//@string outLetFileName = "./bin/subsonicOutlet.hypara"; +//@double refDimensionalPressure = 0; +//@double height = 0; +//@int nsubsonicInlet = 0; +//@int nsubsonicOutlet = 0; +//@string inLetFileName = "./bin/subsonicInlet.hypara"; +//@string outLetFileName = "./bin/subsonicOutlet.hypara"; //@double refDimensionalVelocity = 0; //@double refDimensionalDensity = 0; - -######################################################################### -# Old Parameter # -######################################################################### +//@string weatherDataFilePath = "./WRFData/"; +//@double longitude = 110.95 +//@double latitude = 19.61; +#************************************************************************ +# Old Parameter * +#************************************************************************ int isPlotVolumeField = 0; +#************************************************************************ +# partial flow field setting Parameter * +#************************************************************************ +//int nPartialParameter = 0; // 0/1/2 +//int nNumberOfPartialField = 0; // +//int nStartGridIndex[] = [0]; +//int nEndGridIndex[] = [0]; -######################################################################### -# Incompressible Parameter # -######################################################################### +//double partialCFL[] = [0.0]; +//double partialSpeedCoef[] = [0.0]; +//double partialSpeed[] = [0.0]; +//double partialAttackd[] = [0.0]; +//double partialSlide[] = [0.0]; +//double partialPressure[] = [0.0]; +//double partialTemperature[] = [0.0]; +//double partialMassFractions[] = [0.0]; +#************************************************************************ +# Incompressible Parameter * +#************************************************************************ int isSolveEnergyEquation = 0; int isSolveTurbEquation = 0; -int isSolveSpeciesEquation = 0; - +int isSolveSpeciesEquation = 0; \ No newline at end of file diff --git a/A11_ThreeD_Sphere_Laminar_Ma10_Struct/bin/grid_para.hypara b/A11_ThreeD_Sphere_Laminar_Ma10_Struct/bin/grid_para.hypara index 1002bca..9059d59 100644 --- a/A11_ThreeD_Sphere_Laminar_Ma10_Struct/bin/grid_para.hypara +++ b/A11_ThreeD_Sphere_Laminar_Ma10_Struct/bin/grid_para.hypara @@ -4,9 +4,12 @@ // gridtype: Grid type for generation, conversion, reconstruction, merging. // 0 -- Unstructured grid. // 1 -- Structured grid. -// axisup: Type of Cartisien coordinates system, used in grid conversion. -// 1 -- Y upward. (default) -// 2 -- Z upward. +// nAxisRotateTimes: number of axis rotating times, zero (default) meaning without rotating. +// axisRotateOrder : axis rotating order. +// 1 -- X-axis. +// 2 -- Y-axis. +// 3 -- Z-axis. +// axisRotateAngles: axis rotating angles (degree), which are corresponding to the axis rotating order. // from_gtype: Type of grid data type in grid conversion process. // -1 -- MULTI_TYPE. // 1 -- PHengLEI, *.fts. @@ -18,7 +21,9 @@ // 7 -- Hybrid, include both of unstructured and structured grid, *.fts. // 8 -- GMSH, *.msh. int gridtype = 1; -int axisup = 1; +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; int from_gtype = 3; ######################################################################### diff --git a/A12_ThreeD_DoubleEllipse_Laminar_Struct_4CPU/bin/cfd_para.hypara b/A12_ThreeD_DoubleEllipse_Laminar_Struct_4CPU/bin/cfd_para.hypara index c344658..f903a5a 100644 --- a/A12_ThreeD_DoubleEllipse_Laminar_Struct_4CPU/bin/cfd_para.hypara +++ b/A12_ThreeD_DoubleEllipse_Laminar_Struct_4CPU/bin/cfd_para.hypara @@ -8,23 +8,24 @@ // Platform for Hybrid Engineering Simulation of Flows + // China Aerodynamics Research and Development Center + // (C) Copyright, Since 2010 + +// PHengLEI 2212 + //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ########################################################################### # Default parameters for Grid conversion # ########################################################################### // gridtype: Grid type for generation, conversion, reconstruction, merging. -// 0 -- Unstructured grid. -// 1 -- Structured grid. -// 2 -- Hybrid grid, include both of unstructured and structured grid. -// gridobj: Task type of grid treatment. -// 0 -- Grid generation of typical case, such as cylinder, flat plate, etc. -// 1 -- Grid conversion, from other grid data to PHenglEI, such as Fluent, CGNS. -// 2 -- Grid refinement. -// 3 -- Grid merging, merge two blocks into one block. -// 4 -- Grid deformation, achieve unstructured grid deformation. -// 5 -- Grid repairing, repair the original grid in order to remove the negative volume cells. -// 6 -- Grid mirroring, mirror a symmetry grid to whole grid. -// 7 -- Grid type change, convert structured grid to unstructured grid. +// 0 -- Unstructured grid. +// 1 -- Structured grid. +// 2 -- Hybrid grid, include both of unstructured and structured grid. +// gridobj: Task type of grid treatment. +// 0 -- Grid generation of typical case, such as cylinder, flat plate, etc. +// 1 -- Grid conversion, from other grid data to PHenglEI, such as Fluent, CGNS. +// 2 -- Grid refinement. +// 3 -- Grid merging, merge two blocks into one block. +// 4 -- Grid deformation, achieve unstructured grid deformation. +// 5 -- Grid repairing, repair the original grid in order to remove the negative volume cells. +// 6 -- Grid mirroring, mirror a symmetry grid to whole grid. +// 7 -- Grid type change, convert structured grid to unstructured grid. // multiblock: Multi-block grid or not, only for structured grid conversion. // 0 -- Not. // 1 -- Yes. @@ -46,19 +47,24 @@ int gridobj = 1; int multiblock = 0; int iadapt = 0; int SymmetryFaceVector = 1; - int gridReorder = 0; int faceReorderMethod = 0; -// axisup: Type of Cartisien coordinates system, used in grid conversion. -// 1 -- Y upward. (default) -// 2 -- Z upward. -int axisup = 1; +// nAxisRotateTimes: number of axis rotating times, zero (default) meaning without rotating. +// axisRotateOrder : axis rotating order. +// 1 -- X-axis. +// 2 -- Y-axis. +// 3 -- Z-axis. +// axisRotateAngles: axis rotating angles (degree), which are corresponding to the axis rotating order. +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; // omit_no_bound_bc: What's boundary condition for the type of "no_boundary_condition". // 0 -- Interface. (default) // 1 -- Physical boundary condition, used in Hybrid solver. int omit_no_bound_bc = 0; +int omitRepeatInterface = 1; //----------------------------------------------------------------------- # Grid data type # @@ -87,10 +93,9 @@ int dumpOldGrid = 0; // from_gfile: path of original data file for unstructure grid convert from. // out_gfile: path of target file for grid convert to, *.fts type of file usually. int numberOfGridFile = 1; -string from_gfile = "./grid/rae2822_hybrid2d.cas"; -string from_gfile1= ""; - -string out_gfile = "./grid/flat_laminr_133_85_2d.fts"; +string from_gfile = "./grid/rae2822_hybrid2d.cas"; +string from_gfile1 = ""; +string out_gfile = "./grid/flat_laminr_133_85_2d.fts"; // ----------------- some advanced choices ------------------------------ // iunsteady: The Grid is for unsteady simulation or not. @@ -103,9 +108,9 @@ int fileformat = 0; // Parameters for hybrid solver. // mixgrid_uns: path of unstructure grid file for hybrid solver, *.fts type. -// mixgrid_str: path of structure grid file for hybrid solver, *.fts type. -string mixgrid_uns = "./grid/rae2822_uns2d_4.fts"; -string mixgrid_str = "./grid/flat_laminr_133_85_2d.fts"; +// mixgrid_str: path of structure grid file for hybrid solver, *.fts type. +string mixgrid_uns = "./grid/rae2822_uns2d_4.fts"; +string mixgrid_str = "./grid/flat_laminr_133_85_2d.fts"; // Some parameters for structured overlapping grid. int codeOfDigHoles = 1; @@ -119,31 +124,31 @@ string zoneInverseFileName = "./oversetGridView/zoneInverseMapping.inp"; // 0 -- Not. (default) // 1 -- Yes. // geometryUnit: Geometry unit. -// 1 -- meter. -// 2 -- millimeter. -// 3 -- inch. +// 1 -- meter. +// 2 -- millimeter. +// 3 -- inch. // exclusiveCase: Parallel projection exclusive case. -// 0 -- NON case. -// 1 -- JSM-C2-NPOFF case. -// 2 -- CHNT. +// 0 -- NON case. +// 1 -- JSM-C2-NPOFF case. +// 2 -- CHNT. // projectOrgPoint: If the original wall points need to be projected or not. -int anisoRefine = 0; -int geometryUnit = 1; -int isProject = 0; -int readDist = 0; -int isDeform = 0; +int anisoRefine = 0; +int geometryUnit = 1; +int isProject = 0; +int readDist = 0; +int isDeform = 0; int exclusiveCase = 0; int projectOrgPoint = 0; string geometryFileName = "./grid/jsm.igs"; // ----------------- Grid Deform Parameters ----------------------------- // deformationMethod: Grid Deform. -// 1 -- SPRING. -// 2 -- RBF. +// 1 -- SPRING. +// 2 -- RBF. // stationalGridFile: Original grid file. // visualFileName : The visualization file path of deform grid. // nDeformStep : The max deform step. -// flapAngle : The max flap angle. +// flapAngle : The max flap angle. // rotatePostionZ : Rotate postion. // rotatePostionY : Rotate postion. // gridSlice : If dump slice grid. @@ -163,10 +168,10 @@ int sliceAxis = 1; double slicePosition = 13; // ----------------- RBF Parameters ------------------------------------- -// numberOfReferenceCP : Number of reference Control Points. -// influencePara : The RBF influence radius parameter. +// numberOfReferenceCP: Number of reference Control Points. +// influencePara : The RBF influence radius parameter. int numberOfReferenceCP = 40; -double influencePara = 25.0; +double influencePara = 25.0; // ----------------- Periodic Parameters -------------------------------- // Notice: Rotational periodicity only support rotation along the X axis! @@ -178,9 +183,8 @@ double influencePara = 25.0; which only support one direction. // rotationAngle: The relative angle between two periodic face. which is recorded in degrees. - int periodicType = 0; -double translationLength[] = [0.0,0.0,0.0]; +double translationLength[] = [0.0, 0.0, 0.0]; double rotationAngle = 0.0; ######################################################################### @@ -192,7 +196,6 @@ double rotationAngle = 0.0; // 2 -- refine structured grid. // maxproc: The number of partition zones that want to be divided into. // numberOfMultifile: The number of partition grid files that want to be dumped out. - int pgridtype = 0; int maxproc = 4; int numberOfMultifile = 1; @@ -201,20 +204,20 @@ int numberOfMultifile = 1; // 0 -- Not. // 1 -- Yes. // blockIndexOfMark: the block index of mark, only for structured grid partition. -// cellIndexOfMark: the cell index of mark, only for structured grid partition. +// cellIndexOfMark : the cell index of mark, only for structured grid partition. int traceMark = 0; int blockIndexOfMark = 0; -int cellIndexOfMark[] = [185,30,1]; +int cellIndexOfMark[] = [185, 30, 1]; -// parallel Strategy: -//! -# 0 : each zone is assigned to the one that defined in grid partition procedure. -//! -# 1 : random assigned for each zone or by some else ways. -int parallelStrategy = 1; +// parallelStrategy: +// 0 -- each zone is assigned to the one that defined in grid partition procedure. +// 1 -- random assigned for each zone or by some else ways. +int parallelStrategy = 1; //----------------------------------------------------------------------- # File path # //----------------------------------------------------------------------- -// original_grid_file: Original grid file that want to be divided(PHengLEI type, *.fts). +// original_grid_file: Original grid file that want to be divided(PHengLEI type, *.fts). // partition_grid_file: Target partition grid file(PHengLEI type, *.fts). string original_grid_file = "./grid/sphere_mixed.fts"; string partition_grid_file = "./grid/sphere_mixed__4.fts"; @@ -232,11 +235,10 @@ string partition_grid_file = "./grid/sphere_mixed__4.fts"; // 1 -- perfect balance. // maxproc -- perfect imbalance. // 1.05 -- recommended. - int omit_no_bound_bc = 0; int npartmethod = 1; int parallelPartitionMethod = 2; -double parmetisBalance = 1.05; +double parmetisBalance = 1.05; // numberOfMultigrid: Number of multi-grid levels, ONLY used for structured grid. // 1 -- single level. @@ -248,29 +250,35 @@ int numberOfMultigrid = 1; # Default parameters for CFD simulation # ######################################################################### // maxSimuStep: The max simulation step, don't care simulation is restart or not. -// intervalStepFlow: The step intervals for flow variables file 'flow.dat' saved. -// intervalStepPlot: The step intervals for tecplot visual file 'tecflow.dat' saved. +// intervalStepFlow: The step intervals for flow variables file 'flow.dat' saved. +// intervalStepPlot: The step intervals for tecplot visual file 'tecflow.dat' saved. // intervalStepSample: The step intervals for monitored probes variables file 'sample.dat' saved. -// intervalStepForce: The step intervals for aerodynamics coefficients file 'aircoef.dat' saved. -// intervalStepRes: The step intervals for residual file 'res.dat' saved. -// ifLowSpeedPrecon: Precondition process to accelerate convergence for low speed flow. -// 0 -- no precondition process. (default, mach > 0.3) -// 1 -- carry out precondition process. (mach number <= 0.3) - -int maxSimuStep = 20000; - -int intervalStepFlow = 1000; -int intervalStepPlot = 1000; +// intervalStepForce: The step intervals for aerodynamics coefficients file 'aircoef.dat' saved. +// intervalStepRes: The step intervals for residual file 'res.dat' saved. +int maxSimuStep = 20000; +int intervalStepFlow = 1000; +int intervalStepPlot = 1000; int intervalStepSample = 1000; -int intervalStepForce = 100; -int intervalStepRes = 10; -int ifLowSpeedPrecon = 0; +int intervalStepForce = 100; +int intervalStepRes = 10; // compressible: // 0 -- incompressible flow. // 1 -- compressible flow. (default) int compressible = 1; +// ifLowSpeedPrecon: Precondition process to accelerate convergence for low speed flow. +// 0 -- no precondition process. (default, mach > 0.3) +// 1 -- carry out precondition process. (mach number <= 0.3) +// Kprec: The coefficient K for the cut-off velocity. +// 1.0~3.0 is suggested. (default, 3.0) +// preconFarfieldBCMethod: The precondition method for farfield boundary condition. +// 0 -- precondition far-field boundary based on riemann invariants. +// 1 -- Turkel's simplified far-field boundary condition. +int ifLowSpeedPrecon = 0; +double Kprec = 3.0; +int preconFarfieldBCMethod = 1; + //----------------------------------------------------------------------- # CFD Control Parameter # //----------------------------------------------------------------------- @@ -281,33 +289,36 @@ int compressible = 1; // 0 -- the nondimensional conditions. // 1 -- the flight conditions. // 2 -- the experiment conditions. -// 3 -- the subsonic boundary conditions. +// 3 -- the subsonic boundary conditions. (Useless!) // 4 -- the condition that the velocity, temperature and density are given. // 5 -- the condition that the velocity, temperature and pressure are given. +//flowInitMethod: Flow field initialization method. +// 0 -- The entire flow field is initialized according to Infinite velocity. +// 1 -- The velocity near the wall is initialized according to the boundary layer of the plate. // refReNumber: Reynolds number, which is based unit length, unit of 1/m. // refDimensionalTemperature: Dimensional reference temperature, or the total temperature only for the experiment condition. // freestream_vibration_temperature: Dimensional freestream vibration temperature. // refDimensionalPressure: Dimensional reference pressure, or the total pressure only for the experiment condition. // height: Fly height, unit of km. // wallTemperature: Temprature of the solid wall, minus value is for adiabatic boundary condition. -// gridScaleFactor: The customizable unit of the grid, default value is 1.0 for meter.Common dimensions like: -// 1 dm = 0.1 m. -// 1 cm = 0.01 m. -// 1 mm = 0.001m. -// 1 inch = 0.0254m. -// 1 foot = 12 inches = 0.3048m. -// 1 yard = 3 feet = 0.9144m. +// gridScaleFactor: The customizable unit of the grid, default value is 1.0 for meter. Common dimensions like: +// 1 dm = 0.1 m. +// 1 cm = 0.01 m. +// 1 mm = 0.001 m. +// 1 inch = 0.0254 m. +// 1 foot = 12 inches = 0.3048 m. +// 1 yard = 3 feet = 0.9144 m. // forceReferenceLength, forceReferenceLengthSpanWise, forceReferenceArea: Reference length, SpanWise length and area, independent of grid unit. // TorqueRefX, TorqueRefY, TorqueRefZ: Reference point, independent of grid unit. // radiationCoef: The radiation coefficient on wall, it is used to compute the radiation heat flux on wall when the boundary // condition is radiation equilibrium temperature, and 0.8 is the default value. -// refMolecularWeight : the reference molecular weight of gas used for perfect gas. The unit is g/mol. +// refMolecularWeight: the reference molecular weight of gas used for perfect gas. The unit is g/mol. // Generally, the gas is air. Sometimes, it is experiment gas, such as Nitrogen, Argon, and so on. - -int directionMethod = 0; +int directionMethod = 0; double refMachNumber = 0.73; double attackd = 2.79; double angleSlide = 0.00; +int flowInitMethod = 0; int inflowParaType = 0; double refReNumber = 6.5e6; @@ -321,29 +332,27 @@ double freestream_vibration_temperature = 300.00; //double refDimensionalTemperature = 6051.024; // The total temperature, T*(1+(refGama-1)*M*M/2). //double refDimensionalPressure = 4.299696E09; // The total pressure, p*(T0/T)^(refGama/(refGama-1)). -//int inflowParaType = 3; -//int nsubsonicInlet = 1; -//int nsubsonicOutlet = 1; -//string inLetFileName = "./bin/subsonicInlet.hypara"; -//string outLetFileName = "./bin/subsonicOutlet.hypara"; -//double refDimensionalTemperature = 288.144; -//double refDimensionalPressure = 1.01313E05; - -//The velocity, temperature and density are fixed. +// The velocity, temperature and density are fixed. //int inflowParaType = 4; //double refDimensionalVelocity = 1000.0; -//double refDimensionalDensity = 1.0e3; +//double refDimensionalDensity = 1.0e3; -//The velocity, temperature and pressure are fixed. +// The velocity, temperature and pressure are fixed. //int inflowParaType = 5; //double refDimensionalVelocity = 1000.0; //double refDimensionalPressure = 1.0e5; -//The MachNumber, temperature and pressure are fixed. +// The MachNumber, temperature and pressure are fixed. //int inflowParaType = 6; -//double refDimensionalTemperature = 293; +//double refDimensionalTemperature = 293.0; //double refDimensionalPressure = 8886.06; +// The velocity, temperature and pressure are read from file. +//int inflowParaType = 7; +//string weatherDataFilePath = "./WRFData/"; +//double longitude = 110.95 +//double latitude = 19.61; + double wallTemperature = -1.0; double radiationCoef = 0.8; @@ -357,41 +366,41 @@ double forceReferenceArea = 1.0; // unit of meter^2. double TorqueRefX = 0.0; // unit of meter. double TorqueRefY = 0.0; // unit of meter. double TorqueRefZ = 0.0; // unit of meter. +double knudsenLength = 1.0; // unit of meter. double refMolecularWeight = 28.9644; // unit of g/mol. //----------------------------------------------------------------------- # Spatial Discretisation # //----------------------------------------------------------------------- -#******************************************************************* -# Struct Solver * -#******************************************************************* +#************************************************************************ +# Struct Solver * +#************************************************************************ // inviscidSchemeName: Spatial discretisation scheme of struct grid. // Using this when solve structered grid or hybrid. -// -- "vanleer", "steger", "hlle", "lax_f". -// -- "roe", "modified_roe". +// -- "vanleer", "steger", "hlle", "lax_f", +// -- "roe", "modified_roe", // -- "ausm+", "ausm+w", "ausm+up", "ausmdv", "ausmpw", "ausmpw+". // isWennScheme: If using WENN Scheme of struct grid. -// 0 -- NO. (default) -// 1 -- Yes. +// 0 -- NO. (default) +// 1 -- Yes. // str_limiter_name: Limiter of struct grid. -// -- "vanalbada", "vanleer", "minmod", "smooth", "minvan", "3rdsmooth", "3rd_minmod_smooth". -// -- "nolim", no limiter. -// -- "vanalbada_clz", clz supersonic version. -// -- "weno3_js", "wenn3_prm211", "wenn3_zm", "wenn3_zes2", "wenn3_zes3" - +// -- "vanalbada", "vanleer", "minmod", "smooth", "minvan", "3rdsmooth", "3rd_minmod_smooth", +// -- "nolim", no limiter, +// -- "vanalbada_clz", clz supersonic version, +// -- "weno3_js", "wenn3_prm211", "wenn3_zm", "wenn3_zes2", "wenn3_zes3". string inviscidSchemeName = "roe"; int isWennScheme = 0; -string str_limiter_name = "vanalbada"; +string str_limiter_name = "vanalbada"; -#******************************************************************* -# UnStruct Solver or Common * -#******************************************************************* +#************************************************************************ +# UnStruct Solver or Common * +#************************************************************************ // viscousType: Viscous model. -// 0 -- Euler. -// 1 -- Lamilar. -// 2 -- Algebraic. -// 3 -- 1eq turbulent. -// 4 -- 2eq turbulent. +// 0 -- Euler. +// 1 -- Lamilar. +// 2 -- Algebraic. +// 3 -- 1eq turbulent. +// 4 -- 2eq turbulent. // viscousName: Laminar or tubulent model. // -- "0eq-bl". // -- "1eq-sa". @@ -410,16 +419,16 @@ string str_limiter_name = "vanalbada"; // 3 -- IDDES. // uns_scheme_name: Spatial discretisation scheme of Unstruct grid. // Using this when solve Unstructered grid or hybrid. -// -- "vanleer", "roe", "steger", "kfvs", "lax_f", "hlle". +// -- "vanleer", "roe", "GMRESRoe", "GMRESSteger", "steger", "kfvs", "lax_f", "hlle", // -- "ausm+", "ausmdv", "ausm+w", "ausmpw", "ausmpw+". // uns_limiter_name: Limiter of Unstruct grid. -// -- "barth", "vencat", "vanleer", "minmod". -// -- "vanalbada", "smooth", "nnd", "lpz", "1st". +// -- "barth", "vencat", "vanleer", "minmod", +// -- "vanalbada", "smooth", "nnd", "lpz", "1st", // -- "nolim", no limiter. // uns_vis_name: Discretisation method of viscous term. // -- "std", "test", "aver", "new1", "new2". // gradientName: Gradient reconstruction method. -// -- "default", "ggcell", "ggnode", "lsq". +// -- "default", "ggcell", "ggnode", "lsq". // ivencat: Variation of vencat limiter. // 0 -- org method, it is independent of grid scale. // 1 -- new method, it is dependent of grid scale. @@ -442,18 +451,18 @@ string str_limiter_name = "vanalbada"; // 3 -- Harten type, which is default used. // roeEntropyScale: Entropy fix (correction) coefficient scale, default is 1.0. // It is used to scale the default Roe entropy fix coefficients. -// AusmpwPlusLimiter: A Limiter to make "function w" not change acutely in AusmpwPlus scheme, default is 1.0 +// AusmpwPlusLimiter: A Limiter to make "function w" not change acutely in AusmpwPlus scheme, default is 1.0. -//int viscousType = 0; +//int viscousType = 0; //string viscousName = "Euler"; -//int viscousType = 1; +//int viscousType = 1; //string viscousName = "laminar"; -int viscousType = 3; +int viscousType = 3; string viscousName = "1eq-sa"; -//int viscousType = 4; +//int viscousType = 4; //string viscousName = "2eq-kw-menter-sst"; int DESType = 0; @@ -463,7 +472,7 @@ string uns_limiter_name = "vencat"; string uns_vis_name = "test"; string gradientName = "ggnode"; -int ivencat = 7; +int ivencat = 7; double venkatCoeff = 5.0; int reconmeth = 1; int limitVariables = 0; @@ -475,9 +484,9 @@ double roeEntropyScale = 1.0; double AusmpwPlusLimiter = 1.0; -//----------------------------------------------------------------------- -# Temporal Discretisation # -//----------------------------------------------------------------------- +#************************************************************************ +# Temporal Discretisation * +#************************************************************************ // iunsteady: Steady or unsteady. // 0 -- steady. // 1 -- unsteay. @@ -490,51 +499,57 @@ double AusmpwPlusLimiter = 1.0; // statisticalTimePeriod: Used as time period of statistic analysis. // when the value is negative, time period is treated as infinite. // statisticMethod: Statistic reynolds stress method. -// 0 -- tau = - ^2 -// 1 -- tau = +// 0 -- tau = - ^2 +// 1 -- tau = // min_sub_iter: The min sub iteration of unsteady simulation. // max_sub_iter: The max sub iteration of unsteady simulation. // tol_sub_iter: The tolerance of sub iteration of unsteady simulation. // tscheme: Temporal Discretisation method. -// 1 -- Runge-Kutta Multi-State. -// 2 -- Point implicit. -// 3 -- Full implicit. -// 4 -- LU-SGS. -// 5 -- Block LU-SGS. -// 6 -- Jacobian iteration. -// 7 -- Line LU-SGS. -// 8 -- Matrix LU-SGS. +// 1 -- Runge-Kutta Multi-State. +// 2 -- Point implicit. +// 3 -- Full implicit. +// 4 -- LU-SGS. +// 5 -- Block LU-SGS. +// 6 -- Jacobian iteration. +// 7 -- Line LU-SGS. +// 8 -- Matrix LU-SGS. +// 9 -- GMRES. // iSimplifyViscousTerm: Simplify the computation of viscous term in the Block LU-SGS method. The default value assigns 1 that could speed up the computation. // Otherwise, the viscous Jacobian matrix Mv should be computed that will increase the memory and time in iteration of the BLUSGS method. // CFLStart: Started cfl number. // CFLEnd: End cfl number. // CFLVaryStep: The number of step when cfl increase from CFLStart to CFLEnd. +// GMRESCFLScale : CFL = CFLStart * GMRESCFLScal^iteration. +// OriginalTscheme : Used for LUSGS and GMres hybrid computing. +// useLUSGSprecond: Initialize flow field for GMRES. +// 0 --Initialize by first order Jacobian matrix. +// 1 --Initialize by LUSGS. +// GMRESInitStep : the number of iteration step of irst order Jacobian matrix or LUSGS for initialize flow field. // ktmax: Dtratio. dt[i] = MIN(dt[i], ktmax * dtmin / vol[i]) // swapDq: Communication dq between forward/backward sweep of LUSGS or not, default is 0. // nLUSGSSweeps: Sub iteration of LU-SGS or Block LU-SGS. // LUSGSTolerance: Sub iter tolerance of LU-SGS or Block LU-SGS. // ifLocalTimeStep: Time step method. -// 0 --Local. -// 1 --Global. +// 0 --Local. +// 1 --Global. // isUseLocalCFL: use variable number of CFL or not. -// 0 -- global unified CFL number. -// 1 -- local CFL number. +// 0 -- global unified CFL number. +// 1 -- local CFL number. // isUsePreTwall: use the previous temperatures on wall. 1 indicates yes, and 0 indicates no. // visl_min: Minimum value of laminar viscosity coefficient. // turbCFLScale: Turbulence model cfl number factor. // codeOfAleModel: Arbitrary Lagrangian-Eulerian method. -// 0 -- no ALE method. -// 1 -- ALE method for non-moving grids. -// 2 -- ALE method for moving grids. -// 3 -- ALE method for deforming grids. +// 0 -- no ALE method. +// 1 -- ALE method for non-moving grids. +// 2 -- ALE method for moving grids. +// 3 -- ALE method for deforming grids. // wallFunctionType: The type of wall function to implement. -// 0 -- no wall function. (default) -// 1 -- standard wall function. -// 2 -- Pab3D wall function. +// 0 -- no wall function. (default) +// 1 -- standard wall function. +// 2 -- Pab3D wall function. // RKStage: The number of Runge-Kutta step. // lamda: Cofficient of Runge-Kutta step. - -int iunsteady = 0; +int iunsteady = 0; double physicalTimeStep = 0.01; double physicalTimeStepDimensional = -0.001; int ifStartFromSteadyResults = 0; @@ -543,39 +558,42 @@ int ifStaticsReynoldsStress = 0; int startStatisticStep = 800000; double statisticalTimePeriod = -1.0; int statisticMethod = 0; -int linearTwoStepMethods = 1; // 1--BDF1; 2--C-N; 3--BDF2; +int linearTwoStepMethods = 1; // 1--BDF1; 2--C-N; 3--BDF2. int methodOfDualTime = 3; int min_sub_iter = 50; int max_sub_iter = 50; double tol_sub_iter = 0.01; -int tscheme = 4; +int tscheme = 4; int iSimplifyViscousTerm = 1; int ifLocalTimeStep = 0; int isUseLocalCFL = 0; int isUsePreTwall = 0; -double CFLStart = 0.01; -double CFLEnd = 10.0; -int CFLVaryStep = 500; - +double CFLStart = 0.01; +double CFLEnd = 10.0; +int CFLVaryStep = 500; +double GMRESCFLScale = 1.0; +int OriginalTscheme = 9; +int useLUSGSprecond = 1; +int GMRESInitStep = 1000; double pMaxForCFL = 0.2; double pMinForCFL = 0.1; double deltaMaxForCFL = 0.2; double magnifyFactorForCFL = 1.1; double reduceFactorForCFL = 0.5; -double ktmax = 1.0e10; +double ktmax = 1.0e10; -int swapDq = 1; +int swapDq = 1; int nLUSGSSweeps = 1; double LUSGSTolerance = 0.01; -int order = 2; +int order = 2; double visl_min = 0.01; double turbCFLScale = 1.0; -double csrv = 2.0; +double csrv = 1.0; double timemax = 1.0e10; double dtsave = -1.0; int maxale = 10; @@ -591,10 +609,9 @@ double lamda[] = [0.5, 1.0]; //int RKStage = 4; //double lamda[] = [0.25, 0.33333333333, 0.5, 1.0]; - -//----------------------------------------------------------------------- -# File In or Out # -//----------------------------------------------------------------------- +#************************************************************************ +# File In or Out * +#************************************************************************ // numberOfGridGroups: The number of grid groups. // gridfile: The partitioned Grid file path, using relative path, // which is relative to the working directory. @@ -611,20 +628,18 @@ double lamda[] = [0.5, 1.0]; // aircoeffile: The file path to save the aerodynamic force coefficients convergence process, write data for every default (intervalStepForce) steps. // restartNSFile: The file path to write restart flowfield variables, write data for every default (intervalStepFlow) steps. // turbfile: The file path to write restart flowfield variables of turbulence , write data for every default(intervalStepFlow) steps. -// visualfile: The visualization file path of flowfield , write data for every default (intervalStepPlot) steps. +// visualfile: The visualization file path of flowfield, write data for every default (intervalStepPlot) steps. // wall_aircoefile: The file path to save flowfield variables of wall, write data for every default steps. // nDumpSurfaceInfo = 0 the "wall_varfile" write the informations including heat flux. // nDumpSurfaceInfo = 1 the "wall_varfile" write the informations without heat flux. // nIsComputeWallDist: Whether to compute the wall distance. // 0 -- Compute wall distance. // 1 -- Not compute. -// -// protectionFile0 and protectionFile1 : Two continuation file of the data protection mechanism. -// wall_heatfluxfile : The file to output the MaxHeatFlux of wall. - -int numberOfGridGroups = 1; -string gridfile = "./grid/rae2822_hybrid2d__4.fts"; -string wallTemperaturefile= ""; +// protectionFile0 and protectionFile1: Two continuation file of the data protection mechanism. +// wall_heatfluxfile: The file to output the MaxHeatFlux of wall. +int numberOfGridGroups = 1; +string gridfile = "./grid/rae2822_hybrid2d__4.fts"; +string wallTemperaturefile = ""; int nIsComputeWallDist = 0; int walldistMethod = 1; @@ -632,10 +647,12 @@ int cellMethodOrNodeMethod = 0; string resSaveFile = "results/res.dat"; string turbresfile = "results/turbres.dat"; +string transitionResFile = "results/transitionRes.dat"; string aircoeffile = "results/aircoef.dat"; string restartNSFile = "results/flow.dat"; string turbfile = "results/turb.dat"; +string transitionFile = "results/transition.dat"; string visualfile = "results/tecflow.plt"; string wall_aircoefile = "results/wall_aircoef.dat"; @@ -645,10 +662,14 @@ string protectionFile0 = "results/flow0.dat"; string protectionFile1 = "results/flow1.dat"; string wall_heatfluxfile = "results/wall_heatflux.dat"; -int nDumpSurfaceInfo = 0; -string wall_varfile = ""; +string protectionTurbFile0 = "results/turb0.dat"; +string protectionTurbFile1 = "results/turb1.dat"; -string jetDefineFile = "bin/jet.hypara"; +string protectionTransitionFile0 = "results/transition0.dat"; +string protectionTransitionFile1 = "results/transition1.dat"; + +int nDumpSurfaceInfo = 0; +string wall_varfile = ""; string sixDofFileName = "results/sixDofInfo.dat"; string derivativeFileName = "results/identify.dat"; @@ -659,7 +680,8 @@ int plotFieldType = 0; // visualfileType: The file type of visualfile. // 0 -- Tecplot binary. // 1 -- Tecplot ASCII. - +// 2 -- Ensight binary. +// 3 -- Ensight ASCII. int visualfileType = 1; // samplefileMode: The dump mode of sample file. @@ -697,21 +719,21 @@ double upperPlotFieldBox[] = [1.0 1.0 1.0]; // -- vibration temperature(Tv, 33), electron temperature(Te, 34), vibrational energy(Ev, 35), electric energy(Ee, 36), // -- number density of electron(Ne, 37), dimensioanl density(rho, 38), dimensioanl pressure(p, 39), dimensioanl temperature(T, 40), // -- gradientUx(41), gradientUy(42), gradientVx(43), gradientVy(44), streamline_u(45), streamline_v(46), streamline_w(47), -// -- transition intermittency(intermittency, 51), -transition momentum thickness reynolds(MomentumThicknessReynolds, 52), -// -- overlap iblank(iblank, 81) - -// -- specific heat ratio(gama, 56) +// -- transition intermittency(intermittency, 51), transition momentum thickness reynolds(MomentumThicknessReynolds, 52), +// -- local CFL Number(localCFL, 57), minimal CFL Number(minCFL, 58), +// -- overlap iblank(iblank, 81), +// -- specific heat ratio(gama, 56), Knudsen number(kn, 60), Damkohler number(Da, 61), vibrational nonequilibrium number(Vi, 62). // Important Warning: Array size of visualVariables MUST be equal to nVisualVariables!!! // Variables order must from small to big. //-----------the optional parameters list for the wall boundary condition---------------- // nVisualWallVariables: The number of visual variables on wall. // visualWallVariables : dumped variable types, listed as following: -// -coefficient of pressure(cp, 0), -coefficient of friction(cf, 1), yplus(2), -non-dimensional heat flux(Q_NonDim, 3), -dimensional heat flux(Q_Dim, 4), -// -pressure on wall(pw, 5), -temperature on wall(Tw, 6), -density on wall(rhow, 7), -heat flux of translational-rotational temperature term(Qtr, 8), -// -heat flux of species diffusion term(Qs, 9), -heat flux of vibrational temperature term(Qv, 10), -heat flux of electron temperature term(Qe, 11), -// -species mass fractions(Ns, 12), -x component of wall velocity(Vx, 13), -y component of wall velocity(Vy, 14), -z component of wall velocity(Vz, 15) -// -slip translational-rotational temperature(Tts, 16), -slip vibrational temperature(Tvs, 17), -slip electron temperature(Tes, 18), -absolute wall velocity(Vs, 19) -// -Stanton number(St, 20), -coefficient of heat rate(Ch, 21), -temperature jump(deltaT, 22), -Grid Reynolds number on wall(Re_w, 23) +// -- coefficient of pressure(cp, 0), coefficient of friction(cf, 1), yplus(2), non-dimensional heat flux(Q_NonDim, 3), dimensional heat flux(Q_Dim, 4), +// -- pressure on wall(pw, 5), temperature on wall(Tw, 6), density on wall(rhow, 7), heat flux of translational-rotational temperature term(Qtr, 8), +// -- heat flux of species diffusion term(Qs, 9), heat flux of vibrational temperature term(Qv, 10), heat flux of electron temperature term(Qe, 11), +// -- species mass fractions(Ns, 12), x component of wall velocity(Vx, 13), y component of wall velocity(Vy, 14), z component of wall velocity(Vz, 15), +// -- slip translational-rotational temperature(Tts, 16), slip vibrational temperature(Tvs, 17), slip electron temperature(Tes, 18), absolute wall velocity(Vs, 19), +// -- Stanton number(St, 20), coefficient of heat rate(Ch, 21), temperature jump(deltaT, 22), Grid Reynolds number on wall(Re_w, 23), Knudsen number(Kn_wall, 24). int nVisualVariables = 8; int visualVariables[] = [0, 1, 2, 3, 4, 5, 6, 15]; @@ -739,16 +761,18 @@ int dumpStandardModel = 0; // 1 -- Real cell where the probe is located. // nProbeVariables: Number of variables want to be dumped for probes monitered. // probeVariables : Variable types dumped, listed as following: -// -- density(0), u(1), v(2), w(3), pressure(4), temperature(5), mach(6). +// -- density(0), u(1), v(2), w(3), pressure(4), temperature(5), mach(6), +// -- dimensioanl_density(7), dimensioanl_u(8), dimensioanl_v(9), +// -- dimensioanl_w(10), dimensioanl_pressure(11), dimensioanl_temperature(12). // Important Warning: Array size of probeVariables MUST be equal to nProbeVariables!!! // probeVariables order must from small to big. // probeVariablesInterpolationMethod: Interpolation method used to compute the probe variables. -// 0 -- Take the value of probe's cell as probe real value. -// 1 -- Interpolation from probe's and neighbouring cell to probe. -// 2 -- Interpolation from probe's cell nodes to probe. +// 0 -- Take the value of probe's cell as probe real value. +// 1 -- Interpolation from probe's and neighbouring cell to probe. +// 2 -- Interpolation from probe's cell nodes to probe. int ifSetDataMonitor = 0; -int dataMonitorType = 0; +int dataMonitorType = 0; string probesDefineFile = "bin/probes_XYZ.dat"; //int dataMonitorType = 1; @@ -761,28 +785,26 @@ string probesDefineFile = "bin/probes_XYZ.dat"; int searchCellsMethod = 0; -int nProbeVariables = 7; -int probeVariables[] = [0, 1, 2, 3, 4, 5, 6]; -int probeVariablesInterpolationMethod = 0; -//----------------------------------------------------------------------- -# Turbulence Parameter # -//----------------------------------------------------------------------- +int nProbeVariables = 14; +int probeVariables[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]; +int probeVariablesInterpolationMethod = 0; + +#************************************************************************ +# Turbulence Parameter * +#************************************************************************ // turbInterval: Iteration number of turbulence. // kindOfTurbSource: Kinds of turbulent source. // 0 -- Original. // mod_turb_res: If modify the residuals for the cells next to the wall or not, default is 0. -// transitionType: transition model type +// transitionType: transition model type // 0 -- none. // 2 -- gama-re-theta. -// turbIntensity: (valid while greater than 0.0 ) turbulent intensity of free stream(*100) in transition -// freeturbIntensitySRModify: to use SR modify in free stream turbulent intensity decay or not - - +// turbIntensity: (valid while greater than 0.0 ) turbulent intensity of free stream(*100) in transition. +// freeturbIntensitySRModify: to use SR modify in free stream turbulent intensity decay or not. int turbInterval = 1; int turbOrderStruct = 2; int kindOfTurbSource = 0; int mod_turb_res = 0; -double turb_relax = 1.0; double freeStreamViscosity = 1.0e-3; double muoo = 3.0; double kwoo = 5.0; @@ -790,29 +812,28 @@ int transitionType = 0; double turbIntensity = -1.0; int freeturbIntensitySRModify = 0; double freeDecayXLocation = 0.0; -int compressibleCorrection = 0; -int prandtlNumberCorrection = 0; +int compressibleCorrection = 0; int transitionMaFix = 1; -# maximum eddy viscosity (myt/my) max. +// maximum eddy viscosity (myt/my) max. double eddyViscosityLimit = 1.0e10; int monitor_vistmax = 0; -//----------------------------------------------------------------------- -# LES Parameter # -//----------------------------------------------------------------------- +#************************************************************************ +# LES Parameter * +#************************************************************************ // iLES: Create LESSolver or not. -// = 1 - Create LESSolver; -// != 1 - not. +// = 1 -- Create LESSolver; +// != 1 -- not. // amplitudeofDisturb: Amplitude of adding disturb. // disturbstep: Unsteady time step or steady iteration of adding random disturb. // iterdisturb: Add random disturb in every sub-iter or only first sub-iter. -// = 0 - in only first sub-iter; -// != 0 - in every sub-iter. +// = 0 -- in only first sub-iter; +// != 0 -- in every sub-iter. // ipraddisturb: Add density and pressure disturb or not. // ibodyforce: Add body force in source flux of NS equations or not. -// = 0 - not; -// != 0 - Add body force. +// = 0 -- not; +// != 0 -- Add body force. // bodyforce: Body force in source flux of NS equations or not. // utau: friction velocity, using in DNSDisturb. // sgsmodel: subgrid scale model. @@ -820,23 +841,22 @@ int monitor_vistmax = 0; // = "dsmCom"; // = "wale"; // = "sigma". -// deltaFunctionType: = 1 - MAX(deltai, deltaj, deltak); -// = 2 - pow(deltai * deltaj *deltak, 1/3); -// = 3 - Devloped by Scotti. -// wallDampingFunctionType: = 0 - no wall function; -// = 1 - van Driest; -// = 2 - developed by Dr. Deng Xiaobing; -// = 3 - developed by Piomelli. +// deltaFunctionType: = 1 -- MAX(deltai, deltaj, deltak); +// = 2 -- pow(deltai * deltaj *deltak, 1/3); +// = 3 -- Devloped by Scotti. +// wallDampingFunctionType: = 0 -- no wall function; +// = 1 -- van Driest; +// = 2 -- developed by Dr. Deng Xiaobing; +// = 3 -- developed by Piomelli. // turbViscousCutType: turbulent viscosity cut type. -// = 0 - mu_total = mut + mul; -// = 1 - mu_total = max(mut-mul,0)+ mul; -// = 2 - mu_total = max(mut ,0)+ mul. +// = 0 -- mu_total = mut + mul; +// = 1 -- mu_total = max(mut-mul, 0) + mul; +// = 2 -- mu_total = max(mut , 0) + mul. // smagConstant: constant of smagorinsky model. // waleConstant: constant of wale model. -// filterDirection[3]: filter variables in i, j, k direction or not. +// filterDirection [3]: filter variables in i, j, k direction or not. // averageDirection[3]: average variables in i, j, k direction or not. // isotropicConstant: constant of isotropic part of SGS stress. - int iLES = 0; string sgsmodel = "smagorinsky"; int deltaFunctionType = 2; @@ -852,19 +872,16 @@ double testFilterScale = 2.0; int averageWidth = 1; int monitorNegativeConstant = 0; -//----------------------------------------------------------------------- -# Other Parameters for Hypersonic Non-equilibrium Gas # -//----------------------------------------------------------------------- +#************************************************************************ +# Other Parameters for Hypersonic Non-equilibrium Gas * +#************************************************************************ // dg_high_order: // 0 -- generic order accuracy. // 1 -- high order accuracy. // iapplication: // 0 -- gas model is fixed in the codes. // 1 -- gas model is imported from library files. -// isAdaptiveSolver: isAdaptiveSolver=0 indicates the generic Navier-Stokes solver, -// isAdaptiveSolver>0 indicates the HyFlow self-adaptive solver. -// 1 -- using HyFlow self-adaptive solver where the switch is controlled by the total iteration steps. -// 2 -- using HyFlow self-adaptive solver where the switch is controlled by variation of the key residual. +// isAdaptiveSolver: isAdaptiveSolver = 0 indicates the generic Navier-Stokes solver, // nm: Equation number of the physics, but is out of commision now. // 4 -- for 2D. // 5 -- for 3D. @@ -875,7 +892,7 @@ int monitorNegativeConstant = 0; // 2 -- Argon. // 3 -- Nitrogen. // nEnergyRecycle: The type of EnergyModel Recycle. -// 0 -- not used . +// 0 -- not used. // 1 -- used. // nDensityModify: The type of densitymodify. // 0 -- not used. @@ -883,26 +900,25 @@ int monitorNegativeConstant = 0; // nchem: // 0 -- without chemical reaction flow. // 1 -- the chemical reaction flow is considered. -// nEquilibriumGas: the variable is valid when the condition of nchem=0 is satisfied. +// nEquilibriumGas: the variable is valid when the condition of nchem = 0 is satisfied. // 0 -- perfect gas. // 5, 7, 11 -- equilibrium gas, meanwhile, its value denotes the number of gas component. -// nPCWCycleStep: the maximum step number of iteration in the module of computing species mass fractions with the partial catalytic wall(PCW) condition. -// the value equals to or is greater than 1, and 3 is for default value. -// nRETCycleStep: the maximum step number of iteration in the module of computing radiation equilibrium temperature on wall. -// the value equals to or is greater than 1, and 3 is for default value. -// nSLIPCycleStep:the maximum step number of iteration in the module of computing slip temperature, slip velocity and slip species mass fraction. -// the value equals to or is greater than 1, and 3 is for default value. -// nSlipBCModel : The computational model of slip boundary conditions. - -// 0 -- no slip. -// 1 -- the conventional Maxwell slip conditions. -// 2 -- the Gokcen slip conditions. -// 3 -- the Knudsen-layer correction of the standard slip conditions proposed by Lockerby, et al. -// 4 -- the Kogan simplified slip conditions. -// nMeanFreePathType : the method to the mean free-path for the slip conditions. For the mixture, 0 is suggested. -// 0 -- the equivalent mean free-path is calculated by the simple hard sphere model(HS). -// 1 -- calculated by the definition that includes the variables of the number density and the molecule diameter. -// 2 -- the equivalent mean free-path is calculated by the variable hard sphere model(VHS). +// nPCWCycleStep: The maximum step number of iteration in the module of computing species mass fractions with the partial catalytic wall(PCW) condition. +// The value equals to or is greater than 1, and 3 is for default value. +// nRETCycleStep: The maximum step number of iteration in the module of computing radiation equilibrium temperature on wall. +// The value equals to or is greater than 1, and 3 is for default value. +// nSLIPCycleStep:The maximum step number of iteration in the module of computing slip temperature, slip velocity and slip species mass fraction. +// The value equals to or is greater than 1, and 3 is for default value. +// nSlipBCModel: The computational model of slip boundary conditions. +// 0 -- no slip. +// 1 -- the conventional Maxwell slip conditions. +// 2 -- the Gokcen slip conditions. +// 3 -- the Knudsen-layer correction of the standard slip conditions proposed by Lockerby, et al. +// 4 -- the Kogan simplified slip conditions. +// nMeanFreePathType: the method to the mean free-path for the slip conditions. For the mixture, 0 is suggested. +// 0 -- the equivalent mean free-path is calculated by the simple hard sphere model(HS). +// 1 -- calculated by the definition that includes the variables of the number density and the molecule diameter. +// 2 -- the equivalent mean free-path is calculated by the variable hard sphere model(VHS). // nchemsrc: // 0 -- the source terms are not computed. // 1 -- the source terms are computed. @@ -913,148 +929,151 @@ int monitorNegativeConstant = 0; // 1 -- One-temperature model. // 2 -- Two-temperature model. // 3 -- Three-temperature model. +// isUseNoneqCond: +// 0 -- compute the source terms without any conditions. +// 1 -- compute the source terms using the non-equilibrium condition. +// frozenCondition: the threshold value of frozen chemical flow condition, 0.1 is the default value. // nIdealState: whether take all gas species as ideal gas for gas-mixture process. // 0 -- No. -// 1 -- Yes. -// nTEnergyModel: the method to computing temperature energy model. +// 1 -- Yes. // nTEnergyModel: the method to computing temperature energy model. // 0 -- the energy term is computed using the conventional method. // 1 -- the energy term is computed using the polynomial fitting method. // 2 -- the energy term is computed using the piecewise polynomial fitting method. // parkVDPower: the power of translational-rotational temperature in the Park V-D(vibration-dissociation) coupling model. // The value is in range of [0.0, 1.0], DPLR suggests 0.5, LAURA suggests 0.7, while 0.6 is given as default value. // catalyticCoef: -// 0.0 -- full non-catalytic wall boundary condition. -// 1.0 -- full catalytic wall boundary condition. -// in range of (0.0, 1.0) -- partial catalytic condition, the value indicates the catalytic coefficient. -// nIsSuperCatalytic : the super catalytic condition for the fully catalytic wall, and assigned with the value of 1. -// 0 -- equilibrium condition for the fully catalytic wall where the mass fractions are assigned with the values of the free stream. -// 1 -- super catalytic condition for the fully catalytic wall where all the atomic components combine into molecular components. -// nTemperatureJump : the method to calculate the temperature jump. -// 0 -- calculated by the variables of heat conductivity and constant volume specific heat for each energy mode. -// 1 -- the general method where the iteration is calculated with the translation-rotation temperature. -// nSurfGradMethod : the method to compute the surface heating ratio. -// 0 -- the gradient of variable is computed with the first-order difference method. -// 1 -- the gradient of variable is computed with the Green-Guass integral method. -// nRapidFlowfield : initialize the flowfield using the rapid engineering method when it is greater than zero. -// nSurfHeatMonitor : To exam the surface heating change or not. 0 is no, 1 is yes. -// nInitPressureStep : the steps to initialize the boundary variables when the rapid method is used. 100 is the default value. -// nDumpCFLNumber : 1 indicates dumping the CFL number to file, 0 denotes no dumping. +// 0.0 -- full non-catalytic wall boundary condition. +// 1.0 -- full catalytic wall boundary condition. +// in range of (0.0, 1.0) -- partial catalytic condition, the value indicates the catalytic coefficient. +// nIsSuperCatalytic: the super catalytic condition for the fully catalytic wall, and assigned with the value of 1. +// 0 -- equilibrium condition for the fully catalytic wall where the mass fractions are assigned with the values of the free stream. +// 1 -- super catalytic condition for the fully catalytic wall where all the atomic components combine into molecular components. +// nTemperatureJump: the method to calculate the temperature jump. +// 0 -- calculated by the variables of heat conductivity and constant volume specific heat for each energy mode. +// 1 -- the general method where the iteration is calculated with the translation-rotation temperature. +// nSurfGradMethod: the method to compute the surface heating ratio. +// 0 -- the gradient of variable is computed with the first-order difference method. +// 1 -- the gradient of variable is computed with the Green-Guass integral method. +// nRapidFlowfield: initialize the flowfield using the rapid engineering method when it is greater than zero. +// nSurfHeatMonitor: To exam the surface heating change or not. 0 is no, 1 is yes. +// nInitPressureStep: the steps to initialize the boundary variables when the rapid method is used. 100 is the default value. +// nDumpCFLNumber: 1 indicates dumping the CFL number to file, 0 denotes no dumping. // sigmaVelocity: the coordination coefficient of tangential momentum for computation of slip velocity. The value is in range of (0.0, 2.0]. // sigmaTemperature: the heat coordination coefficient for computation of slip temperature. The value is in range of (0.0, 2.0]. // sigmaMassFraction: the species coordination coefficient for computation of slip mass fractions. The value is in range of (0.0, 2.0]. // velocitySlipCorrectConstant: the correction constant to the velocity slip condition. For the diffuse reflection, 1.0 is used. -// 1.0 -- proposed by Maxwell. -// sqrt(2/PI)~0.8 -- used for "micro-slip", namely the actual velocity slip at the wall. -// 1.146 -- proposed for an additional "fictitious" velocity slip. - -// chemicalRelaxCorf: The value is in range of [0.001, 1.0]. -// spectrumRadiusCoef: The value is in range of [0.0, 2.0]. -// staticPressureRelaxCorf: The value is in range of [0.1, 1.0]. -// nIsChemicalFreeze : the flag to freeze the chemical reactions. -// 0 -- not freeze, the chemical reaction sources will be calculated. -// 1 -- freezes the chemical reactions, the chemical reaction sources will not be calculated.// veTemperatureMin: The minimum of Tv and Te - -//maxViscous: the maximum of Viscous. -//trTemperatureMin: the minimum value of trTemperature. -//veTemperatureMin: the minimum value of veTemperature. -//densityMin: the minimum value of density. -//tAdjustmentFactor: magnification of temperature, this value is in range of (1.0, 10.0]. -// nDebug: cout the Wrong place and abort -// 0 -- not used. -// 1 -- used. +// 1.0 -- proposed by Maxwell. +// sqrt(2/PI)~0.8 -- used for "micro-slip", namely the actual velocity slip at the wall. +// 1.146 -- proposed for an additional "fictitious" velocity slip. +// chemicalRelaxCorf: The value is in range of [0.001, 1.0]. +// spectrumRadiusCoef: The value is in range of [0.0, 2.0]. +// staticPressureRelaxCorf: The value is in range of [0.1, 1.0]. +// nIsChemicalFreeze: the flag to freeze the chemical reactions. +// 0 -- not freeze, the chemical reaction sources will be calculated. +// 1 -- freezes the chemical reactions, the chemical reaction sources will not be calculated. +// veTemperatureMin: The minimum of Tv and Te. +// maxViscous: the maximum of Viscous. +// trTemperatureMin: the minimum value of trTemperature. +// veTemperatureMin: the minimum value of veTemperature. +// densityMin: the minimum value of density. +// tAdjustmentFactor: magnification of temperature, this value is in range of (1.0, 10.0]. +// nDebug: cout the Wrong place and abort +// 0 -- not used. +// 1 -- used. // nSpeciesLimit: limitter of gas species -// 0 -- not used. -// 1 -- used. -// nTurblenceForChemical: the coupled mode of Turblence and Chemical reaction -// 0 -- method 0. -// 1 -- method 1. -// nViscosityFluxSublevelModified: Modified for ViscosityFlux on Sublevel grid -// 0 -- not used. -// 1 -- used. -// nViscosityPeModified: Pe Modified for ViscosityCoef -// 0 -- not used. -// 1 -- used. -// nChemcalSourceModified: Modified on ChemcalSource -// 0 -- not used. -// 1 -- used. -// nChemcalSourceEsMethod: Modified on ChemcalSource -// 0 -- approximation algorithm 1 (Ori.) -// 1 -- approximation algorithm 2 (New) - +// 0 -- not used. +// 1 -- used. +// nTurblenceForChemical: the coupled mode of Turblence and Chemical reaction. +// 0 -- method 0. +// 1 -- method 1. +// nViscosityFluxSublevelModified: Modified for ViscosityFlux on Sublevel grid. +// 0 -- not used. +// 1 -- used. +// nViscosityPeModified: Pe Modified for ViscosityCoef. +// 0 -- not used. +// 1 -- used. +// nChemcalSourceModified: Modified on ChemcalSource. +// 0 -- not used. +// 1 -- used. +// nChemcalSourceEsMethod: Modified on ChemcalSource. +// 0 -- approximation algorithm 1 (Ori). +// 1 -- approximation algorithm 2 (New). // nMaxStepTemperature: the iterative steps of temperature. - -// veTemperatureMinModified: Modified on the minimum of Tve for Cvvs -// 0 -- not used -// 1 -- used - -// nDiagonalModified: Modified on Diagonal -// 0 -- not used -// 1 -- Ori. -// 2 -- new - -//nGradPrimtiveMethod: -// 0 -- Ori. -// 1 -- new +// veTemperatureMinModified: Modified on the minimum of Tve for Cvvs. +// 0 -- not used. +// 1 -- used. +// nDiagonalModified: Modified on Diagonal. +// 0 -- not used. +// 1 -- new. +// nDiagonalModifiedTurb: Modified on Diagonal for turbulence. +// 0 -- not used. +// 1 -- new. +// nGradPrimtiveMethod: +// 0 -- Ori. +// 1 -- new. // nAblation: -// 0 -- The wall ablation is not computed. -// 1 -- The wall ablation is computed. +// 0 -- The wall ablation is not computed. +// 1 -- The wall ablation is computed. // isInjection: -// 0 -- The injection velocity of ablation wall is not computed. -// 1 -- The injection velocity of ablation wall is computed. +// 0 -- The injection velocity of ablation wall is not computed. +// 1 -- The injection velocity of ablation wall is computed. // nViscosityModel: -// 0 -- Blottner fitting method(N89). -// 1 -- Gupta fitting method(N90). +// 0 -- Blottner fitting method(N89). +// 1 -- Gupta fitting method(N90). // nContinueModel: The new continue model can switch different computation model. -// 0 -- Not use the new continue model. -// 1 -- use the new continue model. +// 0 -- Not use the new continue model. +// 1 -- use the new continue model. // nSutherland: -// 0 -- stands for selecting the Blotter curve fits mode. -// 1 -- stands for Sutherland relation. +// 0 -- stands for selecting the Blotter curve fits mode. +// 1 -- stands for Sutherland relation. // gasfile: Indicates the gas model, 9 models are provided, namely "Gu5", "Gu7", "Gu11", "Pa5", "Pa7", "Pa11", "DK5", "DK7", "DK11". -// "Gu" -- indicates the Gupta Model, three-Type Models are embeded in the library, namely, the 5-species-6-reactions, the 7-species-9-reactions, the 11-species-20-reactions. -// "Pa" -- indicates the Park Model, three-Type Models are embeded in the library, namely, the 5-species-17-reactions, the 7-species-22-reactions, the 11-species-48-reactions. -// "DK" -- indicates the Dunn-Kang Model, three-Type Models are embeded in the library, namely, the 5-species-11-reactions, the 7-species-15-reactions, the 11-species-26-reactions. -// "Mars-Pa8" is for Park model of Mars gas, "Mars-Mc8" for McKenzie model of Mars gas. -// "Combustion-12" -- indicates the Combustion Chamber Gas Model which includes 12-species-20-reactions. -// "Gas-Mixture" -- indicates the process of mixing gas without reacting. -// for struct solver mixing two speciesSpeciesA, SpeciesB. -// for unstruct solver mixing multi-speciesO2 NO CO CO2 H2 N2 Air CH4. -// For self-definition model, the gasfile is used to indicate the file path of the new gas model. +// "Gu" -- indicates the Gupta Model, three-Type Models are embeded in the library, namely, the 5-species-6-reactions, the 7-species-9-reactions, the 11-species-20-reactions. +// "Pa" -- indicates the Park Model, three-Type Models are embeded in the library, namely, the 5-species-17-reactions, the 7-species-22-reactions, the 11-species-48-reactions. +// "DK" -- indicates the Dunn-Kang Model, three-Type Models are embeded in the library, namely, the 5-species-11-reactions, the 7-species-15-reactions, the 11-species-26-reactions. +// "Mars-Pa8" is for Park model of Mars gas, "Mars-Mc8" for McKenzie model of Mars gas. +// "Combustion-12" -- indicates the Combustion Chamber Gas Model which includes 12-species-20-reactions. +// "Gas-Mixture" -- indicates the process of mixing gas without reacting. +// for struct solver mixing two species��SpeciesA, SpeciesB��. +// for unstruct solver mixing multi-species��O2 NO CO CO2 H2 N2 Air CH4��. +// For self-definition model, the gasfile is used to indicate the file path of the new gas model. // speciesName: Used to list the names of each species, while each species name is separated by the symbol of comma. // initMassFraction: Used to list the initial mass fractions of species in accordance with the sequence of names in the parameter speciesName. // ifStartFromPerfectGasResults: The chemical reaction simulation is start from perfect gas flowfield or not, 0 is for no and else is for yes. -// nIterFirstStep : the maximum number of iteration in the first step for the self-adaptive calculation. -// nIterSecondStep : the maximum number of iteration in the second step for the self-adaptive calculation. -// nIterThirdStep : the maximum number of iteration in the third step for the self-adaptive calculation. -// nEnergyAssembly : the vibration energy is computed with combined method which includes the fitting method and the molecular kinetic theory. -// 0 -- no, -// 1 -- yes. +// nIterFirstStep : the maximum number of iteration in the first step for the self-adaptive calculation. +// nIterSecondStep: the maximum number of iteration in the second step for the self-adaptive calculation. +// nIterThirdStep : the maximum number of iteration in the third step for the self-adaptive calculation. +// nEnergyAssembly: the vibration energy is computed with combined method which includes the fitting method and the molecular kinetic theory. +// 0 -- no, +// 1 -- yes. // nControlVariable: the variable to computing the residual error that determines the convergence is meet or not in the one-temperature model. -// 0 -- the density. -// 1 -- the translation temperature. -// 2 -- the vibration temperature. -// 3 -- the electron temperature. -// 4 -- the pressure. -// 5 -- the mass fraction of oxygen. -// 6 -- the mass fraction of nitrogen. +// 0 -- the density. +// 1 -- the translation temperature. +// 2 -- the vibration temperature. +// 3 -- the electron temperature. +// 4 -- the pressure. +// 5 -- the mass fraction of oxygen. +// 6 -- the mass fraction of nitrogen. // firstStepError : the residual error of the first step iteration for the self-adaptive calculation. // secondStepError : the residual error of the second step iteration for the self-adaptive calculation. // thirdStepError : the residual error of the third step iteration for the self-adaptive calculation. -// useHyflowSetting : Setting for HyFLOW GUI. -// 0 -- PHengLEI -// 1 -- HyFLOW -// nProtectData : Use the continuation file data protection mechanism. -// 0 -- no -// 1 -- yes - +// nProtectData: Use the continuation file data protection mechanism. +// 0 -- no. +// 1 -- yes. +// nTvChange: Judge whether the Tv equals Ttr. +// 0 -- yes. +// 1 -- no. +// isMoleFractionType: 1 indicates the mass fractions, or else the mole fractions. +// nFraction: the initial fractions type of species. +// 0 -- mass fraction. +// 1 -- mole fraction. int dg_high_order = 0; int iapplication = 0; int isAdaptiveSolver = 0; -int nm = 5; +int nm = 5; int nEquilibriumGas = 0; -int nPCWCycleStep = 3; -int nRETCycleStep = 3; -int nSLIPCycleStep= 3; +int nPCWCycleStep = 3; +int nRETCycleStep = 3; +int nSLIPCycleStep = 3; int nIterFirstStep = 1000; int nIterSecondStep= 2000; int nIterThirdStep = 2000; @@ -1065,17 +1084,17 @@ double secondStepError = 0.001; double thirdStepError = 0.001; double predictCFLError = 0.1; -double refGama = 1.4; -double prl = 0.72; -double prt = 0.90; -double sc_l = 0.5; -double sc_t = 0.5; +double refGama = 1.4; +double prl = 0.72; +double prt = 0.90; +double sc_l = 0.5; +double sc_t = 0.5; -int nGasModel = 0; -int nchem = 0; -int nchemsrc = 1; -int nchemrad = 1; -int ntmodel = 1; +int nGasModel = 0; +int nchem = 0; +int nchemsrc = 1; +int nchemrad = 1; +int ntmodel = 1; int nIdealState = 0; int nEnergyRecycle = 1; @@ -1099,12 +1118,12 @@ double sigmaTemperature = 1.0; double sigmaMassFraction = 1.0; double velocitySlipCorrectConstant = 1.0; -double chemicalRelaxCorf = 1.0; +double chemicalRelaxCorf = 1.0; double chemicalSpectrumRadiusCoef = 1.0; double viscousSpectrumRadiusCoef = 1.5; double inviscidSpectrumRadiusCoef = 1.5; -double spectrumRadiusCoef = 0.5; -double staticPressureRelaxCorf = 0.2; +double spectrumRadiusCoef = 0.5; +double staticPressureRelaxCorf = 0.2; double maxViscous = 10000.0; double trTemperatureMin = 10.0; @@ -1114,31 +1133,35 @@ double densityMin = 1.0e-8; double densityMinFactor = 0.1; double tAdjustmentFactor = 10.0; double iniSpeedCoef = 1.0; +int iniSpeedMode = 0; -int nDebug = 0; -int nSpeciesLimit = 1; -int nTurblenceForChemical = 0; -int nViscosityFluxSublevelModified = 1; -int nViscosityPeModified = 0; -int nChemcalSourceModified = 2; -int nChemcalSourceEsMethod = 1; -int nMaxStepTemperature = 5; -int veTemperatureMinModified = 1; -int nDiagonalModified = 0; -int nGradPrimtiveMethod = 1; -int nInviscidFluxModify = 1; -int nQlLimitMethod = 2; -int nSpeciesForWallMethod = 1; -int nDensityForWallMethod = 0; +int nDebug = 0; +int nSpeciesLimit = 1; +int nTurblenceForChemical = 0; +int nViscosityFluxSublevelModified = 1; +int nViscosityPeModified = 0; +int nChemcalSourceModified = 2; +int nChemcalSourceEsMethod = 1; +int nMaxStepTemperature = 5; +int veTemperatureMinModified = 1; +int nDiagonalModified = 0; +int nDiagonalModifiedTurb = 0; +int nGradPrimtiveMethod = 1; +int nInviscidFluxModify = 1; +int nQlLimitMethod = 2; +int nSpeciesForWallMethod = 1; +int nDensityForWallMethod = 0; +int wallMultiTemperature = 0; -int nProtectData = 0; -int useHyflowSetting = 0; -int nAblation = 0; -int isInjection = 0; -int nViscosityModel = 0; -int nMarsModel = 0; -string gasfile = "DK5"; -//string gasfile = "./chemical/Dunn-Kang_air5s11r.dat"; +int nProtectData = 0; +int nAblation = 0; +int isInjection = 0; +int nViscosityModel = 0; +int nMarsModel = 0; +int nTvChange = 0; +int isMoleFractionType = 0; +string gasfile = "DK5"; +//string gasfile = "./chemical/Dunn-Kang_air5s11r.dat"; string speciesName = "O, O2, NO, N, N2"; string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.767"; @@ -1152,16 +1175,16 @@ string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.767"; //string speciesName = "O, O2, NO, N, N2, C, CO, CO2"; //string initMassFraction = "0.0015, 0.0429, 0.0, 0.0, 0.0, 0.0, 0.0777, 0.8779"; -//string gasfile = "Pa"; +//string gasfile = "Pa"; //string speciesName = "O, O2, NO, N, NO+, C, C2, CO, CO2, CN, N2, e-"; //string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.767, 0.0"; -//string gasfile = "Combustion-12"; +//string gasfile = "Combustion-12"; //string speciesName = "O, O2, NO, N, C, CO, CO2, H, H2, OH, H2O, N2"; //string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.767"; //string gasfile = "Gas-Mixture"; -//string speciesName ="SpeciesA, SpeciesB"; +//string speciesName = "SpeciesA, SpeciesB"; //string initMassFraction = "1.0, 0.0"; int nSutherland = 0; double gamaSpeciesA = 1.4; @@ -1173,9 +1196,17 @@ double molecularWeightSpeciesB = 30.0; //string speciesName = "O2, N2"; //string initMassFraction = "1.0, 0.0"; +int nFraction = 0; int nContinueModel = 0; int nChemicalFlowStep = 0; int ifStartFromPerfectGasResults = 0; +int isUseNoneqCond = 0; +double frozenCondition = 0.01; + +int nLeakageMonitor = 0; +double totalLeakageVolume = 1000.0; +double monitorThresholdValue = 0.05; +double sprayFactor = 0.0; ######################################################################### // Multi-Grid parameters. @@ -1196,7 +1227,6 @@ int ifStartFromPerfectGasResults = 0; // 1 -- zero order. // 2 -- first-order. (default) // mgCorrectionLimit: Multi-grid correction limit. - int nMGLevel = 1; int MGCoarsestIteration = 1; int MGPreIteration = 1; @@ -1218,20 +1248,20 @@ int ismooth_turb = 0; int SAProductType = 2; // ----------------- Overset Grid parameter ----------------------------- -int codeOfDigHoles = 1; -int codeOfTurbulentModel = 0; -string masterFileName = "./grid/searchFile.inp"; -string holeBasicFileName = "./grid/holeBasicFile.inp"; -string holeFullFileName = "./grid/holeFullFile.dat"; -string linkFileName = "./grid/topology.dat"; -string zoneInverseFileName = "./grid/zoneInverseMapping.inp"; +int codeOfDigHoles = 1; +int codeOfTurbulentModel = 0; +string masterFileName = "./grid/searchFile.inp"; +string holeBasicFileName = "./grid/holeBasicFile.inp"; +string holeFullFileName = "./grid/holeFullFile.dat"; +string linkFileName = "./grid/topology.dat"; +string zoneInverseFileName = "./grid/zoneInverseMapping.inp"; -######################################################################### -# High Order Struct Solver # -######################################################################### +#************************************************************************ +# High Order Struct Solver * +#************************************************************************ // isFVMOrFDM: -// 0 -- NSSolverStruct using Finite Volume Method. -// 1 -- NSSolverStruct using Finite Differ Method. +// 0 -- NSSolverStruct using Finite Volume Method. +// 1 -- NSSolverStruct using Finite Differ Method. // SolverStructOrder: Spatial discretisation order of NS equations with struct grid. // <= 2 -- finite volume method. // >= 3 -- finite difference order. (to be completed) @@ -1273,30 +1303,48 @@ int allReduceStep = 1; // codeOfOversetGrid: Overlapping(overset) grid or not. // 0 -- NON-overlapping grid. // 1 -- Overlapping grid. -// oversetInterpolationMethod: the method of overset interpolation while field simulation +// oversetInterpolationMethod: the method of overset interpolation while field simulation. // 0 -- set the acceptor cell value by donor cell value. // 1 -- set the acceptor cell value by distance weight of donor cell value. - -int codeOfOversetGrid = 0; -int oversetInterpolationMethod = 0; -int readOversetFileOrNot = 0; -int symetryOrNot = 0; -int readInAuxiliaryInnerGrid = 0; -int readInAuxiliaryOuterGrid = 0; -int readInSklFileOrNot = 0; -string auxiliaryInnerGrid0 = "./grid/aux-upper.fts"; -string auxiliaryInnerGrid1 = "./grid/aux-lower.fts"; -string auxiliaryInnerGrid2 = ""; -string oversetGridFileName = "./grid/iblank.ovs"; -double walldistMainZone = 1.0 -double toleranceForOversetSearch = 1.0e-3; -double toleranceForOversetBox = 1.0e-3; -int twoOrderInterpolationOrNot = 0; -int keyEnlargeOfActiveNodes = 0; -int outTecplotOverset = 0; -int outPutOversetVisualization = 0; - -int numberOfMovingBodies = 2; +// readOversetFileOrNo: Whether to read overset-file(.ovs) that has been generated. +// 0 -- no. +// 1 -- yes. +// symetryOrNot: If there exist symetryplanes(XY plane, the coordinate of Z direction is 0) in +// the current overset grid(only for three dimension). +// 0 -- no. +// 1 -- yes. +// readInAuxiliaryInnerGrid: Whether to read auxiliary inner grid. +// 0 -- no. +// 1 -- yes. +// walldistMainZone: The initial value of background grid which does not exist wall boundary condition. +// toleranceForOversetSearch: The tolerance of overset searching zone to judge whether the obtained node is in the current computing cell. +// toleranceForOversetBox: The tolerance of building the minimum box of computing cells in the overlapping region. +// twoOrderInterpolationOrNot: The number of interpolated cell layers in the overlapping boundary. +// 0 -- one layer. +// 1 -- two layers. +// keyEnlargeOfActiveNodes: The number of enlarged overset-boundary layers in the buffer region. +// outTecplotOverset: Whether to dump out the flowfield data after the progress of overset configure. +// 0 -- no. +// 1 -- yes. +int codeOfOversetGrid = 0; +int oversetInterpolationMethod = 0; +int readOversetFileOrNot = 0; +int symetryOrNot = 0; +int readInAuxiliaryInnerGrid = 0; +int readInAuxiliaryOuterGrid = 0; +int readInSklFileOrNot = 0; +string auxiliaryInnerGrid0 = "./grid/aux-upper.fts"; +string auxiliaryInnerGrid1 = "./grid/aux-lower.fts"; +string auxiliaryInnerGrid2 = ""; +string oversetGridFileName = "./grid/iblank.ovs"; +double walldistMainZone = 1.0 +double toleranceForOversetSearch = 1.0e-3; +double toleranceForOversetBox = 1.0e-3; +int twoOrderInterpolationOrNot = 0; +int keyEnlargeOfActiveNodes = 0; +int outTecplotOverset = 0; +int outPutOversetVisualization = 0; +int numberOfMovingBodies = 2; // ----------------- ALE configuration ------------------------------ int codeOfAleModel = 0; @@ -1306,36 +1354,42 @@ double referenceLength = 1.0; double referenceVelocity = 1.0; double referenceDensity = 1.0; -int strategyForFaceNormalVelocity = 0; //0-By Sweeping volume; 1-By face center 1st; 2-By face center 2nd; -int strategyForGCLSource = 0; //0-present; 1-Ahn; +int strategyForFaceNormalVelocity = 0; // 0-By Sweeping volume; 1-By face center 1st; 2-By face center 2nd. +int strategyForGCLSource = 0; // 0-present; 1-Ahn. -//0:1st-Admas-Bashforth; 1:2nd-Admas-Bashforth; 2:1st-Implicit-Euler; 3:2nd-Implicit Euler; 4:2nd-Adams-Moulton; 5:3rd-Adams-Moulton +// 0: 1st-Admas-Bashforth; 1: 2nd-Admas-Bashforth; 2: 1st-Implicit-Euler; 3: 2nd-Implicit Euler; 4: 2nd-Adams-Moulton; 5: 3rd-Adams-Moulton. int methodForKineticEquation = 0; double relaxParameterOfKinetic = 1.0; -######################################################################### -# motive information # -######################################################################### +#************************************************************************ +# motive information * +#************************************************************************ int numberOfMovingBodies = 1; ############################## body0 ############################## -//mass of parts -double mass_0 = 1.0; -//mass matrix of parts Ixx Iyy Izz Ixy Ixz Iyz -double massMatrix_0[] = 1e-7, 1e-6, 1e-6, 0.0, 0.0, 0.0; -//initial six DOF position information of parts. xc yc zc -double massCenter_0[] = 0.0 , 0.0, 0.0; -//initial six DOF position information of parts. angleX angleY angleZ -double attitudeAngle_0[] = 0.0 , 0.0, 0.0; -//initial six DOF move information of parts. vc vy vz -double massCenterVelocity_0[] = 0.0, 0.0, 0.0; -//initial six DOF move information of parts. omigX omigY omigZ -double angularVelocity_0[] = 0.0, 0.0, 0.0; -//the object that the parts belong to. -int fartherIndex_0 = -1; -//the assembly position of the parts. xc yc zc angleX angleY angleZ -double configPamameter_0[] = 0.0 ,0.0 ,0.0 ,0.0 ,0.0 ,0.0; -//the move pattern of the parts. +// mass of parts. +double mass_0 = 1.0; +// gravity of parts (along negative direction in Y-axis, eg. 9.8). +double gravity_0 = 0.0; +// mass matrix of parts Ixx Iyy Izz Ixy Ixz Iyz. +double massMatrix_0[] = 1e-7, 1e-6, 1e-6, 0.0, 0.0, 0.0; +// initial six DOF position information of parts. xc yc zc. +double massCenter_0[] = 0.0, 0.0, 0.0; +// if reset mass center while restart. +int resetMassCenter_0 = 0; +// position offset of parts. dx dy dz. +double massCenterDxyz_0[] = 0.0, 0.0, 0.0; +// initial six DOF position information of parts. angleX angleY angleZ. +double attitudeAngle_0[] = 0.0, 0.0, 0.0; +// initial six DOF move information of parts. vc vy vz. +double massCenterVelocity_0[] = 0.0, 0.0, 0.0; +// initial six DOF move information of parts. omigX omigY omigZ. +double angularVelocity_0[] = 0.0, 0.0, 0.0; +// the object that the parts belong to. +int fartherIndex_0 = -1; +// the assembly position of the parts. xc yc zc angleX angleY angleZ. +double configPamameter_0[] = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0; +// the move pattern of the parts. // -1 given motion partten. // 0 still. // 1 six DOF motion. @@ -1346,51 +1400,68 @@ double configPamameter_0[] = 0.0 ,0.0 ,0.0 ,0.0 ,0.0 // 14 forced pitch motion. // 15 forced yaw motion. // 16 forced roll motion. -int RBDMethod_0 = 0; -double amplitude_0 = 0.0; -double reduceFrequency_0 = 0.0; -//direction of rotation +int RBDMethod_0 = 0; +double amplitude_0 = 0.0; +double reduceFrequency_0 = 0.0; +// direction of rotation. // 1 -- clockwise from the point of view along the positive x axis. // -1 -- anticlockwise from the point of view along the positive x axis. -int direction_0 = -1; -double rotateFrequency_0 = 0.0; -//string uDFSixDofFileName_0 = "./Bin/UDFSixDof.Parameter"; -//additional force (system axis) fX fY fZ -double addedForce_0[] = 0.0 ,0.0 ,0.0 ; -//additional moment of Force (system axis) mX mY mZ -double addedMoment_0[] = 0.0 ,0.0 ,0.0 ; -//the deformation method of the parts. -int morphing_0 = 0; - -// post indentify -int integralOrder = 4; +int direction_0 = -1; +double rotateFrequency_0 = 0.0; +//string uDFSixDofFileName_0 = "./Bin/UDFSixDof.Parameter"; +// dimensional physical time for additional force(s). +double addedForceTime_0[] = 0.0; +// additional force(inertia system) fX fY fZ. +double addedForce_0[] = 0.0, 0.0, 0.0; +// additional moment(inertia system) mX mY mZ. +double addedMoment_0[] = 0.0, 0.0, 0.0; +// the deformation method of the parts. +int morphing_0 = 0; +// post indentify. +int integralOrder = 4; // ---------------- ATP read -------------------------------------------- -//@int inflowParaType = 0; +//@int inflowParaType = 0; //@double refReNumber = 6.5e6; //@double refDimensionalTemperature = 288.15; //@double freestream_vibration_temperature = 300.00; -//@double refDimensionalPressure = 0; -//@double height = 0; -//@int nsubsonicInlet = 0; -//@int nsubsonicOutlet = 0; -//@string inLetFileName = "./bin/subsonicInlet.hypara"; -//@string outLetFileName = "./bin/subsonicOutlet.hypara"; +//@double refDimensionalPressure = 0; +//@double height = 0; +//@int nsubsonicInlet = 0; +//@int nsubsonicOutlet = 0; +//@string inLetFileName = "./bin/subsonicInlet.hypara"; +//@string outLetFileName = "./bin/subsonicOutlet.hypara"; //@double refDimensionalVelocity = 0; //@double refDimensionalDensity = 0; - -######################################################################### -# Old Parameter # -######################################################################### +//@string weatherDataFilePath = "./WRFData/"; +//@double longitude = 110.95 +//@double latitude = 19.61; +#************************************************************************ +# Old Parameter * +#************************************************************************ int isPlotVolumeField = 0; +#************************************************************************ +# partial flow field setting Parameter * +#************************************************************************ +//int nPartialParameter = 0; // 0/1/2 +//int nNumberOfPartialField = 0; // +//int nStartGridIndex[] = [0]; +//int nEndGridIndex[] = [0]; -######################################################################### -# Incompressible Parameter # -######################################################################### +//double partialCFL[] = [0.0]; +//double partialSpeedCoef[] = [0.0]; +//double partialSpeed[] = [0.0]; +//double partialAttackd[] = [0.0]; +//double partialSlide[] = [0.0]; +//double partialPressure[] = [0.0]; +//double partialTemperature[] = [0.0]; +//double partialMassFractions[] = [0.0]; +#************************************************************************ +# Incompressible Parameter * +#************************************************************************ int isSolveEnergyEquation = 0; int isSolveTurbEquation = 0; -int isSolveSpeciesEquation = 0; - +int isSolveSpeciesEquation = 0; \ No newline at end of file diff --git a/A12_ThreeD_DoubleEllipse_Laminar_Struct_4CPU/bin/grid_para.hypara b/A12_ThreeD_DoubleEllipse_Laminar_Struct_4CPU/bin/grid_para.hypara index f25e16e..7aa1a7f 100644 --- a/A12_ThreeD_DoubleEllipse_Laminar_Struct_4CPU/bin/grid_para.hypara +++ b/A12_ThreeD_DoubleEllipse_Laminar_Struct_4CPU/bin/grid_para.hypara @@ -4,9 +4,12 @@ // gridtype: Grid type for generation, conversion, reconstruction, merging. // 0 -- Unstructured grid. // 1 -- Structured grid. -// axisup: Type of Cartisien coordinates system, used in grid conversion. -// 1 -- Y upward. (default) -// 2 -- Z upward. +// nAxisRotateTimes: number of axis rotating times, zero (default) meaning without rotating. +// axisRotateOrder : axis rotating order. +// 1 -- X-axis. +// 2 -- Y-axis. +// 3 -- Z-axis. +// axisRotateAngles: axis rotating angles (degree), which are corresponding to the axis rotating order. // from_gtype: Type of grid data type in grid conversion process. // -1 -- MULTI_TYPE. // 1 -- PHengLEI, *.fts. @@ -18,7 +21,9 @@ // 7 -- Hybrid, include both of unstructured and structured grid, *.fts. // 8 -- GMSH, *.msh. int gridtype = 1; -int axisup = 1; +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; int from_gtype = 3; ######################################################################### diff --git a/A13_TwoD_BackwardStep_PressureOutlet_SA_Struct_4CPU/bin/cfd_para.hypara b/A13_TwoD_BackwardStep_PressureOutlet_SA_Struct_4CPU/bin/cfd_para.hypara index c344658..f903a5a 100644 --- a/A13_TwoD_BackwardStep_PressureOutlet_SA_Struct_4CPU/bin/cfd_para.hypara +++ b/A13_TwoD_BackwardStep_PressureOutlet_SA_Struct_4CPU/bin/cfd_para.hypara @@ -8,23 +8,24 @@ // Platform for Hybrid Engineering Simulation of Flows + // China Aerodynamics Research and Development Center + // (C) Copyright, Since 2010 + +// PHengLEI 2212 + //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ########################################################################### # Default parameters for Grid conversion # ########################################################################### // gridtype: Grid type for generation, conversion, reconstruction, merging. -// 0 -- Unstructured grid. -// 1 -- Structured grid. -// 2 -- Hybrid grid, include both of unstructured and structured grid. -// gridobj: Task type of grid treatment. -// 0 -- Grid generation of typical case, such as cylinder, flat plate, etc. -// 1 -- Grid conversion, from other grid data to PHenglEI, such as Fluent, CGNS. -// 2 -- Grid refinement. -// 3 -- Grid merging, merge two blocks into one block. -// 4 -- Grid deformation, achieve unstructured grid deformation. -// 5 -- Grid repairing, repair the original grid in order to remove the negative volume cells. -// 6 -- Grid mirroring, mirror a symmetry grid to whole grid. -// 7 -- Grid type change, convert structured grid to unstructured grid. +// 0 -- Unstructured grid. +// 1 -- Structured grid. +// 2 -- Hybrid grid, include both of unstructured and structured grid. +// gridobj: Task type of grid treatment. +// 0 -- Grid generation of typical case, such as cylinder, flat plate, etc. +// 1 -- Grid conversion, from other grid data to PHenglEI, such as Fluent, CGNS. +// 2 -- Grid refinement. +// 3 -- Grid merging, merge two blocks into one block. +// 4 -- Grid deformation, achieve unstructured grid deformation. +// 5 -- Grid repairing, repair the original grid in order to remove the negative volume cells. +// 6 -- Grid mirroring, mirror a symmetry grid to whole grid. +// 7 -- Grid type change, convert structured grid to unstructured grid. // multiblock: Multi-block grid or not, only for structured grid conversion. // 0 -- Not. // 1 -- Yes. @@ -46,19 +47,24 @@ int gridobj = 1; int multiblock = 0; int iadapt = 0; int SymmetryFaceVector = 1; - int gridReorder = 0; int faceReorderMethod = 0; -// axisup: Type of Cartisien coordinates system, used in grid conversion. -// 1 -- Y upward. (default) -// 2 -- Z upward. -int axisup = 1; +// nAxisRotateTimes: number of axis rotating times, zero (default) meaning without rotating. +// axisRotateOrder : axis rotating order. +// 1 -- X-axis. +// 2 -- Y-axis. +// 3 -- Z-axis. +// axisRotateAngles: axis rotating angles (degree), which are corresponding to the axis rotating order. +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; // omit_no_bound_bc: What's boundary condition for the type of "no_boundary_condition". // 0 -- Interface. (default) // 1 -- Physical boundary condition, used in Hybrid solver. int omit_no_bound_bc = 0; +int omitRepeatInterface = 1; //----------------------------------------------------------------------- # Grid data type # @@ -87,10 +93,9 @@ int dumpOldGrid = 0; // from_gfile: path of original data file for unstructure grid convert from. // out_gfile: path of target file for grid convert to, *.fts type of file usually. int numberOfGridFile = 1; -string from_gfile = "./grid/rae2822_hybrid2d.cas"; -string from_gfile1= ""; - -string out_gfile = "./grid/flat_laminr_133_85_2d.fts"; +string from_gfile = "./grid/rae2822_hybrid2d.cas"; +string from_gfile1 = ""; +string out_gfile = "./grid/flat_laminr_133_85_2d.fts"; // ----------------- some advanced choices ------------------------------ // iunsteady: The Grid is for unsteady simulation or not. @@ -103,9 +108,9 @@ int fileformat = 0; // Parameters for hybrid solver. // mixgrid_uns: path of unstructure grid file for hybrid solver, *.fts type. -// mixgrid_str: path of structure grid file for hybrid solver, *.fts type. -string mixgrid_uns = "./grid/rae2822_uns2d_4.fts"; -string mixgrid_str = "./grid/flat_laminr_133_85_2d.fts"; +// mixgrid_str: path of structure grid file for hybrid solver, *.fts type. +string mixgrid_uns = "./grid/rae2822_uns2d_4.fts"; +string mixgrid_str = "./grid/flat_laminr_133_85_2d.fts"; // Some parameters for structured overlapping grid. int codeOfDigHoles = 1; @@ -119,31 +124,31 @@ string zoneInverseFileName = "./oversetGridView/zoneInverseMapping.inp"; // 0 -- Not. (default) // 1 -- Yes. // geometryUnit: Geometry unit. -// 1 -- meter. -// 2 -- millimeter. -// 3 -- inch. +// 1 -- meter. +// 2 -- millimeter. +// 3 -- inch. // exclusiveCase: Parallel projection exclusive case. -// 0 -- NON case. -// 1 -- JSM-C2-NPOFF case. -// 2 -- CHNT. +// 0 -- NON case. +// 1 -- JSM-C2-NPOFF case. +// 2 -- CHNT. // projectOrgPoint: If the original wall points need to be projected or not. -int anisoRefine = 0; -int geometryUnit = 1; -int isProject = 0; -int readDist = 0; -int isDeform = 0; +int anisoRefine = 0; +int geometryUnit = 1; +int isProject = 0; +int readDist = 0; +int isDeform = 0; int exclusiveCase = 0; int projectOrgPoint = 0; string geometryFileName = "./grid/jsm.igs"; // ----------------- Grid Deform Parameters ----------------------------- // deformationMethod: Grid Deform. -// 1 -- SPRING. -// 2 -- RBF. +// 1 -- SPRING. +// 2 -- RBF. // stationalGridFile: Original grid file. // visualFileName : The visualization file path of deform grid. // nDeformStep : The max deform step. -// flapAngle : The max flap angle. +// flapAngle : The max flap angle. // rotatePostionZ : Rotate postion. // rotatePostionY : Rotate postion. // gridSlice : If dump slice grid. @@ -163,10 +168,10 @@ int sliceAxis = 1; double slicePosition = 13; // ----------------- RBF Parameters ------------------------------------- -// numberOfReferenceCP : Number of reference Control Points. -// influencePara : The RBF influence radius parameter. +// numberOfReferenceCP: Number of reference Control Points. +// influencePara : The RBF influence radius parameter. int numberOfReferenceCP = 40; -double influencePara = 25.0; +double influencePara = 25.0; // ----------------- Periodic Parameters -------------------------------- // Notice: Rotational periodicity only support rotation along the X axis! @@ -178,9 +183,8 @@ double influencePara = 25.0; which only support one direction. // rotationAngle: The relative angle between two periodic face. which is recorded in degrees. - int periodicType = 0; -double translationLength[] = [0.0,0.0,0.0]; +double translationLength[] = [0.0, 0.0, 0.0]; double rotationAngle = 0.0; ######################################################################### @@ -192,7 +196,6 @@ double rotationAngle = 0.0; // 2 -- refine structured grid. // maxproc: The number of partition zones that want to be divided into. // numberOfMultifile: The number of partition grid files that want to be dumped out. - int pgridtype = 0; int maxproc = 4; int numberOfMultifile = 1; @@ -201,20 +204,20 @@ int numberOfMultifile = 1; // 0 -- Not. // 1 -- Yes. // blockIndexOfMark: the block index of mark, only for structured grid partition. -// cellIndexOfMark: the cell index of mark, only for structured grid partition. +// cellIndexOfMark : the cell index of mark, only for structured grid partition. int traceMark = 0; int blockIndexOfMark = 0; -int cellIndexOfMark[] = [185,30,1]; +int cellIndexOfMark[] = [185, 30, 1]; -// parallel Strategy: -//! -# 0 : each zone is assigned to the one that defined in grid partition procedure. -//! -# 1 : random assigned for each zone or by some else ways. -int parallelStrategy = 1; +// parallelStrategy: +// 0 -- each zone is assigned to the one that defined in grid partition procedure. +// 1 -- random assigned for each zone or by some else ways. +int parallelStrategy = 1; //----------------------------------------------------------------------- # File path # //----------------------------------------------------------------------- -// original_grid_file: Original grid file that want to be divided(PHengLEI type, *.fts). +// original_grid_file: Original grid file that want to be divided(PHengLEI type, *.fts). // partition_grid_file: Target partition grid file(PHengLEI type, *.fts). string original_grid_file = "./grid/sphere_mixed.fts"; string partition_grid_file = "./grid/sphere_mixed__4.fts"; @@ -232,11 +235,10 @@ string partition_grid_file = "./grid/sphere_mixed__4.fts"; // 1 -- perfect balance. // maxproc -- perfect imbalance. // 1.05 -- recommended. - int omit_no_bound_bc = 0; int npartmethod = 1; int parallelPartitionMethod = 2; -double parmetisBalance = 1.05; +double parmetisBalance = 1.05; // numberOfMultigrid: Number of multi-grid levels, ONLY used for structured grid. // 1 -- single level. @@ -248,29 +250,35 @@ int numberOfMultigrid = 1; # Default parameters for CFD simulation # ######################################################################### // maxSimuStep: The max simulation step, don't care simulation is restart or not. -// intervalStepFlow: The step intervals for flow variables file 'flow.dat' saved. -// intervalStepPlot: The step intervals for tecplot visual file 'tecflow.dat' saved. +// intervalStepFlow: The step intervals for flow variables file 'flow.dat' saved. +// intervalStepPlot: The step intervals for tecplot visual file 'tecflow.dat' saved. // intervalStepSample: The step intervals for monitored probes variables file 'sample.dat' saved. -// intervalStepForce: The step intervals for aerodynamics coefficients file 'aircoef.dat' saved. -// intervalStepRes: The step intervals for residual file 'res.dat' saved. -// ifLowSpeedPrecon: Precondition process to accelerate convergence for low speed flow. -// 0 -- no precondition process. (default, mach > 0.3) -// 1 -- carry out precondition process. (mach number <= 0.3) - -int maxSimuStep = 20000; - -int intervalStepFlow = 1000; -int intervalStepPlot = 1000; +// intervalStepForce: The step intervals for aerodynamics coefficients file 'aircoef.dat' saved. +// intervalStepRes: The step intervals for residual file 'res.dat' saved. +int maxSimuStep = 20000; +int intervalStepFlow = 1000; +int intervalStepPlot = 1000; int intervalStepSample = 1000; -int intervalStepForce = 100; -int intervalStepRes = 10; -int ifLowSpeedPrecon = 0; +int intervalStepForce = 100; +int intervalStepRes = 10; // compressible: // 0 -- incompressible flow. // 1 -- compressible flow. (default) int compressible = 1; +// ifLowSpeedPrecon: Precondition process to accelerate convergence for low speed flow. +// 0 -- no precondition process. (default, mach > 0.3) +// 1 -- carry out precondition process. (mach number <= 0.3) +// Kprec: The coefficient K for the cut-off velocity. +// 1.0~3.0 is suggested. (default, 3.0) +// preconFarfieldBCMethod: The precondition method for farfield boundary condition. +// 0 -- precondition far-field boundary based on riemann invariants. +// 1 -- Turkel's simplified far-field boundary condition. +int ifLowSpeedPrecon = 0; +double Kprec = 3.0; +int preconFarfieldBCMethod = 1; + //----------------------------------------------------------------------- # CFD Control Parameter # //----------------------------------------------------------------------- @@ -281,33 +289,36 @@ int compressible = 1; // 0 -- the nondimensional conditions. // 1 -- the flight conditions. // 2 -- the experiment conditions. -// 3 -- the subsonic boundary conditions. +// 3 -- the subsonic boundary conditions. (Useless!) // 4 -- the condition that the velocity, temperature and density are given. // 5 -- the condition that the velocity, temperature and pressure are given. +//flowInitMethod: Flow field initialization method. +// 0 -- The entire flow field is initialized according to Infinite velocity. +// 1 -- The velocity near the wall is initialized according to the boundary layer of the plate. // refReNumber: Reynolds number, which is based unit length, unit of 1/m. // refDimensionalTemperature: Dimensional reference temperature, or the total temperature only for the experiment condition. // freestream_vibration_temperature: Dimensional freestream vibration temperature. // refDimensionalPressure: Dimensional reference pressure, or the total pressure only for the experiment condition. // height: Fly height, unit of km. // wallTemperature: Temprature of the solid wall, minus value is for adiabatic boundary condition. -// gridScaleFactor: The customizable unit of the grid, default value is 1.0 for meter.Common dimensions like: -// 1 dm = 0.1 m. -// 1 cm = 0.01 m. -// 1 mm = 0.001m. -// 1 inch = 0.0254m. -// 1 foot = 12 inches = 0.3048m. -// 1 yard = 3 feet = 0.9144m. +// gridScaleFactor: The customizable unit of the grid, default value is 1.0 for meter. Common dimensions like: +// 1 dm = 0.1 m. +// 1 cm = 0.01 m. +// 1 mm = 0.001 m. +// 1 inch = 0.0254 m. +// 1 foot = 12 inches = 0.3048 m. +// 1 yard = 3 feet = 0.9144 m. // forceReferenceLength, forceReferenceLengthSpanWise, forceReferenceArea: Reference length, SpanWise length and area, independent of grid unit. // TorqueRefX, TorqueRefY, TorqueRefZ: Reference point, independent of grid unit. // radiationCoef: The radiation coefficient on wall, it is used to compute the radiation heat flux on wall when the boundary // condition is radiation equilibrium temperature, and 0.8 is the default value. -// refMolecularWeight : the reference molecular weight of gas used for perfect gas. The unit is g/mol. +// refMolecularWeight: the reference molecular weight of gas used for perfect gas. The unit is g/mol. // Generally, the gas is air. Sometimes, it is experiment gas, such as Nitrogen, Argon, and so on. - -int directionMethod = 0; +int directionMethod = 0; double refMachNumber = 0.73; double attackd = 2.79; double angleSlide = 0.00; +int flowInitMethod = 0; int inflowParaType = 0; double refReNumber = 6.5e6; @@ -321,29 +332,27 @@ double freestream_vibration_temperature = 300.00; //double refDimensionalTemperature = 6051.024; // The total temperature, T*(1+(refGama-1)*M*M/2). //double refDimensionalPressure = 4.299696E09; // The total pressure, p*(T0/T)^(refGama/(refGama-1)). -//int inflowParaType = 3; -//int nsubsonicInlet = 1; -//int nsubsonicOutlet = 1; -//string inLetFileName = "./bin/subsonicInlet.hypara"; -//string outLetFileName = "./bin/subsonicOutlet.hypara"; -//double refDimensionalTemperature = 288.144; -//double refDimensionalPressure = 1.01313E05; - -//The velocity, temperature and density are fixed. +// The velocity, temperature and density are fixed. //int inflowParaType = 4; //double refDimensionalVelocity = 1000.0; -//double refDimensionalDensity = 1.0e3; +//double refDimensionalDensity = 1.0e3; -//The velocity, temperature and pressure are fixed. +// The velocity, temperature and pressure are fixed. //int inflowParaType = 5; //double refDimensionalVelocity = 1000.0; //double refDimensionalPressure = 1.0e5; -//The MachNumber, temperature and pressure are fixed. +// The MachNumber, temperature and pressure are fixed. //int inflowParaType = 6; -//double refDimensionalTemperature = 293; +//double refDimensionalTemperature = 293.0; //double refDimensionalPressure = 8886.06; +// The velocity, temperature and pressure are read from file. +//int inflowParaType = 7; +//string weatherDataFilePath = "./WRFData/"; +//double longitude = 110.95 +//double latitude = 19.61; + double wallTemperature = -1.0; double radiationCoef = 0.8; @@ -357,41 +366,41 @@ double forceReferenceArea = 1.0; // unit of meter^2. double TorqueRefX = 0.0; // unit of meter. double TorqueRefY = 0.0; // unit of meter. double TorqueRefZ = 0.0; // unit of meter. +double knudsenLength = 1.0; // unit of meter. double refMolecularWeight = 28.9644; // unit of g/mol. //----------------------------------------------------------------------- # Spatial Discretisation # //----------------------------------------------------------------------- -#******************************************************************* -# Struct Solver * -#******************************************************************* +#************************************************************************ +# Struct Solver * +#************************************************************************ // inviscidSchemeName: Spatial discretisation scheme of struct grid. // Using this when solve structered grid or hybrid. -// -- "vanleer", "steger", "hlle", "lax_f". -// -- "roe", "modified_roe". +// -- "vanleer", "steger", "hlle", "lax_f", +// -- "roe", "modified_roe", // -- "ausm+", "ausm+w", "ausm+up", "ausmdv", "ausmpw", "ausmpw+". // isWennScheme: If using WENN Scheme of struct grid. -// 0 -- NO. (default) -// 1 -- Yes. +// 0 -- NO. (default) +// 1 -- Yes. // str_limiter_name: Limiter of struct grid. -// -- "vanalbada", "vanleer", "minmod", "smooth", "minvan", "3rdsmooth", "3rd_minmod_smooth". -// -- "nolim", no limiter. -// -- "vanalbada_clz", clz supersonic version. -// -- "weno3_js", "wenn3_prm211", "wenn3_zm", "wenn3_zes2", "wenn3_zes3" - +// -- "vanalbada", "vanleer", "minmod", "smooth", "minvan", "3rdsmooth", "3rd_minmod_smooth", +// -- "nolim", no limiter, +// -- "vanalbada_clz", clz supersonic version, +// -- "weno3_js", "wenn3_prm211", "wenn3_zm", "wenn3_zes2", "wenn3_zes3". string inviscidSchemeName = "roe"; int isWennScheme = 0; -string str_limiter_name = "vanalbada"; +string str_limiter_name = "vanalbada"; -#******************************************************************* -# UnStruct Solver or Common * -#******************************************************************* +#************************************************************************ +# UnStruct Solver or Common * +#************************************************************************ // viscousType: Viscous model. -// 0 -- Euler. -// 1 -- Lamilar. -// 2 -- Algebraic. -// 3 -- 1eq turbulent. -// 4 -- 2eq turbulent. +// 0 -- Euler. +// 1 -- Lamilar. +// 2 -- Algebraic. +// 3 -- 1eq turbulent. +// 4 -- 2eq turbulent. // viscousName: Laminar or tubulent model. // -- "0eq-bl". // -- "1eq-sa". @@ -410,16 +419,16 @@ string str_limiter_name = "vanalbada"; // 3 -- IDDES. // uns_scheme_name: Spatial discretisation scheme of Unstruct grid. // Using this when solve Unstructered grid or hybrid. -// -- "vanleer", "roe", "steger", "kfvs", "lax_f", "hlle". +// -- "vanleer", "roe", "GMRESRoe", "GMRESSteger", "steger", "kfvs", "lax_f", "hlle", // -- "ausm+", "ausmdv", "ausm+w", "ausmpw", "ausmpw+". // uns_limiter_name: Limiter of Unstruct grid. -// -- "barth", "vencat", "vanleer", "minmod". -// -- "vanalbada", "smooth", "nnd", "lpz", "1st". +// -- "barth", "vencat", "vanleer", "minmod", +// -- "vanalbada", "smooth", "nnd", "lpz", "1st", // -- "nolim", no limiter. // uns_vis_name: Discretisation method of viscous term. // -- "std", "test", "aver", "new1", "new2". // gradientName: Gradient reconstruction method. -// -- "default", "ggcell", "ggnode", "lsq". +// -- "default", "ggcell", "ggnode", "lsq". // ivencat: Variation of vencat limiter. // 0 -- org method, it is independent of grid scale. // 1 -- new method, it is dependent of grid scale. @@ -442,18 +451,18 @@ string str_limiter_name = "vanalbada"; // 3 -- Harten type, which is default used. // roeEntropyScale: Entropy fix (correction) coefficient scale, default is 1.0. // It is used to scale the default Roe entropy fix coefficients. -// AusmpwPlusLimiter: A Limiter to make "function w" not change acutely in AusmpwPlus scheme, default is 1.0 +// AusmpwPlusLimiter: A Limiter to make "function w" not change acutely in AusmpwPlus scheme, default is 1.0. -//int viscousType = 0; +//int viscousType = 0; //string viscousName = "Euler"; -//int viscousType = 1; +//int viscousType = 1; //string viscousName = "laminar"; -int viscousType = 3; +int viscousType = 3; string viscousName = "1eq-sa"; -//int viscousType = 4; +//int viscousType = 4; //string viscousName = "2eq-kw-menter-sst"; int DESType = 0; @@ -463,7 +472,7 @@ string uns_limiter_name = "vencat"; string uns_vis_name = "test"; string gradientName = "ggnode"; -int ivencat = 7; +int ivencat = 7; double venkatCoeff = 5.0; int reconmeth = 1; int limitVariables = 0; @@ -475,9 +484,9 @@ double roeEntropyScale = 1.0; double AusmpwPlusLimiter = 1.0; -//----------------------------------------------------------------------- -# Temporal Discretisation # -//----------------------------------------------------------------------- +#************************************************************************ +# Temporal Discretisation * +#************************************************************************ // iunsteady: Steady or unsteady. // 0 -- steady. // 1 -- unsteay. @@ -490,51 +499,57 @@ double AusmpwPlusLimiter = 1.0; // statisticalTimePeriod: Used as time period of statistic analysis. // when the value is negative, time period is treated as infinite. // statisticMethod: Statistic reynolds stress method. -// 0 -- tau = - ^2 -// 1 -- tau = +// 0 -- tau = - ^2 +// 1 -- tau = // min_sub_iter: The min sub iteration of unsteady simulation. // max_sub_iter: The max sub iteration of unsteady simulation. // tol_sub_iter: The tolerance of sub iteration of unsteady simulation. // tscheme: Temporal Discretisation method. -// 1 -- Runge-Kutta Multi-State. -// 2 -- Point implicit. -// 3 -- Full implicit. -// 4 -- LU-SGS. -// 5 -- Block LU-SGS. -// 6 -- Jacobian iteration. -// 7 -- Line LU-SGS. -// 8 -- Matrix LU-SGS. +// 1 -- Runge-Kutta Multi-State. +// 2 -- Point implicit. +// 3 -- Full implicit. +// 4 -- LU-SGS. +// 5 -- Block LU-SGS. +// 6 -- Jacobian iteration. +// 7 -- Line LU-SGS. +// 8 -- Matrix LU-SGS. +// 9 -- GMRES. // iSimplifyViscousTerm: Simplify the computation of viscous term in the Block LU-SGS method. The default value assigns 1 that could speed up the computation. // Otherwise, the viscous Jacobian matrix Mv should be computed that will increase the memory and time in iteration of the BLUSGS method. // CFLStart: Started cfl number. // CFLEnd: End cfl number. // CFLVaryStep: The number of step when cfl increase from CFLStart to CFLEnd. +// GMRESCFLScale : CFL = CFLStart * GMRESCFLScal^iteration. +// OriginalTscheme : Used for LUSGS and GMres hybrid computing. +// useLUSGSprecond: Initialize flow field for GMRES. +// 0 --Initialize by first order Jacobian matrix. +// 1 --Initialize by LUSGS. +// GMRESInitStep : the number of iteration step of irst order Jacobian matrix or LUSGS for initialize flow field. // ktmax: Dtratio. dt[i] = MIN(dt[i], ktmax * dtmin / vol[i]) // swapDq: Communication dq between forward/backward sweep of LUSGS or not, default is 0. // nLUSGSSweeps: Sub iteration of LU-SGS or Block LU-SGS. // LUSGSTolerance: Sub iter tolerance of LU-SGS or Block LU-SGS. // ifLocalTimeStep: Time step method. -// 0 --Local. -// 1 --Global. +// 0 --Local. +// 1 --Global. // isUseLocalCFL: use variable number of CFL or not. -// 0 -- global unified CFL number. -// 1 -- local CFL number. +// 0 -- global unified CFL number. +// 1 -- local CFL number. // isUsePreTwall: use the previous temperatures on wall. 1 indicates yes, and 0 indicates no. // visl_min: Minimum value of laminar viscosity coefficient. // turbCFLScale: Turbulence model cfl number factor. // codeOfAleModel: Arbitrary Lagrangian-Eulerian method. -// 0 -- no ALE method. -// 1 -- ALE method for non-moving grids. -// 2 -- ALE method for moving grids. -// 3 -- ALE method for deforming grids. +// 0 -- no ALE method. +// 1 -- ALE method for non-moving grids. +// 2 -- ALE method for moving grids. +// 3 -- ALE method for deforming grids. // wallFunctionType: The type of wall function to implement. -// 0 -- no wall function. (default) -// 1 -- standard wall function. -// 2 -- Pab3D wall function. +// 0 -- no wall function. (default) +// 1 -- standard wall function. +// 2 -- Pab3D wall function. // RKStage: The number of Runge-Kutta step. // lamda: Cofficient of Runge-Kutta step. - -int iunsteady = 0; +int iunsteady = 0; double physicalTimeStep = 0.01; double physicalTimeStepDimensional = -0.001; int ifStartFromSteadyResults = 0; @@ -543,39 +558,42 @@ int ifStaticsReynoldsStress = 0; int startStatisticStep = 800000; double statisticalTimePeriod = -1.0; int statisticMethod = 0; -int linearTwoStepMethods = 1; // 1--BDF1; 2--C-N; 3--BDF2; +int linearTwoStepMethods = 1; // 1--BDF1; 2--C-N; 3--BDF2. int methodOfDualTime = 3; int min_sub_iter = 50; int max_sub_iter = 50; double tol_sub_iter = 0.01; -int tscheme = 4; +int tscheme = 4; int iSimplifyViscousTerm = 1; int ifLocalTimeStep = 0; int isUseLocalCFL = 0; int isUsePreTwall = 0; -double CFLStart = 0.01; -double CFLEnd = 10.0; -int CFLVaryStep = 500; - +double CFLStart = 0.01; +double CFLEnd = 10.0; +int CFLVaryStep = 500; +double GMRESCFLScale = 1.0; +int OriginalTscheme = 9; +int useLUSGSprecond = 1; +int GMRESInitStep = 1000; double pMaxForCFL = 0.2; double pMinForCFL = 0.1; double deltaMaxForCFL = 0.2; double magnifyFactorForCFL = 1.1; double reduceFactorForCFL = 0.5; -double ktmax = 1.0e10; +double ktmax = 1.0e10; -int swapDq = 1; +int swapDq = 1; int nLUSGSSweeps = 1; double LUSGSTolerance = 0.01; -int order = 2; +int order = 2; double visl_min = 0.01; double turbCFLScale = 1.0; -double csrv = 2.0; +double csrv = 1.0; double timemax = 1.0e10; double dtsave = -1.0; int maxale = 10; @@ -591,10 +609,9 @@ double lamda[] = [0.5, 1.0]; //int RKStage = 4; //double lamda[] = [0.25, 0.33333333333, 0.5, 1.0]; - -//----------------------------------------------------------------------- -# File In or Out # -//----------------------------------------------------------------------- +#************************************************************************ +# File In or Out * +#************************************************************************ // numberOfGridGroups: The number of grid groups. // gridfile: The partitioned Grid file path, using relative path, // which is relative to the working directory. @@ -611,20 +628,18 @@ double lamda[] = [0.5, 1.0]; // aircoeffile: The file path to save the aerodynamic force coefficients convergence process, write data for every default (intervalStepForce) steps. // restartNSFile: The file path to write restart flowfield variables, write data for every default (intervalStepFlow) steps. // turbfile: The file path to write restart flowfield variables of turbulence , write data for every default(intervalStepFlow) steps. -// visualfile: The visualization file path of flowfield , write data for every default (intervalStepPlot) steps. +// visualfile: The visualization file path of flowfield, write data for every default (intervalStepPlot) steps. // wall_aircoefile: The file path to save flowfield variables of wall, write data for every default steps. // nDumpSurfaceInfo = 0 the "wall_varfile" write the informations including heat flux. // nDumpSurfaceInfo = 1 the "wall_varfile" write the informations without heat flux. // nIsComputeWallDist: Whether to compute the wall distance. // 0 -- Compute wall distance. // 1 -- Not compute. -// -// protectionFile0 and protectionFile1 : Two continuation file of the data protection mechanism. -// wall_heatfluxfile : The file to output the MaxHeatFlux of wall. - -int numberOfGridGroups = 1; -string gridfile = "./grid/rae2822_hybrid2d__4.fts"; -string wallTemperaturefile= ""; +// protectionFile0 and protectionFile1: Two continuation file of the data protection mechanism. +// wall_heatfluxfile: The file to output the MaxHeatFlux of wall. +int numberOfGridGroups = 1; +string gridfile = "./grid/rae2822_hybrid2d__4.fts"; +string wallTemperaturefile = ""; int nIsComputeWallDist = 0; int walldistMethod = 1; @@ -632,10 +647,12 @@ int cellMethodOrNodeMethod = 0; string resSaveFile = "results/res.dat"; string turbresfile = "results/turbres.dat"; +string transitionResFile = "results/transitionRes.dat"; string aircoeffile = "results/aircoef.dat"; string restartNSFile = "results/flow.dat"; string turbfile = "results/turb.dat"; +string transitionFile = "results/transition.dat"; string visualfile = "results/tecflow.plt"; string wall_aircoefile = "results/wall_aircoef.dat"; @@ -645,10 +662,14 @@ string protectionFile0 = "results/flow0.dat"; string protectionFile1 = "results/flow1.dat"; string wall_heatfluxfile = "results/wall_heatflux.dat"; -int nDumpSurfaceInfo = 0; -string wall_varfile = ""; +string protectionTurbFile0 = "results/turb0.dat"; +string protectionTurbFile1 = "results/turb1.dat"; -string jetDefineFile = "bin/jet.hypara"; +string protectionTransitionFile0 = "results/transition0.dat"; +string protectionTransitionFile1 = "results/transition1.dat"; + +int nDumpSurfaceInfo = 0; +string wall_varfile = ""; string sixDofFileName = "results/sixDofInfo.dat"; string derivativeFileName = "results/identify.dat"; @@ -659,7 +680,8 @@ int plotFieldType = 0; // visualfileType: The file type of visualfile. // 0 -- Tecplot binary. // 1 -- Tecplot ASCII. - +// 2 -- Ensight binary. +// 3 -- Ensight ASCII. int visualfileType = 1; // samplefileMode: The dump mode of sample file. @@ -697,21 +719,21 @@ double upperPlotFieldBox[] = [1.0 1.0 1.0]; // -- vibration temperature(Tv, 33), electron temperature(Te, 34), vibrational energy(Ev, 35), electric energy(Ee, 36), // -- number density of electron(Ne, 37), dimensioanl density(rho, 38), dimensioanl pressure(p, 39), dimensioanl temperature(T, 40), // -- gradientUx(41), gradientUy(42), gradientVx(43), gradientVy(44), streamline_u(45), streamline_v(46), streamline_w(47), -// -- transition intermittency(intermittency, 51), -transition momentum thickness reynolds(MomentumThicknessReynolds, 52), -// -- overlap iblank(iblank, 81) - -// -- specific heat ratio(gama, 56) +// -- transition intermittency(intermittency, 51), transition momentum thickness reynolds(MomentumThicknessReynolds, 52), +// -- local CFL Number(localCFL, 57), minimal CFL Number(minCFL, 58), +// -- overlap iblank(iblank, 81), +// -- specific heat ratio(gama, 56), Knudsen number(kn, 60), Damkohler number(Da, 61), vibrational nonequilibrium number(Vi, 62). // Important Warning: Array size of visualVariables MUST be equal to nVisualVariables!!! // Variables order must from small to big. //-----------the optional parameters list for the wall boundary condition---------------- // nVisualWallVariables: The number of visual variables on wall. // visualWallVariables : dumped variable types, listed as following: -// -coefficient of pressure(cp, 0), -coefficient of friction(cf, 1), yplus(2), -non-dimensional heat flux(Q_NonDim, 3), -dimensional heat flux(Q_Dim, 4), -// -pressure on wall(pw, 5), -temperature on wall(Tw, 6), -density on wall(rhow, 7), -heat flux of translational-rotational temperature term(Qtr, 8), -// -heat flux of species diffusion term(Qs, 9), -heat flux of vibrational temperature term(Qv, 10), -heat flux of electron temperature term(Qe, 11), -// -species mass fractions(Ns, 12), -x component of wall velocity(Vx, 13), -y component of wall velocity(Vy, 14), -z component of wall velocity(Vz, 15) -// -slip translational-rotational temperature(Tts, 16), -slip vibrational temperature(Tvs, 17), -slip electron temperature(Tes, 18), -absolute wall velocity(Vs, 19) -// -Stanton number(St, 20), -coefficient of heat rate(Ch, 21), -temperature jump(deltaT, 22), -Grid Reynolds number on wall(Re_w, 23) +// -- coefficient of pressure(cp, 0), coefficient of friction(cf, 1), yplus(2), non-dimensional heat flux(Q_NonDim, 3), dimensional heat flux(Q_Dim, 4), +// -- pressure on wall(pw, 5), temperature on wall(Tw, 6), density on wall(rhow, 7), heat flux of translational-rotational temperature term(Qtr, 8), +// -- heat flux of species diffusion term(Qs, 9), heat flux of vibrational temperature term(Qv, 10), heat flux of electron temperature term(Qe, 11), +// -- species mass fractions(Ns, 12), x component of wall velocity(Vx, 13), y component of wall velocity(Vy, 14), z component of wall velocity(Vz, 15), +// -- slip translational-rotational temperature(Tts, 16), slip vibrational temperature(Tvs, 17), slip electron temperature(Tes, 18), absolute wall velocity(Vs, 19), +// -- Stanton number(St, 20), coefficient of heat rate(Ch, 21), temperature jump(deltaT, 22), Grid Reynolds number on wall(Re_w, 23), Knudsen number(Kn_wall, 24). int nVisualVariables = 8; int visualVariables[] = [0, 1, 2, 3, 4, 5, 6, 15]; @@ -739,16 +761,18 @@ int dumpStandardModel = 0; // 1 -- Real cell where the probe is located. // nProbeVariables: Number of variables want to be dumped for probes monitered. // probeVariables : Variable types dumped, listed as following: -// -- density(0), u(1), v(2), w(3), pressure(4), temperature(5), mach(6). +// -- density(0), u(1), v(2), w(3), pressure(4), temperature(5), mach(6), +// -- dimensioanl_density(7), dimensioanl_u(8), dimensioanl_v(9), +// -- dimensioanl_w(10), dimensioanl_pressure(11), dimensioanl_temperature(12). // Important Warning: Array size of probeVariables MUST be equal to nProbeVariables!!! // probeVariables order must from small to big. // probeVariablesInterpolationMethod: Interpolation method used to compute the probe variables. -// 0 -- Take the value of probe's cell as probe real value. -// 1 -- Interpolation from probe's and neighbouring cell to probe. -// 2 -- Interpolation from probe's cell nodes to probe. +// 0 -- Take the value of probe's cell as probe real value. +// 1 -- Interpolation from probe's and neighbouring cell to probe. +// 2 -- Interpolation from probe's cell nodes to probe. int ifSetDataMonitor = 0; -int dataMonitorType = 0; +int dataMonitorType = 0; string probesDefineFile = "bin/probes_XYZ.dat"; //int dataMonitorType = 1; @@ -761,28 +785,26 @@ string probesDefineFile = "bin/probes_XYZ.dat"; int searchCellsMethod = 0; -int nProbeVariables = 7; -int probeVariables[] = [0, 1, 2, 3, 4, 5, 6]; -int probeVariablesInterpolationMethod = 0; -//----------------------------------------------------------------------- -# Turbulence Parameter # -//----------------------------------------------------------------------- +int nProbeVariables = 14; +int probeVariables[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]; +int probeVariablesInterpolationMethod = 0; + +#************************************************************************ +# Turbulence Parameter * +#************************************************************************ // turbInterval: Iteration number of turbulence. // kindOfTurbSource: Kinds of turbulent source. // 0 -- Original. // mod_turb_res: If modify the residuals for the cells next to the wall or not, default is 0. -// transitionType: transition model type +// transitionType: transition model type // 0 -- none. // 2 -- gama-re-theta. -// turbIntensity: (valid while greater than 0.0 ) turbulent intensity of free stream(*100) in transition -// freeturbIntensitySRModify: to use SR modify in free stream turbulent intensity decay or not - - +// turbIntensity: (valid while greater than 0.0 ) turbulent intensity of free stream(*100) in transition. +// freeturbIntensitySRModify: to use SR modify in free stream turbulent intensity decay or not. int turbInterval = 1; int turbOrderStruct = 2; int kindOfTurbSource = 0; int mod_turb_res = 0; -double turb_relax = 1.0; double freeStreamViscosity = 1.0e-3; double muoo = 3.0; double kwoo = 5.0; @@ -790,29 +812,28 @@ int transitionType = 0; double turbIntensity = -1.0; int freeturbIntensitySRModify = 0; double freeDecayXLocation = 0.0; -int compressibleCorrection = 0; -int prandtlNumberCorrection = 0; +int compressibleCorrection = 0; int transitionMaFix = 1; -# maximum eddy viscosity (myt/my) max. +// maximum eddy viscosity (myt/my) max. double eddyViscosityLimit = 1.0e10; int monitor_vistmax = 0; -//----------------------------------------------------------------------- -# LES Parameter # -//----------------------------------------------------------------------- +#************************************************************************ +# LES Parameter * +#************************************************************************ // iLES: Create LESSolver or not. -// = 1 - Create LESSolver; -// != 1 - not. +// = 1 -- Create LESSolver; +// != 1 -- not. // amplitudeofDisturb: Amplitude of adding disturb. // disturbstep: Unsteady time step or steady iteration of adding random disturb. // iterdisturb: Add random disturb in every sub-iter or only first sub-iter. -// = 0 - in only first sub-iter; -// != 0 - in every sub-iter. +// = 0 -- in only first sub-iter; +// != 0 -- in every sub-iter. // ipraddisturb: Add density and pressure disturb or not. // ibodyforce: Add body force in source flux of NS equations or not. -// = 0 - not; -// != 0 - Add body force. +// = 0 -- not; +// != 0 -- Add body force. // bodyforce: Body force in source flux of NS equations or not. // utau: friction velocity, using in DNSDisturb. // sgsmodel: subgrid scale model. @@ -820,23 +841,22 @@ int monitor_vistmax = 0; // = "dsmCom"; // = "wale"; // = "sigma". -// deltaFunctionType: = 1 - MAX(deltai, deltaj, deltak); -// = 2 - pow(deltai * deltaj *deltak, 1/3); -// = 3 - Devloped by Scotti. -// wallDampingFunctionType: = 0 - no wall function; -// = 1 - van Driest; -// = 2 - developed by Dr. Deng Xiaobing; -// = 3 - developed by Piomelli. +// deltaFunctionType: = 1 -- MAX(deltai, deltaj, deltak); +// = 2 -- pow(deltai * deltaj *deltak, 1/3); +// = 3 -- Devloped by Scotti. +// wallDampingFunctionType: = 0 -- no wall function; +// = 1 -- van Driest; +// = 2 -- developed by Dr. Deng Xiaobing; +// = 3 -- developed by Piomelli. // turbViscousCutType: turbulent viscosity cut type. -// = 0 - mu_total = mut + mul; -// = 1 - mu_total = max(mut-mul,0)+ mul; -// = 2 - mu_total = max(mut ,0)+ mul. +// = 0 -- mu_total = mut + mul; +// = 1 -- mu_total = max(mut-mul, 0) + mul; +// = 2 -- mu_total = max(mut , 0) + mul. // smagConstant: constant of smagorinsky model. // waleConstant: constant of wale model. -// filterDirection[3]: filter variables in i, j, k direction or not. +// filterDirection [3]: filter variables in i, j, k direction or not. // averageDirection[3]: average variables in i, j, k direction or not. // isotropicConstant: constant of isotropic part of SGS stress. - int iLES = 0; string sgsmodel = "smagorinsky"; int deltaFunctionType = 2; @@ -852,19 +872,16 @@ double testFilterScale = 2.0; int averageWidth = 1; int monitorNegativeConstant = 0; -//----------------------------------------------------------------------- -# Other Parameters for Hypersonic Non-equilibrium Gas # -//----------------------------------------------------------------------- +#************************************************************************ +# Other Parameters for Hypersonic Non-equilibrium Gas * +#************************************************************************ // dg_high_order: // 0 -- generic order accuracy. // 1 -- high order accuracy. // iapplication: // 0 -- gas model is fixed in the codes. // 1 -- gas model is imported from library files. -// isAdaptiveSolver: isAdaptiveSolver=0 indicates the generic Navier-Stokes solver, -// isAdaptiveSolver>0 indicates the HyFlow self-adaptive solver. -// 1 -- using HyFlow self-adaptive solver where the switch is controlled by the total iteration steps. -// 2 -- using HyFlow self-adaptive solver where the switch is controlled by variation of the key residual. +// isAdaptiveSolver: isAdaptiveSolver = 0 indicates the generic Navier-Stokes solver, // nm: Equation number of the physics, but is out of commision now. // 4 -- for 2D. // 5 -- for 3D. @@ -875,7 +892,7 @@ int monitorNegativeConstant = 0; // 2 -- Argon. // 3 -- Nitrogen. // nEnergyRecycle: The type of EnergyModel Recycle. -// 0 -- not used . +// 0 -- not used. // 1 -- used. // nDensityModify: The type of densitymodify. // 0 -- not used. @@ -883,26 +900,25 @@ int monitorNegativeConstant = 0; // nchem: // 0 -- without chemical reaction flow. // 1 -- the chemical reaction flow is considered. -// nEquilibriumGas: the variable is valid when the condition of nchem=0 is satisfied. +// nEquilibriumGas: the variable is valid when the condition of nchem = 0 is satisfied. // 0 -- perfect gas. // 5, 7, 11 -- equilibrium gas, meanwhile, its value denotes the number of gas component. -// nPCWCycleStep: the maximum step number of iteration in the module of computing species mass fractions with the partial catalytic wall(PCW) condition. -// the value equals to or is greater than 1, and 3 is for default value. -// nRETCycleStep: the maximum step number of iteration in the module of computing radiation equilibrium temperature on wall. -// the value equals to or is greater than 1, and 3 is for default value. -// nSLIPCycleStep:the maximum step number of iteration in the module of computing slip temperature, slip velocity and slip species mass fraction. -// the value equals to or is greater than 1, and 3 is for default value. -// nSlipBCModel : The computational model of slip boundary conditions. - -// 0 -- no slip. -// 1 -- the conventional Maxwell slip conditions. -// 2 -- the Gokcen slip conditions. -// 3 -- the Knudsen-layer correction of the standard slip conditions proposed by Lockerby, et al. -// 4 -- the Kogan simplified slip conditions. -// nMeanFreePathType : the method to the mean free-path for the slip conditions. For the mixture, 0 is suggested. -// 0 -- the equivalent mean free-path is calculated by the simple hard sphere model(HS). -// 1 -- calculated by the definition that includes the variables of the number density and the molecule diameter. -// 2 -- the equivalent mean free-path is calculated by the variable hard sphere model(VHS). +// nPCWCycleStep: The maximum step number of iteration in the module of computing species mass fractions with the partial catalytic wall(PCW) condition. +// The value equals to or is greater than 1, and 3 is for default value. +// nRETCycleStep: The maximum step number of iteration in the module of computing radiation equilibrium temperature on wall. +// The value equals to or is greater than 1, and 3 is for default value. +// nSLIPCycleStep:The maximum step number of iteration in the module of computing slip temperature, slip velocity and slip species mass fraction. +// The value equals to or is greater than 1, and 3 is for default value. +// nSlipBCModel: The computational model of slip boundary conditions. +// 0 -- no slip. +// 1 -- the conventional Maxwell slip conditions. +// 2 -- the Gokcen slip conditions. +// 3 -- the Knudsen-layer correction of the standard slip conditions proposed by Lockerby, et al. +// 4 -- the Kogan simplified slip conditions. +// nMeanFreePathType: the method to the mean free-path for the slip conditions. For the mixture, 0 is suggested. +// 0 -- the equivalent mean free-path is calculated by the simple hard sphere model(HS). +// 1 -- calculated by the definition that includes the variables of the number density and the molecule diameter. +// 2 -- the equivalent mean free-path is calculated by the variable hard sphere model(VHS). // nchemsrc: // 0 -- the source terms are not computed. // 1 -- the source terms are computed. @@ -913,148 +929,151 @@ int monitorNegativeConstant = 0; // 1 -- One-temperature model. // 2 -- Two-temperature model. // 3 -- Three-temperature model. +// isUseNoneqCond: +// 0 -- compute the source terms without any conditions. +// 1 -- compute the source terms using the non-equilibrium condition. +// frozenCondition: the threshold value of frozen chemical flow condition, 0.1 is the default value. // nIdealState: whether take all gas species as ideal gas for gas-mixture process. // 0 -- No. -// 1 -- Yes. -// nTEnergyModel: the method to computing temperature energy model. +// 1 -- Yes. // nTEnergyModel: the method to computing temperature energy model. // 0 -- the energy term is computed using the conventional method. // 1 -- the energy term is computed using the polynomial fitting method. // 2 -- the energy term is computed using the piecewise polynomial fitting method. // parkVDPower: the power of translational-rotational temperature in the Park V-D(vibration-dissociation) coupling model. // The value is in range of [0.0, 1.0], DPLR suggests 0.5, LAURA suggests 0.7, while 0.6 is given as default value. // catalyticCoef: -// 0.0 -- full non-catalytic wall boundary condition. -// 1.0 -- full catalytic wall boundary condition. -// in range of (0.0, 1.0) -- partial catalytic condition, the value indicates the catalytic coefficient. -// nIsSuperCatalytic : the super catalytic condition for the fully catalytic wall, and assigned with the value of 1. -// 0 -- equilibrium condition for the fully catalytic wall where the mass fractions are assigned with the values of the free stream. -// 1 -- super catalytic condition for the fully catalytic wall where all the atomic components combine into molecular components. -// nTemperatureJump : the method to calculate the temperature jump. -// 0 -- calculated by the variables of heat conductivity and constant volume specific heat for each energy mode. -// 1 -- the general method where the iteration is calculated with the translation-rotation temperature. -// nSurfGradMethod : the method to compute the surface heating ratio. -// 0 -- the gradient of variable is computed with the first-order difference method. -// 1 -- the gradient of variable is computed with the Green-Guass integral method. -// nRapidFlowfield : initialize the flowfield using the rapid engineering method when it is greater than zero. -// nSurfHeatMonitor : To exam the surface heating change or not. 0 is no, 1 is yes. -// nInitPressureStep : the steps to initialize the boundary variables when the rapid method is used. 100 is the default value. -// nDumpCFLNumber : 1 indicates dumping the CFL number to file, 0 denotes no dumping. +// 0.0 -- full non-catalytic wall boundary condition. +// 1.0 -- full catalytic wall boundary condition. +// in range of (0.0, 1.0) -- partial catalytic condition, the value indicates the catalytic coefficient. +// nIsSuperCatalytic: the super catalytic condition for the fully catalytic wall, and assigned with the value of 1. +// 0 -- equilibrium condition for the fully catalytic wall where the mass fractions are assigned with the values of the free stream. +// 1 -- super catalytic condition for the fully catalytic wall where all the atomic components combine into molecular components. +// nTemperatureJump: the method to calculate the temperature jump. +// 0 -- calculated by the variables of heat conductivity and constant volume specific heat for each energy mode. +// 1 -- the general method where the iteration is calculated with the translation-rotation temperature. +// nSurfGradMethod: the method to compute the surface heating ratio. +// 0 -- the gradient of variable is computed with the first-order difference method. +// 1 -- the gradient of variable is computed with the Green-Guass integral method. +// nRapidFlowfield: initialize the flowfield using the rapid engineering method when it is greater than zero. +// nSurfHeatMonitor: To exam the surface heating change or not. 0 is no, 1 is yes. +// nInitPressureStep: the steps to initialize the boundary variables when the rapid method is used. 100 is the default value. +// nDumpCFLNumber: 1 indicates dumping the CFL number to file, 0 denotes no dumping. // sigmaVelocity: the coordination coefficient of tangential momentum for computation of slip velocity. The value is in range of (0.0, 2.0]. // sigmaTemperature: the heat coordination coefficient for computation of slip temperature. The value is in range of (0.0, 2.0]. // sigmaMassFraction: the species coordination coefficient for computation of slip mass fractions. The value is in range of (0.0, 2.0]. // velocitySlipCorrectConstant: the correction constant to the velocity slip condition. For the diffuse reflection, 1.0 is used. -// 1.0 -- proposed by Maxwell. -// sqrt(2/PI)~0.8 -- used for "micro-slip", namely the actual velocity slip at the wall. -// 1.146 -- proposed for an additional "fictitious" velocity slip. - -// chemicalRelaxCorf: The value is in range of [0.001, 1.0]. -// spectrumRadiusCoef: The value is in range of [0.0, 2.0]. -// staticPressureRelaxCorf: The value is in range of [0.1, 1.0]. -// nIsChemicalFreeze : the flag to freeze the chemical reactions. -// 0 -- not freeze, the chemical reaction sources will be calculated. -// 1 -- freezes the chemical reactions, the chemical reaction sources will not be calculated.// veTemperatureMin: The minimum of Tv and Te - -//maxViscous: the maximum of Viscous. -//trTemperatureMin: the minimum value of trTemperature. -//veTemperatureMin: the minimum value of veTemperature. -//densityMin: the minimum value of density. -//tAdjustmentFactor: magnification of temperature, this value is in range of (1.0, 10.0]. -// nDebug: cout the Wrong place and abort -// 0 -- not used. -// 1 -- used. +// 1.0 -- proposed by Maxwell. +// sqrt(2/PI)~0.8 -- used for "micro-slip", namely the actual velocity slip at the wall. +// 1.146 -- proposed for an additional "fictitious" velocity slip. +// chemicalRelaxCorf: The value is in range of [0.001, 1.0]. +// spectrumRadiusCoef: The value is in range of [0.0, 2.0]. +// staticPressureRelaxCorf: The value is in range of [0.1, 1.0]. +// nIsChemicalFreeze: the flag to freeze the chemical reactions. +// 0 -- not freeze, the chemical reaction sources will be calculated. +// 1 -- freezes the chemical reactions, the chemical reaction sources will not be calculated. +// veTemperatureMin: The minimum of Tv and Te. +// maxViscous: the maximum of Viscous. +// trTemperatureMin: the minimum value of trTemperature. +// veTemperatureMin: the minimum value of veTemperature. +// densityMin: the minimum value of density. +// tAdjustmentFactor: magnification of temperature, this value is in range of (1.0, 10.0]. +// nDebug: cout the Wrong place and abort +// 0 -- not used. +// 1 -- used. // nSpeciesLimit: limitter of gas species -// 0 -- not used. -// 1 -- used. -// nTurblenceForChemical: the coupled mode of Turblence and Chemical reaction -// 0 -- method 0. -// 1 -- method 1. -// nViscosityFluxSublevelModified: Modified for ViscosityFlux on Sublevel grid -// 0 -- not used. -// 1 -- used. -// nViscosityPeModified: Pe Modified for ViscosityCoef -// 0 -- not used. -// 1 -- used. -// nChemcalSourceModified: Modified on ChemcalSource -// 0 -- not used. -// 1 -- used. -// nChemcalSourceEsMethod: Modified on ChemcalSource -// 0 -- approximation algorithm 1 (Ori.) -// 1 -- approximation algorithm 2 (New) - +// 0 -- not used. +// 1 -- used. +// nTurblenceForChemical: the coupled mode of Turblence and Chemical reaction. +// 0 -- method 0. +// 1 -- method 1. +// nViscosityFluxSublevelModified: Modified for ViscosityFlux on Sublevel grid. +// 0 -- not used. +// 1 -- used. +// nViscosityPeModified: Pe Modified for ViscosityCoef. +// 0 -- not used. +// 1 -- used. +// nChemcalSourceModified: Modified on ChemcalSource. +// 0 -- not used. +// 1 -- used. +// nChemcalSourceEsMethod: Modified on ChemcalSource. +// 0 -- approximation algorithm 1 (Ori). +// 1 -- approximation algorithm 2 (New). // nMaxStepTemperature: the iterative steps of temperature. - -// veTemperatureMinModified: Modified on the minimum of Tve for Cvvs -// 0 -- not used -// 1 -- used - -// nDiagonalModified: Modified on Diagonal -// 0 -- not used -// 1 -- Ori. -// 2 -- new - -//nGradPrimtiveMethod: -// 0 -- Ori. -// 1 -- new +// veTemperatureMinModified: Modified on the minimum of Tve for Cvvs. +// 0 -- not used. +// 1 -- used. +// nDiagonalModified: Modified on Diagonal. +// 0 -- not used. +// 1 -- new. +// nDiagonalModifiedTurb: Modified on Diagonal for turbulence. +// 0 -- not used. +// 1 -- new. +// nGradPrimtiveMethod: +// 0 -- Ori. +// 1 -- new. // nAblation: -// 0 -- The wall ablation is not computed. -// 1 -- The wall ablation is computed. +// 0 -- The wall ablation is not computed. +// 1 -- The wall ablation is computed. // isInjection: -// 0 -- The injection velocity of ablation wall is not computed. -// 1 -- The injection velocity of ablation wall is computed. +// 0 -- The injection velocity of ablation wall is not computed. +// 1 -- The injection velocity of ablation wall is computed. // nViscosityModel: -// 0 -- Blottner fitting method(N89). -// 1 -- Gupta fitting method(N90). +// 0 -- Blottner fitting method(N89). +// 1 -- Gupta fitting method(N90). // nContinueModel: The new continue model can switch different computation model. -// 0 -- Not use the new continue model. -// 1 -- use the new continue model. +// 0 -- Not use the new continue model. +// 1 -- use the new continue model. // nSutherland: -// 0 -- stands for selecting the Blotter curve fits mode. -// 1 -- stands for Sutherland relation. +// 0 -- stands for selecting the Blotter curve fits mode. +// 1 -- stands for Sutherland relation. // gasfile: Indicates the gas model, 9 models are provided, namely "Gu5", "Gu7", "Gu11", "Pa5", "Pa7", "Pa11", "DK5", "DK7", "DK11". -// "Gu" -- indicates the Gupta Model, three-Type Models are embeded in the library, namely, the 5-species-6-reactions, the 7-species-9-reactions, the 11-species-20-reactions. -// "Pa" -- indicates the Park Model, three-Type Models are embeded in the library, namely, the 5-species-17-reactions, the 7-species-22-reactions, the 11-species-48-reactions. -// "DK" -- indicates the Dunn-Kang Model, three-Type Models are embeded in the library, namely, the 5-species-11-reactions, the 7-species-15-reactions, the 11-species-26-reactions. -// "Mars-Pa8" is for Park model of Mars gas, "Mars-Mc8" for McKenzie model of Mars gas. -// "Combustion-12" -- indicates the Combustion Chamber Gas Model which includes 12-species-20-reactions. -// "Gas-Mixture" -- indicates the process of mixing gas without reacting. -// for struct solver mixing two speciesSpeciesA, SpeciesB. -// for unstruct solver mixing multi-speciesO2 NO CO CO2 H2 N2 Air CH4. -// For self-definition model, the gasfile is used to indicate the file path of the new gas model. +// "Gu" -- indicates the Gupta Model, three-Type Models are embeded in the library, namely, the 5-species-6-reactions, the 7-species-9-reactions, the 11-species-20-reactions. +// "Pa" -- indicates the Park Model, three-Type Models are embeded in the library, namely, the 5-species-17-reactions, the 7-species-22-reactions, the 11-species-48-reactions. +// "DK" -- indicates the Dunn-Kang Model, three-Type Models are embeded in the library, namely, the 5-species-11-reactions, the 7-species-15-reactions, the 11-species-26-reactions. +// "Mars-Pa8" is for Park model of Mars gas, "Mars-Mc8" for McKenzie model of Mars gas. +// "Combustion-12" -- indicates the Combustion Chamber Gas Model which includes 12-species-20-reactions. +// "Gas-Mixture" -- indicates the process of mixing gas without reacting. +// for struct solver mixing two species��SpeciesA, SpeciesB��. +// for unstruct solver mixing multi-species��O2 NO CO CO2 H2 N2 Air CH4��. +// For self-definition model, the gasfile is used to indicate the file path of the new gas model. // speciesName: Used to list the names of each species, while each species name is separated by the symbol of comma. // initMassFraction: Used to list the initial mass fractions of species in accordance with the sequence of names in the parameter speciesName. // ifStartFromPerfectGasResults: The chemical reaction simulation is start from perfect gas flowfield or not, 0 is for no and else is for yes. -// nIterFirstStep : the maximum number of iteration in the first step for the self-adaptive calculation. -// nIterSecondStep : the maximum number of iteration in the second step for the self-adaptive calculation. -// nIterThirdStep : the maximum number of iteration in the third step for the self-adaptive calculation. -// nEnergyAssembly : the vibration energy is computed with combined method which includes the fitting method and the molecular kinetic theory. -// 0 -- no, -// 1 -- yes. +// nIterFirstStep : the maximum number of iteration in the first step for the self-adaptive calculation. +// nIterSecondStep: the maximum number of iteration in the second step for the self-adaptive calculation. +// nIterThirdStep : the maximum number of iteration in the third step for the self-adaptive calculation. +// nEnergyAssembly: the vibration energy is computed with combined method which includes the fitting method and the molecular kinetic theory. +// 0 -- no, +// 1 -- yes. // nControlVariable: the variable to computing the residual error that determines the convergence is meet or not in the one-temperature model. -// 0 -- the density. -// 1 -- the translation temperature. -// 2 -- the vibration temperature. -// 3 -- the electron temperature. -// 4 -- the pressure. -// 5 -- the mass fraction of oxygen. -// 6 -- the mass fraction of nitrogen. +// 0 -- the density. +// 1 -- the translation temperature. +// 2 -- the vibration temperature. +// 3 -- the electron temperature. +// 4 -- the pressure. +// 5 -- the mass fraction of oxygen. +// 6 -- the mass fraction of nitrogen. // firstStepError : the residual error of the first step iteration for the self-adaptive calculation. // secondStepError : the residual error of the second step iteration for the self-adaptive calculation. // thirdStepError : the residual error of the third step iteration for the self-adaptive calculation. -// useHyflowSetting : Setting for HyFLOW GUI. -// 0 -- PHengLEI -// 1 -- HyFLOW -// nProtectData : Use the continuation file data protection mechanism. -// 0 -- no -// 1 -- yes - +// nProtectData: Use the continuation file data protection mechanism. +// 0 -- no. +// 1 -- yes. +// nTvChange: Judge whether the Tv equals Ttr. +// 0 -- yes. +// 1 -- no. +// isMoleFractionType: 1 indicates the mass fractions, or else the mole fractions. +// nFraction: the initial fractions type of species. +// 0 -- mass fraction. +// 1 -- mole fraction. int dg_high_order = 0; int iapplication = 0; int isAdaptiveSolver = 0; -int nm = 5; +int nm = 5; int nEquilibriumGas = 0; -int nPCWCycleStep = 3; -int nRETCycleStep = 3; -int nSLIPCycleStep= 3; +int nPCWCycleStep = 3; +int nRETCycleStep = 3; +int nSLIPCycleStep = 3; int nIterFirstStep = 1000; int nIterSecondStep= 2000; int nIterThirdStep = 2000; @@ -1065,17 +1084,17 @@ double secondStepError = 0.001; double thirdStepError = 0.001; double predictCFLError = 0.1; -double refGama = 1.4; -double prl = 0.72; -double prt = 0.90; -double sc_l = 0.5; -double sc_t = 0.5; +double refGama = 1.4; +double prl = 0.72; +double prt = 0.90; +double sc_l = 0.5; +double sc_t = 0.5; -int nGasModel = 0; -int nchem = 0; -int nchemsrc = 1; -int nchemrad = 1; -int ntmodel = 1; +int nGasModel = 0; +int nchem = 0; +int nchemsrc = 1; +int nchemrad = 1; +int ntmodel = 1; int nIdealState = 0; int nEnergyRecycle = 1; @@ -1099,12 +1118,12 @@ double sigmaTemperature = 1.0; double sigmaMassFraction = 1.0; double velocitySlipCorrectConstant = 1.0; -double chemicalRelaxCorf = 1.0; +double chemicalRelaxCorf = 1.0; double chemicalSpectrumRadiusCoef = 1.0; double viscousSpectrumRadiusCoef = 1.5; double inviscidSpectrumRadiusCoef = 1.5; -double spectrumRadiusCoef = 0.5; -double staticPressureRelaxCorf = 0.2; +double spectrumRadiusCoef = 0.5; +double staticPressureRelaxCorf = 0.2; double maxViscous = 10000.0; double trTemperatureMin = 10.0; @@ -1114,31 +1133,35 @@ double densityMin = 1.0e-8; double densityMinFactor = 0.1; double tAdjustmentFactor = 10.0; double iniSpeedCoef = 1.0; +int iniSpeedMode = 0; -int nDebug = 0; -int nSpeciesLimit = 1; -int nTurblenceForChemical = 0; -int nViscosityFluxSublevelModified = 1; -int nViscosityPeModified = 0; -int nChemcalSourceModified = 2; -int nChemcalSourceEsMethod = 1; -int nMaxStepTemperature = 5; -int veTemperatureMinModified = 1; -int nDiagonalModified = 0; -int nGradPrimtiveMethod = 1; -int nInviscidFluxModify = 1; -int nQlLimitMethod = 2; -int nSpeciesForWallMethod = 1; -int nDensityForWallMethod = 0; +int nDebug = 0; +int nSpeciesLimit = 1; +int nTurblenceForChemical = 0; +int nViscosityFluxSublevelModified = 1; +int nViscosityPeModified = 0; +int nChemcalSourceModified = 2; +int nChemcalSourceEsMethod = 1; +int nMaxStepTemperature = 5; +int veTemperatureMinModified = 1; +int nDiagonalModified = 0; +int nDiagonalModifiedTurb = 0; +int nGradPrimtiveMethod = 1; +int nInviscidFluxModify = 1; +int nQlLimitMethod = 2; +int nSpeciesForWallMethod = 1; +int nDensityForWallMethod = 0; +int wallMultiTemperature = 0; -int nProtectData = 0; -int useHyflowSetting = 0; -int nAblation = 0; -int isInjection = 0; -int nViscosityModel = 0; -int nMarsModel = 0; -string gasfile = "DK5"; -//string gasfile = "./chemical/Dunn-Kang_air5s11r.dat"; +int nProtectData = 0; +int nAblation = 0; +int isInjection = 0; +int nViscosityModel = 0; +int nMarsModel = 0; +int nTvChange = 0; +int isMoleFractionType = 0; +string gasfile = "DK5"; +//string gasfile = "./chemical/Dunn-Kang_air5s11r.dat"; string speciesName = "O, O2, NO, N, N2"; string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.767"; @@ -1152,16 +1175,16 @@ string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.767"; //string speciesName = "O, O2, NO, N, N2, C, CO, CO2"; //string initMassFraction = "0.0015, 0.0429, 0.0, 0.0, 0.0, 0.0, 0.0777, 0.8779"; -//string gasfile = "Pa"; +//string gasfile = "Pa"; //string speciesName = "O, O2, NO, N, NO+, C, C2, CO, CO2, CN, N2, e-"; //string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.767, 0.0"; -//string gasfile = "Combustion-12"; +//string gasfile = "Combustion-12"; //string speciesName = "O, O2, NO, N, C, CO, CO2, H, H2, OH, H2O, N2"; //string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.767"; //string gasfile = "Gas-Mixture"; -//string speciesName ="SpeciesA, SpeciesB"; +//string speciesName = "SpeciesA, SpeciesB"; //string initMassFraction = "1.0, 0.0"; int nSutherland = 0; double gamaSpeciesA = 1.4; @@ -1173,9 +1196,17 @@ double molecularWeightSpeciesB = 30.0; //string speciesName = "O2, N2"; //string initMassFraction = "1.0, 0.0"; +int nFraction = 0; int nContinueModel = 0; int nChemicalFlowStep = 0; int ifStartFromPerfectGasResults = 0; +int isUseNoneqCond = 0; +double frozenCondition = 0.01; + +int nLeakageMonitor = 0; +double totalLeakageVolume = 1000.0; +double monitorThresholdValue = 0.05; +double sprayFactor = 0.0; ######################################################################### // Multi-Grid parameters. @@ -1196,7 +1227,6 @@ int ifStartFromPerfectGasResults = 0; // 1 -- zero order. // 2 -- first-order. (default) // mgCorrectionLimit: Multi-grid correction limit. - int nMGLevel = 1; int MGCoarsestIteration = 1; int MGPreIteration = 1; @@ -1218,20 +1248,20 @@ int ismooth_turb = 0; int SAProductType = 2; // ----------------- Overset Grid parameter ----------------------------- -int codeOfDigHoles = 1; -int codeOfTurbulentModel = 0; -string masterFileName = "./grid/searchFile.inp"; -string holeBasicFileName = "./grid/holeBasicFile.inp"; -string holeFullFileName = "./grid/holeFullFile.dat"; -string linkFileName = "./grid/topology.dat"; -string zoneInverseFileName = "./grid/zoneInverseMapping.inp"; +int codeOfDigHoles = 1; +int codeOfTurbulentModel = 0; +string masterFileName = "./grid/searchFile.inp"; +string holeBasicFileName = "./grid/holeBasicFile.inp"; +string holeFullFileName = "./grid/holeFullFile.dat"; +string linkFileName = "./grid/topology.dat"; +string zoneInverseFileName = "./grid/zoneInverseMapping.inp"; -######################################################################### -# High Order Struct Solver # -######################################################################### +#************************************************************************ +# High Order Struct Solver * +#************************************************************************ // isFVMOrFDM: -// 0 -- NSSolverStruct using Finite Volume Method. -// 1 -- NSSolverStruct using Finite Differ Method. +// 0 -- NSSolverStruct using Finite Volume Method. +// 1 -- NSSolverStruct using Finite Differ Method. // SolverStructOrder: Spatial discretisation order of NS equations with struct grid. // <= 2 -- finite volume method. // >= 3 -- finite difference order. (to be completed) @@ -1273,30 +1303,48 @@ int allReduceStep = 1; // codeOfOversetGrid: Overlapping(overset) grid or not. // 0 -- NON-overlapping grid. // 1 -- Overlapping grid. -// oversetInterpolationMethod: the method of overset interpolation while field simulation +// oversetInterpolationMethod: the method of overset interpolation while field simulation. // 0 -- set the acceptor cell value by donor cell value. // 1 -- set the acceptor cell value by distance weight of donor cell value. - -int codeOfOversetGrid = 0; -int oversetInterpolationMethod = 0; -int readOversetFileOrNot = 0; -int symetryOrNot = 0; -int readInAuxiliaryInnerGrid = 0; -int readInAuxiliaryOuterGrid = 0; -int readInSklFileOrNot = 0; -string auxiliaryInnerGrid0 = "./grid/aux-upper.fts"; -string auxiliaryInnerGrid1 = "./grid/aux-lower.fts"; -string auxiliaryInnerGrid2 = ""; -string oversetGridFileName = "./grid/iblank.ovs"; -double walldistMainZone = 1.0 -double toleranceForOversetSearch = 1.0e-3; -double toleranceForOversetBox = 1.0e-3; -int twoOrderInterpolationOrNot = 0; -int keyEnlargeOfActiveNodes = 0; -int outTecplotOverset = 0; -int outPutOversetVisualization = 0; - -int numberOfMovingBodies = 2; +// readOversetFileOrNo: Whether to read overset-file(.ovs) that has been generated. +// 0 -- no. +// 1 -- yes. +// symetryOrNot: If there exist symetryplanes(XY plane, the coordinate of Z direction is 0) in +// the current overset grid(only for three dimension). +// 0 -- no. +// 1 -- yes. +// readInAuxiliaryInnerGrid: Whether to read auxiliary inner grid. +// 0 -- no. +// 1 -- yes. +// walldistMainZone: The initial value of background grid which does not exist wall boundary condition. +// toleranceForOversetSearch: The tolerance of overset searching zone to judge whether the obtained node is in the current computing cell. +// toleranceForOversetBox: The tolerance of building the minimum box of computing cells in the overlapping region. +// twoOrderInterpolationOrNot: The number of interpolated cell layers in the overlapping boundary. +// 0 -- one layer. +// 1 -- two layers. +// keyEnlargeOfActiveNodes: The number of enlarged overset-boundary layers in the buffer region. +// outTecplotOverset: Whether to dump out the flowfield data after the progress of overset configure. +// 0 -- no. +// 1 -- yes. +int codeOfOversetGrid = 0; +int oversetInterpolationMethod = 0; +int readOversetFileOrNot = 0; +int symetryOrNot = 0; +int readInAuxiliaryInnerGrid = 0; +int readInAuxiliaryOuterGrid = 0; +int readInSklFileOrNot = 0; +string auxiliaryInnerGrid0 = "./grid/aux-upper.fts"; +string auxiliaryInnerGrid1 = "./grid/aux-lower.fts"; +string auxiliaryInnerGrid2 = ""; +string oversetGridFileName = "./grid/iblank.ovs"; +double walldistMainZone = 1.0 +double toleranceForOversetSearch = 1.0e-3; +double toleranceForOversetBox = 1.0e-3; +int twoOrderInterpolationOrNot = 0; +int keyEnlargeOfActiveNodes = 0; +int outTecplotOverset = 0; +int outPutOversetVisualization = 0; +int numberOfMovingBodies = 2; // ----------------- ALE configuration ------------------------------ int codeOfAleModel = 0; @@ -1306,36 +1354,42 @@ double referenceLength = 1.0; double referenceVelocity = 1.0; double referenceDensity = 1.0; -int strategyForFaceNormalVelocity = 0; //0-By Sweeping volume; 1-By face center 1st; 2-By face center 2nd; -int strategyForGCLSource = 0; //0-present; 1-Ahn; +int strategyForFaceNormalVelocity = 0; // 0-By Sweeping volume; 1-By face center 1st; 2-By face center 2nd. +int strategyForGCLSource = 0; // 0-present; 1-Ahn. -//0:1st-Admas-Bashforth; 1:2nd-Admas-Bashforth; 2:1st-Implicit-Euler; 3:2nd-Implicit Euler; 4:2nd-Adams-Moulton; 5:3rd-Adams-Moulton +// 0: 1st-Admas-Bashforth; 1: 2nd-Admas-Bashforth; 2: 1st-Implicit-Euler; 3: 2nd-Implicit Euler; 4: 2nd-Adams-Moulton; 5: 3rd-Adams-Moulton. int methodForKineticEquation = 0; double relaxParameterOfKinetic = 1.0; -######################################################################### -# motive information # -######################################################################### +#************************************************************************ +# motive information * +#************************************************************************ int numberOfMovingBodies = 1; ############################## body0 ############################## -//mass of parts -double mass_0 = 1.0; -//mass matrix of parts Ixx Iyy Izz Ixy Ixz Iyz -double massMatrix_0[] = 1e-7, 1e-6, 1e-6, 0.0, 0.0, 0.0; -//initial six DOF position information of parts. xc yc zc -double massCenter_0[] = 0.0 , 0.0, 0.0; -//initial six DOF position information of parts. angleX angleY angleZ -double attitudeAngle_0[] = 0.0 , 0.0, 0.0; -//initial six DOF move information of parts. vc vy vz -double massCenterVelocity_0[] = 0.0, 0.0, 0.0; -//initial six DOF move information of parts. omigX omigY omigZ -double angularVelocity_0[] = 0.0, 0.0, 0.0; -//the object that the parts belong to. -int fartherIndex_0 = -1; -//the assembly position of the parts. xc yc zc angleX angleY angleZ -double configPamameter_0[] = 0.0 ,0.0 ,0.0 ,0.0 ,0.0 ,0.0; -//the move pattern of the parts. +// mass of parts. +double mass_0 = 1.0; +// gravity of parts (along negative direction in Y-axis, eg. 9.8). +double gravity_0 = 0.0; +// mass matrix of parts Ixx Iyy Izz Ixy Ixz Iyz. +double massMatrix_0[] = 1e-7, 1e-6, 1e-6, 0.0, 0.0, 0.0; +// initial six DOF position information of parts. xc yc zc. +double massCenter_0[] = 0.0, 0.0, 0.0; +// if reset mass center while restart. +int resetMassCenter_0 = 0; +// position offset of parts. dx dy dz. +double massCenterDxyz_0[] = 0.0, 0.0, 0.0; +// initial six DOF position information of parts. angleX angleY angleZ. +double attitudeAngle_0[] = 0.0, 0.0, 0.0; +// initial six DOF move information of parts. vc vy vz. +double massCenterVelocity_0[] = 0.0, 0.0, 0.0; +// initial six DOF move information of parts. omigX omigY omigZ. +double angularVelocity_0[] = 0.0, 0.0, 0.0; +// the object that the parts belong to. +int fartherIndex_0 = -1; +// the assembly position of the parts. xc yc zc angleX angleY angleZ. +double configPamameter_0[] = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0; +// the move pattern of the parts. // -1 given motion partten. // 0 still. // 1 six DOF motion. @@ -1346,51 +1400,68 @@ double configPamameter_0[] = 0.0 ,0.0 ,0.0 ,0.0 ,0.0 // 14 forced pitch motion. // 15 forced yaw motion. // 16 forced roll motion. -int RBDMethod_0 = 0; -double amplitude_0 = 0.0; -double reduceFrequency_0 = 0.0; -//direction of rotation +int RBDMethod_0 = 0; +double amplitude_0 = 0.0; +double reduceFrequency_0 = 0.0; +// direction of rotation. // 1 -- clockwise from the point of view along the positive x axis. // -1 -- anticlockwise from the point of view along the positive x axis. -int direction_0 = -1; -double rotateFrequency_0 = 0.0; -//string uDFSixDofFileName_0 = "./Bin/UDFSixDof.Parameter"; -//additional force (system axis) fX fY fZ -double addedForce_0[] = 0.0 ,0.0 ,0.0 ; -//additional moment of Force (system axis) mX mY mZ -double addedMoment_0[] = 0.0 ,0.0 ,0.0 ; -//the deformation method of the parts. -int morphing_0 = 0; - -// post indentify -int integralOrder = 4; +int direction_0 = -1; +double rotateFrequency_0 = 0.0; +//string uDFSixDofFileName_0 = "./Bin/UDFSixDof.Parameter"; +// dimensional physical time for additional force(s). +double addedForceTime_0[] = 0.0; +// additional force(inertia system) fX fY fZ. +double addedForce_0[] = 0.0, 0.0, 0.0; +// additional moment(inertia system) mX mY mZ. +double addedMoment_0[] = 0.0, 0.0, 0.0; +// the deformation method of the parts. +int morphing_0 = 0; +// post indentify. +int integralOrder = 4; // ---------------- ATP read -------------------------------------------- -//@int inflowParaType = 0; +//@int inflowParaType = 0; //@double refReNumber = 6.5e6; //@double refDimensionalTemperature = 288.15; //@double freestream_vibration_temperature = 300.00; -//@double refDimensionalPressure = 0; -//@double height = 0; -//@int nsubsonicInlet = 0; -//@int nsubsonicOutlet = 0; -//@string inLetFileName = "./bin/subsonicInlet.hypara"; -//@string outLetFileName = "./bin/subsonicOutlet.hypara"; +//@double refDimensionalPressure = 0; +//@double height = 0; +//@int nsubsonicInlet = 0; +//@int nsubsonicOutlet = 0; +//@string inLetFileName = "./bin/subsonicInlet.hypara"; +//@string outLetFileName = "./bin/subsonicOutlet.hypara"; //@double refDimensionalVelocity = 0; //@double refDimensionalDensity = 0; - -######################################################################### -# Old Parameter # -######################################################################### +//@string weatherDataFilePath = "./WRFData/"; +//@double longitude = 110.95 +//@double latitude = 19.61; +#************************************************************************ +# Old Parameter * +#************************************************************************ int isPlotVolumeField = 0; +#************************************************************************ +# partial flow field setting Parameter * +#************************************************************************ +//int nPartialParameter = 0; // 0/1/2 +//int nNumberOfPartialField = 0; // +//int nStartGridIndex[] = [0]; +//int nEndGridIndex[] = [0]; -######################################################################### -# Incompressible Parameter # -######################################################################### +//double partialCFL[] = [0.0]; +//double partialSpeedCoef[] = [0.0]; +//double partialSpeed[] = [0.0]; +//double partialAttackd[] = [0.0]; +//double partialSlide[] = [0.0]; +//double partialPressure[] = [0.0]; +//double partialTemperature[] = [0.0]; +//double partialMassFractions[] = [0.0]; +#************************************************************************ +# Incompressible Parameter * +#************************************************************************ int isSolveEnergyEquation = 0; int isSolveTurbEquation = 0; -int isSolveSpeciesEquation = 0; - +int isSolveSpeciesEquation = 0; \ No newline at end of file diff --git a/A13_TwoD_BackwardStep_PressureOutlet_SA_Struct_4CPU/bin/grid_para.hypara b/A13_TwoD_BackwardStep_PressureOutlet_SA_Struct_4CPU/bin/grid_para.hypara index c2c0f9b..23beed3 100644 --- a/A13_TwoD_BackwardStep_PressureOutlet_SA_Struct_4CPU/bin/grid_para.hypara +++ b/A13_TwoD_BackwardStep_PressureOutlet_SA_Struct_4CPU/bin/grid_para.hypara @@ -4,9 +4,12 @@ // gridtype: Grid type for generation, conversion, reconstruction, merging. // 0 -- Unstructured grid. // 1 -- Structured grid. -// axisup: Type of Cartisien coordinates system, used in grid conversion. -// 1 -- Y upward. (default) -// 2 -- Z upward. +// nAxisRotateTimes: number of axis rotating times, zero (default) meaning without rotating. +// axisRotateOrder : axis rotating order. +// 1 -- X-axis. +// 2 -- Y-axis. +// 3 -- Z-axis. +// axisRotateAngles: axis rotating angles (degree), which are corresponding to the axis rotating order. // from_gtype: Type of grid data type in grid conversion process. // -1 -- MULTI_TYPE. // 1 -- PHengLEI, *.fts. @@ -18,7 +21,9 @@ // 7 -- Hybrid, include both of unstructured and structured grid, *.fts. // 8 -- GMSH, *.msh. int gridtype = 1; -int axisup = 1; +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; int from_gtype = 3; ######################################################################### diff --git a/A13_TwoD_BackwardStep_PressureOutlet_SA_Struct_4CPU/二维结构后台阶低速湍流算例说明文档.pdf b/A13_TwoD_BackwardStep_PressureOutlet_SA_Struct_4CPU/二维结构后台阶低速湍流算例说明文档.pdf index 34ad01a604a4cc7ba0d1b63337281cc0bd8bea1e..ee2504fa34e705c59170f8a4f1f5a0b137963b6a 100644 GIT binary patch delta 370951 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%0D@Q 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 UCs=Y*pfDVfI@t#VM6QeaABZ8$QUCw| delta 309979 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