Example #1
0
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
Example #2
0
    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"
Example #3
0
    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"
Example #4
0
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')
Example #5
0
    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
Example #6
0
    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