Issues with undefined variables in loops?

#1

I am running a center finite difference method with temporally dependent boundary condition. The following code runs fine.

dirichlet=1
for Δt in range(2,stop=length(t_array)-1, step=1)
    for Δx in range(1,length=Nx)
        if Δx == 1
            p_series[Δt+1,Δx] = 2*p_series[Δt,Δx]-p_series[Δt-1,Δx]+((δt^2*c0^2)/δx^2)*(p_series[Δt,Δx+1]-2*p_series[Δt,Δx]+dirichlet)
        elseif Δx == Nx
            p_series[Δt+1,Δx] = 2*p_series[Δt,Δx]-p_series[Δt-1,Δx]+((δt^2*c0^2)/δx^2)*(dirichlet-2*p_series[Δt,Δx]+p_series[Δt,Δx-1])
        else
            p_series[Δt+1,Δx] = 2*p_series[Δt,Δx]-p_series[Δt-1,Δx]+((δt^2*c0^2)/δx^2)*(p_series[Δt,Δx+1]-2*p_series[Δt,Δx]+p_series[Δt,Δx-1])
        end
    end
end

however when I add an if statement to set the boundary to be 0 after a number of time steps using…

dirichlet=1
# Start time loop
for Δt in range(2,stop=length(t_array)-1, step=1)
    if Δt == 10
        dirichlet=0
    end
    for Δx in range(1,length=Nx)
        if Δx == 1
            p_series[Δt+1,Δx] = 2*p_series[Δt,Δx]-p_series[Δt-1,Δx]+((δt^2*c0^2)/δx^2)*(p_series[Δt,Δx+1]-2*p_series[Δt,Δx]+dirichlet)
        elseif Δx == Nx
            p_series[Δt+1,Δx] = 2*p_series[Δt,Δx]-p_series[Δt-1,Δx]+((δt^2*c0^2)/δx^2)*(dirichlet-2*p_series[Δt,Δx]+p_series[Δt,Δx-1])
        else
            p_series[Δt+1,Δx] = 2*p_series[Δt,Δx]-p_series[Δt-1,Δx]+((δt^2*c0^2)/δx^2)*(p_series[Δt,Δx+1]-2*p_series[Δt,Δx]+p_series[Δt,Δx-1])
        end
    end
end

I get…

ERROR: UndefVarError: dirichlet not defined
Stacktrace:
 [1] top-level scope at ./REPL[254]:8 [inlined]
 [2] top-level scope at ./none:0

I am not quite seeing why this error comes up.

#2

You are using global variables in the repl, which now needs an explicit global declaration. (There are various posts on discourse about this.)

The solution to this is to wrap everything in a function, which will also significantly improve performance.

2 Likes
#3

An alternative workflow is to “play around” prototyping things in Jupyter (which will behave the way you are expecting) and then wrap in a function when you want to move it into a .jl file.

3 Likes
#4

Thanks! I was mainly just using it to “play around”, so I am not too worried about performance right now.

#5

I may check out Jupyter again, but I was just writing a small script to understand the problem.

#6

Most people like to do their “scripts” in jupyter, and then put things into real functions in the .jl files with Atom. If you use that approach, you will never run into this issue again.