Skip to content

Callback finds only one solution #1040

@IromainI

Description

@IromainI

Hi everyone!
I am trying to find the right parameters that satisfy the solved ODE system. In my problem, it is necessary that the solution r[5]. For verification, I use I use callback return abs(real(u[5])) >= 0.1. When this condition is met, I want the current solution to be interrupted and a new one with new parameters to start. The problem is as follows: when the first solution is found, the program turns off, the function affect! is not called. Thank you

These are the initial values of the variables

using DifferentialEquations

global_index_t1 = 1
global_index_t2 = 1
global_index_Ω1 = 1
global_index_Ω2 = 1
global_index_Δ1 = 1
global_index_Δ2 = 1
global_index_Γ1 = 1
global_index_Γ2 = 1
global_index_γ1 = 1
global_index_γ2 = 1
global_index_γ3 = 1
global_index_σ1 = 1
global_index_σ2 = 1
finish = false

successful_combinations = []

Ω = [10.0, 10.0]
Δ = [0.0, 0.0]
Γ = [0.5, 0.5]
γ = [1/4, 0.5, 1/4]
t0 = [24.0, 20.0]
σ = [3.0, 3.0]

Ω01 = collect(9:1:11)
Ω02 = collect(9:1:11)
Δ01 = collect(0.0:1:2.0)
Δ02 = collect(0.0:1:1.0)
σ01 = collect(2.0:1:4.0)
σ02 = collect(2.0:1:4.0)
t00 = collect(23:1:25)
t01 = collect(18:1:22)
Γ01 = collect(0.4:0.1:0.6)
Γ02 = collect(0.4:0.1:0.6)
γ01 = collect(0.2:0.05:0.3)
γ02 = collect(0.0:0.05:0.1)
γ03 = collect(0.2:0.05:0.3)

This is the part with callack

function condition(u, t, integrator)
    return abs(real(u[5])) >= 0.1
end

function affect!(integrator)
    global global_index_t1, global_index_t2, global_index_Ω1, global_index_Ω2, global_index_Δ1, global_index_Δ2
    global global_index_Γ1, global_index_Γ2, global_index_γ1, global_index_γ2, global_index_γ3
    global global_index_σ1, global_index_σ2, finish

    println(#"Event triggered at t = ", integrator.t,
            global_index_t1,
            global_index_t2,
            global_index_Ω1,
            global_index_Ω2,
            global_index_Δ1,
            global_index_Δ2,
            global_index_Γ1,
            global_index_Γ2,
            global_index_γ1,
            global_index_γ2,
            global_index_γ3,
            global_index_σ1,
            global_index_σ2)

            if global_index_t1 < length(t00)
                global_index_t1 += 1
            elseif global_index_t2 < length(t01)
                global_index_t1 = 1
                global_index_t2 += 1
            elseif global_index_Ω1 < length(Ω01)
                global_index_t2 = 1
                global_index_t1 = 1
                global_index_Ω1 += 1
            elseif global_index_Ω2 < length(Ω02)
                global_index_Ω1 = 1
                global_index_t2 = 1
                global_index_t1 = 1
                global_index_Ω2 += 1
            elseif global_index_Δ1 < length(Δ01)
                global_index_Ω2 = 1
                global_index_Ω1 = 1
                global_index_t2 = 1
                global_index_t1 = 1
                global_index_Δ1 += 1
            elseif global_index_Δ2 < length(Δ02)
                global_index_Δ1 = 1
                global_index_Ω2 = 1
                global_index_Ω1 = 1
                global_index_t2 = 1
                global_index_t1 = 1
                global_index_Δ2 += 1
            elseif global_index_Γ1 < length(Γ01)
                global_index_Δ2 = 1
                global_index_Δ1 = 1
                global_index_Ω2 = 1
                global_index_Ω1 = 1
                global_index_t2 = 1
                global_index_t1 = 1
                global_index_Γ1 += 1
            elseif global_index_Γ2 < length(Γ02)
                global_index_Γ1 = 1
                global_index_Δ2 = 1
                global_index_Δ1 = 1
                global_index_Ω2 = 1
                global_index_Ω1 = 1
                global_index_t2 = 1
                global_index_t1 = 1
                global_index_Γ2 += 1
            elseif global_index_γ1 < length(γ01)
                global_index_Γ2 = 1
                global_index_Γ1 = 1
                global_index_Δ2 = 1
                global_index_Δ1 = 1
                global_index_Ω2 = 1
                global_index_Ω1 = 1
                global_index_t2 = 1
                global_index_t1 = 1
                global_index_γ1 += 1
            elseif global_index_γ2 < length(γ02)
                global_index_γ1 = 1
                global_index_Γ2 = 1
                global_index_Γ1 = 1
                global_index_Δ2 = 1
                global_index_Δ1 = 1
                global_index_Ω2 = 1
                global_index_Ω1 = 1
                global_index_t2 = 1
                global_index_t1 = 1
                global_index_γ2 += 1
            elseif global_index_γ3 < length(γ03)
                global_index_γ2 = 1
                global_index_γ1 = 1
                global_index_Γ2 = 1
                global_index_Γ1 = 1
                global_index_Δ2 = 1
                global_index_Δ1 = 1
                global_index_Ω2 = 1
                global_index_Ω1 = 1
                global_index_t2 = 1
                global_index_t1 = 1
                global_index_γ3 += 1
            elseif global_index_σ1 < length(σ01)
                global_index_γ3 = 1
                global_index_γ2 = 1
                global_index_γ1 = 1
                global_index_Γ2 = 1
                global_index_Γ1 = 1
                global_index_Δ2 = 1
                global_index_Δ1 = 1
                global_index_Ω2 = 1
                global_index_Ω1 = 1
                global_index_t2 = 1
                global_index_t1 = 1
                global_index_σ1 += 1
            elseif global_index_σ2 < length(σ02)
                global_index_σ1 = 1
                global_index_γ3 = 1
                global_index_γ2 = 1
                global_index_γ1 = 1
                global_index_Γ2 = 1
                global_index_Γ1 = 1
                global_index_Δ2 = 1
                global_index_Δ1 = 1
                global_index_Ω2 = 1
                global_index_Ω1 = 1
                global_index_t2 = 1
                global_index_t1 = 1
                global_index_σ2 += 1
            else
                println("All combinations exhausted. Terminating integrator.")
                finish=true
                return
            end
        
            integrator.p[1][1] = Ω01[global_index_Ω1]
            integrator.p[1][2] = Ω02[global_index_Ω2]
            integrator.p[2][1] = Δ01[global_index_Δ1]
            integrator.p[2][2] = Δ02[global_index_Δ2]
            integrator.p[3][1] = σ01[global_index_σ1]
            integrator.p[3][2] = σ02[global_index_σ2]
            integrator.p[4][1] = t00[global_index_t1]
            integrator.p[4][2] = t01[global_index_t2]
            integrator.p[5][1] = Γ01[global_index_Γ1]
            integrator.p[5][2] = Γ02[global_index_Γ2]
            integrator.p[6][1] = γ01[global_index_γ1]
            integrator.p[6][2] = γ02[global_index_γ2]
            integrator.p[6][3] = γ03[global_index_γ3]


            reinit!(integrator, integrator.u)
        end

event_cb = DiscreteCallback(condition, affect!)

The system that needs to be solved is written here

p = (Ω, Δ, σ, t0, Γ, γ)

function LambdaSystem(dρ, ρ, p, t)
    Ω₀, Δ, σ, t₀, Γ, γ = p
  
    Ω_ip = zeros(2, 1)
    
    Ω_ip = Ω₀' .* exp.(-((t .- t₀) ./ σ).^2) # Rabi Frequency
  
    Ω_ip[1] = Ω₀[1] * exp(-((t - t₀[1]) / σ[1])^2) 
    Ω_ip[2] = Ω₀[2] * exp(-((t - t₀[2]) / σ[2])^2)
    
    dρ[1] = Γ[1] * ρ[5] - Ω_ip[1] * 1im * (ρ[4] - ρ[2]) 
    dρ[5] = -(Γ[1] + Γ[2]) * ρ[5] - 1im * (Ω_ip[1] * (ρ[2] - ρ[4]) + Ω_ip[2] * (ρ[8] - ρ[6])) 
    dρ[9] = Γ[2] * ρ[5] - 1im * Ω_ip[2] * (ρ[6] - ρ[8])

    dρ[2] = (-γ[1] + 1im * Δ[1]) * ρ[2] - 1im * ((Ω_ip[1]) * (ρ[5] - ρ[1]) - Ω_ip[2] * ρ[3]) 
    dρ[3] = (-γ[2] + 1im * (Δ[1] - Δ[2])) * ρ[3] - 1im * (Ω_ip[1] * ρ[6] - Ω_ip[2] * ρ[2]) 
    dρ[6] = (-γ[3] - 1im * Δ[2]) * ρ[6] - 1im * (Ω_ip[2] * (ρ[9] - ρ[5]) + Ω_ip[1] * ρ[3])
    dρ[4] = conj(dρ[2])
    dρ[7] = conj(dρ[3])
    dρ[8] = conj(dρ[6])
end

This is a block that saves correct decisions and changes the value of the first parameter

while true
    global global_index_t1, global_index_t2, global_index_Ω1, global_index_Ω2, global_index_Δ1, global_index_Δ2
    global global_index_Γ1, global_index_Γ2, global_index_γ1, global_index_γ2, global_index_γ3
    global global_index_σ1, global_index_σ2, finish, successful_combinations

    u0 = [1.0 + 0.0im, 0.0 + 0.0im, 0.0 + 0.0im, 0.0 + 0.0im, 
      0.0 + 0.0im, 0.0 + 0.0im, 0.0 + 0.0im, 0.0 + 0.0im, 0.0 + 0.0im]
    tspan = (0.0, 25.0)
    prob = ODEProblem(LambdaSystem, u0, tspan, p)
    event_cb = DiscreteCallback(condition, affect!)
    sol = solve(prob, Tsit5(), callback=event_cb)
    println(#"Event triggered at t = ", integrator.t,
    "sol",
    global_index_t1,
     global_index_t2,
     global_index_Ω1,
    global_index_Ω2,
     global_index_Δ1,
     global_index_Δ2,
     global_index_Γ1,
     global_index_Γ2,
     global_index_γ1,
    global_index_γ2,
     global_index_γ3,
     global_index_σ1,
     global_index_σ2)
    if finish==true
        break
    end
    push!(successful_combinations, 
    [Ω01[global_index_Ω1],
        Ω02[global_index_Ω2],
        Δ01[global_index_Δ1],
        Δ02[global_index_Δ2],
        σ01[global_index_σ1],
        σ02[global_index_σ2],
        t00[global_index_t1],
        t01[global_index_t2],
        Γ01[global_index_Γ1],
        Γ02[global_index_Γ2],
        γ01[global_index_γ1],
        γ02[global_index_γ2],
        γ03[global_index_γ3]])
        global_index_t1+=1
    
end

println("Successful combinations: ", successful_combinations)

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions