优化端口传递物性参数方式,减少上下游元件重复计算量

This commit is contained in:
ljz committed 2026-09-11 14:42:19 +08:00
1 parent 91bd9fb252
commit 5d5a2e1843
12 files changed
+773 -65

No files matched your search

+49
View File
@@ -68,6 +68,55 @@ int main(void) {
run=subprocess.run([str(exe)],capture_output=True,text=True,timeout=15)
self.assertEqual(run.returncode,0,run.stderr)
def test_scalar_pipe_solver_checks_residual_and_bracket_fallback(self):
harness = r'''
#include <stdio.h>
#define CHECK(x) do { if(!(x)){fprintf(stderr,"line %d\n",__LINE__);return 1;} } while(0)
static double reference(double K,double rr) {
double lo=0,hi=fmax(sqrt(K/.02),1);
while(hi*hi*pipe_friction(hi,rr)<K)hi*=2;
for(int i=0;i<100;i++) {
double mid=.5*(lo+hi);
if(mid*mid*pipe_friction(mid,rr)>K)hi=mid;else lo=mid;
}
return .5*(lo+hi);
}
int main(void) {
NativePipeSolve s;int fallbacks=0;
for(int i=0;i<=150;i++)for(int r=0;r<6;r++)for(int scale=0;scale<3;scale++) {
double re=pow(10,-6+.1*i),rr=r==0?0:pow(10,-6+r);
double K=re*re*pipe_friction(re,rr),q_per_re=pow(10,-12+6*scale);
double actual=native_pipe_resistance(K,rr,q_per_re,&s),expected=reference(K,rr);
CHECK(s.converged && isfinite(actual) && s.relative_residual<=1e-9);
CHECK(s.iterations<20 && fabs(actual-expected)<=1e-12+expected*1e-9);
CHECK(fabs(actual*actual*pipe_friction(actual,rr)/K-1)<=1e-9);
fallbacks+=s.bisections;
}
CHECK(fallbacks>0);
CHECK(native_pipe_resistance(0,0,1,&s)==0 && s.converged);
CHECK(isnan(native_pipe_resistance(-1,0,1,&s)) && !s.converged);
CHECK(isnan(native_pipe_resistance(NAN,0,1,&s)) && !s.converged);
CHECK(isnan(native_pipe_resistance(1,0,0,&s)) && !s.converged);
/* Direct laminar handling preserves the distinct PNL00R branch. */
NativeMedium medium={0,287,1005,300,0,1.8e-5,300,110.4};
double p=2e5,T=300,d=.01,L=1,cm,v;
medium_valve(NULL,&medium,p,p-1,T,&cm,&v);
double expected=pow(PI*d*d/4*p*cm,2)/(16*PI*native_viscosity(&medium,T,0)*L*T);
CHECK(4*expected/(PI*d*native_viscosity(&medium,T,0))<1000);
CHECK(native_pipe_flow(&medium,p,p-1,T,d,L,1e-5,0)==expected);
return 0;
}
'''
with tempfile.TemporaryDirectory(prefix='native-pipe-root-') as tmp:
directory=Path(tmp);source=directory/'check.c';exe=directory/'check.exe'
source.write_text((ROOT/'native/components/kernels.c').read_text()+harness)
build=subprocess.run([self.compiler,'-std=c11','-O3','-Wall','-Wextra','-Werror',
'-ffp-contract=off','-fno-fast-math','-static-libgcc','-I',str(ROOT/'native/include'),
str(source),'-lm','-o',str(exe)],capture_output=True,text=True,timeout=60)
self.assertEqual(build.returncode,0,build.stderr)
run=subprocess.run([str(exe)],capture_output=True,text=True,timeout=30)
self.assertEqual(run.returncode,0,run.stderr)
def test_pnl0001_uses_upstream_temperature_in_both_directions(self):
for reverse in (False,True):
with self.subTest(reverse=reverse):