Skip to content
Apex
All recipes
Engineering · multiphysics

Couple thermal and structural across a transient load

Stream a coupled thermal-structural rollout on a turbine blade, watch max stress and tip temperature evolve, steer the rollout when a margin is approached.

Artefact returned
Trajectory · stress field · tip-temp history
Typical runtime
~12 s wall · 12 CU
Cost
≈ $41 per study + Pro seat
01 · The recipe

The expanded snippet.

The version that lands in production — with the annotations a colleague would want when picking up the work. Copy-paste, swap in your inputs, run.

from apex import Aether
from apex.fields import save_field
import os

simos = Aether(api_key=os.environ["APEX_API_KEY"])

# Couple thermal and structural across a transient load step on a turbine blade.
# Stream the trajectory; observe stress field; steer the rollout when a margin
# is approached. Returns a trajectory_id you can later resume or audit.
traj = simos.simulate(
    domain="multiphysics",
    geometry=open("blade.step", "rb").read(),
    geometry_format="step",
    physics=["thermal", "structural"],
    boundary_conditions={
        "inlet":  {"T": 1450, "p": 2.2e6},
        "outlet": {"p": 1.0e5},
        "root":   {"fixed": True},
    },
    materials={"primary": "inconel718"},
    horizon_s=12.0,
    dt_s=5e-3,
    stream=True,
    annotations={"customer_ticket": "BLADE-2026-04"},
)

print(f"trajectory_id = {traj.id}")
print(f"compute_unit_estimate = {traj.compute_units_estimate:.1f}")

for step in traj:
    print(
        f"t={step.time:6.3f}s  "
        f"sigma_max={step.max_stress_MPa:7.1f} MPa  "
        f"T_tip={step.tip_temperature_K:6.1f} K"
    )

    # Steer if we're about to violate the 850 MPa margin.
    if step.max_stress_MPa > 850:
        print("  margin approached — applying root fillet +1.5 mm")
        traj.steer(redesign="root_fillet+1.5mm")

# Save the final stress field for the design-review PDF.
save_field(traj.final_field("vonMises"), "out/blade_vonMises.vti")
02 · Reproduction notes

The numbers in this recipe are real.

What we ran. What we used for inputs. Where the reproduction kit lives, and what reproduces within published bounds.

  • 01Geometry: any STEP file with a labelled root face. The cookbook repo ships an open turbine-blade STEP under CC-BY.
  • 02Inputs match a published Cooper-style impinging-jet experiment for cross-validation.
  • 03Reproduces within published Nu-error bounds (3.6%) on managed cloud at default precision.
  • 04Total wall time depends on cell count and physics coupling; estimate uses an 18M-cell blade.
03 · How to adapt this

Make it your workload.

The recipe is a starting point. The four variations below are the ones we get asked about most. Anything else, write to docs@apexworldlabs.com.

  • Swap geometry: any geometry Aether recognises (STEP, IGES, STL, OBJ). For meshes already in OpenFOAM format, use simos.import_mesh().
  • Add physics: append "electromagnetic" or "chemistry" to the physics list to bring those domains into the same trajectory.
  • Add a steering loop: replace the if-block with your own margin policy. Steering takes any redesign primitive Aether knows about.
  • Run committed: pass committed=True if you have reserved compute capacity — ~35% off on-demand.

Adapt this to your stack.

Swap in your geometry / target / repo and run it. If your workload is novel, send it and we will co-author the recipe with you.