Source code for aiida_vasp.common.magmapping

"""
Module for converting between different representation for
initial site magnetization.
"""

import re


[docs] def create_additional_species(species: list[str], magmom: list[float]) -> tuple[list[str], dict[str, float]]: """ Create additional species depending on magnetic moments. For example, create Fe1 and Fe2 if there are Fe with different magnetisations. Returns: a tuples of (newspecies, magmom_mapping) """ unique_species = set(species) new_species = [] current_species_mapping = {sym: {} for sym in unique_species} for symbol, this_mag in zip(species, magmom): current_symbol = symbol # Mappings for this original symbol mapping = current_species_mapping[symbol] # First check if this magmom has been treated not_seen = True for sym_, mag_ in mapping.items(): if mag_ == this_mag: current_symbol = sym_ not_seen = False # This symbol has not been seen yet if not_seen: if current_symbol in mapping: # The other species having the same symbol has been assigned counter = len(mapping) + 1 current_symbol = f'{symbol}{counter}' mapping[current_symbol] = this_mag new_species.append(current_symbol) # Rename symbols that has more than one species, so A becomes A1 for symbol, mapping in current_species_mapping.items(): if len(mapping) > 1: mapping[f'{symbol}1'] = mapping[symbol] mapping.pop(symbol) # Refresh the new_species list new_species = [f'{sym}1' if sym == symbol else sym for sym in new_species] all_mapping: dict[str, float] = {} for value in current_species_mapping.values(): all_mapping.update(value) return new_species, all_mapping
[docs] def convert_to_plain_list(species: list[str], magmom_mapping: dict[str, float]) -> tuple[list[str], list[float]]: """ Covert from a decorated species list to a plain list of symbols and magnetic moments. Returns: A tuple of (symbols, magmoms) """ magmoms: list[float] = [] symbols: list[str] = [] for symbol in species: magmoms.append(magmom_mapping[symbol]) # Drop the number suffix in the symbol match = re.match(r'(\w+)\d+', symbol) if match: symbols.append(match.group(1)) else: symbols.append(symbol) return symbols, magmoms