def read_basis(self): """ Returns a set of atoms corresponding to the basis-sets in the ORB_INDX file The specie names have a short field in the ORB_INDX file, hence the name may not necessarily be the same as provided in the species block """ # First line contains no no_s line = self.readline().split() no = int(line[0]) self.readline() self.readline() pt = PeriodicTable() def crt_atom(spec, orbs): i = pt.Z(spec) if isinstance(i, int): return Atom(i, orbs) else: return Atom(-1, orbs, tag=spec) # Now we begin by reading the atoms atom = [] orbs = [] specs = [] ia = 1 for _ in range(no): line = self.readline().split() i_a = int(line[1]) if i_a != ia: if i_s not in specs: atom.append(crt_atom(spec, orbs)) specs.append(i_s) ia = i_a orbs = [] i_s = int(line[2]) - 1 if i_s in specs: continue spec = line[3] nlmz = list(map(int, line[5:9])) P = line[9] == 'T' rc = float(line[11]) * Bohr2Ang # Create the orbital o = AtomicOrbital(n=nlmz[0], l=nlmz[1], m=nlmz[2], Z=nlmz[3], P=P, spherical=Orbital(rc)) orbs.append(o) if i_s not in specs: atom.append(crt_atom(spec, orbs)) specs.append(i_s) # Now re-arrange the atoms and create the Atoms object return Atoms([atom[i] for i in specs])
def test_orbital_momentum(self, setup): bond = 1.42 sq3h = 3.**.5 * 0.5 sc = SuperCell(np.array([[1.5, sq3h, 0.], [1.5, -sq3h, 0.], [0., 0., 10.]], np.float64) * bond, nsc=[3, 3, 1]) orb = AtomicOrbital('px', R=bond * 1.001) C = Atom(6, orb) g = Geometry(np.array([[0., 0., 0.], [1., 0., 0.]], np.float64) * bond, atoms=C, sc=sc) D = DensityMatrix(g, spin=Spin('SO')) D.construct([[0.1, bond + 0.01], [(1., 0.5, 0.01, 0.01, 0.01, 0.01, 0., 0.), (0.1, 0.1, 0.1, 0.1, 0., 0., 0., 0.)]]) D.orbital_momentum("atom") D.orbital_momentum("orbital")
def test_spin_rotate_so(self, setup): bond = 1.42 sq3h = 3.**.5 * 0.5 sc = SuperCell(np.array([[1.5, sq3h, 0.], [1.5, -sq3h, 0.], [0., 0., 10.]], np.float64) * bond, nsc=[3, 3, 1]) orb = AtomicOrbital('px', R=bond * 1.001) C = Atom(6, orb) g = Geometry(np.array([[0., 0., 0.], [1., 0., 0.]], np.float64) * bond, atoms=C, sc=sc) D = DensityMatrix(g, spin=Spin('SO')) D.construct([[0.1, bond + 0.01], [(1., 0.5, 0.01, 0.01, 0.01, 0.01, 0.2, 0.2), (0.1, 0.2, 0.1, 0.1, 0., 0.1, 0.2, 0.3)]]) D_mull = D.mulliken() d = D.spin_rotate([45, 60, 90], rad=False) d_mull = d.mulliken() assert not np.allclose(D_mull, d_mull) assert np.allclose(D_mull[:, 0], d_mull[:, 0])
def test_spin_align_pol(self, setup): bond = 1.42 sq3h = 3.**.5 * 0.5 sc = SuperCell(np.array([[1.5, sq3h, 0.], [1.5, -sq3h, 0.], [0., 0., 10.]], np.float64) * bond, nsc=[3, 3, 1]) orb = AtomicOrbital('px', R=bond * 1.001) C = Atom(6, orb) g = Geometry(np.array([[0., 0., 0.], [1., 0., 0.]], np.float64) * bond, atoms=C, sc=sc) D = DensityMatrix(g, spin=Spin('p')) D.construct([[0.1, bond + 0.01], [(1., 0.5), (0.1, 0.2)]]) D_mull = D.mulliken() v = np.array([1, 2, 3]) d = D.spin_align(v) d_mull = d.mulliken() assert D_mull.shape == (len(D), 2) assert d_mull.shape == (len(D), 4) assert not np.allclose(-np.diff(D_mull, axis=1), d_mull[:, 3]) assert np.allclose(D_mull.sum(1), d_mull[:, 0])
def test_spin_align_nc(self, setup): bond = 1.42 sq3h = 3.**.5 * 0.5 sc = SuperCell(np.array( [[1.5, sq3h, 0.], [1.5, -sq3h, 0.], [0., 0., 10.]], np.float64) * bond, nsc=[3, 3, 1]) orb = AtomicOrbital('px', R=bond * 1.001) C = Atom(6, orb) g = Geometry(np.array([[0., 0., 0.], [1., 0., 0.]], np.float64) * bond, atom=C, sc=sc) D = DensityMatrix(g, spin=Spin('nc')) D.construct([[0.1, bond + 0.01], [(1., 0.5, 0.01, 0.01), (0.1, 0.2, 0.1, 0.1)]]) D_mull = D.mulliken() v = np.array([1, 2, 3]) d = D.spin_align(v) d_mull = d.mulliken() assert not np.allclose(D_mull, d_mull) assert np.allclose(D_mull[:, 0], d_mull[:, 0])
def read_basis(self, atoms=None): """ Returns a set of atoms corresponding to the basis-sets in the ORB_INDX file The specie names have a short field in the ORB_INDX file, hence the name may not necessarily be the same as provided in the species block Parameters ---------- atoms : Atoms, optional list of atoms used for the species index """ # First line contains no no_s line = self.readline().split() no = int(line[0]) self.readline() self.readline() pt = PeriodicTable() def crt_atom(i_s, spec, orbs): if atoms is None: # The user has not specified an atomic basis i = pt.Z(spec) if isinstance(i, int): return Atom(i, orbs) else: return Atom(-1, orbs, tag=spec) # Get the atom and add the orbitals return atoms[i_s].copy(orbitals=orbs) # Now we begin by reading the atoms atom = [] orbs = [] specs = [] ia = 1 for _ in range(no): line = self.readline().split() i_a = int(line[1]) if i_a != ia: if i_s not in specs: atom.append(crt_atom(i_s, spec, orbs)) specs.append(i_s) ia = i_a orbs = [] i_s = int(line[2]) - 1 if i_s in specs: continue spec = line[3] nlmz = list(map(int, line[5:9])) P = line[9] == 'T' rc = float(line[11]) * Bohr2Ang # Create the orbital o = AtomicOrbital(n=nlmz[0], l=nlmz[1], m=nlmz[2], zeta=nlmz[3], P=P, R=rc) orbs.append(o) if i_s not in specs: atom.append(crt_atom(i_s, spec, orbs)) specs.append(i_s) # Now re-arrange the atoms and create the Atoms object return Atoms([atom[i] for i in specs])