/// <summary> /// Enumerates over all spin-orbital integrals represented /// by this term. /// These symmetries arise from: /// - Indistinguishability of electrons. /// - Orbitals are assumed to be real. /// - electron spins must be paired. /// </summary> /// <returns> /// Array of spin-orbital orbital integrals with the same coefficient. /// </returns> public SpinOrbital[][] EnumerateSpinOrbitals() { // Assumes spinOrbitals has an even number of elements // Only index over like spins S1 S2 S3 ... S3 S2 S1 const Int64 nSpins = 2L; var nSpinOrbitalArrays = nSpins.Pow(OrbitalIndices.Length / 2); SpinOrbital[][] spinOrbitalArrayOfArray = new SpinOrbital[OrbitalIndices.Length][]; for (int idx = 0; idx < nSpinOrbitalArrays; idx++) { SpinOrbital[] spinOrbitalArray = new SpinOrbital[OrbitalIndices.Length]; for (int idxOrbital = 0; idxOrbital < OrbitalIndices.Length / 2; idxOrbital++) { var fst = idxOrbital; var lst = OrbitalIndices.Length - idxOrbital - 1; var spin = (idx / nSpins.Pow(idxOrbital)) % nSpins; spinOrbitalArray[fst] = new SpinOrbital { orbital = OrbitalIndices[fst], spin = spin }; spinOrbitalArray[lst] = new SpinOrbital { orbital = OrbitalIndices[lst], spin = spin }; } spinOrbitalArrayOfArray[idx] = spinOrbitalArray; } return(spinOrbitalArrayOfArray); }
/// <summary> /// FermionTerm constructor. /// </summary> public FermionTerm(Int64 nOrbitals, Int64[] caArray, Int64[] fermionIdxArray, Double coeffIn) { CreationAnnihilationIndices = caArray; SpinOrbitalIndices = SpinOrbital.ToSpinOrbitals(nOrbitals, fermionIdxArray); coeff = coeffIn; if (!IsValid()) { throw new System.ArgumentException( $"Invalid FermionTerm specified. Length of caArray {caArray} and soArray {fermionIdxArray} must be equal.", "caArray" ); } }