pyscf / gpu4pyscf

A plugin to use Nvidia GPU in PySCF package
GNU General Public License v3.0
104 stars 18 forks source link

wB97m-D3BJ #95

Open sef43 opened 5 months ago

sef43 commented 5 months ago

Hello,

is it possible to use the functional wB97m-D3BJ in gpu4pyscf?

It is wB97m-V with the VV10 replaced with D3(BJ). https://pubs.acs.org/doi/abs/10.1021/acs.jctc.8b00842

It is available in PSI4 but I would like to use PySCF for the GPU acceleration

wxj6000 commented 5 months ago

Yes, it is possible. There will some script to work around the xc functional names. In libXC, there is only one functional for wb97m-v, which includes VV10. But the name wb97m-v is not available in dftd3. Here is the script to replace VV10 with D3(BJ).

import numpy as np
import cupy
import pyscf
from pyscf import lib
from gpu4pyscf.dft import rks, libxc
lib.num_threads(8)

atom = '''
O       0.0000000000    -0.0000000000     0.1174000000
H      -0.7570000000    -0.0000000000    -0.4696000000
H       0.7570000000     0.0000000000    -0.4696000000
'''

xc = 'wb97m-v'
bas = 'def2-tzvpp'
scf_tol = 1e-10
max_scf_cycles = 50
grids_level = 5

mol = pyscf.M(atom=atom, basis=bas)

mol.verbose = 3
mf = rks.RKS(mol, xc=xc).density_fit()

# turn off nonlocal correction
mf.nlc = None
mf._numint.libxc.is_nlc = lambda x: False
mf.grids.level = grids_level
mf.grids.atom_grid = (99,590)
mf.conv_tol = scf_tol
mf.max_cycle = max_scf_cycles
e_dft = mf.kernel()

# calculate dispersion correction
from gpu4pyscf.lib import dftd3
dftd3_model = dftd3.DFTD3Dispersion(mol, xc='wb97m', version='d3bj')
e_disp = res = dftd3_model.get_dispersion()['energy']
e_tot = e_dft + e_disp

print(f"total energy = {e_tot}")
sef43 commented 5 months ago

thank you very much for the clear example! I will try it out

sef43 commented 1 week ago

Hello. I only now got around to trying this. I have used the new syntax I found in the example: https://github.com/pyscf/gpu4pyscf/blob/master/examples/01-h2o_with_dispersion.py

I get an error when computing the gradient. How do I also compute the gradient with the D3bj?

here is the error:

Traceback (most recent call last):
  File "run_test.py", line 36, in <module>
    g_dft = g.kernel()
            ^^^^^^^^^^
  File "/scratch/users/sfarr/miniconda3/envs/gpu4pyscf_new/lib/python3.11/site-packages/pyscf/grad/rhf.py", line 415, in kernel
    de = self.grad_elec(mo_energy, mo_coeff, mo_occ, atmlst)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/scratch/users/sfarr/miniconda3/envs/gpu4pyscf_new/lib/python3.11/site-packages/gpu4pyscf/grad/rhf.py", line 523, in grad_elec
    dvhf = mf_grad.get_veff(mol, dm0)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/scratch/users/sfarr/miniconda3/envs/gpu4pyscf_new/lib/python3.11/site-packages/gpu4pyscf/df/grad/rks.py", line 55, in get_veff
    raise NotImplementedError
NotImplementedError

and here is my script:

import numpy as np
import pyscf
from gpu4pyscf.dft import rks

atom ='''
O       0.0000000000    -0.0000000000     0.1174000000
H      -0.7570000000    -0.0000000000    -0.4696000000
H       0.7570000000     0.0000000000    -0.4696000000
'''

mol = pyscf.M(
    atom=atom,                         # water molecule
    basis='def2-tzvppd',                # basis set
    verbose=1                          # control the level of print info
    )

mf_GPU = rks.RKS(                      # restricted Kohn-Sham DFT
    mol,                               # pyscf.gto.object
    xc='wB97m-V'                         # xc funtionals, such as pbe0, wb97m-v, tpss,
    ).density_fit()                    # density fitting

# turn off nlc
mf_GPU.nlc = None
mf_GPU._numint.libxc.is_nlc = lambda x: False

mf_GPU.disp = 'd3bj'

# Compute Energy
e_dft = mf_GPU.kernel()
print(f"total energy = {e_dft}")

# Compute Gradient
g = mf_GPU.nuc_grad_method()
g_dft = g.kernel()
print(g_dft)

Thank you

sef43 commented 1 week ago

can now be done with:

mf_GPU = rks.RKS(                     
    mol,                               
    xc='wB97m-d3bj'                        
    ).density_fit() 

thank you @wxj6000

wxj6000 commented 1 week ago

@sef43 Yes, PySCF v2.6 and GPU4PySCF v0.8 support RKS(mol, xc='wb97m-d3bj'). I deleted the comment before because I am planning to do more tests. I will add more unit tests for the new features.

wxj6000 commented 5 days ago

https://github.com/pyscf/gpu4pyscf/pull/173 The PR mentioned above.