22def hydrostatic(ratio, mu=0.0, steps=100, g=0.1, dt=1.0, N=8, NZ=24):
23 s = F.Solver(N, N, NZ)
24 s.set_rho(1.0); s.set_mu(mu); s.set_dt(dt)
25 s.set_domain_bc(4, 1, 0, 0, 0); s.set_domain_bc(5, 1, 0, 0, 0)
26 s.set_pressure_geometry(np.asfortranarray(np.full((N, N, NZ), 10.0)))
28 rz = np.where(z < NZ // 2, ratio, 1.0).astype(np.float64)
30 s.set_field(
"rho", np.asfortranarray(np.broadcast_to(rz[
None,
None, :], (N, N, NZ)).copy()))
31 s.set_density_mode(
"variable")
32 s.set_property_model(
"force_z",
"linear",
"rho", [0.0, -g])
34 for _
in range(steps):
36 m = max(np.abs(s.get_u()).max(), np.abs(s.get_v()).max(), np.abs(s.get_w()).max())
38 dp = p[N//2, N//2, 1:] - p[N//2, N//2, :-1]
39 rf = 0.5 * (rz[1:] + rz[:-1])
40 perr = np.max(np.abs(dp + g * rf)) / (g * ratio)
45 s = F.Solver(N, 4, NZ)
46 s.set_rho(1.0); s.set_mu(mu); s.set_dt(dt)
48 s.set_domain_bc(4, 1, 0, 0, 0); s.set_domain_bc(5, 1, 0, 0, 0)
49 s.set_pressure_geometry(np.asfortranarray(np.full((N, 4, NZ), 10.0)))
50 s.add_scalar(
"c", diffusivity=0.0, scheme=1, iters=1)
51 s.set_scalar_bc(
"c", 4, 1, 0.0); s.set_scalar_bc(
"c", 5, 1, 0.0)
52 s.set_property_model(
"rho",
"linear",
"c", [1.0, 2.0])
53 s.set_property_model(
"force_z",
"linear",
"rho", [0.0, -g])
54 x, z = np.arange(N), np.arange(NZ)
55 zi = NZ / 2 + 1.5 * np.cos(2 * np.pi * x / N)
56 c0 = np.zeros((N, 4, NZ))
58 c0[i, :, :] = 0.5 * (1.0 + np.tanh((z[
None, :] - zi[i]) / 1.5))
59 s.set_field(
"c", np.asfortranarray(c0))
62 c = s.get_field(
"c")[:, 1, :]
63 zc = np.array([np.interp(0.5, c[i, :], z)
for i
in range(N)])
64 return 0.5 * (zc.max() - zc.min())
67 for it
in range(steps):