diff --git a/lithos-issuance/README.md b/lithos-issuance/README.md new file mode 100644 index 0000000..43edd9f --- /dev/null +++ b/lithos-issuance/README.md @@ -0,0 +1,5 @@ +# Analysis for blog: Questions about Lithos's first ERW credit issuance +These notebooks reproduce the back-of-envelope analysis done to gut-check Lithos's claim of 8.3 tonnes/ha/yr of gross CDR. + +- `surface-area.ipynb` analyzes how much surface area is required to reach the inferred dissolution fraction given a range of dissolution rates. +- `export-fluxes.ipynb` analyzes the DIC and ALK export required to achieve 8.3 tonnes/ha/yr gros CDR. \ No newline at end of file diff --git a/lithos-issuance/export-fluxes.ipynb b/lithos-issuance/export-fluxes.ipynb new file mode 100644 index 0000000..becf2ba --- /dev/null +++ b/lithos-issuance/export-fluxes.ipynb @@ -0,0 +1,425 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "b9d0a989-b9df-4b15-ac22-d2179f76f145", + "metadata": {}, + "source": [ + "# Analysis of the F = Cq for CDR claims\n", + "Below assumes that you can equate a CDR claim in tCO2e/ha/yr to carbon flux, F, equal to C*q, where q is average water infiltration. Accordingly, you can then bracket what concentrations of DIC or HCO3- alkalinity would be required. " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "733f8700-4f8f-4430-8bde-37528c59566b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "5.976235332290535e-07" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# -------------------------\n", + "claim_tCO2_ha_yr = 8.3 # tonnes CO2 per hectare in ~1 year (treated as CO2 for conversion to aqueous C) (derived from validation and verification report: https://puro.earth/documents/content/GmA-e4rASteUvTUJP7GC7Qo2982?download=0; this is a lower-bound -- assuming rock was spread June 21, 2024 and reporting ended June 2, 2025, would give us 8.8 t/ha/yr)\n", + "q_mm_yr_grid = np.linspace(50, 1000, 50) # typical infiltration / recharge bracket (mm/yr)\n", + "q_mm_yr_points = np.array([200, 300, 500, 1000]) # for table\n", + "\n", + "# carbonate speciation: choose pH values to show implied TA from a DIC requirement\n", + "pH_list = [6.0, 7.0, 8.0]\n", + "\n", + "# constants\n", + "M_CO2 = 44.0095 # g/mol\n", + "sec_per_yr = 365.25 * 24 * 3600\n", + "m2_per_ha = 1e4\n", + "\n", + "# helper conversions\n", + "def tCO2_ha_yr_to_molC_m2_s(tCO2_ha_yr):\n", + " \"\"\"\n", + " Convert t CO2 / ha / yr -> mol C / m^2 / s\n", + " \"\"\"\n", + " gCO2_per_ha_yr = tCO2_ha_yr * 1e6\n", + " molCO2_per_ha_yr = gCO2_per_ha_yr / M_CO2\n", + " molC_per_m2_s = molCO2_per_ha_yr / m2_per_ha / sec_per_yr \n", + " return molC_per_m2_s\n", + "\n", + "def mm_yr_to_m_s(mm_yr):\n", + " return (mm_yr / 1000.0) / sec_per_yr\n", + "\n", + "F_claim = tCO2_ha_yr_to_molC_m2_s(claim_tCO2_ha_yr)\n", + "F_claim" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "94f1b0df-d0f0-47d4-a74f-0edf5f41a34b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
| \n", + " | q (mm/yr) | \n", + "C_required (mM DIC equiv) | \n", + "
|---|---|---|
| 0 | \n", + "200 | \n", + "94.297822 | \n", + "
| 1 | \n", + "300 | \n", + "62.865215 | \n", + "
| 2 | \n", + "500 | \n", + "37.719129 | \n", + "
| 3 | \n", + "1000 | \n", + "18.859564 | \n", + "
<xarray.Dataset> Size: 486kB\n", + "Dimensions: (rate: 100, diameter_um: 100)\n", + "Coordinates:\n", + " * rate (rate) float64 800B 1e-09 9.112e-10 ... 1e-13\n", + " log_diss_rate (rate) float64 800B -9.0 -9.04 ... -12.96 -13.0\n", + " * diameter_um (diameter_um) float64 800B 10.0 19.9 ... 990.0\n", + "Data variables:\n", + " geometric_surface_area (rate, diameter_um) float64 80kB 8.68e+06 ... 8....\n", + " moles_dissolved_geom (rate, diameter_um) float64 80kB 2.739e+05 ... 0...\n", + " basalt_dissolved_geom_t (rate, diameter_um) float64 80kB 34.24 ... 3.459...\n", + " cdr_expected_t_per_ha (rate, diameter_um) float64 80kB 10.27 ... 1.038...\n", + " roughness_factor (rate, diameter_um) float64 80kB 0.808 ... 7.999...\n", + " grain_volume_m3 (diameter_um) float64 800B 5.236e-16 ... 5.08e-10\n", + " grain_mass (diameter_um) float64 800B 1.571e-09 ... 0.001524\n", + " grain_geom_sa (diameter_um) float64 800B 3.142e-10 ... 3.079e-06\n", + " geometric_ssa (diameter_um) float64 800B 0.2 0.1005 ... 0.00202\n", + " ssa (diameter_um, rate) float64 80kB 0.1616 ... 1.61...\n", + "Attributes:\n", + " description: Basalt weathering and CDR estimates over rate and eff...\n", + " basalt_density: kg m-3\n", + " molar_mass_basalt: kg mol-1