agentleFS
equinorequinor/neqsim/.github/skills/neqsim-equipment-cost-estimation/SKILL.md

neqsim-equipment-cost-estimation

Skill167 starsChanged 7 months agoApache-2.0View on GitHub

Equipment and process CAPEX estimation - Turton/Peters/Seider correlations, CEPCI escalation, material/pressure factors, bare-module to grass-roots, AACE class 1-5, location and currency factors, mechanical-design-driven topsides/SURF/well rollups. USE WHEN: a task needs a Class 3/4 estimate for equipment, a flowsheet, topsides, SURF, wells or reservoir-to-market CAPEX. Anchors on CostEstimationCalculator and ProcessCostEstimate.

The file

We split this skill into the rules it gives an agent

3 rules. About 0 are common, 1 is distinctive, and 2 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈1

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 2

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Keep the legacy calcVerticalVesselCost(weight_kg) and calcHorizontalVesselCost(weight_kg) methods for cases where the mechanical design has …

    line 114
  2. Distinctive:

    Use this rollup for reservoir-to-market screening once the flowsheet contains unit operations for the major equipment.

    line 193
  3. Very specific:

    Use CostEstimateResult when handing estimates to reports, agents, or downstream economics.

    line 200

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

NeqSim Equipment Cost Estimation Skill

Class-3/4 (AACE 18R-97) order-of-magnitude to study estimates for individual process equipment and early process/facility CAPEX rollups - the bridge between sized equipment and a project economics model. Wraps Turton (5e), Peters–Timmerhaus, Ulrich, and Seider correlations with CEPCI escalation, material factors, pressure factors, and Lang/Hand factors. The preferred NeqSim path is mechanical-design driven: call each unit's initMechanicalDesign(), calcDesign(), then getMechanicalDesign().getCostEstimate().calculateCostEstimate() or let ProcessCostEstimate.calculateAllCosts() do that rollup for a full flowsheet.

When to Use

  • Quickly cost a sized vessel, column, HX, pump, compressor, filter, reactor, mixer, splitter, or manifold
  • Build a bare-module → total-module → grass-roots stackup
  • Apply CEPCI to escalate published correlations to current year
  • Compare alternatives (e.g. centrifugal vs reciprocating compressor)
  • Produce a scope-safe CostEstimateResult for equipment, process, topsides, SURF, subsea, well, or field-development estimates
  • Reconcile located process totals against located equipment rows while retaining base equipment costs
  • Feed equipment cost into NPV / IRR via neqsim-field-economics

For project-level economics, asset valuation, or fiscal regimes, use neqsim-field-economics. This skill is the CAPEX basis skill that feeds those economics workflows.

AACE Cost Estimate Classes

ClassMaturityAccuracyMethod
5Concept−50% / +100%Capacity-factor (six-tenths)
4Pre-FEED−30% / +50%Equipment-factored (this skill)
3FEED−20% / +30%Sized equipment + bulk MTOs
2Detailed−15% / +20%Detailed quantity takeoff
1Final−10% / +15%Vendor quotes

Correlation Validity Range (READ THIS FIRST)

The Turton correlations are fitted over a stated capacity range. NeqSim does not refuse a capacity outside that range — it evaluates the polynomial anyway and returns a number that looks ordinary.

Observed case: a 239 MW compression duty evaluated against a correlation valid to 3000 kW returned about 6 MUSD — roughly 80× too low, with no warning. In the same study the weight-based calcColumnShellCost returned ~500 MUSD for a single contactor because it feeds a shell weight into coefficients fitted on volume. The two errors partly cancelled, and the study total was wrong by a factor of three while appearing internally consistent.

Rules:

  1. Check the range before calling. Compressors 450–3000 kW; pumps 1–300 kW; vessels by volume.
  2. Oversized duties are parallel units, not extrapolation. Split the duty into ceil(capacity / max_capacity) units at capacity / n each and cost each inside the range. CostEstimationCalculator now does this internally for compressors and pumps.
  3. Never use the weight-based vessel/column methods. calcVerticalVesselCost, calcHorizontalVesselCost and calcColumnShellCost are deprecated: their capacity basis is volume, not shell weight. Use calcVerticalVesselCostByVolume and pass the actual volume.
  4. Anchor the total. Cross-check specific CAPEX against a published comparable for the concept type before believing the sum. A result outside the expected band by more than a factor of 1.5 is a bug until proven otherwise.

Pattern 1 — Bare-module Cost for a Vessel

import neqsim.process.costestimation.CostEstimationCalculator;

CostEstimationCalculator cost = new CostEstimationCalculator();
cost.setCurrentCepci(CostEstimationCalculator.CEPCI_2025);   // 840
cost.setMaterialOfConstruction("SS316");                     // sets Fm = 2.1
cost.setLocationByRegion("Norway");                          // location factor

double shellWeight_kg = 8500.0;        // from mechanical design
double designP_barg   = 110.0;
double Cp = cost.calcVerticalVesselCost(shellWeight_kg);
double Cbm = cost.calcBareModuleCost(Cp, designP_barg);      // applies Fp & Fm
double Ctm = cost.calcTotalModuleCost(Cbm);                  // + contingency + fees
double Cgr = cost.calcGrassRootsCost(Ctm);                   // + auxiliary facilities

Pattern 2 — End-to-end via calculateCostEstimate

cost.calculateCostEstimate(
    Cp,                  // purchased equipment cost
    designP_barg,        // for Fp
    shellWeight_kg,      // for installation man-hours
    "vertical_vessel"    // equipment category
);
String json = cost.toJson();   // structured output for results.json

Pattern 3 — Volume-Based Vessel Cost

For screening work, use the volume-based methods when the mechanical design knows vessel diameter and length but the shell weight is not yet reliable. These are now the preferred basis for separator, absorber, column, filter, and reactor vessel screening.

double vesselVolume_m3 = Math.PI * diameter_m * diameter_m / 4.0 * tanTanLength_m;
double verticalCp = cost.calcVerticalVesselCostByVolume(vesselVolume_m3);
double horizontalCp = cost.calcHorizontalVesselCostByVolume(vesselVolume_m3);

Keep the legacy calcVerticalVesselCost(weight_kg) and calcHorizontalVesselCost(weight_kg) methods for cases where the mechanical design has already produced a defensible shell weight.

Pattern 4 — CEPCI Escalation

C_today = C_published × CEPCI_today / CEPCI_published

Built-in indices: CEPCI_2019 (607.5) through CEPCI_2025 (840). Escalate any literature correlation that's published with a base year.

Pattern 5 — Equipment-Specific Methods

EquipmentMethodSizing input
Vertical pressure vesselcalcVerticalVesselCost(weight_kg)shell weight
Horizontal vesselcalcHorizontalVesselCost(weight_kg)shell weight
Vertical vessel screeningcalcVerticalVesselCostByVolume(volume_m3)vessel volume
Horizontal vessel screeningcalcHorizontalVesselCostByVolume(volume_m3)vessel volume
Distillation columncalcColumnShellCost(weight_kg) + calcSieveTraysCost(D, N)weight + diameter + tray count
Shell-tube HXcalcShellTubeHeatExchangerCost(area_m2)area
Plate HXcalcPlateHeatExchangerCost(area_m2)area
Air coolercalcAirCoolerCost(area_m2)bare-tube area
Centrifugal pumpcalcCentrifugalPumpCost(power_kW)shaft power
Centrifugal compressorcalcCentrifugalCompressorCost(power_kW)shaft power
Reciprocating compressorcalcReciprocatingCompressorCost(power_kW)shaft power
PipingcalcPipingCost(D_m, L_m, schedule)diameter, length
Control valvecalcControlValveCost(Cv)Cv

Pattern 6 — Mechanical-Design Estimator Wiring

Equipment-specific mechanical designs own their estimator selection. This is what makes full-process rollups work: ProcessCostEstimate does not need to know every unit's detailed sizing correlation; it asks the unit for its mechanical design and cost estimate.

unit.initMechanicalDesign();
MechanicalDesign design = unit.getMechanicalDesign();
design.calcDesign();
design.getCostEstimate().calculateCostEstimate();
double grassRootsCostUSD = design.getCostEstimate().getGrassRootsCost();

Current topside coverage includes specialized mechanical-design/cost paths for separators, scrubbers, columns, absorbers, adsorbers, mercury removal, pumps, compressors, expanders, ejectors, heat exchangers, BAHX units, tanks, pipelines, valves, mixers, splitters, filters, reactors, and manifolds. Header-like units such as mixers and splitters should calculate dry weight during calcDesign(); filter/reactor/manifold estimators reuse the mechanical design outputs instead of duplicating sizing logic.

Pattern 7 — Material and Pressure Factors (Turton)

double Fp = CostEstimationCalculator.getPressureFactor(designP_barg);  // ~1.0–3.0
// Fm constants: FM_CARBON_STEEL=1.0, FM_SS304=1.8, FM_SS316=2.1,
//               FM_SS316L=2.3, FM_MONEL=3.2, FM_HASTELLOY_C=3.8, FM_TITANIUM=4.5

Pattern 8 — Stackup Convention

Cp        = purchased equipment, FOB factory          (input)
Cbm       = Cp × (B1 + B2 × Fm × Fp)                  bare module
Ctm       = Cbm × 1.18                                + contingency 15% + fees 3%
Cgr       = Ctm × 1.30                                + 30% auxiliary (utilities, storage, OSBL)

Pattern 9 — Cost Estimate for a Whole Process

ProcessCostEstimate processCost = new ProcessCostEstimate(process);
processCost.calculateAllCosts();
double totalCgr = processCost.getTotalGrassRootsCost();

Use this rollup for reservoir-to-market screening once the flowsheet contains unit operations for the major equipment. It initializes each unit's mechanical design, runs calcDesign(), calls the attached estimator, and aggregates the result by equipment category.

Pattern 10 — Result Schema and Reconciliation

Use CostEstimateResult when handing estimates to reports, agents, or downstream economics. The map names encode whether rows are additive, summary totals, or non-cost quantities:

MapMeaningReconciliation Rule
capitalCosts_USDAdditive direct capital-cost linesSum only inside the same scope
capitalCostBreakdown_USDSupplementary detail behind a capital lineDo not add to the parent line
capitalCostSummary_USDCapital subtotals/totalsShow as totals; do not re-sum
projectCosts_USDAdditive project-cost linesSum only inside the matching project scope
projectCostSummary_USDProject subtotals/totalsShow as totals; do not re-sum
quantityBasisNon-cost quantities with unitsNever mix into USD totals
weightBasis_kg and materialTakeOffPhysical basis and MTO traceabilityKeep separate unless building a controlled MTO rollup

Examples of intended placement:

  • Unit estimators: purchasedEquipmentCost in capitalCosts_USD; bareModuleCost, totalModuleCost, and grassRootsCost in capitalCostSummary_USD; installationManHours in quantityBasis.
  • ProcessCostEstimate: process PEC/BMC/TMC/grass-roots in capitalCostSummary_USD; totalProjectCost in projectCostSummary_USD; totalInstallationManHours in quantityBasis.
  • Topsides facilities: direct field cost and excluded non-topsides scope in capitalCostSummary_USD; totalTopsidesCapex in projectCostSummary_USD; module detail in capitalCostBreakdown_USD.
  • SURF/development: totalSURF and totalDevelopment in capitalCostSummary_USD; vessel days in quantityBasis.

ProcessCostEstimate.toJson() reports equipment rows with location-adjusted costs in the standard *_USD fields, because those rows must reconcile with the process totals and costByEquipmentType_USD. Base, unlocated rows remain under basePurchasedEquipmentCost_USD, baseBareModuleCost_USD, baseTotalModuleCost_USD, and baseGrassRootsCost_USD, with locationFactor shown explicitly.

Common Mistakes

MistakeFix
Using outdated CEPCIAlways set setCurrentCepci(CEPCI_<year>) before calculating
Hardcoding Fm = 1Pick from FM_* constants based on actual material of construction
Missing pressure factor at high PUse getPressureFactor(P) — silently × the cost at HP/HIPPS service
Reporting Cp as "installed cost"Cp is FOB only; installed = at minimum Cbm
Mixing currenciesUse setCurrency(code, rate) then read all costs through convertFromUSD/convertToUSD
Adding capitalCostSummary_USD into capitalCosts_USD totalsSummary rows are already subtotals/totals; show them separately
Treating quantityBasis rows as USD costsQuantity rows carry units like man-hour or vessel-day, not currency
Comparing located process totals to base equipment rowsUse located *_USD equipment fields for reconciliation, base fields for pre-location analysis
Claiming Class-3 accuracy on capacity-factoredCapacity factor (six-tenths) → Class 5; named in AACE 18R-97
Ignoring locationsetLocationByRegion("Norway") ≈ 1.3× US Gulf Coast for offshore
Adding a new mechanical design but leaving the base estimatorAssign the unit-specific costEstimate in the mechanical design constructor
Passing shell weight to a volume correlationUse calc*ByVolume(volume_m3) only with vessel volume
SURFCostEstimator for a tie-back or infill templateIt adds a default 80 km x 24 in export pipeline (about 340 MUSD) and a 10 km x 14 in infield flowline; call setExportPipelineLengthKm(0.0) and set the infield length/diameter, otherwise the SURF total is 2-3 times too high
Expecting PiP, SS-clad or CRA flowline itemsSURFCostEstimator prices rigid carbon steel or flexible only; apply an explicit uplift or unit rate (MUSD/km) and state it as an assumption
WellCostEstimator well-type stringsUse OIL_PRODUCER, WATER_INJECTOR, GAS_INJECTOR; rig SEMI_SUBMERSIBLE; completion ICD, AICD, OPEN_HOLE, MULTI_ZONE; a default rig day rate applies unless overridden

Validation Checklist

  • CEPCI year matches the project base year
  • Material of construction set per stream service (e.g. SS316L for wet sour)
  • Pressure factor applied for design P > 10 barg
  • AACE class declared in report (5/4/3) with stated accuracy band
  • Stackup shown: Cp → Cbm → Ctm → Cgr with each multiplier
  • Currency and location factor stated
  • Additive cost rows, summary totals, supplementary breakdowns, and non-cost quantities are kept in separate CostEstimateResult maps
  • Process equipment rows reconcile on the same basis as totals: located-to-located or base-to-base
  • JSON saved via cost.toJson() to results.json under capex section
  • Sensitivity to ±20% on key drivers (compressor power, column trays) reported
  • Full-process screens include major reservoir-to-market equipment rather than only topside separators and compressors
  • New equipment classes expose a specialized mechanical design and estimator before relying on ProcessCostEstimate

Related Skills

  • neqsim-field-economics — project NPV / IRR / fiscal
  • neqsim-api-patterns — CompressorDesignFeasibilityReport includes integrated cost
  • neqsim-standards-lookup — AACE 18R-97

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.