summaryrefslogtreecommitdiff
path: root/OMChem/Flowsheet.py
diff options
context:
space:
mode:
Diffstat (limited to 'OMChem/Flowsheet.py')
-rw-r--r--OMChem/Flowsheet.py306
1 files changed, 306 insertions, 0 deletions
diff --git a/OMChem/Flowsheet.py b/OMChem/Flowsheet.py
new file mode 100644
index 0000000..2e7b098
--- /dev/null
+++ b/OMChem/Flowsheet.py
@@ -0,0 +1,306 @@
+import os
+import csv
+from subprocess import Popen, PIPE
+import pandas as pd
+
+class Flowsheet():
+ def __init__(self):
+ self.sim_name = 'Simulator'
+ self.sim_method = ''
+ self.unit_operations = []
+ self.data = []
+ self.compounds = []
+ self.interface = ''
+ self.omc_path = None
+ self.root_dir = os.getcwd() # Chemical-Simulator-GUI
+ self.sim_dir_path = os.path.join(self.root_dir, self.sim_name) # Chemical-Simulator-GUI/Simulator
+ self.Flomo_path = os.path.join(self.sim_dir_path,'Flowsheet.mo')
+ self.eqn_mos_path = os.path.join(self.sim_dir_path,'simulateEQN.mos')
+ self.sm_mos_path = os.path.join(self.sim_dir_path,'simulateSM.mos')
+ self.result_data = []
+ self.stdout=None
+ self.stderr=None
+
+ def get_omc_path(self,msg):
+ try:
+ self.omhome = os.environ.get('OPENMODELICAHOME')
+ if self.omhome is None:
+ self.omhome = os.path.split(os.path.split(os.path.realpath(spawn.find_executable("omc")))[0])[0]
+ elif os.path.exists('/opt/local/bin/omc'):
+ self.omhome = '/opt/local'
+ elif os.path.exists('/usr/bin/omc'):
+ self.omhome = '/usr'
+ return os.path.join(self.omhome, 'bin', 'omc')
+ except BaseException:
+ msg.parent().parent().parent().container.disableInterfaceforSimulation(False)
+ msg.append("<span style=\"color:red\"><b>Installation Error : </b>The OpenModelica compiler is missing in the System path please install it.</span>")
+ print("The OpenModelica compiler is missing in the System path please install it" )
+ raise
+
+ def add_unit_operations(self,unitop):
+ self.unit_operations.append(unitop)
+
+ def remove_unit_operations(self,unitop):
+ self.unit_operations.remove(unitop)
+
+ def add_compound_list(self,C):
+ self.compounds = C
+
+ def send_for_simulation_Eqn(self,msg):
+ self.result_data = []
+ self.omc_path = self.get_omc_path(msg)
+ #print(self.omc_path)
+
+ if self.sim_method == 'Eqn':
+ simpath = self.eqn_mos_path
+ os.chdir(self.sim_dir_path)
+
+ self.process = Popen([self.omc_path, '-s',simpath], stdout=PIPE, stderr=PIPE)
+ self.stdout, self.stderr = self.process.communicate()
+
+ os.chdir(self.root_dir)
+ if ('timeSimulation = 0.0,\n' in self.stdout.decode("utf-8")):
+ self.result_data = []
+ else:
+ csvpath = os.path.join(self.sim_dir_path,'Flowsheet_res.csv')
+ with open (csvpath,'r') as resultFile:
+ self.result_data = []
+ csvreader = csv.reader(resultFile,delimiter=',')
+ for row in csvreader:
+ self.result_data.append(row)
+
+ def send_for_simulation_SM(self,unitop):
+ self.result_data = []
+ self.omc_path = self.get_omc_path()
+ os.chdir(self.sim_dir_path)
+ self.process = Popen([self.omc_path, '-s',unitop.name,'.mos'], stdout=PIPE, stderr=PIPE)
+ stdout, stderr = self.process.communicate()
+ # print("############### StdOut ################")
+ # print(stdout)
+ self.result_data = []
+ #print('Simulating '+unitop.name+'...')
+ csvpath = os.path.join(self.sim_dir_path,unitop.name+'_res.csv')
+ with open(csvpath,'r') as resultFile:
+ csvreader = csv.reader(resultFile,delimiter=',')
+ for row in csvreader:
+ self.result_data.append(row)
+ self.ext_data()
+
+ def ext_data(self):
+ for unit in self.unit_operations:
+ if unit[0].type == 'MaterialStream':
+ for key, value in unit[0].Prop.items():
+ property_name = unit[0].name + '.' + key
+ if property_name in self.result_data[0]:
+ ind = self.result_data[0].index(property_name)
+ resultval = str(self.result_data[-1][ind])
+ unit[0].Prop[key] = resultval
+
+ def simulate_EQN(self,msg):
+ self.data = []
+ self.sim_method = 'Eqn'
+ self.data.append("model Flowsheet\n")
+
+ tempCompounds = self.compounds
+ for c in tempCompounds:
+ CompName = c
+ CompName = CompName.replace(" ", "")
+ CompName = CompName.replace("-", "")
+ CompName = CompName.replace(",", "")
+ CompName = CompName.replace("1", "One")
+ CompName = CompName.replace("2", "Two")
+ CompName = CompName.replace("3", "Three")
+ CompName = CompName.replace("4", "Four")
+ CompName = CompName.replace("5", "Five")
+ self.data.append("parameter database." + CompName +' '+ CompName + "; \n")
+ tempCompounds[tempCompounds.index(c)] = CompName
+
+ self.data.append("parameter Integer Nc = " + str(len(tempCompounds)) + ";\n")
+ self.data.append("parameter Simulator.Files.ChemsepDatabase.GeneralProperties C[Nc] = {" +
+ str(tempCompounds).strip('[').strip(']').replace("'", "") + "};\n")
+
+ for unitop in self.unit_operations:
+ if unitop.type != 'MaterialStream':
+ self.data.append(unitop.OM_Flowsheet_Initialize())
+ else:
+ self.data.append(unitop.OM_Flowsheet_Initialize(self.compounds))
+
+ self.data.append("equation\n")
+
+ self.outlist = []
+ self.stm = ['MaterialStream','EngStm']
+ for unitop in self.unit_operations:
+ if unitop.type not in self.stm:
+ for j in unitop.output_stms.values():
+ self.outlist.append(j)
+
+ for unitop in self.unit_operations:
+ if unitop not in self.outlist:
+ if unitop.type == 'MaterialStream':
+ self.data.append(unitop.OM_Flowsheet_Equation(self.compounds,'Eqn'))
+ else:
+ self.data.append(unitop.OM_Flowsheet_Equation())
+ else:
+ pass
+ with open(self.Flomo_path, 'w') as txtfile:
+ for d in self.data:
+ txtfile.write(str(d))
+ txtfile.write('end Flowsheet;\n')
+ #print(self.eqn_mos_path)
+ with open(self.eqn_mos_path, 'w') as mosFile:
+ mosFile.write('loadModel(Modelica);\n')
+ mosFile.write('loadFile(\"Simulator/package.mo\");\n')
+ mosFile.write('loadFile(\"database.mo\");\n')
+ mosFile.write('loadFile(\"Flowsheet.mo\");\n')
+ mosFile.write('simulate(Flowsheet, outputFormat=\"csv\", stopTime=1.0, numberOfIntervals=1);\n')
+
+ #print('Initiating Simulation in Equation Oriented Mode')
+
+ self.send_for_simulation_Eqn(msg)
+
+ def simulate_SM(self,ip,op):
+ self.sim_method = 'SM'
+ self.data = []
+ self.result_data = []
+ self.unit = []
+ self.csvlist = []
+
+ for i in ip:
+ common = ip[i]
+
+ for k,v in op.items():
+ if(set(v) & set(common)):
+ if((i in self.unit) and (k in self.unit)):
+ pass
+ elif(i in self.unit):
+ self.unit.insert(self.unit.index(i),k)
+ elif(k in self.unit):
+ self.unit.append(i)
+ else:
+ self.unit.append(k)
+ self.unit.append(i)
+
+ for unitop in self.unit:
+ os.chdir(self.root_dir)
+ self.data = []
+ if unitop.type not in ['MaterialStream','EngStm']:
+ inpstms = unitop.input_stms
+ outstms = unitop.output_stms
+
+ try:
+ engstms = unitop.EngStms
+ except:
+ engstms = None
+
+ self.data.append("model "+unitop.name.lower()+'\n')
+
+ for c in self.compounds:
+ c = c.title()
+ lcase = c.lower()
+ self.data.append("parameter Simulator.Files.Chemsep_Database." + c +' '+ c + "; \n")
+
+ self.data.append(unitop.OM_Flowsheet_Initialize())
+
+ if type(outstms) is list:
+ for stm in outstms:
+ self.data.append(stm.OM_Flowsheet_Initialize())
+ else:
+ self.data.append(outstms.OM_Flowsheet_Initialize())
+
+ if engstms:
+ self.data.append(engstms.OM_Flowsheet_Initialize())
+
+ if type(inpstms) is list:
+ for stm in inpstms:
+ self.data.append(stm.OM_Flowsheet_Initialize())
+ else:
+ self.data.append(inpstms.OM_Flowsheet_Initialize())
+
+ self.data.append('equation\n')
+ self.data.append(unitop.OM_Flowsheet_Equation())
+
+ if type(inpstms) is list:
+ for stm in inpstms:
+ self.data.append(stm.OM_Flowsheet_Equation())
+ else:
+ self.data.append(inpstms.OM_Flowsheet_Equation())
+
+ unitmofile = os.path.join(self.sim_dir_path,unitop.name.lower()+'.mo')
+
+ with open(unitmofile,'w') as unitFile:
+ for d in self.data:
+ unitFile.write(d)
+ unitFile.write('end '+unitop.name.lower()+';\n')
+
+ unitmosfile = os.path.join(self.sim_dir_path,unitop.name.lower()+'.mos')
+ with open(unitmosfile, 'w') as mosFile:
+ mosFile.write('loadModel(Modelica);\n')
+ mosFile.write("loadFile(\"Simulator\package.mo\");\n")
+
+ mosFile.write("loadFile(\""+unitop.name.lower()+".mo\");\n")
+ mosFile.write("simulate("+unitop.name.lower()+", outputFormat=\"csv\", stopTime=1.0, numberOfIntervals=1);\n")
+
+ #print("Initiating simulation in Sequential Modular Mode")
+ self.omc_path = self.get_omc_path()
+ os.chdir(self.sim_dir_path)
+ sim = os.path.join(self.sim_dir_path,unitop.name.lower()+'.mos')
+ self.process = Popen([self.omc_path, '-s',sim], stdout=PIPE, stderr=PIPE)
+ self.stdout, self.stderr = self.process.communicate()
+ os.chdir(self.root_dir)
+
+ # print("############### StdOut ################")
+ # print(self.stdout)
+ # print("############### StdErr ################")
+ # print(self.stderr)
+ # print('Simulating '+unitop.name.lower()+'...')
+ csvpath = os.path.join(self.sim_dir_path,unitop.name.lower()+'_res.csv')
+
+ self.csvlist.append(csvpath)
+
+ with open(csvpath,'r') as resultFile:
+ csvreader = csv.reader(resultFile,delimiter=',')
+ for row in csvreader:
+ self.result_data.append(row)
+
+ os.chdir(self.root_dir)
+ if type(inpstms) is list:
+ for stm in inpstms:
+ for key,value in stm.Prop.items():
+ property_name = stm.name + '.' + key
+ if property_name in self.result_data[0]:
+ ind = self.result_data[0].index(property_name)
+ resultval = str(self.result_data[-1][ind])
+ stm.Prop[key] = resultval
+ else:
+ for key, value in inpstms.Prop.items():
+ property_name = inpstms.name + '.' + key
+ if property_name in self.result_data[0]:
+ ind = self.result_data[0].index(property_name)
+ resultval = str(self.result_data[-1][ind])
+ inpstms.Prop[key] = resultval
+
+ if type(outstms) is list:
+ for stm in outstms:
+ for key, value in stm.Prop.items():
+ property_name = stm.name + '.' + key
+ if property_name in self.result_data[0]:
+ ind = self.result_data[0].index(property_name)
+ resultval = str(self.result_data[-1][ind])
+ stm.Prop[key] = resultval
+ else:
+ for key, value in outstms.Prop.items():
+ property_name = outstms.name + '.' + key
+ if property_name in self.result_data[0]:
+ ind = self.result_data[0].index(property_name)
+ resultval = str(self.result_data[-1][ind])
+ outstms.Prop[key] = resultval
+
+ self.dataframes = [pd.read_csv(i) for i in self.csvlist]
+ os.chdir(self.sim_dir_path)
+ dffinal = pd.concat(self.dataframes,axis=1)
+ dffinal.to_csv('FlowsheetSEQ.csv',index=False)
+ self.result_data.clear()
+ with open(os.path.join(self.sim_dir_path+'/FlowsheetSEQ.csv'),'r') as resultFile:
+ csvreader = csv.reader(resultFile,delimiter=',')
+ for row in csvreader:
+ self.result_data.append(row)