Flow for Equation of StateΒΆ

Flow to compute the equation of state by fitting E(V) at T = 0.

import sys
import os
import abipy.data as abidata
import abipy.abilab as abilab
import abipy.flowtk as flowtk


def build_flow(options):
    # Set working directory (default is the name of the script with '.py' removed and "run_" replaced by "flow_")
    if not options.workdir:
        options.workdir = os.path.basename(sys.argv[0]).replace(".py", "").replace("run_", "flow_")

    # Build GS input file.
    pseudos = abidata.pseudos("Si.GGA_PBE-JTH-paw.xml")
    #silicon = abilab.Structure.zincblende(5.431, ["Si", "Si"], units="ang")
    silicon = abidata.cif_file("si.cif")

    scf_input = abilab.AbinitInput(silicon, pseudos)
    ecut = 12
    scf_input.set_vars(
        ecut=ecut,
        pawecutdg=40,
        nband=6,
        paral_kgb=0,
        iomode=3,
        toldfe=1e-9,
    )

    # K-point sampling (shifted)
    scf_input.set_autokmesh(nksmall=4)

    from abipy.flowtk.gs_works import EosWork
    flow = flowtk.Flow(options.workdir, manager=options.manager)

    # Si is cubic and atomic positions are fixed by symmetry so we
    # use move_atoms=False to compute E(V) with SCF-GS tasks instead of
    # performing a constant-volume optimization of the cell geometry.
    work = EosWork.from_scf_input(scf_input, move_atoms=False, ecutsm=0.5)
    flow.register_work(work)
    flow.allocate(use_smartio=True)

    return flow


# This block generates the thumbnails in the AbiPy gallery.
# You can safely REMOVE this part if you are using this script for production runs.
if os.getenv("READTHEDOCS", False):
    __name__ = None
    import tempfile
    options = flowtk.build_flow_main_parser().parse_args(["-w", tempfile.mkdtemp()])
    build_flow(options).graphviz_imshow()


@flowtk.flow_main
def main(options):
    """
    This is our main function that will be invoked by the script.
    flow_main is a decorator implementing the command line interface.
    Command line args are stored in `options`.
    """
    return build_flow(options)


if __name__ == "__main__":
    sys.exit(main())
../_images/sphx_glr_run_eos_001.png

Out:

Input does not define ecutsm input variable.
 A default value of 0.5 will be added to all the EOS inputs
/Users/gmatteo/git_repos/pymatgen/pymatgen/util/plotting.py:550: UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure.
  plt.show()

Run the script with:

run_eos.py -s

then use:

abirun.py flow_eos structures

to get info about the initial and final structures.

Lattice parameters:
          formula  natom  angle0  angle1  angle2      a      b      c  volume  \
w0_t0_in      Si2      2    60.0    60.0    60.0  3.854  3.854  3.854  40.479
w0_t0_out     Si2      2    60.0    60.0    60.0  3.854  3.854  3.854  40.479
w0_t1_in      Si2      2    60.0    60.0    60.0  3.857  3.857  3.857  40.582
w0_t1_out     Si2      2    60.0    60.0    60.0  3.857  3.857  3.857  40.582
w0_t2_in      Si2      2    60.0    60.0    60.0  3.861  3.861  3.861  40.684
w0_t2_out     Si2      2    60.0    60.0    60.0  3.861  3.861  3.861  40.684
w0_t3_in      Si2      2    60.0    60.0    60.0  3.864  3.864  3.864  40.786
w0_t3_out     Si2      2    60.0    60.0    60.0  3.864  3.864  3.864  40.786
w0_t4_in      Si2      2    60.0    60.0    60.0  3.867  3.867  3.867  40.888
w0_t4_out     Si2      2    60.0    60.0    60.0  3.867  3.867  3.867  40.888
w0_t5_in      Si2      2    60.0    60.0    60.0  3.870  3.870  3.870  40.991
w0_t5_out     Si2      2    60.0    60.0    60.0  3.870  3.870  3.870  40.991
w0_t6_in      Si2      2    60.0    60.0    60.0  3.873  3.873  3.873  41.093
w0_t6_out     Si2      2    60.0    60.0    60.0  3.873  3.873  3.873  41.093
w0_t7_in      Si2      2    60.0    60.0    60.0  3.877  3.877  3.877  41.195
w0_t7_out     Si2      2    60.0    60.0    60.0  3.877  3.877  3.877  41.195
w0_t8_in      Si2      2    60.0    60.0    60.0  3.880  3.880  3.880  41.297
w0_t8_out     Si2      2    60.0    60.0    60.0  3.880  3.880  3.880  41.297

          abispg_num  P [GPa]  Max|F| eV/ang task_class              status
w0_t0_in        None      NaN            NaN    ScfTask  Completed
w0_t0_out        227    1.327      9.506e-28    ScfTask  Completed
w0_t1_in        None      NaN            NaN    ScfTask  Completed
w0_t1_out        227    1.092      1.877e-27    ScfTask  Completed
w0_t2_in        None      NaN            NaN    ScfTask  Completed
w0_t2_out        227    0.859      4.649e-27    ScfTask  Completed
w0_t3_in        None      NaN            NaN    ScfTask  Completed
w0_t3_out        227    0.629      5.062e-27    ScfTask  Completed
w0_t4_in        None      NaN            NaN    ScfTask  Completed
w0_t4_out        227    0.403      5.945e-27    ScfTask  Completed
w0_t5_in        None      NaN            NaN    ScfTask  Completed
w0_t5_out        227    0.178      6.306e-27    ScfTask  Completed
w0_t6_in        None      NaN            NaN    ScfTask  Completed
w0_t6_out        227   -0.042      1.738e-27    ScfTask  Completed
w0_t7_in        None      NaN            NaN    ScfTask  Completed
w0_t7_out        227   -0.259      2.725e-27    ScfTask  Completed
w0_t8_in        None      NaN            NaN    ScfTask  Completed
w0_t8_out        227   -0.474      6.939e-27    ScfTask  Completed

Use `--verbose` to print atoms.

Silicon is a cubic materials and the positions are fixed by symmeetry so we only need ScfTask to get E(V).

The EOS results are saved in the JSON file in flow_eos/w0/outdata/eos_data.json.

We can also use the GSR robot to compute and plot the EOS.

Use

abirun.py flow_eos robot GSR

to build a robot for GSR files and start an ipython shell. Then, inside ipython, type:

In [1]: %matplotlib
In [2]: robot.gridplot_eos()

to produce

Equation of state of Si obtained with different models.

Total running time of the script: ( 0 minutes 0.685 seconds)

Gallery generated by Sphinx-Gallery