diff --git a/src/head.jl b/src/head.jl index e6fa0ae6..889a729e 100644 --- a/src/head.jl +++ b/src/head.jl @@ -246,6 +246,17 @@ 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} @@ -253,6 +264,15 @@ mutable struct SpatialBulkDMI{T<:AbstractFloat} <: MicroEnergy 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} diff --git a/src/micro/add_field.jl b/src/micro/add_field.jl index 9d7f0f73..52261bf8 100644 --- a/src/micro/add_field.jl +++ b/src/micro/add_field.jl @@ -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), "", + o::AbstractSim -> sum(dmi.energy))) + "Changes in the value of the ft function " + push!(sim.saver.items, + SaverItem(string("time_D", name), "", + 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) diff --git a/src/micro/field.jl b/src/micro/field.jl index cdd9de6d..970f0267 100644 --- a/src/micro/field.jl +++ b/src/micro/field.jl @@ -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 @@ -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