Rock Density and Porosity Calculator
ANA›Life Services Authority›National Calculator Authority›Rock Density and Porosity Calculator
.calc-container { max-width: 640px; margin: 2rem 0; padding: 1.5rem; background: #fff; border: 1px solid #ddd; border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.06); font-family: system-ui, -apple-system, sans-serif; } .calc-container h3 { font-family: Georgia, serif; font-size: 1.15rem; color: #1a1a1a; margin-bottom: 1rem; padding-bottom: 0.5rem; border-bottom: 2px solid var(--ac, #3d5a80); } .calc-row { display: flex; align-items: center; gap: 0.75rem; margin-bottom: 0.75rem; flex-wrap: wrap; } .calc-row label { min-width: 160px; font-size: 0.9rem; color: #333; font-weight: 500; } .calc-row input[type="number"], .calc-row select { flex: 1; min-width: 120px; max-width: 200px; padding: 0.5rem 0.6rem; border: 1px solid #ccc; border-radius: 4px; font-size: 0.9rem; font-family: system-ui, sans-serif; color: #1a1a1a; background: #fafaf8; } .calc-row input:focus, .calc-row select:focus { outline: none; border-color: var(--ac, #3d5a80); box-shadow: 0 0 0 2px rgba(26,74,138,0.12); } .calc-row .unit { font-size: 0.82rem; color: #888; min-width: 30px; } .calc-btn { display: inline-block; margin-top: 0.5rem; padding: 0.55rem 1.5rem; background: var(--ac, #3d5a80); color: #fff; border: none; border-radius: 4px; font-size: 0.9rem; font-weight: 600; cursor: pointer; font-family: system-ui, sans-serif; } .calc-btn:hover { opacity: 0.9; } .calc-result { margin-top: 1.25rem; padding: 1rem 1.25rem; background: #f0f6fc; border-left: 3px solid var(--ac, #3d5a80); border-radius: 0 6px 6px 0; display: none; } .calc-result.visible { display: block; } .calc-result-label { font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.06em; color: #666; margin-bottom: 0.25rem; } .calc-result-value { font-size: 1.6rem; font-weight: 700; color: var(--ac, #3d5a80); } .calc-result-detail { font-size: 0.85rem; color: #555; margin-top: 0.5rem; line-height: 1.5; } .calc-note { margin-top: 1rem; font-size: 0.8rem; color: #888; font-style: italic; } .calc-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; margin-top: 0.75rem; } .calc-grid-item { padding: 0.6rem 0.8rem; background: #f8f9fa; border-radius: 4px; border: 1px solid #eee; } .calc-grid-item .label { font-size: 0.75rem; color: #888; text-transform: uppercase; letter-spacing: 0.04em; } .calc-grid-item .value { font-size: 1.1rem; font-weight: 600; color: #1a1a1a; } @media (max-width: 720px) { .calc-row { flex-direction: column; align-items: flex-start; gap: 0.3rem; } .calc-row label { min-width: auto; } .calc-row input[type="number"], .calc-row select { max-width: 100%; width: 100%; } .calc-grid { grid-template-columns: 1fr; } } .calc-chart { margin: 1rem 0; text-align: center; } .calc-chart svg { max-width: 100%; height: auto; } .calc-chart-legend { display: flex; flex-wrap: wrap; justify-content: center; gap: 0.6rem 1.2rem; margin-top: 0.6rem; font-size: 0.8rem; color: #555; } .calc-chart-legend span { display: inline-flex; align-items: center; gap: 0.3rem; } .calc-chart-legend i { display: inline-block; width: 10px; height: 10px; border-radius: 2px; font-style: normal; } .calc-related { max-width: 640px; margin: 2rem 0 1rem; padding: 1.25rem 1.5rem; background: #f8f9fa; border: 1px solid #e8e8e8; border-radius: 8px; } .calc-related h3 { font-family: Georgia, serif; font-size: 1rem; color: #1a1a1a; margin: 0 0 0.75rem; padding-bottom: 0.4rem; border-bottom: 2px solid var(--ac, #3d5a80); } .calc-related-list { list-style: none; padding: 0; margin: 0 0 0.75rem; display: grid; grid-template-columns: 1fr 1fr; gap: 0.4rem 1.5rem; } .calc-related-list li a { font-size: 0.88rem; color: var(--ac, #3d5a80); text-decoration: none; } .calc-related-list li a:hover { text-decoration: underline; } .calc-browse-all { margin: 0.5rem 0 0; font-size: 0.9rem; font-weight: 600; } .calc-browse-all a { color: var(--ac, #3d5a80); text-decoration: none; } .calc-browse-all a:hover { text-decoration: underline; } @media (max-width: 720px) { .calc-related-list { grid-template-columns: 1fr; } }
Rock Density and Porosity Calculator
Calculate bulk density, grain (matrix) density, fluid density, and porosity using standard petrophysical relationships. Provide any three known values to solve for the fourth.
Bulk Density (ρb) [g/cm³]
Measured density of the rock sample (solid + pore fluid)
Grain (Matrix) Density (ρg) [g/cm³]
Density of the solid mineral grains (quartz ≈ 2.65, calcite ≈ 2.71, dolomite ≈ 2.87)
Fluid Density (ρf) [g/cm³]
Density of pore-filling fluid (water ≈ 1.00, oil ≈ 0.80, gas ≈ 0.001–0.3)
Porosity (φ) [%]
Fraction of rock volume occupied by pores (0–100%)
⚠️ Leave exactly one field blank — it will be calculated from the other three.
Calculate
function rocCalc() { const bulkEl = document.getElementById('roc-bulk-density'); const grainEl = document.getElementById('roc-grain-density'); const fluidEl = document.getElementById('roc-fluid-density'); const porEl = document.getElementById('roc-porosity'); const resultEl = document.getElementById('roc-result');
const rawBulk = bulkEl.value.trim(); const rawGrain = grainEl.value.trim(); const rawFluid = fluidEl.value.trim(); const rawPor = porEl.value.trim();
const emptyFields = [rawBulk, rawGrain, rawFluid, rawPor].filter(v => v === '').length;
if (emptyFields === 0) { resultEl.innerHTML = 'Please leave exactly one field blank to solve for it.'; return; } if (emptyFields > 1) { resultEl.innerHTML = 'Please leave exactly one field blank. Too many unknowns.'; return; }
const pb = rawBulk !== '' ? parseFloat(rawBulk) : null; const pg = rawGrain !== '' ? parseFloat(rawGrain) : null; const pf = rawFluid !== '' ? parseFloat(rawFluid) : null; const ph = rawPor !== '' ? parseFloat(rawPor) / 100.0 : null;
// Validate provided values if (pb !== null && (isNaN(pb) || pb 5)) { resultEl.innerHTML = 'Bulk density must be between 0 and 5 g/cm³.'; return; } if (pg !== null && (isNaN(pg) || pg 5)) { resultEl.innerHTML = 'Grain density must be between 0 and 5 g/cm³.'; return; } if (pf !== null && (isNaN(pf) || pf 3)) { resultEl.innerHTML = 'Fluid density must be between 0 and 3 g/cm³.'; return; } if (ph !== null && (isNaN(ph) || ph 1)) { resultEl.innerHTML = 'Porosity must be between 0% and 100%.'; return; }
// Core formula: ρ_b = φ·ρ_f + (1 − φ)·ρ_g let calcPb = pb, calcPg = pg, calcPf = pf, calcPh = ph; let solvedFor = '';
if (pb === null) { // Solve for bulk density calcPb = ph * pf + (1 - ph) * pg; solvedFor = 'bulk'; if (calcPb 5) { resultEl.innerHTML = 'Calculated bulk density is out of physical range. Check inputs.'; return; } } else if (pg === null) { // Solve for grain density: ρ_g = (ρ_b − φ·ρ_f) / (1 − φ) if (Math.abs(1 - ph) Porosity cannot be 100% when solving for grain density (division by zero).'; return; } calcPg = (pb - ph * pf) / (1 - ph); solvedFor = 'grain'; if (calcPg 5) { resultEl.innerHTML = 'Calculated grain density is out of physical range (0–5 g/cm³). Check inputs.'; return; } } else if (pf === null) { // Solve for fluid density: ρ_f = (ρ_b − (1 − φ)·ρ_g) / φ if (Math.abs(ph) Porosity cannot be 0% when solving for fluid density (division by zero).'; return; } calcPf = (pb - (1 - ph) * pg) / ph; solvedFor = 'fluid'; if (calcPf 3) { resultEl.innerHTML = 'Calculated fluid density is out of physical range (0–3 g/cm³). Check inputs.'; return; } } else if (ph === null) { // Solve for porosity: φ = (ρ_g − ρ_b) / (ρ_g − ρ_f) const denom = pg - pf; if (Math.abs(denom) Grain density and fluid density cannot be equal (division by zero).'; return; } calcPh = (pg - pb) / denom; solvedFor = 'porosity'; if (calcPh 1) { resultEl.innerHTML = 'Calculated porosity is out of physical range (0–100%). Check inputs.'; return; } }
// Additional derived quantities const voidRatio = calcPh / (1 - calcPh); const saturation = (calcPf > 0 && calcPg > 0) ? ((calcPb - calcPg * (1 - calcPh)) / (calcPh * calcPf)) : null;
const labels = { bulk: 'Bulk Density (ρb)', grain: 'Grain Density (ρg)', fluid: 'Fluid Density (ρf)', porosity: 'Porosity (φ)' };
const values = { bulk: calcPb.toFixed(4) + ' g/cm³', grain: calcPg.toFixed(4) + ' g/cm³', fluid: calcPf.toFixed(4) + ' g/cm³', porosity: (calcPh * 100).toFixed(4) + ' %' };
let html = '### Results
';
html += 'ParameterValue';
for (const key of ['bulk', 'grain', 'fluid', 'porosity']) {
const highlight = key === solvedFor ? ' style="background:#e8f5e9; font-weight:bold;"' : '';
const tag = key === solvedFor ? ' ✅ (solved)' : '';
html += ${labels[key]}${tag}${values[key]};
}
html += Void Ratio (e = φ / (1−φ))${voidRatio.toFixed(4)};
if (saturation !== null) {
const satPct = (saturation * 100).toFixed(2);
html += Fluid Saturation (Sw)${satPct} %;
}
html += '';
// Mineral reference html += ` Common grain densities: Quartz 2.65 | Calcite 2.71 | Dolomite 2.87 | Feldspar 2.56–2.76 | Clay 2.60–2.80 g/cm³
`;
resultEl.innerHTML = html; }
#### Formula
The fundamental petrophysical relationship linking bulk density, grain density, fluid density, and porosity:
ρb = φ · ρf + (1 − φ) · ρg
Rearranged to solve for each unknown:
- Grain density: ρg = (ρb − φ · ρf) / (1 − φ)
- Fluid density: ρf = (ρb − (1 − φ) · ρg) / φ
- Porosity: φ = (ρg − ρb) / (ρg − ρf)
- Void ratio: e = φ / (1 − φ)
Where: ρb = bulk density, ρg = grain (matrix) density, ρf = pore fluid density, φ = porosity (fraction).
#### Assumptions & References
- References: Archie (1942), AAPG Bulletin; Schlumberger Log Interpretation Principles (1989); Tiab & Donaldson, Petrophysics (4th ed., 2015).
More Calculators
- Offer in Compromise Estimator
- Tile Grout and Adhesive Quantity Calculator
- Training Program Cost Estimator
- Training Hours Compliance Calculator
- National Tutoring Programme Subsidy Calculator
- Tutoring Hours to Grade Improvement Estimator
- Intrusion Detection Response Time Calculator
- Access Control System Cost Estimator
- Security Guard Staffing Cost Calculator
- Incident Response Time & Cost Calculator
- Server Vulnerability Patch Priority Scorer
Read Next
Server Vulnerability Patch Priority Scorer ANA › Life Services Authority › National Calculator Authority › Server Vulnerability Patch Priority Scorer .calc-container {...
Study Time Planner Authority Network America › Life Services Authority › National Calculator Authority .calc-container { max-width: 640px;...