iodata icon indicating copy to clipboard operation
iodata copied to clipboard

Support different types of normalization of the primitives in `iodata.basis`

Open tovrstra opened this issue 3 years ago • 1 comments

(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.

tovrstra avatar Apr 03 '21 07:04 tovrstra

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.

PaulWAyers avatar Apr 05 '21 18:04 PaulWAyers