It is, although that is not very flexible (they are constants afterall). Also, your code becomes hard to understand, as the result of a function depends on one or many things which are defined somewhere else.
Another alternative is to wrap all these parameters in a struct to pass only one parameter “down”. The Parameters package allows for a convenient constructor:
using Parameters
struct MyPars
L::Int = 24
mass::Float64 = 1.0
basisN::Int = 4341
kList::Vector{Int} = [0, 12]
end
newpars = MyPars() # defaults to those values
newpars = MyPars(L=48) # change something
function constructPsi_2!(coeffs_k, eigvecs_k, ψ; pars = MyPars()) # default
@unpack L, mass = pars # "unpack" L and mass
whatever = L * mass
...
return ...
end
# call with:
constructPsi_2!(coeffs_k, eigvecs_k, ψ)
#or
constructPsi_2!(coeffs_k, eigvecs_k, ψ, pars = newpars)
#or
constructPsi_2!(coeffs_k, eigvecs_k, ψ, pars = MyPars(L=48))
Another thing: those type annotations in the function:
function constructPsi_2!(coeffs_k::OffsetArray{Vector{T},1, Vector{Vector{T}}}, eigvecs_k:: OffsetArray{Matrix{T},1, Vector{Matrix{T}}}, ψ::Vector{T})::Nothing where T
Don’t do anything for performance. They are useful for debugging and understanding the code better only. But specializing to an OffsetArray is certainly too much. You probably should at most use:
function constructPsi_2!(coeffs_k::AbstractVector{Vector{T}},
eigvecs_k:: AbstractVector{Matrix{T}},
ψ::AbstractVector{T}) where T
The Abstract there allows you to input a greater variety of vector types (such as offsets, slices, views).