Skip to the content.

Pipe Fittings and Equivalent Length Method

Overview

NeqSim supports pressure drop calculations through pipe fittings (bends, valves, tees, reducers, etc.) using the equivalent length method. This method converts the pressure loss through each fitting into an equivalent length of straight pipe that would produce the same pressure drop.

Mathematical Basis

The Equivalent Length Method

For fully turbulent flow, the pressure drop through a fitting can be expressed using the K-factor (resistance coefficient) method:

\[\Delta P_{fitting} = K \cdot \frac{\rho V^2}{2}\]

The equivalent length method relates K to the Darcy friction factor $f$:

\[K = f \cdot \frac{L_{eq}}{D}\]

where $\frac{L_{eq}}{D}$ is the equivalent length ratio (L/D).

Combining with the Darcy-Weisbach equation for pipe friction:

\[\Delta P_{friction} = f \cdot \frac{L}{D} \cdot \frac{\rho V^2}{2}\]

The effective length for pressure drop calculations becomes:

\[L_{eff} = L_{physical} + \sum_{i} \left(\frac{L}{D}\right)_i \cdot D\]

where:

Total Pressure Drop

The total pressure drop in a pipe with fittings is:

\[\Delta P_{total} = f \cdot \frac{L_{eff}}{D} \cdot \frac{\rho V^2}{2} + \rho g \Delta z\]

Components:

Note: Fittings affect only the friction pressure drop, not the elevation term.

Friction Factor Correlations

NeqSim uses the Haaland equation for turbulent flow:

\[f = \left[ -1.8 \log_{10} \left( \left( \frac{\varepsilon/D}{3.7} \right)^{1.11} + \frac{6.9}{Re} \right) \right]^{-2}\]

For laminar flow ($Re < 2300$):

\[f = \frac{64}{Re}\]

For transition flow ($2300 < Re < 4000$): Linear interpolation between laminar and turbulent.


Standard L/D Values

The following L/D values are from Crane Technical Paper 410 (TP-410), the industry standard reference for flow of fluids through valves, fittings, and pipe.

Elbows and Bends

Fitting Type L/D Notes
90° elbow, standard (R/D=1) 30 Standard radius
90° elbow, long radius (R/D=1.5) 16 Most common in process
90° mitre bend 60 Sharp corner
45° elbow, standard 16  
45° elbow, long radius 10  
180° return bend 50  

Tees

Fitting Type L/D Notes
Tee, through flow 20 Flow continues straight
Tee, branch flow 60 Flow turns into branch

Valves

Valve Type L/D Notes
Gate valve, fully open 8 Low resistance
Gate valve, 3/4 open 35  
Gate valve, 1/2 open 160  
Gate valve, 1/4 open 900  
Globe valve, fully open 340 High resistance
Ball valve, fully open 3 Very low resistance
Butterfly valve, fully open 45  
Check valve, swing 100  
Check valve, lift 600  

Other Fittings

Fitting Type L/D Notes
Sudden expansion 50 Depends on area ratio
Sudden contraction 30 Depends on area ratio
Gradual reducer 10  
Gradual expander 20  
Entrance, sharp-edged 25 Pipe from tank
Entrance, rounded 10  
Exit to tank 50  

Implementation in NeqSim

Supported Pipe Classes

The equivalent length method is implemented in the following pipe classes:

  1. Pipeline (base class) - Provides fittings management
  2. AdiabaticPipe - Single-phase compressible gas flow
  3. PipeBeggsAndBrills - Multiphase flow (Beggs & Brill correlation)
  4. IncompressiblePipeFlow - Single-phase liquid flow

Key Methods

// Add a fitting with explicit L/D ratio
pipe.addFitting(String name, double LdivD);

// Add a fitting from database
pipe.addFittingFromDatabase(String name);

// Add a standard fitting type (uses built-in L/D values)
pipe.addStandardFitting(String type);

// Add multiple identical fittings
pipe.addFittings(String name, double LdivD, int count);

// Get equivalent length from fittings
double eqLength = pipe.getEquivalentLength();  // meters

// Get effective length (physical + fittings)
double effLength = pipe.getEffectiveLength();  // meters

// Enable/disable fittings in calculations
pipe.setUseFittings(boolean enable);

// Print fittings summary
pipe.printFittingsSummary();

Standard Fitting Types

Use these type names with addStandardFitting():

Elbows:

Tees:

Valves:

Other:


Usage Examples

Example 1: Single-Phase Gas Flow (AdiabaticPipe)

import neqsim.process.equipment.pipeline.AdiabaticPipe;
import neqsim.process.equipment.stream.Stream;
import neqsim.thermo.system.SystemSrkEos;

// Create gas stream
SystemSrkEos gas = new SystemSrkEos(288.15, 50.0);
gas.addComponent("methane", 10.0, "MSm3/day");
gas.setMixingRule("classic");
Stream feed = new Stream("Feed", gas);
feed.run();

// Create pipe with fittings
AdiabaticPipe pipe = new AdiabaticPipe("Export Pipe", feed);
pipe.setLength(500.0);           // 500m physical length
pipe.setDiameter(0.508);         // 20 inch
pipe.setPipeWallRoughness(5e-5); // Commercial steel

// Add fittings
pipe.addFittings("90-degree elbow", 30.0, 4);  // 4 elbows, L/D=30 each
pipe.addFitting("gate valve", 8.0);            // 1 gate valve
pipe.addStandardFitting("tee_through");        // 1 tee (through flow)

// Run calculation
pipe.run();

// Results
System.out.println("Physical length: " + pipe.getLength() + " m");
System.out.println("Equivalent length: " + pipe.getEquivalentLength() + " m");
System.out.println("Effective length: " + pipe.getEffectiveLength() + " m");
System.out.println("Pressure drop: " + pipe.getPressureDrop() + " bar");

// Compare with no fittings
pipe.setUseFittings(false);
pipe.run();
System.out.println("Pressure drop (no fittings): " + pipe.getPressureDrop() + " bar");

Output:

Physical length: 500.0 m
Equivalent length: 74.93 m (4×30 + 8 + 20) × 0.508
Effective length: 574.93 m
Pressure drop: 1.45 bar
Pressure drop (no fittings): 1.26 bar

Example 2: Multiphase Flow (PipeBeggsAndBrills)

import neqsim.process.equipment.pipeline.PipeBeggsAndBrills;
import neqsim.process.equipment.stream.Stream;
import neqsim.thermo.system.SystemSrkEos;

// Create two-phase stream (gas + oil)
SystemSrkEos fluid = new SystemSrkEos(323.15, 80.0);
fluid.addComponent("methane", 5.0, "MSm3/day");
fluid.addComponent("nC10", 500.0, "kg/hr");
fluid.setMixingRule("classic");
Stream feed = new Stream("Wellhead", fluid);
feed.run();

// Create multiphase flowline
PipeBeggsAndBrills flowline = new PipeBeggsAndBrills("Flowline", feed);
flowline.setLength(2000.0);          // 2 km
flowline.setDiameter(0.2032);        // 8 inch
flowline.setPipeWallRoughness(5e-5);
flowline.setInletElevation(0);
flowline.setOutletElevation(-50);    // 50m downward
flowline.setNumberOfIncrements(50);

// Add typical flowline fittings
flowline.addFittings("90-degree elbow", 30.0, 6);  // 6 bends
flowline.addFitting("tee branch", 60.0);          // 1 tee (branch flow)
flowline.addStandardFitting("valve_ball_open");   // Ball valve

flowline.run();

// Results
System.out.println("Flow regime: " + flowline.getFlowRegime());
System.out.println("Liquid holdup: " + flowline.getLiquidHoldup());
System.out.println("Physical length: " + flowline.getLength() + " m");
System.out.println("Equivalent length (fittings): " + flowline.getEquivalentLength() + " m");
System.out.println("Effective length: " + flowline.getEffectiveLength() + " m");
System.out.println("Pressure drop: " + 
    (flowline.getInletPressure() - flowline.getOutletPressure()) + " bar");

// Print fittings summary
flowline.printFittingsSummary();

Example 3: Liquid Flow (IncompressiblePipeFlow)

import neqsim.process.equipment.pipeline.IncompressiblePipeFlow;
import neqsim.process.equipment.stream.Stream;
import neqsim.thermo.system.SystemSrkEos;

// Create water stream
SystemSrkEos water = new SystemSrkEos(298.15, 5.0);
water.addComponent("water", 50.0, "m3/hr");
water.setMixingRule(2);
Stream feed = new Stream("Water", water);
feed.run();

// Create process piping with fittings
IncompressiblePipeFlow pipe = new IncompressiblePipeFlow("Cooling Water", feed);
pipe.setLength(200.0);           // 200m
pipe.setDiameter(0.1524);        // 6 inch
pipe.setPipeWallRoughness(4.5e-5);

// Typical process piping fittings
pipe.addFittings("elbow_90_long_radius", 16.0, 8);  // 8 long-radius elbows
pipe.addFitting("tee_through", 20.0);
pipe.addFitting("tee_through", 20.0);
pipe.addFitting("gate_valve", 8.0);
pipe.addFitting("gate_valve", 8.0);
pipe.addFittingFromDatabase("Globe valve, fully open");  // From database

// Elevation change (pump suction from tank)
pipe.setInletElevation(0);
pipe.setOutletElevation(15);  // Pump up 15m

pipe.run();

System.out.println("Effective length: " + pipe.getEffectiveLength() + " m");
System.out.println("Outlet pressure: " + pipe.getOutletPressure("bara") + " bara");

Example 4: Comparing Results With and Without Fittings

// Create pipe
AdiabaticPipe pipe = new AdiabaticPipe("Test Pipe", feed);
pipe.setLength(1000.0);
pipe.setDiameter(0.3);
pipe.setPipeWallRoughness(5e-5);

// Add fittings
pipe.addFittings("90-degree elbow", 30.0, 10);
pipe.addFittings("gate valve", 8.0, 2);

// Run with fittings
pipe.setUseFittings(true);
pipe.run();
double dpWithFittings = pipe.getPressureDrop();

// Run without fittings  
pipe.setUseFittings(false);
pipe.run();
double dpNoFittings = pipe.getPressureDrop();

// Calculate fitting contribution
double fittingContribution = (dpWithFittings - dpNoFittings) / dpWithFittings * 100;
System.out.println("Pressure drop with fittings: " + dpWithFittings + " bar");
System.out.println("Pressure drop without fittings: " + dpNoFittings + " bar");
System.out.println("Fittings contribution: " + fittingContribution + "%");

Technical Notes

When to Use Equivalent Length Method

The equivalent length method is most accurate when:

  1. Turbulent flow ($Re > 4000$) - The method assumes fully-developed turbulent flow
  2. Consistent pipe size - Fittings connect pipes of the same diameter
  3. Standard fittings - Using industry-standard fittings with known L/D values

For laminar flow or complex geometries, the K-factor method may be more accurate.

Relationship Between L/D and K-Factor

For turbulent flow with typical friction factor $f \approx 0.02$:

\[K \approx 0.02 \times (L/D)\]

Example: A 90° elbow with L/D = 30 has $K \approx 0.6$

Multiphase Flow Considerations

For multiphase flow (e.g., PipeBeggsAndBrills):

  1. The equivalent length is added to the physical length before segmentation
  2. Each segment’s friction calculation uses the proportional effective length
  3. The slip correction factor $S$ is applied to the two-phase friction factor
  4. Elevation effects are NOT affected by fittings (fittings don’t add elevation)

Limitations

  1. Two-phase K-factors - The single-phase L/D values may underestimate losses in two-phase flow. Some engineers apply a 1.2-1.5 multiplier for two-phase.

  2. Close-coupled fittings - When fittings are installed close together (less than 10D apart), the combined loss may differ from the sum of individual losses.

  3. Partial valve openings - The L/D values for partially open valves are approximate. Use manufacturer’s Cv data for accurate calculations.


References

  1. Crane Co., “Flow of Fluids Through Valves, Fittings, and Pipe,” Technical Paper 410 (TP-410)
  2. Beggs, H.D. and Brill, J.P., “A Study of Two-Phase Flow in Inclined Pipes,” JPT, May 1973
  3. Darby, R., “Chemical Engineering Fluid Mechanics,” 2nd Ed., Marcel Dekker, 2001
  4. Perry’s Chemical Engineers’ Handbook, 8th Edition, McGraw-Hill
  5. ASME B16.5 - Pipe Flanges and Flanged Fittings
  6. ISO 5167 - Measurement of fluid flow by means of pressure differential devices

Database Schema

The fittings table in the NeqSim database contains standard fitting L/D values:

CREATE TABLE fittings (
    name VARCHAR(255) PRIMARY KEY,
    LtoD DOUBLE NOT NULL,
    description TEXT
);

-- Example data
INSERT INTO fittings VALUES 
('Standard elbow (R=1.5D), 90deg', 16.0, 'Long radius 90-degree elbow'),
('Standard elbow (R=1D), 90deg', 30.0, 'Standard radius 90-degree elbow'),
('Gate valve, fully open', 8.0, 'Gate valve in fully open position'),
('Globe valve, fully open', 340.0, 'Globe valve in fully open position'),
('Ball valve, fully open', 3.0, 'Ball valve in fully open position');

To add custom fittings to the database, use SQL INSERT statements or the addFitting(name, LdivD) method for one-off calculations.