PSI4 + ASE: Example#
Here, we demonstrate the non-interactive usage of the ASE image recipe.
Running ASE with PSI4 Interface Non-interactively#
First, let’s create a temporary folder, temp
in your home directory
and cd
to it
mkdir ~/temp && cd ~/temp
Use your favorite text editor to create a new input file. Let’s call it test.inp and copy-paste the following code block into it and then, save it.
from ase.calculators.psi4 import Psi4
from ase.build import molecule
import numpy as np
atoms = molecule('H2O')
calc = Psi4(atoms = atoms,
method = 'b3lyp',
memory = '500MB',
basis = '6-311g_d_p_')
atoms.calc = calc
print(atoms.get_potential_energy())
print(atoms.get_forces())
calc.psi4.frequency('scf/cc-pvdz', molecule=calc.molecule,
return_wfn=True, dertype=1)
This input file creates a PSI4 ASE calculator and stores it in the ASE’s atoms
object’s calc
attribute. The calculator object allows us to interact with PSI4’s
Python API and calculate/fetch molecular properties of interest such as the total
energy, forces and harmonic vibrational frequencies.
At this stage, the content of your directory should look like the following
temp
└── test.inp
Let’s copy the docker run command from the catalog, paste it into your terminal and edit it to look like the following command line
docker run --rm -w /home -v $(pwd):/home molssi/psi4v180-mamba141-ase322:latest /bin/bash -c "python test.inp"
then press Enter. If nothing goes wrong, you should see the following lines in your terminal
Memory set to 476.837 MiB by Python driver.
Threads set to 1 by Python driver.
-2080.2391023908526
[[-1.88550753e-12 1.76004985e-11 -3.58274965e-01]
[ 4.19563185e-15 -2.87785885e-01 1.78901243e-01]
[-1.09633122e-14 2.87785885e-01 1.78901243e-01]]
Warning: used thermodynamics relations inappropriate for low-frequency modes: ['586.9508' '596.8722' '615.0969']
The first and second lines in the output notify us about the program’s resource usage. The third line is the total energy of our system in electron-Volt (eV). The next three lines within brackets are the elements of our force matrix. The harmonic vibrational frequencies are shown in the final output line.
Note
The same Docker image recipe can also be used with Apptainer (Singularity) to obtain the same result via the following command
apptainer exec docker://molssi/psi4v180-mamba141-ase322:latest python test.inp
Note that Apptainer binds /home/$USER
, /tmp
and current working directory ($PWD
)
from the host system to the running container by default. For further details see the Apptainer
documentation.
Note
You can store the generated output in a separate output file by changing the command as follows
docker run --rm -w /home -v $(pwd):/home molssi/psi4v180-mamba141-ase322:latest /bin/bash -c "python test.inp >> test.out"
or
apptainer exec docker://molssi/psi4v180-mamba141-ase322:latest python test.inp >> test.out
Caution
By default, ASE will store the temporary files for PSI4 in /tmp
within the container filesystem.
However, because of the --rm
flag in our run command, our container is going to auto-delete itself
once its work is finished. In order to retain the temporary scratch files that psi4 creates, add the following
export bash command to your docker/apptainer run command as shown below
docker run --rm -w /home -v $(pwd):/home molssi/psi4v180-mamba141-ase322:latest /bin/bash -c "export PSI_SCRATCH=/home && python test.inp >> test.out"
or
apptainer exec docker://molssi/psi4v180-mamba141-ase322:latest /bin/sh -c "export PSI_SCRATCH=$PWD && python test.inp >> test.out"
Since our current working directory on the host machine is binded to /home
within
the container, the contents of the PSI_SCRATCH
will be retained even after the container is
destroyed when the job is finished.