def run_chemical_single_reactor(): data = [] volume = 1 # m3 copper_conc = 4 / 63.5 upstream = reactors.BaseUpStream() cstr = reactors.CSTR(volume, upstream) metal_rate = reactions.MetalDissolutionRate( constants.COPPER, copper_conc, upstream.flow_out["components"]["ferric"], system=constants.CONTINUOUS) cstr.create_components(metal_rate) i = 0 # metal_rate.ferric > 1e-9 and metal_rate.component_conc > 1e-9 while True: temp = {} cstr_data = cstr.run() # print metal_rate.ferric, metal_rate.component_conc if metal_rate.ferric < 1e-9 or metal_rate.component_conc < 1e-9: break temp = {"step": i} temp.update(cstr_data) data.append(temp) i = i + 1 return data
def build_tanks_in_series(self): # Setting up the biox reactor self.upstream = reactors.BaseUpStream(ferric=self.ferric, ferrous=self.ferrous, ratio=self.ferric_ferrous) self.biox_rate = reactions.BioxidationRate( initial_cells=self.initial_cells) self.biox_cstr = self.create_reactor(reactors.CSTR, self.biox_volume, self.upstream) self.biox_cstr.create_components(self.biox_rate) self.system_components.append(self.biox_rate.reactant_name) # Setting up the Chemical Reactor # self.copper_rate = reactions.MetalDissolutionRate( # constants.COPPER, # self.initial_copper, # system=constants.CONTINUOUS) self.chem_cstr = self.create_reactor(reactors.CSTR, self.chem_volume, self.biox_cstr) self.add_reactants_to_chem_cstr() # self.chem_cstr.create_components(self.copper_rate) # That the system can be aware of all ions/ reactants # self.system_components.append(self.copper_rate.reactant_name) self.add_system_ions_to_reactors() self.img = "/static/img/system/tanks_in_series.png" self.system_type = "Tanks in Series"
def build_cyclic_tanks(self): # This is temporary as once the chemical reactor is built, # the upstream will be updated upstream = reactors.BaseUpStream(ferric=self.ferric, ferrous=self.ferrous, ratio=self.ferric_ferrous) # Building the Bioxidation Reactor self.biox_rate = reactions.BioxidationRate( initial_cells=self.initial_cells) self.biox_cstr = self.create_reactor(reactors.CSTR, self.biox_volume, upstream) self.biox_cstr.create_components(self.biox_rate) self.system_components.append(self.biox_rate.reactant_name) # Setting up the Chemical Reactor # self.copper_rate = reactions.MetalDissolutionRate( # constants.COPPER, # self.initial_copper, # system=constants.CONTINUOUS) self.chem_cstr = self.create_reactor(reactors.CSTR, self.chem_volume, self.biox_cstr) # self.chem_cstr.create_components(self.copper_rate) # self.system_components.append(self.copper_rate.reactant_name) self.add_reactants_to_chem_cstr() # Updating the biox_cstr upstream self.biox_cstr.upstream = self.chem_cstr self.biox_cstr.update_flow_in() self.add_system_ions_to_reactors() self.img = "/static/img/system/closed_loop.png" self.system_type = "Closed Cyclic Tanks"
def bioleach_reactor(request): sys = System() upstream = reactors.BaseUpStream() sys.create_reactor(reactors.CSTR, 10, upstream) data = sys.run_system() json_data = dumps(data) return HttpResponse(json_data, content_type='application/json')
def test_running_cstr_reactor_with_simplified_chemical_equation(self): upstream = reactors.BaseUpStream() cstr = reactors.CSTR(self.volume, upstream) copper_rate = reactions.MetalDissolutionRate( constants.COPPER, self.copper_conc, self.ferric_conc, system=constants.CONTINUOUS) cstr.create_components(copper_rate) self.assertIn(copper_rate, cstr.components) self.assertEqual(cstr.flow_in, upstream.flow_out) self.assertEqual(cstr.flow_in, cstr.flow_out) self.assertIsNotNone(cstr.flow_in) # self.assertEqual(cstr.ions[copper_rate.reactant_name], 0) output = cstr.run() self.assertIn('total_rate_ferric', output["cstr_data"]) self.assertIn('total_rate_ferrous', output["cstr_data"]) self.assertIn('Cu', output["cstr_data"]["components"]) self.assertEqual(output["cstr_data"]['total_rate_ferrous'], -output["cstr_data"]['total_rate_ferric']) self.assertEqual( output["cstr_data"]["components"][copper_rate.reactant_name] ['rate_ferrous'], -output["cstr_data"]["components"][ copper_rate.reactant_name]['rate_ferric']) self.assertEqual( output["cstr_data"]['total_rate_ferrous'], output["cstr_data"] ["components"][copper_rate.reactant_name]["rate_ferrous"]) self.assertNotEqual(output["flow_out"]["components"]["ferric"], upstream.flow_out["components"]["ferric"]) self.assertEqual(output["flow_out"]["components"]["ferric"], cstr.flow_out["components"]["ferric"]) # Assert that the change in ferric is equal to change in rate self.assertAlmostEqual( output["flow_out"]["components"]["ferric"] - cstr.flow_in["components"]["ferric"], output["cstr_data"] ['total_rate_ferric']) # Almost equal due to floating point errors
def test_running_cstr_reactor_with_simplified_hansford(self): upstream = reactors.BaseUpStream() cstr = reactors.CSTR(self.volume, upstream) biox_rate = reactions.BioxidationRate(self.ferric_conc) cstr.create_components(biox_rate) self.assertIn(biox_rate, cstr.components) self.assertEqual(cstr.flow_in, upstream.flow_out) self.assertEqual(cstr.flow_in, cstr.flow_out) self.assertIsNotNone(cstr.flow_in) # self.assertEqual(cstr.ions[biox_rate.reactant_name], 0) output = cstr.run() self.assertIn('total_rate_ferric', output["cstr_data"]) self.assertIn('total_rate_ferrous', output["cstr_data"]) self.assertEqual(output["cstr_data"]['total_rate_ferrous'], -output["cstr_data"]['total_rate_ferric']) self.assertEqual( output["cstr_data"]['total_rate_ferrous'], output["cstr_data"] ["components"][biox_rate.reactant_name]["rate_ferrous"]) self.assertNotEqual(output["flow_out"]["components"]["ferric"], upstream.flow_out["components"]["ferric"]) self.assertEqual(output["flow_out"]["components"]["ferric"], cstr.flow_out["components"]["ferric"]) # Assert that the change in ferric is equal to change in rate self.assertAlmostEqual( output["flow_out"]["components"]["ferric"] - cstr.flow_in["components"]["ferric"], output["cstr_data"] ['total_rate_ferric']) # Almost equal due to floating point errors