Implementing LC-BLYP

Dear all,
I am trying to reproduce some results obtained with the CAM-BLYP functional, but with varied parameters. As far as I know, this is not available currently (I only found CAMY-B1LYP). So I see two ways to work around this:

  1. Go into source code and define it --> if there is interest, I can do it but since I am new to Psi4, it is not my first choise

  2. Define it via core.SuperFunctional in the input, similar to the last example.
    However, I am not sure if I understand the options correctly: In the example, they use a global mixing of pbe_x.set_alpha(0.75) DFT-exchange and sup.set_x_alpha(0.25) HF-exchange (at least, I understand it this way).
    But if I introcuce the range separation, should I set pbe_x.set_alpha(0.) (because I don’t have a global DFT-exchange in my example) and just add the option sup.set_x_omega(0.3) ?
    (or do I need the set_x_beta() option as well?) All combinations I tried so far lead to terrible energies.

More fundamental (but connected) is the question: Where should I seek for such answers as “What is the meaning of this or that option”? or “which options are available using e.g. the superfunctional”? (Currently I mainly work with the manual, which is great but only to some level of details).

Thank you very much,
Tobias

check here: http://psicode.org/psi4manual/master/psi4api.html#psi4.core.SuperFunctional

also did you check the non-libxc functionals in the driver (e.g. wpbe0): https://github.com/psi4/psi4/tree/master/psi4/driver/procrouting/dft_funcs

edit: I am also adding some functionals currently: https://github.com/psi4/psi4/pull/877

Hi hokru,
thank you very much; these links helped me very much; especially the first one is exactly, what I was looking for.

However, not all functions seem to have a doc-string; set_alpha() for example does not. And I am not sure I use it correcly:
I want a global LYP-correlation,
for exchange a global HF-amount of 0.3 and asymptotically pure HF-exchange and as DFT-exchange 0.3 of B88.
So I set my superfunctional to

def mod_lcblyp(name, npoints, deriv, restricted):

    # Build a empty superfunctional
    sup = core.SuperFunctional.blank()

    # Name the functional and provide a description
    sup.set_name('awLCBLYP')
    sup.set_description('    LC-BLYP Hyb-GGA Exchange-Correlation Functional\n')

    # Set the correlation functional
    sup.add_c_functional(core.LibXCFunctional('XC_GGA_C_LYP', restricted))

    b_x = core.LibXCFunctional('XC_GGA_X_B88', restricted)
    b_x.set_alpha(0.70)

    sup.add_x_functional(b_x)
    #Set exchange functional ( static + long-range contribution)

    # set the parameters for S7:
    sup.set_x_alpha(0.30)
    sup.set_x_beta(1.00)
    sup.set_x_omega(0.19)

    return sup

but the energies are still far off the reference. Is it wrong to set b_x.set_alpha() to 0.70 ?

It’s probably a bit confusing without docs, but alpha is the amount of “global” exchange throughout the whole system while beta is the amount of LR exchange. If you would like 100% LR exchange you should set the x_beta to 0.7 as currently you have 130% exact exchange at long-range.

If you are so inclined, a PR enhancing the documentation would be much appreciated. Where the docs can be found here:

Mixing code here:

ah, ok; I see. So alpha+beta=1 makes usually much sense :-).

But what does the parameter b_x.set_alpha() mean? In my point of view, I have set everything by sup.x_x_* ?
From the other superfunctionals ( defined in the source-code), I got the impression that usually the b_x.set_alpha() is used to set the amount of DFT-exchange (thus similar as sup.set_x_beta()) but when I set both to 0.7 in my example, the energies are still wrong. (and just not setting beta doesn’t make things better).
Can you point me, how this should be used?

PS:
I’ve started preparing a PR with documentation; I will submit it as soon as I understand the parameters myself.

For LC-BLYP, I think you need the screened B88 (wB88 or however you want to name it)
In libxc i found:

xc_funcs.h:#define  XC_GGA_X_HJS_B88               527  /*HJS screened exchange B88 version
xc_funcs.h:#define  XC_GGA_X_HJS_B88_V2             46  /*HJS screened exchange corrected B88 version

I have decoupled all components in the interface so that b_x.set_alpha() will only modify the percentage of the functional added. If you want 100% exchange the sum of the exchange functional percentages and then exact exchange percentages should equal 1. So if you have 70% exact exchange (0.7) you would want 30% (0.3) DFT exchange.