H2020-MSCA-IF-2019, Example: spin wave transport

This page details how to obtain spin wave transport across the multiferroic domain boundary. In order to perform this calculation, one needs the information from two other examples (first relax the FE DW, then get the relaxed magnetic DW in the presence of the FE domain boundary). These are handled in Example 2 and 3 of the MSCA tutorials respectively.

The initial condition is a fixed configuration with a corresponding relaxed ground state. We load in the Exodus file from the previous example in the Mesh block,

[Mesh]
  [fileload]
    type = FileMeshGenerator
    file = out_BFO_P111A111-P111bA111b_m1.e
    use_for_exodus_restart = true
  []
[]

and the Variables block,

[Variables]
  [./mag1_x]
    order = FIRST
    family = LAGRANGE
    initial_from_file_var = mag1_x
    initial_from_file_timestep = 'LATEST'
  [../]
  [./mag1_y]
    order = FIRST
    family = LAGRANGE
    initial_from_file_var = mag1_y
    initial_from_file_timestep = 'LATEST'
  [../]
  [./mag1_z]
    order = FIRST
    family = LAGRANGE
    initial_from_file_var = mag1_z
    initial_from_file_timestep = 'LATEST'
  [../]

  [./mag2_x]
    order = FIRST
    family = LAGRANGE
    initial_from_file_var = mag2_x
    initial_from_file_timestep = 'LATEST'
  [../]
  [./mag2_y]
    order = FIRST
    family = LAGRANGE
    initial_from_file_var = mag2_y
    initial_from_file_timestep = 'LATEST'
  [../]
  [./mag2_z]
    order = FIRST
    family = LAGRANGE
    initial_from_file_var = mag2_z
    initial_from_file_timestep = 'LATEST'
  [../]
[]

which uses the initial_from_file_var with the LATEST for initial_from_file_timestep option. The values of and are calculated in the AuxKernels. We then use the ParsedFunction system to set up an applied perturbation to generate spin waves in the directions,

[Functions]
  [./bc_func_1]
    type = ParsedFunction
    value = 'st'
    vars = 'st'
    vals = '1e5'
  [../]

  [./pulse1]
    type = ParsedFunction
    vars = 't0 t1 A'
    vals = '0.0 100.0 0.707107'
    value = 1.0*A*0.2*exp(-0.16*(x-${pulseloc})*(x-${pulseloc}))*(sin(10.0*(x-${pulseloc}))/(10.0*(x-${pulseloc})))*sin(${sfreq}*(t-1e-6))/(${sfreq}*(t-1e-6))
  [../]

  [./pulse2]
    type = ParsedFunction
    vars = 't0 t1 A'
    vals = '0.0 100.0 0.707107'
    value = 1.0*A*0.2*exp(-0.16*(x-${pulseloc})*(x-${pulseloc}))*(sin(10.0*(x-${pulseloc}))/(10.0*(x-${pulseloc})))*sin(${sfreq}*(t-1e-6))/(${sfreq}*(t-1e-6))
  [../]

  [./pulse3]
    type = ParsedFunction
    vars = 't0 t1 A'
    vals = '0.0 100.0 0.707107'
    value = 1.0*A*0.2*exp(-0.16*(x-${pulseloc})*(x-${pulseloc}))*(sin(10.0*(x-${pulseloc}))/(10.0*(x-${pulseloc})))*sin(${sfreq}*(t-1e-6))/(${sfreq}*(t-1e-6))
  [../]
[]

with pulse1, pulse2, and pulse3 being the , , and components of defined as,

(1)

where field amplitude , excitation location , gaussian intensity profile parameter , and control the perturbation distribution in spacetime. The director orients the magnetic field with respect to . Finally, we cut-off the pulse at ps and excite the spin waves at a frequency GHz. The Kernels for this problem are set as,

[Kernels]
  #---------------------------------------#
  #                                       #
  #          Time dependence              #
  #                                       #
  #---------------------------------------#

  [./mag1_x_time]
    type = TimeDerivative
    variable = mag1_x
  [../]
  [./mag1_y_time]
    type = TimeDerivative
    variable = mag1_y
  [../]
  [./mag1_z_time]
    type = TimeDerivative
    variable = mag1_z
  [../]

  [./mag2_x_time]
    type = TimeDerivative
    variable = mag2_x
  [../]
  [./mag2_y_time]
    type = TimeDerivative
    variable = mag2_y
  [../]
  [./mag2_z_time]
    type = TimeDerivative
    variable = mag2_z
  [../]

  #---------------------------------------#
  #                                       #
  #     AFM sublattice exchange           #
  #                                       #
  #---------------------------------------#

  [./afmex1_x]
    type = AFMSublatticeSuperexchange
    variable = mag1_x
    mag_sub = 0
    component = 0
  [../]
  [./afmex1_y]
    type = AFMSublatticeSuperexchange
    variable = mag1_y
    mag_sub = 0
    component = 1
  [../]
  [./afmex1_z]
    type = AFMSublatticeSuperexchange
    variable = mag1_z
    mag_sub = 0
    component = 2
  [../]

  [./afmex2_x]
    type = AFMSublatticeSuperexchange
    variable = mag2_x
    mag_sub = 1
    component = 0
  [../]
  [./afmex2_y]
    type = AFMSublatticeSuperexchange
    variable = mag2_y
    mag_sub = 1
    component = 1
  [../]
  [./afmex2_z]
    type = AFMSublatticeSuperexchange
    variable = mag2_z
    mag_sub = 1
    component = 2
  [../]

  #---------------------------------------#
  #                                       #
  #     AFM sublattice DMI                #
  #                                       #
  #---------------------------------------#

  [./afmdmi1_x]
    type = AFMSublatticeDMInteraction
    variable = mag1_x
    mag_sub = 0
    component = 0
  [../]
  [./afmdmi1_y]
    type = AFMSublatticeDMInteraction
    variable = mag1_y
    mag_sub = 0
    component = 1
  [../]
  [./afmdmi1_z]
    type = AFMSublatticeDMInteraction
    variable = mag1_z
    mag_sub = 0
    component = 2
  [../]

  [./afmdmi2_x]
    type = AFMSublatticeDMInteraction
    variable = mag2_x
    mag_sub = 1
    component = 0
  [../]
  [./afmdmi2_y]
    type = AFMSublatticeDMInteraction
    variable = mag2_y
    mag_sub = 1
    component = 1
  [../]
  [./afmdmi2_z]
    type = AFMSublatticeDMInteraction
    variable = mag2_z
    mag_sub = 1
    component = 2
  [../]

  #---------------------------------------#
  #                                       #
  #   Magnetocrystalline anisotropy for   #
  #   the AFM sublattice in easy-plane    #
  #                                       #
  #---------------------------------------#

  [./afma1_x]
    type = AFMEasyPlaneAnisotropy
    variable = mag1_x
    mag_sub = 0
    component = 0
  [../]
  [./afma1_y]
    type = AFMEasyPlaneAnisotropy
    variable = mag1_y
    mag_sub = 0
    component = 1
  [../]
  [./afma1_z]
    type = AFMEasyPlaneAnisotropy
    variable = mag1_z
    mag_sub = 0
    component = 2
  [../]

  [./afma2_x]
    type = AFMEasyPlaneAnisotropy
    variable = mag2_x
    mag_sub = 1
    component = 0
  [../]
  [./afma2_y]
    type = AFMEasyPlaneAnisotropy
    variable = mag2_y
    mag_sub = 1
    component = 1
  [../]
  [./afma2_z]
    type = AFMEasyPlaneAnisotropy
    variable = mag2_z
    mag_sub = 1
    component = 2
  [../]

  #---------------------------------------#
  #                                       #
  #   Single-ion anisotropy environment   #
  #   for the AFM sublattice in the       #
  #   degenerate easy-plane               #
  #                                       #
  #---------------------------------------#

  [./afmsia1_x]
    type = AFMSingleIonCubicSixthAnisotropy
    variable = mag1_x
    mag_sub = 0
    component = 0
  [../]
  [./afmsia1_y]
    type = AFMSingleIonCubicSixthAnisotropy
    variable = mag1_y
    mag_sub = 0
    component = 1
  [../]
  [./afmsia1_z]
    type = AFMSingleIonCubicSixthAnisotropy
    variable = mag1_z
    mag_sub = 0
    component = 2
  [../]

  [./afmsia2_x]
    type = AFMSingleIonCubicSixthAnisotropy
    variable = mag2_x
    mag_sub = 1
    component = 0
  [../]
  [./afmsia2_y]
    type = AFMSingleIonCubicSixthAnisotropy
    variable = mag2_y
    mag_sub = 1
    component = 1
  [../]
  [./afmsia2_z]
    type = AFMSingleIonCubicSixthAnisotropy
    variable = mag2_z
    mag_sub = 1
    component = 2
  [../]

  #---------------------------------------#
  #                                       #
  #          LLB constraint terms         #
  #                                       #
  #---------------------------------------#

  [./llb1_x]
    type = LongitudinalLLB
    variable = mag1_x
    mag_x = mag1_x
    mag_y = mag1_y
    mag_z = mag1_z
    component = 0
  [../]
  [./llb1_y]
    type = LongitudinalLLB
    variable = mag1_y
    mag_x = mag1_x
    mag_y = mag1_y
    mag_z = mag1_z
    component = 1
  [../]

  [./llb1_z]
    type = LongitudinalLLB
    variable = mag1_z
    mag_x = mag1_x
    mag_y = mag1_y
    mag_z = mag1_z
    component = 2
  [../]

  [./llb2_x]
    type = LongitudinalLLB
    variable = mag2_x
    mag_x = mag2_x
    mag_y = mag2_y
    mag_z = mag2_z
    component = 0
  [../]
  [./llb2_y]
    type = LongitudinalLLB
    variable = mag2_y
    mag_x = mag2_x
    mag_y = mag2_y
    mag_z = mag2_z
    component = 1
  [../]

  [./llb2_z]
    type = LongitudinalLLB
    variable = mag2_z
    mag_x = mag2_x
    mag_y = mag2_y
    mag_z = mag2_z
    component = 2
  [../]

  #---------------------------------------#
  #                                       #
  #    Local magnetic exchange            #
  #                                       #
  #---------------------------------------#

  [./dllg1_x_exch]
    type = ExchangeCartLL
    variable = mag1_x
    component = 0
    mag_x = mag1_x
    mag_y = mag1_y
    mag_z = mag1_z
  [../]
  [./dllg1_y_exch]
    type = ExchangeCartLL
    variable = mag1_y
    component = 1
    mag_x = mag1_x
    mag_y = mag1_y
    mag_z = mag1_z
  [../]
  [./dllg1_z_exch]
    type = ExchangeCartLL
    variable = mag1_z
    component = 2
    mag_x = mag1_x
    mag_y = mag1_y
    mag_z = mag1_z
  [../]

  [./dllg2_x_exch]
    type = ExchangeCartLL
    variable = mag2_x
    component = 0
    mag_x = mag2_x
    mag_y = mag2_y
    mag_z = mag2_z
  [../]
  [./dllg2_y_exch]
    type = ExchangeCartLL
    variable = mag2_y
    component = 1
    mag_x = mag2_x
    mag_y = mag2_y
    mag_z = mag2_z
  [../]
  [./dllg2_z_exch]
    type = ExchangeCartLL
    variable = mag2_z
    component = 2
    mag_x = mag2_x
    mag_y = mag2_y
    mag_z = mag2_z
  [../]

  #---------------------------------------#
  #                                       #
  #    Local AFM magnetic exchange        #
  #           (Local-term)                #
  #---------------------------------------#

  [./dllg1afm_x_exch]
    type = AFMLocalSublatticeExchangeCartLL
    variable = mag1_x
    mag_sub = 0
    component = 0
  [../]
  [./dllg1afm_y_exch]
    type = AFMLocalSublatticeExchangeCartLL
    variable = mag1_y
    mag_sub = 0
    component = 1
  [../]
  [./dllg1afm_z_exch]
    type = AFMLocalSublatticeExchangeCartLL
    variable = mag1_z
    mag_sub = 0
    component = 2
  [../]

  [./dllg2afm_x_exch]
    type = AFMLocalSublatticeExchangeCartLL
    variable = mag2_x
    mag_sub = 1
    component = 0
  [../]
  [./dllg2afm_y_exch]
    type = AFMLocalSublatticeExchangeCartLL
    variable = mag2_y
    mag_sub = 1
    component = 1
  [../]
  [./dllg2afm_z_exch]
    type = AFMLocalSublatticeExchangeCartLL
    variable = mag2_z
    mag_sub = 1
    component = 2
  [../]

  #---------------------------------------#
  #                                       #
  #    Interaction with demag and         #
  #    applied field                      #
  #                                       #
  #---------------------------------------#

  [./dllg1_x_int]
    type = AFMInteractionCartLLHConst
    variable = mag1_x
    mag_sub = 0
    component = 0
  [../]
  [./dllg1_y_int]
    type = AFMInteractionCartLLHConst
    variable = mag1_y
    mag_sub = 0
    component = 1
  [../]
  [./dllg1_z_int]
    type = AFMInteractionCartLLHConst
    variable = mag1_z
    mag_sub = 0
    component = 2
  [../]
  [./dllg2_x_int]
    type = AFMInteractionCartLLHConst
    variable = mag2_x
    mag_sub = 1
    component = 0
  [../]
  [./dllg2_y_int]
    type = AFMInteractionCartLLHConst
    variable = mag2_y
    mag_sub = 1
    component = 1
  [../]
  [./dllg2_z_int]
    type = AFMInteractionCartLLHConst
    variable = mag2_z
    mag_sub = 1
    component = 2
  [../]
[]

which is the same as the previous magnetic DW simulation of Example 3 with the exception of AFMInteractionCartLLHConst which adds the residual and jacobian contributions due to the Zeeman interaction,

(2)

for a constant field (no dependence on ). The Executioner options are set,

[Executioner]
  type = Transient
  solve_type = 'NEWTON'

  [./TimeIntegrator]
    type = NewmarkBeta
  [../]

  dtmin = 1e-18
  dtmax = 5.0e-8

  [./TimeStepper]
    type = IterationAdaptiveDT
    optimal_iterations = 25 #usually 10
    linear_iteration_ratio = 100
    dt = 1e-8
    growth_factor = 1.1
  [../]

  num_steps = 541
  end_time = 3.5e-5
[]

with the NewmarkBeta time integration method and an upper limit of fs. A visualization of the spin wave traveling through the DW region is provided below from ParaView,

Figure 1: Animation of spin wave transport through the 1/1 (100) FE domain boundary. The plotted variables are the components of the weak net magnetization .

This problem has a wall-clock time of 276.46 seconds on 6 processors using the WSL distribution of MOOSE. Different spin waves can be generate by changing the definitions of the ParsedFunctions.

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

This project SCALES - 897614 was funded for 2021-2023 at the Luxembourg Institute of Science and Technology under principle investigator Jorge Íñiguez-González. The research was carried out within the framework of the Marie Skłodowska-Curie Action (H2020-MSCA-IF-2019) fellowship.

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------