Skip to content
Oakfield Operator Calculus Function Reference Site

Physics Examples

Models a travelling Gaussian wave packet under dispersion tψ=iβ2xxψ\partial_t \psi = i \beta_2 \partial_{xx} \psi.

local sim = require("libsimcore")
local dt = 0.025
local N = 768
local ctx = sim.sim_create()
sim.sim_set_timestep(ctx, dt)
sim.sim_set_visual_mode(ctx, "polar")
local field = sim.sim_add_field(ctx, {N}, {
type = "complex_double",
fill = {0, 0}
})
sim.sim_add_stimulus_operator(ctx, field, {
type = "stimulus_gaussian_travel",
amplitude = 0.25,
center = 6.0 * math.pi,
velocity = 1,
sigma = 1,
omega = 1,
spacing = 0.1
})
sim.sim_add_dispersion_operator(ctx, field, {
coefficient = 1.5,
order = 2,
spacing = 0.1
})
local integrator = sim.sim_create_context_integrator(ctx, "euler", {
adaptive = false,
initial_dt = dt
})
sim.sim_set_integrator(ctx, integrator)
return ctx

Models 1D diffusion tT=νxxT\partial_t T = \nu\,\partial_{xx} T with a point hot spot so the Crank–Nicolson step damps the peak over time.

local temp = sim.sim_add_field(ctx, {256}, {
fill = 0.0
})
temp:values()[128] = 1.0 -- hot spot
sim.sim_add_linear_dissipative_operator(ctx, temp, {
viscosity = 0.5,
alpha = 2.0,
spacing = 0.01
})
local integrator = sim.sim_create_context_integrator(ctx, "crank_nicolson", {
initial_dt = 0.01
})
sim.sim_set_integrator(ctx, integrator)

Drives the energy toward Etarget=1.5E_{\text{target}} = 1.5 with a soft gain, acting like a discrete feedback loop En+1Enλ(EnEtarget)E_{n+1} \approx E_n - \lambda(E_n - E_{\text{target}}).

local state = sim.sim_add_field(ctx, {256}, {
type = "complex_double"
})
sim.sim_add_thermostat_operator(ctx, state, {
mode = "soft_lambda",
E_target = 1.5,
lambda_soft_gain = 0.1
})
sim.sim_add_stimulus_operator(ctx, state, {
type = "stimulus_sine",
amplitude = 0.5,
wavenumber = 1.0,
omega = 0.2
})