Skip to content

ibo energy by iao that sums to total DFT energy #8

Description

@kuitpo

It is possible to arrive at a matrix of coefficients IAO x IBO that is most useful for analyzing bonding using just a small amount of python/PySCF programming.
Having spent more time that I care to recollect with NBO,MBFO,QUAO,FMO,LED,PA etc, the data I am now seeing inclines me to think IAOIBO gives the best account of bonding though have yet to see how it deals with hydrogen bonding.

It would be nice go further with this into the realms of a total DFT energy decomposition into an IAO x IBO shaped matrix. Since Decodense provides orbital energies that sum to the DFT energy, perhaps it is just a matter of matching up IBOs from Decodense with those from lo.ibo.ibo (used for IAO x IBO coefficients)? Will these be in the same order?

Another way of looking at this - with current Decodense, how would one know what the nature of an IBO referred to by bond partitioning is? By nature, I refer to characteristics such as lone pair vs 2-center bond vs 3+ center bond vs core, the s,p,d composition of the bond and the polarity of the bond. A solution is for the Decodense result to be a tuple, with the second element of the tuple being the IAOIBO coefficient matrix (with same IBO ordering), and the third element being a vector of IAO descriptors (same order as in the IAOIBO coefficient matrix). Equipped with this tuple, a user may programmatically determine the nature of IBOs. The context is automated inspection of the results of many Decodense runs. Visual inspection of the IBOs is not useful.

If this tuple is made available, it opens another opportunity, being the provision of a module that supplies a lightweight bonding analysis of the tuple, so that the user doesn't have to write their own This might take the form of a dict for LPs, a dict for 2-c bonds and a dict for 3+ c bonds. The first two require a unique key, are there are schemes to arrive at this uniqueness. For example, given multiple bonds between 2 atoms, the s-rich bond might have a key (atom1id,atom2id,0) and the p bonds number from 1 upwards in order of polarity. Some code attached.
iaoibo_util.py.txt
iaoibo.py.txt

Update: looking at the decodense code, I didn't notice a place where the order of IBOs was changed in the course of computing orbital energies, with the possible exception of a sort when ndo is true (what is NDO?).
If the order of IBOs in output isn't different from that of the IBO mo_coeff that is supplied as the fourth parameter to decodense main, then all of the above can be accomplished without change to decodense.
For example for restricted wf, the input IBOs are ordered in the same way in the output alpha spin set, then again in the beta spin set. So, this issue is resolved with answers to two questions, and provision of one guarantee:
Is it the case that the output IBO order follows the input IBO order?
What is NDO and does it change the output IBO order?
The sought guarantee - that output IBO order follows input IBO order, and if not that the means be provided to change the output order to the input order, such as by providing a column in the result dataframe that gives the input IBO index.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions