You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
I wish to integrate a system of jump differential equations with JumpProblem. Variables in the system behave differently and I discrimiate between them using ComponentArray. The problem requires the definition of multiple jumps. I encounter the following problem. If I define the affect! functions manually one-by-one the code works as expected. If instead I create them with a function I get the error type NamedTuple has no field u. I spent some time inquiring the error but to no avail. I would be very interested to know what I am doing wrong.
Many thanks for your attention.
Below the two codes. The first works as expected
du.st_vec .= 0.0
du.mpr = 6.0.*c(t)*u.mpr/4.0
du.jpr = 0.0
end
sse_prob = ODEProblem(psi!, u0, (0.0, tf),p)
function rate!(u,p,t)
return c(t)/4.0
end
# "Manual" definition of the affect functions
function affect1!(integrator)
v = copyto!(integrator.p.tmp_psi, integrator.u.u.st_vec) # copy this to avoid aliasing later
mart = integrator.u.u.mpr
jump = integrator.u.u.jpr
jump_prob = real(dot(v,v))
if jump_prob > 0.0
normv = sqrt(jump_prob)
else
normv=1.0
end
mul!(integrator.u.u.st_vec, integrator.p.jump_ops[1], v, 1/normv,false)
integrator.u.u.mpr = -2.0*mart
integrator.u.u.jpr = -2.0*jump
nothing
end
function affect2!(integrator)
v = copyto!(integrator.p.tmp_psi, integrator.u.u.st_vec) # copy this to avoid aliasing later
mart = integrator.u.u.mpr
jump = integrator.u.u.jpr
jump_prob = real(dot(v,v))
if jump_prob > 0.0
normv = sqrt(jump_prob)
else
normv=1.0
end
mul!(integrator.u.u.st_vec, integrator.p.jump_ops[2], v, 1/normv,false)
integrator.u.u.mpr = -2.0*mart
integrator.u.u.jpr = -2.0*jump
nothing
end
function affect3!(integrator)
v = copyto!(integrator.p.tmp_psi, integrator.u.u.st_vec) # copy this to avoid aliasing later
mart = integrator.u.u.mpr
jump = integrator.u.u.jpr
jump_prob = real(dot(v,v))
if jump_prob > 0.0
normv = sqrt(jump_prob)
else
normv=1.0
end
mul!(integrator.u.u.st_vec, integrator.p.jump_ops[3], v, 1/normv,false)
integrator.u.u.mpr = -2.0*mart
integrator.u.u.jpr = -2.0*jump
nothing
end
# Construction of the JumpSet
jump1=VariableRateJump(rate!, affect1!)
jump2=VariableRateJump(rate!, affect2!)
jump3=VariableRateJump(rate!, affect3!)
jump_prob = JumpProblem(sse_prob, DirectFW(), jump1,jump2,jump3 );
ensemble_sse = EnsembleProblem(jump_prob)
jump_sol_sse = DifferentialEquations.solve(ensemble_sse, Tsit5(), EnsembleSerial(), trajectories=num_traj; save_everystep=true, dense=false,abstol=1e-8,reltol=1e-8,maxiters=Int(1e6));
As said the above code gives the expected result.
If I now replace the second part of the above with
function create_jump_affect(affected_id::Int)
function jump_affect_by_id!(integrator)
v = copyto!(integrator.p.tmp_psi, integrator.u.u.st_vec) # copy this to avoid aliasing later
mart = integrator.u.u.mpr
jump = integrator.u.u.jpr
jump_prob = real(dot(v,v))
if jump_prob > 0.0
normv = sqrt(jump_prob)
else
normv=1.0
end
mul!(integrator.u.u.st_vec, integrator.p.jump_ops[affected_id], v, 1/normv,false)
integrator.u.u.mpr = -2.0*mart
integrator.u.u.jpr = -2.0*jump
nothing
end
return jump_affect_by_id!
end
# Generate individual jumps by putting them in an array
jumps = VariableRateJump[]
for i in 1:3
push!(jumps,VariableRateJump(rate!, create_jump_affect(i)))
end
# Create a JumpSet with the provided constant rate jumps and empty/nil for other jump types
function create_jump_set(variable_jumps::Vector{VariableRateJump})
return JumpSet((), tuple(variable_jumps...), nothing, nothing)
end
# JumpSet
jump_prob = JumpProblem(sse_prob, DirectFW(), jumpset )
ensemble_sse = EnsembleProblem(jump_prob)
jump_sol_sse = DifferentialEquations.solve(ensemble_sse, Tsit5(), EnsembleSerial(), trajectories=num_traj; save_everystep=true, dense=false,abstol=1e-8,reltol=1e-8,maxiters=Int(1e6));
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
-
Hello,
I wish to integrate a system of jump differential equations with JumpProblem. Variables in the system behave differently and I discrimiate between them using ComponentArray. The problem requires the definition of multiple jumps. I encounter the following problem. If I define the affect! functions manually one-by-one the code works as expected. If instead I create them with a function I get the error type NamedTuple has no field u. I spent some time inquiring the error but to no avail. I would be very interested to know what I am doing wrong.
Many thanks for your attention.
Below the two codes. The first works as expected
As said the above code gives the expected result.
If I now replace the second part of the above with
I get the error
type NamedTuple has no field u
Many thanks for your patience!!
Beta Was this translation helpful? Give feedback.
All reactions