Пример #1
0
def test_equilibrium_solver_approx_overload_3(setup, state_regression):
    """
    An integration test that checks result's reproducibility of
    the calculation of an equilibrium of a state using
    EquilibriumSolver::approximate(ChemicalState& state, double T, double P, VectorConstRef be)
    @param setup
        a tuple that has some objects from problem setup
        (system, problem)
    """
    (system, problem) = setup

    state = ChemicalState(system)

    solver = EquilibriumSolver(system)

    T = problem.temperature()
    P = problem.pressure()
    b = problem.elementAmounts()

    solver.approximate(state, T, P, b)

    exclude = ['pH [-]']

    state_regression.check(state,
                           default_tol=dict(atol=1e-5, rtol=1e-14),
                           exclude=exclude)
Пример #2
0
def test_equilibrium_CH4_CO2_H2S_liq_gas(temperature, pressure,
                                         num_regression):
    """
    This test checks the capability of solving a ternary mixture with
    @param Temperature
        temperature in Kelvin which will be used to compute equilibrium
    @param Pressure
        pressure in bar which will be used to compute equilibrium
    """

    db = Database("supcrt98.xml")

    editor = ChemicalEditor(db)

    eos_params = CubicEOSParams(
        phase_identification_method=PhaseIdentificationMethod.
        GibbsEnergyAndEquationOfStateMethod, )

    editor.addGaseousPhase(["CH4(g)", "H2S(g)",
                            "CO2(g)"]).setChemicalModelPengRobinson(eos_params)
    editor.addLiquidPhase(["CH4(liq)", "H2S(liq)", "CO2(liq)"
                           ]).setChemicalModelPengRobinson(eos_params)

    system = ChemicalSystem(editor)

    problem = EquilibriumProblem(system)

    problem.setTemperature(temperature, "K")
    problem.setPressure(pressure, "bar")
    problem.add("CH4(g)", 0.60, "mol")
    problem.add("H2S(g)", 0.35, "mol")
    problem.add("CO2(g)", 0.05, "mol")

    solver = EquilibriumSolver(problem.system())

    options = EquilibriumOptions()
    options.hessian = GibbsHessian.Exact
    options.nonlinear.max_iterations = 100
    options.optimum.max_iterations = 200
    options.optimum.ipnewton.step = StepMode.Conservative

    solver.setOptions(options)

    state = ChemicalState(system)

    result = solver.solve(state, problem)

    assert result.optimum.succeeded

    species_amount = {
        "CH4(g)": np.asarray([state.speciesAmount("CH4(g)")]),
        "H2S(g)": np.asarray([state.speciesAmount("H2S(g)")]),
        "CO2(g)": np.asarray([state.speciesAmount("CO2(g)")]),
        "CH4(liq)": np.asarray([state.speciesAmount("CH4(liq)")]),
        "H2S(liq)": np.asarray([state.speciesAmount("H2S(liq)")]),
        "CO2(liq)": np.asarray([state.speciesAmount("CO2(liq)")]),
    }

    num_regression.check(species_amount)
Пример #3
0
def test_equilibrium_solver_solve_overload_2(setup, state_regression):
    """
    An integration test that checks result's reproducibility of 
    the calculation of an equilibrium of a state using 
    EquilibriumSolver::solve(ChemicalState& state, const EquilibriumProblem& problem)
    @param setup
        a tuple that has some objects from problem setup
        (system, problem)
    """
    (system, problem) = setup

    state = ChemicalState(system)

    solver = EquilibriumSolver(system)

    solver.solve(state, problem)

    state_regression.check(state, default_tol=dict(atol=1e-5, rtol=1e-16))
Пример #4
0
def test_equilibrium_H2S_liq_gas(temperature, pressure, num_regression):
    db = Database("supcrt98.xml")

    editor = ChemicalEditor(db)

    eos_params = CubicEOSParams(
        model=CubicEOSModel.PengRobinson,
        phase_identification_method=PhaseIdentificationMethod.
        GibbsEnergyAndEquationOfStateMethod,
    )

    editor.addGaseousPhase(["H2S(g)"]).setChemicalModelCubicEOS(eos_params)
    editor.addLiquidPhase(["H2S(liq)"]).setChemicalModelCubicEOS(eos_params)

    system = ChemicalSystem(editor)

    problem = EquilibriumProblem(system)

    problem.setTemperature(temperature, "K")
    problem.setPressure(pressure, "Pa")
    problem.add("H2S(g)", 1.0, "mol")

    solver = EquilibriumSolver(problem.system())

    options = EquilibriumOptions()
    options.hessian = GibbsHessian.Exact
    options.nonlinear.max_iterations = 100
    options.optimum.max_iterations = 200
    options.optimum.ipnewton.step = StepMode.Conservative
    options.optimum.tolerance = 1e-17
    solver.setOptions(options)

    state = ChemicalState(system)

    result = solver.solve(state, problem)

    assert result.optimum.succeeded

    species_amounts = {
        "H2S(g)": np.asarray([state.speciesAmount("H2S(g)")]),
        "H2S(liq)": np.asarray([state.speciesAmount("H2S(liq)")]),
    }

    num_regression.check(species_amounts)
Пример #5
0
def test_equilibrium_solver_approx_overload_1(setup, state_regression):
    """
    An integration test that checks result's reproducibility of 
    the calculation of an equilibrium of a state using 
    EquilibriumSolver::approximate(ChemicalState& state)
    @param setup
        a tuple that has some objects from problem setup
        (system, problem)
    """
    (system, problem) = setup

    state = equilibrate(problem)
    state.setTemperature(problem.temperature() + 10)
    state.setPressure(problem.pressure() + 10)

    solver = EquilibriumSolver(system)

    solver.approximate(state)

    state_regression.check(state, default_tol=dict(atol=1e-5, rtol=1e-16))
def test_equilibrium_solver_approx_overload_2(setup, num_regression):
    """
    An integration test that checks result's reproducibility of 
    the calculation of an equilibrium of a state using 
    EquilibriumSolver::approximate(ChemicalState& state, const EquilibriumProblem& problem)
    @param setup
        a tuple that has some objects from problem setup
        (system, problem)
    """
    (system, problem) = setup

    state = ChemicalState(system)

    solver = EquilibriumSolver(system)

    solver.approximate(state, problem)

    stateDict = convert_reaktoro_state_to_dict(state)

    num_regression.check(stateDict,
                         default_tolerance=dict(atol=1e-5, rtol=1e-16))
Пример #7
0
def test_CubicEOS_multiple_roots():
    """
    This problem leads to the following CubicEOS roots
    PR - Z1 = 1.00027728
         Z2 = 0.0001655
         Z3 = -0.0011024
    since bmix = 1.635e-05 -> Z3 is an invalid root 
    and since Z3 < Z2 < Z1 -> Z2 is an invalid root.
    Reaktoro should remove Z3, Z2 and proceed instead of removing only Z3 and
    raising the exception "Logic error: it was expected Z roots of size 3, but
    got: 2".
    """
    database = Database("supcrt98.xml")

    editor = ChemicalEditor(database)
    editor.addAqueousPhaseWithElementsOf("H2O Fe(OH)2 Fe(OH)3 NH3")
    editor.addGaseousPhaseWithElementsOf("NH3")
    editor.addMineralPhase("Magnetite")

    system = ChemicalSystem(editor)

    state = ChemicalState(system)

    solver = EquilibriumSolver(system)

    temperature = 298.15
    pressure = 1e5
    b = [
        3.0,
        122.01687012,
        1.0,
        63.50843506,
        0.0,
    ]

    result = solver.approximate(state, temperature, pressure, b)
    assert result.optimum.succeeded

    # check that it doesn't raise an exception
    state.properties()
def test_equilibrium_solver_solve_overload_3(setup, num_regression):
    """
    An integration test that checks result's reproducibility of 
    the calculation of an equilibrium of a state using 
    EquilibriumSolver::solve(ChemicalState& state, double T, double P, VectorConstRef be)
    @param setup
        a tuple that has some objects from problem setup
        (system, problem)
    """
    (system, problem) = setup

    state = ChemicalState(system)

    solver = EquilibriumSolver(system)

    solver.solve(state, problem.temperature(), problem.pressure(),
                 problem.elementAmounts())

    stateDict = convert_reaktoro_state_to_dict(state)

    num_regression.check(stateDict,
                         default_tolerance=dict(atol=1e-5, rtol=1e-16))
Пример #9
0
def test_equilibrium_solver_with_equilibrium_problem(
        partition_with_inert_gaseous_phase, chemical_system):
    problem = _create_equilibrium_problem(partition_with_inert_gaseous_phase)
    state = _create_chemical_state(chemical_system)

    # Compute equilibrium state; the amounts of CO2(g) and H2O(g) should remain the same
    solver = EquilibriumSolver(chemical_system)
    solver.setPartition(problem.partition())
    solver.solve(state, problem)

    # Assert the amounts of CO2(g) and H2O(g) are the same as initially set
    assert state.speciesAmount('CO2(g)') == 1.0
    assert state.speciesAmount('H2O(g)') == 0.001
Пример #10
0
def test_equilibrium_solver_with_chemical_state(
        partition_with_inert_gaseous_phase, chemical_system):
    state = _create_chemical_state(chemical_system)

    # Compute equilibrium state; the amounts of CO2(g) and H2O(g) should remain the same
    solver = EquilibriumSolver(chemical_system)
    solver.setPartition(partition_with_inert_gaseous_phase)

    # Set the amounts of H2O(l) and CO2(aq)
    state.setSpeciesMass('H2O(l)', 55, 'kg')
    state.setSpeciesAmount('CO2(aq)', 1, 'mol')

    # Check inert elements are taken care of when solving with state input
    solver.solve(state)

    # Assert the amounts of CO2(g) and H2O(g) are the same as initially set
    assert state.speciesAmount('CO2(g)') == 1.0
    assert state.speciesAmount('H2O(g)') == 0.001
Пример #11
0
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))
Пример #12
0
def test_equilibrium_CH4_H2S_CO2_H2O_liq_gas_aq(temperature, pressure,
                                                num_regression):
    """
    This test checks the capability of solving a system that has CH4, H2S,
    CO2, H2O with
    @param Temperature
        temperature in Kelvin which will be used to compute equilibrium
    @param Pressure
        pressure in bar which will be used to compute equilibrium
    """

    db = Database("supcrt98.xml")

    editor = ChemicalEditor(db)

    eos_params = CubicEOSParams(
        phase_identification_method=PhaseIdentificationMethod.
        GibbsEnergyAndEquationOfStateMethod, )

    editor.addAqueousPhase(["CO2(aq)", "H2S(aq)", "H2O(l)"])
    editor.addGaseousPhase(["CH4(g)", "CO2(g)", "H2S(g)",
                            "H2O(g)"]).setChemicalModelCubicEOS(eos_params)
    editor.addLiquidPhase(["CH4(liq)", "CO2(liq)", "H2S(liq)",
                           "H2O(liq)"]).setChemicalModelCubicEOS(eos_params)

    system = ChemicalSystem(editor)

    problem = EquilibriumProblem(system)

    problem.setTemperature(temperature, "K")
    problem.setPressure(pressure, "bar")
    problem.add("H2O(g)", 0.50, "mol")
    problem.add("CO2(g)", 0.05, "mol")
    problem.add("H2S(g)", 0.40, "mol")
    problem.add("CH4(g)", 0.05, "mol")

    # This is a workaround to avoid an Eigen assertion when in Debug:
    # `DenseBase::resize() does not actually allow to resize.`, triggered by `y(iee) = optimum_state.y * RT;`
    problem.add("Z", 1e-15, "mol")

    solver = EquilibriumSolver(problem.system())

    options = EquilibriumOptions()
    options.hessian = GibbsHessian.Exact
    options.nonlinear.max_iterations = 100
    options.optimum.max_iterations = 200
    options.optimum.ipnewton.step = StepMode.Conservative
    options.optimum.tolerance = 1e-14
    solver.setOptions(options)

    state = ChemicalState(system)

    result = solver.solve(state, problem)

    assert result.optimum.succeeded

    species_amount = {
        "CO2(aq)": np.asarray([state.speciesAmount("CO2(g)")]),
        "H2S(aq)": np.asarray([state.speciesAmount("H2S(aq)")]),
        "H2O(l)": np.asarray([state.speciesAmount("H2O(l)")]),
        "CH4(g)": np.asarray([state.speciesAmount("CH4(g)")]),
        "CO2(g)": np.asarray([state.speciesAmount("CO2(g)")]),
        "H2S(g)": np.asarray([state.speciesAmount("H2S(g)")]),
        "H2O(g)": np.asarray([state.speciesAmount("H2O(g)")]),
        "CH4(liq)": np.asarray([state.speciesAmount("CH4(liq)")]),
        "CO2(liq)": np.asarray([state.speciesAmount("CO2(liq)")]),
        "H2S(liq)": np.asarray([state.speciesAmount("H2S(liq)")]),
        "H2O(liq)": np.asarray([state.speciesAmount("H2O(liq)")]),
    }

    num_regression.check(species_amount)