Ejemplo n.º 1
0
def main():
    '''Main driver routine.'''

    # coordinates of H2O, in atomic units
    coords = np.array([
        [0.000000000000000E+00, -0.188972598857892E+01, 0.000000000000000E+00],
        [0.000000000000000E+00, 0.000000000000000E+00, 0.147977639152057E+01],
        [0.000000000000000E+00, 0.000000000000000E+00, -0.147977639152057E+01]
    ])

    # the values of extpot and extpotgrad used here were
    # taken from file: test/api/mm/testers/test_extpot.f90
    extpot = np.array(
        [-0.025850198503435, -0.005996294763958, -0.022919371690684])

    extpotgrad = np.array(
        [[0.035702717378527, 0.011677956375860, 0.009766745155626],
         [0.023243271928971, -0.000046945156575, 0.004850533043745],
         [0.016384005706180, 0.004608295375551, 0.005401080774962]])

    cdftb = dftbplus.DftbPlus(libpath=LIB_PATH,
                              hsdpath='dftb_in.hsd',
                              logfile='log.log')

    # set geometry
    cdftb.set_geometry(coords, latvecs=None)

    # set external potential and its gradients
    cdftb.set_external_potential(extpot, extpotgrad=extpotgrad)

    # get number of atoms
    natoms = cdftb.get_nr_atoms()

    # calculate energy, forces and Gross charges
    merminen = cdftb.get_energy()
    gradients = cdftb.get_gradients()
    grosschgs = cdftb.get_gross_charges()

    # finalize DFTB+ and clean up
    cdftb.close()

    # print obtained nr. of atoms
    print('(H2O) Obtained nr. of atoms: {:d}'.format(natoms))

    # print obtained mermin free energy
    print('(H2O) Obtained Mermin-energy: {:15.10f}'.format(merminen))

    # print obtained gradients
    print('(H2O) Obtained gradient of atom 1: {:15.10f} {:15.10f} {:15.10f}'.
          format(*gradients[0]))
    print('(H2O) Obtained gradient of atom 2: {:15.10f} {:15.10f} {:15.10f}'.
          format(*gradients[1]))
    print('(H2O) Obtained gradient of atom 3: {:15.10f} {:15.10f} {:15.10f}'.
          format(*gradients[2]))

    # print obtained Gross charges
    print(
        '(H2O) Obtained Gross charges: {:15.10f} {:15.10f}'.format(*grosschgs))
Ejemplo n.º 2
0
def main():
    '''Main driver routine.'''

    # coordinates of H2O, in atomic units
    qmcoords = np.array(
        [[0.0000000000000000, -1.8897259885789233, 0.0000000000000000],
         [0.0000000000000000, 0.0000000000000000, 1.4797763915205659],
         [0.0000000000000000, 0.0000000000000000, -1.4797763915205659]])

    # coordinates of MM-charges, in atomic units
    mmcoords = np.array(
        [[-0.944863438887178, -9.44863438887178, 1.70075418999692],
         [4.34637181888102, -5.85815332110050, 2.64561762888410]])

    # MM-charges, in atomic units
    mmcharges = np.array([2.5, -1.9])

    potcalc = PotentialCalculator(qmcoords, mmcoords, mmcharges)

    cdftb = dftbplus.DftbPlus(libpath=LIB_PATH,
                              hsdpath='dftb_in.hsd',
                              logfile='log.log')

    # set geometry
    cdftb.set_geometry(qmcoords, latvecs=None)

    cdftb.register_ext_pot_generator(potcalc, get_extpot, get_extpotgrad)

    # get number of atoms
    natoms = cdftb.get_nr_atoms()

    # calculate energy, forces and Gross charges
    merminen = cdftb.get_energy()
    gradients = cdftb.get_gradients()
    grosschgs = cdftb.get_gross_charges()

    # finalize DFTB+ and clean up
    cdftb.close()

    # print obtained nr. of atoms
    print('(H2O) Obtained nr. of atoms: {:d}'.format(natoms))

    # print obtained mermin free energy
    print('(H2O) Obtained Mermin-energy: {:15.10f}'.format(merminen))

    # print obtained gradients
    print('(H2O) Obtained gradient of atom 1: {:15.10f} {:15.10f} {:15.10f}'.
          format(*gradients[0]))
    print('(H2O) Obtained gradient of atom 2: {:15.10f} {:15.10f} {:15.10f}'.
          format(*gradients[1]))
    print('(H2O) Obtained gradient of atom 3: {:15.10f} {:15.10f} {:15.10f}'.
          format(*gradients[2]))

    # print obtained Gross charges
    print(
        '(H2O) Obtained Gross charges: {:15.10f} {:15.10f}'.format(*grosschgs))
Ejemplo n.º 3
0
def main():
    '''Main driver routine.'''

    # coordinates of TiO2, in atomic units
    coords = np.array([
        [-0.016726922839251,  0.016725329441158, -0.000003204152532],
        [-0.016726505918979,  1.920201169305565, -7.297102897292027],
        [ 0.017412997824265, -0.024318617967798,  2.005339137853385],
        [ 1.920770753428742, -0.024319922392223, -4.437737763954652],
        [ 0.024319174400169, -0.017404302527510, -2.005347277168561],
        [ 0.024317270342179,  1.886164739806594, -5.291732430733527]])
    coords *= AA__BOHR

    # lattice vectors of TiO2, in atomic units
    latvecs = np.array([
        [-1.903471721000000,  1.903471721000000,  4.864738245000000],
        [ 1.903471721000000, -1.903471721000000,  4.864738245000000],
        [ 1.903471721000000,  1.903471721000000, -4.864738245000000]])
    latvecs *= AA__BOHR

    cdftb = dftbplus.DftbPlus(libpath=LIB_PATH,
                              hsdpath='dftb_in.hsd',
                              logfile='TiO2.log')

    # set geometry
    cdftb.set_geometry(coords, latvecs=latvecs)

    # get number of atoms
    natoms = cdftb.get_nr_atoms()

    # calculate energy, gradients and Gross charges
    merminen = cdftb.get_energy()
    gradients = cdftb.get_gradients()
    grosschgs = cdftb.get_gross_charges()

    # finalize DFTB+ and clean up
    cdftb.close()

    # print obtained nr. of atoms
    print('(TiO2) Obtained nr. of atoms: {:d}'.format(natoms))

    # print obtained mermin free energy
    print('(TiO2) Obtained Mermin-energy: {:15.10f}'.format(merminen))

    # print obtained gradients
    print('(TiO2) Obtained gradient of atom 1: {:15.10f} {:15.10f} {:15.10f}'
          .format(*gradients[0]))

    # print obtained Gross charges
    print('''(TiO2) Obtained Gross charges: {:15.10f} {:15.10f}
          {:15.10f} {:15.10f} {:15.10f} {:15.10f}'''.format(*grosschgs))
Ejemplo n.º 4
0
def main():
    '''Main driver routine.'''

    # coordinates of H2O, in atomic units
    coords = np.array([
        [0.000000000000000E+00, -0.188972598857892E+01, 0.000000000000000E+00],
        [0.000000000000000E+00, 0.000000000000000E+00, 0.147977639152057E+01],
        [0.000000000000000E+00, 0.000000000000000E+00, -0.147977639152057E+01]
    ])

    # the values of extpot and extpotgrad used here were
    # taken from file: test/api/mm/testers/test_extpot.f90
    extpot = np.array(
        [-0.025850198503435, -0.005996294763958, -0.022919371690684])

    extpotgrad = np.array(
        [[0.035702717378527, 0.011677956375860, 0.009766745155626],
         [0.023243271928971, -0.000046945156575, 0.004850533043745],
         [0.016384005706180, 0.004608295375551, 0.005401080774962]])

    cdftb = dftbplus.DftbPlus(libpath=LIB_PATH,
                              hsdpath='dftb_in.hsd',
                              logfile='log.log')

    # set geometry
    cdftb.set_geometry(coords, latvecs=None)

    # set external potential and its gradients
    cdftb.set_external_potential(extpot, extpotgrad=extpotgrad)

    # get number of atoms
    natoms = cdftb.get_nr_atoms()

    # calculate energy, forces and Gross charges
    merminen = cdftb.get_energy()
    gradients = cdftb.get_gradients()
    grosschg = cdftb.get_gross_charges()

    dipole_mu = np.zeros(3)
    #zstar = np.zeros((3, natoms, 3))
    #qdot = np.zeros((3, natoms))

    for icart in range(3):
        energyRaw = np.zeros(2)
        #gradientsRaw = np.zeros((2, natoms, 3))
        #grosschgsRaw = np.zeros((2, natoms))
        for istep in range(2):
            efield = np.zeros(3)
            delta_field = float(2 * istep - 1) * DELTA
            efield[icart] = delta_field

            extpot = np.dot(efield, coords.T)
            extpotgrad = np.zeros((natoms, 3))
            extpotgrad[:, icart] = delta_field

            # set external potential
            cdftb.set_external_potential(extpot, extpotgrad=extpotgrad)

            # calculate energy, forces and gross (Mulliken) charges
            energyRaw[istep] = cdftb.get_energy()
            #gradientsRaw[istep] = cdftb.get_gradients()
            #grosschgsRaw[istep] = cdftb.get_gross_charges()

        dipole_mu[icart] = (energyRaw[0] - energyRaw[1]) / (2.0 * DELTA)
        #zstar[icart] = (gradientsRaw[0] - gradientsRaw[1]) / (2.0 * DELTA)
        #qdot[icart] = (grosschgsRaw[0] - grosschgsRaw[1]) / (2.0 * DELTA)

    # finalize DFTB+ and clean up
    cdftb.close()

    # check whether calculator was initialized with correct nr. of atoms
    print('(H2O) Obtained nr. of atoms: {:d}'.format(natoms))
    print('(H2O) Expected nr. of atoms: {:d}\n'.format(NATOM0))

    # evaluate mermin free energy
    print('(H2O) Obtained Mermin-energy: {:15.10f}'.format(merminen))
    print('(H2O) Expected Mermin-energy: {:15.10f}\n'.format(-3.9854803392))

    # evaluate gradients
    print('(H2O) Obtained gradient of atom 1: {:15.10f} {:15.10f} {:15.10f}'.
          format(*gradients[0]))
    print('(H2O) Expected gradient of atom 1: {:15.10f} {:15.10f} {:15.10f}'.
          format(0.0176513638, -0.1831376018, 0.0031982515))
    print('(H2O) Obtained gradient of atom 2: {:15.10f} {:15.10f} {:15.10f}'.
          format(*gradients[1]))
    print('(H2O) Expected gradient of atom 2: {:15.10f} {:15.10f} {:15.10f}'.
          format(-0.0061402266, 0.0955090293, 0.0394035230))
    print('(H2O) Obtained gradient of atom 3: {:15.10f} {:15.10f} {:15.10f}'.
          format(*gradients[2]))
    print('(H2O) Expected gradient of atom 3: {:15.10f} {:15.10f} {:15.10f}\n'.
          format(-0.0037720260, 0.0923535862, -0.0402979580))

    # evaluate Gross charges
    print(
        '(H2O) Obtained Gross charges: {:15.10f} {:15.10f}'.format(*grosschg))
    print('(H2O) Expected Gross charges: {:15.10f} {:15.10f}'.format(
        -0.4943983279, 0.2641722128))

    # evaluated dipole moment
    print('(H2O) Obtained num. dipole moment: {:15.10f} {:15.10f} {:15.10f}'.
          format(*dipole_mu))
    print('(H2O) Expected dipole moment: {:15.10f} {:15.10f} {:15.10f}'.format(
        0.0, 0.8759859216, 0.0))
    #print('Born charges')
    #for iat in range(natoms):
    #    print("atom %i" % (iat+1))
    #    for icart in range(3):
    #        print(zstar[icart][iat][:])
    #print('Atom polarisability', qdot.T)

    # --------------------------WRITE AUTOTEST.TAG------------------------------

    # write autotest.tag file of water molecule calculation
    write_autotest_tag('autotest.tag',
                       freeEgy=merminen,
                       forceTot=-gradients,
                       qOutAtGross=grosschg,
                       mu=dipole_mu)
Ejemplo n.º 5
0
def main():
    '''Main driver routine.'''

    # initial coordinates of Si2, in atomic units
    initialcoords = np.array([
        [0.0000000000000000, 0.0000000000000000, 0.0000000000000000],
        [2.5639291987021915, 2.5639291987021915, 2.5639291987021915]])

    # small displacement in the coordinates
    coords = np.copy(initialcoords)
    coords[0, 0] = initialcoords[0, 0] + 0.2 * AA__BOHR

    # initial lattice vectors of Si2, in atomic units
    initiallatvecs = np.array([
        [5.1278583974043830, 5.1278583974043830, 0.0000000000000000],
        [0.0000000000000000, 5.1278583974043830, 5.1278583974043830],
        [5.1278583974043830, 0.0000000000000000, 5.1278583974043830]])

    # small displacement in the lattice vectors
    latvecs = np.copy(initiallatvecs)
    latvecs[0, 0] = initiallatvecs[0, 0] + 0.1 * AA__BOHR


    # ------------------CALCULATION OF INITIAL GEOMETRY-------------------------

    cdftb = dftbplus.DftbPlus(libpath=LIB_PATH,
                              hsdpath='dftb_in.hsd',
                              logfile='log.log')

    # set initial geometry
    cdftb.set_geometry(initialcoords, latvecs=initiallatvecs)

    # get number of atoms
    natoms = cdftb.get_nr_atoms()

    # calculate energy, forces and Gross charges
    merminen = cdftb.get_energy()
    gradients = cdftb.get_gradients()
    grosschg = cdftb.get_gross_charges()

    # check whether calculator was initialized with correct nr. of atoms
    print('(Si2) Obtained nr. of atoms: {:d}'.format(natoms))
    print('(Si2) Expected nr. of atoms: {:d}\n'.format(NATOM0))

    # evaluate mermin free energy
    print('(Si2) Obtained Mermin-energy: {:15.10f}'.format(merminen))
    print('(Si2) Expected Mermin-energy: {:15.10f}\n'.format(-2.5933460731))

    # evaluate gradients
    print('(Si2) Obtained gradient of atom 1: {:15.10f} {:15.10f} {:15.10f}'
          .format(*gradients[0]))
    print('(Si2) Expected gradient of atom 1: {:15.10f} {:15.10f} {:15.10f}'
          .format(-0.0103215090, -0.0103215090, -0.0103215090))
    print('(Si2) Obtained gradient of atom 2: {:15.10f} {:15.10f} {:15.10f}'
          .format(*gradients[1]))
    print('(Si2) Expected gradient of atom 2: {:15.10f} {:15.10f} {:15.10f}\n'
          .format(0.0103215090, 0.0103215090, 0.0103215090))

    # evaluate Gross charges
    print('(Si2) Obtained Gross charges: {:15.10f} {:15.10f}'
          .format(*grosschg))
    print('(Si2) Expected Gross charges: {:15.10f} {:15.10f}\n\n'
          .format(0.0, 0.0))


    # ------------------CALCULATION OF DISPLACED GEOMETRY-----------------------

    # set displaced geometry
    cdftb.set_geometry(coords, latvecs=latvecs)

    # get number of atoms
    natoms = cdftb.get_nr_atoms()

    # calculate energy, forces and Gross charges
    merminen = cdftb.get_energy()
    gradients = cdftb.get_gradients()
    grosschg = cdftb.get_gross_charges()

    # check whether calculator was initialized with correct nr. of atoms
    print('(Si2) Obtained nr. of atoms: {:d}'.format(natoms))
    print('(Si2) Expected nr. of atoms: {:d}\n'.format(NATOM0))

    # evaluate mermin free energy
    print('(Si2) Obtained Mermin-energy: {:15.10f}'.format(merminen))
    print('(Si2) Expected Mermin-energy: {:15.10f}\n'.format(-2.5854559427))

    # evaluate gradients
    print('(Si2) Obtained gradient of atom 1: {:15.10f} {:15.10f} {:15.10f}'
          .format(*gradients[0]))
    print('(Si2) Expected gradient of atom 1: {:15.10f} {:15.10f} {:15.10f}'
          .format(0.0442660049, -0.0147463633, -0.0193148538))
    print('(Si2) Obtained gradient of atom 2: {:15.10f} {:15.10f} {:15.10f}'
          .format(*gradients[1]))
    print('(Si2) Expected gradient of atom 2: {:15.10f} {:15.10f} {:15.10f}\n'
          .format(-0.0442660049, 0.0147463633, 0.0193148538))

    # evaluate Gross charges
    print('(Si2) Obtained Gross charges: {:15.10f} {:15.10f}'
          .format(*grosschg))
    print('(Si2) Expected Gross charges: {:15.10f} {:15.10f}'
          .format(0.0, 0.0))

    # finalize DFTB+ and clean up
    cdftb.close()


    # --------------------------WRITE AUTOTEST.TAG------------------------------

    # write autotest.tag file of water molecule calculation
    write_autotest_tag('autotest.tag', freeEgy=merminen,
                       forceTot=-gradients, qOutAtGross=grosschg)
Ejemplo n.º 6
0
def main():
    '''Main driver routine.'''

    # coordinates of Si2, in atomic units
    coords_si2 = np.array(
        [[0.0000000000000000, 0.0000000000000000, 0.0000000000000000],
         [2.2639291987021915, 2.4639291987021915, 2.5639291987021915]])

    # lattice vectors of Si2, in atomic units
    latvecs_si2 = np.array(
        [[5.2278583974043830, 5.1278583974043830, 0.0000000000000000],
         [0.0000000000000000, 5.3278583974043830, 5.1278583974043830],
         [5.1278583974043830, 0.0000000000000000, 5.4278583974043830]])

    # coordinates of H2O, in atomic units
    coords_h2o = np.array(
        [[0.00000000000E+00, -0.10000000000E+01, 0.00000000000E+00],
         [0.00000000000E+00, 0.00000000000E+00, 0.88306400000E+00],
         [0.00000000000E+00, 0.00000000000E+00, -0.78306400000E+00]])

    # initialize collective variables
    merminentot, gradientstot, grosschgstot = init_collective_variables()

    # dummy loop to test subsequent initializations/
    # finalizations of the DFTB+ object
    for iteration in range(0, NITER):

        tsi2 = not bool(iteration % 2)

        # use input for Si2 and H2O alternatingly, starting with Si2
        if tsi2:

            # set expected number of atoms
            natom0 = NATOM_SI

            cdftb = dftbplus.DftbPlus(libpath=LIB_PATH,
                                      hsdpath='dftb_in.Si2.hsd',
                                      logfile='log.Si2.log')

            # set geometry
            cdftb.set_geometry(coords_si2, latvecs=latvecs_si2)

        else:

            # set expected number of atoms
            natom0 = NATOM_H2O

            cdftb = dftbplus.DftbPlus(libpath=LIB_PATH,
                                      hsdpath='dftb_in.H2O.hsd',
                                      logfile='log.H2O.log')

            # set geometry
            cdftb.set_geometry(coords_h2o, latvecs=None)

        # get number of atoms
        natoms = cdftb.get_nr_atoms()

        # calculate energy, forces and Gross charges
        merminen = cdftb.get_energy()
        gradients = cdftb.get_gradients()
        grosschgs = cdftb.get_gross_charges()

        # finalize DFTB+ and clean up
        cdftb.close()

        if tsi2:

            dummygrads = np.zeros(3)
            dummychgs = 0
            merminentot, gradientstot, grosschgstot = \
            update_collective_variables(merminen,
                                        np.vstack((gradients, dummygrads)),
                                        np.hstack((grosschgs, dummychgs)),
                                        merminentot, gradientstot, grosschgstot)

        else:

            merminentot, gradientstot, grosschgstot = \
            update_collective_variables(merminen, gradients, grosschgs,
                                        merminentot, gradientstot, grosschgstot)

        if tsi2:

            # check whether calculator was initialized with correct nr. of atoms
            print('(Si2) Obtained nr. of atoms: {:d}'.format(natoms))
            print('(Si2) Expected nr. of atoms: {:d}\n'.format(natom0))

            # evaluate mermin free energy
            print('(Si2) Obtained Mermin-energy: ' + \
                  '{:15.10f}'.format(merminen))
            print('(Si2) Expected Mermin-energy: ' + \
                  '{:15.10f}\n'.format(-2.5897497363))

            # evaluate gradients
            print('(Si2) Obtained gradient of atom 1: ' + \
                  '{:15.10f} {:15.10f} {:15.10f}'
                  .format(*gradients[0]))
            print('(Si2) Expected gradient of atom 1: ' + \
                  '{:15.10f} {:15.10f} {:15.10f}'
                  .format(0.0306186399, 0.0026710677, -0.0007231241))
            print('(Si2) Obtained gradient of atom 2: ' + \
                  '{:15.10f} {:15.10f} {:15.10f}'
                  .format(*gradients[1]))
            print('(Si2) Expected gradient of atom 2: ' + \
                  '{:15.10f} {:15.10f} {:15.10f}\n'
                  .format(-0.0306186399, -0.0026710677, 0.0007231241))

            # evaluate Gross charges
            print('(Si2) Obtained Gross charges: {:15.10f} {:15.10f}'.format(
                *grosschgs))
            print(
                '(Si2) Expected Gross charges: {:15.10f} {:15.10f}\n\n'.format(
                    0.0, 0.0))

        else:

            # check whether calculator was initialized with correct nr. of atoms
            print('(H2O) Obtained nr. of atoms: {:d}'.format(natoms))
            print('(H2O) Expected nr. of atoms: {:d}\n'.format(natom0))

            # evaluate mermin free energy
            print('(H2O) Obtained Mermin-energy: ' + \
                  '{:15.10f}'.format(merminen))
            print('(H2O) Expected Mermin-energy: ' + \
                  '{:15.10f}\n'.format(-3.7534584715))

            # evaluate gradients
            print('(H2O) Obtained gradient of atom 1: ' + \
                  '{:15.10f} {:15.10f} {:15.10f}'
                  .format(*gradients[0]))
            print('(H2O) Expected gradient of atom 1: ' + \
                  '{:15.10f} {:15.10f} {:15.10f}'
                  .format(0.0178274222, 1.1052225107, -0.0835776976))
            print('(H2O) Obtained gradient of atom 2: ' + \
                  '{:15.10f} {:15.10f} {:15.10f}'
                  .format(*gradients[1]))
            print('(H2O) Expected gradient of atom 2: ' + \
                  '{:15.10f} {:15.10f} {:15.10f}'
                  .format(-0.0073820765, -0.4646991011, -0.5429357096))
            print('(H2O) Obtained gradient of atom 3: ' + \
                  '{:15.10f} {:15.10f} {:15.10f}'
                  .format(*gradients[2]))
            print('(H2O) Expected gradient of atom 3: ' + \
                  '{:15.10f} {:15.10f} {:15.10f}\n'
                  .format(-0.0058552790, -0.6382027486, 0.6279471931))

            # evaluate Gross charges
            print('(H2O) Obtained Gross charges: ' + \
                  '{:15.10f} {:15.10f} {:15.10f}'
                  .format(*grosschgs))
            print('(H2O) Expected Gross charges: ' + \
                  '{:15.10f} {:15.10f} {:15.10f}\n\n'
                  .format(-0.6519945363, 0.3314953102, 0.3204992261))

    # --------------------------WRITE AUTOTEST.TAG------------------------------

    # write autotest.tag file, containing the collective variables
    write_autotest_tag('autotest.tag',
                       freeEgy=merminentot,
                       forceTot=-gradientstot,
                       qOutAtGross=grosschgstot)
Ejemplo n.º 7
0
def main():
    '''Main driver routine.'''

    # coordinates of H2O, in atomic units
    qmcoords = np.array(
        [[0.0000000000000000, -1.8897259885789233, 0.0000000000000000],
         [0.0000000000000000, 0.0000000000000000, 1.4797763915205659],
         [0.0000000000000000, 0.0000000000000000, -1.4797763915205659]])

    # coordinates of MM-charges, in atomic units
    mmcoords = np.array(
        [[-0.944863438887178, -9.44863438887178, 1.70075418999692],
         [4.34637181888102, -5.85815332110050, 2.64561762888410]])

    # MM-charges, in atomic units
    mmcharges = np.array([2.5, -1.9])

    potcalc = PotentialCalculator(qmcoords, mmcoords, mmcharges)

    # ----------------------------MAIN-CALCULATION------------------------------

    cdftb = dftbplus.DftbPlus(libpath=LIB_PATH,
                              hsdpath='dftb_in.hsd',
                              logfile='log.log')

    # set geometry
    cdftb.set_geometry(qmcoords, latvecs=None)

    cdftb.register_ext_pot_generator(potcalc, get_extpot, get_extpotgrad)

    # get number of atoms
    natoms = cdftb.get_nr_atoms()

    # calculate energy, forces and Gross charges
    merminen = cdftb.get_energy()
    gradients = cdftb.get_gradients()
    grosschgs = cdftb.get_gross_charges()

    # check whether calculator was initialized with correct nr. of atoms
    print('(H2O) Obtained nr. of atoms: {:d}'.format(natoms))
    print('(H2O) Expected nr. of atoms: {:d}\n'.format(NATOM))

    # evaluate mermin free energy
    print('(H2O) Obtained Mermin-energy: ' + '{:15.10f}'.format(merminen))
    print('(H2O) Expected Mermin-energy: ' +
          '{:15.10f}\n'.format(-3.9854803392))

    # evaluate gradients
    print('(H2O) Obtained gradient of atom 1: ' +
          '{:15.10f} {:15.10f} {:15.10f}'.format(*gradients[0]))
    print('(H2O) Expected gradient of atom 1: ' +
          '{:15.10f} {:15.10f} {:15.10f}'.format(0.0176513638, -0.1831376018,
                                                 0.0031982515))
    print('(H2O) Obtained gradient of atom 2: ' +
          '{:15.10f} {:15.10f} {:15.10f}'.format(*gradients[1]))
    print('(H2O) Expected gradient of atom 2: ' +
          '{:15.10f} {:15.10f} {:15.10f}'.format(-0.0061402266, 0.0955090293,
                                                 0.0394035230))
    print('(H2O) Obtained gradient of atom 3: ' +
          '{:15.10f} {:15.10f} {:15.10f}'.format(*gradients[2]))
    print('(H2O) Expected gradient of atom 3: ' +
          '{:15.10f} {:15.10f} {:15.10f}\n'.format(-0.0037720260, 0.0923535862,
                                                   -0.0402979580))

    # evaluate Gross charges
    print('(H2O) Obtained Gross charges: ' +
          '{:15.10f} {:15.10f} {:15.10f}'.format(*grosschgs))
    print('(H2O) Expected Gross charges: ' +
          '{:15.10f} {:15.10f} {:15.10f}\n\n'.format(
              -0.4943983279, 0.2641722128, 0.2302261151))

    # finalize DFTB+ and clean up
    cdftb.close()

    # --------------------------WRITE AUTOTEST.TAG------------------------------

    # write autotest.tag file of water molecule calculation
    write_autotest_tag('autotest.tag',
                       freeEgy=merminen,
                       forceTot=-gradients,
                       qOutAtGross=grosschgs)
Ejemplo n.º 8
0
def main():
    '''Main driver routine.'''

    # coordinates of H2O, in atomic units
    coords = np.array([
        [0.000000000000000E+00, -0.188972598857892E+01,  0.000000000000000E+00],
        [0.000000000000000E+00,  0.000000000000000E+00,  0.147977639152057E+01],
        [0.000000000000000E+00,  0.000000000000000E+00, -0.147977639152057E+01]])

    # the values of extpot and extpotgrad used here were
    # taken from file: test/api/mm/testers/test_extpot.f90
    extpot = np.array([-0.025850198503435,
                       -0.005996294763958,
                       -0.022919371690684])

    extpotgrad = np.array([
        [0.035702717378527,  0.011677956375860, 0.009766745155626],
        [0.023243271928971, -0.000046945156575, 0.004850533043745],
        [0.016384005706180,  0.004608295375551, 0.005401080774962]])

    cdftb = dftbplus.DftbPlus(libpath=LIB_PATH,
                              hsdpath='dftb_in.hsd',
                              logfile='log.log')

    # set geometry
    cdftb.set_geometry(coords, latvecs=None)

    # set external potential and its gradients
    cdftb.set_external_potential(extpot, extpotgrad=extpotgrad)

    # get number of atoms
    natoms = cdftb.get_nr_atoms()

    # calculate energy, forces and Gross charges
    merminen = cdftb.get_energy()
    gradients = cdftb.get_gradients()
    grosschg = cdftb.get_gross_charges()

    # finalize DFTB+ and clean up
    cdftb.close()

    # check whether calculator was initialized with correct nr. of atoms
    print('(H2O) Obtained nr. of atoms: {:d}'.format(natoms))
    print('(H2O) Expected nr. of atoms: {:d}\n'.format(NATOM0))

    # evaluate mermin free energy
    print('(H2O) Obtained Mermin-energy: {:15.10f}'.format(merminen))
    print('(H2O) Expected Mermin-energy: {:15.10f}\n'.format(-3.9854803392))

    # evaluate gradients
    print('(H2O) Obtained gradient of atom 1: {:15.10f} {:15.10f} {:15.10f}'
          .format(*gradients[0]))
    print('(H2O) Expected gradient of atom 1: {:15.10f} {:15.10f} {:15.10f}'
          .format(0.0176513638, -0.1831376018, 0.0031982515))
    print('(H2O) Obtained gradient of atom 2: {:15.10f} {:15.10f} {:15.10f}'
          .format(*gradients[1]))
    print('(H2O) Expected gradient of atom 2: {:15.10f} {:15.10f} {:15.10f}'
          .format(-0.0061402266, 0.0955090293, 0.0394035230))
    print('(H2O) Obtained gradient of atom 3: {:15.10f} {:15.10f} {:15.10f}'
          .format(*gradients[2]))
    print('(H2O) Expected gradient of atom 3: {:15.10f} {:15.10f} {:15.10f}\n'
          .format(-0.0037720260, 0.0923535862, -0.0402979580))

    # evaluate Gross charges
    print('(H2O) Obtained Gross charges: {:15.10f} {:15.10f}'
          .format(*grosschg))
    print('(H2O) Expected Gross charges: {:15.10f} {:15.10f}'
          .format(-0.4943983279, 0.2641722128))


    # --------------------------WRITE AUTOTEST.TAG------------------------------

    # write autotest.tag file of water molecule calculation
    write_autotest_tag('autotest.tag', freeEgy=merminen,
                       forceTot=-gradients, qOutAtGross=grosschg)
Ejemplo n.º 9
0
    def __init__(self,
                 restart=None,
                 ignore_bad_restart_file=False,
                 label='',
                 atoms=None,
                 kpts=None,
                 slako_dir=None,
                 **kwargs):
        """
        All keywords for the dftb_in.hsd input file (see the DFTB+ manual)
        can be set by ASE. Consider the following input file block:

         Hamiltonian = DFTB {
         SCC = Yes
         SCCTolerance = 1e-8
         MaxAngularMomentum = {
         H = s
         O = p
            }
         }

        This can be generated by the DFTB+ calculator by using the
        following settings:

         calc = Dftb(Hamiltonian_='DFTB',  # line is included by default
                     Hamiltonian_SCC='Yes',
                     Hamiltonian_SCCTolerance=1e-8,
                    Hamiltonian_MaxAngularMomentum_='',
                     Hamiltonian_MaxAngularMomentum_H='s',
                     Hamiltonian_MaxAngularMomentum_O='p')

        In addition to keywords specific to DFTB+, also the following keywords
        arguments can be used:

        restart: str
            Prefix for restart file.  May contain a directory.
            Default is None: don't restart.
        ignore_bad_restart_file: bool
            Ignore broken or missing restart file. By default, it is an
            error if the restart file is missing or broken.
        label: str (default 'dftb')
            Prefix used for the main output file (<label>.out).
        atoms: Atoms object (default None)
            Optional Atoms object to which the calculator will be
            attached. When restarting, atoms will get its positions and
            unit-cell updated from file.
        kpts: (default None)
            Brillouin zone sampling:

            * ``(1,1,1)`` or ``None``: Gamma-point only
            * ``(n1,n2,n3)``: Monkhorst-Pack grid
            * ``dict``: Interpreted as a path in the Brillouin zone if
              it contains the 'path_' keyword. Otherwise it is converted
              into a Monkhorst-Pack grid using
              ``ase.calculators.calculator.kpts2sizeandoffsets``
            * ``[(k11,k12,k13),(k21,k22,k23),...]``: Explicit (Nkpts x 3)
              array of k-points in units of the reciprocal lattice vectors
              (each with equal weight)

        Additional attribute to be set by the embed() method:

        pcpot: PointCharge object
            An external point charge potential (for QM/MM calculations)
        """

        if slako_dir is None:
            slako_dir = os.environ.get('DFTB_PREFIX', './')
            if not slako_dir.endswith('/'):
                slako_dir += '/'

        self.slako_dir = slako_dir
        self.lib = os.environ.get('DFTB_LIB', './')

        self.default_parameters = dict(
            Hamiltonian_='DFTB',
            Hamiltonian_SlaterKosterFiles_='Type2FileNames',
            Hamiltonian_SlaterKosterFiles_Prefix=self.slako_dir,
            Hamiltonian_SlaterKosterFiles_Separator='"-"',
            Hamiltonian_SlaterKosterFiles_Suffix='".skf"',
            Hamiltonian_MaxAngularMomentum_='',
            Options_='',
            Options_WriteResultsTag='Yes')

        self.pcpot = None
        self.lines = None
        self.atoms = atoms
        self.temp_atoms = atoms
        self.atoms_input = None
        self.do_forces = True
        self.root = str(label)
        label = str(label) + 'dftb'
        Calculator.__init__(self, restart, ignore_bad_restart_file, label,
                            atoms, **kwargs)
        self.outfilename = str(self.root) + 'dftb.out'
        self.write_dftb_in(str(self.root) + 'dftb_in.hsd')
        self.calc = dftbplus.DftbPlus(libpath=self.lib,
                                      hsdpath=str(self.root) + 'dftb_in.hsd')
        self.BOHR__AA = 0.529177249
        self.AA__BOHR = 1 / self.BOHR__AA