diff --git a/src/AtomsBase.jl b/src/AtomsBase.jl index a7dee05..c7d150c 100644 --- a/src/AtomsBase.jl +++ b/src/AtomsBase.jl @@ -1,6 +1,7 @@ module AtomsBase include("interface.jl") +include("atoms.jl") include("implementation_soa.jl") include("implementation_aos.jl") diff --git a/src/atoms.jl b/src/atoms.jl new file mode 100644 index 0000000..c4160f9 --- /dev/null +++ b/src/atoms.jl @@ -0,0 +1,38 @@ +# +# Extra stuff only for Systems composed of atoms +# + +export StaticAtom, AbstractAtomicSystem +export atomic_mass, + atomic_number, + atomic_symbol +export atomic_property, has_atomic_property, atomic_propertynames + +struct StaticAtom{D,L<:Unitful.Length} + position::SVector{D,L} + element::Element +end +StaticAtom(position, element) = StaticAtom{length(position)}(position, element) +position(atom::StaticAtom) = atom.position +species(atom::StaticAtom) = atom.element + +function StaticAtom(position, symbol::Union{Integer,AbstractString,Symbol,AbstractVector}) + StaticAtom(position, elements[symbol]) +end + +function Base.show(io::IO, a::StaticAtom) + print(io, "StaticAtom: $(a.element.symbol)") +end + +const AbstractAtomicSystem{D} = AbstractSystem{D,Element} + +atomic_symbol(a::StaticAtom) = a.element.symbol +atomic_mass(a::StaticAtom) = a.element.atomic_mass +atomic_number(a::StaticAtom) = a.element.number +atomic_property(a::StaticAtom, property::Symbol) = getproperty(a.element, property) + +atomic_symbol(sys::AbstractAtomicSystem) = atomic_symbol.(sys) +atomic_number(sys::AbstractAtomicSystem) = atomic_number.(sys) +atomic_mass(sys::AbstractAtomicSystem) = atomic_mass.(sys) +atomic_property(sys::AbstractAtomicSystem, property::Symbol)::Vector{Any} = + atomic_property.(sys, property) diff --git a/src/interface.jl b/src/interface.jl index 015ad6c..c61f694 100644 --- a/src/interface.jl +++ b/src/interface.jl @@ -4,19 +4,14 @@ using PeriodicTable using StaticArrays import Base.position -export AbstractSystem, AbstractAtomicSystem -export StaticAtom +export AbstractSystem export BoundaryCondition, DirichletZero, Periodic -export atomic_mass, - atomic_number, - atomic_symbol, - bounding_box, +export bounding_box, species, position, velocity, boundary_conditions, - periodic_dims -export atomic_property, has_atomic_property, atomic_propertynames + get_periodic export n_dimensions velocity(p)::Union{Unitful.Velocity,Missing} = missing @@ -48,7 +43,6 @@ get_periodic(sys::AbstractSystem) = # Note: Can't use ndims, because that is ndims(sys) == 1 (because of indexing interface) n_dimensions(::AbstractSystem{D}) where {D} = D - # indexing and iteration interface Base.getindex(::AbstractSystem, ::Int) = error("Implement me") Base.length(::AbstractSystem) = error("Implement me") @@ -68,33 +62,6 @@ position(sys::AbstractSystem) = position.(sys) # in Cartesian coordinates! velocity(sys::AbstractSystem) = velocity.(sys) # in Cartesian coordinates! species(sys::AbstractSystem) = species.(sys) -# -# Extra stuff only for Systems composed of atoms -# -const AbstractAtomicSystem{D} = AbstractSystem{D,Element} -atomic_symbol(sys::AbstractAtomicSystem) = atomic_symbol.(sys) -atomic_number(sys::AbstractAtomicSystem) = atomic_number.(sys) -atomic_mass(sys::AbstractAtomicSystem) = atomic_mass.(sys) -atomic_property(sys::AbstractAtomicSystem, property::Symbol)::Vector{Any} = - atomic_property.(sys, property) -atomic_propertiesnames(sys::AbstractAtomicSystem) = unique(sort(atomic_propertynames.(sys))) - -struct StaticAtom{D,L<:Unitful.Length} - position::SVector{D,L} - element::Element -end -StaticAtom(position, element) = StaticAtom{length(position),eltype(position)}(position, element) -position(atom::StaticAtom) = atom.position -species(atom::StaticAtom) = atom.element - -function StaticAtom(position, symbol::Union{Integer,AbstractString,Symbol,AbstractVector}) - StaticAtom(position, elements[symbol]) -end - -function Base.show(io::IO, a::StaticAtom) - print(io, "StaticAtom: $(a.element.symbol)") -end - # Just to make testing a little easier for now function Base.show(io::IO, mime::MIME"text/plain", sys::AbstractSystem) println(io, "$(string(nameof(typeof(sys)))):")