def parse_ecp(string, symb=None): if symb is not None: symb = _std_symbol(symb) raw_data = string.splitlines() for i, dat in enumerate(raw_data): dat0 = dat.split(None, 1) if dat0 and dat0[0] == symb: break if i + 1 == len(raw_data): raise KeyError('ECP not found for %s' % symb) seg = [] for dat in raw_data[i:]: dat = dat.strip().upper() if dat: # remove empty lines if ((dat[0].isalpha() and dat.split(None, 1)[0] != symb.upper())): break else: seg.append(dat) else: seg = string.splitlines() ecptxt = [] for dat in seg: x = dat.split('#')[0].strip().upper() if (x and not x.startswith('END') and not x.startswith('ECP')): ecptxt.append(x) return _parse_ecp(ecptxt)
def convert_basis_to_nwchem(symb, basis): '''Convert the internal basis format to NWChem format string''' res = [] symb = _std_symbol(symb) # pass 1: comment line ls = [b[0] for b in basis] nprims = [len(b[1:]) for b in basis] nctrs = [len(b[1]) - 1 for b in basis] prim_to_ctr = {} for i, l in enumerate(ls): if l in prim_to_ctr: prim_to_ctr[l][0] += nprims[i] prim_to_ctr[l][1] += nctrs[i] else: prim_to_ctr[l] = [nprims[i], nctrs[i]] nprims = [] nctrs = [] for l in set(ls): nprims.append(str(prim_to_ctr[l][0]) + SPDF[l].lower()) nctrs.append(str(prim_to_ctr[l][1]) + SPDF[l].lower()) res.append('#BASIS SET: (%s) -> [%s]' % (','.join(nprims), ','.join(nctrs))) # pass 2: basis data for bas in basis: res.append('%-2s %s' % (symb, SPDF[bas[0]])) for dat in bas[1:]: res.append(' '.join('%15.9f' % x for x in dat)) return '\n'.join(res)
def search_seg(basisfile, symb): symb = _std_symbol(symb) with open(basisfile, 'r') as fin: fdata = re.split(BASIS_SET_DELIMITER, fin.read()) dat = _search_seg(fdata, symb) if dat is None: return [] else: return [x.upper() for x in dat.splitlines() if x and 'END' not in x]
def parse(string, symb=None, optimize=True): '''Parse the basis text which is in NWChem format. Return an internal basis format which can be assigned to attribute :attr:`Mole.basis` Empty lines, or the lines started with #, or the lines of "BASIS SET" and "END" will be ignored are ignored. Args: string : A string in NWChem basis format. Empty links and the lines of "BASIS SET" and "END" will be ignored Kwargs: optimize : Optimize basis contraction. Convert the segment contracted basis to the general contracted basis. Examples: >>> mol = gto.Mole() >>> mol.basis = {'O': gto.basis.parse(""" ... #BASIS SET: (6s,3p) -> [2s,1p] ... C S ... 71.6168370 0.15432897 ... 13.0450960 0.53532814 ... 3.5305122 0.44463454 ... C SP ... 2.9412494 -0.09996723 0.15591627 ... 0.6834831 0.39951283 0.60768372 ... 0.2222899 0.70011547 0.39195739 ... """)} >>> gto.basis.parse(""" ... He S ... 13.6267000 0.1752300 ... 1.9993500 0.8934830 ... 0.3829930 0.0000000 ... He S ... 13.6267000 0.0000000 ... 1.9993500 0.0000000 ... 0.3829930 1.0000000 ... """, optimize=True) [[0, [13.6267, 0.17523, 0.0], [1.99935, 0.893483, 0.0], [0.382993, 0.0, 1.0]]] ''' if symb is not None: symb = _std_symbol(symb) string = _search_basis_block(re.split(BASIS_SET_DELIMITER, string), symb) if not string: raise BasisNotFoundError('Basis not found for %s' % symb) raw_basis = [] for dat in string.splitlines(): dat = dat.split('#')[0].strip() # Use # to start comments dat_upper = dat.upper() if (dat and not dat_upper.startswith('END') and not dat_upper.startswith('BASIS')): raw_basis.append(dat) return _parse(raw_basis, optimize)
def convert_ecp_to_nwchem(symb, ecp): '''Convert the internal ecp format to NWChem format string''' symb = _std_symbol(symb) res = ['%-2s nelec %d' % (symb, ecp[0])] for ecp_block in ecp[1]: l = ecp_block[0] if l == -1: res.append('%-2s ul' % symb) else: res.append('%-2s %s' % (symb, SPDF[l].lower())) for r_order, dat in enumerate(ecp_block[1]): for e, c in dat: res.append('%d %15.9f %15.9f' % (r_order, e, c)) return '\n'.join(res)
def parse(string, symb=None, optimize=True): '''Parse the basis text which is in NWChem format. Return an internal basis format which can be assigned to attribute :attr:`Mole.basis` Empty lines, or the lines started with #, or the lines of "BASIS SET" and "END" will be ignored are ignored. Args: string : A string in NWChem basis format. Empty links and the lines of "BASIS SET" and "END" will be ignored Kwargs: optimize : Optimize basis contraction. Convert the segment contracted basis to the general contracted basis. Examples: >>> mol = gto.Mole() >>> mol.basis = {'O': gto.basis.parse(""" ... #BASIS SET: (6s,3p) -> [2s,1p] ... C S ... 71.6168370 0.15432897 ... 13.0450960 0.53532814 ... 3.5305122 0.44463454 ... C SP ... 2.9412494 -0.09996723 0.15591627 ... 0.6834831 0.39951283 0.60768372 ... 0.2222899 0.70011547 0.39195739 ... """)} ''' if symb is not None: symb = _std_symbol(symb) string = _search_seg(re.split(BASIS_SET_DELIMITER, string), symb) if string is None: raise KeyError('Basis not found for %s' % symb) bastxt = [] for dat in string.splitlines(): x = dat.split('#')[0].strip().upper() # Use # to start comments if (x and not x.startswith('END') and not x.startswith('BASIS')): bastxt.append(x) return _parse(bastxt, optimize)
def search_ecp(basisfile, symb): symb = _std_symbol(symb) with open(basisfile, 'r') as fin: fdata = re.split(ECP_DELIMITER, fin.read()) if len(fdata) <= 1: return [] fdata = fdata[1].splitlines() for i, dat in enumerate(fdata): dat0 = dat.split(None, 1) if dat0 and dat0[0] == symb: break seg = [] for dat in fdata[i:]: dat = dat.strip().upper() if dat: # remove empty lines if ((dat[0].isalpha() and dat.split(None, 1)[0] != symb.upper())): return seg else: seg.append(dat) return []
def search_seg(basisfile, symb): symb = _std_symbol(symb) with open(basisfile, 'r') as fin: fdata = re.split(BASIS_SET_DELIMITER, fin.read()) raw_basis = _search_basis_block(fdata, symb) return [x.upper() for x in raw_basis.splitlines() if x and 'END' not in x]