"""Module for determining magnetic state."""
from asr.core import command, ASRResult, prepare_result
import typing
[docs]
def get_magstate(calc):
"""Determine the magstate of calc."""
magmoms = calc.get_property('magmoms', allow_calculation=False)
if magmoms is None:
return 'nm'
maximum_mom = abs(magmoms).max()
if maximum_mom < 0.1:
return 'nm'
magmom = calc.get_magnetic_moment()
if abs(magmom) < 0.01 and maximum_mom > 0.1:
return 'afm'
return 'fm'
[docs]
def webpanel(result, row, key_descriptions):
"""Webpanel for magnetic state."""
rows = [['Magnetic state', row.magstate]]
summary = {'title': 'Summary',
'columns': [[{'type': 'table',
'header': ['Electronic properties', ''],
'rows': rows}]],
'sort': 0}
return [summary]
[docs]
@prepare_result
class Result(ASRResult):
magstate: str
is_magnetic: bool
magmoms: typing.List[float]
magmom: float
nspins: int
key_descriptions = {'magstate': 'Magnetic state.',
'is_magnetic': 'Is the material magnetic?',
'magmoms': 'Atomic magnetic moments.',
'magmom': 'Total magnetic moment.',
'nspins': 'Number of spins in system.'}
formats = {"ase_webpanel": webpanel}
@command('asr.magstate',
requires=['gs.gpw'],
returns=Result,
dependencies=['asr.gs@calculate'])
def main() -> Result:
"""Determine magnetic state."""
from gpaw import GPAW
calc = GPAW('gs.gpw', txt=None)
magstate = get_magstate(calc)
magmoms = calc.get_property('magmoms', allow_calculation=False)
magmom = calc.get_property('magmom', allow_calculation=False)
nspins = calc.get_number_of_spins()
results = {'magstate': magstate.upper(),
'is_magnetic': magstate != 'nm',
'magmoms': magmoms,
'magmom': magmom,
'nspins': nspins}
return Result(data=results)
if __name__ == '__main__':
main.cli()