buckpy-dev 0.0.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- buckpy/__init__.py +13 -0
- buckpy/_static/logo.png +0 -0
- buckpy/_static/logo.svg +4 -0
- buckpy/buckfast_input_file_writer_.py +1233 -0
- buckpy/buckpy.py +132 -0
- buckpy/buckpy_gui.py +359 -0
- buckpy/buckpy_postprocessing.py +1305 -0
- buckpy/buckpy_preprocessing_current.py +1142 -0
- buckpy/buckpy_preprocessing_legacy.py +900 -0
- buckpy/buckpy_solver.py +777 -0
- buckpy/buckpy_variables.py +98 -0
- buckpy/buckpy_visualisation.py +419 -0
- buckpy_dev-0.0.1.dist-info/METADATA +51 -0
- buckpy_dev-0.0.1.dist-info/RECORD +18 -0
- buckpy_dev-0.0.1.dist-info/WHEEL +5 -0
- buckpy_dev-0.0.1.dist-info/entry_points.txt +2 -0
- buckpy_dev-0.0.1.dist-info/licenses/LICENSE +674 -0
- buckpy_dev-0.0.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"""
|
|
2
|
+
This module contains the definition of the indices of the variables used in BuckPy.
|
|
3
|
+
The indices of the variables listed in this module are global variables.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
# Index of the variables of the np_prob_var and np_case NumPy arrays
|
|
7
|
+
MUAX = 0
|
|
8
|
+
MULAT_HT = 1
|
|
9
|
+
MULAT_OP = 2
|
|
10
|
+
HOOS = 3
|
|
11
|
+
|
|
12
|
+
# Index of the variables of the np_case NumPy array
|
|
13
|
+
CBF_HT = 4
|
|
14
|
+
CBF_OP = 5
|
|
15
|
+
LFF_INST = 6
|
|
16
|
+
LFF_HT = 7
|
|
17
|
+
LFF_OP = 8
|
|
18
|
+
RFF_INST = 9
|
|
19
|
+
RFF_HT = 10
|
|
20
|
+
RFF_OP = 11
|
|
21
|
+
EAF_INST = 12
|
|
22
|
+
EAF_HT = 13
|
|
23
|
+
EAF_P_OP = 14
|
|
24
|
+
EAF_OP = 15
|
|
25
|
+
EAF_OP_UNBUCK = 16
|
|
26
|
+
LDELTAF_HT = 17
|
|
27
|
+
RDELTAF_HT = 18
|
|
28
|
+
LDELTAF_OP = 19
|
|
29
|
+
RDELTAF_OP = 20
|
|
30
|
+
|
|
31
|
+
# Index of the variables of the np_scen NumPy array
|
|
32
|
+
KP = 0
|
|
33
|
+
LENGTH = 1
|
|
34
|
+
ROUTE_TYPE = 2
|
|
35
|
+
BEND_RADIUS = 3
|
|
36
|
+
SW_INST = 4
|
|
37
|
+
SW_HT = 5
|
|
38
|
+
SW_OP = 6
|
|
39
|
+
SCHAR_HT = 7
|
|
40
|
+
SCHAR_OP = 8
|
|
41
|
+
SV_HT = 9
|
|
42
|
+
SV_OP = 10
|
|
43
|
+
CBF_RCM = 11
|
|
44
|
+
RLT = 12
|
|
45
|
+
FRF_HT = 13
|
|
46
|
+
FRF_P_OP = 14
|
|
47
|
+
FRF_T_OP = 15
|
|
48
|
+
FRF_OP = 16
|
|
49
|
+
L_BUCKLE_HT = 17
|
|
50
|
+
EAF_BUCKLE_HT = 18
|
|
51
|
+
L_BUCKLE_OP = 19
|
|
52
|
+
EAF_BUCKLE_OP = 20
|
|
53
|
+
SECTION_ID = 21
|
|
54
|
+
SECTION_KP = 22
|
|
55
|
+
SECTION_REF = 23
|
|
56
|
+
MUAX_MEAN = 24
|
|
57
|
+
MULAT_HT_MEAN = 25
|
|
58
|
+
MULAT_OP_MEAN = 26
|
|
59
|
+
HOOS_MEAN = 27
|
|
60
|
+
|
|
61
|
+
# Index of the variables of the np_distr NumPy array
|
|
62
|
+
MUAX_ARRAY = 0
|
|
63
|
+
MUAX_CDF_ARRAY = 1
|
|
64
|
+
MULAT_ARRAY_HT = 2
|
|
65
|
+
MULAT_CDF_ARRAY_HT = 3
|
|
66
|
+
MULAT_ARRAY_OP = 4
|
|
67
|
+
MULAT_CDF_ARRAY_OP = 5
|
|
68
|
+
HOOS_ARRAY = 6
|
|
69
|
+
HOOS_CDF_ARRAY = 7
|
|
70
|
+
|
|
71
|
+
# Index of the variables of the np_ends NumPy array
|
|
72
|
+
ROUTE_TYPE_BC = 0
|
|
73
|
+
KP_FROM = 1
|
|
74
|
+
KP_TO = 2
|
|
75
|
+
REAC_INST = 3
|
|
76
|
+
REAC_HT = 4
|
|
77
|
+
REAC_OP = 5
|
|
78
|
+
|
|
79
|
+
# Index of the variables of the np_pp_buckle NumPy array
|
|
80
|
+
SIM_PP = 0
|
|
81
|
+
KP_PP = 1
|
|
82
|
+
ROUTE_TYPE_PP = 2
|
|
83
|
+
MUAX_PP = 3
|
|
84
|
+
MULAT_OP_PP = 4
|
|
85
|
+
HOOS_PP = 5
|
|
86
|
+
CBF_OP_PP = 6
|
|
87
|
+
VAS_PP = 7
|
|
88
|
+
|
|
89
|
+
# Index of the variables of the np_pp_plot NumPy array
|
|
90
|
+
P_KP = 0
|
|
91
|
+
P_CBF_HT = 1
|
|
92
|
+
P_CBF_OP = 2
|
|
93
|
+
P_EAF_INST = 3
|
|
94
|
+
P_EAF_HT = 4
|
|
95
|
+
P_EAF_P_OP = 5
|
|
96
|
+
P_EAF_OP = 6
|
|
97
|
+
P_BETA2 = 7
|
|
98
|
+
P_EAF_OP_UNBUCK = 8
|
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
"""
|
|
2
|
+
This module contains the plot functions of BuckPy result files.
|
|
3
|
+
"""
|
|
4
|
+
import time
|
|
5
|
+
import pandas as pd
|
|
6
|
+
import matplotlib.pyplot as plt
|
|
7
|
+
|
|
8
|
+
def read_output(output_file_name):
|
|
9
|
+
|
|
10
|
+
'''
|
|
11
|
+
Read the data from the BuckPy result file.
|
|
12
|
+
|
|
13
|
+
Parameters
|
|
14
|
+
----------
|
|
15
|
+
output_file_name : string
|
|
16
|
+
File path of the BuckPy result file.
|
|
17
|
+
|
|
18
|
+
Returns
|
|
19
|
+
-------
|
|
20
|
+
df_sets : pandas DataFrame
|
|
21
|
+
DataFrame containing the data in the 'Sets' tab.
|
|
22
|
+
df_buckle : pandas DataFrame
|
|
23
|
+
DataFrame containing the data related to the number of buckles.
|
|
24
|
+
df_force_prof : pandas DataFrame
|
|
25
|
+
DataFrame containing the force profile data.
|
|
26
|
+
'''
|
|
27
|
+
|
|
28
|
+
# Read all tabs in the BuckPy result file
|
|
29
|
+
all_sheets_dict = pd.read_excel(output_file_name, sheet_name = None)
|
|
30
|
+
|
|
31
|
+
# Read the 'Sets', 'No Buckles' and 'Force Profiles' tabs
|
|
32
|
+
df_sets = all_sheets_dict['Sets']
|
|
33
|
+
df_buckle = all_sheets_dict['No Buckles']
|
|
34
|
+
df_force_prof = all_sheets_dict['Force Profiles']
|
|
35
|
+
|
|
36
|
+
return df_sets, df_buckle, df_force_prof
|
|
37
|
+
|
|
38
|
+
def assembly_dataframe_bend_sleeper_ilt(df):
|
|
39
|
+
|
|
40
|
+
'''
|
|
41
|
+
Read the route bend data from the BuckPy input file and select the KP
|
|
42
|
+
of the 'Bend', 'Sleeper', 'RCM' and 'ILT' from the 'Route Type' column.
|
|
43
|
+
|
|
44
|
+
Parameters
|
|
45
|
+
----------
|
|
46
|
+
df : pandas DataFrame
|
|
47
|
+
DataFrame containing the data in the 'Route' tab.
|
|
48
|
+
|
|
49
|
+
Returns
|
|
50
|
+
-------
|
|
51
|
+
df1 : pandas DataFrame
|
|
52
|
+
DataFrame containing the 'Bend' route type data.
|
|
53
|
+
df2 : pandas DataFrame
|
|
54
|
+
DataFrame containing the 'Sleeper' route type data.
|
|
55
|
+
df3 : pandas DataFrame
|
|
56
|
+
DataFrame containing the 'RCM' route type data.
|
|
57
|
+
df4 : pandas DataFrame
|
|
58
|
+
DataFrame containing the 'ILT' route type data.
|
|
59
|
+
'''
|
|
60
|
+
|
|
61
|
+
# Select route bend and KP columns
|
|
62
|
+
cols = ['Route Type', 'Point ID From', 'Point ID To', 'KP From', 'KP To']
|
|
63
|
+
df = df[cols]
|
|
64
|
+
|
|
65
|
+
# Select rows of route bend from 'Route Type'
|
|
66
|
+
df1 = df.loc[df['Route Type'] == 'Bend'].copy()
|
|
67
|
+
df1 = df1.reset_index(drop = True)
|
|
68
|
+
|
|
69
|
+
# Select rows of sleeper from 'Point ID'
|
|
70
|
+
df2 = df.iloc[1:-1].loc[df['Route Type'] == 'Sleeper'].copy()
|
|
71
|
+
df2 = df2.reset_index(drop = True)
|
|
72
|
+
|
|
73
|
+
# Select rows of RCM from 'Point ID'
|
|
74
|
+
df3 = df.iloc[1:-1].loc[df['Route Type'] == 'RCM'].copy()
|
|
75
|
+
df3 = df3.reset_index(drop = True)
|
|
76
|
+
|
|
77
|
+
# Select rows of ILT from 'Point ID'
|
|
78
|
+
df4 = df.iloc[1:-1].loc[df['Point ID From'].str.contains('ILT') &
|
|
79
|
+
df['Point ID To'].str.contains('ILT')].copy()
|
|
80
|
+
df4 = df4.reset_index(drop = True)
|
|
81
|
+
|
|
82
|
+
return df1, df2, df3, df4
|
|
83
|
+
|
|
84
|
+
def assembly_double_rows(df):
|
|
85
|
+
|
|
86
|
+
"""
|
|
87
|
+
Double each row of the dataframe based on KP.
|
|
88
|
+
|
|
89
|
+
Parameters
|
|
90
|
+
----------
|
|
91
|
+
df : pandas DataFrame
|
|
92
|
+
DataFrame containing the KP and results.
|
|
93
|
+
|
|
94
|
+
Returns
|
|
95
|
+
-------
|
|
96
|
+
df : pandas DataFrame
|
|
97
|
+
DataFrame containing the doubled rows of KP and results.
|
|
98
|
+
"""
|
|
99
|
+
|
|
100
|
+
# Double each row of the df
|
|
101
|
+
df_temp1 = df.copy()
|
|
102
|
+
df_temp1 = df_temp1.rename(columns = {'KP To (m)': 'KP'})
|
|
103
|
+
df_temp1 = df_temp1.drop(labels = 'KP From (m)', axis = 1)
|
|
104
|
+
df_temp1['sort'] = 1
|
|
105
|
+
|
|
106
|
+
df_temp2 = df.copy()
|
|
107
|
+
df_temp2 = df_temp2.rename(columns = {'KP From (m)': 'KP'})
|
|
108
|
+
df_temp2 = df_temp2.drop(labels = 'KP To (m)', axis = 1)
|
|
109
|
+
df_temp2['sort'] = 2
|
|
110
|
+
|
|
111
|
+
# Double the rows except the start and end
|
|
112
|
+
df = pd.concat([df_temp1, df_temp2])
|
|
113
|
+
df = df.sort_values(by = ['KP', 'sort']).reset_index(drop = True)
|
|
114
|
+
|
|
115
|
+
# Double the start and end rows and fill nan with 0
|
|
116
|
+
first_row = pd.DataFrame({'KP': [df['KP'].min()]})
|
|
117
|
+
last_row = pd.DataFrame({'KP': [df['KP'].max()]})
|
|
118
|
+
df = pd.concat([first_row, df, last_row], ignore_index = True)
|
|
119
|
+
df = df.fillna(0)
|
|
120
|
+
|
|
121
|
+
return df
|
|
122
|
+
|
|
123
|
+
def assembly_dataframe_plot(df_sets, df_pps):
|
|
124
|
+
|
|
125
|
+
"""
|
|
126
|
+
Assemble the dataframes on the probabilistic results and
|
|
127
|
+
post-processing input data from BuckPy.
|
|
128
|
+
|
|
129
|
+
Parameters
|
|
130
|
+
----------
|
|
131
|
+
df_sets : pandas DataFrame
|
|
132
|
+
DataFrame containing the output data in the 'Sets' tab.
|
|
133
|
+
df_pps : pandas DataFrame
|
|
134
|
+
DataFrame containing the input data in the 'Post-Processing' tab.
|
|
135
|
+
|
|
136
|
+
Returns
|
|
137
|
+
-------
|
|
138
|
+
df : pandas DataFrame
|
|
139
|
+
DataFrame containing the doubled rows of KP and results.
|
|
140
|
+
"""
|
|
141
|
+
|
|
142
|
+
# Accept both legacy and current post-processing schemas
|
|
143
|
+
if {"pp_set", "KP_from", "KP_to"}.issubset(df_pps.columns):
|
|
144
|
+
df_pps = df_pps.rename(columns={
|
|
145
|
+
"pp_set": "Set Label",
|
|
146
|
+
"KP_from": "KP From (m)",
|
|
147
|
+
"KP_to": "KP To (m)",
|
|
148
|
+
})
|
|
149
|
+
else:
|
|
150
|
+
df_pps = df_pps.rename(columns={
|
|
151
|
+
"Post-Processing Set": "Set Label",
|
|
152
|
+
"KP From": "KP From (m)",
|
|
153
|
+
"KP To": "KP To (m)",
|
|
154
|
+
})
|
|
155
|
+
df_pps = df_pps[["Set Label", "KP From (m)", "KP To (m)"]]
|
|
156
|
+
|
|
157
|
+
# DataFrame of the 'Sets' tab from the BuckPy output
|
|
158
|
+
df_sets = df_sets[['Set Label', 'KP From (m)', 'KP To (m)', 'Probability of Buckling',
|
|
159
|
+
'Characteristic VAS Probability',
|
|
160
|
+
'Characteristic VAS, Unconditional (m)',
|
|
161
|
+
'Characteristic Lateral Breakout Friction Probability',
|
|
162
|
+
'Characteristic Lateral Breakout Friction, Buckles',
|
|
163
|
+
'Lateral Breakout Friction, HE, Geotech']]
|
|
164
|
+
|
|
165
|
+
# Add sets without outputs
|
|
166
|
+
df = pd.concat([df_sets, df_pps])
|
|
167
|
+
df = df.drop_duplicates(subset = ['Set Label', 'KP From (m)', 'KP To (m)'],
|
|
168
|
+
keep = 'first')
|
|
169
|
+
df = df.sort_values(by = ['KP From (m)'])
|
|
170
|
+
|
|
171
|
+
# Double each row for KP
|
|
172
|
+
df = assembly_double_rows(df)
|
|
173
|
+
|
|
174
|
+
# Add initial and final rows with zeros
|
|
175
|
+
df_temp1 = pd.DataFrame({'KP': [df['KP'].min()],
|
|
176
|
+
'Probability of Buckling': [0.0],
|
|
177
|
+
'Characteristic VAS, Unconditional (m)': [0.0],
|
|
178
|
+
'Characteristic Lateral Breakout Friction, Buckles': [0.0]})
|
|
179
|
+
df_temp2 = pd.DataFrame({'KP': [df['KP'].max()],
|
|
180
|
+
'Probability of Buckling': [0.0],
|
|
181
|
+
'Characteristic VAS, Unconditional (m)': [0.0],
|
|
182
|
+
'Characteristic Lateral Breakout Friction, Buckles': [0.0]})
|
|
183
|
+
df = pd.concat([df_temp1, df, df_temp2], ignore_index = True)
|
|
184
|
+
df = df.fillna(0.0)
|
|
185
|
+
|
|
186
|
+
# Replace 0.0 with NaN for Geotech friction column
|
|
187
|
+
df.loc[df['Characteristic Lateral Breakout Friction, Buckles'] == 0.0,
|
|
188
|
+
'Lateral Breakout Friction, HE, Geotech'] = 0.0
|
|
189
|
+
|
|
190
|
+
return df
|
|
191
|
+
|
|
192
|
+
def plot_bend_sleeper_ilt(a1, df1, df2, df3, df4, y_max):
|
|
193
|
+
|
|
194
|
+
"""
|
|
195
|
+
Plot route bend, sleeper and ILT.
|
|
196
|
+
|
|
197
|
+
Parameters
|
|
198
|
+
----------
|
|
199
|
+
a1 : Matplotlib plot
|
|
200
|
+
Axis of the Matplotlib plot.
|
|
201
|
+
df1 : pandas DataFrame
|
|
202
|
+
Dataframe containing the locations of the route bends.
|
|
203
|
+
df2 : pandas DataFrame
|
|
204
|
+
Dataframe containing the locations of sleepers.
|
|
205
|
+
df3 : pandas DataFrame
|
|
206
|
+
Dataframe containing the locations of RCMs.
|
|
207
|
+
df4 : pandas DataFrame
|
|
208
|
+
Dataframe containing the locations of ILTs.
|
|
209
|
+
"""
|
|
210
|
+
|
|
211
|
+
# Plot bends
|
|
212
|
+
for index, row in df1.iterrows():
|
|
213
|
+
if index == 0:
|
|
214
|
+
a1.plot([row['KP From'], row['KP To']], 2 * [0.1 * y_max],
|
|
215
|
+
color = 'C2', label = 'Route Bend', linestyle = 'dotted')
|
|
216
|
+
else:
|
|
217
|
+
a1.plot([row['KP From'], row['KP To']], 2 * [0.1 * y_max],
|
|
218
|
+
color = 'C2', linestyle = 'dotted')
|
|
219
|
+
|
|
220
|
+
# Plot sleepers
|
|
221
|
+
for index, row in df2.iterrows():
|
|
222
|
+
kp_centre = 0.5 * (row['KP From'] + row['KP To'])
|
|
223
|
+
if index == 0:
|
|
224
|
+
a1.scatter(kp_centre, 0.1 * y_max,
|
|
225
|
+
color = 'C3', label = 'Sleeper', marker = '*')
|
|
226
|
+
else:
|
|
227
|
+
a1.scatter(kp_centre, 0.1 * y_max,
|
|
228
|
+
color = 'C3', marker = '*')
|
|
229
|
+
|
|
230
|
+
# Plot RCMs
|
|
231
|
+
for index, row in df3.iterrows():
|
|
232
|
+
kp_centre = 0.5 * (row['KP From'] + row['KP To'])
|
|
233
|
+
if index == 0:
|
|
234
|
+
a1.scatter(kp_centre, 0.1 * y_max,
|
|
235
|
+
color = 'C4', label = 'RCM', marker = 'o')
|
|
236
|
+
else:
|
|
237
|
+
a1.scatter(kp_centre, 0.1 * y_max,
|
|
238
|
+
color = 'C4', marker = 'o')
|
|
239
|
+
|
|
240
|
+
# Plot ILTs
|
|
241
|
+
for index, row in df4.iterrows():
|
|
242
|
+
kp_centre = 0.5 * (row['KP From'] + row['KP To'])
|
|
243
|
+
if index == 0:
|
|
244
|
+
a1.scatter(kp_centre, 0.1 * y_max,
|
|
245
|
+
color = 'C5', label = 'ILT', marker = '+')
|
|
246
|
+
else:
|
|
247
|
+
a1.scatter(kp_centre, 0.1 * y_max,
|
|
248
|
+
color = 'C5', marker = '+')
|
|
249
|
+
|
|
250
|
+
def plot_results(file_name, df_no_buckles, df_force_profiles,
|
|
251
|
+
df_bends, df_sleepers, df_rcms, df_ilts, df_set_pps):
|
|
252
|
+
|
|
253
|
+
"""
|
|
254
|
+
Plot probabilistic results of BuckPy in 6 subplots:
|
|
255
|
+
Row 1: unbuckled EAF, Number of Buckles, VAS;
|
|
256
|
+
Row 2: buckled EAF, Probobality of Buckling, Friction.
|
|
257
|
+
|
|
258
|
+
Parameters
|
|
259
|
+
----------
|
|
260
|
+
file_name : str
|
|
261
|
+
The name of the output image file.
|
|
262
|
+
df_no_buckles : pandas DataFrame
|
|
263
|
+
DataFrame containing the data related to the number of buckles.
|
|
264
|
+
df_force_profiles : pandas DataFrame
|
|
265
|
+
DataFrame containing the force profile data.
|
|
266
|
+
df_bends : pandas DataFrame
|
|
267
|
+
DataFrame containing the 'Bend' route type data.
|
|
268
|
+
df_sleepers : pandas DataFrame
|
|
269
|
+
DataFrame containing the 'Sleeper' route type data.
|
|
270
|
+
df_rcms : pandas DataFrame
|
|
271
|
+
DataFrame containing the 'RCM' route type data.
|
|
272
|
+
df_ilts : pandas DataFrame
|
|
273
|
+
DataFrame containing the 'ILT' route type data.
|
|
274
|
+
df_set_pps : pandas DataFrame
|
|
275
|
+
DataFrame containing the doubled rows of KP and results from
|
|
276
|
+
'Sets' and 'Post-Processing' tabs.
|
|
277
|
+
"""
|
|
278
|
+
|
|
279
|
+
# Generate matplolib figure
|
|
280
|
+
fig = plt.figure()
|
|
281
|
+
dpi_size = 110
|
|
282
|
+
fig.set_size_inches(19.2 * 100 / dpi_size, 10.8 * 100 / dpi_size)
|
|
283
|
+
|
|
284
|
+
# Subplot 1: Plot probabilistic results of the unbuckled EAF
|
|
285
|
+
a1 = fig.add_subplot(231)
|
|
286
|
+
a1.plot(df_force_profiles['KP (m)'],
|
|
287
|
+
df_force_profiles['EAF Operation [without Buckling] (kN)'])
|
|
288
|
+
|
|
289
|
+
a1.set_xlabel('KP (m)')
|
|
290
|
+
a1.set_ylabel('EAF [without Buckling] (kN)')
|
|
291
|
+
a1.grid()
|
|
292
|
+
|
|
293
|
+
# Subplot 2: Plot distribution of number of buckles
|
|
294
|
+
a2 = fig.add_subplot(232)
|
|
295
|
+
a2.plot(df_no_buckles['Number of Buckles'], df_no_buckles['Probability of Buckling'])
|
|
296
|
+
|
|
297
|
+
a2.set_xlabel('Number of Buckles')
|
|
298
|
+
a2.set_ylabel('Probability of Buckling')
|
|
299
|
+
a2.grid()
|
|
300
|
+
|
|
301
|
+
# Subplot 3: Plot characteristic VAS with route bend, sleeper, RCM and ILT
|
|
302
|
+
a3 = fig.add_subplot(233)
|
|
303
|
+
a3.plot(df_set_pps['KP'], df_set_pps['Characteristic VAS, Unconditional (m)'],
|
|
304
|
+
label = 'BuckPy')
|
|
305
|
+
plot_bend_sleeper_ilt(a3, df_bends, df_sleepers, df_rcms, df_ilts,
|
|
306
|
+
df_set_pps['Characteristic VAS, Unconditional (m)'].max())
|
|
307
|
+
|
|
308
|
+
a3.set_xlabel('KP (m)')
|
|
309
|
+
a3.set_ylabel('Characteristic VAS (m)')
|
|
310
|
+
a3.legend()
|
|
311
|
+
a3.grid()
|
|
312
|
+
|
|
313
|
+
# Subplot 4: Plot probabilistic results of the buckled EAF
|
|
314
|
+
a4 = fig.add_subplot(234)
|
|
315
|
+
a4.plot(df_force_profiles['KP (m)'],
|
|
316
|
+
df_force_profiles['EAF Operation (kN)'])
|
|
317
|
+
|
|
318
|
+
a4.set_xlabel('KP (m)')
|
|
319
|
+
a4.set_ylabel('EAF [with Buckling] (kN)')
|
|
320
|
+
a4.grid()
|
|
321
|
+
|
|
322
|
+
# Subplot 5: Plot probabilities of buckling with route bend, sleeper, RCM and ILT
|
|
323
|
+
a5 = fig.add_subplot(235)
|
|
324
|
+
a5.plot(df_set_pps['KP'], df_set_pps['Probability of Buckling'], label = 'BuckPy')
|
|
325
|
+
plot_bend_sleeper_ilt(a5, df_bends, df_sleepers, df_rcms, df_ilts,
|
|
326
|
+
df_set_pps['Probability of Buckling'].max())
|
|
327
|
+
|
|
328
|
+
a5.set_xlabel('KP (m)')
|
|
329
|
+
a5.set_ylabel('Probability of Buckling')
|
|
330
|
+
a5.legend()
|
|
331
|
+
a5.grid()
|
|
332
|
+
|
|
333
|
+
# Subplot 6: Plot characteristic friction with route bend, sleeper, RCM and ILT
|
|
334
|
+
prob_exceed_char_fric = df_set_pps[
|
|
335
|
+
'Characteristic Lateral Breakout Friction Probability'
|
|
336
|
+
].max()
|
|
337
|
+
a6 = fig.add_subplot(236)
|
|
338
|
+
a6.plot(df_set_pps['KP'], df_set_pps['Characteristic Lateral Breakout Friction, Buckles'],
|
|
339
|
+
label = f'P{int(100 * prob_exceed_char_fric)} Buckle Friction')
|
|
340
|
+
a6.plot(df_set_pps['KP'], df_set_pps['Lateral Breakout Friction, HE, Geotech'],
|
|
341
|
+
label = f'P{int(100 * prob_exceed_char_fric)} Geotech Friction', linestyle = 'dashed')
|
|
342
|
+
plot_bend_sleeper_ilt(a6, df_bends, df_sleepers, df_rcms, df_ilts,
|
|
343
|
+
df_set_pps['Characteristic Lateral Breakout Friction, Buckles'].max())
|
|
344
|
+
|
|
345
|
+
a6.set_xlabel('KP (m)')
|
|
346
|
+
a6.set_ylabel('Breakout Lateral Friction')
|
|
347
|
+
a6.legend()
|
|
348
|
+
a6.grid()
|
|
349
|
+
|
|
350
|
+
# Save the image file and close the plot
|
|
351
|
+
fig_manager=plt.get_current_fig_manager()
|
|
352
|
+
try:
|
|
353
|
+
fig_manager.window.state('zoomed')
|
|
354
|
+
except AttributeError:
|
|
355
|
+
pass
|
|
356
|
+
try:
|
|
357
|
+
fig_manager.window.showMaximized()
|
|
358
|
+
except AttributeError:
|
|
359
|
+
pass
|
|
360
|
+
plt.subplots_adjust(
|
|
361
|
+
left = 0.1, bottom = 0.1, right = 0.95, top = 0.925, wspace = 0.225, hspace = 0.2)
|
|
362
|
+
plt.savefig(file_name, dpi = dpi_size)
|
|
363
|
+
# plt.show()
|
|
364
|
+
plt.close()
|
|
365
|
+
|
|
366
|
+
def plot_buckpy(work_dir, input_file_name, scen_df, route_df, pp_df, bl_verbose):
|
|
367
|
+
"""
|
|
368
|
+
Plot the probabilistic buckling results from BuckPy result files.
|
|
369
|
+
|
|
370
|
+
Parameters
|
|
371
|
+
----------
|
|
372
|
+
work_dir : str
|
|
373
|
+
The working directory where the analysis files are located.
|
|
374
|
+
input_file_name : str
|
|
375
|
+
The name of the input file.
|
|
376
|
+
scen_df : pandas DataFrame
|
|
377
|
+
DataFrame containing scenario data.
|
|
378
|
+
route_df : pandas DataFrame
|
|
379
|
+
DataFrame containing route data.
|
|
380
|
+
pp_df : pandas DataFrame
|
|
381
|
+
DataFrame containing post-processing data.
|
|
382
|
+
bl_verbose : bool, optional
|
|
383
|
+
Flag to enable verbose output. Default is False.
|
|
384
|
+
|
|
385
|
+
Returns
|
|
386
|
+
-------
|
|
387
|
+
None
|
|
388
|
+
"""
|
|
389
|
+
|
|
390
|
+
# Obtain pipeline ID and scenario number from the scenario dataframe
|
|
391
|
+
pipeline_id = scen_df["Pipeline"].values[0]
|
|
392
|
+
scenario_no = scen_df["Scenario"].values[0]
|
|
393
|
+
|
|
394
|
+
# Starting time of the plot buckpy results module
|
|
395
|
+
start_time = time.time()
|
|
396
|
+
|
|
397
|
+
# Print in the terminal that the plot of the results has started
|
|
398
|
+
if bl_verbose:
|
|
399
|
+
print("5. Plot results")
|
|
400
|
+
|
|
401
|
+
# Read the probabilistic outputs from the result Excel file
|
|
402
|
+
file_name_temp = f"{work_dir}/{input_file_name.split('.')[0]}_{pipeline_id}_scen{scenario_no}"
|
|
403
|
+
output_file_name = f"{file_name_temp}_outputs.xlsx"
|
|
404
|
+
df_set, df_no_buckle, df_force_profile = read_output(output_file_name)
|
|
405
|
+
|
|
406
|
+
# Assembly dataframes with the location of sleepers, RCMs, ILTs and route bends
|
|
407
|
+
df_bend, df_sleeper, df_rcm, df_ilt = assembly_dataframe_bend_sleeper_ilt(route_df)
|
|
408
|
+
|
|
409
|
+
# Assembly a dataframe with the "Sets" results using "Post-Processing" tab of input
|
|
410
|
+
df_set_pp = assembly_dataframe_plot(df_set, pp_df)
|
|
411
|
+
|
|
412
|
+
# Print in the terminal the time taken to plot results
|
|
413
|
+
if bl_verbose:
|
|
414
|
+
print(f' Time taken to plot results: {time.time() - start_time:.1f}s')
|
|
415
|
+
|
|
416
|
+
# Plot the 6 subplots and save the figure to file
|
|
417
|
+
plot_file_name = f"{file_name_temp}_plots-2.png"
|
|
418
|
+
plot_results(plot_file_name, df_no_buckle, df_force_profile,
|
|
419
|
+
df_bend, df_sleeper, df_rcm, df_ilt, df_set_pp)
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: buckpy-dev
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: BuckPy: Lateral buckling formation algorithm
|
|
5
|
+
Home-page: https://github.com/buckpy-org/buckpy
|
|
6
|
+
Author: ismael-ripoll
|
|
7
|
+
License: GPL-3.0-or-later
|
|
8
|
+
Project-URL: Documentation, https://buckpy-org-dev.github.io/
|
|
9
|
+
Project-URL: Source, https://github.com/buckpy-org/buckpy
|
|
10
|
+
Project-URL: Tracker, https://github.com/buckpy-org/buckpy/issues
|
|
11
|
+
Keywords: pipelines,buckling,engineering,reliability,simulation
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
14
|
+
Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
|
|
15
|
+
Classifier: Operating System :: OS Independent
|
|
16
|
+
Requires-Python: >=3.9
|
|
17
|
+
Description-Content-Type: text/markdown
|
|
18
|
+
License-File: LICENSE
|
|
19
|
+
Requires-Dist: matplotlib==3.8.3
|
|
20
|
+
Requires-Dist: multiprocess==0.70.16
|
|
21
|
+
Requires-Dist: numba==0.59.0
|
|
22
|
+
Requires-Dist: numpy==1.26.4
|
|
23
|
+
Requires-Dist: openpyxl==3.1.5
|
|
24
|
+
Requires-Dist: pandas==2.2.1
|
|
25
|
+
Requires-Dist: scipy==1.12.0
|
|
26
|
+
Requires-Dist: xlrd==2.0.1
|
|
27
|
+
Requires-Dist: XlsxWriter==3.2.0
|
|
28
|
+
Requires-Dist: pysubsea==0.1.5
|
|
29
|
+
Dynamic: author
|
|
30
|
+
Dynamic: classifier
|
|
31
|
+
Dynamic: description
|
|
32
|
+
Dynamic: description-content-type
|
|
33
|
+
Dynamic: home-page
|
|
34
|
+
Dynamic: keywords
|
|
35
|
+
Dynamic: license
|
|
36
|
+
Dynamic: license-file
|
|
37
|
+
Dynamic: project-url
|
|
38
|
+
Dynamic: requires-dist
|
|
39
|
+
Dynamic: requires-python
|
|
40
|
+
Dynamic: summary
|
|
41
|
+
|
|
42
|
+
# BUCKPY
|
|
43
|
+
Probabilistic Lateral Buckling Algorithm.
|
|
44
|
+
|
|
45
|
+
## Project Philosophy
|
|
46
|
+
**BuckPy** is an open-source algorithm developed to facilitate the implementation of the probabilistic lateral buckling methodology presented in [Lateral Buckling Design using the Friction Distributions at the Expected Buckles (PDF)](docs/_static/SPT%202023%20-%20Lateral%20Buckling%20Design%20using%20the%20Friction%20Distributions%20at%20the%20Expected%20Buckles.pdf), published by Ismael R., Carlos S., and Emilien B. at the 2023 Subsea Pipeline Technology Congress in London (SPT 2023).
|
|
47
|
+
|
|
48
|
+
The code is available on [GitHub](https://github.com/Xodus-Group/BuckPy), allowing the pipeline community to review, expand, and use it under the [GNU General Public License v3.0](https://github.com/Xodus-Group/BuckPy/blob/main/LICENSE).
|
|
49
|
+
|
|
50
|
+
## Documentation
|
|
51
|
+
See the [BuckPy Documentation Website](https://buckpy-org.github.io/) for full usage guides, technical references, benchmarking, API references, and updates.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
buckpy/__init__.py,sha256=BXg5L76psWvzLb8-pq2mDHWuL6laXSLyxZ8L0F6YE5Y,171
|
|
2
|
+
buckpy/buckfast_input_file_writer_.py,sha256=S36fHAdrK_kRxJ9Y2qJiw3hevJ5pOlboiXu2mWJVsM0,44078
|
|
3
|
+
buckpy/buckpy.py,sha256=niIeMIRYmJ8NzKW-1MIUkuKtGumKL_Hi5DS4xwygqNw,4584
|
|
4
|
+
buckpy/buckpy_gui.py,sha256=35nyOCYjAUtMbkfKop23az8f4nJ8rJaJeKWbwPCpuaw,18287
|
|
5
|
+
buckpy/buckpy_postprocessing.py,sha256=wjHOLdQMbH79TkpXlag28wDvshVObly8aKh9curbSK4,56200
|
|
6
|
+
buckpy/buckpy_preprocessing_current.py,sha256=tlnL4S7m_VdxKjemD8X2Qq5PonJgT05A8Zgrx2Mnnjw,46234
|
|
7
|
+
buckpy/buckpy_preprocessing_legacy.py,sha256=sVtt60JznBb1FxVq025R2Pkm6fHiQv5K79Ln-8_A_DY,35085
|
|
8
|
+
buckpy/buckpy_solver.py,sha256=It7MOWe3AeRJDc04qyFoDx8jJHA2AsJHxgaqRbCvot8,33994
|
|
9
|
+
buckpy/buckpy_variables.py,sha256=f2bs_JUGtl6FCp9URLboVVnoK25Yi4ni_VM1i9Q-a1w,2167
|
|
10
|
+
buckpy/buckpy_visualisation.py,sha256=-oaUF0aIfIgD8YY2jd4J9ogdAutznbyHuxk62VFBBfs,15296
|
|
11
|
+
buckpy/_static/logo.png,sha256=Z8vVUhEd375gLQ1i1EAtFftWdDRj9bkX7upsX6RzcQM,1587
|
|
12
|
+
buckpy/_static/logo.svg,sha256=3o31r4Uxex2NkzDaEjJJnm4hrOGBgi8M_A1pRplmKGQ,287
|
|
13
|
+
buckpy_dev-0.0.1.dist-info/licenses/LICENSE,sha256=IwGE9guuL-ryRPEKi6wFPI_zOhg7zDZbTYuHbSt_SAk,35823
|
|
14
|
+
buckpy_dev-0.0.1.dist-info/METADATA,sha256=JbToGKoILvVX-65jkcphTzzaHMkzn6TQbWOG_9mm2Ro,2354
|
|
15
|
+
buckpy_dev-0.0.1.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
|
|
16
|
+
buckpy_dev-0.0.1.dist-info/entry_points.txt,sha256=0K11SznPK4y9PGXGalBCkQen1L-1FJDQTCNvANlPYKQ,38
|
|
17
|
+
buckpy_dev-0.0.1.dist-info/top_level.txt,sha256=XC8Z-oELh-egh28D_WMP5yiF4V075BQuNh1lg1_8-mM,7
|
|
18
|
+
buckpy_dev-0.0.1.dist-info/RECORD,,
|