From e8c3ddafe49485ffe387e6cedfed4637cc704ad7 Mon Sep 17 00:00:00 2001 From: hechao <490956681@qq.com> Date: Thu, 15 Jun 2023 18:18:40 +0800 Subject: [PATCH] =?UTF-8?q?B=E7=B3=BB=E5=88=97=E9=9D=9E=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E5=8F=82=E6=95=B0=EF=BC=8C=E7=BD=91=E6=A0=BC=E5=8F=8A=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E6=9B=B4=E6=96=B0=EF=BC=9B=E6=96=B0=E5=A2=9EB19TrapWi?= =?UTF-8?q?ng=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 +- .../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 272489 -> 381662 bytes .../bin/cfd_para.hypara | 1055 ++++++------ .../bin/grid_para.hypara | 13 +- .../bin/key.hypara | 3 - .../bin/cfd_para.hypara | 1467 +++++++++++++++++ .../bin/cfd_para_subsonic.hypara | 194 +++ .../bin/grid_para.hypara | 36 + .../bin/key.hypara | 55 + .../bin/partition.hypara | 21 + .../grid/网格地址.txt | 5 + 44 files changed, 12074 insertions(+), 8931 deletions(-) create mode 100644 B19_ThreeD_TrapWing_SA_AoA13_256CPU/bin/cfd_para.hypara create mode 100644 B19_ThreeD_TrapWing_SA_AoA13_256CPU/bin/cfd_para_subsonic.hypara create mode 100644 B19_ThreeD_TrapWing_SA_AoA13_256CPU/bin/grid_para.hypara create mode 100644 B19_ThreeD_TrapWing_SA_AoA13_256CPU/bin/key.hypara create mode 100644 B19_ThreeD_TrapWing_SA_AoA13_256CPU/bin/partition.hypara create mode 100644 B19_ThreeD_TrapWing_SA_AoA13_256CPU/grid/网格地址.txt diff --git a/B01_TwoD_NACA0012_SA_Unstruct_1CPU/bin/cfd_para.hypara b/B01_TwoD_NACA0012_SA_Unstruct_1CPU/bin/cfd_para.hypara index c344658..f903a5a 100644 --- a/B01_TwoD_NACA0012_SA_Unstruct_1CPU/bin/cfd_para.hypara +++ b/B01_TwoD_NACA0012_SA_Unstruct_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/B01_TwoD_NACA0012_SA_Unstruct_1CPU/bin/grid_para.hypara b/B01_TwoD_NACA0012_SA_Unstruct_1CPU/bin/grid_para.hypara index 6659e13..07f4e0b 100644 --- a/B01_TwoD_NACA0012_SA_Unstruct_1CPU/bin/grid_para.hypara +++ b/B01_TwoD_NACA0012_SA_Unstruct_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 = 0; -int axisup = 1; +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; int from_gtype = 5; ######################################################################### diff --git a/B02_TwoD_NACA4412_SA_Unstruct_2CPU/bin/cfd_para.hypara b/B02_TwoD_NACA4412_SA_Unstruct_2CPU/bin/cfd_para.hypara index c344658..f903a5a 100644 --- a/B02_TwoD_NACA4412_SA_Unstruct_2CPU/bin/cfd_para.hypara +++ b/B02_TwoD_NACA4412_SA_Unstruct_2CPU/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/B02_TwoD_NACA4412_SA_Unstruct_2CPU/bin/grid_para.hypara b/B02_TwoD_NACA4412_SA_Unstruct_2CPU/bin/grid_para.hypara index 9bf9f8c..1886567 100644 --- a/B02_TwoD_NACA4412_SA_Unstruct_2CPU/bin/grid_para.hypara +++ b/B02_TwoD_NACA4412_SA_Unstruct_2CPU/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 = 0; -int axisup = 1; +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; int from_gtype = 2; ######################################################################### diff --git a/B03_TwoD_Rae2822_SA_Unstruct_1CPU/bin/cfd_para.hypara b/B03_TwoD_Rae2822_SA_Unstruct_1CPU/bin/cfd_para.hypara index c344658..f903a5a 100644 --- a/B03_TwoD_Rae2822_SA_Unstruct_1CPU/bin/cfd_para.hypara +++ b/B03_TwoD_Rae2822_SA_Unstruct_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/B03_TwoD_Rae2822_SA_Unstruct_1CPU/bin/grid_para.hypara b/B03_TwoD_Rae2822_SA_Unstruct_1CPU/bin/grid_para.hypara index c134010..ae49410 100644 --- a/B03_TwoD_Rae2822_SA_Unstruct_1CPU/bin/grid_para.hypara +++ b/B03_TwoD_Rae2822_SA_Unstruct_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 = 0; -int axisup = 1; +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; int from_gtype = 5; ######################################################################### diff --git a/B04_ThreeD_DLR-F6_SA_Unstruct_60CPU/bin/cfd_para.hypara b/B04_ThreeD_DLR-F6_SA_Unstruct_60CPU/bin/cfd_para.hypara index c344658..f903a5a 100644 --- a/B04_ThreeD_DLR-F6_SA_Unstruct_60CPU/bin/cfd_para.hypara +++ b/B04_ThreeD_DLR-F6_SA_Unstruct_60CPU/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/B04_ThreeD_DLR-F6_SA_Unstruct_60CPU/bin/grid_para.hypara b/B04_ThreeD_DLR-F6_SA_Unstruct_60CPU/bin/grid_para.hypara index 690cddb..5245e41 100644 --- a/B04_ThreeD_DLR-F6_SA_Unstruct_60CPU/bin/grid_para.hypara +++ b/B04_ThreeD_DLR-F6_SA_Unstruct_60CPU/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 = 0; -int axisup = 2; +int nAxisRotateTimes = 1; +int axisRotateOrder[] = [1]; +double axisRotateAngles[]= [90.0]; int from_gtype = 2; ######################################################################### diff --git a/B05_ThreeD_x38_Laminar_Unstruct_128CPU/bin/cfd_para.hypara b/B05_ThreeD_x38_Laminar_Unstruct_128CPU/bin/cfd_para.hypara index c344658..f903a5a 100644 --- a/B05_ThreeD_x38_Laminar_Unstruct_128CPU/bin/cfd_para.hypara +++ b/B05_ThreeD_x38_Laminar_Unstruct_128CPU/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/B05_ThreeD_x38_Laminar_Unstruct_128CPU/bin/grid_para.hypara b/B05_ThreeD_x38_Laminar_Unstruct_128CPU/bin/grid_para.hypara index 79b8ce6..77af35a 100644 --- a/B05_ThreeD_x38_Laminar_Unstruct_128CPU/bin/grid_para.hypara +++ b/B05_ThreeD_x38_Laminar_Unstruct_128CPU/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 = 0; -int axisup = 2; +int nAxisRotateTimes = 1; +int axisRotateOrder[] = [1]; +double axisRotateAngles[]= [90.0]; int from_gtype = 2; ######################################################################### diff --git a/B06_ThreeD_Axisymmetric_SA_Unstruct_64CPU/bin/cfd_para.hypara b/B06_ThreeD_Axisymmetric_SA_Unstruct_64CPU/bin/cfd_para.hypara index c344658..f903a5a 100644 --- a/B06_ThreeD_Axisymmetric_SA_Unstruct_64CPU/bin/cfd_para.hypara +++ b/B06_ThreeD_Axisymmetric_SA_Unstruct_64CPU/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/B06_ThreeD_Axisymmetric_SA_Unstruct_64CPU/bin/grid_para.hypara b/B06_ThreeD_Axisymmetric_SA_Unstruct_64CPU/bin/grid_para.hypara index 622523f..eb37041 100644 --- a/B06_ThreeD_Axisymmetric_SA_Unstruct_64CPU/bin/grid_para.hypara +++ b/B06_ThreeD_Axisymmetric_SA_Unstruct_64CPU/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 = 0; -int axisup = 1; +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; int from_gtype = 2; ######################################################################### diff --git a/B07_ThreeD_Sphere_Laminar_Unstruct_4CPU/bin/cfd_para.hypara b/B07_ThreeD_Sphere_Laminar_Unstruct_4CPU/bin/cfd_para.hypara index c344658..f903a5a 100644 --- a/B07_ThreeD_Sphere_Laminar_Unstruct_4CPU/bin/cfd_para.hypara +++ b/B07_ThreeD_Sphere_Laminar_Unstruct_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/B07_ThreeD_Sphere_Laminar_Unstruct_4CPU/bin/grid_para.hypara b/B07_ThreeD_Sphere_Laminar_Unstruct_4CPU/bin/grid_para.hypara index 635c25d..bdf9c04 100644 --- a/B07_ThreeD_Sphere_Laminar_Unstruct_4CPU/bin/grid_para.hypara +++ b/B07_ThreeD_Sphere_Laminar_Unstruct_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 = 0; -int axisup = 1; +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; int from_gtype = 5; ######################################################################### diff --git a/B08_TwoD_Plate_Laminar_Unstruct_1CPU/bin/cfd_para.hypara b/B08_TwoD_Plate_Laminar_Unstruct_1CPU/bin/cfd_para.hypara index c344658..f903a5a 100644 --- a/B08_TwoD_Plate_Laminar_Unstruct_1CPU/bin/cfd_para.hypara +++ b/B08_TwoD_Plate_Laminar_Unstruct_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/B08_TwoD_Plate_Laminar_Unstruct_1CPU/bin/grid_para.hypara b/B08_TwoD_Plate_Laminar_Unstruct_1CPU/bin/grid_para.hypara index 11cffb3..8cf4417 100644 --- a/B08_TwoD_Plate_Laminar_Unstruct_1CPU/bin/grid_para.hypara +++ b/B08_TwoD_Plate_Laminar_Unstruct_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 = 0; -int axisup = 1; +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; int from_gtype = 5; ######################################################################### diff --git a/B09_TwoD_plate_SA_Unstruct_1CPU/bin/cfd_para.hypara b/B09_TwoD_plate_SA_Unstruct_1CPU/bin/cfd_para.hypara index c344658..f903a5a 100644 --- a/B09_TwoD_plate_SA_Unstruct_1CPU/bin/cfd_para.hypara +++ b/B09_TwoD_plate_SA_Unstruct_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/B09_TwoD_plate_SA_Unstruct_1CPU/bin/grid_para.hypara b/B09_TwoD_plate_SA_Unstruct_1CPU/bin/grid_para.hypara index ae0597a..dfa1a28 100644 --- a/B09_TwoD_plate_SA_Unstruct_1CPU/bin/grid_para.hypara +++ b/B09_TwoD_plate_SA_Unstruct_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 = 0; -int axisup = 1; +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; int from_gtype = 5; ######################################################################### diff --git a/B10_ThreeD_CompRamp-16_SA_Unstruct_1CPU/bin/cfd_para.hypara b/B10_ThreeD_CompRamp-16_SA_Unstruct_1CPU/bin/cfd_para.hypara index c344658..f903a5a 100644 --- a/B10_ThreeD_CompRamp-16_SA_Unstruct_1CPU/bin/cfd_para.hypara +++ b/B10_ThreeD_CompRamp-16_SA_Unstruct_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/B10_ThreeD_CompRamp-16_SA_Unstruct_1CPU/bin/grid_para.hypara b/B10_ThreeD_CompRamp-16_SA_Unstruct_1CPU/bin/grid_para.hypara index 1c4e864..dbdab0a 100644 --- a/B10_ThreeD_CompRamp-16_SA_Unstruct_1CPU/bin/grid_para.hypara +++ b/B10_ThreeD_CompRamp-16_SA_Unstruct_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 = 0; -int axisup = 2; +int nAxisRotateTimes = 1; +int axisRotateOrder[] = [1]; +double axisRotateAngles[]= [90.0]; int from_gtype = 2; ######################################################################### diff --git a/B11_ThreeD_DLR-GK01_Ma7_SA_Unstruct_8CPU/bin/cfd_para.hypara b/B11_ThreeD_DLR-GK01_Ma7_SA_Unstruct_8CPU/bin/cfd_para.hypara index c344658..f903a5a 100644 --- a/B11_ThreeD_DLR-GK01_Ma7_SA_Unstruct_8CPU/bin/cfd_para.hypara +++ b/B11_ThreeD_DLR-GK01_Ma7_SA_Unstruct_8CPU/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/B11_ThreeD_DLR-GK01_Ma7_SA_Unstruct_8CPU/bin/grid_para.hypara b/B11_ThreeD_DLR-GK01_Ma7_SA_Unstruct_8CPU/bin/grid_para.hypara index daced3b..31bbff0 100644 --- a/B11_ThreeD_DLR-GK01_Ma7_SA_Unstruct_8CPU/bin/grid_para.hypara +++ b/B11_ThreeD_DLR-GK01_Ma7_SA_Unstruct_8CPU/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 = 0; -int axisup = 2; +int nAxisRotateTimes = 1; +int axisRotateOrder[] = [1]; +double axisRotateAngles[]= [90.0]; int from_gtype = 2; ######################################################################### diff --git a/B12_ThreeD_DoubleEllipse_Laminar_Unstruct_4CPU/bin/cfd_para.hypara b/B12_ThreeD_DoubleEllipse_Laminar_Unstruct_4CPU/bin/cfd_para.hypara index c344658..f903a5a 100644 --- a/B12_ThreeD_DoubleEllipse_Laminar_Unstruct_4CPU/bin/cfd_para.hypara +++ b/B12_ThreeD_DoubleEllipse_Laminar_Unstruct_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/B12_ThreeD_DoubleEllipse_Laminar_Unstruct_4CPU/bin/grid_para.hypara b/B12_ThreeD_DoubleEllipse_Laminar_Unstruct_4CPU/bin/grid_para.hypara index d9b2783..be75fbb 100644 --- a/B12_ThreeD_DoubleEllipse_Laminar_Unstruct_4CPU/bin/grid_para.hypara +++ b/B12_ThreeD_DoubleEllipse_Laminar_Unstruct_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 = 0; -int axisup = 1; +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; int from_gtype = 5; ######################################################################### diff --git a/B13_ThreeD_Chnt_SA_Unstruct_100CPU/bin/cfd_para.hypara b/B13_ThreeD_Chnt_SA_Unstruct_100CPU/bin/cfd_para.hypara index c344658..f903a5a 100644 --- a/B13_ThreeD_Chnt_SA_Unstruct_100CPU/bin/cfd_para.hypara +++ b/B13_ThreeD_Chnt_SA_Unstruct_100CPU/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/B13_ThreeD_Chnt_SA_Unstruct_100CPU/bin/grid_para.hypara b/B13_ThreeD_Chnt_SA_Unstruct_100CPU/bin/grid_para.hypara index 4686f2e..6f5da54 100644 --- a/B13_ThreeD_Chnt_SA_Unstruct_100CPU/bin/grid_para.hypara +++ b/B13_ThreeD_Chnt_SA_Unstruct_100CPU/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 = 0; -int axisup = 2; +int nAxisRotateTimes = 1; +int axisRotateOrder[] = [1]; +double axisRotateAngles[]= [90.0]; int from_gtype = 2; ######################################################################### diff --git a/B14-TwoD_30p30n_SA_Unstruct_4CPU/bin/cfd_para.hypara b/B14-TwoD_30p30n_SA_Unstruct_4CPU/bin/cfd_para.hypara index c344658..f903a5a 100644 --- a/B14-TwoD_30p30n_SA_Unstruct_4CPU/bin/cfd_para.hypara +++ b/B14-TwoD_30p30n_SA_Unstruct_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/B14-TwoD_30p30n_SA_Unstruct_4CPU/bin/grid_para.hypara b/B14-TwoD_30p30n_SA_Unstruct_4CPU/bin/grid_para.hypara index 31a7f0a..5d53edf 100644 --- a/B14-TwoD_30p30n_SA_Unstruct_4CPU/bin/grid_para.hypara +++ b/B14-TwoD_30p30n_SA_Unstruct_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 = 0; -int axisup = 1; +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; int from_gtype = 5; ######################################################################### diff --git a/B15-TwoD_NLR7301_SA_Unstruct_4CPU/bin/cfd_para.hypara b/B15-TwoD_NLR7301_SA_Unstruct_4CPU/bin/cfd_para.hypara index c344658..f903a5a 100644 --- a/B15-TwoD_NLR7301_SA_Unstruct_4CPU/bin/cfd_para.hypara +++ b/B15-TwoD_NLR7301_SA_Unstruct_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/B15-TwoD_NLR7301_SA_Unstruct_4CPU/bin/grid_para.hypara b/B15-TwoD_NLR7301_SA_Unstruct_4CPU/bin/grid_para.hypara index 1d02bda..c4e7572 100644 --- a/B15-TwoD_NLR7301_SA_Unstruct_4CPU/bin/grid_para.hypara +++ b/B15-TwoD_NLR7301_SA_Unstruct_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 = 0; -int axisup = 1; +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; int from_gtype = 2; ######################################################################### diff --git a/B16-ThreeD_Hollow_Cylinder_Flare_Laminar_Unstruct_16CPU/bin/cfd_para.hypara b/B16-ThreeD_Hollow_Cylinder_Flare_Laminar_Unstruct_16CPU/bin/cfd_para.hypara index c344658..f903a5a 100644 --- a/B16-ThreeD_Hollow_Cylinder_Flare_Laminar_Unstruct_16CPU/bin/cfd_para.hypara +++ b/B16-ThreeD_Hollow_Cylinder_Flare_Laminar_Unstruct_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/B16-ThreeD_Hollow_Cylinder_Flare_Laminar_Unstruct_16CPU/bin/grid_para.hypara b/B16-ThreeD_Hollow_Cylinder_Flare_Laminar_Unstruct_16CPU/bin/grid_para.hypara index ab69054..42bc90a 100644 --- a/B16-ThreeD_Hollow_Cylinder_Flare_Laminar_Unstruct_16CPU/bin/grid_para.hypara +++ b/B16-ThreeD_Hollow_Cylinder_Flare_Laminar_Unstruct_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 = 0; -int axisup = 2; +int nAxisRotateTimes = 1; +int axisRotateOrder[] = [1]; +double axisRotateAngles[]= [90.0]; int from_gtype = 2; ######################################################################### diff --git a/B17-TwoD_Plate_S-KSR_SST_Unstruct_4CPU/bin/cfd_para.hypara b/B17-TwoD_Plate_S-KSR_SST_Unstruct_4CPU/bin/cfd_para.hypara index c344658..f903a5a 100644 --- a/B17-TwoD_Plate_S-KSR_SST_Unstruct_4CPU/bin/cfd_para.hypara +++ b/B17-TwoD_Plate_S-KSR_SST_Unstruct_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/B17-TwoD_Plate_S-KSR_SST_Unstruct_4CPU/bin/grid_para.hypara b/B17-TwoD_Plate_S-KSR_SST_Unstruct_4CPU/bin/grid_para.hypara index 9832a8a..8336ce7 100644 --- a/B17-TwoD_Plate_S-KSR_SST_Unstruct_4CPU/bin/grid_para.hypara +++ b/B17-TwoD_Plate_S-KSR_SST_Unstruct_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 -- HyperFLOW( PHengLEI ), *.fts. @@ -18,7 +21,9 @@ // 7 -- Hybrid, include both of unstructured and structured grid, *.fts. // 8 -- GMSH, *.msh. int gridtype = 0; -int axisup = 1; +int nAxisRotateTimes = 0; +int axisRotateOrder[] = [1, 2, 3]; +double axisRotateAngles[] = [0.0, 0.0, 0.0]; int from_gtype = 2; ######################################################################### diff --git a/B17-TwoD_Plate_S-KSR_SST_Unstruct_4CPU/二维非结构低速平板转捩算例说明文档.pdf b/B17-TwoD_Plate_S-KSR_SST_Unstruct_4CPU/二维非结构低速平板转捩算例说明文档.pdf index eb041e6d6c7209a9189825b972c910cb65353a8d..57bf68c2fbae17a255a28b67013d305069585073 100644 GIT binary patch delta 342036 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≈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 -biQ)A-X^8>{nIgR8Q4?!=UG@^T5tn7f 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%0Dlm!~jG_Yi&*6I|dMDm0n}b$2Bg4tqF%Y(Wj$4s; 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 RU|~oMmW}n`L3Le?{{xHcf+qj~ delta 232172 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%0AdI_LW^2_NPPd;z{AW4@|I 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 UuzKMM%3leB=?H=UASn6&0KXCSS^xk5 diff --git a/B18-ThreeD_CRM-HL_Level-B_SA_Unstruct_1024CPU/bin/cfd_para.hypara b/B18-ThreeD_CRM-HL_Level-B_SA_Unstruct_1024CPU/bin/cfd_para.hypara index c344658..f903a5a 100644 --- a/B18-ThreeD_CRM-HL_Level-B_SA_Unstruct_1024CPU/bin/cfd_para.hypara +++ b/B18-ThreeD_CRM-HL_Level-B_SA_Unstruct_1024CPU/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/B18-ThreeD_CRM-HL_Level-B_SA_Unstruct_1024CPU/bin/grid_para.hypara b/B18-ThreeD_CRM-HL_Level-B_SA_Unstruct_1024CPU/bin/grid_para.hypara index 78938be..1724043 100644 --- a/B18-ThreeD_CRM-HL_Level-B_SA_Unstruct_1024CPU/bin/grid_para.hypara +++ b/B18-ThreeD_CRM-HL_Level-B_SA_Unstruct_1024CPU/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. @@ -19,7 +22,9 @@ // 8 -- GMSH, *.msh. // 9 -- Gridgen type of structured grid, *.dat/*.grd. int gridtype = 0; -int axisup = 2; +int nAxisRotateTimes = 1; +int axisRotateOrder[] = [1]; +double axisRotateAngles[]= [90.0]; int from_gtype = 2; ######################################################################### diff --git a/B18-ThreeD_CRM-HL_Level-B_SA_Unstruct_1024CPU/bin/key.hypara b/B18-ThreeD_CRM-HL_Level-B_SA_Unstruct_1024CPU/bin/key.hypara index 87a048f..1dd9f3c 100644 --- a/B18-ThreeD_CRM-HL_Level-B_SA_Unstruct_1024CPU/bin/key.hypara +++ b/B18-ThreeD_CRM-HL_Level-B_SA_Unstruct_1024CPU/bin/key.hypara @@ -45,9 +45,6 @@ string parafilename = "./bin/cfd_para_subsonic.hypara"; //int nsimutask = 14; //string parafilename = "./bin/integrative_solver.hypara"; -//int nsimutask = 15; -//string parafilename = "./bin/gridcheck_solver.hypara"; - //int nsimutask = 99; //string parafilename = "./bin/post_processing.hypara"; diff --git a/B19_ThreeD_TrapWing_SA_AoA13_256CPU/bin/cfd_para.hypara b/B19_ThreeD_TrapWing_SA_AoA13_256CPU/bin/cfd_para.hypara new file mode 100644 index 0000000..f903a5a --- /dev/null +++ b/B19_ThreeD_TrapWing_SA_AoA13_256CPU/bin/cfd_para.hypara @@ -0,0 +1,1467 @@ +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// PPPPP H H EEEEE N N GGGGG L EEEEE III + +// P P H H E NN N G L E I + +// PPPPP HHHHH EEEEE N N N G GG L EEEEE I + +// P H H E N N N G G L E I + +// P H H EEEEE N N GGGGG LLLLL EEEEE III + +//------------------------------------------------------------------------+ +// 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. +// multiblock: Multi-block grid or not, only for structured grid conversion. +// 0 -- Not. +// 1 -- Yes. +// iadapt: Adaptation number for unstructure grid. +// SymmetryFaceVector: The vector of symmetry face. +// 0 -- X axis. +// 1 -- Y axis. +// 2 -- Z axis. +// gridReorder: Reorder cell and face of grid or not, only for 3D unstructured grid conversion, +// which is CGNS type. +// 0 -- Not. +// 1 -- Yes. +// faceReorderMethod: the reorder method face of unstructured grid. +// 0 -- BSFCELLFACEORG. +// 1 -- BSFCELLFACELEFT. +// 2 -- BSFCELLFACERIGHT. +int gridtype = 0; +int gridobj = 1; +int multiblock = 0; +int iadapt = 0; +int SymmetryFaceVector = 1; +int gridReorder = 0; +int faceReorderMethod = 0; + +// 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 # +//----------------------------------------------------------------------- +// from_gtype/to_gtype: Type of grid data type in grid conversion process. +// -1 -- MULTI_TYPE. +// 1 -- PHengLEI, *.fts. +// 2 -- CGNS, *.cgns. +// 3 -- Plot3D type of structured grid, *.dat/*.grd. +// 4 -- Fieldview type of unstructured grid, *.dat/*.inp. +// 5 -- Fluent, *.cas/*.msh. +// 6 -- Ustar, mgrid.in. +// 7 -- Hybrid, include both of unstructured and structured grid, *.fts. +// 8 -- GMSH, *.msh. +// 9 -- Gridgen type of structured grid, *.dat/*.grd. +// dumpOldGrid: If dump out the old grid file. +// 0 -- Not. (default) +// 1 -- Yes. +int from_gtype = 2; +int to_gtype = 1; +int dumpOldGrid = 0; + +//----------------------------------------------------------------------- +# File path # +//----------------------------------------------------------------------- +// 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"; + +// ----------------- some advanced choices ------------------------------ +// iunsteady: The Grid is for unsteady simulation or not. +int iunsteady = 0; + +// fileformat: Ustar Grid file format. +// 0 -- BINARY. +// 1 -- ASCII. +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"; + +// Some parameters for structured overlapping grid. +int codeOfDigHoles = 1; +string holeBasicFileName = "./oversetGridView/holeBasicFile.inp"; +string holeFullFileName = "./oversetGridView/holeFullFile.dat"; +string linkFileName = "./oversetGridView/topology.dat"; +string zoneInverseFileName = "./oversetGridView/zoneInverseMapping.inp"; + +// ----------------- Grid Refine Parameters ----------------------------- +// anisoRefine: If refine grid by anisoRefine type. +// 0 -- Not. (default) +// 1 -- Yes. +// geometryUnit: Geometry unit. +// 1 -- meter. +// 2 -- millimeter. +// 3 -- inch. +// exclusiveCase: Parallel projection exclusive case. +// 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 exclusiveCase = 0; +int projectOrgPoint = 0; +string geometryFileName = "./grid/jsm.igs"; + +// ----------------- Grid Deform Parameters ----------------------------- +// deformationMethod: Grid Deform. +// 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. +// rotatePostionZ : Rotate postion. +// rotatePostionY : Rotate postion. +// gridSlice : If dump slice grid. +// sliceAxis : Grid slice axis. +// slicePosition : Grid slice position. +int nDeformStep = 40; +double flapAngle = 10.0; +double rotatePostionZ = 4.00003; +double rotatePostionY = 3.05; + +int deformationMethod = 2; +string stationalGridFile = "./grid/Segment2Brid.fts"; +string visualFileName = "./results/deformedGrid.dat" + +int gridSlice = 1; +int sliceAxis = 1; +double slicePosition = 13; + +// ----------------- RBF Parameters ------------------------------------- +// numberOfReferenceCP: Number of reference Control Points. +// influencePara : The RBF influence radius parameter. +int numberOfReferenceCP = 40; +double influencePara = 25.0; + +// ----------------- Periodic Parameters -------------------------------- +// Notice: Rotational periodicity only support rotation along the X axis! +// periodicType: Which periodic boundary is used. +// 0 -- without Periodic Boundary. +// 1 -- Translational periodicity. +// 2 -- Rotational periodicity. +// translationLength[]: The relative distance between two periodic face + 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 rotationAngle = 0.0; + +######################################################################### +# Default parameters for Partition # +######################################################################### +// pgridtype: The grid type. +// 0 -- unstruct grid. +// 1 -- struct grid. +// 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; + +// traceMark: Trace mark or not, only for structured grid partition. +// 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. +int traceMark = 0; +int blockIndexOfMark = 0; +int cellIndexOfMark[] = [185, 30, 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). +// 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"; + +// ------------------ Sompe advanced parameters ------------------------- +// 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. +// npartmethod: Method of interface reconstruction, default is 1. +// parallelPartitionMethod: Method of parallel partition, this is set only when execute parallel partition. It would be skipped when serial partition. +// 1 -- Using ParMetis for homogeneous MPI. +// 2 -- Using Metis for homogeneous MPI. +// 3 -- using METIS partition for homogeneous OpenMP. +// parmetisBalance: Used to specify the imbalance tolerance. +// 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; + +// numberOfMultigrid: Number of multi-grid levels, ONLY used for structured grid. +// 1 -- single level. +// 2 -- 2 level. +// N -- N level, ..., et al. +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. +// 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. +int maxSimuStep = 20000; +int intervalStepFlow = 1000; +int intervalStepPlot = 1000; +int intervalStepSample = 1000; +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 # +//----------------------------------------------------------------------- +// refMachNumber: Mach number. +// attackd: Angle of attack. +// angleSlide: Angle of sideslip. +// inflowParaType: The type of inflow parameters. +// 0 -- the nondimensional conditions. +// 1 -- the flight conditions. +// 2 -- the experiment 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.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. +// Generally, the gas is air. Sometimes, it is experiment gas, such as Nitrogen, Argon, and so on. +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; +double refDimensionalTemperature = 288.15; +double freestream_vibration_temperature = 300.00; + +//int inflowParaType = 1; +//double height = 0.001; + +//int inflowParaType = 2; +//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)). + +// The velocity, temperature and density are fixed. +//int inflowParaType = 4; +//double refDimensionalVelocity = 1000.0; +//double refDimensionalDensity = 1.0e3; + +// 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. +//int inflowParaType = 6; +//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; +double gridScaleFactor = 1.0; +double gridTranslationVector[] = [0.0, 0.0, 0.0]; + +int numberOfAerodynamicForceComponents = 1; +double forceReferenceLengthSpanWise = 1.0; // unit of meter. +double forceReferenceLength = 1.0; // unit of meter. +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 * +#************************************************************************ +// inviscidSchemeName: Spatial discretisation scheme of struct grid. +// Using this when solve structered grid or hybrid. +// -- "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. +// 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". +string inviscidSchemeName = "roe"; +int isWennScheme = 0; +string str_limiter_name = "vanalbada"; + +#************************************************************************ +# UnStruct Solver or Common * +#************************************************************************ +// viscousType: Viscous model. +// 0 -- Euler. +// 1 -- Lamilar. +// 2 -- Algebraic. +// 3 -- 1eq turbulent. +// 4 -- 2eq turbulent. +// viscousName: Laminar or tubulent model. +// -- "0eq-bl". +// -- "1eq-sa". +// -- "2eq-kw-menter-sst". +// -- "2eq-kw-menter-bsl". +// -- "2eq-kw-wilcox-1988". +// -- "2eq-kw-wilcox-1998". +// -- "2eq-kw-kok-tnt". +// -- "2eq-kw-wilcox-2006". +// -- "easm-kw-2003". +// -- "easm-kw-2005". +// DESType: Type of DES. +// 0 -- RANS. (default) +// 1 -- DES. +// 2 -- DDES. +// 3 -- IDDES. +// uns_scheme_name: Spatial discretisation scheme of Unstruct grid. +// Using this when solve Unstructered grid or hybrid. +// -- "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", +// -- "nolim", no limiter. +// uns_vis_name: Discretisation method of viscous term. +// -- "std", "test", "aver", "new1", "new2". +// gradientName: Gradient reconstruction method. +// -- "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. +// 4 -- Ustar limiter model, without grid size unitary. +// 7 -- default used. +// venkatCoeff: Cofficient of vencat, when using vencat limter. +// limitVariables: Limit model (It is useful only if limitVector is 0). +// 0 -- limit only for pressure and denstiny, then get the min value. +// 1 -- limit for every variables, then get the min value. +// limitVector: +// 0 -- Each variable use the same limiter coefficient. +// 1 -- Each variable use the respective limiter coefficients. +// reconmeth: +// 0 -- When reconstruct face value, Q+, Q- use respective limiter coefficients. +// 1 -- Q+, Q- use the min limiter coefficients of left and right cell. +// skewnessAngle: The skewness angle of grid cells. +// roeEntropyFixMethod: Entropy fix (correction) method. +// 1 -- direct fix, which limits the minimum eigenvalue directly. +// 2 -- multi-dimensional fix, which is derived from structured solver and now is only valid for struct solver. +// 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. + +//int viscousType = 0; +//string viscousName = "Euler"; + +//int viscousType = 1; +//string viscousName = "laminar"; + +int viscousType = 3; +string viscousName = "1eq-sa"; + +//int viscousType = 4; +//string viscousName = "2eq-kw-menter-sst"; + +int DESType = 0; + +string uns_scheme_name = "roe"; +string uns_limiter_name = "vencat"; +string uns_vis_name = "test"; +string gradientName = "ggnode"; + +int ivencat = 7; +double venkatCoeff = 5.0; +int reconmeth = 1; +int limitVariables = 0; +int limitVector = 0; +double skewnessAngle = 60.0; + +int roeEntropyFixMethod = 3; +double roeEntropyScale = 1.0; + +double AusmpwPlusLimiter = 1.0; + +#************************************************************************ +# Temporal Discretisation * +#************************************************************************ +// iunsteady: Steady or unsteady. +// 0 -- steady. +// 1 -- unsteay. +// physicalTimeStep: The nondimensional physical time step. +// ifStartFromSteadyResults: The unsteady simulation is start from steady flowfield or not, 0 is for no and else is for yes. +// ifStaticsFlowField: Statistical variables for unsteady simulation. +// ifStaticsReynoldsStress: Statistical Reynolds stress for unsteady simulation. +// startStatisticStep: Outer step when start statistics. +// when the value is larger than "maxSimuStep", it is useless. +// 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 = +// 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. +// 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. +// isUseLocalCFL: use variable number of CFL or not. +// 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. +// wallFunctionType: The type of wall function to implement. +// 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; +double physicalTimeStep = 0.01; +double physicalTimeStepDimensional = -0.001; +int ifStartFromSteadyResults = 0; +int ifStaticsFlowField = 0; +int ifStaticsReynoldsStress = 0; +int startStatisticStep = 800000; +double statisticalTimePeriod = -1.0; +int statisticMethod = 0; +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 iSimplifyViscousTerm = 1; +int ifLocalTimeStep = 0; +int isUseLocalCFL = 0; +int isUsePreTwall = 0; +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; + +int swapDq = 1; + +int nLUSGSSweeps = 1; +double LUSGSTolerance = 0.01; +int order = 2; + +double visl_min = 0.01; +double turbCFLScale = 1.0; +double csrv = 1.0; +double timemax = 1.0e10; +double dtsave = -1.0; +int maxale = 10; +double dtau = 0.001; + +int wallFunctionType = 0; + +int RKStage = 2; +double lamda[] = [0.5, 1.0]; + +//int RKStage = 1; +//double lamda[] = 1.0; + +//int RKStage = 4; +//double lamda[] = [0.25, 0.33333333333, 0.5, 1.0]; +#************************************************************************ +# 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. +// IMPORTANT WARNING: The file index should be ignored, +// e.g. if the partitioned grid is rae2822_hybrid2d__4_0.fts, +// please use 'rae2822_hybrid2d__4.fts' here! +// plotFieldType: If dump out the field results to visulization. +// walldistMethod: The method to compute wall distance. +// 0 -- accurate but not fast enough. +// 1 -- fast but not accurate enough. +// 2 -- super fast but more non-accurate! +// resSaveFile: The file path to save the residual convergence process, write data for every default (intervalStepRes) steps. +// turbresfile: The file path to save the residual convergence process of turbulence, write data for every default (intervalStepRes) steps. +// 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. +// 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 = ""; + +int nIsComputeWallDist = 0; +int walldistMethod = 1; +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"; +string samplefile = "results/sample.dat"; + +string protectionFile0 = "results/flow0.dat"; +string protectionFile1 = "results/flow1.dat"; +string wall_heatfluxfile = "results/wall_heatflux.dat"; + +string protectionTurbFile0 = "results/turb0.dat"; +string protectionTurbFile1 = "results/turb1.dat"; + +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"; +string hysteresisFileName = "results/force_beta.plt"; + +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. +// 0 -- dump out every probe/line/surface data for all step intervals. +// 1 -- dump out all probe/line/surface data for every step intervals. +int samplefileMode = 0; + +// visualSlice: The slice of tecflow. +// 0 -- Do not save slice data. +// 1 -- comput and save it to sliceFile. +// sliceAxis: Normal vector of slice. +// 1 -- X_DIR. +// 2 -- Y_DIR. +// 3 -- Z_DIR. +// slicePostion: Coordinate of slice. + +int visualSlice = 0; +int sliceAxis = 1; +double slicePostion = -0.5; +string sliceFile = "results/Slice.plt"; +int dumpWallFaceCenter = 0; + +// min-max box of the visual block. +double lowerPlotFieldBox[] = [0.0 0.0 0.0]; +double upperPlotFieldBox[] = [1.0 1.0 1.0]; + +//-----------the optional parameters list for the flow field output---------------- +// nVisualVariables: Number of variables want to be dumped for tecplot visualization. +// visualVariables : Variable types dumped, listed as following: +// -- density(0), u(1), v(2), w(3), pressure(4), temperature(5), mach(6), +// -- viscosityLaminar(7), viscosityTurbulent(8), +// -- vorticity_x(9), vorticity_y(10), vorticity_z(11), vorticityMagnitude(12), +// -- strain_rate(13), Q_criteria(14), Cp(15), timeStep(16), volume(17), +// -- modeledTKE(18), modeleddissipationrate(19), SSTF1(20), SSTF2(21), +// -- 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), +// -- 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), Knudsen number(Kn_wall, 24). +int nVisualVariables = 8; +int visualVariables[] = [0, 1, 2, 3, 4, 5, 6, 15]; + +int nVisualWallVariables = 9; +int visualWallVariables[] = [0, 1, 2, 3, 4, 5, 9, 10, 11]; + +// dumpStandardModel: Dump many standard model data. +// 1 -- Turbulent flat plate. +int dumpStandardModel = 0; + +// ifSetDataMonitor: Whether to set the data monitor. +// 0 -- No. +// 1 -- Yes. +// dataMonitorType: The type of data Monitor. +// 0 -- Probes data monitor. +// 1 -- Lines data monitor. +// 2 -- Surfaces data monitor. +// probesDefineFile: Probes location information file. +// nLines: The number of lines need to be monitored. +// linesDefineFile: Lines location information file. +// nSurfaces: The number of surfaces need to be monitored. +// surfacesDefineFile: Surfaces location information file. +// searchCellsMethod: method to search the cell of each probe. +// 0 -- Nearest cell to the probe. +// 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), +// -- 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. +int ifSetDataMonitor = 0; + +int dataMonitorType = 0; +string probesDefineFile = "bin/probes_XYZ.dat"; + +//int dataMonitorType = 1; +//int nLines = 1; +//string linesDefineFile = "bin/lines_XYZ.dat"; + +//int dataMonitorType = 2; +//int nSurfaces = 4; +//string surfacesDefineFile = "bin/surfaces_XYZ.dat"; + +int searchCellsMethod = 0; + +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 +// 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. +int turbInterval = 1; +int turbOrderStruct = 2; +int kindOfTurbSource = 0; +int mod_turb_res = 0; +double freeStreamViscosity = 1.0e-3; +double muoo = 3.0; +double kwoo = 5.0; +int transitionType = 0; +double turbIntensity = -1.0; +int freeturbIntensitySRModify = 0; +double freeDecayXLocation = 0.0; +int compressibleCorrection = 0; +int transitionMaFix = 1; + +// maximum eddy viscosity (myt/my) max. +double eddyViscosityLimit = 1.0e10; +int monitor_vistmax = 0; + +#************************************************************************ +# LES Parameter * +#************************************************************************ +// iLES: Create LESSolver or 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. +// 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. +// bodyforce: Body force in source flux of NS equations or not. +// utau: friction velocity, using in DNSDisturb. +// sgsmodel: subgrid scale model. +// = "smagorinsky"; +// = "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. +// 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. +// smagConstant: constant of smagorinsky model. +// waleConstant: constant of wale model. +// 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; +int wallDampingFunctionType = 1; +int turbViscousCutType = 2; +double smagConstant = 0.1; +double isotropicConstant = 0.0; +double waleConstant = 0.6; +double sigmaConstant = 1.35; +int filterDirection[] = [1, 1, 0]; +int averageDirection[] = [0, 0, 0]; +double testFilterScale = 2.0; +int averageWidth = 1; +int monitorNegativeConstant = 0; + +#************************************************************************ +# 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, +// nm: Equation number of the physics, but is out of commision now. +// 4 -- for 2D. +// 5 -- for 3D. +// nGasModel: The type of gas. less than and equal to 1 represents the mixture gas. +// Otherwise, the pure gas with one component is used for perfect gas. +// 0 -- Earth gas. +// 1 -- Mars gas. +// 2 -- Argon. +// 3 -- Nitrogen. +// nEnergyRecycle: The type of EnergyModel Recycle. +// 0 -- not used. +// 1 -- used. +// nDensityModify: The type of densitymodify. +// 0 -- not used. +// 1 -- used. +// 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. +// 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). +// nchemsrc: +// 0 -- the source terms are not computed. +// 1 -- the source terms are computed. +// nchemrad: +// 0 -- compute the spectrum radius without considering chemical reaction flow. +// 1 -- compute the spectrum radius that need to count the contribution from chemical reaction flow. +// ntmodel: The thermodynamic temperature model. +// 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. +// 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. +// 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. +// 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). +// 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 -- 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. +// isInjection: +// 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). +// nContinueModel: The new continue model can switch different computation 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. +// 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 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. +// 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. +// 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. +// 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 nEquilibriumGas = 0; +int nPCWCycleStep = 3; +int nRETCycleStep = 3; +int nSLIPCycleStep = 3; +int nIterFirstStep = 1000; +int nIterSecondStep= 2000; +int nIterThirdStep = 2000; +int nEnergyAssembly = 0; +int nControlVariable = 1; +double firstStepError = 0.01; +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; + +int nGasModel = 0; +int nchem = 0; +int nchemsrc = 1; +int nchemrad = 1; +int ntmodel = 1; + +int nIdealState = 0; +int nEnergyRecycle = 1; +int nSlipBCModel = 0; +int nDensityModify = 1; +int nTEnergyModel = 0; +int nMeanFreePathType = 0; +int nIsChemicalFreeze = 0; +int nIsSuperCatalytic = 1; +int nTemperatureJump = 0; +int nSurfGradMethod = 0; +int nRapidFlowfield = 0; +int nSurfHeatMonitor = 0; +int nInitPressureStep = 100; +int nDumpCFLNumber = 0; + +double parkVDPower = 0.6; +double catalyticCoef = 0.0; +double sigmaVelocity = 1.0; +double sigmaTemperature = 1.0; +double sigmaMassFraction = 1.0; +double velocitySlipCorrectConstant = 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 maxViscous = 10000.0; +double trTemperatureMin = 10.0; +double veTemperatureMin = 30.0; +double maxTemperature = 50000.0; +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 nDiagonalModifiedTurb = 0; +int nGradPrimtiveMethod = 1; +int nInviscidFluxModify = 1; +int nQlLimitMethod = 2; +int nSpeciesForWallMethod = 1; +int nDensityForWallMethod = 0; +int wallMultiTemperature = 0; + +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"; + +//string speciesName = "O, O2, NO, N, NO+, N2, e-"; +//string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.0, 0.767, 0.0"; + +//string speciesName = "O, O2, NO, N, O+, O2+, NO+, N+, N2+, N2, e-"; +//string initMassFraction = "0.0, 0.233, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.767, 0.0"; + +//string gasfile = "Mars-Pa8"; +//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 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 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 initMassFraction = "1.0, 0.0"; +int nSutherland = 0; +double gamaSpeciesA = 1.4; +double gamaSpeciesB = 1.3; +double molecularWeightSpeciesA = 29.0; +double molecularWeightSpeciesB = 30.0; + +//string gasfile = "Gas-Mixture"; +//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. +// nMGLevel: The number of level of Multi-Grid. +// <= 1 -- Single-level. +// > 1 -- multi-level. +// MGPreIteration: For each grid, the number of pre-smoothing steps. +// n_post: For each grid, the number of post-smoothing steps. +// MGCoarsestIteration: For the coarest grid the number of smoothing steps. +// MGFasType: V-multi cycle or W-multi cycle. +// 1 -- V-multi cycle. +// 2 -- W-multi cycle. +// flowInitStep: Flow initialization step, 0 - 500 is suggested. +// Multi-Grid : Number of steps computing on coarse grid, during flow initialization. +// Single-Grid: Number of steps computing using first-order with vanleer, during flow initialization. +// mgCFLScale: CFL number enlarge times for coarse grid. +// mprol: Multi-grid interpolation method, interpolation from coarse cell to fine grid. +// 1 -- zero order. +// 2 -- first-order. (default) +// mgCorrectionLimit: Multi-grid correction limit. +int nMGLevel = 1; +int MGCoarsestIteration = 1; +int MGPreIteration = 1; +int MGFasType = 1; +int n_post = 0; +int flowInitStep = 100; +int mprol = 2; +double mgCFLScale = 1.0; +double mgCorrectionLimit = 0.01; + +//--------------- Some parameter for turbulent model -------------------- +// neasm: The variation of kw turbulent model. +// ismooth_turb: Residual smooth for turb or not. +// SSTProductType: The type of product term based on vorticity for SST. +// SAProductType: The type of product term based on vorticity for SA. +int neasm = -3; +int SSTProductType = 0; +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"; + +#************************************************************************ +# High Order Struct Solver * +#************************************************************************ +// isFVMOrFDM: +// 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) +// 0 -- default. +// str_highorder_interpolation_epsilon: Epsilon in weighted interpolation, bigger epsilon, better convergence, +// smaller epsilon, robuster for shock-detecting. +// str_highorder_interpolation_type: +// -- "classical", "test". +// str_highorder_flux_name: +// -- "roe", "steger". +// structhighordergradient: +// -- "conservation", "chain_rule". +int isFVMOrFDM = 0; +string str_highorder_solver = "WCNS"; +int SolverStructOrder = 0; +double str_highorder_interpolation_epsilon = 1.0e-6; +string str_highorder_interpolation_type = "test"; +string str_highorder_flux_name = "steger"; +string structhighordergradient = "conservation"; +double coefofstrflux = 0.5; +double limitcoefofinterface = 0.0; + +// ----------------- Advanced choices ----------------------------------- +// outtimesc: Time stepping scheme for the outer loop. +// MUSCLCoefXk: The parameter of MUSCL interpolations, belongs to [-1, 1]. +// -1 -- seconde-order fully-upwind differencing. +// 0 -- seconde-order upwind-biased differencing. +// 0.333333 -- third-order upwind-biased differencing. +// 1 -- seconde-order central differencing. +// MUSCLCoefXb: The limiter parameter. +// 0 -- the effect of the limiter is cancelled, means the first-order interpolations. +// allReduceStep: Iteration intervals for MPI AllReduce operation, default is 1. +string outtimesc = "impbd2"; +double MUSCLCoefXk = -1; +double MUSCLCoefXb = 1.0; +int allReduceStep = 1; + +// ----------------- overlap configuration ------------------------------ +// codeOfOversetGrid: Overlapping(overset) grid or not. +// 0 -- NON-overlapping grid. +// 1 -- Overlapping grid. +// 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. +// 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; +int aleStartStrategy = -1; + +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. + +// 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 * +#************************************************************************ +int numberOfMovingBodies = 1; + +############################## body0 ############################## +// 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. +// 2 three DOF motion. +// 11 X-axis forced motion. +// 12 Y-axis forced motion. +// 13 Z-axis forced motion. +// 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. +// 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"; +// 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; +//@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 refDimensionalVelocity = 0; +//@double refDimensionalDensity = 0; +//@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]; + +//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; \ No newline at end of file diff --git a/B19_ThreeD_TrapWing_SA_AoA13_256CPU/bin/cfd_para_subsonic.hypara b/B19_ThreeD_TrapWing_SA_AoA13_256CPU/bin/cfd_para_subsonic.hypara new file mode 100644 index 0000000..93bb4c7 --- /dev/null +++ b/B19_ThreeD_TrapWing_SA_AoA13_256CPU/bin/cfd_para_subsonic.hypara @@ -0,0 +1,194 @@ +######################################################################### +# General Control Parameter # +######################################################################### +// 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. +// intervalStepForce: The step intervals for aerodynamics coefficients file 'aircoef.dat' saved. +// intervalStepRes: The step intervals for residual 'res.dat' saved. + +int maxSimuStep = 10000; + +int intervalStepFlow = 1000; +int intervalStepPlot = 1000; +int intervalStepForce = 100; +int intervalStepRes = 10; + +// 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 ifLowSpeedPrecon = 0; + +######################################################################### +# Inflow Parameter # +######################################################################### +// refMachNumber: Mach number. +// attackd: Angle of attack. +// angleSlide: Angle of sideslip. +// inflowParaType: The type of inflow parameters. +// 0 -- the nondimensional conditions. +// 1 -- the flight conditions. +// 2 -- the experiment conditions. +// 3 -- the subsonic boundary conditions. +// 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. +// refDimensionalPressure: Dimensional reference pressure, or the total pressure only for the experiment condition. +// height: Fly height, unit of km. +// 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. +// forceReferenceLength, forceReferenceLengthSpanWise, forceReferenceArea: Reference length, SpanWise length and area, independent of grid unit. +// TorqueRefX, TorqueRefY, TorqueRefZ: Reference point, independent of grid unit. + +double refMachNumber = 0.2; +double attackd = 13; +double angleSlide = 0.00; + +int inflowParaType = 0; +double refReNumber = 4271366; +double refDimensionalTemperature = 288.89; + +//int inflowParaType = 1; +//double height = 0.001; + +double gridScaleFactor = 0.0254; + +double forceReferenceLengthSpanWise = 2.160371; // unit of meter. +double forceReferenceLength = 1.007; // unit of meter. +double forceReferenceArea = 2.046468; // unit of meter^2. +double TorqueRefX = 0.872287; // unit of meter. +double TorqueRefY = 0; // unit of meter. +double TorqueRefZ = 0.02413; // unit of meter. + +######################################################################### +# Physical models # +######################################################################### +// viscousType : Viscous model. +// 0 -- Euler. +// 1 -- Lamilar. +// 3 -- 1eq turbulent. +// 4 -- 2eq turbulent. +// viscousName: Laminar or tubulent model. +// -- "1eq-sa", when viscousType = 3. +// -- "2eq-kw-menter-sst", when viscousType = 4. +// DESType: Type of DES. +// 0 -- RANS.(default) +// 1 -- DES. +// 2 -- DDES. +// 3 -- IDDES. + +//int viscousType = 0; +//string viscousName = "Euler"; + +//int viscousType = 1; +//string viscousName = "laminar"; + +int viscousType = 3; +string viscousName = "1eq-sa"; + +//int viscousType = 4; +//string viscousName = "2eq-kw-menter-sst"; + +int DESType = 0; + +int roeEntropyFixMethod = 3; +double roeEntropyScale = 1.0; +######################################################################### +# Spatial Discretisation # +######################################################################### +#******************************************************************* +# Struct Solver * +#******************************************************************* +// str_limiter_name: Limiter of struct grid. +// -- "3rdsmooth", "smooth". +// -- "nolim", no limiter. + +string str_limiter_name = "smooth"; + +#******************************************************************* +# UnStruct Solver * +#******************************************************************* +// uns_limiter_name: Limiter of Unstruct grid. +// -- "vencat". +// -- "1st", meaning accuracy of first-order. +// -- "nolim", no limiter. +// venkatCoeff: Coefficient of vencat limiter, when uns_limiter_name = 'vencat'. +// The smaller the value, the more robust it is. + +string uns_limiter_name = "vencat"; +double venkatCoeff = 50.0; + +######################################################################### +# Temporal Discretisation # +######################################################################### +// iunsteady: Steady or unsteady. +// 0 -- steady. +// 1 -- unsteay. +// CFLEnd: The CFL number, [0.1, 100]. +// The bigger the value, the convergence faster but lower robustness. +// nLUSGSSweeps: Number of Sub-iteration of LU-SGS. +// 1 -- is recommended for structured solver. +// 1-3 -- is recommended for unstructured solver. + +int iunsteady = 0; + +double CFLEnd = 100.0; + +int nLUSGSSweeps = 5; + +######################################################################### +# Multi-Grid parameters # +######################################################################### +// nMGLevel: The number of Multi-Grid level. +// = 1 -- single-level. +// > 1 -- multi-level. +// flowInitStep: Flow initialization step, 0 - 500 is suggested. +// Multi-Grid : Number of steps computing on coarse grid, during flow initialization. +// Single-Grid: Number of steps computing using first-order with vanleer, during flow initialization. + +int nMGLevel = 1; +int flowInitStep = 100; + +######################################################################### +# File In or Out # +######################################################################### +// gridfile: The partitioned Grid file path, using relative path, +// which is relative to the working directory. +// IMPORTANT WARNING: The file index should be ignored, +// e.g. if the partitioned grid is rae2822_hybrid2d__4_0.fts, +// Please use 'rae2822_hybrid2d__4.fts' here! +// plotFieldType: If dump out the whole field results to tecplot or not, 0 / 1. + +string gridfile = "./grid/trap21_coarse_fixed__256.fts"; +int plotFieldType = 0; +// ----------------- Advanced Parameters, DO NOT care it ---------------- +// nVisualVariables: Number of variables want to be dumped for tecplot visualization. +// visualVariables: Variable types dumped, listed as following: +// -- density(0), u(1), v(2), w(3), pressure(4), temperature(5), mach(6), +// -- viscosityLaminar(7), viscosityTurbulent(8), +// -- vorticity_x(9), vorticity_y(10), vorticity_z(11), vorticityMagnitude(12), +// -- strain_rate(13), Q_criteria(14), Cp(15), timeStep(16), volume(17), +// -- modeledTKE(18), modeleddissipationrate(19), SSTF1(20), SSTF2(21). +// Important Warning: Array size of visualVariables MUST be equal to nVisualVariables!!! +// Variables order must from small to big. + +int nVisualVariables = 8; +int visualVariables[] = [0, 1, 2, 3, 4, 5, 6, 15]; + +// limitVariables: Limit model (It is useful only if limitVector is 0). +// 0 -- limit only for pressure and denstiny, then get the min value. +// 1 -- limit for every variables, then get the min value. +// limitVector: +// 0 -- Each variable use the same limiter coefficient. +// 1 -- Each variable use the respective limiter coefficients. +// reconmeth: +// 0 -- When reconstruct face value, Q+, Q- use respective limiter coefficients. +// 1 -- Q+, Q- use the min limiter coefficients of left and right cell. + +int reconmeth = 1; +int limitVariables = 0; +int limitVector = 0; diff --git a/B19_ThreeD_TrapWing_SA_AoA13_256CPU/bin/grid_para.hypara b/B19_ThreeD_TrapWing_SA_AoA13_256CPU/bin/grid_para.hypara new file mode 100644 index 0000000..382ffc0 --- /dev/null +++ b/B19_ThreeD_TrapWing_SA_AoA13_256CPU/bin/grid_para.hypara @@ -0,0 +1,36 @@ +######################################################################### +# Grid data type # +######################################################################### +// gridtype: Grid type for generation, conversion, reconstruction, merging. +// 0 -- Unstructured grid. +// 1 -- Structured grid. +// 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. +// 2 -- CGNS, *.cgns. +// 3 -- Plot3D type of structured grid, *.dat/*.grd. +// 4 -- Fieldview type of unstructured grid, *.dat/*.inp. +// 5 -- Fluent, *.cas/*.msh. +// 6 -- Ustar, mgrid.in. +// 7 -- Hybrid, include both of unstructured and structured grid, *.fts. +// 8 -- GMSH, *.msh. +// 9 -- Gridgen type of structured grid, *.dat/*.grd. +int gridtype = 0; +int nAxisRotateTimes = 1; +int axisRotateOrder[] = [1]; +double axisRotateAngles[] = [90.0]; +int from_gtype = 2; + +######################################################################### +# File path # +######################################################################### +// 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. +string from_gfile = "./grid/trap21_coarse_fixed.cgns"; +string out_gfile = "./grid/trap21_coarse_fixed.fts"; diff --git a/B19_ThreeD_TrapWing_SA_AoA13_256CPU/bin/key.hypara b/B19_ThreeD_TrapWing_SA_AoA13_256CPU/bin/key.hypara new file mode 100644 index 0000000..1dd9f3c --- /dev/null +++ b/B19_ThreeD_TrapWing_SA_AoA13_256CPU/bin/key.hypara @@ -0,0 +1,55 @@ +string title = "PHengLEI Main Parameter Control File"; + +// IMPORTANT NOTICE: DON NOT MODIFY THE FOWLLOWING LINE. +string defaultParaFile = "./bin/cfd_para.hypara"; + +// ndim: Dimensional of the grid, 2 or 3. +// nparafile: the number of parameter files. +// nsimutask: simulation task type. +// 0 -- CFD Solver of NS or Turbulation. +// 1 -- Grid generation: for special typical cases, such as cylinder, flat plate, etc. +// Grid conversion: from other format to PHengLEI format (.fts). +// Grid reconstruction: such as grid adaptation. +// Grid merging: merge two blocks into one block. +// Grid repairing: repair the original grid in order to remove the negative volume cells. +// 2 -- Wall distance computation for turb-solver. +// 3 -- Grid partition. +int ndim = 3; +int nparafile = 1; + +int nsimutask = 0; +string parafilename = "./bin/cfd_para_subsonic.hypara"; +//string parafilename = "./bin/cfd_para_transonic.hypara"; +//string parafilename = "./bin/cfd_para_supersonic.hypara"; +//string parafilename = "./bin/cfd_para_hypersonic.hypara"; +//string parafilename = "./bin/incompressible.hypara"; + +//int nsimutask = 1; +//string parafilename = "./bin/grid_para.hypara"; + +//int nsimutask = 2; +//string parafilename = "./bin/cfd_para.hypara"; + +//int nsimutask = 3; +//string parafilename = "./bin/partition.hypara"; + +//int nsimutask = 1; +//string parafilename = "./bin/grid_deform_para.hypara"; + +//int nsimutask = 5; +//string parafilename = "./bin/overset_grid_view.hypara"; + +//int nsimutask = 13; +//string parafilename = "./bin/lbm_para.hypara"; + +//int nsimutask = 14; +//string parafilename = "./bin/integrative_solver.hypara"; + +//int nsimutask = 99; +//string parafilename = "./bin/post_processing.hypara"; + +// ---------------- Advanced Parameters, DO NOT care it ---------------- +int numberOfGridProcessor = 0; +// ATP read +//@string parafilename1 = "" +//@string parafilename2 = ""; diff --git a/B19_ThreeD_TrapWing_SA_AoA13_256CPU/bin/partition.hypara b/B19_ThreeD_TrapWing_SA_AoA13_256CPU/bin/partition.hypara new file mode 100644 index 0000000..eaf08fb --- /dev/null +++ b/B19_ThreeD_TrapWing_SA_AoA13_256CPU/bin/partition.hypara @@ -0,0 +1,21 @@ +// pgridtype: The grid type. +// 0 -- unstruct grid. +// 1 -- struct grid. +// maxproc: The number of partition zones that want to be divided into, +// which is equal to the number of CPU processors you want. +// Usually, 50~100 thousands structured cells per CPU-Core is suggested. +// 30~70 thousands unstructured cells per CPU-Core is suggested. +// original_grid_file: Original grid file that want to be divided(PHengLEI type, *.fts). +// partition_grid_file: Target partition grid file(PHengLEI type, *.fts). + +int pgridtype = 0; +int maxproc = 256; + +string original_grid_file = "./grid/trap21_coarse_fixed.fts"; +string partition_grid_file = "./grid/trap21_coarse_fixed__256.fts"; + +// numberOfMultigrid: Number of multi-grid levels, ONLY used for structured grid. +// 1 -- single level. +// 2 -- 2 level. +// N -- N level,..., et al. +int numberOfMultigrid = 1; diff --git a/B19_ThreeD_TrapWing_SA_AoA13_256CPU/grid/网格地址.txt b/B19_ThreeD_TrapWing_SA_AoA13_256CPU/grid/网格地址.txt new file mode 100644 index 0000000..899f977 --- /dev/null +++ b/B19_ThreeD_TrapWing_SA_AoA13_256CPU/grid/网格地址.txt @@ -0,0 +1,5 @@ +红山开源风雷算例库原始网格获取百度网盘链接: +链接:http://pan.baidu.com/s/1aZ9cdkp6CkT9il4fEpnTcA +提取码:w47m + +注:plot3D格式网格需同时下载.grd和.inp文件 \ No newline at end of file