Force Fields in Avogadro2

I’ve been thinking carefully about how to handle force fields in a “modern” version of Avogadro.

Basically, I want to do this via Python plugin. We’ll see if it’s fast enough (e.g., for low-latency interactive sculpting), but it allows us to easily connect with a wide range of packages, including state-of-the-art ML methods.

Base level:

  • Plugin returns an energy of this particular geometry
    -> Avogadro uses approximate gradients to optimize the geometry using steepest descent or conjugate gradients

Better:

  • Plugin returns energy and gradients of this geometry
    -> Avogadro uses the computed gradients to update the geometry

Best:

  • Plugin updates the geometry for a few steps, returns energy and/or gradients
  • Avogadro updates the geometry

The critical pieces:

  • Indicating that an atom or set of atoms are frozen (or have constraints)
    … This needs to be part of CJSON
  • Returning an energy quickly
  • Having syntax for forces/gradients on atoms in CJSON