I started working on making QUIP potentials into OpenKIM models. Most of the code is straightforward, except for the boundary conditions. Perhaps this is better handled by skype (maybe next week), but here's a description of what I've come up with so far.
Right now QUIP has a connection object and an atoms object which are used by the potential calculation routines. The calculation routines loop over all atoms (most of them, including most relevantly GAP, understand ghost atoms), loops over the number of neighbors of each atom, and asks for the index and relative position to each neighbor. The connection object doesn't actually store the relative position. It has an integer lattice vector shift, and the neighbor-getting routines calculates the relative position from the absolute positions, the lattice vectors, and the integer shift.
I initially thought it'd be easiest to create a QUIP connection object from the OpenKIM neighbor list on the fly, and then call the usual QUIP calculation routines. I'm thinking, however, that this isn't possible in general, because there's no way to get the lattice vectors in KIM.
QUIP also assumes a full neighbor list.
Does it looks like the following statements are correct?
1. To support PURE I can create a connection object where the integer lattice shift is always 0. For half lists I can just complete to a full list, and for a full list I can just ignore i > j, then pretend it's a half list and do the same thing.
2. To support RVEC I don't think I can do this. I'd have to put a pointer to the KIM object in the QUIP connection, and directly return relative positions. This would preclude ITERATOR mode, because QUIP assumes LOCATOR.
3. To support MI_PBC I can construct a lattice and create a connection object like in 1
4. To support CLUSTER I can just ignore the lattice and create a connection object
How much of a restriction (in practice, given how tests are actually coded) would it be if RVEC wasn't supported (which is ironic, since RVEC is most like what QUIP's actual calculation routines want), or if RVEC was supported but only with LOCATOR?