Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions src/head.jl
Original file line number Diff line number Diff line change
Expand Up @@ -246,13 +246,33 @@ mutable struct BulkDMI{T<:AbstractFloat} <: MicroEnergy
name::String
end

mutable struct TimeBulkDMI{T<:AbstractFloat} <: MicroEnergy
Dx::Real
Dy::Real
Dz::Real
time_D::Function
field::AbstractArray{T,1}
energy::AbstractArray{T,1}
name::String
end


mutable struct SpatialBulkDMI{T<:AbstractFloat} <: MicroEnergy
D::AbstractArray{T,1}
field::AbstractArray{T,1}
energy::AbstractArray{T,1}
name::String
end

mutable struct TimeSpatialBulkDMI{T<:AbstractFloat} <: MicroEnergy
D::AbstractArray{T,1}
time_D::Function
field::AbstractArray{T,1}
energy::AbstractArray{T,1}
name::String
end


mutable struct InterfacialDMI{T<:AbstractFloat} <: MicroEnergy
D::AbstractArray{T,1}
field::AbstractArray{T,1}
Expand Down
39 changes: 39 additions & 0 deletions src/micro/add_field.jl
Original file line number Diff line number Diff line change
Expand Up @@ -334,6 +334,45 @@ function add_dmi(sim::MicroSim, D::NumberOrTupleOrArrayOrFunction; name="dmi", t
return dmi
end

"time_dmi-only support bulk DMI! Add changes similar to Zeeman field "

function add_dmi(sim::MicroSim,D::NumberOrTupleOrArrayOrFunction, ft::Function; name="time_dmi")
n_total = sim.n_total
T = Float[]
field = KernelAbstractions.zeros(default_backend[], T, 3 * n_total)
energy = KernelAbstractions.zeros(default_backend[], T, n_total)
if isa(D, Number)
dmi = TimeBulkDMI(T(D), T(D), T(D), ft, field, energy, name)
elseif isa(D, Tuple) && length(D) == 3
dmi = TimeBulkDMI(T(D[1]), T(D[2]), T(D[3]), ft, field, energy, name)
else
Spatial_D = zeros(T, sim.n_total)
init_scalar!(Spatial_D, sim.mesh, D)

D_kb = KernelAbstractions.zeros(default_backend[], T, n_total)
copyto!(D_kb, Spatial_D)

dmi = TimeSpatialBulkDMI(D_kb, ft, field, energy, name)
end

push!(sim.interactions, dmi)

if sim.save_data
push!(sim.saver.items,
SaverItem(string("E_", name), "<J>",
o::AbstractSim -> sum(dmi.energy)))
"Changes in the value of the ft function "
push!(sim.saver.items,
SaverItem(string("time_D", name), "<J/m^2>",
o::AbstractSim ->(dmi.time_D(o.driver.integrator.t))))

end
send_sim_state(sim)
return dmi
end



"""
add_demag(sim::MicroSim; name="demag", Nx=0, Ny=0, Nz=0, fft=true)

Expand Down
36 changes: 36 additions & 0 deletions src/micro/field.jl
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,26 @@ function effective_field(dmi::BulkDMI, sim::MicroSim, spin::AbstractArray{T,1},
return nothing
end

function effective_field(dmi::TimeBulkDMI, sim::MicroSim, spin::AbstractArray{T,1},
t::Float64) where {T<:AbstractFloat}
N = sim.n_total
mesh = sim.mesh
volume = T(mesh.volume)
Dx =dmi.time_D(t)*dmi.Dx
Dy =dmi.time_D(t)*dmi.Dy
Dz =dmi.time_D(t)*dmi.Dz


dx, dy, dz = T(mesh.dx), T(mesh.dy), T(mesh.dz)
back = default_backend[]
bulkdmi_kernel!(back, groupsize[])(spin, dmi.field, dmi.energy, sim.mu0_Ms,
Dx, Dy, Dz, dx, dy,
dz, mesh.ngbs, volume; ndrange=N)

return nothing

end

function effective_field(dmi::SpatialBulkDMI, sim::MicroSim, spin::AbstractArray{T,1},
t::Float64) where {T<:AbstractFloat}
N = sim.n_total
Expand All @@ -144,6 +164,22 @@ function effective_field(dmi::SpatialBulkDMI, sim::MicroSim, spin::AbstractArray
return nothing
end

function effective_field(dmi::TimeSpatialBulkDMI, sim::MicroSim, spin::AbstractArray{T,1},
t::Float64) where {T<:AbstractFloat}
N = sim.n_total
mesh =sim.mesh
volume = T(mesh.volume)
D = dmi.time_D(t)*dmi.D
dx, dy, dz = T(mesh.dx), T(mesh.dy), T(mesh.dz)
back = default_backend[]
spatial_bulkdmi_kernel!(back, groupsize[])(spin, dmi.field, dmi.energy, sim.mu0_Ms,
D, dx, dy, dz, mesh.ngbs, volume;
ndrange=N)

return nothing

end

function effective_field(dmi::InterfacialDMI, sim::MicroSim, spin::AbstractArray{T,1},
t::Float64) where {T<:AbstractFloat}
N = sim.n_total
Expand Down
Loading