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