#fdtd #simulator #field #electromagnetism #maxwell

nightly app rems

A finite difference time domain (FDTD) electromagnetic simulator

16 releases

0.0.15 Jan 21, 2024
0.0.14 Sep 10, 2023
0.0.13 Dec 13, 2022
0.0.12 Aug 14, 2022
0.0.1 May 9, 2020

#5 in Simulation

Download history 17/week @ 2023-11-04 2/week @ 2023-11-11 4/week @ 2023-11-18 17/week @ 2023-11-25 32/week @ 2023-12-02 17/week @ 2023-12-09 17/week @ 2023-12-16 30/week @ 2023-12-23 15/week @ 2024-01-06 57/week @ 2024-01-20 34/week @ 2024-01-27 1/week @ 2024-02-03 51/week @ 2024-02-10 274/week @ 2024-02-17

360 downloads per month

GPL-3.0 license

329 lines

Audit CI Release

rems (Rust ElectroMagnetic Simulator) is a Finite Difference Time Domain (FDTD) simulator written in Rust.

It is capable of generating animated graphs of your simulations, like this:

1D example simulation


rems is available on crates.io. You can install rems by first installing ffmpeg, then installing Rust, and then using Rust's rustup tool to install Rust nightly, and then you can use cargo to install rems:

$ rustup install nightly
$ rustup override set nightly
# Be sure to read the output of this command and adjust your PATH as instructed.
$ cargo install rems

Quick start

To get started with a quick simulation, have a look at the examples/ folder. You will find two files in there. 1d_simulation.yml file is a simulation parameter file, and 1d_signal.py is a Python script that generates a signal in the format that rems expects. Install Python's bson library, run the signal generator file, and then run the simulation:

$ pip install bson
$ python3 examples/1d_signal.py
$ rems examples/1d_simulation.yml

This will generate a video file on your system called simulation.mp4 that will show you the signal propagating in space. Good job!

Simulation parameter configuration

REMS expects you to define a simulation by providing it with a YAML file describing all the parameters. Here is an example config showing all available options, with commented default options:

# How many dimensions we have in space. Right now, only 1 is supported.
dimensions: 1
# Define a list of signals
  # This signal is at location 600 in space
  - location: 600
    # Read this path to get the signal. See below for a description of this file.
    path: examples/1d_signal.bson
# Define how large the universe should be, in cells
size: 1920
# Define how many time steps the simulation should run for
time: 32768
# This is a list of oscilloscopes, or outputs for your simulation. Right now, only the movie
# type is supported, but one could imagine other types added in the future.
  - type: movie
    # How large of a magnitude to use for the y-axis on the graphs
    # range: 1.0
    # The path to write the movie to
    path: examples/1d_simulation.mp4
    # The framerate of the resulting movie, in Hz
    # framerate: 60
    # How often to generate a graph in simulation time steps
    # graph_period: 16
    # The resolution you desire for the resulting video, expressed as an array of two integers
    # resolution:
    #   - 1920
    #   - 1080
    # How many snapshots to buffer in memory before handing them off to a Python subprocess to
    # generate graphs out of them.
    # snapshot_buffer_len: 47

The signal BSON file

The signals should be defined in a BSON file, with three fields: ex, _version, and dimensions. _version should be set to 0, dimensions should be set to 1, and ex should be an array of floating point numbers that express which value the signal should have for each time step in the simulation. Here is a YAML example that corresponds in spirit to that schema:

_version: 0
dimensions: 1
  - 0.0
  - 0.1
  - 0.2
  - 0.3



If you would like to contribute to rems, send me a patch!

There is a Makefile that is handy for development if you have podman on your system. It's default target is a help that shows the various targets that are available.

# Note that root is not required.
$ make check

Happy hacking!


~343K SLoC