Skip to main content
Docs

Search guides and API endpoints, for example “Idempotency-Key” or “submit job”.

    Tools · Fluids & Thermodynamics

    Solid–Liquid Equilibrium / Eutectic Diagram

    The liquidus curves and eutectic point of a binary organic mixture, or a solute's solubility against temperature, for crystallization and formulation work.

    Updated October 1, 2026

    On this page

    Prices, workflows, and method papersOpen in the app

    This tool computes solid–liquid equilibrium for a two-component organic system: where each component starts to crystallize as the mixture cools, the eutectic point where both do, and how a solute's solubility changes with temperature. Use it for crystallization, purification, and formulation decisions. It runs on CPU.

    How it works

    For each component crystallizing as a pure solid, the solubility equation relates its liquid-phase mole fraction x and activity coefficient γ to its melting point T_m, enthalpy of fusion ΔH_fus, and (optionally) the heat-capacity difference ΔC_p between liquid and solid:

    ln(x·γ) = −(ΔH_fus/R)(1/T − 1/T_m) + (ΔC_p/R)[(T_m/T − 1) − ln(T_m/T)]

    • Simple eutectic: the solids are taken as pure and immiscible; solid solutions, cocrystals, and polymorphs aren't modeled.
    • Liquid non-ideality (activity_model): ideal (γ = 1, the default), nrtl (published parameters, or your own fitted pair from VLE Parameter Regression), or unifac (predicted from structure).
    • Melting data: your tm_k and hfus_j_mol are used when given; otherwise they are looked up in the open chemicals database. The source of each value is recorded.

    Modes

    modeYou get
    diagram (default)Both liquidus branches across composition (grid_points, default 51), the stable liquidus, and the eutectic
    solubilityThe solubility of the first component in the second from temperature_min_k to temperature_max_k, with the ideal solubility alongside for comparison

    Inputs

    components: exactly two rows, each with a name (or SMILES) and, optionally, tm_k, hfus_j_mol, and dcp_j_mol_k. The properties table from Group-Contribution Properties also works, though its estimated melting data are rough.

    Outputs

    FileModeContents
    liquidus.csvdiagramThe liquidus temperature at each composition, which solid forms first, and both branches
    eutectic.csvdiagramThe eutectic composition and temperature
    solubility.csvsolubilitySolubility (mole fraction), ideal solubility, and activity coefficient at each temperature
    result.jsonbothModel, assumptions, melting data and their sources, and warnings

    Each row has a status. A failed point where x·γ exceeds 1 near the melting point can mean the liquids separate into two phases, which this model doesn't handle.

    VLE / Flash for vapor–liquid equilibrium, Hansen Solubility Parameters for solvent screening, and PHREEQC Aqueous Speciation for minerals in water.

    Run it from the API

    Submit with Submit a job and the job_type below. Price it first with Estimate job reservation cost: submitting reserves that amount from your wallet, and the charge settles at the actual runtime.

    Solid–Liquid Equilibrium / Eutectic Diagram sle-phase-diagram

    Job type
    sle-phase-diagram
    Hardware
    cpu (default)
    Typical runtime
    5 min on CPU

    Payload

    Payload fields
    FieldTypeDescription
    modestring

    One of: "diagram", "solubility"

    componentsrequiredtableValue
    activity_modelstring

    One of: "ideal", "nrtl", "unifac"

    binary_paramstableValue
    grid_pointsinteger

    Limits: ≥ 3, ≤ 201

    temperature_min_knumber

    Limits: > 0, ≤ 1000

    temperature_max_knumber

    Limits: > 0, ≤ 1000

    temperature_pointsinteger

    Limits: ≥ 2, ≤ 201

    Example

    from cognichem_client import CogniChem
    
    client = CogniChem.from_env()  # reads COGNICHEM_API_KEY
    payload = {
        "mode": "diagram",
        "activity_model": "ideal",
        "grid_points": 21,
        "components": [
            {"name": "naphthalene", "tm_k": 353.35, "hfus_j_mol": 19010},
            {"name": "biphenyl"},
        ],
    }
    
    estimate = client.jobs.estimate(job_type="sle-phase-diagram", payload=payload, resource="cpu")
    print(f"Reserves ${estimate.cost:.2f}")
    
    job = client.jobs.submit(
        job_name="my-sle-phase-diagram-run",
        job_type="sle-phase-diagram",
        payload=payload,
        resource="cpu",
    )
    status = client.jobs.wait(job.process_id)
    if status.status == "completed":
        client.jobs.result(job.process_id, save_path=".")

    Sample data from the job catalog; long values are shortened here. Each job_name must be unique among your jobs.

    Workflow inputs

    • Table (list) · optionalCSV, JSON
    • Table (list) · optionalCSV, JSON

    Workflow outputs

    • ArchiveZIP
    • TableCSV
    • TableCSV
    • TableCSV