Skip to content

Commit eea4708

Browse files
jonschumacherjonschumacher
andauthored
Add some homogeneous fields (#38)
* Add fields * Fix tests * Change `SequencedField` * Add some tests * Switch to rotated FFL * Some fixes and additions * Add coverage * Fix tests * Fix tests * Fix coverage * Add ErrorException * Update Project.toml --------- Co-authored-by: jonschumacher <[email protected]>
1 parent d577643 commit eea4708

21 files changed

+1007
-432
lines changed

Project.toml

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,25 @@
11
name = "MPIMagneticFields"
22
uuid = "f6dda52a-86e9-4b50-afb7-f39836a99446"
33
authors = ["Marija Boberg <[email protected]> and contributors"]
4-
version = "0.0.7"
4+
version = "0.0.8"
55

66
[deps]
77
DocStringExtensions = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae"
88
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
9+
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
910
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
11+
Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
12+
Waveforms = "cb13b1c6-351e-5134-b3ad-d6a530956a82"
1013

1114
[compat]
1215
Aqua = "0.8"
1316
DocStringExtensions = "0.8, 0.9"
1417
JuliaFormatter = "1.0"
1518
LinearAlgebra = "1"
19+
Random = "1"
1620
StaticArrays = "1.5"
1721
Test = "1"
22+
Unitful = "1.15"
1823
Waveforms = "0.1"
1924
julia = "1"
2025

@@ -23,7 +28,8 @@ Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595"
2328
JuliaFormatter = "98e50ef6-434e-11e9-1051-2b60c6c9e899"
2429
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
2530
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
31+
Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
2632
Waveforms = "cb13b1c6-351e-5134-b3ad-d6a530956a82"
2733

2834
[targets]
29-
test = ["Aqua", "JuliaFormatter", "LinearAlgebra", "Test", "Waveforms"]
35+
test = ["Aqua", "JuliaFormatter", "LinearAlgebra", "Test", "Unitful", "Waveforms"]

example/FFLOrientation.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
using MPIMagneticFields
22
using PyPlot
33

4-
field = IdealXYFFL(5.0)
4+
field = IdealXYRotatedFFL(5.0)
55

66
for angle 0:(pi / 10):(2pi)
77
imshow([

example/SequencedFFL.jl

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using PyPlot
2+
using LinearAlgebra
3+
using Unitful
4+
5+
using MPIMagneticFields
6+
7+
field_ = IdealXYRotatedTranslatedFFL(5u"T/m")
8+
9+
f_ff = 200u"Hz"
10+
A_ff = 80.0u"mT"
11+
f_rot = 1u"Hz"
12+
ωᵣₒₜ = 2π * u"rad" * f_rot
13+
ϕᵣₒₜ = 0u"rad"
14+
T = 1.0u"s"
15+
16+
sequence_ = RotationalTranslationalSequence(
17+
T,
18+
StandardRotationPattern(; ω = ωᵣₒₜ, ϕ = ϕᵣₒₜ),
19+
SinusoidalTranslationPattern(; f = f_ff, amplitude = A_ff, offset = 0.0u"mT"),
20+
)
21+
22+
sequencedField = SequencedField(field_, sequence_)
23+
24+
figure()
25+
for t in range(0, 1, 20)u"s"
26+
imshow(ustrip.(u"T", norm.(MPIMagneticFields.value(sequencedField, t, [-0.03:0.001:0.03, -0.03:0.001:0.03, 0.0]u"m"))))
27+
sleep(0.1)
28+
end

src/CommonFields/CommonFields.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
include("FFL.jl")
32
include("FFP.jl")
43
include("Homogeneous.jl")

src/CommonFields/FFL.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ function value_(field::IdealXYRotatedFFL, r, ϕ)
1515
mat = SMatrix{3, 3}(1/2 .- 1/2 .* sincos_[2], -1/2 .* sincos_[1], 0, -1/2 .* sincos_[1], 1/2 .+ 1/2 .* sincos_[2], 0, 0, 0, 1) .* field.gradient
1616
return mat * r
1717
end
18+
value_(field::IdealXYRotatedFFL, r, ϕ::T) where {T <: AbstractVector} = [value_(field, r, ϕ_) for ϕ_ in ϕ]
1819

1920
export IdealXYRotatedTranslatedFFL
2021
mutable struct IdealXYRotatedTranslatedFFL{GT} <: AbstractMagneticField where {GT <: Number}
@@ -38,3 +39,5 @@ function value_(field::IdealXYRotatedTranslatedFFL, r, ϕ, δ)
3839
shift = SVector{3}(sincos_[1], sincos_[2], 0) .* δ
3940
return mat * r .+ shift
4041
end
42+
value_(field::IdealXYRotatedTranslatedFFL, r, ϕ::T, δ) where {T <: AbstractVector} = [value_(field, r, ϕ_, δ) for ϕ_ in ϕ]
43+
value_(field::IdealXYRotatedTranslatedFFL, r, ϕ::T, δ::V) where {T <: AbstractVector, V <: AbstractVector} = [value_(field, r, ϕ_, δ_) for (ϕ_, δ_) in zip(ϕ, δ)]

src/CommonFields/Homogeneous.jl

Lines changed: 69 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,27 +11,80 @@ FieldTimeDependencyStyle(::IdealHomogeneousField) = TimeConstant()
1111

1212
value_(field::IdealHomogeneousField, r) = field.value
1313

14-
# TODO: Define other combinations
15-
export IdealXYRotatedHomogeneousField
16-
mutable struct IdealXYRotatedHomogeneousField{T} <: AbstractMagneticField where {T <: Number}
14+
export FunctionDefinedHomogeneousField
15+
mutable struct FunctionDefinedHomogeneousField{F} <: AbstractMagneticField where {F <: Function}
16+
function_::F
17+
end
18+
19+
FieldStyle(::FunctionDefinedHomogeneousField) = HomogeneousField()
20+
FieldDefinitionStyle(::FunctionDefinedHomogeneousField) = MethodBasedFieldDefinition()
21+
FieldTimeDependencyStyle(::FunctionDefinedHomogeneousField) = TimeVarying()
22+
23+
value_(field::FunctionDefinedHomogeneousField, t, r) = field.function_(t)
24+
25+
export OneDimensionalVariableTranslationHomogeneousField
26+
mutable struct OneDimensionalVariableTranslationHomogeneousField <: AbstractMagneticField
27+
direction::Direction
28+
end
29+
30+
FieldStyle(::OneDimensionalVariableTranslationHomogeneousField) = HomogeneousField()
31+
FieldDefinitionStyle(::OneDimensionalVariableTranslationHomogeneousField) = MethodBasedFieldDefinition()
32+
FieldTimeDependencyStyle(::OneDimensionalVariableTranslationHomogeneousField) = TimeVarying()
33+
FieldMovementStyle(::OneDimensionalVariableTranslationHomogeneousField) = TranslationalMovement()
34+
RotationalDimensionalityStyle(::OneDimensionalVariableTranslationHomogeneousField) = RotationalDimensionalityStyle{ZeroDimensional}()
35+
TranslationalDimensionalityStyle(::OneDimensionalVariableTranslationHomogeneousField) = TranslationalDimensionalityStyle{OneDimensional}()
36+
37+
value_(field::OneDimensionalVariableTranslationHomogeneousField, t, r, δ) = value_(field.direction, field, t, r, δ)
38+
value_(field::OneDimensionalVariableTranslationHomogeneousField, t, r, δ::T) where {T <: AbstractVector} = [value_(field, t, r, δ_) for δ_ in δ]
39+
value_(direction::XDirection, field::OneDimensionalVariableTranslationHomogeneousField, t, r, δ) = SVector(δ, zero(eltype(δ)), zero(eltype(δ)))
40+
value_(direction::YDirection, field::OneDimensionalVariableTranslationHomogeneousField, t, r, δ) = SVector(zero(eltype(δ)), δ, zero(eltype(δ)))
41+
value_(direction::ZDirection, field::OneDimensionalVariableTranslationHomogeneousField, t, r, δ) = SVector(zero(eltype(δ)), zero(eltype(δ)), δ)
42+
43+
export IdealRotatedHomogeneousField
44+
mutable struct IdealRotatedHomogeneousField{RT, T} <: AbstractMagneticField where {RT <: RotationPlane, T <: Number}
45+
rotationPlane::RT
1746
amplitude::T
1847
end
1948

20-
FieldStyle(::IdealXYRotatedHomogeneousField) = HomogeneousField()
21-
FieldDefinitionStyle(::IdealXYRotatedHomogeneousField) = MethodBasedFieldDefinition()
22-
FieldTimeDependencyStyle(::IdealXYRotatedHomogeneousField) = TimeConstant()
23-
FieldMovementStyle(::IdealXYRotatedHomogeneousField) = RotationalMovement()
49+
export IdealXYRotatedHomogeneousField
50+
IdealXYRotatedHomogeneousField(amplitude::T) where T <: Number = IdealRotatedHomogeneousField(XYRotationPlane(), amplitude)
51+
52+
export IdealXZRotatedHomogeneousField
53+
IdealXZRotatedHomogeneousField(amplitude::T) where T <: Number = IdealRotatedHomogeneousField(XZRotationPlane(), amplitude)
54+
55+
export IdealYZRotatedHomogeneousField
56+
IdealYZRotatedHomogeneousField(amplitude::T) where T <: Number = IdealRotatedHomogeneousField(YZRotationPlane(), amplitude)
57+
58+
FieldStyle(::IdealRotatedHomogeneousField) = HomogeneousField()
59+
FieldDefinitionStyle(::IdealRotatedHomogeneousField) = MethodBasedFieldDefinition()
60+
FieldTimeDependencyStyle(::IdealRotatedHomogeneousField) = TimeConstant()
61+
FieldMovementStyle(::IdealRotatedHomogeneousField) = RotationalMovement()
2462

25-
value_(field::IdealXYRotatedHomogeneousField, r, ϕ) = [sin(ϕ), cos(ϕ), 0] .* field.amplitude
63+
value_(field::IdealRotatedHomogeneousField{XYRotationPlane, T}, r, ϕ) where {T <: Number} = [sin(ϕ), cos(ϕ), 0] .* field.amplitude
64+
value_(field::IdealRotatedHomogeneousField{XZRotationPlane, T}, r, ϕ) where {T <: Number} = [sin(ϕ), 0, cos(ϕ)] .* field.amplitude
65+
value_(field::IdealRotatedHomogeneousField{YZRotationPlane, T}, r, ϕ) where {T <: Number} = [0, sin(ϕ), cos(ϕ)] .* field.amplitude
66+
67+
export IdealRotatedTranslatedHomogeneousField
68+
mutable struct IdealRotatedTranslatedHomogeneousField{RT} <: AbstractMagneticField where {RT <: RotationPlane}
69+
rotationPlane::RT
70+
end
2671

2772
export IdealXYRotatedTranslatedHomogeneousField
28-
mutable struct IdealXYRotatedTranslatedHomogeneousField <: AbstractMagneticField end
73+
IdealXYRotatedTranslatedHomogeneousField() = IdealRotatedTranslatedHomogeneousField(XYRotationPlane())
74+
75+
export IdealXZRotatedTranslatedHomogeneousField
76+
IdealXZRotatedTranslatedHomogeneousField() = IdealRotatedTranslatedHomogeneousField(XZRotationPlane())
77+
78+
export IdealYZRotatedTranslatedHomogeneousField
79+
IdealYZRotatedTranslatedHomogeneousField() = IdealRotatedTranslatedHomogeneousField(YZRotationPlane())
2980

30-
FieldStyle(::IdealXYRotatedTranslatedHomogeneousField) = HomogeneousField()
31-
FieldDefinitionStyle(::IdealXYRotatedTranslatedHomogeneousField) = MethodBasedFieldDefinition()
32-
FieldTimeDependencyStyle(::IdealXYRotatedTranslatedHomogeneousField) = TimeConstant()
33-
FieldMovementStyle(::IdealXYRotatedTranslatedHomogeneousField) = RotationalTranslationalMovement()
34-
RotationalDimensionalityStyle(::IdealXYRotatedTranslatedHomogeneousField) = RotationalDimensionalityStyle{OneDimensional}()
35-
TranslationalDimensionalityStyle(::IdealXYRotatedTranslatedHomogeneousField) = TranslationalDimensionalityStyle{OneDimensional}()
81+
FieldStyle(::IdealRotatedTranslatedHomogeneousField) = HomogeneousField()
82+
FieldDefinitionStyle(::IdealRotatedTranslatedHomogeneousField) = MethodBasedFieldDefinition()
83+
FieldTimeDependencyStyle(::IdealRotatedTranslatedHomogeneousField) = TimeConstant()
84+
FieldMovementStyle(::IdealRotatedTranslatedHomogeneousField) = RotationalTranslationalMovement()
85+
RotationalDimensionalityStyle(::IdealRotatedTranslatedHomogeneousField) = RotationalDimensionalityStyle{OneDimensional}()
86+
TranslationalDimensionalityStyle(::IdealRotatedTranslatedHomogeneousField) = TranslationalDimensionalityStyle{OneDimensional}()
3687

37-
value_(field::IdealXYRotatedTranslatedHomogeneousField, r, ϕ, δ) = [sin(ϕ), cos(ϕ), 0] .* δ
88+
value_(field::IdealRotatedTranslatedHomogeneousField{XYRotationPlane}, r, ϕ, δ) = [sin(ϕ), cos(ϕ), 0] .* δ
89+
value_(field::IdealRotatedTranslatedHomogeneousField{XZRotationPlane}, r, ϕ, δ) = [sin(ϕ), 0, cos(ϕ)] .* δ
90+
value_(field::IdealRotatedTranslatedHomogeneousField{YZRotationPlane}, r, ϕ, δ) = [0, sin(ϕ), cos(ϕ)] .* δ

0 commit comments

Comments
 (0)