Skip to content
Go to file

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

libsd - System Dynamics for developers

Build Status Coverage Status

A modern, high-performance, open source system dynamics engine written in C, designed for embedding in larger projects. It has been tested to build & run on Linux, FreeBSD, Mac OS X, and Windows (under mingw). Patches are welcome for Visual Studio support.

libsd relies heavily on unit testing. A recent code coverage report of the unit tests is here with >93% line coverage.

Getting & Building the code

The build process is easy:

$ git clone
$ cd libsd
$ make
$ sudo make install

That will install the static library libsd, the header sd.h, and the command-line simulation tool mdl. Run mdl to simulate a model and provide the results in a tab-separated output format:

[bpowers@freebsd11 libsd]$ mdl models/one_stock.xmile
time	stock	input	initial
0.000000	2.000000	1.000000	2.000000
100000.000000	100002.000000	1.000000	2.000000
200000.000000	200002.000000	1.000000	2.000000
300000.000000	300002.000000	1.000000	2.000000
400000.000000	400002.000000	1.000000	2.000000
500000.000000	500002.000000	1.000000	2.000000
600000.000000	600002.000000	1.000000	2.000000
700000.000000	700002.000000	1.000000	2.000000
800000.000000	800002.000000	1.000000	2.000000
900000.000000	900002.000000	1.000000	2.000000
1000000.000000	1000002.000000	1.000000	2.000000

Using libsd

Simply #include <sd.h> in your project, and link with -lsd -lm. (-lm is the math library provided by libc, and is explicitly required on most platforms).

Code for opening a model, simulating it, and retreiving the time-series results for a variable is straightforward:

SDProject *project;
SDSim *sim;
int err = 0;
int nsteps, n;
double *series;

project = sd_project_open(path, &err);
if (!project)
	die("error opening project: %s\n", sd_error_str(err));

sim = sd_sim_new(project, NULL);
if (!sim)
	die("couldn't create simulation context\n");

err = sd_sim_run_to_end(sim);
if (err)
	die("run_to_end: %s\n", sd_err_str(err));

nsteps = sd_sim_get_stepcount(sim);
series = calloc(nsteps, sizeof(*series));
if (!series)
	die("out of memory\n");

n = sd_sim_get_series(sim, "stock", series, nsteps);
if (n != nsteps)
	die("didn't get all data\n");

for (int i = 0; i < nsteps; i++) {
	printf("%f\n", series[i]);



  • tests for reciprocal DT


system dynamics simulation in C




No releases published


No packages published
You can’t perform that action at this time.