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))
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))
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))
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)
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)
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)
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)
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)
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