diff --git a/src/bases.jl b/src/bases.jl index dfc9faf..1755464 100644 --- a/src/bases.jl +++ b/src/bases.jl @@ -1,3 +1,3 @@ -import QuantumInterface: Basis, basis, GenericBasis, CompositeBasis, +import QuantumInterface: Basis, basis, GenericBasis, CompositeBasis, ParticleBasis, PositionBasis, MomentumBasis, equal_shape, equal_bases, IncompatibleBases, @samebases, samebases, check_samebases, multiplicable, check_multiplicable, reduced, ptrace, permutesystems diff --git a/src/particle.jl b/src/particle.jl index e0f5ff8..5aafde0 100644 --- a/src/particle.jl +++ b/src/particle.jl @@ -1,74 +1,6 @@ import Base: position # TODO is it a good idea to abuse the Base namespace for a different use? using FFTW -abstract type ParticleBasis <: Basis end - -""" - PositionBasis(xmin, xmax, Npoints) - PositionBasis(b::MomentumBasis) - -Basis for a particle in real space. - -For simplicity periodic boundaries are assumed which means that -the rightmost point defined by `xmax` is not included in the basis -but is defined to be the same as `xmin`. - -When a [`MomentumBasis`](@ref) is given as argument the exact values -of ``x_{min}`` and ``x_{max}`` are due to the periodic boundary conditions -more or less arbitrary and are chosen to be -``-\\pi/dp`` and ``\\pi/dp`` with ``dp=(p_{max}-p_{min})/N``. -""" -struct PositionBasis{X1,X2,T,F} <: ParticleBasis - shape::Vector{T} - xmin::F - xmax::F - N::T - function PositionBasis{X1,X2}(xmin::F, xmax::F, N::T) where {X1,X2,F,T<:Integer} - @assert isa(X1, Real) && isa(X2, Real) - new{X1,X2,T,F}([N], xmin, xmax, N) - end -end -function PositionBasis(xmin::F1, xmax::F2, N) where {F1,F2} - F = promote_type(F1,F2) - return PositionBasis{xmin,xmax}(convert(F,xmin),convert(F,xmax),N) -end - -""" - MomentumBasis(pmin, pmax, Npoints) - MomentumBasis(b::PositionBasis) - -Basis for a particle in momentum space. - -For simplicity periodic boundaries are assumed which means that -`pmax` is not included in the basis but is defined to be the same as `pmin`. - -When a [`PositionBasis`](@ref) is given as argument the exact values -of ``p_{min}`` and ``p_{max}`` are due to the periodic boundary conditions -more or less arbitrary and are chosen to be -``-\\pi/dx`` and ``\\pi/dx`` with ``dx=(x_{max}-x_{min})/N``. -""" -struct MomentumBasis{P1,P2,T,F} <: ParticleBasis - shape::Vector{T} - pmin::F - pmax::F - N::T - function MomentumBasis{P1,P2}(pmin::F, pmax::F, N::T) where {T<:Integer,F,P1,P2} - @assert isa(P1, Real) && isa(P2, Real) - new{P1,P2,T,F}([N], pmin, pmax, N) - end -end -function MomentumBasis(pmin::F1, pmax::F2, N) where {F1,F2} - F = promote_type(F1,F2) - return MomentumBasis{pmin,pmax}(convert(F,pmin), convert(F,pmax), N) -end - -PositionBasis(b::MomentumBasis) = (dp = (b.pmax - b.pmin)/b.N; PositionBasis(-pi/dp, pi/dp, b.N)) -MomentumBasis(b::PositionBasis) = (dx = (b.xmax - b.xmin)/b.N; MomentumBasis(-pi/dx, pi/dx, b.N)) - -==(b1::PositionBasis, b2::PositionBasis) = b1.xmin==b2.xmin && b1.xmax==b2.xmax && b1.N==b2.N -==(b1::MomentumBasis, b2::MomentumBasis) = b1.pmin==b2.pmin && b1.pmax==b2.pmax && b1.N==b2.N - - """ gaussianstate([T=ComplexF64,] b::PositionBasis, x0, p0, sigma) gaussianstate([T=ComplexF64,] b::MomentumBasis, x0, p0, sigma) diff --git a/src/printing.jl b/src/printing.jl index f4aec6b..929456e 100644 --- a/src/printing.jl +++ b/src/printing.jl @@ -20,14 +20,6 @@ end set_printing(standard_order=false, rounding_tol=1e-17) -function show(stream::IO, x::PositionBasis) - write(stream, "Position(xmin=$(x.xmin), xmax=$(x.xmax), N=$(x.N))") -end - -function show(stream::IO, x::MomentumBasis) - write(stream, "Momentum(pmin=$(x.pmin), pmax=$(x.pmax), N=$(x.N))") -end - function show(stream::IO, x::SubspaceBasis) write(stream, "Subspace(superbasis=$(x.superbasis), states:$(length(x.basisstates)))") end