This code solves the Laplace equation ∇2u = 0 for electrostatic potentials u bounded in concentric regions using the Gauss–Seidel algorithm with successive over-relaxation.
Clone and make && make clean.
If building on macOS, first brew install argp-standalone and
export CFLAGS="$CFLAGS -I/usr/local/include/"
export LDFLAGS="$LDFLAGS -L/usr/local/lib/ -largp"to make GLIBC argument parsing available.
./seidel with no arguments will print the (automatically chosen) parameters and the value of the double integral of E2 over the region, a measure of the total electric field.
Run with --help to expose the optional flags.
Usage: seidel [-cpqrt?] [-a a] [-b b] [-n n] [-w w] [--xboundary=a]
[--yboundary=b] [--clean] [--size=n] [--print] [--norelax]
[--relax] [--translate] [--omega=w] [--help] [--usage]
The boundary point (a, b) defines the north-west point of the inner boundary.
./seidel --print produces data files of the form
x y f(x,y)
for the potential (u.dat), the x- and y- components of the electric field (ex.dat, ey.dat) and a file cs.dat of the form
y E_x E_y
which is a cross-section of the electric field at x = 0.5 * n. These files can be removed with --clean (and also with make delete). Run the .plt scripts to plot the results.
The --translate option outputs the value of the integral L (above) as the inner boundary is translated vertically through the region.
The program over-relaxes by default (using successive over-relaxation parameter ω = 1.92, the optimum value for the default configuration). This can be disabled with --norelax (which sets ω = 1), assigned with --omega or calculated with --relax, which prints the value of ω and the number of iterations required for the solution to converge until it hits the minimum.