The code does exit at some point, returning a 2049x2049 complex matrix.
note that delta phi is reassigned inside the loop at some point.

Am 14.12.2015 um 10:31 schrieb Patrick Kofod Mogensen:
> Are you sure this version works? I get Δϕ == 1.0 in all iterations, so I
> can't see how it would ever exit the while loop...
> 
> On Monday, December 14, 2015 at 4:35:43 AM UTC+1, 博陈 wrote:
> 
>     This is my first julia code, I am happy it did the right thing, but
>     compared with the Matlab code that did the same thing, it runs so
>     slowly. The Matlab code takes about 90s, but the julia below takes 130s.
> 
>     Potential(x::Float64, y::Float64) = -2./sqrt(x^2+1.)
>     -2./sqrt(y^2+1.)  + 1./sqrt((x-y)^2+1.)
>     Ko(x::Float64,y::Float64) = x^2+y^2
> 
>     function ground()
>         R = 320.
>         Ks = 2^11
>         x = linspace(-R, R, Ks+1)
>         dx = 2R/Ks
>         dt = 0.1
>         pm = 2π/2dx
>         px = circshift( linspace(-pm, pm, Ks+1),  round(Int64, Ks/2) )
>         FFTW.set_num_threads(8)
> 
>         V = Float64[Potential(ix, iy)  for ix in x, iy in x]
>         ko = Float64[e^(-dt/4* (Ko(ipx,ipy))) for ipx in px, ipy in px]
>         ko2 = ko.^2
>         vo = Float64[e^(-dt* (Potential(ix,iy))) for ix in x, iy in x]
>         ϕ = Array(Complex128,(Ks+1,Ks+1))
>         Pl = plan_fft!(ϕ; flags=FFTW.MEASURE)
>         ϕ = V.*complex(1.)
> 
>         normphi = sqrt(sumabs2(ϕ))*dx
>         ϕ /= normphi
> 
>         ϕ = Pl*ϕ
>         ϕ .*= ko
>         ϕ = Pl\ϕ
> 
>         Δϕ = 1.
>         nstep = 0
>         print("start loop")
>          while Δϕ > 1.e-15
>             ϕ′ = ϕ
>             ϕ .*= vo
> 
>             normphi = sqrt(sumabs2(ϕ))*dx
>             ϕ /= normphi
> 
>             ϕ = Pl*ϕ
>             ϕ .*= ko2
>             ϕ = Pl\ϕ
>     # if check  Δϕ for every step, 35s is needed.
>             if nstep>500
>                 Δϕ = maxabs(ϕ-ϕ′)
>             end
>             nstep += 1
>             if mod(nstep,200)==0
>                 print(nstep,"  ")
>                 print("Δϕ=",Δϕ,"   ")
>             end
> 
>         end
>         ϕ .*= vo
> 
>         ϕ = Pl*ϕ
>         ϕ .*= ko
>         ϕ = Pl\ϕ
> 
>         normphi = sqrt(sumabs2(ϕ))*dx
>         ϕ /= normphi
>     end
> 

Reply via email to