# Under the hood: the algorithms implemented by scuff-em

This page offers some top-level overview sketches of the basic algorithms implemented by the various codes in the scuff-em suite.

For more details on the implementation of these algorithms, see Data Structures and Class Methods in scuff-em.

For further technical details on the scuff-em core library, check out the libscuff Implementation Notes and Technical Reference, available as a PDF document.

## The core library (libscuff)

At its heart, the scuff-em core library is an implementation of the surface-integral-equation / boundary-element method (SIE / BEM) for solving electromagnetic scattering problems.

More specifically, scuff-em implements the EFIE and PMCHW formulations of the SIE / BEM with RWG basis functions used to expand tangential currents on the surfaces of compact 3D objects.

If all of those acronyms went by a little quickly,
here's a sketch of the basic problem addressed by the
scuff-em core library.
We have a collection of homogeneous material objects (maybe
gold or silicon spheres or cubes) embedded in some medium
(generally vacuum or a dielectric liquid), we irradiate the
configuration with some known electromagnetic disturbance
(such as a plane wave), and we seek to compute the electromagnetic
fields scattered from the objects.
In a surface-integral-equation (SIE) method, we do this by first
computing the *surface currents* induced on the object
surfaces by the incident field. (For perfectly conducting
scatterers we have only electric surface currents **K**;
for general scatterers we have both electric and magnetic
(**N**) surface currents.) Once we have solved for the
surface currents, we can use them to evaluate the scattered
fields anywhere we like.

To solve for the surface currents, we write down an
*integral equation* relating the surface currents to
the incident field. This integral equation basically says
that the tangential components of the scattered field (the
field due to the surface currents) should precisely cancel
the tangential components of the
incident field at the object surfaces.
(This statement is more of a mnemonic than a rigorous description;
see the
technical memo
for a more thorough treatment.)
Schematically, the integral
equation looks something like this:

where
involves the dyadic Green's function for Maxwell's
equations. Here the surface integral extends over the surfaces of
all scattering objects in our scattering geometry, and the equation
is required to hold at all points **x** on all object
surfaces. (The equation is understood to apply only to the
surface-tangential components of the vectors on the two sides.)

This is the surface-integral-equation (SIE) formulation of
our scattering problem. To solve the integral equation
numerically, we now proceed to *discretize* it by
expanding the **K** and **N** surface currents in some
basis of expansion functions. The particular functions used
by libscuff are the "RWG" basis
functions, which were defined in this paper:

"Electromagnetic Scattering by Surfaces of Arbitrary Shape," by S. Rao, D. Wilton, and A. Glisson,

IEEE Transactions on Antennas and Propagation30409 (1982) http://dx.doi.org/10.1109/TAP.1982.1142818

The RWG basis functions are defined by meshing the surfaces
of compact 3D objects into flat triangular panels, and assigning
to each internal *edge* in the discretization a localized
surface current that is sourced and sunk at the panel vertices
opposite that edge:

Having introduced a discrete basis of expansion functions, our integral equation becomes a simultaneous system of linear equations:

This approach to solving surface integral equations is known
as the *boundary-element method* (BEM), and the linear
system in the equation above is sometimes known as the BEM
system. The scuff-em core library provides
routines for assembling the BEM matrix **M**, and the right-hand
side vector of incident-field expansion coefficients, for arbitrary
scattering geometries and arbitrary incident fields at arbitrary
frequencies.

Then, using the matrix and RHS vector assembled by the core library, you can use external linear algebra software like lapack to solve the linear system, after which you can again use routines provided by the scuff-em core library to compute the scattered fields at arbitrary points.