Geometry OptimizationΒΆ

We present here a complete example on how to use QMCTorch to optimize the geometry of a H2 molecule. As previously the firs task is to import all the modules needed

[1]:
from torch import optim
from torch.optim import Adam
from qmctorch.wavefunction import SlaterJastrow
from qmctorch.solver import Solver
from qmctorch.sampler import Metropolis
from qmctorch.scf import Molecule
from qmctorch.utils import plot_energy
from qmctorch.utils import set_torch_double_precision
set_torch_double_precision()
INFO:QMCTorch|  ____    __  ______________             _
INFO:QMCTorch| / __ \  /  |/  / ___/_  __/__  ________/ /
INFO:QMCTorch|/ /_/ / / /|_/ / /__  / / / _ \/ __/ __/ _ \
INFO:QMCTorch|\___\_\/_/  /_/\___/ /_/  \___/_/  \__/_//_/

We then define the molecule. We create a H2 molecule with a short atomic distance that we will then try to relax

[2]:
mol = Molecule(atom = 'H 0. 0. -0.5; H 0. 0. 0.5', unit='bohr',
               calculator='pyscf', basis='sto-3g', redo_scf=True)
INFO:QMCTorch|
INFO:QMCTorch| SCF Calculation
INFO:QMCTorch|  Removing H2_pyscf_sto-3g.hdf5 and redo SCF calculations
INFO:QMCTorch|  Running scf  calculation
converged SCF energy = -1.06599946214331
INFO:QMCTorch|  Molecule name       : H2
INFO:QMCTorch|  Number of electrons : 2
INFO:QMCTorch|  SCF calculator      : pyscf
INFO:QMCTorch|  Basis set           : sto-3g
INFO:QMCTorch|  SCF                 : HF
INFO:QMCTorch|  Number of AOs       : 2
INFO:QMCTorch|  Number of MOs       : 2
INFO:QMCTorch|  SCF Energy          : -1.066 Hartree

As for the wave function optimization example we need to define a wave function, a sampler an optimizer and a solver.

[3]:
# wave function with only the ground state determinant
wf = SlaterJastrow(mol, configs='single_double(2,2)').gto2sto()

# sampler
sampler = Metropolis(nwalkers=1000, nstep=200, step_size=0.5,
                     nelec=wf.nelec, ndim=wf.ndim,
                     ntherm=-1, ndecor=100,
                     init=mol.domain('normal'),
                     move={'type': 'all-elec', 'proba': 'normal'})
# optimizer
opt = Adam(wf.parameters(), lr=0.005)

# scheduler
scheduler = optim.lr_scheduler.StepLR(opt, step_size=20, gamma=0.75)
INFO:QMCTorch|
INFO:QMCTorch| Wave Function
INFO:QMCTorch|  Jastrow factor      : True
INFO:QMCTorch|  Jastrow kernel      : PadeJastrowKernel
INFO:QMCTorch|  Highest MO included : 2
INFO:QMCTorch|  Configurations      : single_double(2,2)
INFO:QMCTorch|  Number of confs     : 4
INFO:QMCTorch|  Kinetic energy      : jacobi
INFO:QMCTorch|  Number var  param   : 21
INFO:QMCTorch|  Cuda support        : False
INFO:QMCTorch|  Fit GTOs to STOs  :
INFO:QMCTorch|
INFO:QMCTorch| Wave Function
INFO:QMCTorch|  Jastrow factor      : True
INFO:QMCTorch|  Jastrow kernel      : PadeJastrowKernel
INFO:QMCTorch|  Highest MO included : 2
INFO:QMCTorch|  Configurations      : single_double(2,2)
INFO:QMCTorch|  Number of confs     : 4
INFO:QMCTorch|  Kinetic energy      : jacobi
INFO:QMCTorch|  Number var  param   : 17
INFO:QMCTorch|  Cuda support        : False
INFO:QMCTorch|
INFO:QMCTorch| Monte-Carlo Sampler
INFO:QMCTorch|  Number of walkers   : 1000
INFO:QMCTorch|  Number of steps     : 200
INFO:QMCTorch|  Step size           : 0.5
INFO:QMCTorch|  Thermalization steps: -1
INFO:QMCTorch|  Decorelation steps  : 100
INFO:QMCTorch|  Walkers init pos    : normal
INFO:QMCTorch|  Move type           : all-elec
INFO:QMCTorch|  Move proba          : normal
[4]:
solver = Solver(wf=wf,
                       sampler=sampler,
                       optimizer=opt,
                       scheduler=None)
solver.configure(loss='energy', grad='auto', track=['local_energy','geometry'], freeze = ['ao'])
INFO:QMCTorch|
INFO:QMCTorch| Warning : dump to hdf5
INFO:QMCTorch| Object Solver already exists in H2_pyscf_sto-3g_QMCTorch.hdf5
INFO:QMCTorch| Object name changed to SolverSlaterJastrow_9
INFO:QMCTorch|
INFO:QMCTorch|
INFO:QMCTorch| QMC Solver
INFO:QMCTorch|  WaveFunction        : SlaterJastrow
INFO:QMCTorch|  Sampler             : Metropolis
INFO:QMCTorch|  Optimizer           : Adam

Note that we must set grad='auto' to perform a geometry optimization. To optimize the geometry of the molecule we must use the set_params_requires_grad method of the solver. We here set all the wave function parameters and all the atomic positions as variational parameters, leading to a simultaneous optimization of the wave function and of the atomic coordinates. We can then run the optimization here using 50 epochs

[5]:
solver.set_params_requires_grad(wf_params=False, geo_params=True)
obs = solver.run(50)

INFO:QMCTorch|
INFO:QMCTorch|  Optimization
INFO:QMCTorch|  Task                :
INFO:QMCTorch|  Number Parameters   : 6
INFO:QMCTorch|  Number of epoch     : 50
INFO:QMCTorch|  Batch size          : 1000
INFO:QMCTorch|  Loss function       : energy
INFO:QMCTorch|  Clip Loss           : False
INFO:QMCTorch|  Gradients           : auto
INFO:QMCTorch|  Resampling mode     : update
INFO:QMCTorch|  Resampling every    : 1
INFO:QMCTorch|  Resampling steps    : 25
INFO:QMCTorch|  Output file         : H2_pyscf_sto-3g_QMCTorch.hdf5
INFO:QMCTorch|  Checkpoint every    : None
INFO:QMCTorch|
INFO:QMCTorch|
INFO:QMCTorch|  epoch 0
INFO:QMCTorch|  energy   : -1.070846 +/- 0.012322
INFO:QMCTorch|  variance : 0.389654
INFO:QMCTorch|  epoch done in 0.09 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 1
INFO:QMCTorch|  energy   : -1.093524 +/- 0.012193
INFO:QMCTorch|  variance : 0.385562
INFO:QMCTorch|  epoch done in 0.09 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 2
INFO:QMCTorch|  energy   : -1.085855 +/- 0.011676
INFO:QMCTorch|  variance : 0.369217
INFO:QMCTorch|  epoch done in 0.12 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 3
INFO:QMCTorch|  energy   : -1.095264 +/- 0.011571
INFO:QMCTorch|  variance : 0.365905
INFO:QMCTorch|  epoch done in 0.10 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 4
INFO:QMCTorch|  energy   : -1.078411 +/- 0.010946
INFO:QMCTorch|  variance : 0.346155
INFO:QMCTorch|  epoch done in 0.34 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 5
INFO:QMCTorch|  energy   : -1.073701 +/- 0.011750
INFO:QMCTorch|  variance : 0.371554
INFO:QMCTorch|  epoch done in 0.35 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 6
INFO:QMCTorch|  energy   : -1.083239 +/- 0.011441
INFO:QMCTorch|  variance : 0.361785
INFO:QMCTorch|  epoch done in 0.10 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 7
INFO:QMCTorch|  energy   : -1.091864 +/- 0.011191
INFO:QMCTorch|  variance : 0.353902
INFO:QMCTorch|  epoch done in 0.13 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 8
INFO:QMCTorch|  energy   : -1.112321 +/- 0.010893
INFO:QMCTorch|  variance : 0.344459
INFO:QMCTorch|  epoch done in 0.10 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 9
INFO:QMCTorch|  energy   : -1.101314 +/- 0.011203
INFO:QMCTorch|  variance : 0.354284
INFO:QMCTorch|  epoch done in 0.09 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 10
INFO:QMCTorch|  energy   : -1.095483 +/- 0.011385
INFO:QMCTorch|  variance : 0.360013
INFO:QMCTorch|  epoch done in 0.12 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 11
INFO:QMCTorch|  energy   : -1.120974 +/- 0.010508
INFO:QMCTorch|  variance : 0.332293
INFO:QMCTorch|  epoch done in 0.10 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 12
INFO:QMCTorch|  energy   : -1.116147 +/- 0.010295
INFO:QMCTorch|  variance : 0.325555
INFO:QMCTorch|  epoch done in 0.12 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 13
INFO:QMCTorch|  energy   : -1.090706 +/- 0.011097
INFO:QMCTorch|  variance : 0.350910
INFO:QMCTorch|  epoch done in 0.10 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 14
INFO:QMCTorch|  energy   : -1.106975 +/- 0.010232
INFO:QMCTorch|  variance : 0.323554
INFO:QMCTorch|  epoch done in 0.09 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 15
INFO:QMCTorch|  energy   : -1.114616 +/- 0.010598
INFO:QMCTorch|  variance : 0.335125
INFO:QMCTorch|  epoch done in 0.11 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 16
INFO:QMCTorch|  energy   : -1.120063 +/- 0.009871
INFO:QMCTorch|  variance : 0.312143
INFO:QMCTorch|  epoch done in 0.10 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 17
INFO:QMCTorch|  energy   : -1.126814 +/- 0.010350
INFO:QMCTorch|  variance : 0.327289
INFO:QMCTorch|  epoch done in 0.11 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 18
INFO:QMCTorch|  energy   : -1.110957 +/- 0.009913
INFO:QMCTorch|  variance : 0.313466
INFO:QMCTorch|  epoch done in 0.10 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 19
INFO:QMCTorch|  energy   : -1.135297 +/- 0.009999
INFO:QMCTorch|  variance : 0.316206
INFO:QMCTorch|  epoch done in 0.10 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 20
INFO:QMCTorch|  energy   : -1.126248 +/- 0.010025
INFO:QMCTorch|  variance : 0.317012
INFO:QMCTorch|  epoch done in 0.13 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 21
INFO:QMCTorch|  energy   : -1.119559 +/- 0.010067
INFO:QMCTorch|  variance : 0.318341
INFO:QMCTorch|  epoch done in 0.10 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 22
INFO:QMCTorch|  energy   : -1.114980 +/- 0.009557
INFO:QMCTorch|  variance : 0.302212
INFO:QMCTorch|  epoch done in 0.11 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 23
INFO:QMCTorch|  energy   : -1.122430 +/- 0.010054
INFO:QMCTorch|  variance : 0.317943
INFO:QMCTorch|  epoch done in 0.09 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 24
INFO:QMCTorch|  energy   : -1.122087 +/- 0.009651
INFO:QMCTorch|  variance : 0.305191
INFO:QMCTorch|  epoch done in 0.11 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 25
INFO:QMCTorch|  energy   : -1.133653 +/- 0.009697
INFO:QMCTorch|  variance : 0.306655
INFO:QMCTorch|  epoch done in 0.10 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 26
INFO:QMCTorch|  energy   : -1.153086 +/- 0.009464
INFO:QMCTorch|  variance : 0.299277
INFO:QMCTorch|  epoch done in 0.09 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 27
INFO:QMCTorch|  energy   : -1.137196 +/- 0.009235
INFO:QMCTorch|  variance : 0.292042
INFO:QMCTorch|  epoch done in 0.11 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 28
INFO:QMCTorch|  energy   : -1.134850 +/- 0.009741
INFO:QMCTorch|  variance : 0.308045
INFO:QMCTorch|  epoch done in 0.09 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 29
INFO:QMCTorch|  energy   : -1.137292 +/- 0.008938
INFO:QMCTorch|  variance : 0.282648
INFO:QMCTorch|  epoch done in 0.11 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 30
INFO:QMCTorch|  energy   : -1.129972 +/- 0.009542
INFO:QMCTorch|  variance : 0.301736
INFO:QMCTorch|  epoch done in 0.09 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 31
INFO:QMCTorch|  energy   : -1.129879 +/- 0.008805
INFO:QMCTorch|  variance : 0.278450
INFO:QMCTorch|  epoch done in 0.09 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 32
INFO:QMCTorch|  energy   : -1.120897 +/- 0.009573
INFO:QMCTorch|  variance : 0.302713
INFO:QMCTorch|  epoch done in 0.11 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 33
INFO:QMCTorch|  energy   : -1.126543 +/- 0.008883
INFO:QMCTorch|  variance : 0.280912
INFO:QMCTorch|  epoch done in 0.09 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 34
INFO:QMCTorch|  energy   : -1.125339 +/- 0.009391
INFO:QMCTorch|  variance : 0.296973
INFO:QMCTorch|  epoch done in 0.11 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 35
INFO:QMCTorch|  energy   : -1.132248 +/- 0.009047
INFO:QMCTorch|  variance : 0.286092
INFO:QMCTorch|  epoch done in 0.11 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 36
INFO:QMCTorch|  energy   : -1.143987 +/- 0.008693
INFO:QMCTorch|  variance : 0.274895
INFO:QMCTorch|  epoch done in 0.09 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 37
INFO:QMCTorch|  energy   : -1.143939 +/- 0.009039
INFO:QMCTorch|  variance : 0.285829
INFO:QMCTorch|  epoch done in 0.11 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 38
INFO:QMCTorch|  energy   : -1.132018 +/- 0.008930
INFO:QMCTorch|  variance : 0.282378
INFO:QMCTorch|  epoch done in 0.10 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 39
INFO:QMCTorch|  energy   : -1.135228 +/- 0.008902
INFO:QMCTorch|  variance : 0.281495
INFO:QMCTorch|  epoch done in 0.11 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 40
INFO:QMCTorch|  energy   : -1.146552 +/- 0.009092
INFO:QMCTorch|  variance : 0.287503
INFO:QMCTorch|  epoch done in 0.10 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 41
INFO:QMCTorch|  energy   : -1.141178 +/- 0.008888
INFO:QMCTorch|  variance : 0.281070
INFO:QMCTorch|  epoch done in 0.10 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 42
INFO:QMCTorch|  energy   : -1.133022 +/- 0.009063
INFO:QMCTorch|  variance : 0.286591
INFO:QMCTorch|  epoch done in 0.11 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 43
INFO:QMCTorch|  energy   : -1.133298 +/- 0.008375
INFO:QMCTorch|  variance : 0.264828
INFO:QMCTorch|  epoch done in 0.23 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 44
INFO:QMCTorch|  energy   : -1.135157 +/- 0.008890
INFO:QMCTorch|  variance : 0.281116
INFO:QMCTorch|  epoch done in 0.38 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 45
INFO:QMCTorch|  energy   : -1.143128 +/- 0.008901
INFO:QMCTorch|  variance : 0.281471
INFO:QMCTorch|  epoch done in 0.09 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 46
INFO:QMCTorch|  energy   : -1.148810 +/- 0.008243
INFO:QMCTorch|  variance : 0.260676
INFO:QMCTorch|  epoch done in 0.12 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 47
INFO:QMCTorch|  energy   : -1.143023 +/- 0.008719
INFO:QMCTorch|  variance : 0.275712
INFO:QMCTorch|  epoch done in 0.28 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 48
INFO:QMCTorch|  energy   : -1.154847 +/- 0.008289
INFO:QMCTorch|  variance : 0.262111
INFO:QMCTorch|  epoch done in 0.33 sec.
INFO:QMCTorch|
INFO:QMCTorch|  epoch 49
INFO:QMCTorch|  energy   : -1.140911 +/- 0.008209
INFO:QMCTorch|  variance : 0.259583
INFO:QMCTorch|  epoch done in 0.24 sec.
INFO:QMCTorch|
INFO:QMCTorch| Warning : dump to hdf5
INFO:QMCTorch| Object wf_opt already exists in H2_pyscf_sto-3g_QMCTorch.hdf5
INFO:QMCTorch| Object name changed to wf_opt_5
INFO:QMCTorch|
[6]:
solver.save_traj('h2_traj.xyz', obs)
[8]:
plot_energy(obs.local_energy)
../_images/notebooks_geoopt_10_0.png
[ ]: