Source code for pyiron_atomistics.lammps.output
from __future__ import annotations
from typing import TYPE_CHECKING, List, Union
import numpy as np
if TYPE_CHECKING:
from pyiron_atomistics.atomistics.structure.atoms import Atoms
[docs]
def remap_indices(
lammps_indices: Union[np.ndarray, List],
potential_elements: Union[np.ndarray, List],
structure: Atoms,
) -> np.ndarray:
"""
Give the Lammps-dumped indices, re-maps these back onto the structure's indices to preserve the species.
The issue is that for an N-element potential, Lammps dumps the chemical index from 1 to N based on the order
that these species are written in the Lammps input file. But the indices for a given structure are based on the
order in which chemical species were added to that structure, and run from 0 up to the number of species
currently in that structure. Therefore we need to be a little careful with mapping.
Args:
lammps_indices (numpy.ndarray/list): The Lammps-dumped integers.
potential_elements (numpy.ndarray/list):
structure (pyiron_atomistics.atomistics.structure.Atoms):
Returns:
numpy.ndarray: Those integers mapped onto the structure.
"""
lammps_symbol_order = np.array(potential_elements)
# If new Lammps indices are present for which we have no species, extend the species list
unique_lammps_indices = np.unique(lammps_indices)
if len(unique_lammps_indices) > len(np.unique(structure.indices)):
unique_lammps_indices -= (
1 # Convert from Lammps start counting at 1 to python start counting at 0
)
new_lammps_symbols = lammps_symbol_order[unique_lammps_indices]
structure.set_species(
[structure.convert_element(el) for el in new_lammps_symbols]
)
# Create a map between the lammps indices and structure indices to preserve species
structure_symbol_order = np.array([el.Abbreviation for el in structure.species])
map_ = np.array(
[
int(np.argwhere(lammps_symbol_order == symbol)[0][0]) + 1
for symbol in structure_symbol_order
]
)
structure_indices = np.array(lammps_indices)
for i_struct, i_lammps in enumerate(map_):
np.place(structure_indices, lammps_indices == i_lammps, i_struct)
# TODO: Vectorize this for-loop for computational efficiency
return structure_indices