def test_mishin(): from ase.calculators.eam import EAM sys_setting ={'elements':['Al', 'Fe'], 'pot':'zhou', \ 'pca':[10], 'nAtoms':250,\ #'structure':'bcc',\ #'positions':'rnd','a':3.0, 'period':[5,5,5]} 'structure':'fcc',\ 'positions':'rnd','a':4.6, 'period':[2,2,2]} sys1 = sys.System(sys_setting) potDir = './' fileName = potDir + 'Zhou_AlFe.alloy' #potDir = '../../lammps/potentials/' #fileName = potDir + 'Ni.adp' mishin = EAM(potential=fileName) mishin.write_potential('new.eam.alloy') sys1.bulk.set_calculator(mishin) nAtoms = sys1.bulk.get_number_of_atoms() ep = sys1.bulk.get_potential_energy() / nAtoms forces = sys1.bulk.get_forces() print ep print mishin.Z print mishin.mass print mishin.a print mishin.lattice print mishin.nrho print mishin.drho print mishin.nr print mishin.dr #print mishin.d_d mishin.set_splines() print mishin.embedded_energy[0](30) mishin.plot()
m_densityf = spline(rs, m_density) m_embeddedf = spline(rhos, m_embedded) m_phif = spline(rs, m_phi) a = 4.05 # Angstrom lattice spacing al = bulk('Al', 'fcc', a=a) mishin_approx = EAM(elements=['Al'], embedded_energy=np.array([m_embeddedf]), electron_density=np.array([m_densityf]), phi=np.array([[m_phif]]), cutoff=cutoff, form='alloy', # the following terms are only required to write out a file Z=[13], nr=n, nrho=n, dr=cutoff / n, drho=2. / n, lattice=['fcc'], mass=[26.982], a=[a]) al.set_calculator(mishin_approx) mishin_approx_energy = al.get_potential_energy() mishin_approx.write_potential('Al99-test.eam.alloy') mishin_check = EAM(potential='Al99-test.eam.alloy') al.set_calculator(mishin_check) mishin_check_energy = al.get_potential_energy() print('Cohesive Energy for Al = ', mishin_approx_energy, ' eV') error = (mishin_approx_energy - mishin_check_energy) / mishin_approx_energy print('read/write check error = ', error) assert abs(error) < 1e-4
def test_eam(): # test to generate an EAM potential file using a simplified # approximation to the Mishin potential Al99.eam.alloy data from scipy.interpolate import InterpolatedUnivariateSpline as spline cutoff = 6.28721 n = 21 rs = np.arange(0, n) * (cutoff / n) rhos = np.arange(0, 2, 2. / n) # generated from # mishin = EAM(potential='../potentials/Al99.eam.alloy') # m_density = mishin.electron_density[0](rs) # m_embedded = mishin.embedded_energy[0](rhos) # m_phi = mishin.phi[0,0](rs) m_density = np.array([ 2.78589606e-01, 2.02694937e-01, 1.45334053e-01, 1.06069912e-01, 8.42517168e-02, 7.65140344e-02, 7.76263116e-02, 8.23214224e-02, 8.53322309e-02, 8.13915861e-02, 6.59095390e-02, 4.28915711e-02, 2.27910928e-02, 1.13713167e-02, 6.05020311e-03, 3.65836583e-03, 2.60587564e-03, 2.06750708e-03, 1.48749693e-03, 7.40019174e-04, 6.21225205e-05 ]) m_embedded = np.array([ 1.04222211e-10, -1.04142633e+00, -1.60359806e+00, -1.89287637e+00, -2.09490167e+00, -2.26456628e+00, -2.40590322e+00, -2.52245359e+00, -2.61385603e+00, -2.67744693e+00, -2.71053295e+00, -2.71110418e+00, -2.69287013e+00, -2.68464527e+00, -2.69204083e+00, -2.68976209e+00, -2.66001244e+00, -2.60122024e+00, -2.51338548e+00, -2.39650817e+00, -2.25058831e+00 ]) m_phi = np.array([ 6.27032242e+01, 3.49638589e+01, 1.79007014e+01, 8.69001383e+00, 4.51545250e+00, 2.83260884e+00, 1.93216616e+00, 1.06795515e+00, 3.37740836e-01, 1.61087890e-02, -6.20816372e-02, -6.51314297e-02, -5.35210341e-02, -5.20950200e-02, -5.51709524e-02, -4.89093894e-02, -3.28051688e-02, -1.13738785e-02, 2.33833655e-03, 4.19132033e-03, 1.68600692e-04 ]) m_densityf = spline(rs, m_density) m_embeddedf = spline(rhos, m_embedded) m_phif = spline(rs, m_phi) a = 4.05 # Angstrom lattice spacing al = bulk('Al', 'fcc', a=a) mishin_approx = EAM( elements=['Al'], embedded_energy=np.array([m_embeddedf]), electron_density=np.array([m_densityf]), phi=np.array([[m_phif]]), cutoff=cutoff, form='alloy', # the following terms are only required to write out a file Z=[13], nr=n, nrho=n, dr=cutoff / n, drho=2. / n, lattice=['fcc'], mass=[26.982], a=[a]) al.calc = mishin_approx mishin_approx_energy = al.get_potential_energy() mishin_approx.write_potential('Al99-test.eam.alloy') mishin_check = EAM(potential='Al99-test.eam.alloy') al.calc = mishin_check mishin_check_energy = al.get_potential_energy() print('Cohesive Energy for Al = ', mishin_approx_energy, ' eV') error = (mishin_approx_energy - mishin_check_energy) / mishin_approx_energy print('read/write check error = ', error) assert abs(error) < 1e-4