示例#1
0
def test_phreeqpython_hematite_and_many_more_closed_open():
    fname = inspect.stack()[0][3]
    """
    FAILING HERE: IMPORTANT
    The redux is needed to provide Fe+++ from Fe++
    Thus, for a proper execution of Fe solids I will need to implement the redox
    scheme.

    FAILING HERE: Arcanite not in the phreeqc.dat database
    """
    comp_dict = {"FeCO3": 10.0, "K2SO4": 10.0, "Al(OH)3": 10.0}
    start = time.time()
    solution_ref1 = REF_SOLUTIONS[fname][0]
    print("Elapsed PHREEQC = {}".format(time.time() - start))
    start = time.time()
    solution = solve_solution(
        comp_dict,
        close_type=ClosingEquationType.NONE,
        element_mass_balance=["Fe", "K", "Al", "S", "C"],
    )
    print("Elapsed = {}".format(time.time() - start))
    assert_solution(solution, solution_ref1, tol={"pH": 1e-2})
    assert_solid(solution, solution_ref1, tol={"si": 1e-1})

    solution_ref2 = REF_SOLUTIONS[fname][1]
    start = time.time()
    solution = solve_solution(
        comp_dict,
        close_type=ClosingEquationType.OPEN,
        element_mass_balance=["Fe", "K", "Al", "S"],
    )
    print("Elapsed = {}".format(time.time() - start))
    assert_solution(solution, solution_ref2, tol={"pH": 1e-2})
    assert_solid(solution, solution_ref2, tol={"si": 1e-1})
示例#2
0
def test_pH_as_a_closing_equation():

    comps = {"NaHCO3": 10, "CaCl2": 5.0}

    sol1 = pyequion.solve_solution(comps)
    pyequion.print_solution(sol1)
    x_guess = sol1.x

    pH = 8.5
    solution_comps = pyequion.solve_solution(comps,
                                             close_type=ClosingEquationType.PH,
                                             pH_fixed=pH,
                                             element_mass_balance=['Na'])
    pyequion.print_solution(solution_comps)

    assert (np.isclose(solution_comps.pH, pH))

    pH = 7.9386654148526965
    solution_comps2 = pyequion.solve_solution(
        comps,
        close_type=ClosingEquationType.PH,
        pH_fixed=pH,
        x_guess=x_guess,
        element_mass_balance=['Na'],
    )
    pyequion.print_solution(solution_comps2)

    assert (np.isclose(solution_comps2.pH, pH))
    assert (np.isclose(solution_comps2.DIC, comps['NaHCO3'] * 1e-3))
    return
示例#3
0
def test_phreeqpython_nahco3_cacl2_open_15_5():
    fname = inspect.stack()[0][3]
    comp_dict = {"NaHCO3": 15.0, "CaCl2": 5.0}
    solution_ref1 = REF_SOLUTIONS[fname][0]

    solution = solve_solution(comp_dict, initial_feed_mass_balance=["Cl-"])
    print("")
    assert_solid(solution, solution_ref1, {"si": 1e-1})

    solution_ref2 = REF_SOLUTIONS[fname][1]
    solution = solve_solution(
        comp_dict,
        close_type=ClosingEquationType.OPEN,
        initial_feed_mass_balance=["Cl-"],
    )
    assert_solution(solution, solution_ref2, tol={"pH": 1e-2})
    assert_solid(solution, solution_ref2, tol={"si": 1e-1})

    solution_ref3 = REF_SOLUTIONS[fname][2]
    # si_max = max([(v, k) for k, v in solution_ref3["phases"].items()])[1]
    solution = solve_solution(
        comp_dict,
        initial_feed_mass_balance=["Cl-"],
        close_type=ClosingEquationType.CARBON_TOTAL,
        carbon_total=comp_dict["NaHCO3"],
        allow_precipitation=True,
    )
    assert_solution(solution, solution_ref3, tol={"pH": 1e-2})
    assert_solid(solution, solution_ref3, tol={"si": 1e-1})
示例#4
0
def test_from_ions_is_equal_to_from_compounds():
    comps = {"Na+": 10, "HCO3-": 10, "Ca++": 5.0, "Cl-": 10.0}
    solution_ions = pyequion.solve_solution(comps)
    pyequion.print_solution(solution_ions)

    comps = {"NaHCO3": 10, "CaCl2": 5.0}
    solution_comps = pyequion.solve_solution(comps)
    pyequion.print_solution(solution_comps)

    assert np.isclose(solution_ions.pH, solution_comps.pH)
示例#5
0
def test_phreeqpython_caco3_closed_1():
    fname = inspect.stack()[0][3]
    comp_dict = {"CaCO3": 1.0}
    solution_ref = REF_SOLUTIONS[fname][0]
    solution = solve_solution(comp_dict, close_type=ClosingEquationType.NONE)
    assert_solution(solution, solution_ref, tol={"pH": 1e-2})
    assert_solid(solution, solution_ref, tol={"si": 1e-1})
示例#6
0
def xtest_phreeqpython_baco3_open():
    fname = inspect.stack()[0][3]  # FIXME -> not sure why is breaking
    comp_dict = {"BaCO3": 1.0}
    solution_ref = REF_SOLUTIONS[fname][0]
    solution = solve_solution(comp_dict)
    assert_solution(solution, solution_ref)
    assert_solid(solution, solution_ref)
示例#7
0
def test_phreeqpython_srco3_closed_open():
    fname = inspect.stack()[0][3]
    comp_dict = {"SrCO3": 20.0}
    solution_ref1 = REF_SOLUTIONS[fname][0]
    solution = solve_solution(
        comp_dict,
        close_type=ClosingEquationType.CARBON_TOTAL,
        carbon_total=comp_dict["SrCO3"],
    )
    assert_solution(solution, solution_ref1, tol={"pH": 1e-2})
    assert_solid(solution, solution_ref1, tol={"si": 1e-1})

    solution_ref2 = REF_SOLUTIONS[fname][1]
    solution = solve_solution(comp_dict, close_type=ClosingEquationType.OPEN)
    assert_solution(solution, solution_ref2, tol={"pH": 1e-2})
    assert_solid(solution, solution_ref2, tol={"si": 1e-1})
示例#8
0
def test_phreeqpython_nahco3_open():
    comp_dict = {"NaHCO3": 1.0}
    solution = solve_solution(
        comp_dict,
        close_type=ClosingEquationType.OPEN,
    )
    fname = inspect.stack()[0][3]
    solution_ref = REF_SOLUTIONS[fname][0]
    assert_solution(solution, solution_ref)
示例#9
0
def test_phreeqpython_caso4_open():
    fname = inspect.stack()[0][3]
    comp_dict = {"CaSO4": 1.0}
    solution_ref = REF_SOLUTIONS[fname][0]
    solution = solve_solution(
        comp_dict,
        close_type=ClosingEquationType.OPEN,
        element_mass_balance=["Ca", "S"],
    )
    assert_solution(solution, solution_ref, tol={"pH": 1e-2})
示例#10
0
def test_phreeqpython_cacl2_baco3_nahco3_open():
    fname = inspect.stack()[0][3]
    comp_dict = {"CaCl2": 1.0, "BaCO3": 1.0, "NaHCO3": 1.0}
    solution_ref = REF_SOLUTIONS[fname][0]
    solution = solve_solution(
        comp_dict,
        close_type=ClosingEquationType.OPEN,
        initial_feed_mass_balance=["Cl-"],
    )
    assert_solution(solution, solution_ref, tol={"pH": 1e-2})
    assert_solid(solution, solution_ref, tol={"si": 1e-1})
示例#11
0
def test_phreeqpython_caco3_closed_100():
    fname = inspect.stack()[0][3]
    comp_dict = {"CaCO3": 100.0}
    solution_ref = REF_SOLUTIONS[fname][0]
    solution = solve_solution(
        comp_dict,
        close_type=ClosingEquationType.CARBON_TOTAL,
        carbon_total=comp_dict["CaCO3"],
    )
    assert_solution(solution, solution_ref, tol={"pH": 1e-2})
    assert_solid(solution, solution_ref, tol={"si": 1e-1})
示例#12
0
def test_phreeqpython_caso4_bacl2_closed_open():
    fname = inspect.stack()[0][3]
    comp_dict = {"CaSO4": 1.0, "BaCl2": 1.0}
    solution_ref1 = REF_SOLUTIONS[fname][0]
    solution = solve_solution(
        comp_dict,
        close_type=ClosingEquationType.NONE,
        element_mass_balance=["Ca", "S", "Ba"],
        initial_feed_mass_balance=["Cl-"],
    )
    assert_solution(solution, solution_ref1, tol={"pH": 1e-2})

    solution_ref2 = REF_SOLUTIONS[fname][1]
    solution = solve_solution(
        comp_dict,
        close_type=ClosingEquationType.OPEN,
        element_mass_balance=["Ca", "S", "Ba"],
        initial_feed_mass_balance=["Cl-"],
    )
    assert_solution(solution, solution_ref2, tol={"pH": 1e-2})
示例#13
0
def test_phreeqpython_cacl2_closed_and_open():
    fname = inspect.stack()[0][3]
    comp_dict = {"CaCl2": 15.0}
    solution_ref1 = REF_SOLUTIONS[fname][0]
    solution = solve_solution(
        comp_dict,
        close_type=ClosingEquationType.NONE,
        initial_feed_mass_balance=["Cl-"],
    )
    assert_solution(solution, solution_ref1, tol={"pH": 1e-2})
    assert_solid(solution, solution_ref1, tol={"si": 1e-1})

    solution_ref2 = REF_SOLUTIONS[fname][1]
    solution = solve_solution(
        comp_dict,
        close_type=ClosingEquationType.OPEN,
        initial_feed_mass_balance=["Cl-"],
    )
    assert_solution(solution, solution_ref2, tol={"pH": 1e-2})
    assert_solid(solution, solution_ref2, tol={"si": 1e-1})
示例#14
0
def test_phreeqpython_mnco3_open():
    fname = inspect.stack()[0][3]
    comp_dict = {"MnCO3": 150.0}
    solution_ref = REF_SOLUTIONS[fname][0]
    solution = solve_solution(
        comp_dict,
        close_type=ClosingEquationType.OPEN,
        element_mass_balance=["Mn"],
    )
    assert_solution(solution, solution_ref, tol={"pH": 1e-2})
    assert_solid(solution, solution_ref, tol={"si": 1e-1})
示例#15
0
def test_phreeqpython_srso4_closed_open():
    fname = inspect.stack()[0][3]
    comp_dict = {"SrSO4": 100.0}
    solution_ref1 = REF_SOLUTIONS[fname][0]
    solution = solve_solution(
        comp_dict,
        close_type=ClosingEquationType.NONE,
        element_mass_balance=["Sr", "S"],
    )
    assert_solution(solution, solution_ref1, tol={"pH": 1e-2})
    assert_solid(solution, solution_ref1, tol={"si": 1e-1})

    solution_ref2 = REF_SOLUTIONS[fname][1]
    solution = solve_solution(
        comp_dict,
        close_type=ClosingEquationType.OPEN,
        element_mass_balance=["Sr", "S"],
    )
    assert_solution(solution, solution_ref2, tol={"pH": 1e-2})
    assert_solid(solution, solution_ref2, tol={"si": 1e-1})
示例#16
0
def test_phreeqpython_anorthite_closed_open():
    fname = inspect.stack()[0][3]
    comp_dict = {"CaCO3": 10.0, "H4SiO4": 10.0, "Al(OH)3": 10.0}
    solution_ref1 = REF_SOLUTIONS[fname][0]
    solution = solve_solution(
        comp_dict,
        close_type=ClosingEquationType.NONE,
        element_mass_balance=["Ca", "Si", "Al", "C"],
    )
    assert_solution(solution, solution_ref1, tol={"pH": 1e-2})
    assert_solid(solution, solution_ref1, tol={"si": 1e-1})

    solution_ref2 = REF_SOLUTIONS[fname][1]
    solution = solve_solution(
        comp_dict,
        close_type=ClosingEquationType.OPEN,
        element_mass_balance=["Ca", "Si", "Al"],
    )
    assert_solution(solution, solution_ref2, tol={"pH": 1e-2})
    assert_solid(solution, solution_ref2, tol={"si": 1e-1})
示例#17
0
def test_phreeqpython_hydroxiapatite_closed_open():
    fname = inspect.stack()[0][3]
    comp_dict = {"H3PO4": 10.0, "CaCO3": 10.0}
    solution_ref1 = REF_SOLUTIONS[fname][0]
    solution = solve_solution(
        comp_dict,
        close_type=ClosingEquationType.CARBON_TOTAL,
        element_mass_balance=["Ca", "P"],
        carbon_total=comp_dict["CaCO3"],
    )
    assert_solution(solution, solution_ref1, tol={"pH": 1e-2})
    assert_solid(solution, solution_ref1, tol={"si": 1e-1})

    solution_ref2 = REF_SOLUTIONS[fname][1]
    solution = solve_solution(
        comp_dict,
        close_type=ClosingEquationType.OPEN,
        element_mass_balance=["Ca", "P"],
    )
    assert_solution(solution, solution_ref2, tol={"pH": 1e-2})
    assert_solid(solution, solution_ref2, tol={"si": 1e-1})
示例#18
0
def test_phreeqpython_dolamite_open():
    fname = inspect.stack()[0][3]
    comp_dict = {"MgCO3": 15.0, "CaCl2": 15.0}
    solution_ref = REF_SOLUTIONS[fname][0]
    solution = solve_solution(
        comp_dict,
        close_type=ClosingEquationType.
        OPEN,  # element_mass_balance=['Mg', ''],
        initial_feed_mass_balance=["Cl-"],
    )
    assert_solution(solution, solution_ref, tol={"pH": 1e-2})
    assert_solid(solution, solution_ref, tol={"si": 1e-1})
示例#19
0
def test_phreeqpython_baco3_baso4_closed():
    fname = inspect.stack()[0][3]
    comp_dict = {"BaCO3": 1.0, "BaSO4": 1.0}
    solution_ref = REF_SOLUTIONS[fname][0]
    solution = solve_solution(
        comp_dict,
        close_type=ClosingEquationType.CARBON_TOTAL,
        carbon_total=comp_dict["BaCO3"],
        element_mass_balance=["Ba", "S"],
    )
    assert_solution(solution, solution_ref, tol={"pH": 1e-2})
    assert_solid(solution, solution_ref, tol={"si": 1e-2})
示例#20
0
def test_phreeqpython_baco3_cacl2_closed_5_2():
    fname = inspect.stack()[0][3]
    comp_dict = {"BaCO3": 5.0, "CaCl2": 2.0}
    solution_ref1 = REF_SOLUTIONS[fname][0]
    solution = solve_solution(
        comp_dict,
        initial_feed_mass_balance=["Cl-"],
        close_type=ClosingEquationType.CARBON_TOTAL,
        carbon_total=5.0,
    )
    assert_solution(solution, solution_ref1, tol={"pH": 1e-2})
    assert_solid(solution, solution_ref1)
    pyequion.print_solution(solution)

    solution_ref2 = REF_SOLUTIONS[fname][1]
    solution = solve_solution(
        comp_dict,
        close_type=ClosingEquationType.OPEN,
        initial_feed_mass_balance=["Cl-"],
    )
    assert_solution(solution, solution_ref2, tol={"pH": 1e-2})
    assert_solid(solution, solution_ref2, tol={"si": 1e-1})
示例#21
0
def test_phreeqpython_cacl2_baco3_nahco3_closed():
    fname = inspect.stack()[0][3]
    comp_dict = {"CaCl2": 10.0, "BaCO3": 10.0, "NaHCO3": 10.0}
    solution_ref = REF_SOLUTIONS[fname][0]
    c_tot = comp_dict["BaCO3"] + comp_dict["NaHCO3"]
    solution = solve_solution(
        comp_dict,
        close_type=ClosingEquationType.CARBON_TOTAL,
        carbon_total=c_tot,
        initial_feed_mass_balance=["Cl-"],
    )
    print("")
    assert_solid(solution, solution_ref)
示例#22
0
def test_phreeqpython_cacl2_caco3_closed():
    fname = inspect.stack()[0][3]
    comp_dict = {"CaCO3": 80.0, "CaCl2": 33.25}
    solution_ref = REF_SOLUTIONS[fname][0]
    solution = solve_solution(
        comp_dict,
        close_type=ClosingEquationType.OPEN,
        initial_feed_mass_balance=["Cl-"],
        element_mass_balance=["Ca"],
    )
    assert_solution(solution, solution_ref, tol={"pH": 1e-2, "I": 1e-1})
    print("")
    assert_solid(solution, solution_ref)
示例#23
0
def test_phreeqpython_gibbsite_closed_open():
    fname = inspect.stack()[0][3]
    comp_dict = {"Al(OH)3": 10.0, "NaCl": 10.0}
    solution_ref1 = REF_SOLUTIONS[fname][0]
    solution = solve_solution(
        comp_dict,
        close_type=ClosingEquationType.NONE,
        element_mass_balance=["Al", "Na"],
        initial_feed_mass_balance=["Cl-"],
    )
    assert_solution(solution, solution_ref1, tol={"pH": 1e-2})
    assert_solid(solution, solution_ref1, tol={"si": 1e-1})

    solution_ref2 = REF_SOLUTIONS[fname][1]
    solution = solve_solution(
        comp_dict,
        close_type=ClosingEquationType.OPEN,
        element_mass_balance=["Al", "Na"],
        initial_feed_mass_balance=["Cl-"],
    )
    assert_solution(solution, solution_ref2, tol={"pH": 1e-2})
    assert_solid(solution, solution_ref2, tol={"si": 1e-1})
def main_check_jit():
    pyequion.jit_compile_functions()

    sys_eq = pyequion.create_equilibrium(feed_compounds=["CaCl2"],
                                         initial_feed_mass_balance=["Cl-"])
    solution = pyequion.solve_solution(
        {"CaCl2": 1 * 1e3},
        sys_eq,
        activity_model_type="debye",
    )
    print("end first call")

    tstart = time.time()
    solution = pyequion.solve_solution(
        {"CaCl2": 1 * 1e3},
        sys_eq,
        activity_model_type="debye",
    )
    print("Elapsed time = ", time.time() - tstart, solution.pH)

    args = (np.array([1.0]), 25 + 273.15, np.nan)
    tstart = time.time()
    solution = pyequion.solve_equilibrium(sys_eq, args=args)
    print("Elapsed time = ", time.time() - tstart, solution.pH)

    quit()

    tstart = time.time()
    cIn_span = np.geomspace(1e-3, 3.0, 1)
    gamma_mean = np.empty_like(cIn_span)
    for i, c in enumerate(cIn_span):
        solution = pyequion.solve_solution(
            {"CaCl2": c * 1e3},
            sys_eq,
            activity_model_type="debye",
        )
        gamma_mean[i] = pyequion.get_mean_activity_coeff(solution, "CaCl2")  # pylint: disable=unsupported-assignment-operation
    print("Elapsed time = ", time.time() - tstart)
    print(gamma_mean)
示例#25
0
def test_phreeqpython_barite_whiterite_calcite_closed_open():
    fname = inspect.stack()[0][3]
    comp_dict = {"BaCO3": 80.0, "CaCl2": 33.25, "NaHSO4": 20.0}
    solution_ref1 = REF_SOLUTIONS[fname][0]
    solution = solve_solution(
        comp_dict,
        close_type=ClosingEquationType.NONE,
        element_mass_balance=["Ba", "Ca", "Na", "S", "C"],
        initial_feed_mass_balance=["Cl-"],
    )
    assert_solution(solution, solution_ref1, tol={"pH": 1e-2})
    assert_solid(solution, solution_ref1, tol={"si": 1e-1})

    solution_ref2 = REF_SOLUTIONS[fname][1]
    solution = solve_solution(
        comp_dict,
        close_type=ClosingEquationType.OPEN,
        element_mass_balance=["Ba", "Ca", "Na", "S"],
        initial_feed_mass_balance=["Cl-"],
    )
    assert_solution(solution, solution_ref2, tol={"pH": 1e-2})
    assert_solid(solution, solution_ref2, tol={"si": 1e-1})
示例#26
0
def test_phreeqpython_baso4_closed():
    fname = inspect.stack()[0][3]
    """
    Low accuracy!
    """
    comp_dict = {"BaSO4": 15.0}
    solution_ref = REF_SOLUTIONS[fname][0]
    solution = solve_solution(
        comp_dict,
        close_type=ClosingEquationType.NONE,
        element_mass_balance=["Ba", "S"],
    )
    assert_solution(solution, solution_ref, tol={"pH": 1e-2})
    assert_solid(solution, solution_ref, tol={"si": 1e-2})
示例#27
0
def test_phreeqpython_caco3_closed_Thotter():
    fname = inspect.stack()[0][3]
    """Higher Temperature starts to introduce error...
    Need to implement the delta_h van Hoff for the species that does not analytic log_K(T)
    """
    TC = 50.0
    comp_dict = {"CaCO3": 5.0}
    solution_ref = REF_SOLUTIONS[fname][0]
    solution = solve_solution(
        comp_dict,
        close_type=ClosingEquationType.CARBON_TOTAL,
        carbon_total=comp_dict["CaCO3"],
        TC=TC,
    )
    assert_solution(solution, solution_ref, tol={"pH": 1e-2})
    assert_solid(solution, solution_ref, tol={"si": 1e-1})
示例#28
0
def _test_phreeqpython_cacl2_caso4_closed():
    "Error in Gypsum"
    fname = inspect.stack()[0][3]
    "Small error in Gypsum"
    comp_dict = {"BaCO3": 100.0, "CaSO4": 50.0}
    solution_ref = REF_SOLUTIONS[fname][0]
    solution = solve_solution(
        comp_dict,
        close_type=ClosingEquationType.CARBON_TOTAL,
        carbon_total=comp_dict["BaCO3"],
        element_mass_balance=["Ba", "Ca", "S"],
    )
    assert_solution(solution, solution_ref, tol={"pH": 1e-2, "I": 1e-1})
    print("")
    assert_solid(solution, solution_ref,
                 tol={"si": 1e-1})  # small error in gypsum...
def main_cacl2_meancoeff():

    sys_eq = pyequion.create_equilibrium(feed_compounds=["CaCl2"],
                                         initial_feed_mass_balance=["Cl-"])

    cIn_span = np.geomspace(1e-3, 3.0, 61)
    methods = ["debye", "bromley", "sit", "pitzer"]

    solutions = {
        key: [
            pyequion.solve_solution({"CaCl2": c * 1e3},
                                    sys_eq,
                                    activity_model_type=key) for c in cIn_span
        ]
        for key in methods
    }
    gamma_means = {
        key: np.array([
            pyequion.get_mean_activity_coeff(sol, "CaCl2")
            for sol in solutions[key]
        ])
        for key in methods
    }

    I = {key: np.array([sol.I for sol in solutions[key]]) for key in methods}

    I_exp_cnv = conv_c2I_X1A2(data_exp_raw_collected[:, 0])

    plot_opts = {
        "debye": "-k",
        "bromley": ":k",
        "sit": "-.k",
        "pitzer": "--k",
    }
    plt.figure()
    plt.plot(I_exp_cnv, data_exp_raw_collected[:, 1], "sk", label="exp")
    for key in methods:
        plt.plot(I[key], gamma_means[key], plot_opts[key], label=key)
    plt.legend()

    plt.show()

    return
示例#30
0
def test_precip_Al2SO43_K3PO4_CaCl2():
    EXPECTED = {
        "pH": (2.29, 3.0),
        "I": (187.467e-3, 3.0),
        "sat-conc": {
            "Gypsum": (8.78 * 1e-3, 25.0),
        },
    }
    comp_dict = {"Al2(SO4)3": 30.0, "H3PO4": 15.0, "CaCl2": 30.0}
    # comp_dict = {'NaHCO3':2.0, 'CaCl2':1.0}
    solution = solve_solution(
        comp_dict,
        element_mass_balance=["Al", "P", "Ca", "S"],
        initial_feed_mass_balance=["Cl-"],
        close_type=ClosingEquationType.NONE,
        allow_precipitation=True,
    )

    assert_solution_result(solution, EXPECTED)
    for tag in EXPECTED["sat-conc"]:
        assert compare_with_expected_perc_tuple(
            solution.preciptation_conc[tag], EXPECTED["sat-conc"][tag])