Carbon Fixation Model
1) Background: C:N:P Variability
Redfield stoichiometry (C:N:P ≈ 106:16:1, mol:mol:mol) is a useful reference, but real cultures vary by species and nutrient status. For EHUX-like compositions, the carbon fraction of dry weight is typically high due to substantial lipids & carbohydrates.
- N:P (replete) ≈ 5–19; (P‑limited) can exceed 100.
- C:N ≈ 3–17 (often near 6–7 when replete).
- Critical N:P threshold ≈ 20–50 (transition of N vs P limitation).
For EHUX (log phase), reported DW composition ranges: Protein ~25–32%, Carbohydrate ~13–21%, Lipids ~45–56%. A practical carbon fraction fC of 0.50–0.60 is reasonable.
2) Biomass → Carbon → CO₂
Corg [g] = DW [g] × fC
CO₂ [g] = Corg × (44 / 12)
Example: 1 t DW × 0.55 gC/gDW → 0.55 t C → 0.55 × 44/12 ≈ 2.017 t CO₂ gross (POC).
3) EHUX Nuance: POC vs PIC
EHUX forms CaCO₃ (coccoliths). Separate accounting is recommended:
- POC: Particulate Organic Carbon from cellular organics (credited via export/storage).
- PIC: Particulate Inorganic Carbon in CaCO₃. Surface formation releases ≈ 1 mol CO₂ per mol CaCO₃; burial may be credited in some frameworks.
4) Transparent Workflow
- Measure/estimate DW (dry weight) and select fC (0.50–0.60 for EHUX, or your CHN data).
- Compute gross POC CO₂: Corg = DW × fC; CO₂ = Corg × 44/12.
- Apply POC export/storage fraction if you only credit retained/exported carbon.
- Parameterize PIC terms (PIC:POC by C, surface penalty on, burial credit on/off) and report separately.
- Publish a ledger: POC gross, POC credited, PIC penalty, PIC burial, and net.
5) Python Example Program
from dataclasses import dataclass
MOLAR_MASS_CO2_PER_C = 44.0 / 12.0 # g CO2 per g C
@dataclass
class EHUXCarbonModelInput:
dry_weight_tons: float # tons DW
carbon_fraction: float = 0.55 # g C per g DW (EHUX: ~0.50–0.60)
poc_export_fraction: float = 0.80 # credited POC fraction
pic_to_poc_c_ratio: float = 0.20 # C(PIC) / C(POC) by carbon
pic_burial_fraction: float = 0.50 # fraction of PIC credited as burial
apply_surface_pic_penalty: bool = True
credit_pic_burial: bool = False
@dataclass
class EHUXCarbonModelResult:
poc_c_g: float
poc_co2_gross_tons: float
poc_co2_credited_tons: float
pic_c_g: float
pic_surface_penalty_tons: float
pic_burial_credit_tons: float
net_credited_tons: float
def run_ehux_carbon_model(cfg: EHUXCarbonModelInput) -> EHUXCarbonModelResult:
dw_g = cfg.dry_weight_tons * 1_000_000.0
poc_c_g = dw_g * cfg.carbon_fraction
poc_co2_gross_tons = (poc_c_g * MOLAR_MASS_CO2_PER_C) / 1_000_000.0
poc_co2_credited_tons = poc_co2_gross_tons * cfg.poc_export_fraction
pic_c_g = poc_c_g * cfg.pic_to_poc_c_ratio
pic_co2_equiv_tons = (pic_c_g * MOLAR_MASS_CO2_PER_C) / 1_000_000.0
pic_surface_penalty_tons = pic_co2_equiv_tons if cfg.apply_surface_pic_penalty else 0.0
pic_burial_credit_tons = pic_co2_equiv_tons * cfg.pic_burial_fraction if cfg.credit_pic_burial else 0.0
net_credited_tons = poc_co2_credited_tons - pic_surface_penalty_tons + pic_burial_credit_tons
return EHUXCarbonModelResult(
poc_c_g=poc_c_g,
poc_co2_gross_tons=poc_co2_gross_tons,
poc_co2_credited_tons=poc_co2_credited_tons,
pic_c_g=pic_c_g,
pic_surface_penalty_tons=pic_surface_penalty_tons,
pic_burial_credit_tons=pic_burial_credit_tons,
net_credited_tons=net_credited_tons,
)
if __name__ == "__main__":
cfg = EHUXCarbonModelInput(
dry_weight_tons=1.0,
carbon_fraction=0.55,
poc_export_fraction=0.80,
pic_to_poc_c_ratio=0.20,
pic_burial_fraction=0.50,
apply_surface_pic_penalty=True,
credit_pic_burial=True,
)
res = run_ehux_carbon_model(cfg)
print("=== EHUX Biomass → CO2 Accounting (Example) ===")
print(f"POC carbon (g): {res.poc_c_g:,.0f}")
print(f"POC CO2 gross (t): {res.poc_co2_gross_tons:.3f}")
print(f"POC CO2 credited (t): {res.poc_co2_credited_tons:.3f}")
print(f"PIC carbon (g): {res.pic_c_g:,.0f}")
print(f"PIC surface CO2 penalty (t): {res.pic_surface_penalty_tons:.3f}")
print(f"PIC burial credit (t): {res.pic_burial_credit_tons:.3f}")
print(f"==> Net credited CO2 (t): {res.net_credited_tons:.3f}")
7) Assumptions & Notes
Carbon fraction 0.50–0.60 and the variability of C:N:P, protein/RNA/phospholipid ranges derive from controlled culture datasets compiled in the cited study. Use your CHN analytics when available; this template is designed to be swapped to your measured parameters without structural changes.