Version: dev

TwoProductSOA

Two-product model for secondary organic aerosol (SOA) formation (Odum et al., 1996). Represents the complex mixture of oxidation products from a reactive organic gas (ROG) as two lumped surrogate products that partition between gas and aerosol phases according to an ideal-solution absorptive-partitioning equilibrium. Yields and saturation concentrations correspond to alpha-pinene oxidation from Seinfeld and Pandis (2006) Table 14.12.

Domain
aerosol
Subdomain
organic
Type
model
.esm schema
1.0.0
Source
components/aerosol/organic/two_product_soa.esm
Tags
#aerosol #organic #model #soa #two-product #odum

Description

Two-product model for secondary organic aerosol (SOA) formation (Odum et al., 1996). Represents the complex mixture of oxidation products from a reactive organic gas (ROG) as two lumped surrogate products that partition between gas and aerosol phases according to an ideal-solution absorptive-partitioning equilibrium. Yields and saturation concentrations correspond to alpha-pinene oxidation from Seinfeld and Pandis (2006) Table 14.12.

Reference

Seinfeld, J. H. and Pandis, S. N. (2006) Atmospheric Chemistry and Physics, 2nd Edition, Chapter 14, Section 14.5.2, Eqs. 14.39 and 14.43 — two-product SOA model. Migrated from Aerosol.jl src/organic_aerosol.jl TwoProductSOA (esm-q3b).

_source_ref: Aerosol.jl@main:src/organic_aerosol.jl:197

Upstream TwoProductSOA is an MTK @component with four parameters (a_1, a_2, c_sat_1, c_sat_2) and four variables (ΔROG, c_aer, Y, ΔROG_threshold). The three algebraic equations are: • Y ~ c_aer * (a_1 / (c_aer + c_sat_1) + a_2 / (c_aer + c_sat_2)) [Eq. 14.43] • ΔROG_threshold ~ 1 / (a_1 / c_sat_1 + a_2 / c_sat_2) [Eq. 14.39] • c_aer ~ Y * ΔROG [mass balance]

With ΔROG as the external input (parameter in ESM), the system has 3 unknowns (c_aer, Y, ΔROG_threshold) and 3 equations. However, Eq. 14.43 and the mass balance are implicitly coupled (c_aer appears on the RHS of Eq. 14.43, Y appears on the RHS of the mass balance). The ESS topological substitution loop raises SimulationError on cycles, so implicit equations cannot be used directly.

Resolution — explicit quadratic formula: substituting Y = c_aer / ΔROG from the mass balance into Eq. 14.43 and rearranging gives: 1/ΔROG = a_1/(c_aer + c_sat_1) + a_2/(c_aer + c_sat_2) Clearing denominators yields the quadratic in c_aer: c_aer^2 + Bc_aer + C = 0 where B = c_sat_1 + c_sat_2 − ΔROG(a_1 + a_2) C = c_sat_1c_sat_2 − ΔROG(a_1c_sat_2 + a_2c_sat_1) The physical (positive) root is: c_aer = (−B + sqrt(B^2 − 4C)) / 2 Note that −B = ΔROG*(a_1+a_2) − c_sat_1 − c_sat_2, and B^2 = (−B)^2, so the formula implemented here is: c_aer = (ΔROG*(a_1+a_2) − c_sat_1 − c_sat_2 + sqrt((ΔROG*(a_1+a_2) − c_sat_1 − c_sat_2)^2 + 4*(ΔROG*(a_1c_sat_2+a_2c_sat_1) − c_sat_1*c_sat_2))) / 2 With c_aer explicit, Y = c_aer / ΔROG is also explicit. ΔROG_threshold depends only on parameters.

This gives three explicit algebraic equations with no cycles — the ESS substitution loop handles them without a DAE solver.

Domain constraint: valid for ΔROG >= ΔROG_threshold (~1.27e-7 kg/m^3 for alpha-pinene defaults); below the threshold the quadratic gives c_aer < 0 which is unphysical (no aerosol forms). Tests use ΔROG well above the threshold.

Default parameters are for alpha-pinene oxidation from Table 14.12 of Seinfeld and Pandis (2006).

Tolerance rationale (model-level rel=1e-9): all three outputs are algebraic functions of parameters; no ODE integration. Floating-point round-off is ~1e-15. 1e-9 leaves comfortable headroom._

Parameters

NameUnitsDefaultDescription
a_110.038Stoichiometric mass yield of product 1 (dimensionless). Alpha-pinene value from Seinfeld and Pandis (2006) Table 14.12.
a_210.326Stoichiometric mass yield of product 2 (dimensionless). Alpha-pinene value from Seinfeld and Pandis (2006) Table 14.12.
c_sat_1kg/m^35.8e-09Effective saturation concentration of lumped product 1. Alpha-pinene value from Seinfeld and Pandis (2006) Table 14.12.
c_sat_2kg/m^32.5e-07Effective saturation concentration of lumped product 2. Alpha-pinene value from Seinfeld and Pandis (2006) Table 14.12.
delta_ROGkg/m^31e-05Reacted reactive organic gas (ROG) concentration. Input parameter — drives SOA formation. Must be >= delta_ROG_threshold for physical (non-negative) c_aer.

Observed

NameUnitsDefaultDescription
c_aerkg/m^3Total organic aerosol mass concentration produced. Computed via the explicit quadratic solution to Eqs. 14.43 and 14.39.
Y1Aerosol mass yield (dimensionless). Fraction of reacted ROG that partitions into the aerosol phase: Y = c_aer / ΔROG.
delta_ROG_thresholdkg/m^3Threshold reacted ROG concentration for binary-solution SOA formation (Eq. 14.39). Below this threshold, no aerosol forms. Depends only on the model parameters, not on delta_ROG.

Observed expressions

$$ c_{aer} = 0.5 \cdot \left(delta_{ROG} \cdot \left(a_{1} + a_{2}\right) + \left(-1\right) \cdot \left(c_{sat\,1} + c_{sat\,2}\right) + \sqrt{\left(delta_{ROG} \cdot \left(a_{1} + a_{2}\right) + \left(-1\right) \cdot \left(c_{sat\,1} + c_{sat\,2}\right)\right)^{2} + 4 \cdot \left(delta_{ROG} \cdot \left(a_{1} \cdot c_{sat\,2} + a_{2} \cdot c_{sat\,1}\right) + \left(-1\right) \cdot c_{sat\,1} \cdot c_{sat\,2}\right)}\right) $$

Total organic aerosol mass concentration produced. Computed via the explicit quadratic solution to Eqs. 14.43 and 14.39.

$$ Y = \frac{c_{aer}}{delta_{ROG}} $$

Aerosol mass yield (dimensionless). Fraction of reacted ROG that partitions into the aerosol phase: Y = c_aer / ΔROG.

$$ delta_{ROG\,threshold} = \frac{1}{\frac{a_{1}}{c_{sat\,1}} + \frac{a_{2}}{c_{sat\,2}}} $$

Threshold reacted ROG concentration for binary-solution SOA formation (Eq. 14.39). Below this threshold, no aerosol forms. Depends only on the model parameters, not on delta_ROG.

Analyses

rog_loading_sweep

Sweep reacted ROG concentration from 1e-6 to 1e-3 kg/m^3 to show how aerosol mass concentration and yield vary with ROG loading. Y approaches a_1+a_2=0.364 at high loading as both products are fully in the aerosol phase.

Time span: 0.0 → 1.0

Swept over: delta_ROG

Aerosol mass yield Y vs. reacted ROG concentration (log scale). Shows low yield near the formation threshold and approach to Y = a_1+a_2 = 0.364 at high loading.

Aerosol mass concentration c_aer vs. reacted ROG concentration (log-log scale). Shows nonlinear growth characteristic of the two-product absorptive partitioning framework.

Raw .esm

Raw .esm JSON (this component)
{
  "reference": {
    "citation": "Seinfeld, J. H. and Pandis, S. N. (2006) Atmospheric Chemistry and Physics, 2nd Edition, Chapter 14, Section 14.5.2, Eqs. 14.39 and 14.43 — two-product SOA model. Migrated from Aerosol.jl src/organic_aerosol.jl `TwoProductSOA` (esm-q3b).",
    "notes": "source_ref: Aerosol.jl@main:src/organic_aerosol.jl:197\n\nUpstream `TwoProductSOA` is an MTK `@component` with four parameters (a_1, a_2, c_sat_1, c_sat_2) and four variables (ΔROG, c_aer, Y, ΔROG_threshold). The three algebraic equations are:\n  • Y ~ c_aer * (a_1 / (c_aer + c_sat_1) + a_2 / (c_aer + c_sat_2))   [Eq. 14.43]\n  • ΔROG_threshold ~ 1 / (a_1 / c_sat_1 + a_2 / c_sat_2)               [Eq. 14.39]\n  • c_aer ~ Y * ΔROG                                                     [mass balance]\n\nWith ΔROG as the external input (parameter in ESM), the system has 3 unknowns (c_aer, Y, ΔROG_threshold) and 3 equations. However, Eq. 14.43 and the mass balance are implicitly coupled (c_aer appears on the RHS of Eq. 14.43, Y appears on the RHS of the mass balance). The ESS topological substitution loop raises SimulationError on cycles, so implicit equations cannot be used directly.\n\nResolution — explicit quadratic formula: substituting Y = c_aer / ΔROG from the mass balance into Eq. 14.43 and rearranging gives:\n  1/ΔROG = a_1/(c_aer + c_sat_1) + a_2/(c_aer + c_sat_2)\nClearing denominators yields the quadratic in c_aer:\n  c_aer^2 + B*c_aer + C = 0\nwhere\n  B = c_sat_1 + c_sat_2 − ΔROG*(a_1 + a_2)\n  C = c_sat_1*c_sat_2 − ΔROG*(a_1*c_sat_2 + a_2*c_sat_1)\nThe physical (positive) root is:\n  c_aer = (−B + sqrt(B^2 − 4C)) / 2\nNote that −B = ΔROG*(a_1+a_2) − c_sat_1 − c_sat_2, and B^2 = (−B)^2, so the formula implemented here is:\n  c_aer = (ΔROG*(a_1+a_2) − c_sat_1 − c_sat_2 + sqrt((ΔROG*(a_1+a_2) − c_sat_1 − c_sat_2)^2 + 4*(ΔROG*(a_1*c_sat_2+a_2*c_sat_1) − c_sat_1*c_sat_2))) / 2\nWith c_aer explicit, Y = c_aer / ΔROG is also explicit. ΔROG_threshold depends only on parameters.\n\nThis gives three explicit algebraic equations with no cycles — the ESS substitution loop handles them without a DAE solver.\n\nDomain constraint: valid for ΔROG >= ΔROG_threshold (~1.27e-7 kg/m^3 for alpha-pinene defaults); below the threshold the quadratic gives c_aer < 0 which is unphysical (no aerosol forms). Tests use ΔROG well above the threshold.\n\nDefault parameters are for alpha-pinene oxidation from Table 14.12 of Seinfeld and Pandis (2006).\n\nTolerance rationale (model-level rel=1e-9): all three outputs are algebraic functions of parameters; no ODE integration. Floating-point round-off is ~1e-15. 1e-9 leaves comfortable headroom."
  },
  "tolerance": {
    "rel": 1e-09
  },
  "variables": {
    "a_1": {
      "type": "parameter",
      "units": "1",
      "default": 0.038,
      "description": "Stoichiometric mass yield of product 1 (dimensionless). Alpha-pinene value from Seinfeld and Pandis (2006) Table 14.12."
    },
    "a_2": {
      "type": "parameter",
      "units": "1",
      "default": 0.326,
      "description": "Stoichiometric mass yield of product 2 (dimensionless). Alpha-pinene value from Seinfeld and Pandis (2006) Table 14.12."
    },
    "c_sat_1": {
      "type": "parameter",
      "units": "kg/m^3",
      "default": 5.8e-09,
      "description": "Effective saturation concentration of lumped product 1. Alpha-pinene value from Seinfeld and Pandis (2006) Table 14.12."
    },
    "c_sat_2": {
      "type": "parameter",
      "units": "kg/m^3",
      "default": 2.5e-07,
      "description": "Effective saturation concentration of lumped product 2. Alpha-pinene value from Seinfeld and Pandis (2006) Table 14.12."
    },
    "delta_ROG": {
      "type": "parameter",
      "units": "kg/m^3",
      "default": 1e-05,
      "description": "Reacted reactive organic gas (ROG) concentration. Input parameter — drives SOA formation. Must be >= delta_ROG_threshold for physical (non-negative) c_aer."
    },
    "c_aer": {
      "type": "unknown",
      "units": "kg/m^3",
      "description": "Total organic aerosol mass concentration produced. Computed via the explicit quadratic solution to Eqs. 14.43 and 14.39."
    },
    "Y": {
      "type": "unknown",
      "units": "1",
      "description": "Aerosol mass yield (dimensionless). Fraction of reacted ROG that partitions into the aerosol phase: Y = c_aer / ΔROG."
    },
    "delta_ROG_threshold": {
      "type": "unknown",
      "units": "kg/m^3",
      "description": "Threshold reacted ROG concentration for binary-solution SOA formation (Eq. 14.39). Below this threshold, no aerosol forms. Depends only on the model parameters, not on delta_ROG."
    }
  },
  "equations": [
    {
      "lhs": "delta_ROG_threshold",
      "rhs": {
        "op": "/",
        "args": [
          1,
          {
            "op": "+",
            "args": [
              {
                "op": "/",
                "args": [
                  "a_1",
                  "c_sat_1"
                ]
              },
              {
                "op": "/",
                "args": [
                  "a_2",
                  "c_sat_2"
                ]
              }
            ]
          }
        ]
      }
    },
    {
      "lhs": "c_aer",
      "rhs": {
        "op": "*",
        "args": [
          0.5,
          {
            "op": "+",
            "args": [
              {
                "op": "+",
                "args": [
                  {
                    "op": "*",
                    "args": [
                      "delta_ROG",
                      {
                        "op": "+",
                        "args": [
                          "a_1",
                          "a_2"
                        ]
                      }
                    ]
                  },
                  {
                    "op": "*",
                    "args": [
                      -1,
                      {
                        "op": "+",
                        "args": [
                          "c_sat_1",
                          "c_sat_2"
                        ]
                      }
                    ]
                  }
                ]
              },
              {
                "op": "sqrt",
                "args": [
                  {
                    "op": "+",
                    "args": [
                      {
                        "op": "^",
                        "args": [
                          {
                            "op": "+",
                            "args": [
                              {
                                "op": "*",
                                "args": [
                                  "delta_ROG",
                                  {
                                    "op": "+",
                                    "args": [
                                      "a_1",
                                      "a_2"
                                    ]
                                  }
                                ]
                              },
                              {
                                "op": "*",
                                "args": [
                                  -1,
                                  {
                                    "op": "+",
                                    "args": [
                                      "c_sat_1",
                                      "c_sat_2"
                                    ]
                                  }
                                ]
                              }
                            ]
                          },
                          2
                        ]
                      },
                      {
                        "op": "*",
                        "args": [
                          4,
                          {
                            "op": "+",
                            "args": [
                              {
                                "op": "*",
                                "args": [
                                  "delta_ROG",
                                  {
                                    "op": "+",
                                    "args": [
                                      {
                                        "op": "*",
                                        "args": [
                                          "a_1",
                                          "c_sat_2"
                                        ]
                                      },
                                      {
                                        "op": "*",
                                        "args": [
                                          "a_2",
                                          "c_sat_1"
                                        ]
                                      }
                                    ]
                                  }
                                ]
                              },
                              {
                                "op": "*",
                                "args": [
                                  -1,
                                  {
                                    "op": "*",
                                    "args": [
                                      "c_sat_1",
                                      "c_sat_2"
                                    ]
                                  }
                                ]
                              }
                            ]
                          }
                        ]
                      }
                    ]
                  }
                ]
              }
            ]
          }
        ]
      }
    },
    {
      "lhs": "Y",
      "rhs": {
        "op": "/",
        "args": [
          "c_aer",
          "delta_ROG"
        ]
      }
    }
  ],
  "tests": [
    {
      "id": "moderate_rog",
      "description": "Moderate ROG loading (delta_ROG = 1e-5 kg/m^3, ~10 μg/m^3). Typical urban alpha-pinene oxidation scenario. Expected: c_aer = 3.4171102637e-6 kg/m^3, Y = 0.3417110264, delta_ROG_threshold = 1.272957e-7 kg/m^3.",
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "parameter_overrides": {
        "delta_ROG": 1e-05
      },
      "assertions": [
        {
          "variable": "c_aer",
          "time": 0.0,
          "expected": 3.4171102637e-06,
          "tolerance": {
            "rel": 1e-06
          }
        },
        {
          "variable": "Y",
          "time": 0.0,
          "expected": 0.3417110264,
          "tolerance": {
            "rel": 1e-06
          }
        },
        {
          "variable": "delta_ROG_threshold",
          "time": 0.0,
          "expected": 1.272957e-07,
          "tolerance": {
            "rel": 1e-05
          }
        }
      ]
    },
    {
      "id": "high_rog",
      "description": "High ROG loading (delta_ROG = 1e-4 kg/m^3, ~100 μg/m^3). Yield approaches the sum a_1 + a_2 = 0.364 as c_aer >> c_sat_i. Expected: c_aer = 3.6175647399e-5 kg/m^3, Y = 0.3617564740.",
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "parameter_overrides": {
        "delta_ROG": 0.0001
      },
      "assertions": [
        {
          "variable": "c_aer",
          "time": 0.0,
          "expected": 3.6175647399e-05,
          "tolerance": {
            "rel": 1e-06
          }
        },
        {
          "variable": "Y",
          "time": 0.0,
          "expected": 0.361756474,
          "tolerance": {
            "rel": 1e-06
          }
        },
        {
          "variable": "delta_ROG_threshold",
          "time": 0.0,
          "expected": 1.272957e-07,
          "tolerance": {
            "rel": 1e-05
          }
        }
      ]
    },
    {
      "id": "low_rog_near_threshold",
      "description": "Low ROG loading (delta_ROG = 5e-7 kg/m^3, ~4x the threshold). Yield is well below the high-ROG limit. Expected: c_aer = 3.7979970620e-8 kg/m^3, Y = 0.0759599412.",
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "parameter_overrides": {
        "delta_ROG": 5e-07
      },
      "assertions": [
        {
          "variable": "c_aer",
          "time": 0.0,
          "expected": 3.797997062e-08,
          "tolerance": {
            "rel": 1e-05
          }
        },
        {
          "variable": "Y",
          "time": 0.0,
          "expected": 0.0759599412,
          "tolerance": {
            "rel": 1e-05
          }
        },
        {
          "variable": "delta_ROG_threshold",
          "time": 0.0,
          "expected": 1.272957e-07,
          "tolerance": {
            "rel": 1e-05
          }
        }
      ]
    }
  ],
  "analyses": [
    {
      "id": "rog_loading_sweep",
      "description": "Sweep reacted ROG concentration from 1e-6 to 1e-3 kg/m^3 to show how aerosol mass concentration and yield vary with ROG loading. Y approaches a_1+a_2=0.364 at high loading as both products are fully in the aerosol phase.",
      "initial_state": {},
      "parameters": {
        "a_1": 0.038,
        "a_2": 0.326,
        "c_sat_1": 5.8e-09,
        "c_sat_2": 2.5e-07
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "parameter_sweep": {
        "type": "cartesian",
        "dimensions": [
          {
            "parameter": "delta_ROG",
            "range": {
              "start": 1e-06,
              "stop": 0.001,
              "count": 60,
              "scale": "log"
            }
          }
        ]
      },
      "plots": [
        {
          "id": "aerosol_yield_vs_rog",
          "type": "line",
          "description": "Aerosol mass yield Y vs. reacted ROG concentration (log scale). Shows low yield near the formation threshold and approach to Y = a_1+a_2 = 0.364 at high loading.",
          "x": {
            "variable": "delta_ROG",
            "label": "ΔROG (kg/m³)"
          },
          "y": {
            "variable": "Y",
            "label": "Y (aerosol mass yield)"
          }
        },
        {
          "id": "aerosol_conc_vs_rog",
          "type": "line",
          "description": "Aerosol mass concentration c_aer vs. reacted ROG concentration (log-log scale). Shows nonlinear growth characteristic of the two-product absorptive partitioning framework.",
          "x": {
            "variable": "delta_ROG",
            "label": "ΔROG (kg/m³)"
          },
          "y": {
            "variable": "c_aer",
            "label": "c_aer (kg/m³)"
          }
        }
      ]
    }
  ]
}