ACEmd
ACEmd is molecular dynamics interface for Julia ACE. All MD use cases should use this package.
ACEmd is fully AtomsBase compatible and you should use AtomsBase over older JuLIP. You can still use JuLIP Atoms type as an input, while in a long run JuLIP will be decommissioned.
Example use case
using ACEmd # Reexports AtomsBase and Unitful
using ExtXYZ
# Load potential and atomic structure
fname_ace = joinpath(pkgdir(ACEmd), "data", "TiAl.json")
fname_xyz = joinpath(pkgdir(ACEmd), "data", "TiAl-big.xyz")
data = ExtXYZ.load(fname_xyz)
pot = load_ace_model(fname_ace)
# use ACE to calculate...
ace_energy(pot, data)
ace_forces(pot, data)
ace_virial(pot, data)3×3 StaticArraysCore.SMatrix{3, 3, Quantity{Float64, 𝐋^2 𝐌 𝐓^-2, Unitful.FreeUnits{(eV,), 𝐋^2 𝐌 𝐓^-2, nothing}}, 9} with indices SOneTo(3)×SOneTo(3):
2832.4 eV -370.68 eV -29.4763 eV
-370.68 eV 3025.77 eV 107.811 eV
-29.4763 eV 107.811 eV 2640.32 eVUnits
ACEmd supports Unitful and it is reexported by default.
Defaults units are
julia> ACEmd.default_energyeVjulia> ACEmd.default_lengthÅ
Units can be changes when loading potential
pot_ev = load_ace_model(fname_ace;
energy_unit=u"eV",
length_unit=u"Å",
cutoff_unit=u"Å"
)
ace_energy(pot_ev, data)-871121.5798250815 eVAlternatively you can overload the default unit by giving it explicitly
julia> ace_energy(pot_ev, data; energy_unit=u"hartree")-871121.5798250815 Eₕ
Following units are taken into account
energy_unitdefines the energy unit of the potentiallength_unitdefines the length unit for the potentialcutoff_unitdefines unit for the cutoff that the potential is using
Energy of each atom
You can get ACE energy of each atom by
julia> ace_atom_energies(pot, data)1024-element Vector{Quantity{Float64, 𝐋^2 𝐌 𝐓^-2, Unitful.FreeUnits{(eV,), 𝐋^2 𝐌 𝐓^-2, nothing}}}: -1596.241529881289 eV -90.76669193128637 eV -1605.121814971094 eV -107.87242892588243 eV -1601.0892689442514 eV -96.13216662528322 eV -1592.6724838525176 eV -99.45655681883972 eV -1589.9271274402288 eV -111.54806148881212 eV ⋮ -105.39619732063056 eV -1593.3749030752117 eV -93.76209609252673 eV -1613.3745430266056 eV -100.62098464712287 eV -1591.967415066941 eV -102.4050737392281 eV -1594.066737897485 eV -99.32310132688248 eV
Index
ACEmd.IPIprotocol.run_driverACEmd.ace_atom_energiesACEmd.ace_energyACEmd.ace_forcesACEmd.ace_virialACEmd.load_ace_model
ACEmd.ace_atom_energies — Methodace_atom_energies(potential, atoms; kwargs)Calculates ACE potential energy for each atom. The atoms object needs to be in AtomsBase compatable format. The returned energy has a unit as defined by Unitful.
Parallel execution is done with Transducers.jl and there is an option to use different executors. Look for ThreadedEx or other executors for more details on how to control it.
Kwargs
domain=1:length(atoms): choose subset of atoms to which energy is calculatedexecutor=ThreadedEx(): used to control multithreading using Transducers.jlenergy_unit: used to override energy unit for the calculationlength_unit: used to override lenght unit for the calculationcutoff_unit: used to override unit that cutoff radius is defined
ACEmd.ace_energy — Methodace_energy(potential, atoms, Kwargs)Calculates ACE potential energy for atomic system. The atoms object needs to be in AtomsBase compatable format. The returned energy has a unit as defined by Unitful.
Parallel execution is done with Transducers.jl and there is an option to use different executors. Look for ThreadedEx or other executors for more details on how to control it.
Kwargs
domain=1:length(atoms): choose subset of atoms to which energy is calculatedexecutor=ThreadedEx(): used to control multithreading using Transducers.jlenergy_unit: used to override energy unit for the calculationlength_unit: used to override lenght unit for the calculationcutoff_unit: used to override unit that cutoff radius is defined
ACEmd.ace_forces — Methodace_forces(potential, atoms, Kwargs)Calculates forces for ACE potential for given atomic system. The atoms object needs to be in AtomsBase compatable format. The returned energy has a unit as defined by Unitful.
Parallel execution is done with Transducers.jl and there is an option to use different executors. Look for ThreadedEx or other executors for more details on how to control it. ntasks parameter is used to define number of task that the calculation is divided into.
Kwargs
domain=1:length(atoms): choose subset of atoms to which energy is calculatedexecutor=ThreadedEx(): used to control multithreading using Transducers.jlntasks=Threads.nthreads(): how many tasks are used in the calculationenergy_unit: used to override energy unit for the calculationlength_unit: used to override lenght unit for the calculationcutoff_unit: used to override unit that cutoff radius is defined
ACEmd.ace_virial — Methodace_virial(potential, atoms, Kwargs)Calculates virial for ACE potential for given atomic system. The atoms object needs to be in AtomsBase compatable format. The returned energy has a unit as defined by Unitful.
Parallel execution is done with Transducers.jl and there is an option to use different executors. Look for ThreadedEx for more details on how to control it.
Kwargs
domain=1:length(atoms): choose subset of atoms to which energy is calculatedexecutor=ThreadedEx(): used to control multithreading using Transducers.jlenergy_unit: used to override energy unit for the calculationlength_unit: used to override lenght unit for the calculationcutoff_unit: used to override unit that cutoff radius is defined
ACEmd.load_ace_model — Methodload_ace_model(fname::AbstractString; Kwargs)
load_ace_model(potential: Kwargs)Used to load potential from json or yml files. By default this adds units for the potential. You can use Kwargs to control what units are used. The default units are defined in ACEmd.default_energy and ACEmd.default_length.
You can also use this to convert non unit holding potentials to potentials that have units. Like e.g. when you have fitted a new potential it does not have unit. You can then use this function to wrap units for it.
Kwargs
energy_unit=default_energy: energy unit for the potentiallength_unit=default_length: lenght unit used for the force and atomic systemcutoff_unit=default_length: unit in which cuttoff radius has been defined
ACEmd.IPIprotocol.run_driver — Methodrun_driver(address, potential, init_structure; port=31415, unixsocket=false )Connect I-PI driver to server at given address. Use kword port (default 31415) to specify port. If kword unixsocket is true, address is understood to be the name of the socket and port option is ignored.
You need to give initial structure as I-PI protocol does not transfer atom symbols. This means that, if you want to change the number of atoms or their symbols, you need to lauch a new driver.