Ejemplo n.º 1
0
def compare_fcidumps(expected, computed, label):
    """Function to compare two FCIDUMP files. Prints :py:func:`util.success`
    when value *computed* matches value *expected*.
    Performs a system exit on failure. Used in input files in the test suite.

    :returns: a dictionary of energies computed from the MO integrals.
    The key-value pairs are:
      - 'NUCLEAR REPULSION ENERGY' : nuclear repulsion plus frozen core energy
      - 'ONE-ELECTRON ENERGY' : SCF one-electron energy
      - 'TWO-ELECTRON ENERGY' : SCF two-electron energy
      - 'SCF TOTAL ENERGY' : SCF total energy
      - 'MP2 CORRELATION ENERGY' : MP2 correlation energy

    :param expected: reference FCIDUMP file
    :param computed: computed FCIDUMP file
    :param label: string labelling the test
    """

    try:
        from deepdiff import DeepDiff
    except ImportError:
        raise ImportError(
            """Python module deepdiff not found. Solve by installing it: `conda install deepdiff -c conda-forge` or `pip install deepdiff`"""
        )

    # Grab expected header and integrals
    ref_intdump = fcidump_from_file(expected)
    intdump = fcidump_from_file(computed)

    # Compare headers
    header_diff = DeepDiff(
        ref_intdump,
        intdump,
        ignore_order=True,
        exclude_paths={"root['enuc']", "root['hcore']", "root['eri']", "root['epsilon']"})
    if header_diff:
        message = ("\tComputed FCIDUMP file header does not match expected header.\n")
        raise TestComparisonError(header_diff)

    ref_energies = _energies_from_fcidump(ref_intdump)
    energies = _energies_from_fcidump(intdump)

    pass_1el = compare_values(ref_energies['ONE-ELECTRON ENERGY'], energies['ONE-ELECTRON ENERGY'], 7,
                              label + '. 1-electron energy')
    pass_2el = compare_values(ref_energies['TWO-ELECTRON ENERGY'], energies['TWO-ELECTRON ENERGY'], 7,
                              label + '. 2-electron energy')
    pass_scf = compare_values(ref_energies['SCF TOTAL ENERGY'], energies['SCF TOTAL ENERGY'], 10,
                              label + '. SCF total energy')
    pass_mp2 = compare_values(ref_energies['MP2 CORRELATION ENERGY'], energies['MP2 CORRELATION ENERGY'], 10,
                              label + '. MP2 correlation energy')

    if (pass_1el and pass_2el and pass_scf and pass_mp2):
        success(label)

    return True
Ejemplo n.º 2
0
def compare_fcidumps(expected, computed, label):
    """Function to compare two FCIDUMP files. Prints :py:func:`util.success`
    when value *computed* matches value *expected*.
    Performs a system exit on failure. Used in input files in the test suite.

    :returns: a dictionary of energies computed from the MO integrals.
    The key-value pairs are:
      - 'NUCLEAR REPULSION ENERGY' : nuclear repulsion plus frozen core energy
      - 'ONE-ELECTRON ENERGY' : SCF one-electron energy
      - 'TWO-ELECTRON ENERGY' : SCF two-electron energy
      - 'SCF TOTAL ENERGY' : SCF total energy
      - 'MP2 CORRELATION ENERGY' : MP2 correlation energy

    :param expected: reference FCIDUMP file
    :param computed: computed FCIDUMP file
    :param label: string labelling the test
    """
    # Grab expected header and integrals
    ref_intdump = fcidump_from_file(expected)
    intdump = fcidump_from_file(computed)

    # Compare headers
    header_diff = DeepDiff(ref_intdump,
                           intdump,
                           ignore_order=True,
                           exclude_paths={
                               "root['enuc']", "root['hcore']", "root['eri']",
                               "root['epsilon']"
                           })
    if header_diff:
        message = (
            "\tComputed FCIDUMP file header does not match expected header.\n")
        raise TestComparisonError(header_diff)

    ref_energies = _energies_from_fcidump(ref_intdump)
    energies = _energies_from_fcidump(intdump)

    pass_1el = compare_values(ref_energies['ONE-ELECTRON ENERGY'],
                              energies['ONE-ELECTRON ENERGY'], 7,
                              label + '. 1-electron energy')
    pass_2el = compare_values(ref_energies['TWO-ELECTRON ENERGY'],
                              energies['TWO-ELECTRON ENERGY'], 7,
                              label + '. 2-electron energy')
    pass_scf = compare_values(ref_energies['SCF TOTAL ENERGY'],
                              energies['SCF TOTAL ENERGY'], 10,
                              label + '. SCF total energy')
    pass_mp2 = compare_values(ref_energies['MP2 CORRELATION ENERGY'],
                              energies['MP2 CORRELATION ENERGY'], 10,
                              label + '. MP2 correlation energy')

    if (pass_1el and pass_2el and pass_scf and pass_mp2):
        success(label)

    return True