flow
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
6def lattice_sdf(N, phi=0.125):
7 R=(3*phi/(4*np.pi))**(1/3)*N
8 g=np.arange(N)+0.5; X,Y,Z=np.meshgrid(g,g,g,indexing="ij")
9 dx=X-0.5*N; dx-=N*np.round(dx/N)
10 dy=Y-0.5*N; dy-=N*np.round(dy/N)
11 dz=Z-0.5*N; dz-=N*np.round(dz/N)
12 return np.sqrt(dx*dx+dy*dy+dz*dz)-R, R
13
14def drag(N, mode, mu=0.1, F=1e-3, dt=80.0, warm_tol=1e-7, tail=40, max_steps=4000):
15 sdf,R=lattice_sdf(N); lv=max(2,int(np.log2(N))-1)
16 s=flow.SolverColocated(N,N,N)
17 s.set_rho(1.0); s.set_mu(mu); s.set_dt(dt); s.set_body_force(F,0,0); s.set_advection(False)
18 s.set_velocity_solver_params(200); s.set_pressure_multigrid(True,levels=lv)
19 s.set_pressure_pcg(True,400,1e-10); s.set_face_interp(mode)
20 s.set_solid(sdf,cutcell_pressure=True,pressure_coarse="rediscretized")
21 prev,warm,um,t0=0.0,None,[],time.time()
22 for it in range(max_steps):
23 s.step(); m=float(s.get_u().mean()); um.append(m)
24 if warm is None:
25 if it%10==9:
26 if it>10 and abs(m-prev)<warm_tol*(abs(m)+1e-30): warm=it
27 prev=m
28 elif it-warm>=tail: break
29 return F*N**3/(6*np.pi*mu*R*np.mean(um[-tail:])), it+1, time.time()-t0
30
31kref=4.2920
32M0={32:+0.99,48:+0.68,64:+0.598,96:+0.397,128:+0.299} # mode-0 baselines (prior runs)
33print(f"Z&H K={kref}. Collocated: mode0 = plain avg (baseline), mode3 = wall-aware @ open-centroid + transpose.",flush=True)
34print(f"{'N':>4} | {'mode0 err%':>10} | {'mode3 err%':>10} | steps | secs",flush=True)
35prev_e,prev_N=None,None
36for N in (32,48,64,96,128):
37 K,steps,secs=drag(N,3)
38 e=100*(K-kref)/kref
39 o=f" (order {np.log(abs(prev_e)/abs(e))/np.log(N/prev_N):+.2f})" if prev_e else ""
40 print(f"{N:>4} | {M0[N]:>+10.3f} | {e:>+10.3f} | {steps:>5d} | {secs:>4.0f}{o}",flush=True)
41 prev_e,prev_N=e,N
lattice_sdf(N, phi=0.125)
drag(N, mode, mu=0.1, F=1e-3, dt=80.0, warm_tol=1e-7, tail=40, max_steps=4000)