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.
Elastic balance and boundaries
Section titled “Elastic balance and boundaries”Canonical owner: Solid.LinearElasticity / linear_elasticity.eqi. The self-contained quasistatic declarations precede the dynamic additions in that file.
IsotropicBalanceWithPotential2d
Section titled “IsotropicBalanceWithPotential2d”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.
IsotropicMechanicalInterface2d
Section titled “IsotropicMechanicalInterface2d”Requires the same body, displacement and Lamé parameters, plus the complete
exterior. Supplies the displacement trace and parent-outward elastic traction
on each boundary.
FixedDisplacement2d
Section titled “FixedDisplacement2d”Requires body and one face. Fixes the complete displacement trace at its
mechanical port to zero.
ZeroTraction2d
Section titled “ZeroTraction2d”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.
// 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.
from pathlib import Pathimport 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.
Inertial flow law
Section titled “Inertial flow law”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.
// 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:
from pathlib import Pathimport 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.