Skip to content
Oakfield Operator Calculus Function Reference Site

Basic Examples

Examples of using the simulation core API via the graphical user interface (sim_gui).

Generate Kepler style orbits in phase portrait mode.

local sim = require("libsimcore")
local N = 512
local dt = 0.05
local ctx = sim.sim_create()
sim.sim_set_timestep(ctx, dt)
sim.sim_set_visual_mode(ctx, "phase_portrait")
local field_1 = sim.sim_add_field(ctx, {N}, {
type = "complex_double",
fill = {0.0, 0.0}
})
local field_2 = sim.sim_add_field(ctx, {N}, {
type = "complex_double",
fill = {0.0, 0.0}
})
sim.sim_add_stimulus_operator(ctx, field_1, {
type = "stimulus_sine",
amplitude = 0.25,
wavenumber = 0.025,
omega = -0.3,
phase = 0
})
sim.sim_add_stimulus_operator(ctx, field_1, {
type = "stimulus_sine",
amplitude = 0.25,
wavenumber = 0.05,
omega = -0.3,
phase = math.pi/2,
rotation = math.pi/4,
})
sim.sim_add_stimulus_operator(ctx, field_2, {
type = "stimulus_spectral_lines",
amplitude = 0.25,
wavenumber = 0.03,
omega = -0.2,
phase = 0
})
sim.sim_add_mixer_operator(ctx, field_2, field_1, field_1, {
mode = "multiply",
lhs_gain = 0.5,
rhs_gain = 0.5
})
local integrator = sim.sim_create_context_integrator(ctx, "euler")
sim.sim_set_integrator(ctx, integrator)
return ctx

Applies a moving Gaussian pulse stimulus to a real field.

local sim = require("libsimcore")
local N = 768
local dt = 0.025
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 = "double",
fill = {0.0}
})
sim.sim_add_zero_field_operator(ctx, field)
sim.sim_add_stimulus_operator(ctx, field, {
type = "stimulus_gaussian_plain",
amplitude = 0.25,
sigma = 0.75,
velocity = 1,
center = math.pi,
spacing = 0.05
})
local integrator = sim.sim_create_context_integrator(ctx, "euler", {
initial_dt = dt
})
sim.sim_set_integrator(ctx, integrator)
return ctx
local sim = require("libsimcore")
local N = 512
local dt = 0.01
local ctx = sim.sim_create()
sim.sim_set_timestep(ctx, dt)
sim.sim_on_step(ctx, function(c)
local t = sim.sim_get_time(c)
sim.log("t=%.3f", t)
end)
return ctx

Example output in log panel:

Terminal window
[INFO] t=0.000
[INFO] t=0.010
[INFO] t=0.020
[INFO] t=0.030
...

Examples of using the simulation core API via the command-line interface (sim_cli).

Applies Asin(kxωt)A\sin(kx - \omega t) to a real field and takes 120 integrator (RK4) steps, matching the forced oscillator

u˙(t)=Asin(kxωt)\dot u(t) = A\sin(kx - \omega t)
local sim = require("libsimcore")
local ctx = sim.sim_create()
local steps = 120
local N = 256
local dt = 0.02
sim.log("Starting simulation with %d steps and dt = %.3f", steps, dt)
local field = sim.sim_add_field(ctx, {N}, {
type = "double",
fill = {0}
})
sim.sim_add_stimulus_operator(ctx, field, {
type = "stimulus_sine",
amplitude = 0.1,
wavenumber = 1.0,
omega = 0.2
})
local integrator = sim.sim_create_context_integrator(ctx, "rk4", {
initial_dt = dt
})
sim.sim_set_integrator(ctx, integrator)
for _ = 1, steps do
sim.sim_integrator_step(ctx, integrator, dt)
local values = field:values()
sim.log("Field sample value: %.6f", values[1])
end
sim.sim_shutdown(ctx)
return ctx

Example output:

Terminal window
oak@field % ./bin/sim_cli --script fixed-step-sine.lua
[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
...