def gr(input_file, dr=0.04, grandcanonical=False, ndim=-1, rmax=-1.0, *input_files, **global_args): """Radial distribution function""" global_args = _compat(global_args) if global_args['legacy']: backend = pp.RadialDistributionFunctionLegacy else: backend = pp.RadialDistributionFunction for th in _get_trajectories([input_file] + list(input_files), global_args): th._grandcanonical = grandcanonical cf = backend(th, dr=dr, rmax=rmax, norigins=global_args['norigins'], ndim=ndim) if global_args['filter'] is not None: cf = pp.Filter(cf, global_args['filter']) cf.do(update=global_args['update']) ids = distinct_species(th[0].particle) if len(ids) > 1 and not global_args['no_partial']: cf = Partial(backend, ids, th, dr=dr, rmax=rmax, norigins=global_args['norigins'], ndim=ndim) cf.do(update=global_args['update'])
def _default_rcut(th): """ Look for the first minimum in the partial g(r) """ from atooms.system.particle import distinct_species from atooms.postprocessing.partial import Partial from atooms.postprocessing import RadialDistributionFunction from .helpers import ifabsmm ids = distinct_species(th[0].particle) gr = Partial(RadialDistributionFunction, ids, th, dr=0.1) gr.do(update=False) rcut = {} for isp in ids: for jsp in ids: # First find absolute maximum _, m = ifabsmm(list(gr.partial[(isp, jsp)].grid), list(gr.partial[(isp, jsp)].value)) # Then look for first minimum after the maximum for i in range(len(gr.partial[(isp, jsp)].grid)): if gr.partial[(isp, jsp)].grid[i] >= m[0]: delta = gr.partial[(isp, jsp)].value[i+1] - gr.partial[(isp, jsp)].value[i] if delta >= 0: rcut[(isp, jsp)] = gr.partial[(isp, jsp)].grid[i] break return rcut
def sk(input_file, nk=20, dk=0.1, kmin=-1.0, kmax=15.0, ksamples=30, kgrid=None, weight=None, weight_trajectory=None, weight_fluctuations=False, *input_files, **global_args): """ Structure factor """ from atooms.trajectory import TrajectoryXYZ global_args = _compat(global_args) if global_args['fast']: backend = pp.StructureFactorFast else: backend = pp.StructureFactorLegacy if kgrid is not None: kgrid = [float(_) for _ in kgrid.split(',')] for th in _get_trajectories([input_file] + list(input_files), global_args): cf = backend(th, kgrid=kgrid, norigins=global_args['norigins'], kmin=kmin, kmax=kmax, nk=nk, dk=dk, ksamples=ksamples) if global_args['filter'] is not None: cf = pp.Filter(cf, global_args['filter']) if weight_trajectory is not None: weight_trajectory = TrajectoryXYZ(weight_trajectory) cf.add_weight(trajectory=weight_trajectory, field=weight, fluctuations=weight_fluctuations) cf.do(update=global_args['update']) ids = distinct_species(th[0].particle) if len(ids) > 1 and not global_args['no_partial']: cf = Partial(backend, ids, th, kgrid=kgrid, norigins=global_args['norigins'], kmin=kmin, kmax=kmax, nk=nk, dk=dk, ksamples=ksamples) cf.add_weight(trajectory=weight_trajectory, field=weight, fluctuations=weight_fluctuations) cf.do(update=global_args['update'])