# compile using # gfortran -shared -fPIC osbrac.f90 -o osbrac.so # gfortran -shared -fPIC allosbrac.f90 -o allosbrac.so using Libdl function cal_BRAC(Emax, Λ, l1, l2) ϵ = (2 * Emax - Λ) % 2 N = (l1 - l2 + Λ - ϵ) ÷ 2 M = (l1 + l2 - Λ - ϵ) ÷ 2 L = Λ NQMAX = 2 * Emax CO = 1/sqrt(2) SI = 1/sqrt(2) FIRSTCALL = true # dimensions BRAC(0:L,0:(NQMAX-L)/2,0:(NQMAX-L)/2,0:(NQMAX-L)/2,0:(NQMAX-L)/2) BRAC = zeros(Float64, 1 + L, 1 + (NQMAX - L) ÷ 2, 1 + (NQMAX - L) ÷ 2, 1 + (NQMAX - L) ÷ 2, 1 + (NQMAX - L) ÷ 2) lib = Libdl.dlopen("OSBRACKETS/osbrac.so") # Open the library explicitly. sym = Libdl.dlsym(lib, :osbrac_) # Get a symbol for the function to call. # call signature OSBRAC(N,M,L,NQMAX,CO,SI,FIRSTCALL,BRAC) @ccall $sym(N::Ref{Int32},M::Ref{Int32},L::Ref{Int32},NQMAX::Ref{Int32},CO::Ref{Float64},SI::Ref{Float64},FIRSTCALL::Ref{UInt8},BRAC::Ptr{Array{Float64}})::Cvoid Libd.dlclose(lib) return BRAC end function get_bracket(BRAC, Emax, Λ, n1′, l1′, n2′, l2′, n1, n2) ϵ = (2 * Emax - Λ) % 2 NP = (l1′ - l2′ + Λ - ϵ) ÷ 2 N1P = n1′ MP = (l1′ + l2′ - Λ - ϵ) ÷ 2 N1 = n1 N2 = n2 N2P = n2′ if MP+N1P+N2P == M+N1+N2 # BRAC(NP,N1P,MP,N1,N2) return BRAC[1 + NP, 1 + N1P, 1 + MP, 1 + N1, 1 + N2] else return 0 end end