I get it, thanks for pointing that out.

On Monday, December 14, 2015 at 11:38:14 AM UTC+1, FQ wrote:
>
> 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