Skip to main content
Glama
gabrielserrao

pyResToolbox MCP Server

co2_brine_mutual_solubility

Calculate CO2-brine mutual solubilities and properties for sequestration, enhanced oil recovery, and geothermal applications using pressure, temperature, and salinity inputs.

Instructions

Calculate CO2-brine mutual solubilities and properties.

CRITICAL CO2-BRINE SYSTEM TOOL - Computes comprehensive properties for CO2-saturated brine systems using the Duan & Sun (2003) model. Essential for CO2 sequestration, CO2-EOR, and geothermal applications. Accounts for mutual solubility (CO2 in brine, H2O in CO2-rich phase).

Parameters:

  • pres (float, required): Pressure in psia (field) or bar (metric). Must be > 0. Typical: 1000-5000 psia. Example: 3000.0 psia.

  • temp (float, required): Temperature in °F (field) or °C (metric). Typical: 100-400°F. Example: 180.0°F.

  • ppm (float, required): Salinity in parts per million (ppm) NaCl. Typical: 0-200000 ppm. Example: 50000 ppm (5 wt%).

  • metric (bool, optional, default=False): Unit system flag. False = field units (psia, °F), True = metric (bar, °C).

  • cw_sat (bool, optional, default=True): Compressibility calculation flag. True = saturated compressibility, False = undersaturated.

Properties Calculated:

  • Phase Equilibrium:

    • Aqueous phase mole fractions (x_CO2, x_H2O)

    • Vapor phase mole fractions (y_CO2, y_H2O)

    • Salt mole fraction

  • Densities:

    • CO2-rich gas density (gm/cm³)

    • Brine CO2-saturated density (gm/cm³)

    • Brine pure density (gm/cm³)

    • Fresh water density (gm/cm³)

  • Viscosities:

    • Brine CO2-saturated viscosity (cP)

    • Brine pure viscosity (cP)

    • Fresh water viscosity (cP)

  • Formation Volume Factors:

    • Bw CO2-saturated (rb/stb)

    • Bw pure (rb/stb)

    • Bw fresh (rb/stb)

  • Compressibility:

    • Undersaturated compressibility (1/psi or 1/bar)

    • Saturated compressibility (1/psi or 1/bar)

  • Solution GOR: CO2 dissolved in brine (scf/stb or m³/m³)

Mutual Solubility: CO2-brine systems exhibit mutual solubility:

  • CO2 dissolves in brine (increases with pressure, decreases with salinity)

  • H2O dissolves in CO2-rich phase (increases with temperature)

  • Both solubilities depend on pressure, temperature, and salinity

Physics: Uses Duan & Sun (2003) model for CO2-H2O-NaCl systems accounting for:

  • Pressure effects on solubility (higher P = more CO2 dissolved)

  • Temperature effects (higher T = less CO2 dissolved, more H2O in vapor)

  • Salinity effects (higher salinity = less CO2 dissolved)

  • Mutual solubility (both phases contain both components)

Applications:

  • CO2 Sequestration: CCS project design, storage capacity evaluation

  • CO2-EOR: Enhanced oil recovery with CO2 injection, miscibility studies

  • Geothermal: CO2-based geothermal systems, supercritical CO2

  • Aquifer Storage: Underground CO2 storage capacity, leakage assessment

  • Material Balance: CO2-brine material balance calculations

Salinity Conversion:

  • 1 wt% = 10,000 ppm

  • Seawater ≈ 35,000 ppm (3.5 wt%)

  • Formation brine: 50,000-200,000 ppm (5-20 wt%)

Returns: Dictionary with:

  • phase_equilibrium (dict): Mole fractions in aqueous and vapor phases

  • densities (dict): All density values (CO2-rich, saturated, pure, fresh)

  • viscosities (dict): All viscosity values (saturated, pure, fresh)

  • formation_volume_factors (dict): Bw values (saturated, pure, fresh)

  • compressibility (dict): Undersaturated and saturated compressibility

  • solution_gor_co2 (float): CO2 dissolved in brine

  • viscosibility_per_bar_or_psi (float): Viscosibility coefficient

  • method (str): "Duan & Sun (2003) CO2-H2O-NaCl model"

  • units (str): "metric" or "field"

  • note (str): Usage guidance

  • inputs (dict): Echo of input parameters

Common Mistakes:

  • Using wrong unit system (check metric flag)

  • Salinity in wt% instead of ppm (must convert: ppm = wt% × 10000)

  • Pressure in barg/psig instead of psia (must be absolute)

  • Temperature in wrong units (check metric flag)

  • Not accounting for mutual solubility (both phases contain both components)

  • Using wrong compressibility (saturated vs undersaturated)

Example Usage (Field Units):

{
    "pres": 3000.0,
    "temp": 180.0,
    "ppm": 50000,
    "metric": False,
    "cw_sat": True
}

Result: CO2 solubility in brine ≈ 20-40 scf/stb, H2O in CO2-rich phase ≈ 0.1-1 mol%.

Note: CO2-brine mutual solubility is critical for CCS and CO2-EOR projects. Always use correct unit system (field vs metric). The model accounts for mutual solubility which is significant at high pressures and temperatures. Salinity significantly reduces CO2 solubility - use correct formation water salinity.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
requestYes

Implementation Reference

  • The main handler function decorated with @mcp.tool(). Implements CO2-brine mutual solubility using pyrestoolbox.brine.CO2_Brine_Mixture class from Duan & Sun (2003) model. Handles input validation via Pydantic and returns comprehensive phase properties, densities, viscosities, etc.
    @mcp.tool()
    def co2_brine_mutual_solubility(request: CO2BrineMixtureRequest) -> dict:
        """Calculate CO2-brine mutual solubilities and properties.
    
        **CRITICAL CO2-BRINE SYSTEM TOOL** - Computes comprehensive properties for CO2-saturated
        brine systems using the Duan & Sun (2003) model. Essential for CO2 sequestration,
        CO2-EOR, and geothermal applications. Accounts for mutual solubility (CO2 in brine,
        H2O in CO2-rich phase).
    
        **Parameters:**
        - **pres** (float, required): Pressure in psia (field) or bar (metric). Must be > 0.
          Typical: 1000-5000 psia. Example: 3000.0 psia.
        - **temp** (float, required): Temperature in °F (field) or °C (metric).
          Typical: 100-400°F. Example: 180.0°F.
        - **ppm** (float, required): Salinity in parts per million (ppm) NaCl.
          Typical: 0-200000 ppm. Example: 50000 ppm (5 wt%).
        - **metric** (bool, optional, default=False): Unit system flag.
          False = field units (psia, °F), True = metric (bar, °C).
        - **cw_sat** (bool, optional, default=True): Compressibility calculation flag.
          True = saturated compressibility, False = undersaturated.
    
        **Properties Calculated:**
        - **Phase Equilibrium:**
          - Aqueous phase mole fractions (x_CO2, x_H2O)
          - Vapor phase mole fractions (y_CO2, y_H2O)
          - Salt mole fraction
        - **Densities:**
          - CO2-rich gas density (gm/cm³)
          - Brine CO2-saturated density (gm/cm³)
          - Brine pure density (gm/cm³)
          - Fresh water density (gm/cm³)
        - **Viscosities:**
          - Brine CO2-saturated viscosity (cP)
          - Brine pure viscosity (cP)
          - Fresh water viscosity (cP)
        - **Formation Volume Factors:**
          - Bw CO2-saturated (rb/stb)
          - Bw pure (rb/stb)
          - Bw fresh (rb/stb)
        - **Compressibility:**
          - Undersaturated compressibility (1/psi or 1/bar)
          - Saturated compressibility (1/psi or 1/bar)
        - **Solution GOR:** CO2 dissolved in brine (scf/stb or m³/m³)
    
        **Mutual Solubility:**
        CO2-brine systems exhibit mutual solubility:
        - CO2 dissolves in brine (increases with pressure, decreases with salinity)
        - H2O dissolves in CO2-rich phase (increases with temperature)
        - Both solubilities depend on pressure, temperature, and salinity
    
        **Physics:**
        Uses Duan & Sun (2003) model for CO2-H2O-NaCl systems accounting for:
        - Pressure effects on solubility (higher P = more CO2 dissolved)
        - Temperature effects (higher T = less CO2 dissolved, more H2O in vapor)
        - Salinity effects (higher salinity = less CO2 dissolved)
        - Mutual solubility (both phases contain both components)
    
        **Applications:**
        - **CO2 Sequestration:** CCS project design, storage capacity evaluation
        - **CO2-EOR:** Enhanced oil recovery with CO2 injection, miscibility studies
        - **Geothermal:** CO2-based geothermal systems, supercritical CO2
        - **Aquifer Storage:** Underground CO2 storage capacity, leakage assessment
        - **Material Balance:** CO2-brine material balance calculations
    
        **Salinity Conversion:**
        - 1 wt% = 10,000 ppm
        - Seawater ≈ 35,000 ppm (3.5 wt%)
        - Formation brine: 50,000-200,000 ppm (5-20 wt%)
    
        **Returns:**
        Dictionary with:
        - **phase_equilibrium** (dict): Mole fractions in aqueous and vapor phases
        - **densities** (dict): All density values (CO2-rich, saturated, pure, fresh)
        - **viscosities** (dict): All viscosity values (saturated, pure, fresh)
        - **formation_volume_factors** (dict): Bw values (saturated, pure, fresh)
        - **compressibility** (dict): Undersaturated and saturated compressibility
        - **solution_gor_co2** (float): CO2 dissolved in brine
        - **viscosibility_per_bar_or_psi** (float): Viscosibility coefficient
        - **method** (str): "Duan & Sun (2003) CO2-H2O-NaCl model"
        - **units** (str): "metric" or "field"
        - **note** (str): Usage guidance
        - **inputs** (dict): Echo of input parameters
    
        **Common Mistakes:**
        - Using wrong unit system (check metric flag)
        - Salinity in wt% instead of ppm (must convert: ppm = wt% × 10000)
        - Pressure in barg/psig instead of psia (must be absolute)
        - Temperature in wrong units (check metric flag)
        - Not accounting for mutual solubility (both phases contain both components)
        - Using wrong compressibility (saturated vs undersaturated)
    
        **Example Usage (Field Units):**
        ```python
        {
            "pres": 3000.0,
            "temp": 180.0,
            "ppm": 50000,
            "metric": False,
            "cw_sat": True
        }
        ```
        Result: CO2 solubility in brine ≈ 20-40 scf/stb, H2O in CO2-rich phase ≈ 0.1-1 mol%.
    
        **Note:** CO2-brine mutual solubility is critical for CCS and CO2-EOR projects.
        Always use correct unit system (field vs metric). The model accounts for mutual
        solubility which is significant at high pressures and temperatures. Salinity
        significantly reduces CO2 solubility - use correct formation water salinity.
        """
        # Create CO2_Brine_Mixture object
        mixture = brine.CO2_Brine_Mixture(
            pres=request.pres,
            temp=request.temp,
            ppm=request.ppm,
            metric=request.metric,
            cw_sat=request.cw_sat
        )
    
        # Extract all properties, handling None values
        result = {
            "phase_equilibrium": {
                "aqueous_phase_mole_fractions": {
                    "x_co2": float(mixture.x[0]) if mixture.x is not None else 0.0,
                    "x_h2o": float(mixture.x[1]) if mixture.x is not None and len(mixture.x) > 1 else 1.0,
                },
                "vapor_phase_mole_fractions": {
                    "y_co2": float(mixture.y[0]) if mixture.y is not None else 0.0,
                    "y_h2o": float(mixture.y[1]) if mixture.y is not None and len(mixture.y) > 1 else 0.0,
                },
                "salt_mole_fraction": float(mixture.xSalt) if mixture.xSalt is not None else 0.0,
            },
            "densities": {
                "co2_rich_gas_gm_cm3": float(mixture.rhoGas) if mixture.rhoGas is not None else 0.0,
                "brine_co2_saturated_gm_cm3": float(mixture.bDen[0]) if mixture.bDen is not None else 0.0,
                "brine_pure_gm_cm3": float(mixture.bDen[1]) if mixture.bDen is not None and len(mixture.bDen) > 1 else 0.0,
                "fresh_water_gm_cm3": float(mixture.bDen[2]) if mixture.bDen is not None and len(mixture.bDen) > 2 else 0.0,
            },
            "viscosities": {
                "brine_co2_saturated_cP": float(mixture.bVis[0]) if mixture.bVis is not None else 0.0,
                "brine_pure_cP": float(mixture.bVis[1]) if mixture.bVis is not None and len(mixture.bVis) > 1 else 0.0,
                "fresh_water_cP": float(mixture.bVis[2]) if mixture.bVis is not None and len(mixture.bVis) > 2 else 0.0,
            },
            "viscosibility_per_bar_or_psi": float(mixture.bVisblty) if mixture.bVisblty is not None else 0.0,
            "formation_volume_factors": {
                "bw_co2_saturated": float(mixture.bw[0]) if mixture.bw is not None else 1.0,
                "bw_pure": float(mixture.bw[1]) if mixture.bw is not None and len(mixture.bw) > 1 else 1.0,
                "bw_fresh": float(mixture.bw[2]) if mixture.bw is not None and len(mixture.bw) > 2 else 1.0,
            },
            "solution_gor_co2": float(mixture.Rs) if mixture.Rs is not None else 0.0,
            "compressibility": {
                "undersaturated_per_bar_or_psi": float(mixture.Cf_usat) if mixture.Cf_usat is not None else 0.0,
                "saturated_per_bar_or_psi": float(mixture.Cf_sat) if mixture.Cf_sat is not None else 0.0,
            },
            "method": "Duan & Sun (2003) CO2-H2O-NaCl model",
            "units": "metric" if request.metric else "field",
            "inputs": request.model_dump(),
            "note": "Critical for CO2 sequestration, EOR, and geothermal applications"
        }
    
        return result
  • Pydantic model defining the input schema with validation for pres, temp, ppm, metric, cw_sat parameters, including example and descriptions.
    class CO2BrineMixtureRequest(BaseModel):
        """Request model for CO2-brine mutual solubility calculation."""
    
        model_config = ConfigDict(
            json_schema_extra={
                "example": {
                    "pres": 3000.0,
                    "temp": 150.0,
                    "ppm": 50000.0,
                    "metric": False,
                    "cw_sat": 0.0,
                }
            }
        )
    
        pres: float = Field(..., gt=0, description="Pressure (psia if metric=False, bar if metric=True)")
        temp: float = Field(..., gt=0, description="Temperature (degF if metric=False, degC if metric=True)")
        ppm: float = Field(..., ge=0, description="Brine salinity (ppm)")
        metric: bool = Field(False, description="Use metric units (True) or field units (False)")
        cw_sat: float = Field(
            0.0, ge=0, description="Cw at saturation pressure (1/psi or 1/bar) - 0 for auto-calculate"
        )
  • Imports register_brine_tools from brine_tools.py and calls it with the MCP server instance, which defines and registers the co2_brine_mutual_solubility tool (along with calculate_brine_properties).
    from .tools.brine_tools import register_brine_tools
    from .tools.layer_tools import register_layer_tools
    from .tools.library_tools import register_library_tools
    
    register_oil_tools(mcp)
    register_gas_tools(mcp)
    register_inflow_tools(mcp)
    register_simtools_tools(mcp)
    register_brine_tools(mcp)
    register_layer_tools(mcp)
    register_library_tools(mcp)
  • The register_brine_tools function where the tool functions are defined with @mcp.tool() decorators inside it, effectively registering them when called.
    def register_brine_tools(mcp: FastMCP) -> None:
        """Register all brine-related tools with the MCP server."""

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/gabrielserrao/pyrestoolbox-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server