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
,
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.
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------