Source code for pytherm.activity.db.unifac.io
import os
path = os.path.abspath(__file__)[:-5:]
[docs]
class Substance:
"""Class for unifac substance using Group
"""
def __init__(self, concentration, groups):
if concentration != None:
self.x = float(concentration)
self.groups = groups # словарь {Имя группы : кол-во}
[docs]
class Group:
"""Class for unifac single group
"""
def __init__(self, id: int, r: float, q: float):
"""
Args:
id (int): group id in parameter table
r (float): volume parameter
q (float): surface parameter
"""
self.id = int(id)
self.R = float(r)
self.Q = float(q)
[docs]
def get_interactions(unifac_mode: str) -> list:
"""Gets interaction parameters from unifac_mode file
Args:
unifac_mode (str): unifac parameters (VLE, LLE etc.)
Returns:
list: a(i, j) interaction matrix
"""
df = open(path + unifac_mode + "\\2t.csv")
n = int(df.readline()[:-1].split(";")[0])
table = []
for i in range(n):
a = []
for j in range(n):
a.append("-")
table.append(a)
buf = []
for line in df:
buf.append(line[:-1:].split(";"))
for i in buf[1::]:
table[int(i[0]) - 1][int(i[1]) - 1] = [float(i[2]),
float(i[3]), float(i[4])]
for i in range(n):
table[i][i] = [0, 0, 0]
return table
[docs]
def get_groups(unifac_mode: str) -> dict[str, Group]:
"""Create dictionary with Group from unifac_mode file
Args:
unifac_mode (str): unifac parameters(VLE, LLE etc.)
Returns:
dict: {gr name: Group}
"""
df = open(path + unifac_mode + "\\1t.csv")
buf = []
for line in df:
buf.append(line.split(";"))
df.close()
data = {}
for i in range(1, len(buf)):
data[buf[i][1]] = Group(buf[i][0], buf[i][2], buf[i][3])
return data
[docs]
def get_tsubs(unifac_mode: str, substance_source: str) -> dict:
"""
Args:
unifac_mode (str): unifac parameters (VLE, LLE etc.)
substance_source (str): source for substance group
('general' for sub from db, 'unifac' for for sub from mode\db)
Returns:
dict: {substance name: [Group, count]}
"""
data = {}
if substance_source == "general":
df = open(path + "\\sub.csv")
else:
df = open(path + "\\" + unifac_mode + "\\sub.csv")
buf = []
for line in df:
buf.append(line.split(":"))
for i in range(len(buf)):
buf[i][1] = buf[i][1].replace("\n", "")
buf[i][1] = buf[i][1][1::]
for i in buf:
b = i[1].split(" ")
a = []
for j in b:
a.append([j.split("*")[1], float(j.split("*")[0])]) #int -> float
data[i[0]] = a
return data
[docs]
def create_phase(inp: dict,
unifac_mode: str,
substance_source: str) -> dict[str, Substance]:
"""Create phase dict for Unifac
Args:
inp (dict): {substance_name: concentration} dictionary
unifac_mode (str): unifac parameters(VLE, LLE etc.)
substance_source (str): source for substance group
('general' for sub from db, 'unifac' for for sub from mode\db)
Returns:
dict[str, Substance]: dict for Unifac calculation
"""
phase = {}
tsubs = get_tsubs(unifac_mode, substance_source) # словарь веществ - групп
for s in inp:
gr = {}
for i in tsubs[s]:
gr[i[0]] = i[1]
phase[s] = Substance(0, gr)
return phase