CoreShellMorsePotential

class CoreShellMorsePotential(particleType1, particleType2, E0, k, r0)

Constructor of the potential.

Parameters:
  • particleType1 (ParticleType or ParticleIdentifier) – Identifier of the core particle type.
  • particleType2 (ParticleType or ParticleIdentifier) – Identifier of the shell particle type.
  • E0 (PhysicalQuantity of type energy) – Potential parameter.
  • k (PhysicalQuantity of type length**-1) – Potential parameter.
  • r0 (PhysicalQuantity of type length) – Potential parameter.
getAllParameterNames()

Return the names of all used parameters as a list.

getAllParameters()

Return all parameters of this potential and their current values as a <parameterName / parameterValue> dictionary.

static getDefaults()

Get the default parameters of this potential and return them in form of a dictionary of <parameter name, default value> key-value pairs.

getParameter(parameterName)

Get the current value of the parameter parameterName.

setCutoff(r_cut)

Set the cutoff radius for this potential.

Parameters:r_cut (PhysicalQuantity of type length) – The cutoff radius of this potential.
setE0(E0)

Set the parameter E0.

Parameters:E0 (PhysicalQuantity of type energy) – Potential parameter.
setK(k)

Set the parameter K.

Parameters:k (PhysicalQuantity of type length**-1) – Potential parameter.
setParameter(parameterName, value)

Set the parameter parameterName to the given value.

Parameters:
  • parameterName (str) – The name of the parameter that will be modified.
  • value – The new value that will be assigned to the parameter parameterName.
setR0(r0)

Set the parameter R0.

Parameters:r0 (PhysicalQuantity of type length) – Potential parameter.

Usage Examples

Define a core-shell potential for TiO2-rutile by adding particle types and interaction functions to the TremoloXPotentialSet.

# Set up lattice
lattice = SimpleTetragonal(4.593*Angstrom, 2.959*Angstrom)

# Define elements
elements = [Titanium, Titanium, Oxygen, Oxygen, Oxygen, Oxygen]

# Define coordinates
fractional_coordinates = [[-0.002453289082, -0.007907909466,  0.008991998629],
                          [ 0.486821568998,  0.505349605489,  0.498303421225],
                          [ 0.313234905089,  0.31385912058 , -0.002386305869],
                          [ 0.708385881142,  0.705329563593,  0.004823488804],
                          [ 0.801244040623,  0.185105024712,  0.48201997633 ],
                          [ 0.183768385074,  0.808268364353,  0.489566273637]]

# Set up configuration
bulk_configuration = BulkConfiguration(
    bravais_lattice=lattice,
    elements=elements,
    fractional_coordinates=fractional_coordinates
    )

# -------------------------------------------------------------
# Adding the core-shell potential.
# -------------------------------------------------------------

potentialSet = TremoloXPotentialSet(name = 'TiO2_CoreShell')

# Add a particle for the oxygen-shell.
# The shell must have zero mass.
potentialSet.addParticleType(ParticleType(symbol='O_shell',
                                          mass=0.0*atomic_mass_unit,
                                          charge=-1.598,
                                          atomicNumber=None))

# Add a particle for the oxygen-core.
potentialSet.addParticleType(ParticleType(symbol='O',
                                          mass=15.9994*atomic_mass_unit,
                                          charge=0.5,
                                          atomicNumber=8))

# Add a particle for titanium.
# For Ti we do not the core-shell approach to model polarization.
potentialSet.addParticleType(ParticleType(symbol='Ti',
                                          mass=47.867*atomic_mass_unit,
                                          charge=2.196,
                                          atomicNumber=22))

# Add the harmonic core-shell coupling for oxygen.
potential = CoreShellHarmonicPotential(particleType1 = 'O',
                                       particleType2 = 'O_shell',
                                       K = 44.3*eV/Angstrom**2,
                                       r0 = 0.0*Angstrom)
potentialSet.addPotential(potential)

# Add the normal short-ranged potentials between titanium atoms.
potential = TosiFumiPotential(particleType1 = 'Ti',
                              particleType2 = 'Ti',
                              A = 31120.528*eV,
                              B = 6.49350649351*1/Angstrom,
                              C = 5.25*eV*Angstrom**6,
                              D = 0.0*eV*Angstrom**8,
                              sigma = 0.0*Angstrom,
                              r_i = 5.0*Angstrom,
                              r_cut = 6.0*Angstrom)
potentialSet.addPotential(potential)

# Add short-ranged potentials between Ti and O-shells.
potential = TosiFumiPotential(particleType1 = 'Ti',
                              particleType2 = 'O_shell',
                              A = 16957.71*eV,
                              B = 5.15463917526*1/Angstrom,
                              C = 12.59*eV*Angstrom**6,
                              D = 0.0*eV*Angstrom**8,
                              sigma = 0.0*Angstrom,
                              r_i = 5.0*Angstrom,
                              r_cut = 6.0*Angstrom)
potentialSet.addPotential(potential)

# Add short-ranged potentials between O-shells.
potential = TosiFumiPotential(particleType1 = 'O_shell',
                              particleType2 = 'O_shell',
                              A = 11782.884*eV,
                              B = 4.2735042735*1/Angstrom,
                              C = 30.22*eV*Angstrom**6,
                              D = 0.0*eV*Angstrom**8,
                              sigma = 0.0*Angstrom,
                              r_i = 5.0*Angstrom,
                              r_cut = 6.0*Angstrom)
potentialSet.addPotential(potential)

# Set a Coulomb-solver for the electrostatic interactions.
potentialSet.setCoulombSolver(CoulombDSF(r_cut=9.0*Angstrom, alpha = 0.2))
calculator = TremoloXCalculator(parameters=potentialSet)

bulk_configuration.setCalculator(calculator)

Notes

In the core-shell potential [DO58], ions are modelled as two particles: A core and a massless shell which share the ion charge. As the shells are massless they will instantaneously move to positions such that the forces on the shells are zero. This is achieved by optimizing the potential energy with respect to the shell positions. The cores and the corresponding shells are connected by bonded potentials.

In the CoreShellHarmonicPotential, core and shell are connected via a harmonic potential:

\[E^\mathrm{core-shell}(r_\mathrm{core-shell}) = \frac{1}{2} K (r_\mathrm{core-shell} - r_0)^2 \, .\]

The CoreShellMorsePotential, defines a MorsePotential:

\[E^\mathrm{core-shell}(r_\mathrm{core-shell}) = E_0 \left ( \left [ 1 - e^{k(r_\mathrm{core-shell} - r_0)} \right ]^2 -1 \right )\]

between core and shell.

To define core-shell potentials, one must start with specifying all particles types, i.e. both cores and shells where the shells must have mass 0. The shell particles do not need to be specified in the configuration, as they are added automatically within the TremoloXCalculator.

Additional potentials (e.g. BuckinghamPotential or Coulomb-solvers, such as CoulombDSF) can be specified as usual. Please note that the contributions between a core and its corresponding shell from these potentials are not included in forces, stress, and potential energy.

[DO58]B. G. Dick and A. W. Overhauser. Theory of the dielectric constants of alkali halide crystals. Phys. Rev., 112:90–103, Oct 1958. doi:10.1103/PhysRev.112.90.