  PyCharge is a computational electrodynamics Python simulator that can
calculate the electromagnetic fields and potentials generated by moving point
charges and can self-consistently simulate dipoles modeled as Lorentz
oscillators. To calculate the total fields and potentials along a discretized
spatial grid at a specified time, PyCharge computes the retarded time of the
point charges at each grid point, which are subsequently used to compute the
analytical solutions to Maxwell's equations for each point charge. The Lorentz
oscillators are driven by the electric field in the system and PyCharge
self-consistently determines the reaction of the radiation on the dipole moment
at each time step. PyCharge treats the two opposite charges in the dipole as
separate point charge sources and calculates their individual contributions to
the total electromagnetic fields and potentials. The expected coupling that
arises between dipoles is captured in the PyCharge simulation, and the modified
radiative properties of the dipoles (radiative decay rate and frequency shift)
can be extracted using the dipole's energy at each time step throughout the
simulation. The modified radiative properties of two dipoles separated in the
near-field, which require a full dipole response to yield the correct physics,
are calculated by PyCharge and shown to be in excellent agreement with the
analytical Green's function results ($<0.2\%$ relative error, over a wide range
of spatial separations). Moving dipoles can also be modeled by specifying the
dipole's origin position as a function of time. PyCharge includes a
parallelized version of the dipole simulation method to enable the parallel
execution of computationally demanding simulations on high performance
computing environments to significantly improve run time.
