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 add_reactants_to_chem_cstr(self): for k, v in self.initial_metals.iteritems(): metal = reactions.MetalDissolutionRate(k, v, system=constants.CONTINUOUS) self.chem_cstr.create_components(metal) self.system_components.append(metal.reactant_name)
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 run_copper_reaction_rates(): copper_conc = 0.064 ferric_conc = 0.171 copper = reactions.MetalDissolutionRate(constants.COPPER, copper_conc, ferric_conc) data = [] i = 0 while copper.ferric > 1e-9 and copper.component_conc > 1e-9: temp = {} # rate_ferrous, rate_ferric, copper_component_conc = copper.run() output = copper.run() temp = { "ferric": copper.ferric, "step": i, "copper": output["component_moles"], "cupric": output["ion_moles"] } temp.update(output) data.append(temp) i = i + 1 return data
def test_chemical_reaction_rate(self): copper_conc = 2 / 65.3 ferric_conc = 0.0001 copper = reactions.MetalDissolutionRate(constants.COPPER, copper_conc, ferric_conc) rate_ferric = copper.metal_powder_rate()