Fleur Magnetic Anisotropy Energy workflow

  • Current version: 0.1.0
  • Class: FleurMaeWorkChain
  • String to pass to the WorkflowFactory(): fleur.mae
  • Workflow type: Scientific workchain, force-theorem subgroup
  • Aim: Calculate Magnetic Anisotropy Energies along given spin quantization axes

Import Example:

from aiida_fleur.workflows.mae import FleurMaeWorkChain
#or
WorkflowFactory('fleur.mae')

Description/Purpose

This workchain calculates Magnetic Anisotropy Energy over a given set of spin-quantization axes. The force-theorem is employed which means the workchain converges a reference charge density first then it submits a single FleurCalculation with a <forceTheorem> tag.

Input nodes

name type description required
fleur Code Fleur code yes
inpgen Code Inpgen code no
wf_parameters Dict Settings of the workchain no
structure StructureData Structure data node no
calc_parameters Dict inpgen parameters no
fleurinp FleurinpData FLEUR input no
remote_data RemoteData Remote folder of another calculation no
options Dict AiiDA options (computational resources) no
settings Dict Special settings for Fleur calculation no

Only fleur input is required. However, it does not mean that it is enough to specify fleur only. One must keep one of the supported input configurations described in the Supported input configurations section.

Workchain parameters and its defaults

wf_parameters

wf_parameters: Dict - Settings of the workflow behavior. All possible keys and their defaults are listed below:

'fleur_runmax': 10,                         # needed for SCF
'density_converged' : 0.00005,              # needed for SCF
'serial' : False,                           # needed for SCF
'itmax_per_run' : 30,                       # needed for SCF
'beta' : {'all' : 1.57079},                 # see description below
'alpha_mix' : 0.015,                        # sets mixing parameter alpha
'sqas_theta' : [0.0, 1.57079, 1.57079],     # sets SOC theta values
'sqas_phi' : [0.0, 0.0, 1.57079],           # sets SOC phi values
'soc_off' : [],                             # switches off SOC on a given atom
'prop_dir' : [1.0, 0.0, 0.0],               # sets a propagation direction of a q-vector
'q_vectors': [[0.0, 0.0, 0.0],              # set a set of q-vectors to calculate DMI energies
                [0.125, 0.0, 0.0],
                [0.250, 0.0, 0.0],
                [0.375, 0.0, 0.0]],
'ref_qss' : [0.0, 0.0, 0.0],                # sets a q-vector for the reference calculation
'input_converged' : False,                  # True, if charge density from remote folder has to be converged
'inpxml_changes' : []

Workchain parameters contain a set of parameters needed by the SCF workchain. There are also DMI-specific parameters such as alpha-mix, sqas_theta, sqas_phi, soc_off, input_converged, sqa_ref, use_soc_ref.

soc_off is a python list containing atoms labels. SOC is switched off for species, corresponding to the atom with a given label.

Note

It can be that the spice correspond to several atoms and soc_off switches off SOC for atoms that was not intended to change. You must be careful with this. For more information, see the LINK.

An example of soc_off work:

'soc_off': ['458']

changes

<species name="Ir-2" element="Ir" atomicNumber="77" coreStates="17" magMom=".00000000" flipSpin="T">
  <mtSphere radius="2.52000000" gridPoints="747" logIncrement=".01800000"/>
  <atomicCutoffs lmax="8" lnonsphr="6"/>
  <energyParameters s="6" p="6" d="5" f="5"/>
  <prodBasis lcutm="4" lcutwf="8" select="4 0 4 2"/>
  <lo type="SCLO" l="1" n="5" eDeriv="0"/>
</species>
-----
<atomGroup species="Ir-2">
  <filmPos label="                 458">1.000/4.000 1.000/2.000 11.4074000502</filmPos>
  <force calculate="T" relaxXYZ="TTT"/>
  <nocoParams l_relax="F" alpha=".00000000" beta=".00000000" b_cons_x=".00000000" b_cons_y=".00000000"/>
</atomGroup>

to:

<species name="Ir-2" element="Ir" atomicNumber="77" coreStates="17" magMom=".00000000" flipSpin="T">
  <mtSphere radius="2.52000000" gridPoints="747" logIncrement=".01800000"/>
  <atomicCutoffs lmax="8" lnonsphr="6"/>
  <energyParameters s="6" p="6" d="5" f="5"/>
  <prodBasis lcutm="4" lcutwf="8" select="4 0 4 2"/>
  <special socscale="0.0"/>
  <lo type="SCLO" l="1" n="5" eDeriv="0"/>
</species>

As you can see, I was careful about “Ir-2” specie and it contained a single atom with a label 458.

sqas_theta and sqas_phi are python lists that set SOC theta and phi values. For detailed explanation see Fleur forceTheorem documentation.

sqa_ref sets a spin quantization axis [theta, phi] for the reference calculation if SOC terms are switched on by use_soc_ref.

input_converged is used only if a remote_date node is given in the input. Is has to be set True if there is no need to converge a given charge density and it can be used directly for the force-theorem step. If it is set to False, input charge density will be submitted into scf workchain before the force-theorem step to achieve the convergence.

options

options: Dict - AiiDA options (computational resources). Example:

'resources': {"num_machines": 1, "num_mpiprocs_per_machine": 1},
'max_wallclock_seconds': 6*60*60,
'queue_name': '',
'custom_scheduler_commands': '',
'import_sys_environment': False,
'environment_variables': {}

Output nodes

  • out: Dict - Information of workflow results like success, last result node, list with convergence behavior

    "errors": [],
    "info": [],
    "initial_structure": "ac274613-27f5-4c0b-9d42-bae340007ab1",
    "is_it_force_theorem": true,
    "mae_units": "eV",
    "maes": [
        0.0006585155416697,
        0.0048545112659747,
        0.0
    ],
    "phi": [
        0.0,
        0.0,
        1.57079
    ],
    "theta": [
        0.0,
        1.57079,
        1.57079
    ],
    "warnings": [],
    "workflow_name": "FleurMaeWorkChain",
    "workflow_version": "0.1.0"
    

    Resulting Magnetic Anisotropy Directions are sorted according to theirs theta and phi values i.e. maes[N] corresponds to theta[N] and phi[N].

Supported input configurations

MAE workchain has several input combinations that implicitly define the workchain layout. Depending on the setup of the inputs, one of four supported scenarios will happen:

  1. fleurinp:

    Files, belonging to the fleurinp, will be used as input for the first FLEUR calculation. Submits SCF workchain to obtain the reference charge density, then makes a force-theorem FLEUR calculation.

    Workchain parameters that are used:

    1. SCF-related parameters
    2. beta
    3. alpha_mix
    4. sqas_theta
    5. sqas_phi
    6. soc_off
    7. inpxml_changes

    The other are ignored.

  2. fleurinp + parent_folder (FLEUR):

    Files, belonging to the fleurinp, will be used as input for the first FLEUR calculation. Moreover, initial charge density will be copied from the folder of the parent calculation. If input_converged set to False, first submits a SCF workchain to converge given charge density further; directly submits a force-theorem calculation otherwise.

  3. parent_folder (FLEUR):

    inp.xml file and initial charge density will be copied from the folder of the parent FLEUR calculation. If input_converged set to False, first submits a SCF workchain to converge given charge density further; directly submits a force-theorem calculation otherwise.

  4. structure:

    Submits inpgen calculation to generate a new fleurinp using a given structure which is followed by the SCF workchain to obtain the reference charge density. Submits a force-theorem FLEUR calculation after.

Error handling

A list of implemented exit codes:

Code Meaning
230 Input nodes do not correspond to any valid input configuration.
231 Input codes do not correspond to fleur or inpgen codes respectively.
232 Input file modification failed.
233 Input file is corrupted after user’s modifications.
334 Reference calculation failed.
335 Found no reference calculation remote repository.
336 Force theorem calculation failed.

Example usage

from aiida_fleur.workflows.mae import FleurMaeWorkChain
from aiida.orm import Dict, load_node

fleur_code = load_node(FLEUR_PK)
inpgen_code = load_node(INPGEN_PK)
structure = load_node(STRUCTURE_PK)

wf_para = Dict(dict={'sqa_ref': [0.7, 0.7],                
                     'use_soc_ref': False,                 
                     'sqas_theta': [0.0, 1.57079, 1.57079],
                     'sqas_phi': [0.0, 0.0, 1.57079],      
                     'fleur_runmax': 10,                   
                     'density_converged': 0.02,            
                     'serial': False,                      
                     'itmax_per_run': 30,                  
                     'inpxml_changes': []                  
                    })

options = Dict(dict={'resources' : {"num_machines": 1, "num_mpiprocs_per_machine" : 2},
                     'withmpi' : True,
                     'max_wallclock_seconds' : 600})

calc_parameters = Dict(dict={'kpt': {'div1': 2,
                                     'div2' : 2,
                                     'div3' : 2
                                    }})

SCF_workchain = submit(FleurMaeWorkChain,
                       fleur=fleur_code,
                       inpgen=inpgen_code,
                       calc_parameters=calc_parameters,
                       structure=structure,
                       wf_parameters=wf_para,
                       options=options)