def parse_momatrix(self):
dim = int(self[5])
ndim = dim * dim
found = self.find(_re_orb, _re_occ,
_re_ens, keys_only=True)
skips = found[_re_orb]
start = skips[0]
occs = [i + 1 for i in found[_re_occ]]
ens = [i + 1 for i in found[_re_ens]]
if not found[_re_ens]: ens = False
ncol = len(self[start + 1].split())
cols = 4 if ncol == 1 else ncol
chnk = np.ceil(dim / cols).astype(np.int64)
orbdx = np.repeat(range(dim), chnk)
if len(occs) == 2:
skips.insert(dim, skips[dim] - 1)
orbdx = np.concatenate([orbdx, orbdx])
skips = [i - skips[0] for i in skips]
if ncol == 1:
coefs = pd.read_fwf(StringIO('\n'.join(self[start:occs[0]-2])),
skiprows=skips, header=None, widths=[18]*4)
if ens: ens = self._one_el(ens, chnk, ncol)
else:
coefs = self.pandas_dataframe(start, occs[0]-2, ncol,
**{'skiprows': skips})
if ens:
echnk = np.ceil(dim / len(self[ens[0] + 1].split())).astype(np.int64)
ens = self._one_el(ens, echnk, ncol)
occs = self._one_el(occs, chnk, ncol)
coefs['idx'] = orbdx
coefs = coefs.groupby('idx').apply(pd.DataFrame.stack).drop(
'idx', level=2).values
mo = {'orbital': np.repeat(range(dim), dim), 'frame': 0,
'chi': np.tile(range(dim), dim)}
if ens:
orb = {'frame': 0, 'group': 0}
if len(occs) == 2:
mo['coef'] = coefs[:len(coefs)//2]
mo['coef1'] = coefs[len(coefs)//2:]
self.occupation_vector = {'coef': occs[0], 'coef1': occs[1]}
if ens:
orb['occupation'] = np.concatenate(occs)
orb['energy'] = np.concatenate(ens)
orb['vector'] = np.concatenate([range(dim), range(dim)])
orb['spin'] = np.concatenate([np.zeros(dim), np.ones(dim)])
else:
mo['coef'] = coefs
self.occupation_vector = occs[0]
if ens:
orb['occupation'] = occs[0]
orb['energy'] = ens[0]
orb['vector'] = range(dim)
orb['spin'] = np.zeros(dim)
self.momatrix = pd.DataFrame.from_dict(mo)
if ens:
self.orbital = pd.DataFrame.from_dict(orb)
评论列表
文章目录