qmcpack/nexus/examples/quantum_package/02_o2_selci
Paul Kent 6d052c0d26 Require Python3 2020-01-08 12:52:22 -05:00
..
O2.xyz nexus: add workshop examples 2019-11-08 16:06:05 -05:00
README.rst Require Python3 2020-01-08 12:52:22 -05:00
o2_selci.py nexus: all tests pass with python 3 2019-11-21 13:48:45 -05:00

README.rst

Nexus QP+QMCPACK Example 2: Oxygen dimer (selected-CI)
======================================================

In this example, we show how to run selected-CI (CIPSI) calculations 
with Quantum Package via Nexus for an all-electron spin-polarized 
oxygen dimer.  The steps performed by Nexus in this example are:

1. Hartree-Fock calculation with QP
2. Selected-CI based on HF with QP
3. Generation of selected-CI natural orbitals with QP
4. Selected-CI based on the natural orbitals with QP

The Nexus script for this example is ``o2_selci.py``.  The contents of 
the script are shown below:


.. code-block:: python

    #! /usr/bin/env python3
    
    from nexus import settings,job,run_project
    from nexus import generate_physical_system
    from nexus import generate_quantum_package
    
    # note: you must source the QP config file before running this script
    #   source /home/ubuntu/apps/qp2/quantum_package.rc
    
    settings(
        results       = '',
        status_only   = 0,
        generate_only = 0,
        sleep         = 3,
        machine       = 'ws16',
        qprc          = '/home/ubuntu/apps/qp2/quantum_package.rc',
        )
    
    # define run details
    qp_job = job(cores=16,threads=16)
    
    # read in structure for oxygen dimer
    dimer = generate_physical_system(
        structure = './O2.xyz',
        net_spin  = 2,           # nup-ndown=2
        )
    
    # path, job, system details are shared across runs
    qp_shared = dict(
        path   = 'O_dimer_selected_CI',
        job    = qp_job,
        system = dimer,
        prefix = 'fci', # single shared ezfio, rsync if different
        )
    
    # run Hartree-Fock
    scf = generate_quantum_package(
        identifier            = 'scf',
        run_type              = 'scf',
        ao_basis              = 'aug-cc-pvdz',
        io_ao_two_e_integrals = 'Write', # write 2e integrals
        four_idx_transform    = True,    # compute 2e integrals
        **qp_shared
        )
    
    # initial selected CI run
    fci0 = generate_quantum_package(
        identifier         = 'fci0',
        run_type           = 'fci',
        n_det_max          = 5000, # max determinant count
        save_natorb        = True, # write natural orbitals
        four_idx_transform = True, # compute 2e integrals
        dependencies       = (scf,'other'),
        **qp_shared
        )
    
    # final selected CI based on natural orbitals
    fci = generate_quantum_package(
        identifier    = 'fci',
        run_type      = 'fci',
        n_det_max     = 5000,
        dependencies  = (fci0,'other'),
        **qp_shared
        )
    
    run_project()

In the script above, as before, we are reading the structure from an xyz 
file.  The net spin of the system (number of up minus number of down 
electrons) is set to ``2`` in ``generate_physical_system``.  Most of the 
QP runs share some details, so we store these in a Python ``dict`` called 
``qp_shared`` which is reused in each QP run (see ``**qp_shared``). In 
the HF run, we request that the two electron integrals be computed and 
stored, which is important for the following selected CI run (which is 
denoted confusingly as ``fci`` in QP).  For the selected-CI we use 
a determinant count threshold of 5000.  The selected-CI calculation will 
terminate once this threshold is exceeded.  The request to compute the 
natural orbitals is found where ``save_natorb=True`` and the two electron 
integrals are again recomputed.  Finally, selected-CI is performed based 
on the natural orbitals.

Now let's run the Nexus script and see how these steps are executed:

.. code-block:: bash

    >source /home/ubuntu/apps/qp2/quantum_package.rc

    >./o2_selci.py

    ...
    
    starting runs:
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    elapsed time 0.0 s  memory 101.89 MB 
      ...
      Entering ./runs/O_dimer_selected_CI 0 
        Executing:  
          export OMP_NUM_THREADS=16
          
          source /home/ubuntu/apps/qp2/quantum_package.rc
          
          mpirun -np 1 qp_run scf fci.ezfio >scf.out 2>scf.err
          
          echo "Write" > fci.ezfio/mo_two_e_ints/io_mo_two_e_integrals
          qp_run four_idx_transform fci.ezfio >scf_fit.out 2>scf_fit.err
    ...
    elapsed time 12.4 s  memory 101.98 MB 
      ...
      Entering ./runs/O_dimer_selected_CI 1 
        Executing:  
          export OMP_NUM_THREADS=16
          
          source /home/ubuntu/apps/qp2/quantum_package.rc
          
          mpirun -np 1 qp_run fci fci.ezfio >fci0.out 2>fci0.err
          
          qp_run save_natorb fci.ezfio >fci0_natorb.out 2>fci0_natorb.err
          
          echo "Write" > fci.ezfio/mo_two_e_ints/io_mo_two_e_integrals
          qp_run four_idx_transform fci.ezfio >fci0_fit.out 2>fci0_fit.err
    ...
    elapsed time 33.6 s  memory 101.98 MB 
      ...
      Entering ./runs/O_dimer_selected_CI 2 
        Executing:  
          export OMP_NUM_THREADS=16
          
          source /home/ubuntu/apps/qp2/quantum_package.rc
          
          mpirun -np 1 qp_run fci fci.ezfio 
    ...
    elapsed time 45.8 s  memory 101.98 MB 
    Project finished

You should obtain variational energies similar to the following for HF, 
CIPSI\@HF and CIPSI\@NO:

.. code-block:: bash

    >grep SCF runs/O_dimer_selected_CI/scf.out 
    
    * SCF energy         -149.6199872983760    
    
    >grep 'E               =' runs/O_dimer_selected_CI/fci0.out | tail -n1
    
     E               =   -149.96976111218555     
    
    >grep 'E               =' runs/O_dimer_selected_CI/fci.out | tail -n1
    
     E               =   -149.98213334936918     

With PT2 corrections, better (but non-variational) estimates of the ground 
state energy within this basis can be obtained:

.. code-block:: bash

    >grep 'E+PT2            =' runs/O_dimer_selected_CI/fci0.out | tail -n1
    
     E+PT2            =   -150.02457005565802       +/-    1.7052281470379021E-004
    
    >grep 'E+PT2            =' runs/O_dimer_selected_CI/fci.out | tail -n1
    
     E+PT2            =   -150.02759522657587       +/-    7.0329356682808259E-005

The only significant change to this example that is needed to obtain 
production level results is to perform a series of calculations with 
increasing maximum determinant counts until convergence is reached.

In the next example, we return to the water molecule and add the necessary 
steps to perform VMC and DMC with QMCPACK.