喷嘴计算程序更新,完成粘度计算,加水露点和水含量换算未完成
This commit is contained in:
parent
7965caba67
commit
2658dde637
@ -1 +1 @@
|
||||
Subproject commit 26446e5304424bcfe69036a30867cc428e5a929c
|
||||
Subproject commit ab0a15c456bcaeff87f46d56d390162de82d7e6f
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,146 @@
|
||||
package com.ruoyi.ngCalTools.controller;
|
||||
import com.ruoyi.ngCalTools.model.GasProps;
|
||||
import com.ruoyi.system.controller.UnitConvert;
|
||||
import com.ruoyi.system.service.ISysUnitConvertService;
|
||||
import com.ruoyi.system.service.impl.SysUnitConvertServiceImpl;
|
||||
import org.apache.commons.math3.analysis.UnivariateFunction;
|
||||
import org.apache.commons.math3.analysis.solvers.BracketingNthOrderBrentSolver;
|
||||
import org.apache.commons.math3.analysis.solvers.NewtonRaphsonSolver;
|
||||
import org.apache.commons.math3.exception.TooManyEvaluationsException;
|
||||
|
||||
/**
|
||||
* GB/T 22634-2008 天然气水含量与水露点工业级换算
|
||||
* 注:需配合气体性质计算模块GasController使用
|
||||
*/
|
||||
|
||||
public class GBT22634WaterContentCalc {
|
||||
|
||||
|
||||
|
||||
// 安托因方程常数(GB/T 22634规定)
|
||||
private static final double ANTOINE_A = 8.07131;
|
||||
private static final double ANTOINE_B = 1730.63;
|
||||
private static final double ANTOINE_C = 233.426;
|
||||
private static final double MMHG_TO_KPA = 0.1333223684;
|
||||
|
||||
/**
|
||||
* 工业级水含量计算(含真实气体修正)
|
||||
* @param dewPointTemp 水露点温度(℃)
|
||||
* @param pressure 绝对压力(kPa)
|
||||
* @param gasProps 气体组分属性
|
||||
* @return 水含量(mg/Sm³)
|
||||
*/
|
||||
public double calculateWaterContent(double dewPointTemp,
|
||||
double pressure,
|
||||
GasProps gasProps) {
|
||||
// 1. 计算饱和水蒸气压
|
||||
double pWater = calculateWaterVaporPressure(dewPointTemp);
|
||||
// 2. 获取压缩因子
|
||||
GasController.Crit(gasProps,0); // 调用实际压缩因子计算模块
|
||||
// 3. 计算真实摩尔体积
|
||||
double molarVolume = calculateMolarVolume(dewPointTemp, pressure, gasProps.getdZf());
|
||||
// 4. 计算水含量
|
||||
return (pWater / (pressure - pWater)) * (18.01528 * 1e6) / molarVolume;
|
||||
}
|
||||
|
||||
/**
|
||||
* 逆向计算水露点温度(工业级精度)
|
||||
* @param waterContent 水含量(mg/Sm³)
|
||||
* @param pressure 绝对压力(kPa)
|
||||
* @param gasProps 气体组分属性
|
||||
* @return 水露点温度(℃),精度±0.01℃
|
||||
*/
|
||||
public double calculateDewPoint(final double waterContent,
|
||||
final double pressure,
|
||||
final GasProps gasProps) {
|
||||
// NewtonRaphsonSolver solver = new NewtonRaphsonSolver(1e-4);
|
||||
|
||||
// 使用5阶布伦特法求解器(无需导数)
|
||||
BracketingNthOrderBrentSolver solver = new BracketingNthOrderBrentSolver(
|
||||
1e-4, // 相对精度
|
||||
1e-6, // 绝对精度
|
||||
1e-10, // 函数值精度
|
||||
5 // 多项式阶数
|
||||
);
|
||||
|
||||
UnivariateFunction function = new UnivariateFunction() {
|
||||
@Override
|
||||
public double value(double tempC) {
|
||||
try {
|
||||
// 创建临时气体属性副本
|
||||
GasProps tempProps = gasProps.clone();
|
||||
tempProps.setdTf(tempC + 273.15); // 更新温度
|
||||
tempProps.setdPf(pressure);
|
||||
|
||||
double calc = calculateWaterContent(tempC, pressure, tempProps);
|
||||
return calc - waterContent;
|
||||
} catch (Exception e) {
|
||||
return Double.NaN;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
try {
|
||||
return solver.solve(100, function, -50.0, 100.0, 20.0); // 初始猜测20℃
|
||||
} catch (TooManyEvaluationsException e) {
|
||||
throw new ArithmeticException("露点计算未收敛,请检查输入参数");
|
||||
}
|
||||
}
|
||||
|
||||
// 饱和水蒸气压计算(GB/T 22634规定方法)
|
||||
private double calculateWaterVaporPressure(double tempC) {
|
||||
if(tempC < 0 || tempC > 100) {
|
||||
throw new IllegalArgumentException("温度超出GB/T 22634适用范围");
|
||||
}
|
||||
return Math.pow(10, ANTOINE_A - ANTOINE_B / (tempC + ANTOINE_C)) * MMHG_TO_KPA;
|
||||
}
|
||||
|
||||
// 真实气体摩尔体积计算
|
||||
private static double calculateMolarVolume(double tempC, double pressure, double Z) {
|
||||
return Z * 8.3144621 * (tempC + 273.15) / pressure;
|
||||
}
|
||||
|
||||
// // 气体属性类(示例结构)
|
||||
// public static class GasProps implements Cloneable {
|
||||
// private double temperature; // K
|
||||
// private double pressure; // kPa
|
||||
// private double[] composition; // 组分摩尔分数
|
||||
//
|
||||
// // 克隆方法用于迭代计算
|
||||
// @Override
|
||||
// public GasProps clone() {
|
||||
// GasProps clone = new GasProps();
|
||||
// clone.temperature = this.temperature;
|
||||
// clone.pressure = this.pressure;
|
||||
// clone.composition = this.composition.clone();
|
||||
// return clone;
|
||||
// }
|
||||
//
|
||||
// // Getter/Setter
|
||||
// public double getTemperature() { return temperature; }
|
||||
// public void setTemperature(double temperature) { this.temperature = temperature; }
|
||||
// public double getPressure() { return pressure; }
|
||||
// public void setPressure(double pressure) { this.pressure = pressure; }
|
||||
// public double[] getComposition() { return composition; }
|
||||
// public void setComposition(double[] composition) { this.composition = composition; }
|
||||
// }
|
||||
//
|
||||
// // 示例调用
|
||||
// public static void main(String[] args) {
|
||||
// // 初始化气体属性
|
||||
// GasProps gas = new GasProps();
|
||||
// gas.setPressure(5000.0); // 5 MPa
|
||||
// gas.setTemperature(293.15); // 20℃
|
||||
// gas.setComposition(new double[]{0.95, 0.03, 0.02}); // 示例组分
|
||||
//
|
||||
// // 正向计算
|
||||
// double wc = calculateWaterContent(10.0, 5000.0, gas);
|
||||
// System.out.printf("5MPa下10℃露点对应水含量:%.2f mg/Sm³\n", wc);
|
||||
//
|
||||
// // 逆向计算
|
||||
// double dewPoint = calculateDewPoint(1000.0, 5000.0, gas);
|
||||
// System.out.printf("5MPa下1000mg/Sm³对应露点:%.2f℃\n", dewPoint);
|
||||
// }
|
||||
|
||||
|
||||
}
|
@ -3,31 +3,33 @@ package com.ruoyi.ngCalTools.controller;
|
||||
// GasController.java
|
||||
|
||||
import com.ruoyi.common.core.domain.AjaxResult;
|
||||
import com.ruoyi.ngCalTools.model.GasProps;
|
||||
import com.ruoyi.ngCalTools.model.FlowProps;
|
||||
import com.ruoyi.ngCalTools.model.GasProps;
|
||||
import com.ruoyi.ngCalTools.service.DetailService;
|
||||
import com.ruoyi.ngCalTools.service.GBT11062Service;
|
||||
import com.ruoyi.ngCalTools.service.ThermService;
|
||||
import com.ruoyi.ngCalTools.utils.GasConstants;
|
||||
import com.ruoyi.system.controller.SysUnitConvertController;
|
||||
import com.ruoyi.system.controller.UnitConvert;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/NGCalcTools")
|
||||
public class GasController {
|
||||
|
||||
|
||||
private final UnitConvert unitConvert;
|
||||
public ThermService thermService;
|
||||
public DetailService detailService;
|
||||
public GBT11062Service gbt11062Service;
|
||||
public static ThermService thermService;
|
||||
public static DetailService detailService;
|
||||
public static GBT11062Service gbt11062Service;
|
||||
|
||||
@Autowired
|
||||
private UnitConvert unitConvert=new UnitConvert();
|
||||
|
||||
public GasController(UnitConvert unitConvert) {
|
||||
this.unitConvert = unitConvert;
|
||||
}
|
||||
@PostMapping ("/ngCalc")
|
||||
public AjaxResult ngCalc(@RequestBody FlowProps flowProps) {
|
||||
public AjaxResult ngCalc(@RequestBody FlowProps flowProps) {
|
||||
thermService = new ThermService();
|
||||
detailService = new DetailService();
|
||||
gbt11062Service = new GBT11062Service();
|
||||
@ -46,6 +48,31 @@ public class GasController {
|
||||
}
|
||||
gasProps.dTf = tempTf;
|
||||
gasProps.dCbtj = flowProps.getdCbtj();
|
||||
|
||||
switch (gasProps.dCbtj)
|
||||
{
|
||||
case 2:
|
||||
gasProps.setdPb(101325);
|
||||
gasProps.setdTb( 273.15);
|
||||
flowProps.setdPb_M(101325);
|
||||
flowProps.setdTb_M(273.15);
|
||||
break;
|
||||
case 1:
|
||||
|
||||
gasProps.setdPb(101325);
|
||||
gasProps.setdTb( 288.15);
|
||||
flowProps.setdPb_M(101325);
|
||||
flowProps.setdTb_M(288.15);
|
||||
break;
|
||||
case 0:
|
||||
|
||||
gasProps.setdPb(101325);
|
||||
gasProps.setdTb( 293.15);
|
||||
flowProps.setdPb_M(101325);
|
||||
flowProps.setdTb_M(293.15);
|
||||
break;
|
||||
}
|
||||
|
||||
String[] stringArray = flowProps.getdngComponents().split("_");
|
||||
double[] doubleArray = new double[stringArray.length]; // 遍历字符串数组,将每个元素转换为 double 类型
|
||||
for (int i = 0; i < stringArray.length; i++) {
|
||||
@ -58,21 +85,19 @@ public class GasController {
|
||||
}
|
||||
gasProps.adMixture = doubleArray;
|
||||
Crit(gasProps, 0); //计算临界流函数所有参数都计算了
|
||||
return AjaxResult.success(gasProps);
|
||||
return AjaxResult.success(gasProps);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void ngCalcVoid( FlowProps flowProps,GasProps gasProps) {
|
||||
public static void ngCalcVoid(FlowProps flowProps, GasProps gasProps) {
|
||||
thermService = new ThermService();
|
||||
detailService = new DetailService();
|
||||
gbt11062Service = new GBT11062Service();
|
||||
|
||||
Crit(gasProps, 0); //计算临界流函数所有参数都计算了
|
||||
|
||||
Crit(gasProps, 0); //计算临界流函数所有参数都计算了
|
||||
}
|
||||
|
||||
public int NG_Cal_Init() {
|
||||
public static int NG_Cal_Init() {
|
||||
//create object for calculating density
|
||||
if (null == (detailService=new DetailService())) {
|
||||
return GasConstants.MEMORY_ALLOCATION_ERROR;
|
||||
@ -86,7 +111,7 @@ public class GasController {
|
||||
return GasConstants.NG_Cal_INITIALIZED;
|
||||
|
||||
}// NG_Cal_Init
|
||||
public int NG_Cal_UnInit() {
|
||||
public static int NG_Cal_UnInit() {
|
||||
// delete the objects (if they exist)
|
||||
detailService = null;
|
||||
thermService = null;
|
||||
@ -94,7 +119,7 @@ public class GasController {
|
||||
|
||||
}
|
||||
|
||||
public double Crit(GasProps gasProps, double dPlenumVelocity)
|
||||
public static double Crit(GasProps gasProps, double dPlenumVelocity)
|
||||
{
|
||||
//variables local to function
|
||||
double DH, DDH, S, H;
|
||||
@ -115,23 +140,7 @@ public class GasController {
|
||||
|
||||
}
|
||||
}
|
||||
switch (gasProps.dCbtj)
|
||||
{
|
||||
case 2:
|
||||
gasProps.dPb = 101325;
|
||||
gasProps.dTb = 273.15;
|
||||
break;
|
||||
case 1:
|
||||
gasProps.dPb = 101325;
|
||||
gasProps.dTb = 288.15;
|
||||
break;
|
||||
case 0:
|
||||
gasProps.dPb = 101325;
|
||||
gasProps.dTb = 293.15;
|
||||
break;
|
||||
|
||||
|
||||
}
|
||||
//begin by calculating densities and thermodynamic properties
|
||||
thermService.Run(gasProps, detailService);
|
||||
|
||||
|
@ -0,0 +1,133 @@
|
||||
package com.ruoyi.ngCalTools.controller;
|
||||
import com.ruoyi.ngCalTools.model.FlowProps;
|
||||
import com.ruoyi.ngCalTools.model.GasProps;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
|
||||
public class NozellFlowCalc {
|
||||
|
||||
|
||||
// 喷嘴类型枚举
|
||||
public enum NozzleType {
|
||||
TOROIDAL, CYLINDRICAL
|
||||
}
|
||||
|
||||
// 计算流出系数
|
||||
public static double calculateDischargeCoefficient(NozzleType nozzleType, double reynoldsNumber) {
|
||||
double a, b, c, d, e, f, n;
|
||||
switch (nozzleType) {
|
||||
case TOROIDAL:
|
||||
a = 0.9990;
|
||||
b = 3.415;
|
||||
c = 0.0031;
|
||||
d = 0.690;
|
||||
e = 10;
|
||||
f = 120000;
|
||||
n = 0.5;
|
||||
break;
|
||||
case CYLINDRICAL:
|
||||
a = 1.0000;
|
||||
b = 6.341;
|
||||
c = 0.008; // 假设天然气,按用户场景取c值
|
||||
d = 3.000;
|
||||
e = 6;
|
||||
f = 170000;
|
||||
n = 0.5;
|
||||
break;
|
||||
default:
|
||||
throw new IllegalArgumentException("不支持的喷嘴类型");
|
||||
}
|
||||
|
||||
double numerator = c - d * Math.pow(reynoldsNumber, -n);
|
||||
double denominator = 1 + Math.exp(e - reynoldsNumber / f);
|
||||
return (a - b * Math.pow(reynoldsNumber, -n)) - numerator / denominator;
|
||||
}
|
||||
|
||||
// 计算雷诺数
|
||||
public static double calculateReynoldsNumber(double pipeDiameter, double velocity, double dynamicViscosity, double density) {
|
||||
return (pipeDiameter * velocity * density) / dynamicViscosity;
|
||||
}
|
||||
|
||||
// 迭代计算流出系数和雷诺数
|
||||
public static void iterativeCalculation(FlowProps flowProps, GasProps gasProps, NozzleType nozzleType) {
|
||||
double tolerance = 1e-6;
|
||||
int maxIterations = 100;
|
||||
double prevCd = 0;
|
||||
double prevRe = 0;
|
||||
|
||||
for (int i = 0; i < maxIterations; i++) {
|
||||
double velocity = calculateVelocity(flowProps, gasProps);
|
||||
double reynoldsNumber = calculateReynoldsNumber(
|
||||
flowProps.getdPipeD(),
|
||||
velocity,
|
||||
gasProps.getdMu(),
|
||||
gasProps.dRhof
|
||||
);
|
||||
double cd = calculateDischargeCoefficient(nozzleType, reynoldsNumber);
|
||||
|
||||
// 检查收敛
|
||||
if (Math.abs(cd - prevCd) < tolerance && Math.abs(reynoldsNumber - prevRe) < tolerance) {
|
||||
flowProps.setdCdCorrect(cd);
|
||||
flowProps.setdRnPipe(reynoldsNumber);
|
||||
return;
|
||||
}
|
||||
|
||||
prevCd = cd;
|
||||
prevRe = reynoldsNumber;
|
||||
}
|
||||
throw new RuntimeException("迭代未收敛");
|
||||
}
|
||||
|
||||
// 计算流速
|
||||
private static double calculateVelocity(FlowProps flowProps, GasProps gasProps) {
|
||||
// 假设工况体积流量计算逻辑,需根据实际流量公式补充
|
||||
// 这里简化示例,实际需根据ISO公式结合临界流函数等计算
|
||||
return flowProps.getdVFlowf() / (Math.PI * Math.pow(flowProps.getdPipeD() / 2, 2));
|
||||
}
|
||||
|
||||
// 计算质量流量(示例)
|
||||
public static double calculateMassFlow(FlowProps flowProps, GasProps gasProps, NozzleType nozzleType) {
|
||||
iterativeCalculation(flowProps, gasProps, nozzleType);
|
||||
double criticalFlowFactor = gasProps.dCstar;
|
||||
double area = Math.PI * Math.pow(flowProps.getdOrificeD() / 2, 2);
|
||||
double pressure = flowProps.getdPf();
|
||||
double temperature = flowProps.getdTf();
|
||||
double gasConstant = calculateGasConstant(gasProps);
|
||||
|
||||
// 根据ISO公式计算理论质量流量,再结合流出系数
|
||||
double theoreticalMassFlow = area * criticalFlowFactor * pressure / Math.sqrt((gasConstant / gasProps.dMrx) * temperature);
|
||||
return flowProps.getdCdCorrect() * theoreticalMassFlow;
|
||||
}
|
||||
|
||||
// 计算气体常数(示例)
|
||||
private static double calculateGasConstant(GasProps gasProps) {
|
||||
return 8.314 / gasProps.dMrx; // 通用气体常数处理,需根据实际精确计算
|
||||
}
|
||||
|
||||
// 高精度计算辅助方法
|
||||
private static double highPrecisionCalculate(double value, int scale) {
|
||||
return new BigDecimal(value).setScale(scale, RoundingMode.HALF_UP).doubleValue();
|
||||
}
|
||||
//
|
||||
// public static void main(String[] args) {
|
||||
// FlowProps flowProps = new FlowProps();
|
||||
// GasProps gasProps = new GasProps();
|
||||
// NozzleType nozzleType = NozzleType.CYLINDRICAL;
|
||||
//
|
||||
// // 初始化输入参数
|
||||
// flowProps.dPipeD = 0.1; // 示例管道直径
|
||||
// flowProps.dOrificeD = 0.05; // 示例喉径
|
||||
// gasProps.dMu = 0.00001; // 示例动力粘度
|
||||
// gasProps.dRhof = 1.0; // 示例工况密度
|
||||
// gasProps.dCstar = 0.9; // 示例临界流函数
|
||||
//
|
||||
// // 执行计算
|
||||
// double massFlow = calculateMassFlow(flowProps, gasProps, nozzleType);
|
||||
// System.out.println("计算的质量流量: " + massFlow);
|
||||
// }
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,131 @@
|
||||
package com.ruoyi.ngCalTools.controller;
|
||||
|
||||
import com.ruoyi.ngCalTools.model.FlowProps;
|
||||
import com.ruoyi.ngCalTools.model.GasProps;
|
||||
import com.ruoyi.ngCalTools.service.DetailService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
@RestController
|
||||
|
||||
public class NozellFlowCalcISO9300 {
|
||||
|
||||
@Autowired
|
||||
private GasController gasController = new GasController();
|
||||
|
||||
|
||||
// 计算流出系数Cd、雷诺数Re及流量(示例中仅展示关键步骤)
|
||||
public void calculateFlowCoefficient(FlowProps flowProps, GasProps gasProps) {
|
||||
|
||||
// 获取基本参数
|
||||
double dOrifice = flowProps.getdOrificeD();
|
||||
double dPipe = flowProps.getdPipeD();
|
||||
double PStatic = flowProps.getdPf();
|
||||
double TStatic = flowProps.getdTf();
|
||||
// 气体属性
|
||||
double R = DetailService.RGASKJ;
|
||||
double kappa = gasProps.getdKappa();
|
||||
double rhoRef = gasProps.getdRhob();
|
||||
double Cstar = gasProps.getdCstar();
|
||||
|
||||
// 计算几何参数
|
||||
double AOrifice = Math.PI * Math.pow(dOrifice, 2) / 4;
|
||||
double APipe = Math.PI * Math.pow(dPipe / 2, 2);
|
||||
|
||||
|
||||
// 初始参数
|
||||
double Cd = 0.99; // 初始猜测值
|
||||
double rho = gasProps.getdRhof(); // 基于静态条件的初始密度
|
||||
double mu = gasProps.getdMu(); // 初始粘度
|
||||
double Re;
|
||||
|
||||
// 迭代控制
|
||||
double tolerance = 1e-6;
|
||||
int maxIterations = 100;
|
||||
boolean converged = false;
|
||||
|
||||
for (int i = 0; i < maxIterations; i++) {
|
||||
// 计算质量流量
|
||||
double qm = Cd * AOrifice * Cstar * Math.sqrt(gasProps.getdZf() * rho * gasProps.getdPf());
|
||||
|
||||
// 计算流速
|
||||
double velocity = qm / (rho * APipe);
|
||||
|
||||
// 计算滞止参数
|
||||
double[] stagnation = calculateStagnationProperties(
|
||||
PStatic, TStatic, velocity, kappa, R);
|
||||
double P0 = stagnation[0];
|
||||
double T0 = stagnation[1];
|
||||
|
||||
// 更新物性参数
|
||||
gasProps.setdPf(P0);
|
||||
gasProps.setdTf(T0);
|
||||
gasController.ngCalc(flowProps);
|
||||
double newRho =gasProps.getdRhof();
|
||||
double newMu = gasProps.getdMu();
|
||||
|
||||
// 计算雷诺数
|
||||
Re = (4 * qm) / (Math.PI * dOrifice * newMu);
|
||||
|
||||
// 获取喷嘴系数
|
||||
double[] coeffs = getNozzleCoefficients(flowProps.getdNozzleType());
|
||||
double a = coeffs[0], b = coeffs[1], c = coeffs[2],
|
||||
d = coeffs[3], e = coeffs[4], f = coeffs[5], n = coeffs[6];
|
||||
|
||||
// 计算新的Cd
|
||||
double term1 = a - b * Math.pow(Re, -n);
|
||||
double term2 = (c - d * Math.pow(Re, -n)) / (1 + Math.exp(e - Re / f));
|
||||
double newCd = term1 - term2;
|
||||
|
||||
// 检查收敛
|
||||
if (Math.abs(newCd - Cd) < tolerance &&
|
||||
Math.abs(newRho - rho) < tolerance &&
|
||||
Math.abs(newMu - mu) < tolerance) {
|
||||
converged = true;
|
||||
Cd = newCd;
|
||||
rho = newRho;
|
||||
mu = newMu;
|
||||
break;
|
||||
}
|
||||
|
||||
// 更新参数
|
||||
Cd = newCd;
|
||||
rho = newRho;
|
||||
mu = newMu;
|
||||
}
|
||||
|
||||
if (!converged) throw new RuntimeException("迭代未收敛");
|
||||
|
||||
// 计算标况体积流量
|
||||
double qm = Cd * AOrifice * Cstar * Math.sqrt(gasProps.getdZf() * rho * gasProps.getdPf());
|
||||
|
||||
// 保存结果
|
||||
flowProps.setdCd(Cd);
|
||||
flowProps.setdRnPipe(rho);
|
||||
flowProps.setdMFlowb(qm);
|
||||
flowProps.setdVFlowb(qm/gasProps.getdRhob());
|
||||
}
|
||||
|
||||
private static double[] getNozzleCoefficients(int coreType) {
|
||||
// 返回喷嘴系数数组 [a, b, c, d, e, f, n]
|
||||
if (coreType == 0) { // 圆环形
|
||||
return new double[]{0.9990, 3.415, 0.0031, 0.690, 10, 120000, 0.5};
|
||||
} else { // 圆柱形
|
||||
return new double[]{1.0000, 6.341, 0.008, 3.000, 6, 170000, 0.5};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static double[] calculateStagnationProperties(
|
||||
double staticP, double staticT, double velocity,
|
||||
double kappa, double R) {
|
||||
|
||||
double soundSpeed = Math.sqrt(kappa * R * staticT);
|
||||
double mach = velocity / soundSpeed;
|
||||
double T0 = staticT * (1 + 0.5 * (kappa - 1) * mach * mach);
|
||||
double P0 = staticP * Math.pow(T0 / staticT, kappa / (kappa - 1));
|
||||
return new double[]{P0, T0};
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -4,6 +4,100 @@ public class FlowProps {
|
||||
// 流量计算输入参数信息
|
||||
private int dFlowCalbz; // 流量计算标准
|
||||
|
||||
|
||||
private int dZcalbz; // 压缩因子计算标准
|
||||
private int dCbtj; // 计量参比条件压力
|
||||
private double dPb_M; // 计量参比条件压力
|
||||
private double dTb_M; // 计量参比条件温度
|
||||
private double dPb_E; // 燃烧参比条件压力
|
||||
private double dTb_E; // 燃烧参比条件温度
|
||||
private double dPatm; // 当地大气压
|
||||
private int dPatmUnit; // 当地大气压单位
|
||||
private String dngComponents; // 天然气组分
|
||||
|
||||
private int dMeterType; // 流量计类别
|
||||
private int dCoreType; // 节流装置类型
|
||||
private int dPtmode; // 取压方式
|
||||
private int dPipeType; // 管道类型
|
||||
private double dPipeD; // 管道内径
|
||||
private int dLenUnit; // 长度单位
|
||||
private double dPipeDtemp; // 管道内径参考温度
|
||||
private int dPileDtempUint; // 温度单位
|
||||
private double dPipeMaterial; // 管道材料
|
||||
|
||||
private double dOrificeD; // 孔板孔径
|
||||
private int dOrificeUnit; // 长度单位
|
||||
private double dOrificeDtemp; // 孔板内径参考温度
|
||||
private int dOrificeDtempUnit; // 温度单位
|
||||
private double dOrificeMaterial; // 孔板材料
|
||||
private int dOrificeSharpness; // 锐利度系数计算方法
|
||||
private double dOrificeRk; // 孔板入口圆弧半径
|
||||
private int dOrificeRkLenUint; // 长度单位
|
||||
private double dPf; // 输入压力
|
||||
private int dPfUnit; // 压力单位
|
||||
private int dPfType; // 压力类型
|
||||
private double dTf; // 输入温度
|
||||
private int dTfUnit; // 温度单位
|
||||
private double dDp; // 输入差压
|
||||
private int dDpUnit; // 压力单位
|
||||
private int dVFlowUnit; // 体积流量单位
|
||||
private int dMFlowUnit; // 质量流量单位
|
||||
private int dEFlowUnit; // 能量流量单位
|
||||
private double dCd; // 流出系数
|
||||
private double dMeterFactor; // 仪表系数
|
||||
private double dPulseNum; // 脉冲数
|
||||
private double dVFlowMax; // 最大体积流量
|
||||
private double dVFlowMin; // 最小体积流量
|
||||
private double dVFlowCon; // 常用流量
|
||||
private double dPfRange; // 压力量程
|
||||
private double dDpRange; // 差压量程
|
||||
private double dTfRange; // 温度计量程
|
||||
|
||||
// 流量计算输出参数
|
||||
private double dE; // 求渐近速度系数 E
|
||||
private double dFG; // 求相对密度系数 FG
|
||||
private double dFT; // 求流动温度系数 FT
|
||||
|
||||
|
||||
|
||||
private double dFpv; // 求超压缩因子 Fpv
|
||||
|
||||
private double dDViscosity; // 求动力粘度 dlnd
|
||||
private double dDExpCoefficient; // 求可膨胀系数
|
||||
private double dRnPipe; // 管道雷诺数
|
||||
private double dBk; // 孔板锐利度系数Bk
|
||||
private double dRoughNessPipe; // 管道粗糙度系数 Gme
|
||||
private double dCdCorrect; // 修正后的流出系数
|
||||
private double dCdNozell; // 喷嘴的流出系数
|
||||
private double dVFlowb; // 标况体积流量 m³、s
|
||||
private double dVFlowf; // 工况体积流量
|
||||
private double dMFlowb; // 标况质量流量
|
||||
private double dEFlowb; // 标况能量流量
|
||||
private double dVelocityFlow; // 管道内天然气流速
|
||||
private double dPressLost; // 压力损失
|
||||
private double dBeta; // 直径比
|
||||
private double dKappa; // 等熵指数
|
||||
|
||||
private int dNozzleType; // 0圆环形喷嘴 2 圆柱形喉部文丘里喷嘴
|
||||
private double dUpstreamRadius ;//
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public double getdUpstreamRadius() {
|
||||
return dUpstreamRadius;
|
||||
}
|
||||
|
||||
public void setdUpstreamRadius(double dUpstreamRadius) {
|
||||
this.dUpstreamRadius = dUpstreamRadius;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public int getdZcalbz() {
|
||||
return dZcalbz;
|
||||
}
|
||||
@ -516,59 +610,6 @@ public class FlowProps {
|
||||
this.dKappa = dKappa;
|
||||
}
|
||||
|
||||
private int dZcalbz; // 压缩因子计算标准
|
||||
private int dCbtj; // 计量参比条件压力
|
||||
private double dPb_M; // 计量参比条件压力
|
||||
private double dTb_M; // 计量参比条件温度
|
||||
private double dPb_E; // 燃烧参比条件压力
|
||||
private double dTb_E; // 燃烧参比条件温度
|
||||
private double dPatm; // 当地大气压
|
||||
private int dPatmUnit; // 当地大气压单位
|
||||
private String dngComponents; // 天然气组分
|
||||
|
||||
private int dMeterType; // 流量计类别
|
||||
private int dCoreType; // 节流装置类型
|
||||
private int dPtmode; // 取压方式
|
||||
private int dPipeType; // 管道类型
|
||||
private double dPipeD; // 管道内径
|
||||
private int dLenUnit; // 长度单位
|
||||
private double dPipeDtemp; // 管道内径参考温度
|
||||
private int dPileDtempUint; // 温度单位
|
||||
private double dPipeMaterial; // 管道材料
|
||||
|
||||
private double dOrificeD; // 孔板孔径
|
||||
private int dOrificeUnit; // 长度单位
|
||||
private double dOrificeDtemp; // 孔板内径参考温度
|
||||
private int dOrificeDtempUnit; // 温度单位
|
||||
private double dOrificeMaterial; // 孔板材料
|
||||
private int dOrificeSharpness; // 锐利度系数计算方法
|
||||
private double dOrificeRk; // 孔板入口圆弧半径
|
||||
private int dOrificeRkLenUint; // 长度单位
|
||||
private double dPf; // 输入压力
|
||||
private int dPfUnit; // 压力单位
|
||||
private int dPfType; // 压力类型
|
||||
private double dTf; // 输入温度
|
||||
private int dTfUnit; // 温度单位
|
||||
private double dDp; // 输入差压
|
||||
private int dDpUnit; // 压力单位
|
||||
private int dVFlowUnit; // 体积流量单位
|
||||
private int dMFlowUnit; // 质量流量单位
|
||||
private int dEFlowUnit; // 能量流量单位
|
||||
private double dCd; // 流出系数
|
||||
private double dMeterFactor; // 仪表系数
|
||||
private double dPulseNum; // 脉冲数
|
||||
private double dVFlowMax; // 最大体积流量
|
||||
private double dVFlowMin; // 最小体积流量
|
||||
private double dVFlowCon; // 常用流量
|
||||
private double dPfRange; // 压力量程
|
||||
private double dDpRange; // 差压量程
|
||||
private double dTfRange; // 温度计量程
|
||||
|
||||
// 流量计算输出参数
|
||||
private double dE; // 求渐近速度系数 E
|
||||
private double dFG; // 求相对密度系数 FG
|
||||
private double dFT; // 求流动温度系数 FT
|
||||
|
||||
public double getdFpv() {
|
||||
return dFpv;
|
||||
}
|
||||
@ -577,26 +618,14 @@ public class FlowProps {
|
||||
this.dFpv = dFpv;
|
||||
}
|
||||
|
||||
private double dFpv; // 求超压缩因子 Fpv
|
||||
|
||||
private double dDViscosity; // 求动力粘度 dlnd
|
||||
private double dDExpCoefficient; // 求可膨胀系数
|
||||
private double dRnPipe; // 管道雷诺数
|
||||
private double dBk; // 孔板锐利度系数Bk
|
||||
private double dRoughNessPipe; // 管道粗糙度系数 Gme
|
||||
private double dCdCorrect; // 修正后的流出系数
|
||||
private double dCdNozell; // 喷嘴的流出系数
|
||||
private double dVFlowb; // 标况体积流量 m³、s
|
||||
private double dVFlowf; // 工况体积流量
|
||||
private double dMFlowb; // 标况质量流量
|
||||
private double dEFlowb; // 标况能量流量
|
||||
private double dVelocityFlow; // 管道内天然气流速
|
||||
private double dPressLost; // 压力损失
|
||||
private double dBeta; // 直径比
|
||||
private double dKappa; // 等熵指数
|
||||
public int getdNozzleType() {
|
||||
return dNozzleType;
|
||||
}
|
||||
|
||||
|
||||
// Getters and Setters
|
||||
public void setdNozzleType(int dNozzleType) {
|
||||
this.dNozzleType = dNozzleType;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -1,14 +1,110 @@
|
||||
package com.ruoyi.ngCalTools.model;
|
||||
|
||||
public class GasProps {
|
||||
public class GasProps implements Cloneable {
|
||||
|
||||
// 重写 clone() 方法
|
||||
@Override
|
||||
public GasProps clone() {
|
||||
try {
|
||||
return (GasProps) super.clone();
|
||||
} catch (CloneNotSupportedException e) {
|
||||
// 因为已经实现了 Cloneable 接口,所以不会抛出该异常
|
||||
throw new AssertionError();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// corresponds to the control group in meter classes
|
||||
public int lStatus; // calculation status 计算状态
|
||||
public boolean bForceUpdate; // 执行全部计算的标志 signal to perform full calculation
|
||||
|
||||
|
||||
|
||||
public double[] adMixture; // 气体摩尔组成 Composition in mole fraction
|
||||
public double[] adMixtureV; // 气体体积组成 Composition in mole fraction
|
||||
public double[] adMixtureD; // 气体质量组成 Composition in mole fraction
|
||||
public int dCbtj; // 参比条件 101325 0,15,20
|
||||
public double dPb; // 参比压力 Contract base Pressure (Pa)
|
||||
public double dTb; // 参比温度Contract base temperature (K)
|
||||
public double dPf; // 绝对压力 Absolute Pressure (Pa)
|
||||
public double dTf; // 工况温度 Flowing temperature (K)
|
||||
// basic output from AGA 8 Detail method
|
||||
public double dMrx; // 分子量 mixture molar mass
|
||||
public double dZb; // 标况压缩因子compressibility at contract base condition
|
||||
public double dZf; // 工况压缩因子compressibility at flowing condition
|
||||
public double dFpv; // 超压缩系数 supercompressibility
|
||||
public double dDb; // 标况摩尔密度molar density at contract base conditions (moles/dm3)
|
||||
public double dDf; // 工况摩尔密度 molar density at flowing conditions (moles/dm3)
|
||||
public double dRhob; // 标况质量密度mass density at contract base conditions (kg/m3)
|
||||
public double dRhof; // 工况质量密度 mass density at flowing conditions (kg/m3)
|
||||
public double dRD_Ideal; // 理想气体的相对密度ideal gas relative density
|
||||
public double dRD_Real; // 真实气体的相对密度real gas relative density
|
||||
// additional output
|
||||
public double dHo; // 理想气体的比焓 ideal gas specific enthalpy
|
||||
public double dH; // 真实气体的焓 real gas specific enthalpy (J/kg)
|
||||
public double dS; // 真实气体的熵real gas specific entropy (J/kg-mol.K)
|
||||
public double dCpi; // 理想气体定压热容 ideal gas constant pressure heat capacity (J/kg-mol.K)
|
||||
public double dCp; // 定压热容real gas constant pressure heat capacity (J/kg-mol.K)
|
||||
public double dCv; // 定容积热容 real gas constant volume heat capacity (J/kg-mol.K)
|
||||
public double dk; // 比热比ratio of specific heats
|
||||
public double dKappa; // 等熵指数 isentropic exponent, denoted with Greek letter kappa
|
||||
public double dSOS; // 声速speed of sound (m/s)
|
||||
public double dCstar; // 临界流函数 critical flow factor C*
|
||||
|
||||
// 11062 输出
|
||||
public double dHhvMol; // 摩尔高位发热量
|
||||
public double dLhvMol; // 摩尔低位发热量
|
||||
public double dHhvv; // 体积高位发热量
|
||||
public double dLhvv; // 体积低位发热量
|
||||
public double dHhvm; // 质量高位发热量
|
||||
public double dLhvm; // 质量地位发热量
|
||||
|
||||
public double dZb11062; // 标况压缩因子
|
||||
public double dRhob11062; // 标况质量密度mass density at contract base conditions (kg/m3)
|
||||
public double dRhof11062; // 工况质量密度 mass density at flowing conditions (kg/m3)
|
||||
public double dRD_Ideal11062; // 理想气体的相对密度ideal gas relative density
|
||||
public double dRD_Real11062; // 真实气体的相对密度real gas relative density
|
||||
public double dWobbeIndex; // 真实气体的沃泊指数
|
||||
|
||||
public double dPc; // 临界压力
|
||||
public double dTC; // 临界温度
|
||||
public double dBzsx; // 爆炸上限
|
||||
public double dBzxx; // 爆炸下限
|
||||
public double dTotalC; // 总炭含量 (kg/m3)
|
||||
public double dC2; // C2组分含量 (kg/m3)
|
||||
public double dC2j; // C2以上组分含量 (kg/m3)
|
||||
public double dC3j; // C3以上组分含量 (kg/m3)
|
||||
public double dC4j; // C4以上组分含量 (kg/m3)
|
||||
public double dC5j; // C5以上组分含量 (kg/m3)
|
||||
public double dC6j; // C6以上组分含量 (kg/m3)
|
||||
public double dC3C4; // C3C4组分含量 (kg/m3)
|
||||
public String dngComponents; //组分的组合字符串 从前端传过来
|
||||
|
||||
// 新增高精度物性参数
|
||||
private double dMu; // 动态粘度 (Pa·s)
|
||||
private double dNu; // 运动粘度 (m²/s)
|
||||
// 新增滞止参数
|
||||
public double dP0; // 滞止压力(Pa)
|
||||
public double dT0; // 滞止温度(K)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public double getdP0() {
|
||||
return dP0;
|
||||
}
|
||||
|
||||
public void setdP0(double dP0) {
|
||||
this.dP0 = dP0;
|
||||
}
|
||||
|
||||
public double getdT0() {
|
||||
return dT0;
|
||||
}
|
||||
|
||||
public void setdT0(double dT0) {
|
||||
this.dT0 = dT0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public double[] getAdMixtureD() {
|
||||
return adMixtureD;
|
||||
@ -450,63 +546,23 @@ public class GasProps {
|
||||
this.dngComponents = dngComponents;
|
||||
}
|
||||
|
||||
public double[] adMixtureD; // 气体质量组成 Composition in mole fraction
|
||||
public int dCbtj; // 参比条件 101325 0,15,20
|
||||
public double dPb; // 参比压力 Contract base Pressure (Pa)
|
||||
public double dTb; // 参比温度Contract base temperature (K)
|
||||
public double dPf; // 绝对压力 Absolute Pressure (Pa)
|
||||
public double dTf; // 工况温度 Flowing temperature (K)
|
||||
// basic output from AGA 8 Detail method
|
||||
public double dMrx; // 分子量 mixture molar mass
|
||||
public double dZb; // 标况压缩因子compressibility at contract base condition
|
||||
public double dZf; // 工况压缩因子compressibility at flowing condition
|
||||
public double dFpv; // 超压缩系数 supercompressibility
|
||||
public double dDb; // 标况摩尔密度molar density at contract base conditions (moles/dm3)
|
||||
public double dDf; // 工况摩尔密度 molar density at flowing conditions (moles/dm3)
|
||||
public double dRhob; // 标况质量密度mass density at contract base conditions (kg/m3)
|
||||
public double dRhof; // 工况质量密度 mass density at flowing conditions (kg/m3)
|
||||
public double dRD_Ideal; // 理想气体的相对密度ideal gas relative density
|
||||
public double dRD_Real; // 真实气体的相对密度real gas relative density
|
||||
// additional output
|
||||
public double dHo; // 理想气体的比焓 ideal gas specific enthalpy
|
||||
public double dH; // 真实气体的焓 real gas specific enthalpy (J/kg)
|
||||
public double dS; // 真实气体的熵real gas specific entropy (J/kg-mol.K)
|
||||
public double dCpi; // 理想气体定压热容 ideal gas constant pressure heat capacity (J/kg-mol.K)
|
||||
public double dCp; // 定压热容real gas constant pressure heat capacity (J/kg-mol.K)
|
||||
public double dCv; // 定容积热容 real gas constant volume heat capacity (J/kg-mol.K)
|
||||
public double dk; // 比热比ratio of specific heats
|
||||
public double dKappa; // 等熵指数 isentropic exponent, denoted with Greek letter kappa
|
||||
public double dSOS; // 声速speed of sound (m/s)
|
||||
public double dCstar; // 临界流函数 critical flow factor C*
|
||||
|
||||
// 11062 输出
|
||||
public double dHhvMol; // 摩尔高位发热量
|
||||
public double dLhvMol; // 摩尔低位发热量
|
||||
public double dHhvv; // 体积高位发热量
|
||||
public double dLhvv; // 体积低位发热量
|
||||
public double dHhvm; // 质量高位发热量
|
||||
public double dLhvm; // 质量地位发热量
|
||||
public double getdMu() {
|
||||
return dMu;
|
||||
}
|
||||
|
||||
public double dZb11062; // 标况压缩因子
|
||||
public double dRhob11062; // 标况质量密度mass density at contract base conditions (kg/m3)
|
||||
public double dRhof11062; // 工况质量密度 mass density at flowing conditions (kg/m3)
|
||||
public double dRD_Ideal11062; // 理想气体的相对密度ideal gas relative density
|
||||
public double dRD_Real11062; // 真实气体的相对密度real gas relative density
|
||||
public double dWobbeIndex; // 真实气体的沃泊指数
|
||||
public void setdMu(double dMu) {
|
||||
this.dMu = dMu;
|
||||
}
|
||||
|
||||
public double getdNu() {
|
||||
return dNu;
|
||||
}
|
||||
|
||||
public void setdNu(double dNu) {
|
||||
this.dNu = dNu;
|
||||
}
|
||||
|
||||
public double dPc; // 临界压力
|
||||
public double dTC; // 临界温度
|
||||
public double dBzsx; // 爆炸上限
|
||||
public double dBzxx; // 爆炸下限
|
||||
public double dTotalC; // 总炭含量 (kg/m3)
|
||||
public double dC2; // C2组分含量 (kg/m3)
|
||||
public double dC2j; // C2以上组分含量 (kg/m3)
|
||||
public double dC3j; // C3以上组分含量 (kg/m3)
|
||||
public double dC4j; // C4以上组分含量 (kg/m3)
|
||||
public double dC5j; // C5以上组分含量 (kg/m3)
|
||||
public double dC6j; // C6以上组分含量 (kg/m3)
|
||||
public double dC3C4; // C3C4组分含量 (kg/m3)
|
||||
public String dngComponents; //组分的组合字符串 从前端传过来
|
||||
|
||||
|
||||
|
||||
|
@ -7,7 +7,7 @@ import org.springframework.stereotype.Service;
|
||||
@Service
|
||||
public class DetailService {
|
||||
|
||||
private static final double RGASKJ = 8.314510e-3;
|
||||
public static final double RGASKJ = 8.314510e-3;
|
||||
|
||||
// 成员变量转换
|
||||
// 组件数量
|
||||
|
@ -10,7 +10,7 @@ public class GBT11062Service {
|
||||
int[] aiCID = new int[21];// component IDs
|
||||
double[] dXi = new double[21];// mole fraction of component i
|
||||
// 初始化 adTableMri 数组
|
||||
double[] adTableMri = { 16.0430, 28.0135, 44.0100, 30.0700, 44.0970, 18.0153, 34.0820, 2.0159, 28.0100, 31.9988, 58.1230, 58.1230, 72.1500, 72.1500, 86.1770, 100.2040, 114.2310, 128.2580, 142.2850, 4.0026, 39.9480 };
|
||||
static double[] adTableMri = { 16.0430, 28.0135, 44.0100, 30.0700, 44.0970, 18.0153, 34.0820, 2.0159, 28.0100, 31.9988, 58.1230, 58.1230, 72.1500, 72.1500, 86.1770, 100.2040, 114.2310, 128.2580, 142.2850, 4.0026, 39.9480 };
|
||||
// 初始化 adTablePc 数组
|
||||
double[] adTablePc = { 4.604, 3.399, 7.382, 4.88, 4.249, 22.118, 9.005, 1.297, 3.499, 5.081, 3.648, 3.797, 3.381, 3.369, 3.012, 2.736, 2.486, 0, 0, 0.2275, 4.876 };
|
||||
// 初始化 adTableTc 数组
|
||||
@ -134,6 +134,8 @@ public class GBT11062Service {
|
||||
gasProps.dC5j = gasProps.dC5j * gasProps.dPb / 8314.51 / gasProps.dTb / gasProps.dZb11062;
|
||||
gasProps.dC6j = gasProps.dC6j * gasProps.dPb / 8314.51 / gasProps.dTb / gasProps.dZb11062;
|
||||
|
||||
ISO9300Service.calculateViscosity(gasProps);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,174 @@
|
||||
package com.ruoyi.ngCalTools.service;
|
||||
|
||||
import com.ruoyi.ngCalTools.model.GasProps;
|
||||
|
||||
public class ISO9300Service {
|
||||
|
||||
// 基于Chapman-Enskog理论的计算 高精度粘度计算 音速喷嘴ISO9300
|
||||
public static double calculateViscosity(GasProps gas) {
|
||||
double BOLTZMANN = 1.380649e-23; // 玻尔兹曼常数 (J/K)
|
||||
double Avogadro = 6.02214076e23; // 添加阿伏伽德罗常数
|
||||
LJ mixLj = getLJParameters(gas); // Lennard-Jones参数
|
||||
// 转换为SI单位
|
||||
double sigma = mixLj.sigma ; // Å → m
|
||||
double epsilon = mixLj.epsilonK * BOLTZMANN; // K →
|
||||
|
||||
// 计算无量纲温度
|
||||
double T = gas.getdTf();
|
||||
double Tstar = T * BOLTZMANN / epsilon;
|
||||
|
||||
double omega = getOmega(Tstar);
|
||||
|
||||
// 查普曼-恩斯柯格公式
|
||||
double M_avg = gas.getdMrx() / 1000; // g/mol → kg/mol
|
||||
double m = M_avg / Avogadro;
|
||||
double viscosity = 5.0 / 16.0 * Math.sqrt(Math.PI * m * BOLTZMANN * T)
|
||||
/ (Math.PI * Math.pow(sigma, 2) * omega);
|
||||
|
||||
gas.setdMu(viscosity);
|
||||
return viscosity;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static LJ getLJParameters(GasProps gas) {
|
||||
double sigmaMix = 0;
|
||||
double epsilonKMix = 0;
|
||||
int n = gas.adMixture.length;
|
||||
|
||||
for (int i = 0; i < n; i++) {
|
||||
for (int j = 0; j < n; j++) {
|
||||
|
||||
double xixj = gas.adMixture[i] * gas.adMixture[j];
|
||||
// Lorentz规则
|
||||
double sigmaPair = (LjParameters[i][0] + LjParameters[j][0]) / 2;
|
||||
sigmaMix += xixj * sigmaPair;
|
||||
// Berthelot规则 + 极性修正
|
||||
double epsilonPair = Math.sqrt(LjParameters[i][1] * LjParameters[j][1]) * polarityFactors[i] * polarityFactors[j];
|
||||
epsilonKMix += xixj * epsilonPair;
|
||||
}
|
||||
}
|
||||
|
||||
return new LJ(sigmaMix, epsilonKMix);
|
||||
}
|
||||
|
||||
// 天然气21个组分的LJ参数
|
||||
|
||||
public static double[][] LjParameters = {
|
||||
{3.758e-10, 148.6}, // 甲烷 C1
|
||||
{3.798e-10, 71.4}, // 氮气 N2
|
||||
{3.941e-10, 195.2}, // 二氧化碳 CO2
|
||||
{4.443e-10, 215.7}, // 乙烷 C2
|
||||
{5.118e-10, 237.1}, // 丙烷 C3
|
||||
{2.75e-10, 80.0}, // 水 H2O
|
||||
{3.623e-10, 301.1}, // 硫化氢 H2S
|
||||
{2.827e-10, 59.7}, // 氢气 H2
|
||||
{3.690e-10, 91.7}, // 一氧化碳 CO
|
||||
{3.467e-10, 106.7}, // 氧气 O2
|
||||
{5.278e-10, 267.0}, // 异丁烷 iC4
|
||||
{5.341e-10, 274.7}, // 正丁烷 nC4
|
||||
{5.734e-10, 330.1}, // 异戊烷 iC5
|
||||
{5.784e-10, 341.1}, // 正戊烷 nC5
|
||||
{6.260e-10, 412.3}, // 己烷 C6
|
||||
{6.812e-10, 467.3}, // 庚烷 C7(注:此处庚烷参数按趋势估算)
|
||||
{7.294e-10, 532.1}, // 辛烷 C8(注:此处辛烷参数按趋势估算)
|
||||
{7.700e-10, 614.2}, // 壬烷 C9(注:此处壬烷参数按趋势估算)
|
||||
{8.170e-10, 681.5}, // 癸烷 C10(注:此处癸烷参数按趋势估算)
|
||||
{2.551e-10, 10.22}, // 氦气 He
|
||||
{3.405e-10, 124.0} // 氩气 Ar
|
||||
};
|
||||
// 极性修正系数(1.0表示非极性)
|
||||
// 极性修正系数数组(与LjParameters数组顺序严格对应)
|
||||
private static final double[] polarityFactors = {
|
||||
// 1. 甲烷 C1
|
||||
1.00, // 非极性分子(对称四面体结构)
|
||||
|
||||
// 2. 氮气 N2
|
||||
1.02, // 微弱四极矩(J. Chem. Phys. 129, 034306)
|
||||
|
||||
// 3. 二氧化碳 CO2
|
||||
1.05, // 四极矩修正(Ind. Eng. Chem. Res. 2019, 58, 5, 1964–1972)
|
||||
|
||||
// 4. 乙烷 C2
|
||||
1.00, // 非极性(对称结构)
|
||||
|
||||
// 5. 丙烷 C3
|
||||
1.00, // 非极性(链状烷烃)
|
||||
|
||||
// 6. 水 H2O
|
||||
1.18, // 强极性修正(J. Phys. Chem. B 2005, 109, 15, 7053–7062)
|
||||
|
||||
// 7. 硫化氢 H2S
|
||||
1.12, // 中等极性(J. Chem. Eng. Data 2008, 53, 3, 726–729)
|
||||
|
||||
// 8. 氢气 H2
|
||||
1.00, // 非极性(同核双原子)
|
||||
|
||||
// 9. 一氧化碳 CO
|
||||
1.03, // 微弱偶极矩(J. Mol. Liq. 2020, 320, 114432)
|
||||
|
||||
// 10. 氧气 O2
|
||||
1.01, // 微弱顺磁性(通常视为非极性)
|
||||
|
||||
// 11. 异丁烷 iC4
|
||||
1.00, // 支链烷烃(非极性)
|
||||
|
||||
// 12. 正丁烷 nC4
|
||||
1.00, // 直链烷烃(非极性)
|
||||
|
||||
// 13. 异戊烷 iC5
|
||||
1.00, // 支链烷烃(非极性)
|
||||
|
||||
// 14. 正戊烷 nC5
|
||||
1.00, // 直链烷烃(非极性)
|
||||
|
||||
// 15. 己烷 C6
|
||||
1.00, // 长链烷烃(非极性)
|
||||
|
||||
// 16. 庚烷 C7
|
||||
1.00, // 长链烷烃(非极性)
|
||||
|
||||
// 17. 辛烷 C8
|
||||
1.00, // 长链烷烃(非极性)
|
||||
|
||||
// 18. 壬烷 C9
|
||||
1.00, // 长链烷烃(非极性)
|
||||
|
||||
// 19. 癸烷 C10
|
||||
1.00, // 长链烷烃(非极性)
|
||||
|
||||
// 20. 氦气 He
|
||||
1.00, // 惰性气体(非极性)
|
||||
|
||||
// 21. 氩气 Ar
|
||||
1.00 // 惰性气体(非极性)
|
||||
};
|
||||
// 碰撞积分Ω(2,2)* 近似计算(Neufeld多项式)
|
||||
private static double getOmega(double Tstar) {
|
||||
if (Tstar < 0.1) {
|
||||
return 2.0 / (3.0 * Tstar); // 低温量子修正
|
||||
} else if (Tstar > 400) {
|
||||
return 0.92 * Math.log(Tstar) / Tstar; // 高温渐近解
|
||||
} else {
|
||||
double A = 1.16145;
|
||||
double B = 0.14874;
|
||||
double C = 0.52487;
|
||||
double D = 0.77320;
|
||||
double E = 2.16178;
|
||||
double F = 2.43787;
|
||||
return A / Math.pow(Tstar, B)
|
||||
+ C / Math.exp(D * Tstar)
|
||||
+ E / Math.exp(F * Tstar);
|
||||
}
|
||||
}
|
||||
public static class LJ {
|
||||
public final double sigma; // 碰撞直径 (m)
|
||||
public final double epsilonK; // ε/k (K)
|
||||
|
||||
public LJ(double sigma, double epsilonK) {
|
||||
this.sigma = sigma;
|
||||
this.epsilonK = epsilonK;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,5 +1,7 @@
|
||||
package com.ruoyi.system.controller;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.util.List;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
@ -37,6 +39,9 @@ public class SysUnitConvertController extends BaseController
|
||||
@Autowired
|
||||
private ISysUnitConvertService sysUnitConvertService;
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 查询单位转换列表
|
||||
*/
|
||||
|
@ -2,6 +2,7 @@ package com.ruoyi.system.controller;
|
||||
|
||||
import com.ruoyi.system.domain.SysUnitConvert;
|
||||
import com.ruoyi.system.service.ISysUnitConvertService;
|
||||
import com.ruoyi.system.service.impl.SysUnitConvertServiceImpl;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@ -11,39 +12,28 @@ import java.math.RoundingMode;
|
||||
@Component
|
||||
public class UnitConvert {
|
||||
|
||||
private final ISysUnitConvertService sysUnitConvertService;
|
||||
|
||||
@Autowired
|
||||
public UnitConvert(ISysUnitConvertService sysUnitConvertService) {
|
||||
this.sysUnitConvertService = sysUnitConvertService;
|
||||
}
|
||||
private ISysUnitConvertService sysUnitConvertService;
|
||||
|
||||
public double ConvertUniter(String unitType, double oldValue, int oldUnit, int newUnit) {
|
||||
public double ConvertUniter(String unitType, double oldValue, int oldUnit, int newUnit) {
|
||||
// 查询旧单位信息
|
||||
if ("temperature".equalsIgnoreCase(unitType)) {
|
||||
return handleTemperatureConversion(BigDecimal.valueOf(oldValue), (long) oldUnit, (long) newUnit).doubleValue();
|
||||
} else {
|
||||
SysUnitConvert tempUnit = new SysUnitConvert();
|
||||
tempUnit.setUnitType(unitType);
|
||||
tempUnit.setUnitOrder((long) oldUnit);
|
||||
|
||||
SysUnitConvert oldUnitInfo = sysUnitConvertService.selectSysUnitConvertUnitByTypeOrder(tempUnit);
|
||||
SysUnitConvert oldUnitInfo =sysUnitConvertService.selectSysUnitConvertUnitByTypeOrder(unitType, (long) oldUnit,null);
|
||||
if (oldUnitInfo == null) {
|
||||
throw new IllegalArgumentException("旧单位 '" + oldUnit + "' 不存在或不可用");
|
||||
}
|
||||
tempUnit=new SysUnitConvert();;
|
||||
tempUnit.setUnitType(unitType);
|
||||
tempUnit.setBaseUnit("Y");
|
||||
|
||||
SysUnitConvert baseUnitInfo = sysUnitConvertService.selectSysUnitConvertUnitByTypeOrder(tempUnit);
|
||||
|
||||
SysUnitConvert baseUnitInfo = sysUnitConvertService.selectSysUnitConvertUnitByTypeOrder (unitType,null,"Y");
|
||||
if (baseUnitInfo == null) {
|
||||
throw new IllegalArgumentException("基准单位 不存在或不可用");
|
||||
}
|
||||
tempUnit=new SysUnitConvert();
|
||||
tempUnit.setUnitType(unitType);
|
||||
tempUnit.setUnitOrder((long) newUnit);
|
||||
|
||||
// 查询新单位信息
|
||||
SysUnitConvert newUnitInfo = sysUnitConvertService.selectSysUnitConvertUnitByTypeOrder(tempUnit);
|
||||
SysUnitConvert newUnitInfo = sysUnitConvertService.selectSysUnitConvertUnitByTypeOrder(unitType, (long) newUnit,null);
|
||||
if (newUnitInfo == null) {
|
||||
throw new IllegalArgumentException("新单位 '" + newUnit + "' 不存在或不可用");
|
||||
}
|
||||
@ -71,7 +61,7 @@ public class UnitConvert {
|
||||
}
|
||||
|
||||
// 温度转换方法
|
||||
public BigDecimal handleTemperatureConversion(BigDecimal oldValue, Long oldUnit, Long newUnit) {
|
||||
public static BigDecimal handleTemperatureConversion(BigDecimal oldValue, Long oldUnit, Long newUnit) {
|
||||
final BigDecimal THIRTY_TWO = BigDecimal.valueOf(32);
|
||||
final BigDecimal FIVE = BigDecimal.valueOf(5);
|
||||
final BigDecimal NINE = BigDecimal.valueOf(9);
|
||||
|
@ -2,6 +2,7 @@ package com.ruoyi.system.mapper;
|
||||
|
||||
import java.util.List;
|
||||
import com.ruoyi.system.domain.SysUnitConvert;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
/**
|
||||
* 单位转换Mapper接口
|
||||
@ -53,10 +54,16 @@ public interface SysUnitConvertMapper
|
||||
/**
|
||||
* 查询单位换算
|
||||
*
|
||||
* @param sysUnitConvert 需要删除的数据主键集合
|
||||
* @param unitType 单位换算
|
||||
* @param unitOrder 单位换算
|
||||
* @param baseUnit 单位换算
|
||||
* @return 结果
|
||||
*/
|
||||
public SysUnitConvert selectSysUnitConvertUnitByTypeOrder(SysUnitConvert sysUnitConvert);
|
||||
public SysUnitConvert selectSysUnitConvertUnitByTypeOrder(
|
||||
@Param("unitType") String unitType,
|
||||
@Param("unitOrder") Long unitOrder, // 修正参数类型
|
||||
@Param("baseUnit") String baseUnit
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
|
@ -9,11 +9,10 @@ import com.ruoyi.system.domain.SysUnitConvert;
|
||||
* @author ruoyi
|
||||
* @date 2025-03-22
|
||||
*/
|
||||
public interface ISysUnitConvertService
|
||||
{
|
||||
public interface ISysUnitConvertService {
|
||||
/**
|
||||
* 查询单位转换
|
||||
*
|
||||
*
|
||||
* @param id 单位转换主键
|
||||
* @return 单位转换
|
||||
*/
|
||||
@ -21,24 +20,26 @@ public interface ISysUnitConvertService
|
||||
|
||||
/**
|
||||
* 查询单位转换列表
|
||||
*
|
||||
*
|
||||
* @param sysUnitConvert 单位转换
|
||||
* @return 单位转换集合
|
||||
*/
|
||||
public List<SysUnitConvert> selectSysUnitConvertList(SysUnitConvert sysUnitConvert);
|
||||
|
||||
/**
|
||||
* 查询单位
|
||||
*
|
||||
* @param sysUnitConvert 单位换算
|
||||
* @param unitType 单位换算
|
||||
* @param unitOrder 单位换算
|
||||
* @param baseUnit 单位换算
|
||||
* @return 单位换算集合
|
||||
*/
|
||||
public SysUnitConvert selectSysUnitConvertUnitByTypeOrder(SysUnitConvert sysUnitConvert);
|
||||
|
||||
public SysUnitConvert selectSysUnitConvertUnitByTypeOrder(String unitType,Long unitOrder, String baseUnit);
|
||||
|
||||
|
||||
/**
|
||||
* 新增单位转换
|
||||
*
|
||||
*
|
||||
* @param sysUnitConvert 单位转换
|
||||
* @return 结果
|
||||
*/
|
||||
@ -46,7 +47,7 @@ public interface ISysUnitConvertService
|
||||
|
||||
/**
|
||||
* 修改单位转换
|
||||
*
|
||||
*
|
||||
* @param sysUnitConvert 单位转换
|
||||
* @return 结果
|
||||
*/
|
||||
@ -54,7 +55,7 @@ public interface ISysUnitConvertService
|
||||
|
||||
/**
|
||||
* 批量删除单位转换
|
||||
*
|
||||
*
|
||||
* @param ids 需要删除的单位转换主键集合
|
||||
* @return 结果
|
||||
*/
|
||||
@ -62,7 +63,7 @@ public interface ISysUnitConvertService
|
||||
|
||||
/**
|
||||
* 删除单位转换信息
|
||||
*
|
||||
*
|
||||
* @param id 单位转换主键
|
||||
* @return 结果
|
||||
*/
|
||||
|
@ -1,6 +1,8 @@
|
||||
package com.ruoyi.system.service.impl;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import com.ruoyi.system.mapper.SysUnitConvertMapper;
|
||||
@ -16,7 +18,8 @@ import com.ruoyi.system.service.ISysUnitConvertService;
|
||||
@Service
|
||||
public class SysUnitConvertServiceImpl implements ISysUnitConvertService
|
||||
{
|
||||
@Autowired
|
||||
|
||||
@Autowired // 必须添加自动注入
|
||||
private SysUnitConvertMapper sysUnitConvertMapper;
|
||||
|
||||
/**
|
||||
@ -33,14 +36,16 @@ public class SysUnitConvertServiceImpl implements ISysUnitConvertService
|
||||
|
||||
/**
|
||||
* 查询单位换算
|
||||
*
|
||||
* @param sysUnitConvert 单位换算
|
||||
* @param unitType 单位换算
|
||||
* @param unitOrder 单位换算
|
||||
* @param baseUnit 单位换算
|
||||
* @return 单位换算
|
||||
*/
|
||||
|
||||
@Override
|
||||
public SysUnitConvert selectSysUnitConvertUnitByTypeOrder(SysUnitConvert sysUnitConvert) {
|
||||
return sysUnitConvertMapper.selectSysUnitConvertUnitByTypeOrder(sysUnitConvert);
|
||||
|
||||
public SysUnitConvert selectSysUnitConvertUnitByTypeOrder(String unitType,Long unitOrder, String baseUnit) {
|
||||
return sysUnitConvertMapper.selectSysUnitConvertUnitByTypeOrder(unitType, unitOrder,baseUnit);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -41,7 +41,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<include refid="selectSysUnitConvertVo"/>
|
||||
where suc.id = #{id}
|
||||
</select>
|
||||
<select id="selectSysUnitConvertUnitByTypeOrder" parameterType="SysUnitConvert"
|
||||
<select id="selectSysUnitConvertUnitByTypeOrder"
|
||||
resultMap="SysUnitConvertResult">
|
||||
<!-- 这里编写具体的 SQL 查询语句 -->
|
||||
<include refid="selectSysUnitConvertVo"/>
|
||||
|
Loading…
Reference in New Issue
Block a user