This commit is contained in:
xyy
2026-04-14 21:40:09 +08:00
parent 84ce86fc33
commit 8a8afe8e0e
4 changed files with 47 additions and 47 deletions

View File

@@ -50,15 +50,18 @@ namespace MembranePoreTester.Helpers
double[] wetFlows = sorted.Select(p => p.WetFlow).ToArray();
double[] dryFlows = sorted.Select(p => p.DryFlow).ToArray();
// 寻找湿膜流量曲线与干膜流量曲线的所有交点(直接相交),记录交点压力及对应的插值干膜流量
var intersections = new List<(double Pressure, double DryFlowAtP)>();
const double eps = 1e-12;
// 按压力升序查找第一个直接交点wet == dry找到即返回
// 为避免噪声或无效0 流量)点导致的错误交点,要求两侧点在湿膜/干膜上均有有效流量
for (int i = 0; i < pressures.Length - 1; i++)
{
if (wetFlows[i] <= 0 || dryFlows[i] <= 0 || wetFlows[i + 1] <= 0 || dryFlows[i + 1] <= 0)
continue;
double diff1 = wetFlows[i] - dryFlows[i];
double diff2 = wetFlows[i + 1] - dryFlows[i + 1];
// 检查差值是否异号或为零(表示相交)
if (diff1 * diff2 <= 0 && diff1 != diff2)
if (diff1 * diff2 <= 0 && Math.Abs(diff2 - diff1) > eps)
{
double p;
if (Math.Abs(diff1) < eps)
@@ -73,51 +76,16 @@ namespace MembranePoreTester.Helpers
{
double p0 = pressures[i];
double p1 = pressures[i + 1];
if (Math.Abs(diff2 - diff1) < eps)
continue;
p = p0 + (p1 - p0) * (0 - diff1) / (diff2 - diff1);
}
if (p <= 0) continue;
// 线性插值计算交点处的干膜流量
double dryAtP;
{
double d0 = dryFlows[i];
double d1 = dryFlows[i + 1];
double p0 = pressures[i];
double p1 = pressures[i + 1];
if (Math.Abs(p1 - p0) < eps)
dryAtP = d0;
else
dryAtP = d0 + (d1 - d0) * (p - p0) / (p1 - p0);
}
intersections.Add((p, dryAtP));
if (p > 0)
return PoreCalculator.PressureToPore(p, unit, liquid);
}
}
if (intersections.Count == 0)
return 0;
// 如果存在多个交点,默认选择压力最小(靠近低压区的第一个交点)
var chosen = intersections.OrderBy(x => x.Pressure).First();
// 将调试信息写入日志文件,便于在非 VS 环境下查看计算过程
try
{
Log($"PoreDistributionAnalysis: unit={unit}, liquid.C_Pa={liquid?.C_Pa}");
foreach (var it in intersections)
Log($"intersection: P={it.Pressure}, dryAtP={it.DryFlowAtP}");
Log($"chosen intersection: P={chosen.Pressure}");
double pore = PoreCalculator.PressureToPore(chosen.Pressure, unit, liquid);
Log($"calculated pore={pore}");
return pore;
}
catch
{
try { return PoreCalculator.PressureToPore(chosen.Pressure, unit, liquid); } catch { return 0; }
}
// 已移除干膜半流量回退算法:如果未找到湿膜与干膜的直接交点,则不进行半流量插值,直接返回 0
return 0;
}
private static void Log(string message)