为什么两种执行 Juilia 程序的方式会给出不同的结果?
Why two styles of executing Juilia programs are giving different results?
如果 运行 一个用 julia 编写的程序
sachin@localhost:$ julia mettis.jl
然后它 运行 成功了,没有打印任何东西,尽管其中有一个打印语句。
其次,如果 运行 进入朱莉娅:
sachin@localhost:$ julia
julia> include("mettis.jl")
main (generic function with 1 method)`
julia> main()
然后它给出了一些错误。
我很困惑为什么两种执行方式会给出不同的结果?
这是我的代码:
using ITensors
using Printf
function ITensors.op(::OpName"expτSS", ::SiteType"S=1/2", s1::Index, s2::Index; τ)
h =
1 / 2 * op("S+", s1) * op("S-", s2) +
1 / 2 * op("S-", s1) * op("S+", s2) +
op("Sz", s1) * op("Sz", s2)
return exp(τ * h)
end
function main(; N=10, cutoff=1E-8, δτ=0.1, beta_max=2.0)
# Make an array of 'site' indices
s = siteinds("S=1/2", N; conserve_qns=true)
# @show s
# Make gates (1,2),(2,3),(3,4),...
gates = ops([("expτSS", (n, n + 1), (τ=-δτ / 2,)) for n in 1:(N - 1)], s)
# Include gates in reverse order to complete Trotter formula
append!(gates, reverse(gates))
# Initial state is infinite-temperature mixed state
rho = MPO(s, "Id") ./ √2
@show inner(rho, H)
# Make H for measuring the energy
terms = OpSum()
for j in 1:(N - 1)
terms += 1 / 2, "S+", j, "S-", j + 1
terms += 1 / 2, "S-", j, "S+", j + 1
terms += "Sz", j, "Sz", j + 1
end
H = MPO(terms, s)
# Do the time evolution by applying the gates
# for Nsteps steps
for β in 0:δτ:beta_max
energy = inner(rho, H)
@printf("β = %.2f energy = %.8f\n", β, energy)
rho = apply(gates, rho; cutoff)main
rho = rho / tr(rho)
end
# @show energy
return nothing
end
Julia 中名为 main
的函数没有什么特别之处,定义函数与调用函数不同。因此,文件 mettis.jl
包含以下代码:
function main()
println("Hello, World!")
end
在 运行 (julia mettis.jl
) 时不会“做”任何事情。但是,如果您实际上在最后调用该函数:
function main()
println("Hello, World!")
end
main()
你得到了预期的结果
$ julia mettis.jl
Hello, World!
如果 运行 一个用 julia 编写的程序
sachin@localhost:$ julia mettis.jl
然后它 运行 成功了,没有打印任何东西,尽管其中有一个打印语句。
其次,如果 运行 进入朱莉娅:
sachin@localhost:$ julia
julia> include("mettis.jl")
main (generic function with 1 method)`
julia> main()
然后它给出了一些错误。
我很困惑为什么两种执行方式会给出不同的结果?
这是我的代码:
using ITensors
using Printf
function ITensors.op(::OpName"expτSS", ::SiteType"S=1/2", s1::Index, s2::Index; τ)
h =
1 / 2 * op("S+", s1) * op("S-", s2) +
1 / 2 * op("S-", s1) * op("S+", s2) +
op("Sz", s1) * op("Sz", s2)
return exp(τ * h)
end
function main(; N=10, cutoff=1E-8, δτ=0.1, beta_max=2.0)
# Make an array of 'site' indices
s = siteinds("S=1/2", N; conserve_qns=true)
# @show s
# Make gates (1,2),(2,3),(3,4),...
gates = ops([("expτSS", (n, n + 1), (τ=-δτ / 2,)) for n in 1:(N - 1)], s)
# Include gates in reverse order to complete Trotter formula
append!(gates, reverse(gates))
# Initial state is infinite-temperature mixed state
rho = MPO(s, "Id") ./ √2
@show inner(rho, H)
# Make H for measuring the energy
terms = OpSum()
for j in 1:(N - 1)
terms += 1 / 2, "S+", j, "S-", j + 1
terms += 1 / 2, "S-", j, "S+", j + 1
terms += "Sz", j, "Sz", j + 1
end
H = MPO(terms, s)
# Do the time evolution by applying the gates
# for Nsteps steps
for β in 0:δτ:beta_max
energy = inner(rho, H)
@printf("β = %.2f energy = %.8f\n", β, energy)
rho = apply(gates, rho; cutoff)main
rho = rho / tr(rho)
end
# @show energy
return nothing
end
Julia 中名为 main
的函数没有什么特别之处,定义函数与调用函数不同。因此,文件 mettis.jl
包含以下代码:
function main()
println("Hello, World!")
end
在 运行 (julia mettis.jl
) 时不会“做”任何事情。但是,如果您实际上在最后调用该函数:
function main()
println("Hello, World!")
end
main()
你得到了预期的结果
$ julia mettis.jl
Hello, World!