def __init__(self, atoms, basis=None): self.atomtypes = mole.atom_types(atoms, basis) # fake systems, which treates the atoms of different basis as different atoms. # the fake systems do not have the same symmetry as the potential # it's only used to determine the main (Z-)axis chg1 = numpy.pi - 2 coords = [] fake_chgs = [] idx = [] for k, lst in self.atomtypes.items(): idx.append(lst) coords.append([atoms[i][1] for i in lst]) ksymb = mole._rm_digit(k) if ksymb != k or ksymb == 'GHOST': fake_chgs.append([chg1] * len(lst)) chg1 *= numpy.pi-2 else: fake_chgs.append([mole._charge(ksymb)] * len(lst)) coords = numpy.array(numpy.vstack(coords), dtype=float) fake_chgs = numpy.hstack(fake_chgs) self.charge_center = numpy.einsum('i,ij->j', fake_chgs, coords)/fake_chgs.sum() coords = coords - self.charge_center self.im = numpy.einsum('i,ij,ik->jk', fake_chgs, coords, coords)/fake_chgs.sum() idx = numpy.argsort(numpy.hstack(idx)) self.atoms = numpy.hstack((fake_chgs.reshape(-1,1), coords))[idx]
def format_basis(basis_tab): """Convert the input :attr:`Cell.basis` to the internal data format. ``{ atom: (l, kappa, ((-exp, c_1, c_2, ..), nprim, nctr, ptr-exps, ptr-contraction-coeff)), ... }`` Args: basis_tab : list Similar to :attr:`Cell.basis`, it **cannot** be a str Returns: Formated :attr:`~Cell.basis` Examples: >>> pbc.format_basis({'H':'gth-szv'}) {'H': [[0, (8.3744350009, -0.0283380461), (1.8058681460, -0.1333810052), (0.4852528328, -0.3995676063), (0.1658236932, -0.5531027541)]]} """ fmt_basis = {} for atom in basis_tab.keys(): symb = _symbol(atom) rawsymb = _rm_digit(symb) stdsymb = _std_symbol(rawsymb) symb = symb.replace(rawsymb, stdsymb) if isinstance(basis_tab[atom], str): fmt_basis[symb] = basis.load(basis_tab[atom], stdsymb) else: fmt_basis[symb] = basis_tab[atom] return fmt_basis
def __init__(self, atoms, basis=None): self.atomtypes = mole.atom_types(atoms, basis) # fake systems, which treates the atoms of different basis as different atoms. # the fake systems do not have the same symmetry as the potential # it's only used to determine the main (Z-)axis chg1 = numpy.pi - 2 coords = [] fake_chgs = [] idx = [] for k, lst in self.atomtypes.items(): idx.append(lst) coords.append([atoms[i][1] for i in lst]) ksymb = mole._rm_digit(k) if ksymb != k or ksymb == 'GHOST': # Put random charges on the decorated atoms fake_chgs.append([chg1] * len(lst)) chg1 *= numpy.pi-2 else: fake_chgs.append([mole._charge(ksymb)] * len(lst)) coords = numpy.array(numpy.vstack(coords), dtype=float) fake_chgs = numpy.hstack(fake_chgs) self.charge_center = numpy.einsum('i,ij->j', fake_chgs, coords)/fake_chgs.sum() coords = coords - self.charge_center self.im = numpy.einsum('i,ij,ik->jk', fake_chgs, coords, coords)/fake_chgs.sum() idx = numpy.argsort(numpy.hstack(idx)) self.atoms = numpy.hstack((fake_chgs.reshape(-1,1), coords))[idx]
def _basis_offset_for_atoms(atoms, basis_tab): basoff = [0] n = 0 for at in atoms: symb = mole._symbol(at[0]) if symb in basis_tab: bas0 = basis_tab[symb] else: bas0 = basis_tab[mole._rm_digit(symb)] for b in bas0: angl = b[0] n += _num_contract(b) * (angl * 2 + 1) basoff.append(n) return n, basoff
def __init__(self, atoms, basis=None): self.atomtypes = mole.atom_types(atoms, basis) # fake systems, which treates the atoms of different basis as different atoms. # the fake systems do not have the same symmetry as the potential # it's only used to determine the main (Z-)axis chg1 = numpy.pi - 2 coords = [] fake_chgs = [] idx = [] for k, lst in self.atomtypes.items(): idx.append(lst) coords.append([atoms[i][1] for i in lst]) ksymb = mole._rm_digit(k) if ksymb != k: # Put random charges on the decorated atoms fake_chgs.append([chg1] * len(lst)) chg1 *= numpy.pi - 2 elif mole.is_ghost_atom(k): if ksymb == 'X' or ksymb.upper() == 'GHOST': fake_chgs.append([.3] * len(lst)) elif ksymb[0] == 'X': fake_chgs.append([mole.charge(ksymb[1:]) + .3] * len(lst)) elif ksymb[:5] == 'GHOST': fake_chgs.append([mole.charge(ksymb[5:]) + .3] * len(lst)) else: fake_chgs.append([mole.charge(ksymb)] * len(lst)) coords = numpy.array(numpy.vstack(coords), dtype=float) fake_chgs = numpy.hstack(fake_chgs) self.charge_center = numpy.einsum('i,ij->j', fake_chgs, coords) / fake_chgs.sum() coords = coords - self.charge_center idx = numpy.argsort(numpy.hstack(idx)) self.atoms = numpy.hstack((fake_chgs.reshape(-1, 1), coords))[idx] self.group_atoms_by_distance = [] decimals = int(-numpy.log10(TOLERANCE)) - 1 for index in self.atomtypes.values(): index = numpy.asarray(index) c = self.atoms[index, 1:] dists = numpy.around(norm(c, axis=1), decimals) u, idx = numpy.unique(dists, return_inverse=True) for i, s in enumerate(u): self.group_atoms_by_distance.append(index[idx == i])
def __init__(self, atoms, basis=None): self.atomtypes = mole.atom_types(atoms, basis) # fake systems, which treates the atoms of different basis as different atoms. # the fake systems do not have the same symmetry as the potential # it's only used to determine the main (Z-)axis chg1 = numpy.pi - 2 coords = [] fake_chgs = [] idx = [] for k, lst in self.atomtypes.items(): idx.append(lst) coords.append([atoms[i][1] for i in lst]) ksymb = mole._rm_digit(k) if ksymb != k: # Put random charges on the decorated atoms fake_chgs.append([chg1] * len(lst)) chg1 *= numpy.pi-2 elif mole.is_ghost_atom(k): if ksymb == 'X' or ksymb.upper() == 'GHOST': fake_chgs.append([.3] * len(lst)) elif ksymb[0] == 'X': fake_chgs.append([mole.charge(ksymb[1:])+.3] * len(lst)) elif ksymb[:5] == 'GHOST': fake_chgs.append([mole.charge(ksymb[5:])+.3] * len(lst)) else: fake_chgs.append([mole.charge(ksymb)] * len(lst)) coords = numpy.array(numpy.vstack(coords), dtype=float) fake_chgs = numpy.hstack(fake_chgs) self.charge_center = numpy.einsum('i,ij->j', fake_chgs, coords)/fake_chgs.sum() coords = coords - self.charge_center idx = numpy.argsort(numpy.hstack(idx)) self.atoms = numpy.hstack((fake_chgs.reshape(-1,1), coords))[idx] self.group_atoms_by_distance = [] decimals = int(-numpy.log10(TOLERANCE)) - 1 for index in self.atomtypes.values(): index = numpy.asarray(index) c = self.atoms[index,1:] dists = numpy.around(norm(c, axis=1), decimals) u, idx = numpy.unique(dists, return_inverse=True) for i, s in enumerate(u): self.group_atoms_by_distance.append(index[idx == i])
def format_pseudo(pseudo_tab): r'''Convert the input :attr:`Cell.pseudo` (dict) to the internal data format:: { atom: ( (nelec_s, nele_p, nelec_d, ...), rloc, nexp, (cexp_1, cexp_2, ..., cexp_nexp), nproj_types, (r1, nproj1, ( (hproj1[1,1], hproj1[1,2], ..., hproj1[1,nproj1]), (hproj1[2,1], hproj1[2,2], ..., hproj1[2,nproj1]), ... (hproj1[nproj1,1], hproj1[nproj1,2], ... ) )), (r2, nproj2, ( (hproj2[1,1], hproj2[1,2], ..., hproj2[1,nproj1]), ... ) ) ) ... } Args: pseudo_tab : dict Similar to :attr:`Cell.pseudo` (a dict), it **cannot** be a str Returns: Formatted :attr:`~Cell.pseudo` Examples: >>> pbc.format_pseudo({'H':'gth-blyp', 'He': 'gth-pade'}) {'H': [[1], 0.2, 2, [-4.19596147, 0.73049821], 0], 'He': [[2], 0.2, 2, [-9.1120234, 1.69836797], 0]} ''' fmt_pseudo = {} for atom in pseudo_tab: symb = _symbol(atom) rawsymb = _rm_digit(symb) stdsymb = _std_symbol(rawsymb) symb = symb.replace(rawsymb, stdsymb) if isinstance(pseudo_tab[atom], str): fmt_pseudo[symb] = pseudo.load(pseudo_tab[atom], stdsymb) else: fmt_pseudo[symb] = pseudo_tab[atom] return fmt_pseudo
def format_pseudo(pseudo_tab): '''Convert the input :attr:`Cell.pseudo` (dict) to the internal data format. ``{ atom: ( (nelec_s, nele_p, nelec_d, ...), rloc, nexp, (cexp_1, cexp_2, ..., cexp_nexp), nproj_types, (r1, nproj1, ( (hproj1[1,1], hproj1[1,2], ..., hproj1[1,nproj1]), (hproj1[2,1], hproj1[2,2], ..., hproj1[2,nproj1]), ... (hproj1[nproj1,1], hproj1[nproj1,2], ... ) )), (r2, nproj2, ( (hproj2[1,1], hproj2[1,2], ..., hproj2[1,nproj1]), ... ) ) ) ... }`` Args: pseudo_tab : dict Similar to :attr:`Cell.pseudo` (a dict), it **cannot** be a str Returns: Formatted :attr:`~Cell.pseudo` Examples: >>> pbc.format_pseudo({'H':'gth-blyp', 'He': 'gth-pade'}) {'H': [[1], 0.2, 2, [-4.19596147, 0.73049821], 0], 'He': [[2], 0.2, 2, [-9.1120234, 1.69836797], 0]} ''' fmt_pseudo = {} for atom in pseudo_tab.keys(): symb = _symbol(atom) rawsymb = _rm_digit(symb) stdsymb = _std_symbol(rawsymb) symb = symb.replace(rawsymb, stdsymb) if isinstance(pseudo_tab[atom], str): fmt_pseudo[symb] = pseudo.load(pseudo_tab[atom], stdsymb) else: fmt_pseudo[symb] = pseudo_tab[atom] return fmt_pseudo