In the backend, we define different forces, each of which corresponds to a potential term (i.e., harmonic bond, harmonic angles, electrostatics etc.). Each force object encloses an environment for a potential calculation, which is defined by all the parameters that do not need to be differentiable (e.g., distance cutoff and the energy threshold in an Ewald calculation). The force object then returns a potential in the form of a python function, which exposes differentiable variables (system geometries and force field parameters) as inputs.