Module Development
The topics in this part focus on developing modules (as in writing a module, not
as in developing the Module class). For concreteness, the documentation in
this section assumes we are writing a module that computes the electric field at
a point \(\vec{r}\), \(\vec{E}\left(\vec{r}\right)\), arising from a set of
\(N\) point charges. Physically speaking, up to some constants, \(\vec{E}\left(\vec{r}\right)\) is
given by:
where \(q_i\) is the charge of the \(i\)-th point charge, \(\vec{r}_i\) is a
unit vector in the direction of \(\vec{r}_i\), and the \(i\)-th point charge is
located at \(\vec{r}_i\). We further assume that there is a header file
point_charge.hpp which defines the class PointCharge given
by:
#pragma once
#include <array>
namespace pluginplay_examples {
using Point = std::array<double, 3>;
struct PointCharge {
double m_charge;
Point m_r;
};
} // namespace pluginplay_examples
and that the header file electric_field.hpp defines a property type
ElectricField with an API:
Point ElectricField(Point, std::vector<PointCharge>);
Here the first argument is the point we are evaluating the electric field at, the second argument is the set of point charges, and the return is the value of the electric field at that point. Designing property types is a separate topic covered (TODO: add link).