J'essaye de traduire une modélisation python (pas très efficace) en un code Julia (plus utile dans ce contexte) mais je n'ai pas trouvé comment casser une boucle for et comment imprimer une valeur dans ce contexte.

Code Python

for i in np.range(1, nt)
    if t[x == s] == 100:
        s_time = i*dt
        print(s_time)
        break

Code Julia que j'ai essayé:

for i = 1:nt
    if round.(Int, t[x.==s]) == 100
        s_time = i*dt
        println(s_time)
        break
    end
end

Les variables ici ne sont pas importantes, mais dt est une valeur qui me permet de connaître l'heure en [y] dans la boucle for en fonction de i, et t[x.==s] == 100 me permet pour savoir quand je veux briser la boucle.

Le code Julia ne me renvoie aucune erreur mais ne casse pas et n'imprime rien.

Code complet (pour les utilisateurs de Jupyter Notebook):

# NUMERICS
ti = 30  # surface temperature
td = 1000  # dyke temperature
tel = 30  # right lim temperature
teg = tel  # left lim temperature
x1 = 80  # central position dyke 2
x2 = 110  # central position dyke 1
d1 = 24  # dyke diameter
d2 = 10  # dyke diameter
s = 160  # probe position

yd1 = 0  # dyke 1 intrusion year
yd2 = 15  # dyke 2 intrusion year

d = 40  # rock diffusivity
size = 200  # size of the model
ttot = 30;  # total time in year

nx = 2001  # cells number
dx = size/(nx-1)  # cells size
dt = dx^2/(2.1*d)  # frame condition
nt = round(Int, ttot/dt)  # frame number
x = LinRange(0, size, nx); # size model

# INITIALISATION
indexing_1_l = round(Int, (x1 - d1/2)*nx/size)
indexing_1_r = round(Int, (x1 + d1/2)*nx/size)
indexing_2_l = round(Int, (x2 - d2/2)*nx/size)
indexing_2_r = round(Int, (x2 + d2/2)*nx/size);

t = ti * ones(nx)
t[indexing_1_l:indexing_1_r] .= td;
using Plots
gr() ;

# PLOTTING LOOP
for i = 1:nt 
    
    q = -d*(diff(t)/dx)
    dcdt = -diff(q)/dx
    t[2:end-1] = t[2:end-1] + dcdt*dt
    
    t[1] = teg
    t[end] = tel
    
    if i == round(Int, yd2/dt)
        t[indexing_2_l:indexing_2_r] .= td
    end
    
    # IF STATEMENT THAT DOESN'T WORK
    if round.(Int, t[x.==s]) == 100
        s_time = i*dt
        println("$s_time")
        break
    end

    if mod(i, 1000) == 0
        IJulia.clear_output(true)
        pt = plot(x, t, label = :false, c="red", title=" $(round.(Int, i*dt)) [y] - Dyke intrusion", 
            xlabel="Distance [m]", ylabel="Temperature [°C]", ylims=(0, 1000), size = (800, 600))
        Plots.display(pt)
    end
    
end
1
bart-inho 14 sept. 2020 à 19:10

3 réponses

Meilleure réponse

Cela ne retournera jamais true car un tableau ne peut pas être égal à un nombre:

if round.(Int, t[x.==s]) == 100

Regarde ça

julia> [100] == 100
false

Ce que vous voulez dire n'est pas tout à fait clair, mais peut-être que

if all(round.(Int, t[x.==s]) .== 100)

Ou peut-être any?

2
DNF 14 sept. 2020 à 20:08

Vous avez une erreur de syntaxe! println (s_time)

1
Manuel Vergara Barbosa 14 sept. 2020 à 16:27

Pas tout à fait clair ce que vous voulez réaliser, mais ce flux de contrôle avec une pause fonctionne très bien (dans Julia 1.5.0)

for n in 1:10
    if n <= 5
        println(n)
    else
        break
    end
end
0
Rene 15 sept. 2020 à 18:49