@@ -2,11 +2,11 @@ using StructArrays
22
33# TODO : add additional field with spin metadata? This is related to considerations of
44# the ability to add arbitrary element metadata to `keydata`, how could this be extendable?
5- # Would any additional metadata in `keydata` elements would have to be added to RealBSparseMetadata as a field?
5+ # Would any additional metadata in `keydata` elements would have to be added to BSparseMetadata as a field?
66# This can be achieved by creating a function which would take relevant information such as basisf and spin from
77# RealBSparseMetadata but would also allow to add custom metadata (no need for an extra struct)
88# It would also be nice to be able to change metadata on `keydata` once RealBSparseOperator has been
9- # defined already (however this wouldn't be possible without creating a new instance because RealBSparseOperator
9+ # defined already (however this wouldn't be possible without creating a new instance because BSparseOperator
1010# is parametric with respect to KT, but that's possible without copies)
1111
1212struct RealBSparseMetadata{A<: AbstractSystem , S<: RealBlockSparsity , B<: BasisSetMetadata , P<: Union{SpinsMetadata, Nothing} } <: AbstractBSparseMetadata{A, S, B, P}
@@ -16,23 +16,30 @@ struct RealBSparseMetadata{A<:AbstractSystem, S<:RealBlockSparsity, B<:BasisSetM
1616 spins:: P
1717end
1818
19+ struct RecipBSparseMetadata{A<: AbstractSystem , S<: RecipBlockSparsity , B<: BasisSetMetadata , P<: Union{SpinsMetadata, Nothing} } <: AbstractBSparseMetadata{A, S, B, P}
20+ atoms:: A
21+ sparsity:: S
22+ basisset:: B
23+ spins:: P
24+ kpoint:: SVector{3, Float64}
25+ end
26+
1927# I will usually work with the case where metadata in keydata are named tuples
2028# i.e. KT == Tuple{Vector{@NamedTuple{basisf::BasisMetadata{E}, spin::SpinMetadata}}, ...}
2129# TODO : Consider changing <:SpeciesPairAnyDict{<:AbstractArray{T}}
22- struct RealBSparseOperator {O<: OperatorKind , T<: Real , D<: SpeciesPairAnyDict{<:AbstractArray{T}} , M<: AbstractBSparseMetadata , KD<: AtomPairAnyDict } <: AbstractBSparseOperator{O, T, D, M, KD}
30+ struct BSparseOperator {O<: OperatorKind , T<: Number , D<: SpeciesPairAnyDict{<:AbstractArray{T}} , M<: AbstractBSparseMetadata , KD<: AtomPairAnyDict } <: AbstractBSparseOperator{O, T, D, M, KD}
2331 kind:: O
2432 data:: D
2533 metadata:: M
2634 keydata:: KD
2735end
2836
29- get_float (operator:: RealBSparseOperator ) = typeof (operator). parameters[2 ]
30- get_keydata (operator:: RealBSparseOperator ) = operator. keydata
37+ get_keydata (operator:: BSparseOperator ) = operator. keydata
3138
3239# Constructor to initialize the operator with zero values
3340# TODO : possibly split into smaller functions? Also this function could accept
3441# additional metadata to go into keydata
35- function RealBSparseOperator (kind:: OperatorKind , metadata:: RealBSparseMetadata ; float:: Type{T} = Float64) where T
42+ function BSparseOperator (kind:: OperatorKind , metadata:: AbstractBSparseMetadata ; float:: Type{T} = Float64) where T
3643
3744 z1z2_ij2interval = get_z1z2_ij2interval (metadata)
3845 basisset = get_basisset (metadata)
@@ -97,11 +104,11 @@ function RealBSparseOperator(kind::OperatorKind, metadata::RealBSparseMetadata;
97104 end
98105 keydata = Dictionary {NTuple{2, Int}, typeof(first(keydata_values))} (ij_contiguous, keydata_values)
99106
100- return RealBSparseOperator (kind, data, metadata, keydata)
107+ return BSparseOperator (kind, data, metadata, keydata)
101108end
102109
103- get_z1z2_ij2interval (operator:: RealBSparseOperator ) = get_z1z2_ij2interval (get_atoms (operator), get_sparsity (operator))
104- get_z1z2_ij2interval (metadata:: RealBSparseMetadata ) = get_z1z2_ij2interval (get_atoms (metadata), get_sparsity (metadata))
110+ get_z1z2_ij2interval (operator:: BSparseOperator ) = get_z1z2_ij2interval (get_atoms (operator), get_sparsity (operator))
111+ get_z1z2_ij2interval (metadata:: AbstractBSparseMetadata ) = get_z1z2_ij2interval (get_atoms (metadata), get_sparsity (metadata))
105112
106113function get_z1z2_ij2interval (atoms:: AbstractSystem , sparsity:: RealBlockSparsity )
107114 unique_species = unique (species (atoms, :))
@@ -132,10 +139,10 @@ function get_z1z2_ij2interval(atoms::AbstractSystem, sparsity::RealBlockSparsity
132139 return Base. ImmutableDict (pairs (z1z2_ij2interval)... )
133140end
134141
135- get_z1z2_ij2offset (operator:: RealBSparseOperator ) = get_z1z2_ij2offset (get_atoms (operator), get_sparsity (operator))
136- get_z1z2_ij2offset (metadata:: RealBSparseMetadata ) = get_z1z2_ij2offset (get_atoms (metadata), get_sparsity (metadata))
142+ get_z1z2_ij2offset (operator:: BSparseOperator ) = get_z1z2_ij2offset (get_atoms (operator), get_sparsity (operator))
143+ get_z1z2_ij2offset (metadata:: AbstractBSparseMetadata ) = get_z1z2_ij2offset (get_atoms (metadata), get_sparsity (metadata))
137144
138- function get_z1z2_ij2offset (atoms:: AbstractSystem , sparsity:: RealBlockSparsity )
145+ function get_z1z2_ij2offset (atoms:: AbstractSystem , sparsity:: AbstractBlockSparsity )
139146 # Converting from Base.ImmutableDict to Dictionary
140147 z1z2_ij2interval = dictionary (get_z1z2_ij2interval (atoms, sparsity))
141148 return get_z1z2_ij2offset (z1z2_ij2interval)
0 commit comments