From 8b704235ad65a6c20f5a52158d08085a9270c5ea Mon Sep 17 00:00:00 2001 From: GardevoirX Date: Fri, 27 Mar 2026 23:24:36 +0100 Subject: [PATCH 1/5] Reuse the shared code of `add_masses` and `add_momenta` --- src/ML-METATOMIC/metatomic_system.cpp | 75 ++++++++++++++------------- src/ML-METATOMIC/metatomic_system.h | 9 ++++ 2 files changed, 47 insertions(+), 37 deletions(-) diff --git a/src/ML-METATOMIC/metatomic_system.cpp b/src/ML-METATOMIC/metatomic_system.cpp index 4652449d3b9..265797ac789 100644 --- a/src/ML-METATOMIC/metatomic_system.cpp +++ b/src/ML-METATOMIC/metatomic_system.cpp @@ -628,29 +628,7 @@ void MetatomicSystemAdaptor::add_masses(metatomic_torch::System& system, double masses = masses.index_select(0, mta_to_lmp_tensor); masses = masses * unit_conversion; - - auto keys = metatensor_torch::LabelsHolder::single()->to(device); - auto label_tensor_options = torch::TensorOptions().dtype(torch::kInt32).device(device); - auto samples_values = torch::column_stack({ - torch::zeros(system->size(), label_tensor_options).unsqueeze(1), - torch::arange(system->size(), label_tensor_options).unsqueeze(1) - }); - auto samples = torch::make_intrusive( - std::vector{"system","atom"}, - samples_values, - metatensor::assume_unique{} - ); - auto properties = metatensor_torch::LabelsHolder::single()->to(device); - auto block = torch::make_intrusive( - masses.to(dtype).to(device).unsqueeze(-1), // add property dimension - samples, - std::vector{}, - properties - ); - auto tensor = torch::make_intrusive( - keys, - std::vector{block} - ); + auto tensor = make_per_atom_tensormap(masses, dtype, device); system->add_data("masses", tensor, /*override=*/true); } @@ -685,37 +663,60 @@ void MetatomicSystemAdaptor::add_momenta(metatomic_torch::System& system, double momenta = momenta.index_select(0, mta_to_lmp_tensor); momenta = momenta * unit_conversion; + auto tensor = make_per_atom_tensormap(momenta, dtype, device, {"xyz"}); - auto keys = metatensor_torch::LabelsHolder::single()->to(device); + system->add_data("momenta", tensor, /*override=*/true); +} +metatensor_torch::TensorMap MetatomicSystemAdaptor::make_per_atom_tensormap( + const torch::Tensor& values, + torch::ScalarType dtype, + const torch::Device& device, + const std::vector& component_names +) { + if (values.dim() != static_cast(component_names.size() + 1)) { + error->all( + FLERR, + "metatomic per-atom TensorMap helper expected rank {} tensor, got rank {}", + component_names.size() + 1, + values.dim() + ); + } + + auto n_atoms = values.size(0); auto label_tensor_options = torch::TensorOptions().dtype(torch::kInt32).device(device); + + auto keys = metatensor_torch::LabelsHolder::single()->to(device); auto samples_values = torch::column_stack({ - torch::zeros(system->size(), label_tensor_options).unsqueeze(1), - torch::arange(system->size(), label_tensor_options).unsqueeze(1) + torch::zeros(n_atoms, label_tensor_options).unsqueeze(1), + torch::arange(n_atoms, label_tensor_options).unsqueeze(1) }); auto samples = torch::make_intrusive( - std::vector{"system","atom"}, + std::vector{"system", "atom"}, samples_values, metatensor::assume_unique{} ); - auto component_values = torch::arange(3, label_tensor_options).unsqueeze(1); - auto component = torch::make_intrusive( - std::vector{"xyz"}, component_values - ); + auto components = std::vector{}; + for (size_t axis = 0; axis < component_names.size(); axis++) { + auto component_values = torch::arange(values.size(axis + 1), label_tensor_options).unsqueeze(1); + auto component = torch::make_intrusive( + std::vector{component_names[axis]}, + component_values + ); + components.push_back(component); + } auto properties = metatensor_torch::LabelsHolder::single()->to(device); - auto block = torch::make_intrusive( - momenta.to(dtype).to(device).unsqueeze(-1), + values.to(dtype).to(device).unsqueeze(-1), samples, - std::vector{component}, + components, properties ); - auto tensor = torch::make_intrusive( + + return torch::make_intrusive( keys, std::vector{block} ); - - system->add_data("momenta", tensor, /*override=*/true); } diff --git a/src/ML-METATOMIC/metatomic_system.h b/src/ML-METATOMIC/metatomic_system.h index 38fa9ed62d8..a7dbf7b0888 100644 --- a/src/ML-METATOMIC/metatomic_system.h +++ b/src/ML-METATOMIC/metatomic_system.h @@ -16,6 +16,7 @@ #include #include +#include #include "pointers.h" #include "pair.h" @@ -81,6 +82,14 @@ class MetatomicSystemAdaptor : public Pointers { // Add momenta as extra data to this system, only for atoms which are not // periodic images of other atoms virtual void add_momenta(metatomic_torch::System& system, double unit_conversion); + // Build a per-atom TensorMap from values shaped as [atoms, components...]. + // A property dimension is appended automatically. + virtual metatensor_torch::TensorMap make_per_atom_tensormap( + const torch::Tensor& values, + torch::ScalarType dtype, + const torch::Device& device, + const std::vector& component_names = {} + ); // Explicit strain for virial calculations. This uses the same dtype/device // as LAMMPS data (positions, …) From 3307673008bd5062e396ecca961d5da573cd1abf Mon Sep 17 00:00:00 2001 From: GardevoirX Date: Sat, 28 Mar 2026 20:14:54 +0100 Subject: [PATCH 2/5] Give names to the property label of the requested input's tensormap --- src/ML-METATOMIC/metatomic_system.cpp | 133 +++++++++++++++++--------- src/ML-METATOMIC/metatomic_system.h | 21 ++-- 2 files changed, 100 insertions(+), 54 deletions(-) diff --git a/src/ML-METATOMIC/metatomic_system.cpp b/src/ML-METATOMIC/metatomic_system.cpp index 265797ac789..3fe5bb615e4 100644 --- a/src/ML-METATOMIC/metatomic_system.cpp +++ b/src/ML-METATOMIC/metatomic_system.cpp @@ -206,6 +206,56 @@ static std::array cell_shifts( return {shift_a, shift_b, shift_c}; } +metatensor_torch::TensorMap LAMMPS_NS::make_per_atom_tensormap( + const torch::Tensor& values, + const torch::ScalarType& dtype, + const torch::Device& device, + const std::string& property_name, + const std::vector& component_names +) { + assert (values.dim() == static_cast(component_names.size() + 1)); + + auto n_atoms = values.size(0); + auto label_tensor_options = torch::TensorOptions().dtype(torch::kInt32).device(device); + + auto keys = metatensor_torch::LabelsHolder::single()->to(device); + auto samples_values = torch::column_stack({ + torch::zeros(n_atoms, label_tensor_options).unsqueeze(1), + torch::arange(n_atoms, label_tensor_options).unsqueeze(1) + }); + auto samples = torch::make_intrusive( + std::vector{"system", "atom"}, + samples_values, + metatensor::assume_unique{} + ); + + auto components = std::vector{}; + for (size_t axis = 0; axis < component_names.size(); axis++) { + auto component_values = torch::arange(values.size(axis + 1), label_tensor_options).unsqueeze(1); + auto component = torch::make_intrusive( + std::vector{component_names[axis]}, + component_values + ); + components.push_back(component); + } + + auto properties = torch::make_intrusive( + std::vector{property_name}, + torch::tensor({{0}}, label_tensor_options) + ); + auto block = torch::make_intrusive( + values.to(dtype).to(device).unsqueeze(-1), + samples, + components, + properties + ); + + return torch::make_intrusive( + keys, + std::vector{block} + ); +} + void MetatomicSystemAdaptor::guess_periodic_ghosts() { auto _ = MetatomicTimer("identifying periodic ghosts"); auto total_n_atoms = atom->nlocal + atom->nghost; @@ -589,6 +639,20 @@ metatomic_torch::System MetatomicSystemAdaptor::system_from_lmp( this->setup_neighbors(system, list); + for (const auto& input: inputs) { + const auto& quantity = input->quantity().c_str(); + const auto& unit = input->unit().c_str(); + if (strcmp(quantity, "mass") == 0) { + add_masses(system, metatomic_torch::unit_conversion_factor(quantity, "u", unit)); + } else if (strcmp(quantity, "momentum") == 0) { + add_momenta(system, metatomic_torch::unit_conversion_factor(quantity, "u*A/ps", unit)); + } else if (strcmp(quantity, "velocity") == 0) { + add_velocities(system, metatomic_torch::unit_conversion_factor(quantity, "A/ps", unit)); + } else { + error->all(FLERR, "compute metatomic: the model requested an unsupported additional input of quantity '{}'", quantity); + } + } + return system; } @@ -628,7 +692,7 @@ void MetatomicSystemAdaptor::add_masses(metatomic_torch::System& system, double masses = masses.index_select(0, mta_to_lmp_tensor); masses = masses * unit_conversion; - auto tensor = make_per_atom_tensormap(masses, dtype, device); + auto tensor = make_per_atom_tensormap(masses, dtype, device, "mass"); system->add_data("masses", tensor, /*override=*/true); } @@ -663,60 +727,37 @@ void MetatomicSystemAdaptor::add_momenta(metatomic_torch::System& system, double momenta = momenta.index_select(0, mta_to_lmp_tensor); momenta = momenta * unit_conversion; - auto tensor = make_per_atom_tensormap(momenta, dtype, device, {"xyz"}); + auto tensor = make_per_atom_tensormap(momenta, dtype, device, "momentum", {"xyz"}); system->add_data("momenta", tensor, /*override=*/true); } -metatensor_torch::TensorMap MetatomicSystemAdaptor::make_per_atom_tensormap( - const torch::Tensor& values, - torch::ScalarType dtype, - const torch::Device& device, - const std::vector& component_names -) { - if (values.dim() != static_cast(component_names.size() + 1)) { - error->all( - FLERR, - "metatomic per-atom TensorMap helper expected rank {} tensor, got rank {}", - component_names.size() + 1, - values.dim() - ); - } +void MetatomicSystemAdaptor::add_velocities(metatomic_torch::System& system, double unit_conversion) { + double** v = atom->v; - auto n_atoms = values.size(0); - auto label_tensor_options = torch::TensorOptions().dtype(torch::kInt32).device(device); + auto total_n_atoms = atom->nlocal + atom->nghost; - auto keys = metatensor_torch::LabelsHolder::single()->to(device); - auto samples_values = torch::column_stack({ - torch::zeros(n_atoms, label_tensor_options).unsqueeze(1), - torch::arange(n_atoms, label_tensor_options).unsqueeze(1) - }); - auto samples = torch::make_intrusive( - std::vector{"system", "atom"}, - samples_values, - metatensor::assume_unique{} + auto device = system->device(); + auto dtype = system->scalar_type(); + + auto mta_to_lmp_tensor = torch::from_blob( + mta_to_lmp.data(), + {static_cast(mta_to_lmp.size())}, + torch::TensorOptions().dtype(torch::kInt).device(torch::kCPU) ); - auto components = std::vector{}; - for (size_t axis = 0; axis < component_names.size(); axis++) { - auto component_values = torch::arange(values.size(axis + 1), label_tensor_options).unsqueeze(1); - auto component = torch::make_intrusive( - std::vector{component_names[axis]}, - component_values - ); - components.push_back(component); + // gather momenta (per-atom) in a tensor and ship to device + torch::Tensor velocities = torch::zeros({total_n_atoms, 3}, torch::TensorOptions().dtype(torch::kFloat64).device(torch::kCPU)); + auto velocities_accessor = velocities.accessor(); + for (int i=0; ito(device); - auto block = torch::make_intrusive( - values.to(dtype).to(device).unsqueeze(-1), - samples, - components, - properties - ); + velocities = velocities.index_select(0, mta_to_lmp_tensor); + velocities = velocities * unit_conversion; + auto tensor = make_per_atom_tensormap(velocities, dtype, device, "velocity", {"xyz"}); - return torch::make_intrusive( - keys, - std::vector{block} - ); + system->add_data("velocities", tensor, /*override=*/true); } diff --git a/src/ML-METATOMIC/metatomic_system.h b/src/ML-METATOMIC/metatomic_system.h index a7dbf7b0888..1f1e71deb9f 100644 --- a/src/ML-METATOMIC/metatomic_system.h +++ b/src/ML-METATOMIC/metatomic_system.h @@ -58,6 +58,16 @@ struct MetatomicNeighborsData { std::vector> distances_f32; }; +// Build a per-atom TensorMap from values shaped as [atoms, components...]. +// A property dimension is appended automatically. +metatensor_torch::TensorMap make_per_atom_tensormap( + const torch::Tensor& values, + const torch::ScalarType& dtype, + const torch::Device& device, + const std::string& property_name, + const std::vector& component_names = {} +); + class MetatomicSystemAdaptor : public Pointers { public: MetatomicSystemAdaptor(LAMMPS *lmp, MetatomicSystemOptions options); @@ -82,14 +92,9 @@ class MetatomicSystemAdaptor : public Pointers { // Add momenta as extra data to this system, only for atoms which are not // periodic images of other atoms virtual void add_momenta(metatomic_torch::System& system, double unit_conversion); - // Build a per-atom TensorMap from values shaped as [atoms, components...]. - // A property dimension is appended automatically. - virtual metatensor_torch::TensorMap make_per_atom_tensormap( - const torch::Tensor& values, - torch::ScalarType dtype, - const torch::Device& device, - const std::vector& component_names = {} - ); + // Add velocities as extra data to this system, only for atoms which are not + // periodic images of other atoms + virtual void add_velocities(metatomic_torch::System& system, double unit_conversion); // Explicit strain for virial calculations. This uses the same dtype/device // as LAMMPS data (positions, …) From 8cce0434bf28557be10a83b0d7f25a8185304a92 Mon Sep 17 00:00:00 2001 From: GardevoirX Date: Fri, 17 Apr 2026 13:47:37 +0200 Subject: [PATCH 3/5] Update the unit conversion logic --- src/ML-METATOMIC/fix_metatomic.cpp | 27 +++---- src/ML-METATOMIC/metatomic_system.cpp | 12 ++- src/ML-METATOMIC/metatomic_system.h | 3 +- src/ML-METATOMIC/metatomic_units.cpp | 110 ++++++++++++++++++++++++++ src/ML-METATOMIC/metatomic_units.h | 27 +++++++ src/ML-METATOMIC/pair_metatomic.cpp | 17 +--- 6 files changed, 160 insertions(+), 36 deletions(-) create mode 100644 src/ML-METATOMIC/metatomic_units.cpp create mode 100644 src/ML-METATOMIC/metatomic_units.h diff --git a/src/ML-METATOMIC/fix_metatomic.cpp b/src/ML-METATOMIC/fix_metatomic.cpp index 2f302fc153f..1004f4ce68a 100644 --- a/src/ML-METATOMIC/fix_metatomic.cpp +++ b/src/ML-METATOMIC/fix_metatomic.cpp @@ -25,6 +25,7 @@ ------------------------------------------------------------------------- */ #include "metatomic_types.h" #include "metatomic_system.h" +#include "metatomic_units.h" #include "fix_metatomic.h" @@ -62,25 +63,15 @@ FixMetatomic::FixMetatomic(LAMMPS *lmp, int narg, char **arg): Fix(lmp, narg, ar // Determine unit system for the ML model // Currently only 'metal' units are fully supported for momenta - std::string energy_unit; - std::string length_unit; - if (strcmp(update->unit_style, "metal") == 0) { - length_unit = "angstrom"; - this->momentum_conversion_factor = 10.1805057179 / 1000.0; - } else if (strcmp(update->unit_style, "real") == 0) { - length_unit = "angstrom"; - this->momentum_conversion_factor = 10.1805057179; - } else if (strcmp(update->unit_style, "si") == 0) { - length_unit = "m"; - this->momentum_conversion_factor = 10.1805057179 / 1.6605390666e-22; - } else { + if (strcmp(update->unit_style, "lj") == 0) { error->all(FLERR, "unsupported units '{}' for fix metatomic", update->unit_style); } - - // For now, only metal units are fully tested and supported - if (strcmp(update->unit_style, "metal") != 0) { - error->all(FLERR, "fix metatomic currently only supports 'metal' units"); - } + std::string energy_unit= unit_map.at("energy").at(update->unit_style); + std::string length_unit = unit_map.at("position").at(update->unit_style); + std::string mass_unit = unit_map.at("mass").at(update->unit_style); + std::string velocity_unit = unit_map.at("velocity").at(update->unit_style); + std::string momentum_unit = mass_unit + "*" + velocity_unit; + this->momentum_conversion_factor = metatomic_torch::unit_conversion_factor("momentum", momentum_unit, "(u*eV)^(1/2)"); if (narg < 4) { error->all(FLERR, @@ -454,7 +445,7 @@ void FixMetatomic::initial_integrate(int /*vflag*/) { ); // add the required additional inputs - this->system_adaptor->add_masses(system, 1.0); + this->system_adaptor->add_masses(system, metatomic_torch::unit_conversion_factor("mass", unit_map.at("mass").at(update->unit_style), "u")); this->system_adaptor->add_momenta(system, this->momentum_conversion_factor); // Configure selected atoms for evaluation diff --git a/src/ML-METATOMIC/metatomic_system.cpp b/src/ML-METATOMIC/metatomic_system.cpp index 3fe5bb615e4..74aa1a2a5fe 100644 --- a/src/ML-METATOMIC/metatomic_system.cpp +++ b/src/ML-METATOMIC/metatomic_system.cpp @@ -16,11 +16,13 @@ ------------------------------------------------------------------------- */ #include "metatomic_system.h" #include "metatomic_timer.h" +#include "metatomic_units.h" #include "atom.h" #include "comm.h" #include "domain.h" #include "error.h" +#include "update.h" #include "neigh_list.h" @@ -570,7 +572,8 @@ metatomic_torch::System MetatomicSystemAdaptor::system_from_lmp( NeighList* list, bool do_virial, torch::ScalarType dtype, - torch::Device device + torch::Device device, + const std::vector>& inputs ) { auto _ = MetatomicTimer("creating System from LAMMPS data"); @@ -643,11 +646,12 @@ metatomic_torch::System MetatomicSystemAdaptor::system_from_lmp( const auto& quantity = input->quantity().c_str(); const auto& unit = input->unit().c_str(); if (strcmp(quantity, "mass") == 0) { - add_masses(system, metatomic_torch::unit_conversion_factor(quantity, "u", unit)); + add_masses(system, metatomic_torch::unit_conversion_factor(quantity, unit_map.at("mass").at(update->unit_style), unit)); } else if (strcmp(quantity, "momentum") == 0) { - add_momenta(system, metatomic_torch::unit_conversion_factor(quantity, "u*A/ps", unit)); + const auto& momentum_unit = unit_map.at("mass").at(update->unit_style) + "*" + unit_map.at("velocity").at(update->unit_style); + add_momenta(system, metatomic_torch::unit_conversion_factor(quantity, momentum_unit, unit)); } else if (strcmp(quantity, "velocity") == 0) { - add_velocities(system, metatomic_torch::unit_conversion_factor(quantity, "A/ps", unit)); + add_velocities(system, metatomic_torch::unit_conversion_factor(quantity, unit_map.at("velocity").at(update->unit_style), unit)); } else { error->all(FLERR, "compute metatomic: the model requested an unsupported additional input of quantity '{}'", quantity); } diff --git a/src/ML-METATOMIC/metatomic_system.h b/src/ML-METATOMIC/metatomic_system.h index 1f1e71deb9f..d0ec0dff583 100644 --- a/src/ML-METATOMIC/metatomic_system.h +++ b/src/ML-METATOMIC/metatomic_system.h @@ -83,7 +83,8 @@ class MetatomicSystemAdaptor : public Pointers { NeighList* list, bool do_virial, torch::ScalarType dtype, - torch::Device device + torch::Device device, + const std::vector>& inputs = {} ); // Add masses as extra data to this system, only for atoms which are not diff --git a/src/ML-METATOMIC/metatomic_units.cpp b/src/ML-METATOMIC/metatomic_units.cpp new file mode 100644 index 00000000000..bfe1aa30789 --- /dev/null +++ b/src/ML-METATOMIC/metatomic_units.cpp @@ -0,0 +1,110 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS Development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include "metatomic_units.h" + +#include +#include + +namespace LAMMPS_NS { + +const std::map quantity_map = { + {"energy", "energy"}, + {"energy_ensemble", "energy"}, + {"energy_uncertainty", "energy"}, + {"forces", "force"}, + {"non_conservative_forces", "force"}, + {"stress", "stress"}, + {"non_conservative_stress", "stress"}, + {"masses", "mass"}, + {"position", "position"}, + {"momenta", "momentum"}, + {"velocities", "velocity"}, + {"charges", "charge"}, + {"heat_flux", "heat_flux"}, +}; + +const std::map> unit_map = { + {"mass", { + {"real", "g/mol"}, + {"metal", "g/mol"}, + {"si", "kg"}, + {"cgs", "g"}, + {"electron", "u"}, + {"micro", "pg"}, + {"nano", "ag"} + }}, + {"position", { + {"real", "A"}, + {"metal", "A"}, + {"si", "m"}, + {"cgs", "cm"}, + {"electron", "Bohr"}, + {"micro", "micrometer"}, + {"nano", "nanometer"} + }}, + {"energy", { + {"real", "kcal/mol"}, + {"metal", "eV"}, + {"si", "J"}, + {"cgs", "erg"}, + {"electron", "Hartree"}, + {"micro", "pg*micrometer^2/microsecond^2"}, + {"nano", "ag*nm^2/ns^2"} + }}, + {"velocity", { + {"real", "A/fs"}, + {"metal", "A/ps"}, + {"si", "m/s"}, + {"cgs", "cm/s"}, + {"electron", "Bohr*Hartree/hbar"}, + {"micro", "micrometer/microsecond"}, + {"nano", "nm/ns"} + }}, + {"force", { + {"real", "kcal/mol/A"}, + {"metal", "eV/A"}, + {"si", "kg*m/s^2"}, + {"cgs", "g*cm/s^2"}, + {"electron", "Hartree/Bohr"}, + {"micro", "pg*micrometer/microsecond^2"}, + {"nano", "ag*nm/ns^2"} + }}, + {"charge", { + {"real", "e"}, + {"metal", "e"}, + {"si", "C"}, + {"cgs", "esu"}, + {"electron", "e"}, + {"micro", "pC"}, + {"nano", "e"} + }}, + {"lmp::density", { + {"real", ""}, + {"metal", ""}, + {"si", ""}, + {"cgs", ""}, + {"electron", ""}, + {"micro", ""}, + {"nano", ""} + }}, + {"lmp::dipole_moment", {}}, + {"lmp::dynamic_viscosity", {}}, + {"lmp::electric_field", {}}, + {"lmp::pressure", {}}, + {"lmp::temperature", {}}, + {"lmp::time", {}}, + {"lmp::torque", {}}, +}; +// simple struct to hold unit conversion factors for a given unit style +} // namespace LAMMPS_NS diff --git a/src/ML-METATOMIC/metatomic_units.h b/src/ML-METATOMIC/metatomic_units.h new file mode 100644 index 00000000000..c8133e78ad8 --- /dev/null +++ b/src/ML-METATOMIC/metatomic_units.h @@ -0,0 +1,27 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifndef LMP_METATOMIC_UNITS_H +#define LMP_METATOMIC_UNITS_H + +#include +#include + +namespace LAMMPS_NS { + +extern const std::map quantity_map; + +extern const std::map> unit_map; +} // namespace LAMMPS_NS + +#endif \ No newline at end of file diff --git a/src/ML-METATOMIC/pair_metatomic.cpp b/src/ML-METATOMIC/pair_metatomic.cpp index 947590500ad..a20bf08509e 100644 --- a/src/ML-METATOMIC/pair_metatomic.cpp +++ b/src/ML-METATOMIC/pair_metatomic.cpp @@ -44,6 +44,7 @@ #include "metatomic_system.h" #include "metatomic_timer.h" +#include "metatomic_units.h" using namespace LAMMPS_NS; @@ -72,21 +73,11 @@ PairMetatomic::PairMetatomic(LAMMPS *lmp): system_adaptor(nullptr), scale(1.0) { - if (strcmp(update->unit_style, "real") == 0) { - this->length_unit = "angstrom"; - this->energy_unit = "kcal/mol"; - } else if (strcmp(update->unit_style, "metal") == 0) { - this->length_unit = "angstrom"; - this->energy_unit = "eV"; - } else if (strcmp(update->unit_style, "si") == 0) { - this->length_unit = "meter"; - this->energy_unit = "joule"; - } else if (strcmp(update->unit_style, "electron") == 0) { - this->length_unit = "Bohr"; - this->energy_unit = "Hartree"; - } else { + if (strcmp(update->unit_style, "lj") == 0) { error->one(FLERR, "unsupported units '{}' for pair metatomic ", update->unit_style); } + this->length_unit = unit_map.at("position").at(update->unit_style); + this->energy_unit = unit_map.at("energy").at(update->unit_style); // we might not be running a pure pair potential, // so we can not compute virial as fdotr From 65d66051e4275da511e49df0a131530a6ddaba1c Mon Sep 17 00:00:00 2001 From: GardevoirX Date: Sat, 18 Apr 2026 11:09:52 +0200 Subject: [PATCH 4/5] Allow for additional inputs, and update to the 2-parameter `unit_conversion_factor` --- src/ML-METATOMIC/fix_metatomic.cpp | 16 +++++++++++++--- src/ML-METATOMIC/metatomic_system.cpp | 21 +++++++++++---------- src/ML-METATOMIC/metatomic_system.h | 2 +- src/ML-METATOMIC/metatomic_units.cpp | 16 ---------------- src/ML-METATOMIC/metatomic_units.h | 3 +-- src/ML-METATOMIC/pair_metatomic.cpp | 17 +++++++++++++++-- 6 files changed, 41 insertions(+), 34 deletions(-) diff --git a/src/ML-METATOMIC/fix_metatomic.cpp b/src/ML-METATOMIC/fix_metatomic.cpp index 1004f4ce68a..62c0e6687c0 100644 --- a/src/ML-METATOMIC/fix_metatomic.cpp +++ b/src/ML-METATOMIC/fix_metatomic.cpp @@ -71,7 +71,7 @@ FixMetatomic::FixMetatomic(LAMMPS *lmp, int narg, char **arg): Fix(lmp, narg, ar std::string mass_unit = unit_map.at("mass").at(update->unit_style); std::string velocity_unit = unit_map.at("velocity").at(update->unit_style); std::string momentum_unit = mass_unit + "*" + velocity_unit; - this->momentum_conversion_factor = metatomic_torch::unit_conversion_factor("momentum", momentum_unit, "(u*eV)^(1/2)"); + this->momentum_conversion_factor = metatomic_torch::unit_conversion_factor(momentum_unit, "(u*eV)^(1/2)"); if (narg < 4) { error->all(FLERR, @@ -436,16 +436,26 @@ void FixMetatomic::initial_integrate(int /*vflag*/) { error->all(FLERR, "the model requested an unsupported dtype '{}'", mta_data->capabilities->dtype()); } + // deal with the model requested inputs + std::map input_holders; + auto requested_inputs = mta_data->model->run_method("requested_inputs").toGenericDict(); + for (const auto& entry : requested_inputs) { + input_holders.emplace( + entry.key().toStringRef(), + entry.value().toCustomClass() + ); + } // transform from LAMMPS to metatomic System auto system = this->system_adaptor->system_from_lmp( mta_list, static_cast(vflag_global), dtype, - mta_data->device + mta_data->device, + input_holders ); // add the required additional inputs - this->system_adaptor->add_masses(system, metatomic_torch::unit_conversion_factor("mass", unit_map.at("mass").at(update->unit_style), "u")); + this->system_adaptor->add_masses(system, metatomic_torch::unit_conversion_factor(unit_map.at("mass").at(update->unit_style), "u")); this->system_adaptor->add_momenta(system, this->momentum_conversion_factor); // Configure selected atoms for evaluation diff --git a/src/ML-METATOMIC/metatomic_system.cpp b/src/ML-METATOMIC/metatomic_system.cpp index 74aa1a2a5fe..7d0b6b6b7ad 100644 --- a/src/ML-METATOMIC/metatomic_system.cpp +++ b/src/ML-METATOMIC/metatomic_system.cpp @@ -26,6 +26,7 @@ #include "neigh_list.h" +#include #include #include @@ -573,7 +574,7 @@ metatomic_torch::System MetatomicSystemAdaptor::system_from_lmp( bool do_virial, torch::ScalarType dtype, torch::Device device, - const std::vector>& inputs + const std::map>& inputs ) { auto _ = MetatomicTimer("creating System from LAMMPS data"); @@ -642,18 +643,18 @@ metatomic_torch::System MetatomicSystemAdaptor::system_from_lmp( this->setup_neighbors(system, list); - for (const auto& input: inputs) { - const auto& quantity = input->quantity().c_str(); + for (const auto& [property, input]: inputs) { + const auto& property_name = property.c_str(); const auto& unit = input->unit().c_str(); - if (strcmp(quantity, "mass") == 0) { - add_masses(system, metatomic_torch::unit_conversion_factor(quantity, unit_map.at("mass").at(update->unit_style), unit)); - } else if (strcmp(quantity, "momentum") == 0) { + if (strcmp(property_name, "masses") == 0) { + add_masses(system, metatomic_torch::unit_conversion_factor(unit_map.at("mass").at(update->unit_style), unit)); + } else if (strcmp(property_name, "momenta") == 0) { const auto& momentum_unit = unit_map.at("mass").at(update->unit_style) + "*" + unit_map.at("velocity").at(update->unit_style); - add_momenta(system, metatomic_torch::unit_conversion_factor(quantity, momentum_unit, unit)); - } else if (strcmp(quantity, "velocity") == 0) { - add_velocities(system, metatomic_torch::unit_conversion_factor(quantity, unit_map.at("velocity").at(update->unit_style), unit)); + add_momenta(system, metatomic_torch::unit_conversion_factor(momentum_unit, unit)); + } else if (strcmp(property_name, "velocities") == 0) { + add_velocities(system, metatomic_torch::unit_conversion_factor(unit_map.at("velocity").at(update->unit_style), unit)); } else { - error->all(FLERR, "compute metatomic: the model requested an unsupported additional input of quantity '{}'", quantity); + error->all(FLERR, "compute metatomic: the model requested an unsupported additional input of '{}'", property_name); } } diff --git a/src/ML-METATOMIC/metatomic_system.h b/src/ML-METATOMIC/metatomic_system.h index d0ec0dff583..41f29ebd712 100644 --- a/src/ML-METATOMIC/metatomic_system.h +++ b/src/ML-METATOMIC/metatomic_system.h @@ -84,7 +84,7 @@ class MetatomicSystemAdaptor : public Pointers { bool do_virial, torch::ScalarType dtype, torch::Device device, - const std::vector>& inputs = {} + const std::map>& inputs = {} ); // Add masses as extra data to this system, only for atoms which are not diff --git a/src/ML-METATOMIC/metatomic_units.cpp b/src/ML-METATOMIC/metatomic_units.cpp index bfe1aa30789..1806889d50d 100644 --- a/src/ML-METATOMIC/metatomic_units.cpp +++ b/src/ML-METATOMIC/metatomic_units.cpp @@ -18,22 +18,6 @@ namespace LAMMPS_NS { -const std::map quantity_map = { - {"energy", "energy"}, - {"energy_ensemble", "energy"}, - {"energy_uncertainty", "energy"}, - {"forces", "force"}, - {"non_conservative_forces", "force"}, - {"stress", "stress"}, - {"non_conservative_stress", "stress"}, - {"masses", "mass"}, - {"position", "position"}, - {"momenta", "momentum"}, - {"velocities", "velocity"}, - {"charges", "charge"}, - {"heat_flux", "heat_flux"}, -}; - const std::map> unit_map = { {"mass", { {"real", "g/mol"}, diff --git a/src/ML-METATOMIC/metatomic_units.h b/src/ML-METATOMIC/metatomic_units.h index c8133e78ad8..f38aec82209 100644 --- a/src/ML-METATOMIC/metatomic_units.h +++ b/src/ML-METATOMIC/metatomic_units.h @@ -19,9 +19,8 @@ namespace LAMMPS_NS { -extern const std::map quantity_map; - extern const std::map> unit_map; + } // namespace LAMMPS_NS #endif \ No newline at end of file diff --git a/src/ML-METATOMIC/pair_metatomic.cpp b/src/ML-METATOMIC/pair_metatomic.cpp index a20bf08509e..1921457dfb8 100644 --- a/src/ML-METATOMIC/pair_metatomic.cpp +++ b/src/ML-METATOMIC/pair_metatomic.cpp @@ -37,7 +37,9 @@ #include #endif +#include #include +#include #include #include @@ -85,7 +87,7 @@ PairMetatomic::PairMetatomic(LAMMPS *lmp): this->mta_data = new PairMetatomicData(this->length_unit); // use a default uncertainty threshold of 100 meV/atom - this->mta_data->uncertainty_threshold = 0.1 * metatomic_torch::unit_conversion_factor("energy", "eV", energy_unit); + this->mta_data->uncertainty_threshold = 0.1 * metatomic_torch::unit_conversion_factor("eV", energy_unit); // settings for metatomic pair style this->single_enable = 0; @@ -673,12 +675,23 @@ void PairMetatomic::compute(int eflag, int vflag) { error->one(FLERR, "the model requested an unsupported dtype '{}'", mta_data->capabilities->dtype()); } + // deal with the model requested inputs + std::map input_holders; + auto requested_inputs = mta_data->model->run_method("requested_inputs").toGenericDict(); + for (const auto& entry : requested_inputs) { + input_holders.emplace( + entry.key().toStringRef(), + entry.value().toCustomClass() + ); + } + // transform from LAMMPS to metatomic System auto system = this->system_adaptor->system_from_lmp( mta_list, vflag_global && !do_nc_stress, dtype, - mta_data->device + mta_data->device, + input_holders ); // only run the calculation for atoms actually in the current domain From c6fa14e2a9fb769b87f7ea8fe8c24f3826356266 Mon Sep 17 00:00:00 2001 From: GardevoirX Date: Tue, 19 May 2026 16:21:09 +0200 Subject: [PATCH 5/5] Update with recent metatensor and metatomic releases --- examples/PACKAGES/metatomic/nickel-lj.pt | Bin 63231 -> 63103 bytes src/ML-METATOMIC/metatomic_system.cpp | 12 +++++------- src/ML-METATOMIC/metatomic_system.h | 2 +- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/examples/PACKAGES/metatomic/nickel-lj.pt b/examples/PACKAGES/metatomic/nickel-lj.pt index cf2f830039ca99ddc7efc4ea572c3114b040b9f4..f395ef9894355562bfa3013587d02ee79c8761d9 100644 GIT binary patch delta 37448 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

4f( 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 double* mass = atom->mass; int* type = atom->type; @@ -699,12 +699,11 @@ void MetatomicSystemAdaptor::add_masses(metatomic_torch::System& system, std::st masses = masses * unit_conversion; auto tensor = make_per_atom_tensormap(masses, dtype, device, "mass"); - assert(name == "mass" || name == "masses"); - system->add_data(name, tensor); + system->add_data("mass", tensor); } -void MetatomicSystemAdaptor::add_momenta(metatomic_torch::System& system, std::string name, double unit_conversion) { +void MetatomicSystemAdaptor::add_momenta(metatomic_torch::System& system, double unit_conversion) { double* rmass = atom->rmass; double* mass = atom->mass; double** v = atom->v; @@ -735,8 +734,7 @@ void MetatomicSystemAdaptor::add_momenta(metatomic_torch::System& system, std::s momenta = momenta * unit_conversion; auto tensor = make_per_atom_tensormap(momenta, dtype, device, "momentum", {"xyz"}); - assert(name == "momentum" || name == "momenta"); - system->add_data(name, tensor); + system->add_data("momentum", tensor); } void MetatomicSystemAdaptor::add_velocities(metatomic_torch::System& system, double unit_conversion) { @@ -766,5 +764,5 @@ void MetatomicSystemAdaptor::add_velocities(metatomic_torch::System& system, dou velocities = velocities * unit_conversion; auto tensor = make_per_atom_tensormap(velocities, dtype, device, "velocity", {"xyz"}); - system->add_data("velocities", tensor, /*override=*/true); + system->add_data(std::string{"velocities"}, tensor, /*override=*/true, /*private_warn_on_deprecated=*/true); } diff --git a/src/ML-METATOMIC/metatomic_system.h b/src/ML-METATOMIC/metatomic_system.h index 602353614a9..41f29ebd712 100644 --- a/src/ML-METATOMIC/metatomic_system.h +++ b/src/ML-METATOMIC/metatomic_system.h @@ -89,7 +89,7 @@ class MetatomicSystemAdaptor : public Pointers { // Add masses as extra data to this system, only for atoms which are not // periodic images of other atoms - virtual void add_masses(metatomic_torch::System& system, std::string name, double unit_conversion); + virtual void add_masses(metatomic_torch::System& system, double unit_conversion); // Add momenta as extra data to this system, only for atoms which are not // periodic images of other atoms virtual void add_momenta(metatomic_torch::System& system, double unit_conversion);