import numpy as np
[docs]class ReadPotInpt():
[docs] def __init__(self, filename):
self.rankmax = 5
with open(filename) as f:
self.lines = f.readlines()
self.ranks = self.make_ranks()
[docs] def make_ranks(self):
config = self.lines[:13]
base = self.lines[13:]
r = self.get_params(config, self.rankmax)
r_lines = self.r_data_split(base, r)
rnks = [Rank(r_lines, i+1) for i in range(self.rankmax)]
return rnks
[docs] def get_params(self, data, rmax=6):
ranks = []
for r in range(rmax):
ranks.append(int(data[7+r].split()[1]))
return ranks
[docs] def r_data_split(self, data, r_size):
r_data = []
ind1 = 0
for i,s in enumerate(r_size):
mul = 2 if i < 3 else 3
start = 1 if mul==2 else 2
ind2 = ind1 + s*mul
slc = [list(map(int, l.split())) for l in data[ind1:ind2][start::mul]]
ind1 = ind2
r_data.append(slc)
return r_data
[docs]class Rank():
[docs] def __init__(self, rank_data, rank):
self.rank = rank
self._set_params(rank_data[rank-1])
def _set_params(self, data):
if self.rank == 1:
self.ns = data
self.ls = None
self.LS = None
elif self.rank == 2:
self.ns = [d[:2] for d in data]
self.ls = [d[2:]*2 for d in data]
self.LS = None
elif self.rank == 3:
self.ns = [d[:3] for d in data]
self.ls = [d[3:] for d in data]
self.LS = [d[-1:] for d in data]
elif self.rank == 4:
self.ns = [d[:4] for d in data]
self.ls = [d[4:-1] for d in data]
self.LS = [d[-1:] for d in data]
elif self.rank == 5:
self.ns = [d[:5] for d in data]
self.ls = [d[5:-2] for d in data]
self.LS = [d[-2:] for d in data]
[docs] def apply_constrains(self, nmax=2, lmax=0):
ns = np.array(self.ns)
cond = np.all(ns <= nmax, axis=1)# & (np.array(self.ls) <= lmax)
cond2 = np.ones_like(cond)
if self.ls is not None:
ls = np.array(self.ls)
cond2 = np.all(ls <= lmax, axis=1)
mask = np.logical_and(cond, cond2)
self.ns = list(map(list, ns[mask]))
if self.ls is not None:
self.ls = list(map(list, ls[mask]))
if self.LS is not None:
self.LS = list(map(list, np.array(self.LS)[mask]))
if __name__ == "__main__":
name = 'bace.in'
cfn = ReadPotInpt(name)
#print(cfn.ranks[0].ns)
cfn.ranks[1].apply_constrains(nmax=2, lmax=0)
print(cfn.ranks[1].ls)