def kinect_problem_with_h2o_hcl_caco3_mgco3_co2_calcite(): database = Database("supcrt98.xml") editor = ChemicalEditor(database) editor.addAqueousPhase("H2O HCl CaCO3 MgCO3") editor.addGaseousPhase(["H2O(g)", "CO2(g)"]) editor.addMineralPhase("Calcite") calciteReaction = editor.addMineralReaction("Calcite") calciteReaction.setEquation("Calcite = Ca++ + CO3--") calciteReaction.addMechanism("logk = -5.81 mol/(m2*s); Ea = 23.5 kJ/mol") calciteReaction.addMechanism( "logk = -0.30 mol/(m2*s); Ea = 14.4 kJ/mol; a[H+] = 1.0" ) calciteReaction.setSpecificSurfaceArea(10, "cm2/g") system = ChemicalSystem(editor) reactions = ReactionSystem(editor) partition = Partition(system) partition.setKineticPhases(["Calcite"]) problem = EquilibriumProblem(system) problem.setPartition(partition) problem.add("H2O", 1, "kg") problem.add("HCl", 1, "mmol") state = equilibrate(problem) state.setSpeciesMass("Calcite", 100, "g") return (state, reactions, partition)
def kinetic_problem_with_h2o_hcl_caco3_mgco3_co2_calcite(): """ Build a kinetic problem with 1 kg of H2O, 1mmol of HCl which has calcite as a kinetic reaction """ database = Database("supcrt98.xml") editor = ChemicalEditor(database) editor.addAqueousPhaseWithElementsOf("H2O HCl CaCO3 MgCO3") editor.addGaseousPhase(["H2O(g)", "CO2(g)"]) editor.addMineralPhase("Calcite") calcite_reaction = editor.addMineralReaction("Calcite") calcite_reaction.setEquation("Calcite = Ca++ + CO3--") calcite_reaction.addMechanism("logk = -5.81 mol/(m2*s); Ea = 23.5 kJ/mol") calcite_reaction.addMechanism( "logk = -0.30 mol/(m2*s); Ea = 14.4 kJ/mol; a[H+] = 1.0") calcite_reaction.setSpecificSurfaceArea(10, "cm2/g") system = ChemicalSystem(editor) reactions = ReactionSystem(editor) partition = Partition(system) partition.setKineticPhases(["Calcite"]) problem = EquilibriumProblem(system) problem.setPartition(partition) problem.add("H2O", 1, "kg") problem.add("HCl", 1, "mmol") return (problem, reactions, partition)
def kinect_problem_with_h2o_nacl_caco3_mgco3_hcl_co2_calcite_magnesite_dolomite_halite(): database = Database("supcrt98.xml") editor = ChemicalEditor(database) editor.addAqueousPhase("H2O NaCl CaCO3 MgCO3 HCl") editor.addGaseousPhase(["H2O(g)", "CO2(g)"]) editor.addMineralPhase("Calcite") editor.addMineralPhase("Magnesite") editor.addMineralPhase("Dolomite") editor.addMineralPhase("Halite") calciteReaction = editor.addMineralReaction("Calcite") calciteReaction.setEquation("Calcite = Ca++ + CO3--") calciteReaction.addMechanism("logk = -5.81 mol/(m2*s); Ea = 23.5 kJ/mol") calciteReaction.addMechanism( "logk = -0.30 mol/(m2*s); Ea = 14.4 kJ/mol; a[H+] = 1.0" ) calciteReaction.setSpecificSurfaceArea(10, "cm2/g") magnesiteReaction = editor.addMineralReaction("Magnesite") magnesiteReaction.setEquation("Magnesite = Mg++ + CO3--") magnesiteReaction.addMechanism("logk = -9.34 mol/(m2*s); Ea = 23.5 kJ/mol") magnesiteReaction.addMechanism( "logk = -6.38 mol/(m2*s); Ea = 14.4 kJ/mol; a[H+] = 1.0" ) magnesiteReaction.setSpecificSurfaceArea(10, "cm2/g") dolomiteReaction = editor.addMineralReaction("Dolomite") dolomiteReaction.setEquation("Dolomite = Ca++ + Mg++ + 2*CO3--") dolomiteReaction.addMechanism("logk = -7.53 mol/(m2*s); Ea = 52.2 kJ/mol") dolomiteReaction.addMechanism( "logk = -3.19 mol/(m2*s); Ea = 36.1 kJ/mol; a[H+] = 0.5" ) dolomiteReaction.setSpecificSurfaceArea(10, "cm2/g") system = ChemicalSystem(editor) reactions = ReactionSystem(editor) partition = Partition(system) partition.setKineticSpecies(["Calcite", "Magnesite", "Dolomite"]) problem = EquilibriumProblem(system) problem.setPartition(partition) problem.add("H2O", 1, "kg") problem.add("NaCl", 1, "mol") problem.add("CO2", 1, "mol") state = equilibrate(problem) state.setSpeciesMass("Calcite", 100, "g") state.setSpeciesMass("Dolomite", 50, "g") return (state, reactions, partition)
def kinetic_problem_with_h2o_nacl_caco3_mgco3_hcl_co2_calcite_magnesite_dolomite_halite( ): """ Build a kinetic problem with 1 kg of H2O, 1 mol of NaCl and 1 mol of CO2 which has the following kinetic reactions: calcite, Magnesite and Dolomite. """ database = Database("supcrt98.xml") editor = ChemicalEditor(database) editor.addAqueousPhaseWithElementsOf("H2O NaCl CaCO3 MgCO3 HCl") editor.addGaseousPhase(["H2O(g)", "CO2(g)"]) editor.addMineralPhase("Calcite") editor.addMineralPhase("Magnesite") editor.addMineralPhase("Dolomite") editor.addMineralPhase("Halite") calcite_reaction = editor.addMineralReaction("Calcite") calcite_reaction.setEquation("Calcite = Ca++ + CO3--") calcite_reaction.addMechanism("logk = -5.81 mol/(m2*s); Ea = 23.5 kJ/mol") calcite_reaction.addMechanism( "logk = -0.30 mol/(m2*s); Ea = 14.4 kJ/mol; a[H+] = 1.0") calcite_reaction.setSpecificSurfaceArea(10, "cm2/g") magnesite_reaction = editor.addMineralReaction("Magnesite") magnesite_reaction.setEquation("Magnesite = Mg++ + CO3--") magnesite_reaction.addMechanism( "logk = -9.34 mol/(m2*s); Ea = 23.5 kJ/mol") magnesite_reaction.addMechanism( "logk = -6.38 mol/(m2*s); Ea = 14.4 kJ/mol; a[H+] = 1.0") magnesite_reaction.setSpecificSurfaceArea(10, "cm2/g") dolomite_reaction = editor.addMineralReaction("Dolomite") dolomite_reaction.setEquation("Dolomite = Ca++ + Mg++ + 2*CO3--") dolomite_reaction.addMechanism("logk = -7.53 mol/(m2*s); Ea = 52.2 kJ/mol") dolomite_reaction.addMechanism( "logk = -3.19 mol/(m2*s); Ea = 36.1 kJ/mol; a[H+] = 0.5") dolomite_reaction.setSpecificSurfaceArea(10, "cm2/g") system = ChemicalSystem(editor) reactions = ReactionSystem(editor) partition = Partition(system) partition.setKineticSpecies(["Calcite", "Magnesite", "Dolomite"]) problem = EquilibriumProblem(system) problem.setPartition(partition) problem.add("H2O", 1, "kg") problem.add("NaCl", 1, "mol") problem.add("CO2", 1, "mol") return (problem, reactions, partition)
def brine_co2_path(): editor = ChemicalEditor() editor.addAqueousPhaseWithElementsOf("H2O NaCl CaCO3 MgCO3") editor.addGaseousPhase(["H2O(g)", "CO2(g)"]) editor.addMineralPhase("Calcite") editor.addMineralPhase("Magnesite") editor.addMineralPhase("Dolomite") editor.addMineralPhase("Halite") editor.addMineralReaction("Calcite") \ .setEquation("Calcite = Ca++ + CO3--") \ .addMechanism("logk = -5.81 mol/(m2*s); Ea = 23.5 kJ/mol") \ .addMechanism("logk = -0.30 mol/(m2*s); Ea = 14.4 kJ/mol; a[H+] = 1.0") \ .setSpecificSurfaceArea(10, "cm2/g") editor.addMineralReaction("Magnesite") \ .setEquation("Magnesite = Mg++ + CO3--") \ .addMechanism("logk = -9.34 mol/(m2*s); Ea = 23.5 kJ/mol") \ .addMechanism("logk = -6.38 mol/(m2*s); Ea = 14.4 kJ/mol; a[H+] = 1.0") \ .setSpecificSurfaceArea(10, "cm2/g") editor.addMineralReaction("Dolomite") \ .setEquation("Dolomite = Ca++ + Mg++ + 2*CO3--") \ .addMechanism("logk = -7.53 mol/(m2*s); Ea = 52.2 kJ/mol") \ .addMechanism("logk = -3.19 mol/(m2*s); Ea = 36.1 kJ/mol; a[H+] = 0.5") \ .setSpecificSurfaceArea(10, "cm2/g") system = ChemicalSystem(editor) reactions = ReactionSystem(editor) partition = Partition(system) partition.setKineticSpecies(["Calcite", "Magnesite", "Dolomite"]) problem = EquilibriumProblem(system) problem.setPartition(partition) problem.setTemperature(60, "celsius") problem.setPressure(100, "bar") problem.add("H2O", 1, "kg") problem.add("NaCl", 0.5, "mol") problem.add("CO2", 1, "mol") state = equilibrate(problem) state.setSpeciesMass("Calcite", 100, "g") state.setSpeciesMass("Dolomite", 50, "g") path = KineticPath(reactions) path.setPartition(partition) return path, state
def test_equilibrate_overload_6(setup, num_regression): """ An integration test that checks result's reproducibility of the calculation of a problem using equilibrate(ChemicalState& state, const Partition& partition, const EquilibriumOptions& options) @param setup a tuple that has some objects from problem setup (system, problem) """ (system, problem) = setup # find a state based on the equilibrium setup state = equilibrate(problem) # change pressure and temperature state.setTemperature(problem.temperature() + 5) state.setPressure(problem.pressure() + 5) options = EquilibriumOptions() partition = Partition(system) # compute equilibrium for state with new temperature and pressure equilibriumResult = equilibrate(state, partition, options) stateDict = convert_reaktoro_state_to_dict(state) num_regression.check(stateDict, default_tolerance=dict(atol=1e-5, rtol=1e-16))
def test_equilibrate_overload_4(setup, state_regression): """ An integration test that checks result's reproducibility of the calculation of a problem using equilibrate(ChemicalState& state, const Partition& partition) @param setup a tuple that has some objects from problem setup (system, problem) """ (system, problem) = setup # find a state based on the equilibrium setup state = equilibrate(problem) # change pressure and temperature state.setTemperature(problem.temperature() + 5) state.setPressure(problem.pressure() + 5) partition = Partition(system) # compute equilibrium for state with new temperature and pressure equilibriumResult = equilibrate(state, partition) state_regression.check(state, default_tol=dict(atol=1e-5, rtol=1e-14))
def test_different_results(state_regression): from reaktoro import ChemicalEditor, ChemicalState, ChemicalSystem, Database, EquilibriumProblem, EquilibriumSolver, Partition database = Database('supcrt07.xml') editor = ChemicalEditor(database) aqueous_elements = ["C", "Ca", "Cl", "Fe", "H", "Na", "O", "S", "Ba", "Sr"] aqueous_phase = editor.addAqueousPhaseWithElements(aqueous_elements) assert aqueous_phase.name() == 'Aqueous' mineral_species = [ "Anhydrite", "Barite", "Calcite", "Celestite", "Siderite", "Pyrrhotite" ] for mineral in mineral_species: editor.addMineralPhase(mineral) gaseous_species = ["CO2(g)", "H2S(g)", "CH4(g)"] editor.addGaseousPhase(gaseous_species) chemical_system = ChemicalSystem(editor) element_index = { e.name(): index for index, e in enumerate(chemical_system.elements()) } species_index = { s.name(): index for index, s in enumerate(chemical_system.species()) } phase_index = { p.name(): index for index, p in enumerate(chemical_system.phases()) } reaktoro_case = get_reaktoro_case() equilibrium_problem = EquilibriumProblem(chemical_system) equilibrium_problem.setTemperature(reaktoro_case.temperature_in_K) equilibrium_problem.setPressure(reaktoro_case.pressure_in_Pa) partition = Partition(chemical_system) partition.setInertPhases([phase_index['Gaseous']]) equilibrium_problem.setPartition(partition) chemical_state = ChemicalState(chemical_system) for name, index, molar_amount in reaktoro_case.species_amounts: assert index == species_index[name] chemical_state.setSpeciesAmount(index, molar_amount) equilibrium_problem.addState(chemical_state) solver = EquilibriumSolver(chemical_system) solver.setPartition(partition) result = solver.solve(chemical_state, equilibrium_problem) assert result.optimum.succeeded state_regression.check(chemical_state, default_tol=dict(atol=1e-5, rtol=1e-14))
def partition_with_inert_gaseous_phase_adding_argon( chemical_system_adding_argon): partition = Partition(chemical_system_adding_argon) partition.setInertPhases(['Gaseous']) return partition
def partition_with_inert_gaseous_phase(chemical_system): partition = Partition(chemical_system) partition.setInertPhases(['Gaseous']) return partition