flow 1.3.0
Kokkos cut-cell IBM incompressible Navier-Stokes solver + pnm pore extraction
Loading...
Searching...
No Matches
collocated_zh_ab.py
Go to the documentation of this file.
1import os, sys, time
2sys.path.insert(0, os.path.abspath("build_cuda2"))
3import numpy as np
4from peclet import flow
5
6
7def _collocated_mode(s, mode):
8 """Select a collocated scheme by the integer face-interp mode this script was written with:
9 0/7/9 are the public strings ('plain' / 'embed' / 'gauge-exact'), 5/6 the diagnostics rungs,
10 and every other number was deleted at 1.0.0 (the call then raises)."""
11 names = {0: "plain", 7: "embed", 9: "gauge-exact"}
12 if mode in names:
13 s.set_collocated_scheme(names[mode])
14 else:
15 s.diagnostics.set_face_interp(mode)
16
17def lattice_sdf(N, phi=0.125):
18 R=(3*phi/(4*np.pi))**(1/3)*N
19 g=np.arange(N)+0.5; X,Y,Z=np.meshgrid(g,g,g,indexing="ij")
20 dx=X-0.5*N; dx-=N*np.round(dx/N)
21 dy=Y-0.5*N; dy-=N*np.round(dy/N)
22 dz=Z-0.5*N; dz-=N*np.round(dz/N)
23 return np.sqrt(dx*dx+dy*dy+dz*dz)-R, R
24
25def drag(N, mode, mu=0.1, F=1e-3, dt=80.0, warm_tol=1e-7, tail=40, max_steps=4000):
26 sdf,R=lattice_sdf(N); lv=max(2,int(np.log2(N))-1)
27 s=flow.SolverColocated(N,N,N)
28 s.set_rho(1.0); s.set_mu(mu); s.set_dt(dt); s.set_body_force((F, 0, 0)); s.set_advection(False)
29 s.diagnostics.set_velocity_solver_params(200); s.set_pressure_multigrid(True,levels=lv)
30 s.set_pressure_pcg(True,400,1e-10); _collocated_mode(s, mode)
31 s.set_solid(sdf,cutcell_pressure=True)
32 prev,warm,um,t0=0.0,None,[],time.time()
33 for it in range(max_steps):
34 s.step(); m=float(s.get_u().mean()); um.append(m)
35 if warm is None:
36 if it%10==9:
37 if it>10 and abs(m-prev)<warm_tol*(abs(m)+1e-30): warm=it
38 prev=m
39 elif it-warm>=tail: break
40 return F*N**3/(6*np.pi*mu*R*np.mean(um[-tail:])), it+1, time.time()-t0
41
42kref=4.2920
43M0={32:+0.99,48:+0.68,64:+0.598,96:+0.397,128:+0.299} # mode-0 baselines (prior runs)
44print(f"Z&H K={kref}. Collocated: mode0 = plain avg (baseline), mode3 = wall-aware @ open-centroid + transpose.",flush=True)
45print(f"{'N':>4} | {'mode0 err%':>10} | {'mode3 err%':>10} | steps | secs",flush=True)
46prev_e,prev_N=None,None
47for N in (32,48,64,96,128):
48 K,steps,secs=drag(N,3)
49 e=100*(K-kref)/kref
50 o=f" (order {np.log(abs(prev_e)/abs(e))/np.log(N/prev_N):+.2f})" if prev_e else ""
51 print(f"{N:>4} | {M0[N]:>+10.3f} | {e:>+10.3f} | {steps:>5d} | {secs:>4.0f}{o}",flush=True)
52 prev_e,prev_N=e,N
lattice_sdf(N, phi=0.125)
_collocated_mode(s, mode)
drag(N, mode, mu=0.1, F=1e-3, dt=80.0, warm_tol=1e-7, tail=40, max_steps=4000)
static double mean(const std::vector< double > &a)