0% found this document useful (0 votes)
38 views

Asm

Uploaded by

shabir Ahmad
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
38 views

Asm

Uploaded by

shabir Ahmad
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 5

import constants

from scipy.optimize import fsolve

class ASM1():

def __init__(self, Temp=20, DO=2):

self._temperature = Temp
self._bulk_DO = DO

self._params = {}
self._stoichs = {}
self._delta_t = 20 - self._temperature

self._set_params()

self._set_stoichs()

self._comps = [0] * constants._NUM_ASM1_COMPONENTS

return

def _set_params(self):

self._params['u_H'] = 6 * pow(1.08, self._delta_t)

self._params['b_LH'] = 0.408 * pow(1.04, self._delta_t)

self._params['u_A'] = 0.768 * pow(1.11, self._delta_t)

self._params['b_LA'] = 0.096 * pow(1.04, self._delta_t)

self._params['K_S'] = 20
self._params['K_OH'] = 0.1

self._params['K_OA'] = 0.75

self._params['K_NH'] = 1 * pow(1.14, self._delta_t)

self._params['K_NO'] = 0.2

self._params['k_h'] = 2.208 * pow(1.08, self._delta_t)


self._params['K_X'] = 0.15

self._params['k_a'] = 0.1608 * pow(1.08, self._delta_t)

self._params['Y_H'] = 0.6

self._params['Y_A'] = 0.24

self._params['f_D_'] = 0.08

self._params['cf_h'] = 0.4

self._params['cf_g'] = 0.8

self._params['i_N_XB'] = 0.086

self._params['i_N_XD'] = 0.06

self._stoichs['0_2'] = 1

self._stoichs['0_6'] = -1 / self._params['Y_H']

self._stoichs['0_7'] = -(1 - self._params['Y_H']) / self._params['Y_H']


# multiply -1 to express as oxygen

self._stoichs['0_9'] = -self._params['i_N_XB']

self._stoichs['0_12'] = -self._params['i_N_XB'] / 14

self._stoichs['1_2'] = 1

self._stoichs['1_6'] = -1 / self._params['Y_H']

self._stoichs['1_8'] = -(1 - self._params['Y_H']) \


/ (2.86 * self._params['Y_H'])

self._stoichs['1_9'] = -self._params['i_N_XB']

self._stoichs['1_12'] = (1 - self._params['Y_H']) \
/ (14 * 2.86 * self._params['Y_H']) \
- self._params['i_N_XB'] / 14

self._stoichs['2_3'] = 1

self._stoichs['2_7'] = -(4.57 - self._params['Y_A']) \


/ self._params['Y_A']
# multiply -1 to express as oxygen

self._stoichs['2_8'] = 1 / self._params['Y_A']

self._stoichs['2_9'] = -self._params['i_N_XB'] \
- 1 / self._params['Y_A']

self._stoichs['2_12'] = -self._params['i_N_XB'] / 14 \
- 1 / (7 * self._params['Y_A'])

self._stoichs['3_1'] = 1 - self._params['f_D_']

self._stoichs['3_2'] = -1

self._stoichs['3_4'] = self._params['f_D_']

self._stoichs['3_11'] = self._params['i_N_XB'] - self._params['f_D_'] \


* self._params['i_N_XD']

self._stoichs['4_1'] = 1 - self._params['f_D_']

self._stoichs['4_3'] = -1

self._stoichs['4_4'] = self._params['f_D_']

self._stoichs['4_11'] = self._params['i_N_XB'] - self._params['f_D_'] \


* self._params['i_N_XD']

self._stoichs['5_9'] = 1

self._stoichs['5_10'] = -1

self._stoichs['5_12'] = 1 / 14

self._stoichs['6_1'] = -1

self._stoichs['6_6'] = 1

self._stoichs['7_10'] = 1

self._stoichs['7_11'] = -1

def _rate0_X_I(self):
return 0

def _rate1_X_S(self):
return self._stoichs['3_1'] * self._r3_DLH() \
+ self._stoichs['4_1'] * self._r4_DLA() \
+ self._stoichs['6_1'] * self._r6_HydX()

def _rate2_X_BH(self):
return self._stoichs['0_2'] * self._r0_AerGH() \
+ self._stoichs['1_2'] * self._r1_AxGH() \
+ self._stoichs['3_2'] * self._r3_DLH()

def _rate3_X_BA(self):
return self._stoichs['2_3'] * self._r2_AerGA() \
+ self._stoichs['4_3'] * self._r4_DLA()

def _rate4_X_D(self):
return self._stoichs['3_4'] * self._r3_DLH() \
+ self._stoichs['4_4'] * self._r4_DLA()
def _rate5_S_I(self):
return 0

def _rate6_S_S(self):
return self._stoichs['0_6'] * self._r0_AerGH() \
+ self._stoichs['1_6'] * self._r1_AxGH() \
+ self._stoichs['6_6'] * self._r6_HydX()

def _rate7_S_DO(self):
return self._stoichs['0_7'] * self._r0_AerGH() \
+ self._stoichs['2_7'] * self._r2_AerGA()

def _rate8_S_NO(self):
return self._stoichs['1_8'] * self._r1_AxGH() \
+ self._stoichs['2_8'] * self._r2_AerGA()

def _rate9_S_NH(self):
return self._stoichs['0_9'] * self._r0_AerGH() \
+ self._stoichs['1_9'] * self._r1_AxGH() \
+ self._stoichs['2_9'] * self._r2_AerGA() \
+ self._stoichs['5_9'] * self._r5_AmmSN()

def _rate10_S_NS(self):
return self._stoichs['5_10'] * self._r5_AmmSN() \
+ self._stoichs['7_10'] * self._r7_HydXN()

def _rate11_X_NS(self):
return self._stoichs['3_11'] * self._r3_DLH() \
+ self._stoichs['4_11'] * self._r4_DLA() \
+ self._stoichs['7_11'] * self._r7_HydXN()

def _rate12_S_Alk(self):
return self._stoichs['0_12'] * self._r0_AerGH() \
+ self._stoichs['1_12'] * self._r1_AxGH() \
+ self._stoichs['2_12'] * self._r2_AerGA() \
+ self._stoichs['5_123'] * self._r5_AmmSN()

def steady_step(self, guess, inflow, infcomp, vol):


'''
Calculate the state of this round of iteration.
Pass the results to the storing List() in the ASMReactor.
The results of this calculation should be compared with those of
the last round, and determine whether the reactor has reached a
steady state.
'''
current_state = fsolve(self._steady, guess, (inflow, infcomp, vol))
return current_state

def update(self, Temp, DO):


''' update the ASM model with new Temperature and Bulk_DO'''
if Temp <= 4 or DO < 0:
print("Error: New temperature or Bulk_DO too low.", \
"USING PREVIOUS VALUES FOR BOTH")
return -1

self._temperature = Temp
self._bulk_DO = DO
self._delta_t = 20 - self._temperature
self._param = self._set_params()
self._stoich = self._set_stoichs()
return None

def get_params(self):
return self._params

def get_stoichs(self):
return self._stoichs

def get_all_comps(self):
#TODO: Need to determine where to provide GetAllComponents(), in
# ASMReactor or here?
return self._comps.copy()

def get_bulk_DO(self):
return self._bulk_DO

You might also like