def SCFerror(self): """ Calculate the self-consistent field error. We do this by comparing the on-site elements of the new density matrix (self.rho) with the old density matrix, self.rhotot. It is normalised by dividing by the total number of electrons. """ return sum(abs( self.rho[TBH.map_atomic_to_index(atom1, orbital1, spin1, self.Job.NAtom, self.Job.NOrb),TBH.map_atomic_to_index(atom1, orbital2, spin2, self.Job.NAtom, self.Job.NOrb)] - self.rhotot[TBH.map_atomic_to_index(atom1, orbital1, spin1, self.Job.NAtom, self.Job.NOrb),TBH.map_atomic_to_index(atom1, orbital2, spin2, self.Job.NAtom, self.Job.NOrb)]) for atom1 in range(self.Job.NAtom) for orbital1 in range(self.Job.NOrb[atom1]) for spin1 in range(2) for orbital2 in range(orbital1, self.Job.NOrb[atom1]) for spin2 in range(spin1, 2) )/(self.Job.Electron.NElectrons**2)
def magnetic_correlation(self, site1, site2): """ Compute the direction averaged magnetic correlation between sites 1 and site 2. This requires the two particle density matrix. As we are using the mean field approximation the two particle density matrix is expressible in terms of the one particle density matrix. The equation below is the equation for the magnetic correlation using the single particle density matrix. C_avg = 1/3 sum_{absz}( 2(rho_{aa}^{zs} rho_{bb}^{sz} - rho_{ab}^{zz}rho_{ba}^{ss}) - rho_{aa}^{ss}rho_{bb}^{zz}+rho_{ab}^{sz}rho_{ba}^{zs}) where a are the spatial orbitals on site 1, b are the spatial orbitals on site 2, s and z are spin indices. """ C_avg = np.float64(0.0) norb_1 = self.Job.Model.atomic[self.Job.AtomType[site1]]['NOrbitals'] norb_2 = self.Job.Model.atomic[self.Job.AtomType[site2]]['NOrbitals'] for s in range(2): for z in range(2): for a in range(norb_1): for b in range(norb_2): index_az = TBH.map_atomic_to_index(site1,a,z,self.Job.NAtom, self.Job.NOrb) index_bz = TBH.map_atomic_to_index(site1,b,z,self.Job.NAtom, self.Job.NOrb) index_bs = TBH.map_atomic_to_index(site1,b,s,self.Job.NAtom, self.Job.NOrb) index_as = TBH.map_atomic_to_index(site1,a,s,self.Job.NAtom, self.Job.NOrb) # term 1: 2.0*rho_{aa}^{zs} rho_{bb}^{sz} C_avg += 2.0*self.rho[index_az,index_as]*self.rho[index_bs,index_bz] # term 2: -2.0*rho_{ab}^{zz}rho_{ba}^{ss}) C_avg -= 2.0*self.rho[index_az,index_bz]*self.rho[index_as,index_bs] # term 3: -rho_{aa}^{ss}rho_{bb}^{zz} C_avg -= self.rho[index_as,index_as]*self.rho[index_bz,index_bz] # term 4: rho_{ab}^{sz}rho_{ba}^{zs} C_avg += self.rho[index_as,index_bz]*self.rho[index_bz,index_as] # remember to divide by 3 C_avg = C_avg/3.0 return C_avg
def electrons_site_orbital_spin(self,site,orbital,spin): """Compute the number of electrons with specified spin, orbital and site. """ index = TBH.map_atomic_to_index(site, orbital, spin, self.Job.NAtom, self.Job.NOrb) return self.rho[index,index].real