예제 #1
0
def test_ch4_minfreq(forces_a, relaxed, vibname):
    # FC factor for relevant frequencies only
    fc = FranckCondon(relaxed, vibname, minfreq=2000)
    nrel = 4

    # single excitations
    FC, freq = fc.get_Franck_Condon_factors(293, forces_a)
    assert len(FC[0]) == 2 * nrel + 1
    assert len(freq[0]) == 2 * nrel + 1

    # include double excitations
    FC, freq = fc.get_Franck_Condon_factors(293, forces_a, 2)
    assert len(FC[1]) == 2 * nrel
    # assert len(FC[2]) == 22  # XXX why? - gives 20 in oldlibs???
    for i in range(3):
        assert len(freq[i]) == len(FC[i])
예제 #2
0
def test_ch4_all(forces_a, relaxed, vibname):
    """Evaluate Franck-Condon overlaps in
    a molecule suddenly exposed to a different potential"""

    # FC factor for all frequencies
    fc = FranckCondon(relaxed, vibname)
    ndof = 3 * len(relaxed)

    # by symmetry only one frequency has a non-vanishing contribution
    HR_a, f_a = fc.get_Huang_Rhys_factors(forces_a)
    assert len(HR_a) == ndof
    assert HR_a[:-1] == approx(0, abs=1e-10)
    assert HR_a[-1] == approx(0.859989171)

    FC, freq = fc.get_Franck_Condon_factors(293, forces_a)
    assert len(FC[0]) == 2 * ndof + 1
    assert len(freq[0]) == 2 * ndof + 1
h = 0.3
atoms = Cluster(read_xyz(StringIO.StringIO(butadiene)))
atoms.minimal_box(3.0, h)
atoms.set_calculator(GPAW(h=h))
if 0:
    dyn = FIRE(atoms)
    dyn.run(fmax=0.05)
    atoms.write("butadiene.xyz")

vibname = "fcvib"
vib = Vibrations(atoms, name=vibname)
vib.run()

# Modul
a = FranckCondon(atoms, vibname, minfreq=250)

# excited state forces
F = np.array(
    [
        [-2.11413, 0.07317, -0.91682],
        [3.23569, -0.74520, 0.76758],
        [-3.44847, 0.63846, -0.81080],
        [2.77345, 0.01272, 0.74811],
        [-0.06544, -0.01078, -0.03209],
        [-0.01245, -0.01123, -0.00040],
        [0.00186, -0.05864, -0.00371],
        [-0.00151, 0.05815, 0.00141],
        [0.01625, 0.00781, -0.00202],
        [0.06253, 0.00902, 0.03381],
    ]
예제 #4
0
h = 0.3
atoms = Cluster(read_xyz(StringIO.StringIO(butadiene)))
atoms.minimal_box(3., h)
atoms.set_calculator(GPAW(h=h))
if 0:
    dyn = FIRE(atoms)
    dyn.run(fmax=0.05)
    atoms.write('butadiene.xyz')

vibname = 'fcvib'
vib = Vibrations(atoms, name=vibname)
vib.run()

# Modul
a = FranckCondon(atoms, vibname, minfreq=250)

# excited state forces
F = np.array([[-2.11413, 0.07317, -0.91682], [3.23569, -0.74520, 0.76758],
              [-3.44847, 0.63846, -0.81080], [2.77345, 0.01272, 0.74811],
              [-0.06544, -0.01078, -0.03209], [-0.01245, -0.01123, -0.00040],
              [0.00186, -0.05864, -0.00371], [-0.00151, 0.05815, 0.00141],
              [0.01625, 0.00781, -0.00202], [0.06253, 0.00902, 0.03381]])

# Huang-Rhys factors
S, fq = a.get_Huang_Rhys_factors(F)

#Temperature and #quanta taken into account
T = 300
n = 10