优化端口传递物性参数方式,减少上下游元件重复计算量
This commit is contained in:
1 parent
91bd9fb252
commit
5d5a2e1843
12 files changed
+773
-65
No files matched your search
@@ -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):
|
||||
|
||||
Reference in new issue
Block a user