Class TiebackAnalyzer

java.lang.Object
neqsim.process.fielddevelopment.tieback.TiebackAnalyzer
All Implemented Interfaces:
Serializable

public class TiebackAnalyzer extends Object implements Serializable
Analyzes tie-back options for connecting satellite fields to host facilities.

The TiebackAnalyzer is the main entry point for evaluating subsea tie-back development options. For each potential host facility, it:

  1. Calculates distance and checks routing feasibility
  2. Evaluates host capacity constraints
  3. Performs flow assurance screening
  4. Estimates CAPEX breakdown
  5. Calculates NPV and other economics
  6. Ranks options by value

Cost Estimation Basis

The analyzer uses parametric cost models calibrated to Norwegian Continental Shelf benchmarks:

  • Subsea tree: 25 MUSD per well
  • Manifold/template: 30-50 MUSD
  • Pipeline: 2-4 MUSD/km depending on diameter
  • Umbilical: 1 MUSD/km
  • Host modifications: 20-100 MUSD depending on scope

Example Usage

// Define discovery
FieldConcept discovery = FieldConcept.gasTieback("Marginal Gas", 25.0, 2, 1.5);

// Define potential hosts
List<HostFacility> hosts = new ArrayList<>();
hosts.add(HostFacility.builder("Platform A").location(61.5, 2.3).waterDepth(110)
    .spareGasCapacity(3.0).minTieInPressure(80).build());
hosts.add(HostFacility.builder("FPSO B").location(61.8, 2.1).waterDepth(350)
    .spareGasCapacity(5.0).build());

// Analyze
TiebackAnalyzer analyzer = new TiebackAnalyzer();
TiebackReport report = analyzer.analyze(discovery, hosts, 61.6, 2.5);

// Review results
System.out.println(report.getSummary());
TiebackOption best = report.getBestOption();
Version:
1.0
Author:
ESOL
See Also:
  • Field Details

    • serialVersionUID

      private static final long serialVersionUID
      See Also:
    • subseaTreeCostMusd

      private double subseaTreeCostMusd
      Cost per subsea tree in MUSD.
    • manifoldBaseCostMusd

      private double manifoldBaseCostMusd
      Base cost for manifold/template in MUSD.
    • pipelineCostPerKmMusd

      private double pipelineCostPerKmMusd
      Pipeline cost per km in MUSD (base, adjusted for diameter).
    • umbilicalCostPerKmMusd

      private double umbilicalCostPerKmMusd
      Umbilical cost per km in MUSD.
    • hostModificationBaseCostMusd

      private double hostModificationBaseCostMusd
      Base cost for host modifications in MUSD.
    • drillingCostPerWellMusd

      private double drillingCostPerWellMusd
      Drilling cost per well in MUSD.
    • discountRate

      private double discountRate
      Discount rate for NPV calculations.
    • gasPriceUsdPerSm3

      private double gasPriceUsdPerSm3
      Default gas price in USD/Sm3.
    • oilPriceUsdPerBbl

      private double oilPriceUsdPerBbl
      Default oil price in USD/bbl.
    • opexFraction

      private double opexFraction
      OPEX as fraction of CAPEX per year.
    • maxTiebackDistanceKm

      private double maxTiebackDistanceKm
      Maximum tieback distance in km.
    • minHydrateMarginC

      private double minHydrateMarginC
      Minimum hydrate margin for PASS in Celsius.
    • seabedTemperatureC

      private double seabedTemperatureC
      Seabed temperature for flow assurance in Celsius.
    • flowAssuranceScreener

      private final FlowAssuranceScreener flowAssuranceScreener
      Flow assurance screener using NeqSim thermodynamics.
    • taxModel

      private NorwegianTaxModel taxModel
  • Constructor Details

    • TiebackAnalyzer

      public TiebackAnalyzer()
      Creates a new tieback analyzer with default parameters.
  • Method Details

    • analyze

      public TiebackReport analyze(FieldConcept discovery, List<HostFacility> hosts, double discoveryLatitude, double discoveryLongitude)
      Analyzes all tieback options for a discovery.

      For each host facility, evaluates the technical feasibility and economic attractiveness of a tieback connection. Options are ranked by NPV, with infeasible options marked accordingly.

      Parameters:
      discovery - the satellite field concept
      hosts - list of potential host facilities
      discoveryLatitude - discovery latitude in degrees
      discoveryLongitude - discovery longitude in degrees
      Returns:
      comprehensive tieback report with ranked options
    • analyze

      public TiebackReport analyze(FieldConcept discovery, List<HostFacility> hosts, Map<String, TiebackRouteNetwork> routeNetworksByHost, double discoveryLatitude, double discoveryLongitude)
      Analyzes tieback options with optional route networks per host.
      Parameters:
      discovery - the satellite field concept
      hosts - list of potential host facilities
      routeNetworksByHost - optional map from host name to route network
      discoveryLatitude - discovery latitude in degrees
      discoveryLongitude - discovery longitude in degrees
      Returns:
      comprehensive tieback report with ranked options
    • analyze

      public TiebackReport analyze(FieldConcept discovery, List<HostFacility> hosts)
      Analyzes tieback options using concept infrastructure input for location.
      Parameters:
      discovery - the satellite field concept
      hosts - list of potential host facilities
      Returns:
      comprehensive tieback report
    • evaluateSingleTieback

      public TiebackOption evaluateSingleTieback(FieldConcept discovery, HostFacility host, double discoveryLatitude, double discoveryLongitude)
      Evaluates a single tieback option.
      Parameters:
      discovery - the satellite field concept
      host - the host facility
      discoveryLatitude - discovery latitude
      discoveryLongitude - discovery longitude
      Returns:
      evaluated tieback option
    • evaluateSingleTieback

      public TiebackOption evaluateSingleTieback(FieldConcept discovery, HostFacility host, TiebackRouteNetwork routeNetwork, double discoveryLatitude, double discoveryLongitude)
      Evaluates a single tieback option using an optional multi-segment route network.
      Parameters:
      discovery - the satellite field concept
      host - the host facility
      routeNetwork - route network to use, or null for scalar route-length screening
      discoveryLatitude - discovery latitude
      discoveryLongitude - discovery longitude
      Returns:
      evaluated tieback option
    • screenFlowAssurance

      private void screenFlowAssurance(TiebackOption option, FieldConcept discovery, HostFacility host, ReservoirInput reservoir, WellsInput wells, boolean isGasField, double totalRate, String rateUnit, TiebackRouteNetwork routeNetwork)
      Screens the tieback route using pipeline hydraulics and thermodynamic flow-assurance checks.
      Parameters:
      option - tieback option to update
      discovery - discovery concept
      host - receiving host facility
      reservoir - reservoir input, or null for defaults
      wells - well input, or null for defaults
      isGasField - true when gas-rate economics and capacity should be used
      totalRate - total wellhead rate in the supplied rate unit
      rateUnit - total rate unit
    • applyHydraulicResult

      private void applyHydraulicResult(TiebackOption option, MultiphaseFlowIntegrator.PipelineResult result, HostFacility host)
      Applies hydraulic result values to the tieback option.
      Parameters:
      option - tieback option to update
      result - pipeline hydraulic result
      host - receiving host facility
    • applyFlowAssuranceReport

      private void applyFlowAssuranceReport(TiebackOption option, FlowAssuranceReport report)
      Applies thermodynamic flow-assurance results to the tieback option.
      Parameters:
      option - tieback option to update
      report - flow assurance report
    • estimateCapex

      private void estimateCapex(TiebackOption option, int wellCount, double distanceKm, HostFacility host)
    • calculateEconomics

      private void calculateEconomics(TiebackOption option, boolean isGasField, int wellCount, double gasRateMSm3d, double oilRateBopd)
    • resolveRouteLengthKm

      private double resolveRouteLengthKm(FieldConcept discovery, HostFacility host, double discoveryLatitude, double discoveryLongitude, TiebackRouteNetwork routeNetwork)
      Resolves the route length used for screening.
      Parameters:
      discovery - discovery concept
      host - host facility
      discoveryLatitude - discovery latitude in degrees
      discoveryLongitude - discovery longitude in degrees
      routeNetwork - optional route network
      Returns:
      route length in km
    • resolveWaterDepthM

      private double resolveWaterDepthM(FieldConcept discovery, HostFacility host, TiebackRouteNetwork routeNetwork)
      Resolves water depth from concept infrastructure and host data.
      Parameters:
      discovery - discovery concept
      host - host facility
      routeNetwork - optional route network
      Returns:
      maximum route water depth in meters
    • applyRouteNetworkSummary

      private void applyRouteNetworkSummary(TiebackOption option, TiebackRouteNetwork routeNetwork)
      Applies route-network metadata to a tieback option.
      Parameters:
      option - tieback option to update
      routeNetwork - optional route network
    • estimateProducedWaterRate

      private double estimateProducedWaterRate(ReservoirInput reservoir, double oilRateBopd)
      Estimates produced-water rate from water cut and oil rate.
      Parameters:
      reservoir - reservoir input, or null
      oilRateBopd - oil rate in bbl/d
      Returns:
      produced-water rate in m3/d
    • estimateTotalLiquidRateM3d

      private double estimateTotalLiquidRateM3d(double oilRateBopd, double waterRateM3d)
      Estimates total liquid rate.
      Parameters:
      oilRateBopd - oil rate in bbl/d
      waterRateM3d - water rate in m3/d
      Returns:
      total liquid rate in m3/d
    • estimatePipelineDiameterInches

      private double estimatePipelineDiameterInches(int wellCount, double totalRate, String rateUnit, boolean isGasField)
      Estimates a screening pipeline diameter.
      Parameters:
      wellCount - number of producing wells
      totalRate - total production rate
      rateUnit - total production rate unit
      isGasField - true for gas field concepts
      Returns:
      pipeline diameter in inches
    • estimateFlowlineHeatTransferCoefficient

      private double estimateFlowlineHeatTransferCoefficient(InfrastructureInput infrastructure)
      Estimates a representative flowline heat transfer coefficient.
      Parameters:
      infrastructure - infrastructure input, or null
      Returns:
      overall heat transfer coefficient in W/m2K
    • createRepresentativeWellheadStream

      private Stream createRepresentativeWellheadStream(ReservoirInput reservoir, double pressureBara, double temperatureC, boolean isGasField, double totalRate, String rateUnit)
      Creates a representative wellhead stream for hydraulic screening.
      Parameters:
      reservoir - reservoir input, or null for defaults
      pressureBara - wellhead pressure in bara
      temperatureC - wellhead temperature in Celsius
      isGasField - true for gas field concepts
      totalRate - total production rate
      rateUnit - total production rate unit
      Returns:
      representative stream with total mass flow set
    • createRepresentativeFluid

      private SystemInterface createRepresentativeFluid(ReservoirInput reservoir, double temperatureC, double pressureBara)
      Creates a representative fluid for hydraulic screening.
      Parameters:
      reservoir - reservoir input, or null for defaults
      temperatureC - temperature in Celsius
      pressureBara - pressure in bara
      Returns:
      initialized thermodynamic system
    • estimateMassFlowKgHr

      private double estimateMassFlowKgHr(boolean isGasField, double totalRate, String rateUnit)
      Estimates total mass flow for hydraulic screening.
      Parameters:
      isGasField - true for gas field concepts
      totalRate - total rate
      rateUnit - rate unit
      Returns:
      mass flow in kg/hr
    • estimateArrivalTemperatureC

      private double estimateArrivalTemperatureC(double inletTemperatureC, double seabedTemperatureC, double distanceKm, InfrastructureInput infrastructure)
      Estimates arrival temperature if the hydraulic model cannot run.
      Parameters:
      inletTemperatureC - inlet temperature in Celsius
      seabedTemperatureC - seabed temperature in Celsius
      distanceKm - route length in km
      infrastructure - infrastructure input, or null
      Returns:
      estimated arrival temperature in Celsius
    • estimateShutdownCooldownHours

      private double estimateShutdownCooldownHours(TiebackOption option, double inletTemperatureC, double seabedTemperatureC, InfrastructureInput infrastructure)
      Estimates shutdown cooldown time to hydrate risk.
      Parameters:
      option - tieback option with hydrate results
      inletTemperatureC - inlet temperature in Celsius
      seabedTemperatureC - seabed temperature in Celsius
      infrastructure - infrastructure input, or null
      Returns:
      cooldown time in hours
    • estimateShutdownCooldownRisk

      private double estimateShutdownCooldownRisk(TiebackOption option, InfrastructureInput infrastructure)
      Estimates shutdown cooldown risk score.
      Parameters:
      option - tieback option with cooldown results
      infrastructure - infrastructure input, or null
      Returns:
      risk score from 0 to 1
    • buildFlowAssuranceNotes

      private String buildFlowAssuranceNotes(TiebackOption option, FlowAssuranceReport report, MultiphaseFlowIntegrator.PipelineResult hydraulicResult, double seabedTemperatureC)
      Builds human-readable flow-assurance notes.
      Parameters:
      option - tieback option
      report - flow assurance report
      hydraulicResult - hydraulic result, or null if hydraulic screening failed
      seabedTemperatureC - seabed temperature in Celsius
      Returns:
      notes string
    • getDiscountRate

      public double getDiscountRate()
      Gets the discount rate.
      Returns:
      discount rate (0-1)
    • setDiscountRate

      public void setDiscountRate(double discountRate)
      Sets the discount rate.
      Parameters:
      discountRate - discount rate (0-1)
    • getGasPriceUsdPerSm3

      public double getGasPriceUsdPerSm3()
      Gets the gas price.
      Returns:
      gas price in USD/Sm3
    • setGasPriceUsdPerSm3

      public void setGasPriceUsdPerSm3(double gasPriceUsdPerSm3)
      Sets the gas price.
      Parameters:
      gasPriceUsdPerSm3 - gas price in USD/Sm3
    • getOilPriceUsdPerBbl

      public double getOilPriceUsdPerBbl()
      Gets the oil price.
      Returns:
      oil price in USD/bbl
    • setOilPriceUsdPerBbl

      public void setOilPriceUsdPerBbl(double oilPriceUsdPerBbl)
      Sets the oil price.
      Parameters:
      oilPriceUsdPerBbl - oil price in USD/bbl
    • getSubseaTreeCostMusd

      public double getSubseaTreeCostMusd()
      Gets the subsea tree cost.
      Returns:
      cost in MUSD per tree
    • setSubseaTreeCostMusd

      public void setSubseaTreeCostMusd(double subseaTreeCostMusd)
      Sets the subsea tree cost.
      Parameters:
      subseaTreeCostMusd - cost in MUSD per tree
    • getPipelineCostPerKmMusd

      public double getPipelineCostPerKmMusd()
      Gets the pipeline cost per km.
      Returns:
      cost in MUSD/km
    • setPipelineCostPerKmMusd

      public void setPipelineCostPerKmMusd(double pipelineCostPerKmMusd)
      Sets the pipeline cost per km.
      Parameters:
      pipelineCostPerKmMusd - cost in MUSD/km
    • getMaxTiebackDistanceKm

      public double getMaxTiebackDistanceKm()
      Gets the maximum tieback distance.
      Returns:
      maximum distance in km
    • setMaxTiebackDistanceKm

      public void setMaxTiebackDistanceKm(double maxTiebackDistanceKm)
      Sets the maximum tieback distance.
      Parameters:
      maxTiebackDistanceKm - maximum distance in km
    • getTaxModel

      public NorwegianTaxModel getTaxModel()
      Gets the tax model.
      Returns:
      tax model
    • setTaxModel

      public void setTaxModel(NorwegianTaxModel taxModel)
      Sets the tax model.
      Parameters:
      taxModel - tax model
    • quickScreen

      public TiebackAnalyzer.TiebackScreeningResult quickScreen(double discoveryLat, double discoveryLon, double reservesMMboe, double waterDepthM, HostFacility host)
      Quick screening for tieback feasibility without full analysis.

      Performs rapid go/no-go screening based on key constraints:

      • Distance to host
      • Water depth compatibility
      • Host capacity
      • Pressure compatibility
      Parameters:
      discoveryLat - discovery latitude
      discoveryLon - discovery longitude
      reservesMMboe - reserves in MMboe
      waterDepthM - water depth in meters
      host - potential host facility
      Returns:
      screening result with pass/fail and reason
    • screenAllHosts

      public List<TiebackAnalyzer.TiebackScreeningResult> screenAllHosts(double discoveryLat, double discoveryLon, double reservesMMboe, double waterDepthM, List<HostFacility> hosts)
      Screen multiple hosts quickly and return ranked results.
      Parameters:
      discoveryLat - discovery latitude
      discoveryLon - discovery longitude
      reservesMMboe - reserves in MMboe
      waterDepthM - water depth in meters
      hosts - list of potential hosts
      Returns:
      list of screening results, ranked by estimated NPV
    • estimateQuickCapex

      private double estimateQuickCapex(double distanceKm, double waterDepthM)
      Quick CAPEX estimate for screening.
      Parameters:
      distanceKm - the tieback distance in kilometers
      waterDepthM - the water depth in meters
      Returns:
      the estimated CAPEX in million USD
    • estimateQuickNpv

      private double estimateQuickNpv(double reservesMMboe, double capexMusd)
      Quick NPV estimate for screening.
      Parameters:
      reservesMMboe - recoverable reserves in million barrels of oil equivalent
      capexMusd - capital expenditure in million USD
      Returns:
      estimated net present value in million USD