def plot_results(o_potential_fitter): import matplotlib.pyplot as plt fig, ax = plt.subplots(3, 1) rmax = o_potential_fitter.setfl_reader.n_r * o_potential_fitter.setfl_reader.d_r rN = o_potential_fitter.setfl_reader.n_r r = create_r(rmax, rN) rhomax = o_potential_fitter.setfl_reader.n_rho * o_potential_fitter.setfl_reader.d_rho rhoN = o_potential_fitter.setfl_reader.n_rho rho = create_r(rhomax, rhoN) ax[0].plot(r, o_potential_fitter.setfl_reader.pair_function('NiNi'), label='from_file') ax[0].plot(r, o_potential_fitter.formalisms['pair']['NiNi']( r, **o.parameters['popt']['pair']['NiNi']), label='fitted') ax[0].set_xlim([1.5, 5.168]) ax[0].set_ylim([-1, 5]) ax[1].plot(r, o.setfl_reader.density_function('Ni'), label='from_file') ax[1].plot(r, o.formalisms['density']['Ni']( r, **o.parameters['popt']['density']['Ni']), label='fitted') ax[1].set_xlim([1.5, 5.168]) #ax[0].set_ylim([-1,5]) # ax[2].plot(rho, o.setfl_reader.embedding_function('Ni'), label='from_file') ax[2].plot(rho, o.formalisms['embedding']['Ni']( r, **o.parameters['popt']['embedding']['Ni']), label='fitted') plt.show()
def fit_density_function(self, func_density, symbol, param0, bounds, rlow=None, rhigh=None): if not isinstance(self.setfl_reader,SeatonSetflReader): m = "the read_setfl_command method must be run before this method" raise EamSetflFitterException(m) arg_names = [k for k in inspect.getargspec(func_density)[0] if k!= 'r'] p0 = [param0[k] for k in arg_names] bounds_ = [ [bounds[k][0] for k in arg_names], [bounds[k][1] for k in arg_names]] for i in range(len(arg_names)): print(arg_names[i],p0[i],bounds_[0][i], bounds_[1][i]) # maximum interatomic spacing distance rmax = self.setfl_reader.n_r * self.setfl_reader.d_r # interatomic spacing distance step size rN = self.setfl_reader.n_r if rlow is None and rhigh is None: r = create_r(rmax,rN) rho = np.array(self.setfl_reader.density_function(symbol)) else: r_ = create_r(rmax,rN) rho_ = np.array(self.setfl_reader.density_function(symbol)) r = r_[np.all([r_>rlow,r_<rhigh],axis=0)] rho = rho_[np.all([r_>rlow,r_<rhigh],axis=0)] # iterate until convergence while True: popt,pcov = curve_fit(f=func_density, xdata=r, ydata=rho, p0=p0, check_finite=False, bounds=bounds_, method='trf') if all([np.abs(k[1]/k[0]-1) < 0.01 for k in zip(popt,p0)]): break p0=popt self.parameters['p0']['density'][symbol] = param0 self.parameters['popt']['density'][symbol] = OrderedDict( [(k[0],k[1]) for k in zip(arg_names,popt)]) self.formalisms['density'][symbol] = func_density
def fit_potential_pair(self, func_pair_potential, symbol_pair, param0, rlow=None): if not isinstance(self.setfl_reader, SeatonSetflReader): m = "the read_setfl_command method must be run before this method" raise EamSetflFitterException(m) pair_name = "".join(symbol_pair) arg_names = [ k for k in inspect.signature(func_pair_potential).parameters if k != 'r' ] p0 = [param0[k] for k in arg_names if k != 'r'] # maximum interatomic spacing distance rmax = self.setfl_reader.n_r * self.setfl_reader.d_r # interatomic spacing distance step size rN = self.setfl_reader.n_r if rlow is None: r = create_r(rmax, rN) phi = np.array(self.setfl_reader.pair_function(pair_name)) else: r_ = create_r(rmax, rN) phi_ = np.array(self.setfl_reader.pair_function(pair_name)) r = r_[r_ > rlow] phi = phi_[r_ > rlow] # iterate until convergence while True: popt, pcov = curve_fit(func_pair_potential, r, phi, method='trf', p0=p0) if all([np.abs(k[1] / k[0] - 1) < 0.01 for k in zip(popt, p0)]): break p0 = popt self.parameters['p0']['pair'][pair_name] = param0 self.parameters['popt']['pair'][pair_name] = OrderedDict([ (k[0], k[1]) for k in zip(arg_names, popt) ]) self.formalisms['pair'][pair_name] = func_pair_potential
def test__EquationOfStateSolver(symbols,pair_names): rmax = 10 rN = 1000 r = create_r(rmax,rN) rhomax = 10. rhoN = 1000 rho = create_rho(rhomax,rN) o = EquationOfStateSolver(symbols,r,rho) assert o.symbols == symbols assert np.array_equal(o.r,r) assert np.array_equal(o.rho,rho) assert isinstance(o.potentials,OrderedDict) for k in EquationOfStateSolver.potential_types: assert k in o.potentials for pn in pair_names: assert pn in o.potentials['pair'] assert isinstance(o.potentials['pair'][pn],OrderedDict) assert 'formalism' in o.potentials['pair'][pn] assert 'parameters' in o.potentials['pair'][pn] assert 'evaluation' in o.potentials['pair'][pn] for s in symbols: assert s in o.potentials['density'] assert isinstance(o.potentials['density'][s],OrderedDict) assert 'formalism' in o.potentials['density'][s] assert 'parameters' in o.potentials['density'][s] assert 'evaluation' in o.potentials['density'][s] for s in symbols: assert s in o.potentials['embedding'] assert isinstance(o.potentials['embedding'][s],OrderedDict) assert 'formalism' in o.potentials['embedding'][s] assert 'parameters' in o.potentials['embedding'][s] assert 'evaluation' in o.potentials['embedding'][s]
def plot_results(): import matplotlib.pyplot as plt fig, ax = plt.subplots(3, 1) rmax = o.setfl_reader.n_r * o.setfl_reader.d_r rN = o.setfl_reader.n_r r = create_r(rmax, rN) ax[0].plot(r, o.setfl_reader.pair_function('NiNi'), label='from_file') ax[0].plot(r, o.formalisms['pair']['NiNi']( r, **o.parameters['popt']['pair']['NiNi']), label='fitted') ax[1].plot(r, o.setfl_reader.density_function('Ni'), label='from_file') ax[1].plot(r, o.formalisms['density']['Ni']( r, **o.parameters['popt']['density']['Ni']), label='fitted') ax[2].plot(rho, o.setfl.reader.embedding_function('NiNi'), label='from_file') ax[2].plot(rho, o.formalism['embedding']['Ni']( r, **o.parameters['popt']['density']['Ni']), label='fitted') plt.show()
def fit_density_function(self, func_density, symbol, param0, rlow=None): if not isinstance(self.setfl_reader, SeatonSetflReader): m = "the read_setfl_command method must be run before this method" raise EamSetflFitterException(m) arg_names = [ k for k in inspect.getargspec(func_density)[0] if k != 'r' ] p0 = [param0[k] for k in arg_names] # maximum interatomic spacing distance rmax = self.setfl_reader.n_r * self.setfl_reader.d_r # interatomic spacing distance step size rN = self.setfl_reader.n_r if rlow is None: r = create_r(rmax, rN) rho = np.array(self.setfl_reader.density_function(symbol)) else: # temporary arrays r_ = create_r(rmax, rN) rho_ = np.array(self.setfl_reader.density_function(symbol)) # final arrays r = r_[r_ > rlow] rho = rho_[r_ > rlow] # iterate until convergence while True: popt, pcov = curve_fit(func_density, r, rho, method='trf', p0=p0) if all([np.abs(k[1] / k[0] - 1) < 0.01 for k in zip(popt, p0)]): break p0 = popt self.parameters['p0']['density'][symbol] = param0 self.parameters['popt']['density'][symbol] = OrderedDict([ (k[0], k[1]) for k in zip(arg_names, popt) ]) self.formalisms['density'][symbol] = func_density
def test__create_r(rmax,rN): r = create_r(rmax,rN) assert isinstance(r,np.ndarray) assert r.max() == rmax assert r.size == rN
from pypospack.potential.pair_general_lj import ( func_cutoff_mishin2004, func_pair_generalized_lj, func_pair_generalized_lj_w_cutoff) parameters = { 'b1': 4.7067e-3, 'b2': 0.15106, 'r1': 3.8663e-4, 'V0': -3.5126e3, 'delta': 3.6046e3, 'rc': 5.168, 'hc': 3.323, 'h0': 1.500 } r = create_r(6.0, 1000) def test__func_cutoff_mishin2004__r_numpy(): param = [ parameters[v] for v in inspect.signature(func_cutoff_mishin2004).parameters if v != 'r' ] psi = func_cutoff_mishin2004(r, *param) assert isinstance(psi, np.ndarray) def test__func_pair_generalized_lj__r_numpy(): param = [ parameters[v]
a[i] = brentq(f=get_density_at_a, a=a_min, b=a_max, args=(rhostar, func_density, func_density_param), xtol=a_tol) E_eos = func_zopemishin_eos(a, a0, B, E0, beta) E_pair = get_pair_energy_at_a(a, func_pair, func_pair_param) E_embedding = E_eos - E_pair return E_embedding rhomax = o.setfl_reader.n_rho * o.setfl_reader.d_rho rhoN = o.setfl_reader.n_rho rho = create_r(rhomax, rhoN) arg_names = [ k for k in inspect.getargspec(func_zopemishin_embedding_function)[0] if k not in ['rho', 'lattice_type'] ] print(arg_names) args = [potentials['embedding']['Ni']['param'][k] for k in arg_names] embedding = func_zopemishin_embedding_function(rho, *args) assert embedding.size == rho.size o.fit_eos_embedding_function(func_embedding=func_zopemishin_embedding_function, symbol='Ni', param0=potentials['embedding']['Ni']['param'], bounds=potentials['embedding']['Ni']['bounds']) print(o.parameters['p0']['embedding']['Ni'])
import numpy as np import matplotlib.pyplot as plt from pypospack.eamtools import create_r from pypospack.potential.pair_general_lj import func_cutoff_mishin2004 r = create_r(6.,5000) rc = 5.168 hc = 0.332 xrc = (r-rc)/hc psirc = (xrc**4)/(1+xrc**4) rc_ind = np.ones(r.size) rc_ind[r > rc] = 0 psirc = psirc * rc_ind h0 = 0.332 x0 = r/h0 psi0 = (x0**4)/(1+x0**4) fig, ax = plt.subplots(3, 1) ax[0].plot(r,psirc,label=r'$\Psi_{c}$') ax[0].set_ylabel(r'$\Psi_{c}$') ax[1].plot(r,psi0,label=r'$\Psi_{0}$') ax[1].set_ylabel(r'$\Psi_{0}$') ax[2].plot(r,psirc*psi0,label=r'$\Psi_{c}*\Psi_{0}$') ax[2].set_ylabel(r'$\Psi_{c}\Psi_{0}$') for i in range(2):