Basic Examples
GUI Examples
Section titled “GUI Examples”Examples of using the simulation core API through a GUI-driven loop.
1) Two-field phase portrait
Section titled “1) Two-field phase portrait”Create two complex fields, drive them with simple stimuli, and mix them into a phase-portrait view.
local N = 384local dt = 0.05local ctx = ooc.create()
ooc.set_timestep(ctx, dt)ooc.set_visual_mode(ctx, "phase_portrait")ooc.set_phase_mode(ctx, "scatter")
local carrier = ooc.add_field(ctx, {N}, { type = "complex_double", fill = {0.0, 0.0}})
local modulator = ooc.add_field(ctx, {N}, { type = "complex_double", fill = {0.0, 0.0}})
ooc.add_zero_field_operator(ctx, carrier)
ooc.add_stimulus_operator(ctx, carrier, { type = "stimulus_sine", amplitude = 0.6, wavenumber = 0.025, omega = 0.1})
ooc.add_stimulus_operator(ctx, carrier, { type = "stimulus_sine", amplitude = 1.0, wavenumber = 0.05, omega = -0.2})
ooc.add_stimulus_operator(ctx, modulator, { type = "stimulus_spectral_lines", harmonic_count = 1, amplitude = 0.22, wavenumber = 0.02, omega = -0.1})
ooc.add_mixer_operator(ctx, carrier, modulator, carrier, { mode = "multiply", lhs_gain = -1.0, rhs_gain = 1.0})
local integrator = ooc.create_context_integrator(ctx, "euler")ooc.set_integrator(ctx, integrator)
return ctx2) Gaussian pulse
Section titled “2) Gaussian pulse”Applies a moving Gaussian pulse stimulus to a complex field.
local ctx = ooc.create()local N = 1024
ooc.set_timestep(ctx, 0.02)ooc.set_visual_mode(ctx, "phase_portrait")
local field = ooc.add_field(ctx, {N}, { type = "complex_double", fill = {0.0, 0.0}})
ooc.add_stimulus_operator(ctx, field, { type = "stimulus_gaussian_pulse", amplitude = 0.25, coord_center_x = 0.1, sigma_x = 0.15, spacing_x = 0.015, rotation = math.pi / 3, coord_velocity_x = 0.08})
ooc.add_dispersion_operator(ctx, field, { coefficient = 1.6, order = 1.2, spacing = 0.02})
local integrator = ooc.create_context_integrator(ctx, "euler")ooc.set_integrator(ctx, integrator)
return ctx3) Simple step logger
Section titled “3) Simple step logger”Attach an observation-only on_step hook that logs time as the context advances.
local ctx = ooc.create()local dt = 0.01
ooc.set_timestep(ctx, dt)
local field = ooc.add_field(ctx, {64}, { type = "real_double", fill = 0.0})
ooc.add_stimulus_operator(ctx, field, { type = "stimulus_sine", amplitude = 0.1, wavenumber = 0.5, omega = 0.2, scale_by_dt = true})
local integrator = ooc.create_context_integrator(ctx, "euler", { initial_dt = dt})ooc.set_integrator(ctx, integrator)
ooc.on_step(ctx, function(c) ooc.log("step=%d t=%.3f", ooc.get_step_index(c), ooc.get_time(c))end)
return ctxExample output in the log panel:
[INFO] step=1 t=0.010[INFO] step=2 t=0.020[INFO] step=3 t=0.030...CLI Examples
Section titled “CLI Examples”Examples of using the simulation core API through oakcli.
1) Fixed-step sine stimulus
Section titled “1) Fixed-step sine stimulus”Applies to a real field and takes 120 RK4 steps, matching the forced oscillator
local ctx = ooc.create()local steps = 120local N = 256local dt = 0.02
ooc.log("Starting simulation with %d steps and dt = %.3f", steps, dt)
local field = ooc.add_field(ctx, {N}, { type = "double", fill = {0}})
ooc.add_stimulus_operator(ctx, field, { type = "stimulus_sine", amplitude = 0.1, wavenumber = 1.0, omega = 0.2})
local integrator = ooc.create_context_integrator(ctx, "rk4", { initial_dt = dt})
ooc.set_integrator(ctx, integrator)
for _ = 1, steps do ooc.integrator_step(ctx, integrator, dt) local values = field:values() ooc.log("Field sample value: %.6f", values[1])end
ooc.shutdown(ctx)
return ctxExample output:
oakcli run --script fixed-step-sine.lua --steps 0[INFO] Starting simulation with 120 steps and dt = 0.020...[INFO] Field sample value: -0.665682[INFO] Field sample value: -0.687690[INFO] Field sample value: -0.710105[INFO] Field sample value: -0.732928[INFO] Field sample value: -0.756163[INFO] Field sample value: -0.779813[INFO] Field sample value: -0.803878[INFO] Field sample value: -0.828362...