Fetching contributors…
Cannot retrieve contributors at this time
90 lines (62 sloc) 2.8 KB
This file contains a step-by-step instructions of how to integrate libefp into
an existing quantum chemistry package to get a working QM/EFP interface.
1. Initialization
a. Print the libefp banner: efp_print_banner
b. Create a EFP object: efp_create
c. Setup your EFP options: efp_set_opts
d. Load EFP parameters from ".efp" files: efp_add_potential
e. Add your EFP fragments: efp_add_fragment
f. Setup a callback function which computes electric field from
ab initio electrons: efp_set_electron_density_field_fn
g. (optional)
Setup a callback function to get better error
messages: efp_set_error_log
h. Call efp_prepare
i. (optional, EFP-only)
Setup periodic box size. If you have enabled periodic
boundary conditions (options.enable_pbc = true), you should
call efp_set_periodic_box
2. Optimization or molecular dynamics step
a. Set new fragment coordinates: efp_set_coordinates
b. Update ab initio nuclei: efp_set_point_charges
2.1 Ab initio SCF cycle
a. Start SCF cycle as usual
b. Compute one-electron EFP contributions
To compute one-electron contributions to quantum mechanical
Hamiltonian you will need multipole moment integrals as well as
electrostatics from EFP subsystem.
To get the electrostatics use the following functions:
atom charges from EFP fragments:
multipoles from EFP electrostatics:
polarization induced dipoles:
polarization conjugate induced dipoles:
To compute QM/EFP interaction with induced dipoles use the
average of induced dipoles and conjugate induced dipoles
c. Compute wavefunction-dependent energy
Because EFP polarization induced dipoles depend on the electric
field from the wavefunction you have to converge them together.
To compute wavefunction-dependent terms use:
d. Add obtained wavefunction dependent energy to your SCF energy
e. Go to step 2.1.a until SCF convergence criteria are met
2.2 Compute EFP energy and gradients
a. Compute all EFP energy terms: efp_compute
2.3 Geometry update
a. Get EFP energy: efp_get_energy
Do not forget to subtract wavefunction dependent energy you have
already added to your SCF energy from the total EFP energy
b. Get gradient on EFP fragments: efp_get_gradient
c. Get EFP gradient on ab initio nuclei: efp_get_point_charge_gradient
d. Update system geometry
Update all coordinates of your ab initio part and EFP fragments
according to you optimization or molecular dynamics algorithm
e. Go to the beginning of step 2
3. Cleanup resources
a. Release all memory used by libefp: efp_shutdown
4. Misc
Depending on your setup you may need to define LIBEFP_FORTRAN_INT64
if you have 64-bit integers in Fortran/BLAS by default.