Beispiel #1
0
        /// <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"
                   );
     }
 }