Skip to content
Get started

Continuum laws and boundaries

Standard sources · Install this source revision

These components bind existing support and Field occurrences. The examples check their composition; mesh and solver selection belong to the execution workflow.

Canonical owner: Solid.LinearElasticity / linear_elasticity.eqi. The self-contained quasistatic declarations precede the dynamic additions in that file.

Requires a two-dimensional body, vector displacement in m, scalar load_potential in Pa, and Lamé parameters mu and lambda in Pa. Supplies small-strain isotropic elastic balance driven by the load-potential gradient.

Requires the same body, displacement and Lamé parameters, plus the complete exterior. Supplies the displacement trace and parent-outward elastic traction on each boundary.

Requires body and one face. Fixes the complete displacement trace at its mechanical port to zero.

Requires body and one face. Fixes the complete outward traction at its mechanical port to zero.

The QuasistaticMechanicalBoundary connector pairs displacement (m) with traction (Pa). It is nominally distinct from the velocity/traction connector in Mechanics.Interfaces; equal vector extent does not make them interchangeable. load_potential is a pressure-valued scalar whose gradient supplies the volume load. It is not an arbitrary vector body-force input or a boundary pressure.

elastic-body.eqi — compilation, not a solve
// Append after the self-contained quasistatic declarations from the linked release source.
// This example checks component composition; it does not select a mesh or solve.
model ReferenceElasticBody(parameter mu: kg / (m * s ^ 2) = 3, parameter lambda: kg / (m * s ^ 2) = 2) {
domain body = box(0, 1, 0, 1);
domain x_lower = boundary(body, axis = 0, side = lower);
domain x_upper = boundary(body, axis = 0, side = upper);
domain y_lower = boundary(body, axis = 1, side = lower);
domain y_upper = boundary(body, axis = 1, side = upper);
variable displacement: vector<m, 2> on body;
variable load_potential: kg / (m * s ^ 2) on body;
relation unloaded on body { load_potential = 0; }
instance balance: IsotropicBalanceWithPotential2d(
body = body, displacement = displacement,
load_potential = load_potential, mu = mu, lambda = lambda
);
instance surface: IsotropicMechanicalInterface2d(
body = body,
exterior = boundaries(x_lower, x_upper, y_lower, y_upper),
displacement = displacement, mu = mu, lambda = lambda
);
instance fixed: FixedDisplacement2d(body = body, face = x_lower);
instance free_right: ZeroTraction2d(body = body, face = x_upper);
instance free_bottom: ZeroTraction2d(body = body, face = y_lower);
instance free_top: ZeroTraction2d(body = body, face = y_upper);
connect conserving surface.mechanical[boundary = x_lower], fixed.mechanical;
connect conserving surface.mechanical[boundary = x_upper], free_right.mechanical;
connect conserving surface.mechanical[boundary = y_lower], free_bottom.mechanical;
connect conserving surface.mechanical[boundary = y_upper], free_top.mechanical;
}

This unloaded body binds one displacement Field to the balance and interface, clamps the left face and connects every remaining face to a free-traction component. It exercises both boundary conditions without leaving a child physical port unconnected. The complete exterior is explicit.

Compile the example from the source checkout

Save the code above as elastic-body.eqi beside the eqiora-source directory. Select the unchanged, self-contained quasistatic prefix; the later dynamic declarations have an additional package dependency and are not needed here.

python
from pathlib import Path
import eqiora
path = Path("eqiora-source/packages/Eqiora.Solid.LinearElasticity/src/linear_elasticity.eqi")
declarations = path.read_text()
end = declarations.index("public component IsotropicElastodynamicsWithPotential2d")
source = declarations[:end] + "\n" + Path("elastic-body.eqi").read_text()
model = eqiora.compile(source=source, filename="elastic-body.eqi")

The selected prefix ends before the dynamic component. For an executed structural example, see Mixed-boundary elasticity and its stated source and environment.

Canonical owner: Fluid.InertialStokes / inertial_stokes.eqi.

InertialStokesWithPotential2d requires a two-dimensional body, vector velocity in m/s, scalar pressure and force_potential in Pa, density in kg/m³ and dynamic_viscosity in Pa·s. It supplies inertial momentum balance and incompressibility. There is no advective velocity term: this is not a general Navier–Stokes component. The force-potential gradient is separate from the pressure unknown.

inertial-stokes.eqi — typed law bindings only
// Append after the unchanged Eqiora.Fluid.InertialStokes release source.
// This checks the law's typed bindings, not initial/boundary completeness or a solve.
model ReferenceFlowLaw(parameter density: kg / m ^ 3 = 1, parameter viscosity: kg / (m * s) = 1) {
domain body = box(0, 1, 0, 1);
state velocity: vector<m / s, 2> on body;
variable pressure: kg / (m * s ^ 2) on body;
variable force_potential: kg / (m * s ^ 2) on body;
instance flow: InertialStokesWithPotential2d(
body = body,
velocity = velocity, pressure = pressure,
force_potential = force_potential,
density = density, dynamic_viscosity = viscosity
);
}

Append that example after the unchanged inertial_stokes.eqi source:

python
from pathlib import Path
import eqiora
path = Path("eqiora-source/packages/Eqiora.Fluid.InertialStokes/src/inertial_stokes.eqi")
source = path.read_text() + "\n" + Path("inertial-stokes.eqi").read_text()
model = eqiora.compile(source=source, filename="inertial-stokes.eqi")

For other delivered mechanical sources and dependency-bearing interfaces, browse the source inventory. For user-authored equations, use Equations and state.

Elastic-body example source · Inertial-law example source