Skip to content
Snippets Groups Projects
Verified Commit e3922b61 authored by Michiel Cottaar's avatar Michiel Cottaar
Browse files

Ensure vectors are 3D when computing bmat_gradient

parent ede45ac9
No related branches found
No related tags found
No related merge requests found
...@@ -44,7 +44,10 @@ qval(cgb::ChangingGradient) = (grad_start(cgb) .+ grad_end(cgb)) .* (duration(cg ...@@ -44,7 +44,10 @@ qval(cgb::ChangingGradient) = (grad_start(cgb) .+ grad_end(cgb)) .* (duration(cg
_mult(g1::VariableType, g2::VariableType) = g1 * g2 _mult(g1::VariableType, g2::VariableType) = g1 * g2
_mult(g1::AbstractVector, g2::AbstractVector) = g1 .* permutedims(g2) _mult(g1::AbstractVector, g2::AbstractVector) = g1 .* permutedims(g2)
function bmat_gradient(cgb::ChangingGradient, qstart) to_vec(cgb::ChangingGradient1D, g::VariableType) = cgb.orientation .* g
to_vec(::ChangingGradient3D, g::AbstractVector) = g
function bmat_gradient(cgb::ChangingGradient, qstart::AbstractVector)
# grad = (g1 * (duration - t) + g2 * t) / duration # grad = (g1 * (duration - t) + g2 * t) / duration
# = g1 + (g2 - g1) * t / duration # = g1 + (g2 - g1) * t / duration
# q = qstart + g1 * t + (g2 - g1) * t^2 / (2 * duration) # q = qstart + g1 * t + (g2 - g1) * t^2 / (2 * duration)
...@@ -55,18 +58,20 @@ function bmat_gradient(cgb::ChangingGradient, qstart) ...@@ -55,18 +58,20 @@ function bmat_gradient(cgb::ChangingGradient, qstart)
# g1^2 * duration^3 / 3 + # g1^2 * duration^3 / 3 +
# g1 * (g2 - g1) * duration^3 / 4 + # g1 * (g2 - g1) * duration^3 / 4 +
# (g2 - g1)^2 * duration^3 / 10 # (g2 - g1)^2 * duration^3 / 10
grad_aver = to_vec(cgb, 2 .* grad_start(cgb) .+ grad_end(cgb))
return ( return (
_mult(qstart, qstart) .* duration(cgb) .+ _mult(qstart, qstart) .* duration(cgb) .+
duration(cgb)^2 .* _mult(qstart, 2 .* grad_start(cgb) .+ grad_end(cgb)) .* 2π ./ 3 .+ duration(cgb)^2 .* _mult(qstart, grad_aver) .* 2π ./ 3 .+
bmat_gradient(cgb) bmat_gradient(cgb)
) )
end end
function bmat_gradient(cgb::ChangingGradient) function bmat_gradient(cgb::ChangingGradient)
diff = slew_rate(cgb) .* duration(cgb) gs = to_vec(cgb, grad_start(cgb))
diff = to_vec(cgb, slew_rate(cgb) .* duration(cgb))
return (2π)^2 .* ( return (2π)^2 .* (
_mult(grad_start(cgb), grad_start(cgb)) ./ 3 .+ _mult(gs, gs) ./ 3 .+
_mult(grad_start(cgb), diff) ./ 4 .+ _mult(gs, diff) ./ 4 .+
_mult(diff, diff) ./ 10 _mult(diff, diff) ./ 10
) .* duration(cgb)^3 ) .* duration(cgb)^3
end end
......
...@@ -40,17 +40,20 @@ qval(cgb::ConstantGradient3D) = @. duration(cgb) * gradient_strength(cgb) * 2π ...@@ -40,17 +40,20 @@ qval(cgb::ConstantGradient3D) = @. duration(cgb) * gradient_strength(cgb) * 2π
_mult(g1::VariableType, g2::VariableType) = g1 * g2 _mult(g1::VariableType, g2::VariableType) = g1 * g2
_mult(g1::AbstractVector, g2::AbstractVector) = g1 .* permutedims(g2) _mult(g1::AbstractVector, g2::AbstractVector) = g1 .* permutedims(g2)
to_vec(cgb::ConstantGradient1D, g::VariableType) = cgb.orientation .* g
to_vec(::ConstantGradient3D, g::AbstractVector) = g
function bmat_gradient(cgb::ConstantGradient) function bmat_gradient(cgb::ConstantGradient)
grad = 2π .* gradient_strength(cgb) grad = to_vec(cgb, 2π .* gradient_strength(cgb))
return _mult(grad, grad) .* duration(cgb)^3 ./3 return _mult(grad, grad) .* duration(cgb)^3 ./3
end end
function bmat_gradient(cgb::ConstantGradient, qstart) function bmat_gradient(cgb::ConstantGradient, qstart::AbstractVector)
# \int dt (qstart + t * grad)^2 = # \int dt (qstart + t * grad)^2 =
# qstart^2 * duration + # qstart^2 * duration +
# qstart * grad * duration^2 + # qstart * grad * duration^2 +
# grad * grad * duration^3 / 3 + # grad * grad * duration^3 / 3 +
grad = 2π .* gradient_strength(cgb) grad = to_vec(cgb, 2π .* gradient_strength(cgb))
return ( return (
_mult(qstart, qstart) .* duration(cgb) .+ _mult(qstart, qstart) .* duration(cgb) .+
_mult(qstart, grad) .* duration(cgb)^2 .+ _mult(qstart, grad) .* duration(cgb)^2 .+
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment