flow
Kokkos cut-cell IBM incompressible Navier-Stokes solver + pnm pore extraction
Loading...
Searching...
No Matches
test_ibm_exactness.py
Go to the documentation of this file.
1import numpy as np
2
3def poly_D_pt(xi): return xi * (1.0 + xi)
4def poly_Nnb_pt(xi): return xi * (1.0 - xi)
5def poly_Nc_pt(xi): return 2.0 * (xi**2 - 1.0)
6def poly_Nbc_pt(xi): return 2.0
7
8def poly_D_avg(xi): return xi * (1.0 + xi) - 1.0/12.0
9def poly_Nnb_avg(xi): return xi * (1.0 - xi) + 1.0/12.0
10def poly_Nc_avg(xi): return 2.0 * (xi**2 - 1.0) - 1.0/6.0
11def poly_Nbc_avg(xi): return 2.0
12
13def apply_ibm_1d(u_c, u_nb, u_bc, xi, mu, dx, scheme='point'):
14 if scheme == 'point':
15 D = poly_D_pt(xi)
16 Nc = poly_Nc_pt(xi)
17 Nnb = poly_Nnb_pt(xi)
18 Nbc = poly_Nbc_pt(xi)
19 else:
20 D = poly_D_avg(xi)
21 Nc = poly_Nc_avg(xi)
22 Nnb = poly_Nnb_avg(xi)
23 Nbc = poly_Nbc_avg(xi)
24
25 # Standard stencil coeffs (diffusion)
26 a_nb = mu / dx**2
27 a_c = -2.0 * mu / dx**2
28 a_g = mu / dx**2
29
30 # Modified stencil (A' u = f')
31 # Row scaling factor D
32 # a_c' = D*a_c + Nc*a_g
33 # a_nb' = D*a_nb + Nnb*a_g
34 # f' = D*f - Nbc*u_bc*a_g
35
36 a_c_mod = D * a_c + Nc * a_g
37 a_nb_mod = D * a_nb + Nnb * a_g
38
39 # Inhomogeneous correction (term that moves to RHS)
40 # Eq: a'u = Df - Nbc*ubc*ag => Df = a'u + Nbc*ubc*ag
41 rhs_corr = Nbc * u_bc * a_g
42
43 return (a_c_mod * u_c + a_nb_mod * u_nb + rhs_corr) / D
44
46 mu = 0.01
47 dx = 0.1
48 thetas = [0.1, 0.3, 0.5, 0.8]
49
50 print("Testing 1D IBM Exactness...")
51
52 for xi in thetas:
53 # 1. Point-Value Quadratic
54 # u(x) = (x + xi)^2. Boundary at -xi where u=0.
55 u_pt = lambda x: (x + xi)**2
56 u_c = u_pt(0)
57 u_nb = u_pt(dx)
58 u_bc = 0.0
59
60 val = apply_ibm_1d(u_c, u_nb, u_bc, xi/dx, mu, dx, 'point')
61 expected = 2.0 * mu
62 print(f"Point Quadratic xi={xi}: calc={val:.6e}, expected={expected:.6e}")
63 assert abs(val - expected) < 1e-12
64
65 # 2. Cell-Average Quadratic
66 # u_avg = 1/dx * integral_{-dx/2}^{dx/2} (x+xi)^2 dx = xi^2 + dx^2/12
67 u_avg = lambda x: (x + xi)**2 + dx**2/12.0
68 u_c_avg = u_avg(0)
69 u_nb_avg = u_avg(dx)
70 u_bc = 0.0 # Point value at boundary
71
72 val_avg = apply_ibm_1d(u_c_avg, u_nb_avg, u_bc, xi/dx, mu, dx, 'avg')
73 print(f"Cell-Avg Quadratic xi={xi}: calc={val_avg:.6e}, expected={expected:.6e}")
74 assert abs(val_avg - expected) < 1e-12
75
76 # 3. Inhomogeneous BC
77 xi = 0.3
78 u_wall = 5.0
79 u_pt_inhom = lambda x: (x + xi)**2 + u_wall
80 u_c = u_pt_inhom(0)
81 u_nb = u_pt_inhom(dx)
82 u_bc = u_wall
83 val = apply_ibm_1d(u_c, u_nb, u_bc, xi/dx, mu, dx, 'point')
84 print(f"Inhomogeneous (u_bc={u_wall}): calc={val:.6e}, expected={expected:.6e}")
85 assert abs(val - expected) < 1e-12
86
87if __name__ == "__main__":
apply_ibm_1d(u_c, u_nb, u_bc, xi, mu, dx, scheme='point')