N.B.: , FDTD, noob.
@tholy , .
, Wikipedia Finite-difference time-domain method , .
, FDTD , . , .
1D , . , , , , . , Julia .
, :
addprocs(2)
@everywhere function ez_front(n::Int, ez::DArray, hy::DArray)
ez_local=localpart(ez)
hy_local=localpart(hy)
ez_local[1]=sin(n/10)
@simd for i=2:length(ez_local)
@inbounds ez_local[i] += (hy_local[i] - hy_local[i-1])
end
end
@everywhere function ez_back(ez::DArray, hy::DArray)
ez_local=localpart(ez)
hy_local=localpart(hy)
index_boundary::Int = first(localindexes(hy)[1])-1
ez_local[1] += (hy_local[1]-hy[index_boundary])
@simd for i=2:length(ez_local)
@inbounds ez_local[i] += (hy_local[i] - hy_local[i-1])
end
end
@everywhere function hy_front(ez::DArray, hy::DArray)
ez_local=localpart(ez)
hy_local=localpart(hy)
index_boundary = last(localindexes(ez)[1])+1
@simd for i=1:(length(hy_local)-1)
@inbounds hy_local[i] += (ez_local[i+1] - ez_local[i])
end
hy_local[end] += (ez[index_boundary] - ez_local[end])
end
@everywhere function hy_back(ez::DArray, hy::DArray)
ez_local=localpart(ez)
hy_local=localpart(hy)
@simd for i=2:(length(hy_local)-1)
@inbounds hy_local[i] += (ez_local[i+1] - ez_local[i])
end
hy_local[end] -= ez_local[end]
end
function fdtd1d_parallel(steps::Int, ie::Int = 200)
ez = dzeros((ie,),workers()[1:2],2)
hy = dzeros((ie,),workers()[1:2],2)
for n = 1:steps
@sync begin
@async begin
remotecall(workers()[1],ez_front,n,ez,hy)
remotecall(workers()[2],ez_back,ez,hy)
end
end
@sync begin
@async begin
remotecall(workers()[1],hy_front,ez,hy)
remotecall(workers()[2],hy_back,ez,hy)
end
end
end
(convert(Array{Float64},ez), convert(Array{Float64},hy))
end
fdtd1d_parallel(1);
@time sol2=fdtd1d_parallel(10);
( 32- 2- ) , ie - 5000000.
Julia, FDTD, FDTD. , Julia .