iodata
iodata copied to clipboard
Support different types of normalization of the primitives in `iodata.basis`
(This was originally discussed in #146.)
At the moment we only have L2
normalization, while many file formats use different conventions. One other common convention is to use unnormalized primitives, e.g. in the WFN and WFX formats. There are also a few variants of L2 normalization, which mostly originate from (incompatible) conventions used internally by other QC codes. At the moment, the conventions are handled by add hoc conversion code in the format modules (see e.g. cp2klog, molden, wfn and wfx). For density basis sets, also other conventions are used, and L1 normalization could make sense. We could facilitate these conversions and eliminate somewhat ugly ad hoc code by making the normalization of the primitives configurable in MolecularBasis
class. This class already has a primitive_normalization
string attribute, but it is not used yet. A string may also be too limited to reflect the zoo of possibilities. It is also not very informative. Instead we could just create a dictionary with conversion factors from normalized primitives for relevant Cartesian and pure functions. Similarly to how convert_conventions
now works, this could be used to switch easily from one convention to another.
I think the only options I can think (that are in wide use) are L2 and unnormalized. I know L2 can be a little bit tricky depending on the normalization convention within a contraction. I would tend to say that supporting lots of options is fine (but also a lot of work), but I would err on the side of user-friendliness over generality. Perhaps that also suggests the normalization_conventions dictionary, especially if it harmonizes well with convert_conventions.