R-package for diagnostics, reliability and predictive maintenance of pipeline systems.
The package aggregates to some extent the separate knowledge concerning engineering, reliability, diagnostics and predictive maintenance of pipeline systems. For the present time the package contains utilities for processing corrosion data commonly gathered by inline inspection, as well as empirical models for calculations of local thermal-hydraulic regimes of district heating network.
For the latest version leverage r-universe:
install.packages("pipenostics", repos = "https://omega1x.r-universe.dev")
⚠ Starting from version 0.1.8 the package is not supported on CRAN due to its resource limitations of checking parallel algorithms
By using of b31crvl()
simply imitate the output of
CRVL.BAS which is the honored software for determining the
allowable length and maximum allowable working pressure presented in ASME
B31G-1991:
library(pipenostics)
b31crvl(maop = 910, d = 30, wth = .438, smys = 52000, def = .72, depth = .1, l = 7.5)
-- Calculated data --
Intermediate factor (A) = 1.847
Design pressure = 1093 PSI; Safe pressure = 1093 PSI
Pipe may be operated safely at MAOP, 910 PSI
With corrosion length 7.500 inch, maximum allowed corrosion depth is 0.2490 inch; A = 1.847 With corrosion depth 0.100 inch, maximum allowed corrosion length is Inf inch; A = 5.000
Let’s consider a pipe in district heating network with
<- 762 # [mm]
diameter <- 10 # [mm]
wall_thickness <- 434.3697 # [MPa] UTS
which transfers heat-carrier (water) at
<- 0.588399 # [MPa]
operating_pressure <- 95 # [°C] temperature
During inline inspection four corroded areas (defects) are detected with:
<- c(2.45, 7.86, 7.93, 8.15) # [mm] depth
whereas the length of all defects is not greater 200 mm:
<- rep(200, 4) # [mm]
length print(length)
1] 200 200 200 200 [
Corrosion rates in radial and in longitudinal directions are not
well-known and may vary in range .01
- .30
mm/year:
= function(n) stats::runif(n, .01, .30) / 365
rar = function(n) stats::runif(n, .01, .30) / 365 ral
Then probabilities of failure (POFs) related to each corroded area are near:
<- mepof(depth, length, rep(diameter, 4), rep(wall_thickness, 4),
pof rep(UTS, 4), rep(operating_pressure, 4), rep(temperature, 4),
method = "dnv") rar, ral,
pipenostics::mepof: process case [4/4] - 100 % . All done, thanks!
print(pof)
1] 0.000000 0.252935 0.368741 0.771299 [
So, the POF of the pipe is near
print(max(pof))
1] 0.771299 [
The value of POF changes in time. So, in a year after inline inspection of the pipe we can get something near
<- mepof(depth, length, rep(diameter, 4), rep(wall_thickness, 4),
pof rep(UTS, 4), rep(operating_pressure, 4), rep(temperature, 4),
method = "dnv", days = 365) rar, ral,
pipenostics::mepof: process case [4/4] - 100 % . All done, thanks!
print(pof)
1] 0.000000 0.526646 0.647422 0.928825 [
For entire pipe we get something near:
print(max(pof))
1] 0.928825 [
Two years ago before inline inspection the pipe state was rather good:
<- mepof(depth, length, rep(diameter, 4), rep(wall_thickness, 4),
pof rep(UTS, 4), rep(operating_pressure, 4), rep(temperature, 4),
method = "dnv", days = -2 * 365) rar, ral,
pipenostics::mepof: process case [4/4] - 100 % . All done, thanks!
print(pof)
1] 0.000000 0.040849 0.072734 0.272358 [
For entire pipe we get something near:
print(max(pof))
1] 0.272358 [
Let’s consider the next 4-segment tracing path:
Suppose we have the next sensor readings for forward tracing:
<- 130 # [°C]
t_fw <- 0.588399 # [MPa]
p_fw <- 250 # [ton/hour] g_fw
Let’s discharges to network for each pipeline segment are somehow determined as
<- seq(0, 30, 10) # [ton/hour]
discharges print(discharges)
1] 0 10 20 30 [
Then the calculated regime (red squares) for forward tracing is
<- m325traceline(t_fw, p_fw, g_fw, discharges, forward = TRUE)
regime_fw print(regime_fw)
$temperature
1] 129.1799 128.4269 127.9628 127.3367
[
$pressure
1] 0.5878607 0.5874226 0.5872143 0.5870330
[
$flow_rate
1] 250 240 220 190 [
ℹ Read article Concepts and useful notes for a deeper dive into the topic.