Physics Examples
GUI Examples
Section titled “GUI Examples”1) Travelling wave packet
Section titled “1) Travelling wave packet”Models a drifting Gaussian wave packet under dispersion,
local dt = 0.025local N = 768local ctx = ooc.create()
ooc.set_timestep(ctx, dt)ooc.set_visual_mode(ctx, "polar")
local field = ooc.add_field(ctx, {N}, { type = "complex_double", fill = {0.0, 0.0}})
ooc.add_stimulus_operator(ctx, field, { type = "stimulus_traveling_wave_packet", amplitude = 0.25, sigma_u = 0.75, center_u = 6.0 * math.pi, velocity_u = 1.0, carrier_u = 1.0})
ooc.add_dispersion_operator(ctx, field, { coefficient = 1.5, order = 2.0, spacing = 0.1})
local integrator = ooc.create_context_integrator(ctx, "euler", { initial_dt = dt})ooc.set_integrator(ctx, integrator)
return ctxCLI Examples
Section titled “CLI Examples”1) Heat diffusion on a line
Section titled “1) Heat diffusion on a line”Models 1D diffusion
with a point hot spot so the Crank-Nicolson step damps the peak over time.
local ctx = ooc.create()local dt = 0.01local n = 256local hot_index = 128
local temp = ooc.add_field(ctx, {n}, { type = "real_double", fill = 0.0})
local data = {}for i = 1, n do data[i] = 0.0enddata[hot_index] = 1.0temp:set_values(data)
ooc.add_linear_dissipative_operator(ctx, temp, { viscosity = 0.5, alpha = 2.0, spacing = 0.01})
local integrator = ooc.create_context_integrator(ctx, "crank_nicolson", { initial_dt = dt})ooc.set_integrator(ctx, integrator)
for step = 1, 40 do ooc.integrator_step(ctx, integrator, dt)end
local values = temp:values()ooc.log("center after diffusion: %.6f", values[hot_index])
ooc.shutdown(ctx)return ctx2) Thermostat energy clamp
Section titled “2) Thermostat energy clamp”Drives the field energy toward with a soft gain, acting like a discrete feedback loop
local ctx = ooc.create()local dt = 0.02
local state = ooc.add_field(ctx, {256}, { type = "complex_double", fill = {0.0, 0.0}})
ooc.add_thermostat_operator(ctx, state, { mode = "soft_lambda", E_target = 1.5, lambda_soft_gain = 0.1})
ooc.add_stimulus_operator(ctx, state, { type = "stimulus_sine", amplitude = 0.5, wavenumber = 1.0, omega = 0.2, scale_by_dt = true})
local integrator = ooc.create_context_integrator(ctx, "euler", { initial_dt = dt})ooc.set_integrator(ctx, integrator)
for step = 1, 64 do ooc.integrator_step(ctx, integrator, dt)end
local stats = ooc.field_stats(ctx, state)ooc.log("rms=%.6f max_abs=%.6f", stats.rms, stats.max_abs)
ooc.shutdown(ctx)return ctx