Skip to content

Exact-cylinder steady Stokes

Static walkthrough · canonical Marimo source available

Gallery

This page follows one frozen demonstration from exact authored geometry to a common Result. It does not execute a notebook or solve in the browser. The installed publication stays pinned to the exact producer revision. Source links and evidence dossiers instead resolve through the exact site build revision; none follows a branch.

Stage 1 Problem setup

The fluid region is a 2.2m×0.41m2.2\,\mathrm{m} \times 0.41\,\mathrm{m} channel with an exact authored circle centred at [0.2,0.2]m[0.2, 0.2]\,\mathrm{m} and radius 0.05m0.05\,\mathrm{m}. The problem is two-dimensional, steady, incompressible Stokes flow.

A 2.2 metre by 0.41 metre channel. The inlet is the left edge, the outlet is the right edge, the top and bottom edges are walls, and an exact circle of radius 0.05 metre centred at 0.2 metre, 0.2 metre is labelled cylinder.

Exact authored geometry and boundary names. The later demonstration mesh approximates the circle with 50 straight chords; this diagram is explanatory, not geometric evidence.

The canonical Python composition authors that geometry explicitly:

python
geometry_graph = eqiora.geometry.CadAuthoredGraph.rectangle_extrusion(
x_bounds=(0.0, 2.2),
y_bounds=(0.0, 0.41),
plane_z=0.0,
depth=1.0,
modeling_tolerance=1e-10,
).circular_through_cut(
center=(0.2, 0.2),
radius=0.05,
boolean_tolerance=1e-10,
)
geometry = geometry_graph.planar_circular_section(
classification_tolerance=1e-12,
region="fluid",
x_lower="inlet",
x_upper="outlet",
y_lower="walls",
y_upper="walls",
hole="cylinder",
)

Canonical Marimo geometry cell · exact geometry adapter · registered exact-geometry dossier · Python exact-geometry composition dossier

Stage 2 Eqiora model definition

The accepted source spelling is easiest to read by first naming the Cauchy stress. With velocity u\boldsymbol{u}, pressure pp, dynamic viscosity μ\mu, identity tensor I\boldsymbol{I}, and force potential ϕ\phi:

σ(u,p)=2μsym(u)pI\boldsymbol{\sigma}(\boldsymbol{u},p) = 2\mu\,\operatorname{sym}(\nabla\boldsymbol{u}) - p\boldsymbol{I}
 ⁣σ(u,p)ϕ=0, ⁣u=0-\nabla\!\cdot\boldsymbol{\sigma}(\boldsymbol{u},p)-\nabla\phi=0, \qquad \nabla\!\cdot\boldsymbol{u}=0

Here μ=0.001kg/(ms)\mu=0.001\,\mathrm{kg}/(\mathrm{m}\,\mathrm{s}), ϕ=0Pa\phi=0\,\mathrm{Pa}, and pressure has source unit kg/(m*s^2), displayed as pascals. This is a notation projection of the Eqiora source below, not a new formulation.

Eqiora source form

text
relation momentum continuous on body {
-div(
2 * dynamic_viscosity * symmetric_part(grad(velocity))
- isotropic_lift(pressure)
) - grad(force_potential) = 0;
}
relation incompressibility continuous on body {
div(velocity) = 0;
}

Eqiora source form: packaged incompressible component · registered packaged incompressible source · registered packaged-Stokes dossier · registered direct Stokes model source

The application replays the packaged, byte-exact current Model rather than reconstructing scientific meaning in the notebook:

python
model_bytes = (
files(eqiora)
.joinpath("examples", "steady-flow-past-cylinder.model.json")
.read_bytes()
)
model = eqiora.replay(model_bytes)

Eqiora source form: canonical Marimo replay cell · current Model identity dossier

Stage 3 Mesh and boundaries

The inlet profile uses Umax=0.3m/sU_{\max}=0.3\,\mathrm{m}/\mathrm{s} and channel height H=0.41mH=0.41\,\mathrm{m}:

g(y)=4Umaxy(Hy)H2,uin=[g(y),0]g(y)=\frac{4U_{\max}y(H-y)}{H^2}, \qquad \boldsymbol{u}_{\mathrm{in}}=[g(y),0]

At the outlet, normal(σ)=0\operatorname{normal}(\boldsymbol{\sigma})=0. The walls and cylinder use u=0\boldsymbol{u}=0.

Eqiora source form

text
relation inlet_profile_definition continuous on body {
inlet_profile
- 4 * inlet_speed * coordinate(1) * (channel_height - coordinate(1))
/ channel_height ^ 2 = 0;
}
relation inlet_velocity continuous on x_lower {
trace(velocity) + normal(isotropic_lift(inlet_profile)) = 0;
}
relation outlet_traction continuous on x_upper {
normal(
2 * dynamic_viscosity * symmetric_part(grad(velocity))
- isotropic_lift(pressure)
) = 0;
}
relation lower_wall continuous on y_lower { trace(velocity) = 0; }
relation upper_wall continuous on y_upper { trace(velocity) = 0; }

Accepted registered-case source form for the exact-hole closure

text
walls_and_cylinder: trace(u) = [0, 0] m/s

Eqiora source form: application boundary relations · accepted walls-and-cylinder trace boundary

The bounded realization requests at most 50 circular-boundary facets, then resolves and generates the source-bound mesh:

python
mesh_request = eqiora.meshing.MeshRequest(
maximum_boundary_error=1e-4,
minimum_mean_ratio=1e-5,
maximum_boundary_facets=50,
)
mesh_plan = eqiora.meshing.resolve(geometry, mesh_request)
mesh = eqiora.meshing.generate(geometry, plan=mesh_plan)

Chordal reference-mesh dossier · chordal realization-binding dossier · canonical Marimo mesh cell · plain Python mesh adapter · Python mesh composition dossier

Stage 4 Submit and result

The immutable SteadyStokes intent makes every scale and solver bound explicit. fluid.resolve binds the accepted Model and Mesh into a SteadyStokesPlan; the application then creates one Run with one eqiora.submit call and obtains one common Result with run.result().

python
stokes_intent = eqiora.fluid.SteadyStokes(
length_scale_m=0.41,
velocity_scale_m_per_s=0.3,
pressure_scale_pa=0.001 * 0.3 / 0.41,
relative_tolerance=1e-6,
absolute_tolerance=1e-13,
maximum_iterations=10_000,
)
stokes_plan = eqiora.fluid.resolve(model, stokes_intent, mesh=mesh)
run = eqiora.submit(model, plan=stokes_plan)
result = run.result()
Eqiora source form: canonical intent/submit/result cells

The real carriers in that composition are Geometry, MeshPlan, Mesh, Model, SteadyStokesPlan, Run, Result, and SteadyStokesEvidence. The admitted Result lineage binds the following public identities:

Carrier boundary Public identity
Model Result.model_digest
exact Geometry Result.mesh(FieldRef).source_digest
authored correspondence Result.mesh(FieldRef).correspondence_digest
Mesh Result.mesh(FieldRef).digest
SteadyStokesPlan realization Result.run_manifest().realization_digest
Run / Result Result.run_manifest().digest
pressure FieldSnapshot Result.field(FieldRef).digest

These names expose existing identity links; the page does not invent another aggregate digest or pretend that static documentation executed the run.

Registered Plan-and-Run dossier

Stage 5 Pressure visualization

The canonical plotting cell selects the pressure FieldSnapshot from the common Result and passes it to the general scalar-field adapter:

python
pressure = result.snapshots[0]
evidence = eqiora.fluid.steady_stokes_evidence(result)
pressure_figure = eqplot.plot_scalar_field(result, field=pressure.field)
Pressure in pascals for the frozen 2D steady-Stokes exact-cylinder demonstration, shown with a viridis color scale and the 104-triangle affine mesh overlaid. Presentation image only; linked Result evidence carries the numerical claim.
Presentation, not evidence.Units: PaPressure (Pa), frozen exact-cylinder steady-Stokes demonstration at c6b7a21f52ae1acf941d26319d2499ed89152c15; presentation only, not validation.Open canonical plotting cell

Result evidence · Pressure-still presentation case

Read the figure only as a pressure field in pascals, with a viridis scale and the 104-triangle affine mesh overlaid. The admitted pixels are a static presentation of the linked Result; color and pixel values are not validation and do not establish flow quality.

Stage 6 Verified and not claimed

Verified boundary

Supported

  • One frozen 2D steady incompressible Stokes exact-cylinder demonstration, rendered from its accepted public Result path and linked evidence.
  • The exact geometry, source-bound chordal realization, packaged model, Plan-to-Run composition, and Marimo application each have a directly linked registered dossier.
  • The installed publication record binds the admitted PNG, exact source revision, Result lineage, caption, alternative text, and presentation-only boundary.

Not claimed

  • No curved elements.
  • No mesh/PDE convergence.
  • No drag/lift coefficient, scaled or mesh-independent force, or DFG value.
  • No transient or Navier–Stokes behavior.
  • No vortex shedding.
  • No 3D.
  • No production mesher.
  • No performance claim.
  • No cross-platform/byte-reproducible result.
  • No pixel validation.
  • API presence is neither verification nor maturity.

Browse the evidence catalog · exact geometry · chordal mesh · steady-Stokes science · common Result path · Marimo composition

Open canonical Marimo source · View plain Python example