Source code for atsim.potentials._dlpoly_writeTABEAM

"""Module containing functions for creating DL_POLY TABEAM files"""
import sys

from ._potential import Potential

from io import StringIO


def _tabulateFunction(outputfile, func, numpoints, step):
  outputbuilder = StringIO()
  row = []
  for i in range(numpoints):
    row.append(u"%f" % (func( float(i) * step)))
    if len(row) == 4:
      print(" ".join(row), file=outputbuilder)
      row = []
  if row:
    print(u" ".join(row), file=outputbuilder)
  outputfile.write(outputbuilder.getvalue())

def _writeEmbeddingFunction(eampotential, nrho, drho, outfile):
  outputbuilder = StringIO()
  print(u"embe %s %d 0.0 %f" % (eampotential.species, nrho, (nrho-1) * float(drho)), file=outputbuilder)

  _tabulateFunction(outputbuilder, eampotential.embeddingFunction, nrho, drho)
  outfile.write(outputbuilder.getvalue())


def _writeDensityFunction(speciesA, speciesB, electronDensityFunction, nr, dr, outfile):
  outputbuilder = StringIO()
  if speciesA and speciesB:
    print(u"dens %s %s %d 0.0 %f" % (speciesA, speciesB, nr, (nr-1) * float(dr)), file=outputbuilder)
  else:
    print(u"dens %s %d 0.0 %f" % (speciesA, nr, (nr-1) * float(dr)), file=outputbuilder)
  _tabulateFunction(outputbuilder, electronDensityFunction, nr, dr)
  outfile.write(outputbuilder.getvalue())

def _writePairPotential(pairPotential, nr, dr, outfile):
  outputbuilder = StringIO()
  print(u"pair %s %s %d 0.0 %f" % (pairPotential.speciesA, pairPotential.speciesB, nr, ((nr-1) * float(dr))), file=outputbuilder)

  def potentialCallable(r):
    return pairPotential.energy(r)

  _tabulateFunction(outputbuilder, potentialCallable, nr, dr)
  outfile.write(outputbuilder.getvalue())

def _writePairPotentials(eamPotentials, pairPotentials, nr, dr, outfile):
  pairs = set()
  for i in eamPotentials:
    for j in eamPotentials:
      k = tuple(sorted([i.species, j.species]))
      pairs.add(k)

  pairPotDict = {}
  for pot in pairPotentials:
    k = tuple(sorted([pot.speciesA, pot.speciesB]))
    pairPotDict[k] = pot

  def nullfunc(rij):
    return 0.0

  for k in sorted(pairs):
    if k not in pairPotDict:
      pot = Potential(k[0], k[1], nullfunc)
    else:
      pot = pairPotDict[k]
    _writePairPotential(pot, nr, dr, outfile)


def _writeTitle(title, out):
  title = u"%s%s" % (title, 100*' ')[:100]
  print(title, file=out)


def _writeTABEAM_exceptDensity(nrho, drho, nr, dr, eamPotentials, pairPotentials, title, numpots, outputbuilder):
  _writeTitle(title, outputbuilder)


  print(u"%d" % (numpots,), file=outputbuilder)

  #Write the pair potentials
  _writePairPotentials(eamPotentials, pairPotentials, nr, dr, outputbuilder)

  #Write the embedding functions
  for eampotential in eamPotentials:
    _writeEmbeddingFunction(eampotential, nrho, drho, outputbuilder)


[docs]def writeTABEAM(nrho, drho, nr, dr, eampots, pairpots, out = sys.stdout, title = ""): """Create ``TABEAM`` file for use with the ``DL_POLY`` simulation code. .. seealso :: For a working example using this function see :ref:`eam_example_2b` :param nrho: Number of entries in tabulated embedding functions :type nrho: int :param drho: Step size between consecutive embedding function entries :type drho: float :param nr: Number of entries in tabulated pair potentials and density functions :type nr: int :param dr: Step size between entries in tabulated pair potentials and density functions :type dr: float :param eampots: Potentials List of potentials.EAMPotential objects :type eam: list :param pair: Potentials List of potentials.Potential objects :type pairpots: list :param out: Python file object to which TABEAM data should be written :type out: file object :param title: Title of TABEAM file :type title: str""" #Write the title outputbuilder = StringIO() numpots = len(eampots) numpots = numpots*(numpots+5)/2 _writeTABEAM_exceptDensity(nrho, drho, nr, dr, eampots, pairpots, title, numpots, outputbuilder) #Write the density functions for eampotential in eampots: _writeDensityFunction(eampotential.species, None, eampotential.electronDensityFunction, nr, dr, outputbuilder) out.write(outputbuilder.getvalue())
[docs]def writeTABEAMFinnisSinclair(nrho, drho, nr, dr, eampots, pairpots, out = sys.stdout, title = ""): """Create Exended EAM variant of DL_POLY ``TABEAM`` file. The :class:`~atsim.potentials.EAMPotential` instances within the ``eampots`` list are expected to provide individual density functions for each species pair in the species being tabulated. See :meth:`~atsim.potentials.EAMPotential.__init__` for how these are specified to the :class:`~atsim.potentials.EAMPotential` constructor. .. note :: The Extended EAM variant for which this function creates ``TABEAM`` files (i.e. metal potential type = eeam) is only supported in DL_POLY versions >= 4.05. .. seealso :: For a working example using this function see :ref:`eam_example_3b` :param nrho: Number of entries in tabulated embedding functions :type nrho: int :param drho: Step size between consecutive embedding function entries :type drho: float :param nr: Number of entries in tabulated pair potentials and density functions :type nr: int :param dr: Step size between entries in tabulated pair potentials and density functions :type dr: float :param eampots: Potentials List of :class:`atsim.potentials.EAMPotential` objects :type eam: list :param pairpots: Potentials List of :class:`atsim.potentials.Potential` objects :type pairpots: list :param out: Python file object to which ``TABEAM`` data should be written :type out: file object :param title: Title of TABEAM file :type title: str""" #Write the title outputbuilder = StringIO() numpots = len(eampots) numpots = 3*numpots*(numpots+1)/2 _writeTABEAM_exceptDensity(nrho, drho, nr, dr, eampots, pairpots, title, numpots, outputbuilder) # Write the density functions speciesList = sorted([ep.species for ep in eampots]) for eamPotential in eampots: speciesA = eamPotential.species for speciesB in speciesList: try: densityFunction = eamPotential.electronDensityFunction[speciesB] except KeyError: raise KeyError("Density function for '%s-%s' pair not specified in '%s' EAMPotential, density dictionary." % (speciesA, speciesB, speciesA)) _writeDensityFunction(speciesA, speciesB, densityFunction, nr, dr, outputbuilder) out.write(outputbuilder.getvalue())