Skip to content

Engineering Loads, Steps, and Resultants

AgentFEM treats common CAE operations as reusable scientific assets rather than case-local UFL fragments.

Continuum loads

model.elastic_foundation(on=base, stiffness=2.0e8, mode="normal")
model.centrifugal((0.0, 0.0, 120.0), center=(0.0, 0.0, 0.0))
model.hydrostatic_pressure(
    density=1000.0, gravity=(0.0, 0.0, -9.81),
    reference_point=(0.0, 0.0, 0.0), on=wetted_surface,
)
model.distributing_coupling(
    (0.0, 0.0, -50_000.0), moment=(2_000.0, 0.0, 0.0),
    reference_point=load_application_point, on=loaded_surface,
)

The foundation contributes a boundary stiffness matrix. Centrifugal loading uses registered material densities and regions. Hydrostatic pressure follows p = p_ref + rho g dot (x - x_ref). Distributing coupling constructs a traction whose integrated force and moment equal the reference-point resultants, avoiding a mesh-sensitive single solid-node force.

Local coordinates and named reference points

local = coordinates.cartesian(
    origin=(0.0, 0.0, 0.0),
    x=(0.0, 1.0, 0.0), y=(-1.0, 0.0, 0.0), z=(0.0, 0.0, 1.0),
    name="fixture",
)
rp = coordinates.reference_point((100.0, 20.0, 0.0), name="RP-1")

model.remote_force(
    (0.0, -50_000.0, 0.0), moment=(2_000.0, 0.0, 0.0),
    reference_point=rp, system=local, on=loaded_surface,
)
model.remote_displacement(
    U, reference_point=rp, translation=(0.0, 1.0, 0.0),
    rotation=(0.0, 0.0, 0.01), system=local, on=driven_surface,
)

Coordinate axes are validated as a right-handed orthonormal basis. Vector and tensor transforms are public and inspectable. remote_force uses the existing continuum distribution and preserves force and moment about the named point; remote_displacement prescribes the corresponding rigid boundary motion and participates in nonlinear load-factor ramping. It does not claim an unknown reference-point degree of freedom or a general kinematic MPC.

Step inheritance

preload = model.stage("preload")
preload.activate_load(gravity)

service = model.stage("service", previous=preload)
service.activate_load(pressure)
service.deactivate_load("temporary_fixture_force")
service.deactivate_constraint("temporary_fixture")
service.predefine(temperature, initial_temperature)

step = model.step(target=U, configuration=service)

An EngineeringStep says which named loads and constraints are active. It is separate from steps.automatic(...), which controls increments, and from solvers.newton(...), which controls algebraic convergence. Only explicit changes are recorded; other assets inherit from the preceding Step.

Engineering resultants

section = results.section_resultant(S, on=cut, about=reference_point)
free_body = results.free_body_resultant(
    boundary_tractions=((traction, outer_boundary),),
    body_forces=((rho_g, volume),), about=reference_point,
)
path = results.sample_path(S, start=a, end=b)

Section force/moment, free-body force/moment, and path sampling are MPI-global scientific quantities for verification, histories, campaigns, and learning datasets. A fully kinematic reference-point MPC remains separate from the implemented load-distribution contract.