Following your advice, I tried @code_warntype ground(), but I didn't see any concrete types, I don't know whether there is any other package you use as default.
在 2015年12月15日星期二 UTC+8上午1:45:41,Stefan Karpinski写道: > > The code is well-typed – try @code_warntype ground() and you can see that > all the local variables have concrete types. The inner loop allocates a lot > of new arrays where it could update the same array in place, so you could > try avoiding allocation in the inner loop. > > On Mon, Dec 14, 2015 at 8:23 AM, Patrick Kofod Mogensen < > [email protected] <javascript:>> wrote: > >> 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 >>> > >>> >>> >
