Esempio n. 1
0
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()
Esempio n. 2
0
    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
Esempio n. 3
0
    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]
Esempio n. 5
0
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()
Esempio n. 6
0
    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
Esempio n. 7
0
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]
Esempio n. 9
0
        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'])
Esempio n. 10
0
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):