ANYstructure 5.2.0__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.
Files changed (99) hide show
  1. anystruct/ANYstructure_documentation.pdf +0 -0
  2. anystruct/SN_curve_parameters.py +35 -0
  3. anystruct/__init__.py +0 -0
  4. anystruct/__main__.py +24 -0
  5. anystruct/api.py +772 -0
  6. anystruct/buckling_calc_external.py +120 -0
  7. anystruct/bulb_anglebar_tbar_flatbar.csv +677 -0
  8. anystruct/calc_loads.py +526 -0
  9. anystruct/calc_structure.py +4838 -0
  10. anystruct/compartment_window.py +176 -0
  11. anystruct/example_data.py +532 -0
  12. anystruct/example_data_puls.py +46 -0
  13. anystruct/excel_inteface.py +244 -0
  14. anystruct/fatigue_window.py +352 -0
  15. anystruct/grid_window.py +307 -0
  16. anystruct/gui.py +24 -0
  17. anystruct/helper.py +623 -0
  18. anystruct/images/ANYstructure_logo.jpg +0 -0
  19. anystruct/images/Buckling_Strength_of_Shells.png +0 -0
  20. anystruct/images/Panel_geometry_definitions.png +0 -0
  21. anystruct/images/current_comps_NONE.png +0 -0
  22. anystruct/images/fls_button.gif +0 -0
  23. anystruct/images/img_T_L_FB.gif +0 -0
  24. anystruct/images/img_axial_stresses.gif +0 -0
  25. anystruct/images/img_ext_pressure_button.gif +0 -0
  26. anystruct/images/img_ext_pressure_button_def.gif +0 -0
  27. anystruct/images/img_fixation_parameters.gif +0 -0
  28. anystruct/images/img_generate_report.gif +0 -0
  29. anystruct/images/img_int_pressure_button.gif +0 -0
  30. anystruct/images/img_int_pressure_button_search.gif +0 -0
  31. anystruct/images/img_multi_opt.gif +0 -0
  32. anystruct/images/img_optimize.gif +0 -0
  33. anystruct/images/img_plate_and_stiffener.gif +0 -0
  34. anystruct/images/img_stf_button.gif +0 -0
  35. anystruct/images/img_stiffener.gif +0 -0
  36. anystruct/images/img_stress_button.gif +0 -0
  37. anystruct/images/img_title.gif +0 -0
  38. anystruct/images/img_transverse_stress.gif +0 -0
  39. anystruct/load_factor_window.py +166 -0
  40. anystruct/load_window.py +721 -0
  41. anystruct/main_application.py +7918 -0
  42. anystruct/make_grid_numpy.py +506 -0
  43. anystruct/make_queue.py +52 -0
  44. anystruct/make_stack.py +52 -0
  45. anystruct/ml_files/CL_CSR-Tank_req_cl_predictor.pickle +0 -0
  46. anystruct/ml_files/CL_CSR-Tank_req_cl_scaler.pickle +0 -0
  47. anystruct/ml_files/CL_CSR_plate_cl,_CSR_web_cl,_CSR_web_flange_cl,_CSR_flange_cl_predictor.pickle +0 -0
  48. anystruct/ml_files/CL_CSR_plate_cl,_CSR_web_cl,_CSR_web_flange_cl,_CSR_flange_cl_scaler.pickle +0 -0
  49. anystruct/ml_files/CL_output_cl_str_buc_110_predictor_In-plane_support_cl_1_SP.pickle +0 -0
  50. anystruct/ml_files/CL_output_cl_str_buc_110_predictor_In-plane_support_cl_1_UP.pickle +0 -0
  51. anystruct/ml_files/CL_output_cl_str_buc_110_predictor_In-plane_support_cl_2,_3_SP.pickle +0 -0
  52. anystruct/ml_files/CL_output_cl_str_buc_110_predictor_In-plane_support_cl_2,_3_UP.pickle +0 -0
  53. anystruct/ml_files/CL_output_cl_str_buc_110_scaler_In-plane_support_cl_1_SP.pickle +0 -0
  54. anystruct/ml_files/CL_output_cl_str_buc_110_scaler_In-plane_support_cl_1_UP.pickle +0 -0
  55. anystruct/ml_files/CL_output_cl_str_buc_110_scaler_In-plane_support_cl_2,_3_SP.pickle +0 -0
  56. anystruct/ml_files/CL_output_cl_str_buc_110_scaler_In-plane_support_cl_2,_3_UP.pickle +0 -0
  57. anystruct/ml_files/CL_output_cl_str_buc_115_predictor_In-plane_support_cl_1_SP.pickle +0 -0
  58. anystruct/ml_files/CL_output_cl_str_buc_115_predictor_In-plane_support_cl_1_UP.pickle +0 -0
  59. anystruct/ml_files/CL_output_cl_str_buc_115_predictor_In-plane_support_cl_2,_3_SP.pickle +0 -0
  60. anystruct/ml_files/CL_output_cl_str_buc_115_predictor_In-plane_support_cl_2,_3_UP.pickle +0 -0
  61. anystruct/ml_files/CL_output_cl_str_buc_115_scaler_In-plane_support_cl_1_SP.pickle +0 -0
  62. anystruct/ml_files/CL_output_cl_str_buc_115_scaler_In-plane_support_cl_1_UP.pickle +0 -0
  63. anystruct/ml_files/CL_output_cl_str_buc_115_scaler_In-plane_support_cl_2,_3_SP.pickle +0 -0
  64. anystruct/ml_files/CL_output_cl_str_buc_115_scaler_In-plane_support_cl_2,_3_UP.pickle +0 -0
  65. anystruct/ml_files/CL_output_cl_str_ult_110_predictor_In-plane_support_cl_1_SP.pickle +0 -0
  66. anystruct/ml_files/CL_output_cl_str_ult_110_predictor_In-plane_support_cl_1_UP.pickle +0 -0
  67. anystruct/ml_files/CL_output_cl_str_ult_110_predictor_In-plane_support_cl_2,_3_SP.pickle +0 -0
  68. anystruct/ml_files/CL_output_cl_str_ult_110_predictor_In-plane_support_cl_2,_3_UP.pickle +0 -0
  69. anystruct/ml_files/CL_output_cl_str_ult_110_scaler_In-plane_support_cl_1_SP.pickle +0 -0
  70. anystruct/ml_files/CL_output_cl_str_ult_110_scaler_In-plane_support_cl_1_UP.pickle +0 -0
  71. anystruct/ml_files/CL_output_cl_str_ult_110_scaler_In-plane_support_cl_2,_3_SP.pickle +0 -0
  72. anystruct/ml_files/CL_output_cl_str_ult_110_scaler_In-plane_support_cl_2,_3_UP.pickle +0 -0
  73. anystruct/ml_files/CL_output_cl_str_ult_115_predictor_In-plane_support_cl_1_SP.pickle +0 -0
  74. anystruct/ml_files/CL_output_cl_str_ult_115_predictor_In-plane_support_cl_1_UP.pickle +0 -0
  75. anystruct/ml_files/CL_output_cl_str_ult_115_predictor_In-plane_support_cl_2,_3_SP.pickle +0 -0
  76. anystruct/ml_files/CL_output_cl_str_ult_115_predictor_In-plane_support_cl_2,_3_UP.pickle +0 -0
  77. anystruct/ml_files/CL_output_cl_str_ult_115_scaler_In-plane_support_cl_1_SP.pickle +0 -0
  78. anystruct/ml_files/CL_output_cl_str_ult_115_scaler_In-plane_support_cl_1_UP.pickle +0 -0
  79. anystruct/ml_files/CL_output_cl_str_ult_115_scaler_In-plane_support_cl_2,_3_SP.pickle +0 -0
  80. anystruct/ml_files/CL_output_cl_str_ult_115_scaler_In-plane_support_cl_2,_3_UP.pickle +0 -0
  81. anystruct/opt_problem.py +31 -0
  82. anystruct/optimize.py +1680 -0
  83. anystruct/optimize_cylinder.py +898 -0
  84. anystruct/optimize_geometry.py +1708 -0
  85. anystruct/optimize_multiple_window.py +1507 -0
  86. anystruct/optimize_window.py +1117 -0
  87. anystruct/pl_stf_window.py +572 -0
  88. anystruct/report_generator.py +912 -0
  89. anystruct/sections.csv +202 -0
  90. anystruct/sesam_interface.py +115 -0
  91. anystruct/ship_section_example.txt +1 -0
  92. anystruct/stresses_window.py +269 -0
  93. anystruct/testCalc.py +118 -0
  94. anystructure-5.2.0.dist-info/METADATA +86 -0
  95. anystructure-5.2.0.dist-info/RECORD +99 -0
  96. anystructure-5.2.0.dist-info/WHEEL +5 -0
  97. anystructure-5.2.0.dist-info/entry_points.txt +2 -0
  98. anystructure-5.2.0.dist-info/licenses/LICENSE +21 -0
  99. anystructure-5.2.0.dist-info/top_level.txt +1 -0
anystruct/api.py ADDED
@@ -0,0 +1,772 @@
1
+ try:
2
+ from anystruct.calc_structure import *
3
+ from anystruct.calc_loads import *
4
+ import anystruct.load_window as load_window
5
+ import anystruct.make_grid_numpy as grid
6
+ import anystruct.grid_window as grid_window
7
+ from anystruct.helper import *
8
+ import anystruct.optimize as op
9
+ import anystruct.optimize_window as opw
10
+ import anystruct.optimize_cylinder as opc
11
+ import anystruct.optimize_multiple_window as opwmult
12
+ import anystruct.optimize_geometry as optgeo
13
+ import anystruct.pl_stf_window as struc
14
+ import anystruct.stresses_window as stress
15
+ import anystruct.fatigue_window as fatigue
16
+ import anystruct.load_factor_window as load_factors
17
+ from anystruct.report_generator import LetterMaker
18
+ import anystruct.sesam_interface as sesam
19
+ except ModuleNotFoundError:
20
+ # This is due to pyinstaller issues.
21
+ from ANYstructure.anystruct.calc_structure import *
22
+ from ANYstructure.anystruct.calc_loads import *
23
+ import ANYstructure.anystruct.load_window as load_window
24
+ import ANYstructure.anystruct.make_grid_numpy as grid
25
+ import ANYstructure.anystruct.grid_window as grid_window
26
+ from ANYstructure.anystruct.helper import *
27
+ import ANYstructure.anystruct.optimize as op
28
+ import ANYstructure.anystruct.optimize_window as opw
29
+ import ANYstructure.anystruct.optimize_cylinder as opc
30
+ import ANYstructure.anystruct.optimize_multiple_window as opwmult
31
+ import ANYstructure.anystruct.optimize_geometry as optgeo
32
+ import ANYstructure.anystruct.pl_stf_window as struc
33
+ import ANYstructure.anystruct.stresses_window as stress
34
+ import ANYstructure.anystruct.fatigue_window as fatigue
35
+ import ANYstructure.anystruct.load_factor_window as load_factors
36
+ from ANYstructure.anystruct.report_generator import LetterMaker
37
+ import ANYstructure.anystruct.sesam_interface as sesam
38
+
39
+
40
+ class FlatStru():
41
+ '''
42
+ API class for all flat plates.\n
43
+ Domains:\n
44
+ 1. 'Flat plate, unstiffened'\n
45
+ 2. 'Flat plate, stiffened'\n
46
+ '''
47
+ def __init__(self, calculation_domain: str = None):
48
+ '''
49
+
50
+ :param calculation_domain: "Flat plate, unstiffened", "Flat plate, stiffened",
51
+ "Flat plate, stiffened with girder"
52
+ :type calculation_domain: str
53
+ '''
54
+ super().__init__()
55
+ assert calculation_domain in ["Flat plate, unstiffened", "Flat plate, stiffened",
56
+ "Flat plate, stiffened with girder"], ('Calculation domain missing!\n '
57
+ 'Alternatives:'
58
+ '\n "Flat plate, unstiffened"'
59
+ '\n "Flat plate, stiffened"'
60
+ '\n "Flat plate, stiffened with girder"')
61
+
62
+ self._Plate = CalcScantlings()
63
+ self._Stiffeners = CalcScantlings()
64
+ self._Girder = CalcScantlings()
65
+ self._calculation_domain = calculation_domain
66
+ self._FlatStructure = AllStructure(Plate=self._Plate,
67
+ Stiffener=None if calculation_domain == 'Flat plate, unstiffened' else self._Stiffeners,
68
+ Girder=None if calculation_domain in ['Flat plate, unstiffened', 'Flat plate, stiffened']
69
+ else self._Girder, calculation_domain=calculation_domain)
70
+
71
+ @property
72
+ def calculation_domain(self):
73
+ return self._calculation_domain
74
+ @calculation_domain.setter
75
+ def calculation_domain(self, val):
76
+ self._calculation_domain = val
77
+ @property
78
+ def Plate(self):
79
+ return self._Plate
80
+ @Plate.setter
81
+ def Plate(self, val):
82
+ self._Plate = val
83
+ @property
84
+ def Stiffeners(self):
85
+ return self._Stiffeners
86
+ @Stiffeners.setter
87
+ def Stiffeners(self, val):
88
+ self._Stiffeners = val
89
+ @property
90
+ def Girder(self):
91
+ return self._Girder
92
+ @Girder.setter
93
+ def Girder(self, val):
94
+ self._Girder = val
95
+
96
+ def set_material(self, mat_yield = 355, emodule = 210000, material_factor = 1.15, poisson = 0.3):
97
+ '''
98
+ Set the material properties for all structure.
99
+
100
+ :param mat_yield: material yield, fy, given in MPa
101
+ :type mat_yield: float
102
+ :param emodule: elastic module, E, given in MPa
103
+ :type emodule: float
104
+ :param material_factor: material factor, typically 1.15 or 1.1
105
+ :type material_factor: float
106
+ :param poisson: poisson number of matieral
107
+ :type poisson: float
108
+ :return:
109
+ :rtype:
110
+ '''
111
+ self._FlatStructure.mat_yield = mat_yield*1e6
112
+ self._FlatStructure.E = emodule*1e6
113
+ self._FlatStructure.v = poisson
114
+ self._FlatStructure.mat_factor = material_factor
115
+
116
+ for sub_cls in [self.Plate, self.Stiffeners, self.Girder]:
117
+ if sub_cls is not None:
118
+ sub_cls.mat_yield = mat_yield * 1e6
119
+ sub_cls.E = emodule * 1e6
120
+ sub_cls.v = poisson
121
+ sub_cls.mat_factor = material_factor
122
+
123
+ def set_fixation_parameters(self, kpp: float = 1, kps: float = 1,
124
+ km1: float = 12, km2: float = 24, km3: float = 12):
125
+ '''
126
+ Used for calculation of special provisions for plating and stiffeners in steel structures.
127
+
128
+ :param kpp: fixation parameter for plate, 1.0 for clamped edges, 0.5 for simply supported edges
129
+ :type kpp: float
130
+ :param kps: fixation parameter for stiffeners, 1.0 if at least one end is clamped, 0.9 if both ends are simply supported
131
+ :type kps:
132
+ :param km1: Bending moment and shear force factors, see DNV standards or ANYstructure GUI
133
+ :type km1: float
134
+ :param km2: Bending moment and shear force factors, see DNV standards or ANYstructure GUI
135
+ :type km2: float
136
+ :param km3: Bending moment and shear force factors, see DNV standards or ANYstructure GUI
137
+ :type km3: float
138
+ :return:
139
+ :rtype:
140
+ '''
141
+ for sub_cls in [self.Plate, self.Stiffeners, self.Girder]:
142
+ if sub_cls is not None:
143
+ sub_cls._plate_kpp = kpp
144
+ sub_cls._stf_kps = kps
145
+ sub_cls._km1 = km1
146
+ sub_cls._km2 = km2
147
+ sub_cls._km3 = km3
148
+
149
+
150
+
151
+
152
+ def get_buckling_results(self):
153
+ '''
154
+ Return a dictionary of all buckling results. UF - Utilization Factor.\n
155
+ Plate : {'Plate buckling': UF}\n
156
+ Stiffener: {'Overpressure plate side': UF, 'Overpressure stiffener side': UF,\n
157
+ 'Resistance between stiffeners': UF, 'Shear capacity': UF}\n
158
+ Girder: {'Overpressure plate side': UF, 'Overpressure girder side': UF, 'Shear capacity': UF}\n
159
+ Local buckling {'Stiffener': [UF web, UF flange], 'Girder': [UF web, UF flange]}\n
160
+ :return: Results for plate, stiffener, girder and a separate local check for stiffeners/girders\n
161
+ :rtype: dict
162
+ '''
163
+ return self._FlatStructure.plate_buckling()
164
+
165
+ def set_plate_geometry(self, spacing: float = 700, thickness: float = 20, span: float = 4000):
166
+
167
+ '''
168
+ Set the properties of plate. If the plate is stiffened, spacing is between the stiffeners. If the plate
169
+ is not unstiffened, the spacing is the width of the considered plate.
170
+
171
+ :param spacing: stiffener spacing
172
+ :type spacing: float
173
+ :param thickness: plate thickness
174
+ :type thickness: float
175
+ :param span: span of plate field
176
+ :type span: float
177
+
178
+ :return:
179
+ :rtype:
180
+ '''
181
+
182
+ self._FlatStructure.Plate.t = thickness
183
+ self._FlatStructure.Plate.spacing = spacing
184
+ self._FlatStructure.Plate.span = span/1000
185
+ self._FlatStructure.Plate.girder_lg = 10 # placeholder value
186
+
187
+
188
+ def set_stresses(self, pressure: float = 0, sigma_x1: float = 0,sigma_x2: float = 0, sigma_y1: float = 0,
189
+ sigma_y2: float = 0, tau_xy: float = 0):
190
+ '''
191
+ Set loads applied on the plate sides.\n
192
+ x1 and y1 is on one side of the plate\n
193
+ x2 and y2 is the other side\n
194
+ tau_xy act uniformly on the plate field\n
195
+ Stresses are in MPA.\n
196
+ Use POSITIVE numbers for compression pressure, stresses and forces\n
197
+
198
+ :param pressure: Lateral load / pressure: Psd [MPa]
199
+ :type pressure: float
200
+ :param sigma_x1: Longitudinal compr.: sx,sd [MPa]
201
+ :type sigma_x1: float
202
+ :param sigma_x2: Longitudinal compr.: sx2,sd [MPa]
203
+ :type sigma_x2: float
204
+ :param sigma_y1: Transverse compress.: sy,sd [MPa]
205
+ :type sigma_y1: float
206
+ :param sigma_y2: Transverse compress.: sy2,sd [MPa]
207
+ :type sigma_y2: float
208
+ :param tau_xy: Shear Stress: txy [MPa]
209
+ :type tau_xy: float
210
+ :return:
211
+ :rtype:
212
+ '''
213
+ self._FlatStructure.Plate.tau_xy = tau_xy
214
+ self._FlatStructure.Plate.sigma_x1 = sigma_x1
215
+ self._FlatStructure.Plate.sigma_x2 = sigma_x2
216
+ self._FlatStructure.Plate.sigma_y1 = sigma_y1
217
+ self._FlatStructure.Plate.sigma_y2 = sigma_y2
218
+ self._FlatStructure.Stiffener.tau_xy = tau_xy
219
+ self._FlatStructure.Stiffener.sigma_x1 = sigma_x1
220
+ self._FlatStructure.Stiffener.sigma_x2 = sigma_x2
221
+ self._FlatStructure.Stiffener.sigma_y1 = sigma_y1
222
+ self._FlatStructure.Stiffener.sigma_y2 = sigma_y2
223
+ self._FlatStructure.lat_press = pressure
224
+
225
+ def set_stiffener(self, hw: float = 260, tw: float = 12, bf: float = 49,
226
+ tf: float = 27.3, stf_type: str = 'bulb', spacing: float = 608):
227
+ '''
228
+ Sets the stiffener properties.
229
+
230
+ :param hw: stiffer web height, mm
231
+ :type hw: float
232
+ :param tw: stiffener web thickness, mm
233
+ :type tw: float
234
+ :param bf: stiffener flange width, mm
235
+ :type bf: float
236
+ :param tf: stiffener flange thickness, mm
237
+ :type tf: float
238
+ :param stf_type: stiffener type, either T, FB, L or L-bulb
239
+ :type stf_type: str
240
+ :param spacing: spacing between stiffeners
241
+ :type spacing: float
242
+ :return:
243
+ :rtype:
244
+ '''
245
+ self._FlatStructure.Stiffener.hw = hw
246
+ self._FlatStructure.Stiffener.tw = tw
247
+ self._FlatStructure.Stiffener.b = bf
248
+ self._FlatStructure.Stiffener.tf = tf
249
+ self._FlatStructure.Stiffener.stiffener_type = 'L-bulb' if stf_type in ['hp HP HP-bulb bulb'] else stf_type
250
+ self._FlatStructure.Stiffener.spacing = spacing
251
+ self._FlatStructure.Stiffener.girder_lg = 10
252
+ self._FlatStructure.Stiffener.t = self._FlatStructure.Plate.t
253
+ self._FlatStructure.Stiffener.span = self._FlatStructure.Plate.span
254
+ self._FlatStructure.Stiffener.mat_yield = self._FlatStructure.Plate.mat_yield
255
+
256
+
257
+ def set_girder(self, hw: float = 500, tw: float = 15, bf: float = 200,
258
+ tf: float = 25, stf_type: str = 'T', spacing: float = 700):
259
+ '''
260
+ Sets the girder properties.
261
+
262
+ :param hw: stiffer web height, mm
263
+ :type hw: float
264
+ :param tw: girder web thickness, mm
265
+ :type tw: float
266
+ :param bf: girder flange width, mm
267
+ :type bf: float
268
+ :param tf: girder flange thickness, mm
269
+ :type tf: float
270
+ :param stf_type: girder type, either T, FB, L or L-bulb
271
+ :type stf_type: str
272
+ :param spacing: spacing between girders
273
+ :type spacing: float
274
+ :return:
275
+ :rtype:
276
+ '''
277
+ self._FlatStructure.Girder.hw = hw
278
+ self._FlatStructure.Girder.tw = tw
279
+ self._FlatStructure.Girder.b = bf
280
+ self._FlatStructure.Girder.tf = tf
281
+ self._FlatStructure.Girder.girder_lg = 10
282
+ self._FlatStructure.Girder.t = self._FlatStructure.Plate.t
283
+
284
+ def set_buckling_parameters(self, calculation_method: str= None, buckling_acceptance: str = None,
285
+ stiffened_plate_effective_aginst_sigy = True,
286
+ min_lat_press_adj_span: float = None, buckling_length_factor_stf: float = None,
287
+ buckling_length_factor_girder: float = None,
288
+ stf_dist_between_lateral_supp: float = None,
289
+ girder_dist_between_lateral_supp: float = None,
290
+ panel_length_Lp: float = None, stiffener_support: str = 'Continuous',
291
+ girder_support: str = 'Continuous'):
292
+ '''
293
+ Various buckling realted parameters are set here. For details, see\n
294
+ DNV-RP-C201 Buckling strength of plated structures.\n
295
+
296
+ :param calculation_method: 'DNV-RP-C201 - prescriptive', 'ML-CL (PULS based)'
297
+ :type calculation_method: str
298
+ :param buckling_acceptance: for ML-CL calculations, either 'buckling' or 'ultimate'
299
+ :type buckling_acceptance: str
300
+ :param stiffened_plate_effective_aginst_sigy:
301
+ :type stiffened_plate_effective_aginst_sigy:
302
+ :param min_lat_press_adj_span: relative pressure applied on adjacent spans
303
+ :type min_lat_press_adj_span: float
304
+ :param buckling_length_factor_stf: Buckling length factor: , kstiff
305
+ :type buckling_length_factor_stf: float
306
+ :param buckling_length_factor_girder: Buckling length factor: kstiff
307
+ :type buckling_length_factor_girder: float
308
+ :param stf_dist_between_lateral_supp: Distance between tripping brackets: lT
309
+ :type stf_dist_between_lateral_supp: float
310
+ :param girder_dist_between_lateral_supp: Dist.betw.lateral supp.: Ltg
311
+ :type girder_dist_between_lateral_supp: float
312
+ :param panel_length_Lp: Panel length (max.no stiff spans*l): Lp
313
+ :type panel_length_Lp: float
314
+ :param stiffener_support: continuous or sniped at ends
315
+ :type stiffener_support: str
316
+ :param girder_support: continuous or sniped at ends
317
+ :type girder_support: str
318
+ :return:
319
+ :rtype:
320
+ '''
321
+ assert calculation_method in ['DNV-RP-C201 - prescriptive', 'ML-CL (PULS based)']
322
+ assert buckling_acceptance in ['buckling', 'ultimate']
323
+ assert stiffener_support in ['Continuous', 'Sniped']
324
+ assert girder_support in ['Continuous', 'Sniped']
325
+ if calculation_method == 'ML-CL (PULS based)':
326
+ raise NotImplementedError('ML-CL (PULS based) not yet implemented')
327
+ sigy_mapper = {True: 'Stf. pl. effective against sigma y', False:'All sigma y to girder'}
328
+ self._FlatStructure._stiffened_plate_effective_aginst_sigy = sigy_mapper[stiffened_plate_effective_aginst_sigy]
329
+ self._FlatStructure.method = buckling_acceptance
330
+ self._FlatStructure._min_lat_press_adj_span = min_lat_press_adj_span
331
+ self._FlatStructure._buckling_length_factor_stf = buckling_length_factor_stf
332
+ self._FlatStructure._buckling_length_factor_girder = buckling_length_factor_girder
333
+ self._FlatStructure._girder_dist_between_lateral_supp = girder_dist_between_lateral_supp
334
+ self._FlatStructure._stf_dist_between_lateral_supp= stf_dist_between_lateral_supp
335
+ self._FlatStructure._panel_length_Lp = panel_length_Lp
336
+ self._FlatStructure._stf_end_support = stiffener_support
337
+ self._FlatStructure._girder_end_support = girder_support
338
+
339
+ def get_special_provisions_results(self):
340
+ '''
341
+ Special provisions for plating and stiffeners in steel structures.\n
342
+ Return a dictionary:\n
343
+ \n
344
+ 'Plate thickness' : The thickness of plates shall not be less than this check.\n
345
+ 'Stiffener section modulus' : The section modulus for longitudinals, beams, frames and other stiffeners\n
346
+ subjected to lateral pressure shall not be less than this check.\n
347
+ 'Stiffener shear area' : The shear area of the plate/stiffener shall not be less than this ckeck.\n
348
+ :return: minium dimensions and actual dimensions for the current structure in mm/mm^2/mm^3
349
+ :rtype: dict
350
+ '''
351
+ min_pl_thk = self.Plate.get_dnv_min_thickness(design_pressure_kpa=self._FlatStructure.lat_press * 1000)
352
+ min_sec_mod = self.Stiffeners.get_dnv_min_section_modulus(
353
+ design_pressure_kpa=self._FlatStructure.lat_press * 1000) * 1000**3
354
+ min_area = self.Stiffeners.get_minimum_shear_area(pressure=self._FlatStructure.lat_press * 1000) * 1000**2
355
+
356
+ this_pl_thk = self.Plate.t
357
+ this_secmod = self.Stiffeners.get_section_modulus()
358
+ this_area = self.Stiffeners.get_shear_area()* 1000**2
359
+ return {'Plate thickness':{'minimum': min_pl_thk, 'actual': this_pl_thk},
360
+ 'Stiffener section modulus': {'minimum': min_sec_mod, 'actual': min(this_secmod)* 1000**3},
361
+ 'Stiffener shear area': {'minimum': min_area, 'actual': this_area}}
362
+
363
+
364
+
365
+ class CylStru():
366
+ ''' API class for all cylinder options.\n
367
+ Calculation domains are:\n
368
+ 1. 'Unstiffened shell'\n
369
+ 2. 'Unstiffened panel'\n
370
+ 3. 'Longitudinal Stiffened shell'\n
371
+ 4. 'Longitudinal Stiffened panel'\n
372
+ 5. 'Ring Stiffened shell'\n
373
+ 6. 'Ring Stiffened panel'\n
374
+ 7. 'Orthogonally Stiffened shell'\n
375
+ 8. 'Orthogonally Stiffened panel'\n
376
+ '''
377
+
378
+ geotypes = ['Unstiffened shell', 'Unstiffened panel',
379
+ 'Longitudinal Stiffened shell', 'Longitudinal Stiffened panel',
380
+ 'Ring Stiffened shell', 'Ring Stiffened panel',
381
+ 'Orthogonally Stiffened shell', 'Orthogonally Stiffened panel']
382
+ def __init__(self, calculation_domain: str = 'Unstiffened shell'):
383
+ '''
384
+ :param calculation_domain: calculation domain, 'Unstiffened shell', 'Unstiffened panel',
385
+ 'Longitudinal Stiffened shell', 'Longitudinal Stiffened panel', 'Ring Stiffened shell',
386
+ 'Ring Stiffened panel', 'Orthogonally Stiffened shell', 'Orthogonally Stiffened panel'
387
+ :type calculation_domain: str
388
+ '''
389
+ super().__init__()
390
+ assert calculation_domain in self.geotypes, 'Geometry type must be either of: ' + str(self.geotypes)
391
+ self._load_type = 'Stress' if 'panel' in calculation_domain else 'Force'
392
+
393
+ self._calculation_domain = calculation_domain + ' (' + self._load_type + ' input)'
394
+ self._CylinderMain = CylinderAndCurvedPlate()
395
+ self._CylinderMain.geometry = CylinderAndCurvedPlate.geomeries_map_no_input_spec[calculation_domain]
396
+ self._CylinderMain.ShellObj = Shell()
397
+ if calculation_domain in ['Unstiffened shell', 'Unstiffened panel']:
398
+ self._CylinderMain.LongStfObj = None
399
+ self._CylinderMain.RingStfObj = None
400
+ self._CylinderMain.RingFrameObj = None
401
+ elif calculation_domain in ['Longitudinal Stiffened shell', 'Longitudinal Stiffened panel']:
402
+ self._CylinderMain.LongStfObj = Structure()
403
+ self._CylinderMain.RingStfObj = None
404
+ self._CylinderMain.RingFrameObj = None
405
+ elif calculation_domain in ['Ring Stiffened shell', 'Ring Stiffened panel']:
406
+ self._CylinderMain.LongStfObj = None
407
+ self._CylinderMain.RingStfObj = Structure()
408
+ self._CylinderMain.RingFrameObj = None
409
+ elif calculation_domain in ['Orthogonally Stiffened shell', 'Orthogonally Stiffened panel']:
410
+ self._CylinderMain.LongStfObj = Structure()
411
+ self._CylinderMain.RingStfObj = None
412
+ self._CylinderMain.RingFrameObj = Structure()
413
+
414
+ def set_stresses(self, sasd = 0, smsd = 0, tTsd = 0, tQsd = 0, psd = 0, shsd = 0):
415
+ '''
416
+ Cylinder stresses.
417
+ Use negative numbers for compression pressure, stresses and forces.
418
+
419
+ :param sasd: Design axial stress, sa,sd [MPa]
420
+ :type sasd: float
421
+ :param smsd: Design bending stress, sm,sd [MPa]
422
+ :type smsd: float
423
+ :param tTsd: Design torsional stress, tT,sd [MPa]
424
+ :type tTsd: float
425
+ :param tQsd: Design shear stress, tQ,sd [MPa]
426
+ :type tQsd: float
427
+ :param psd: Design lateral pressure, psd [MPa]
428
+ :type psd: float
429
+ :param shsd: Additional hoop stress, sh,sd [MPa]
430
+ :type shsd: float
431
+ :return:
432
+ :rtype:
433
+ '''
434
+
435
+ self._CylinderMain.sasd = sasd*1e6
436
+ self._CylinderMain.smsd = smsd*1e6
437
+ self._CylinderMain.tTsd = abs(tTsd*1e6)
438
+ self._CylinderMain.tQsd = abs(tQsd*1e6)
439
+ self._CylinderMain.psd = psd*1e6
440
+ self._CylinderMain.shsd = shsd*1e6
441
+
442
+ def set_forces(self, Nsd: float = 0, Msd: float = 0, Tsd: float = 0, Qsd: float = 0, psd: float = 0):
443
+ '''
444
+ Forces applied to cylinder.
445
+ Use negative numbers for compression pressure, stresses and forces.
446
+
447
+ :param Nsd: Design Axial force, Nsd [kN]
448
+ :param Msd: Design bending mom., Msd [kNm]
449
+ :param Tsd: Design torsional mom., Tsd [kNm]
450
+ :param Qsd: Design shear force, Qsd [kN]
451
+ :param psd: Design lateral pressure, psd [N/mm2]
452
+
453
+ :return:
454
+ '''
455
+ geomeries = {11: 'Flat plate, stiffened', 10: 'Flat plate, unstiffened',
456
+ 12: 'Flat plate, stiffened with girder',
457
+ 1: 'Unstiffened shell (Force input)', 2: 'Unstiffened panel (Stress input)',
458
+ 3: 'Longitudinal Stiffened shell (Force input)', 4: 'Longitudinal Stiffened panel (Stress input)',
459
+ 5: 'Ring Stiffened shell (Force input)', 6: 'Ring Stiffened panel (Stress input)',
460
+ 7: 'Orthogonally Stiffened shell (Force input)', 8: 'Orthogonally Stiffened panel (Stress input)'}
461
+ geomeries_map = dict()
462
+ for key, value in geomeries.items():
463
+ geomeries_map[value] = key
464
+ geometry = geomeries_map[self._calculation_domain]
465
+ forces = [Nsd, Msd, Tsd, Qsd]
466
+ sasd, smsd, tTsd, tQsd, shsd = hlp.helper_cylinder_stress_to_force_to_stress(
467
+ stresses=None, forces=forces, geometry=geometry, shell_t=self._CylinderMain.ShellObj.thk,
468
+ shell_radius=self._CylinderMain.ShellObj.radius,
469
+ shell_spacing= None if self._CylinderMain.LongStfObj is None else self._CylinderMain.LongStfObj.s,
470
+ hw=None if self._CylinderMain.LongStfObj is None else self._CylinderMain.LongStfObj.hw,
471
+ tw=None if self._CylinderMain.LongStfObj is None else self._CylinderMain.LongStfObj.tw,
472
+ b=None if self._CylinderMain.LongStfObj is None else self._CylinderMain.LongStfObj.b,
473
+ tf=None if self._CylinderMain.LongStfObj is None else self._CylinderMain.LongStfObj.tf,
474
+ CylinderAndCurvedPlate=CylinderAndCurvedPlate)
475
+
476
+ self._CylinderMain.sasd = sasd
477
+ self._CylinderMain.smsd = smsd
478
+ self._CylinderMain.tTsd = abs(tTsd)
479
+ self._CylinderMain.tQsd = abs(tQsd)
480
+ self._CylinderMain.psd = psd
481
+ self._CylinderMain.shsd = shsd
482
+
483
+
484
+ def set_material(self, mat_yield = 355, emodule = 210000, material_factor = 1.15, poisson = 0.3):
485
+ '''
486
+ Set the material properties for all structure.
487
+
488
+ :param mat_yield: material yield, fy, given in MPa
489
+ :type mat_yield: float
490
+ :param emodule: elastic module, E, given in MPa
491
+ :type emodule: float
492
+ :param material_factor: material factor, typically 1.15 or 1.1
493
+ :type material_factor: float
494
+ :param poisson: poisson number of matieral
495
+ :type poisson: float
496
+ :return:
497
+ :rtype:
498
+ '''
499
+ self._CylinderMain.mat_yield = mat_yield*1e6
500
+ self._CylinderMain.E = emodule*1e6
501
+ self._CylinderMain.v = poisson
502
+ self._CylinderMain.mat_factor = material_factor
503
+ def set_imperfection(self, delta_0 = 0.005):
504
+ '''
505
+ Initial out of roundness of stiffener: delta_0 * r
506
+ Typical value is set as default.
507
+
508
+ :param delta_0: Initial out of roundness of stiffener
509
+ :type delta_0: float
510
+ :return:
511
+ :rtype:
512
+ '''
513
+ self._CylinderMain.delta0 = delta_0
514
+
515
+ def set_fabrication_method(self, stiffener: str = 'Fabricated', girder: str = 'Fabricated'):
516
+ '''
517
+ Fabrication method for stiffener and girder. Either 'Fabricated' or 'Cold formed'
518
+
519
+ :param stiffener: set fabrication method of stiffeners, either 'Fabricated' or 'Cold formed'
520
+ :type stiffener: str
521
+ :param girder: set fabrication method of girder, either 'Fabricated' or 'Cold formed'
522
+ :type girder: str
523
+ :return:
524
+ :rtype:
525
+ '''
526
+ options = ['Fabricated', 'Cold formed']
527
+ assert stiffener in options, 'Method must be either of: ' + str(options)
528
+ self._CylinderMain.fab_method_ring_stf = stiffener
529
+ self._CylinderMain.fab_method_ring_girder = girder
530
+ def set_end_cap_pressure_included_in_stress(self, is_included: bool = True):
531
+ '''
532
+ Cylinder may or may not have and end cap. If there is an end cap, and the stresses from pressure on this
533
+ is not included, ste this values to True.
534
+
535
+ :param is_included: if this is not set, stresses due to end cap pressure for clyinder is set
536
+ :type is_included: bool
537
+ :return:
538
+ :rtype:
539
+ '''
540
+ self._CylinderMain.end_cap_pressure_included = is_included
541
+ def set_uls_or_als(self, kind = 'ULS'):
542
+ '''
543
+ This is used to calculate th resulting material factor.
544
+ ALS is Accidental Limit State
545
+ ULS is Ultimate Limit State
546
+
547
+ :param kind: set load condition, either 'ULS' or 'ALS'
548
+ :type kind: str
549
+ :return:
550
+ :rtype:
551
+ '''
552
+ assert kind in ['ULS', 'ALS'], 'Must be either of: ' + str(kind)
553
+ self._CylinderMain.uls_or_als = kind
554
+ def set_exclude_ring_stiffener(self, is_excluded: bool = True):
555
+ '''
556
+ If for example orthogonally stiffened cylinder is selected and there are no ring stiffeners, set this to True.
557
+ In this case only ring girders are included.
558
+
559
+ :param is_excluded: set no ring stiffeners
560
+ :type is_excluded: bool
561
+ :return:
562
+ :rtype:
563
+ '''
564
+ self._CylinderMain._ring_stiffener_excluded = is_excluded
565
+ def set_exclude_ring_frame(self, is_excluded: bool = True):
566
+ '''
567
+ If for example orthogonally stiffened cylinder is selected and there are no ring girder, set this to True.
568
+ The resulting structure will then be only longitudinal and ring stiffeners.
569
+
570
+ :param is_excluded: set no ring girders
571
+ :type is_excluded: bool
572
+ :return:
573
+ :rtype:
574
+ '''
575
+ self._CylinderMain._ring_frame_excluded= is_excluded
576
+
577
+ def set_length_between_girder(self, val: float = 0):
578
+ '''
579
+ Distance between the girders along the cylinder.
580
+
581
+ :param val: length/span between girders
582
+ :type val: float
583
+ :return:
584
+ :rtype:
585
+ '''
586
+ self._CylinderMain.length_between_girders = val
587
+ def set_panel_spacing(self, val: float = 0):
588
+ '''
589
+ In case a curved panel is selected, not a complete cylinder, this value sets the width of the panel.
590
+
591
+ :param val: spacing between stiffeners
592
+ :type val: float
593
+ :return:
594
+ :rtype:
595
+ '''
596
+ self._CylinderMain.panel_spacing = val/1000
597
+
598
+ def set_shell_geometry(self, radius: float = 0, thickness: float = 0,distance_between_rings: float = 0,
599
+ tot_length_of_shell: float = 0):
600
+ '''
601
+ Sets the baic parameters for the cylinder.
602
+
603
+ :param radius: radius of cylinder
604
+ :type radius: float
605
+ :param thickness: thickness of cylinder
606
+ :type thickness: float
607
+ :param distance_between_rings: distance between girders
608
+ :type distance_between_rings: float
609
+ :param tot_length_of_shell: total length of the cylinder
610
+ :type tot_length_of_shell: float
611
+ :return:
612
+ :rtype:
613
+ '''
614
+
615
+ self._CylinderMain.ShellObj.radius = radius/1000
616
+ self._CylinderMain.ShellObj.thk = thickness/1000
617
+ self._CylinderMain.ShellObj.dist_between_rings = distance_between_rings/1000
618
+ if tot_length_of_shell == 0:
619
+ # Setting a default.
620
+ self._CylinderMain.ShellObj.length_of_shell = distance_between_rings * 10/1000
621
+ self._CylinderMain.ShellObj.tot_cyl_length = distance_between_rings * 10/1000
622
+ else:
623
+ self._CylinderMain.ShellObj.tot_cyl_length = tot_length_of_shell/1000
624
+
625
+ def set_shell_buckling_parmeters(self, eff_buckling_length_factor: float = 1.0):
626
+ '''
627
+ Sets the buckling length paramenter of the cylinder. Used for global column buckling calculations.
628
+
629
+ :param eff_buckling_length_factor: effective length factor, column buckling
630
+ :type eff_buckling_length_factor: float
631
+ :return:
632
+ :rtype:
633
+ '''
634
+ self._CylinderMain.ShellObj.k_factor = eff_buckling_length_factor
635
+
636
+ def set_longitudinal_stiffener(self, hw: float = 260, tw: float = 12, bf: float = 49,
637
+ tf: float = 28, stf_type: str = 'bulb', spacing: float = 680):
638
+ '''
639
+ Sets the longitudinal stiffener dimensions. May be excluded.
640
+
641
+ :param hw: web height
642
+ :type hw: float
643
+ :param tw: web thickness
644
+ :type tw: float
645
+ :param bf: flange width
646
+ :type bf: float
647
+ :param tf: flange thickness
648
+ :type tf: float
649
+ :param stf_type: stiffener type, either T, FB, L or L-bulb
650
+ :type stf_type: str
651
+ :param spacing: distance between stiffeners
652
+ :type spacing: float
653
+
654
+ '''
655
+ self._CylinderMain.LongStfObj.hw = hw
656
+ self._CylinderMain.LongStfObj.tw = tw
657
+ self._CylinderMain.LongStfObj.b = bf
658
+ self._CylinderMain.LongStfObj.tf = tf
659
+ self._CylinderMain.LongStfObj.stiffener_type = 'L-bulb' if stf_type in ['hp HP HP-bulb bulb'] else stf_type
660
+ self._CylinderMain.LongStfObj.spacing = spacing
661
+ self._CylinderMain.LongStfObj.t = self._CylinderMain.ShellObj.thk
662
+
663
+ def set_ring_stiffener(self, hw: float = 260, tw: float = 12, bf: float = 49,
664
+ tf: float = 28, stf_type: str = 'bulb', spacing: float = 680):
665
+ '''
666
+ Sets the ring stiffener dimensions. May be excluded.
667
+
668
+ :param hw: web height
669
+ :type hw: float
670
+ :param tw: web thickness
671
+ :type tw: float
672
+ :param bf: flange width
673
+ :type bf: float
674
+ :param tf: flange thickness
675
+ :type tf: float
676
+ :param stf_type: stiffener type, either T, FB, L or L-bulb
677
+ :type stf_type: str
678
+ :param spacing: distance between stiffeners
679
+ :type spacing: float
680
+ :return:
681
+ :rtype:
682
+ '''
683
+
684
+
685
+ self._CylinderMain.RingStfObj.hw = hw
686
+ self._CylinderMain.RingStfObj.tw = tw
687
+ self._CylinderMain.RingStfObj.b = bf
688
+ self._CylinderMain.RingStfObj.tf = tf
689
+ self._CylinderMain.RingStfObj.stiffener_type = 'L-bulb' if stf_type in ['hp HP HP-bulb bulb'] else stf_type
690
+ self._CylinderMain.RingStfObj.s = spacing
691
+ self._CylinderMain.RingStfObj.t = self._CylinderMain.ShellObj.thk
692
+
693
+ def set_ring_girder(self, hw: float = 500, tw: float = 15, bf: float = 200,
694
+ tf: float = 25, stf_type: str = 'T', spacing: float = 700):
695
+ '''
696
+ Sets the ring girder dimensions. May be excluded.
697
+
698
+ :param hw: web height
699
+ :type hw: float
700
+ :param tw: web thickness
701
+ :type tw: float
702
+ :param bf: flange width
703
+ :type bf: float
704
+ :param tf: flange thickness
705
+ :type tf: float
706
+ :param stf_type: stiffener type, either T, FB, L or L-bulb
707
+ :type stf_type: str
708
+ :param spacing: distance between stiffeners
709
+ :type spacing: float
710
+ :return:
711
+ :rtype:
712
+ '''
713
+
714
+ self._CylinderMain.RingFrameObj.hw = hw
715
+ self._CylinderMain.RingFrameObj.tw = tw
716
+ self._CylinderMain.RingFrameObj.b = bf
717
+ self._CylinderMain.RingFrameObj.tf = tf
718
+ self._CylinderMain.RingFrameObj.stiffener_type = 'L-bulb' if stf_type in ['hp HP HP-bulb bulb'] else stf_type
719
+ self._CylinderMain.RingFrameObj.s = spacing
720
+ self._CylinderMain.RingFrameObj.t = self._CylinderMain.ShellObj.thk
721
+
722
+
723
+ def get_buckling_results(self):
724
+ '''
725
+ Return a dict including all buckling results
726
+ :return:
727
+ :rtype:
728
+ '''
729
+ return self._CylinderMain.get_utilization_factors()
730
+
731
+ if __name__ == '__main__':
732
+
733
+ my_cyl = CylStru(calculation_domain='Orthogonally Stiffened shell')
734
+ my_cyl.set_stresses(sasd=-137.557, tQsd=78.2986, shsd=-3.8934)
735
+ my_cyl.set_material(mat_yield=355, emodule=210000, material_factor=1.15, poisson=0.3)
736
+ my_cyl.set_imperfection()
737
+ my_cyl.set_fabrication_method()
738
+ my_cyl.set_end_cap_pressure_included_in_stress()
739
+ my_cyl.set_uls_or_als()
740
+ my_cyl.set_exclude_ring_stiffener()
741
+ my_cyl.set_length_between_girder(val=3300)
742
+ my_cyl.set_panel_spacing(val=680)
743
+ my_cyl.set_shell_geometry(radius=6500,thickness=19, tot_length_of_shell=20000, distance_between_rings=3300)
744
+ my_cyl.set_longitudinal_stiffener(hw=260-28, tw=12, bf=49, tf=28, spacing=680.367)
745
+ my_cyl.set_ring_girder(hw=500, tw=15, bf=200, tf=25, stf_type='T', spacing=3300)
746
+ my_cyl.set_shell_buckling_parmeters()
747
+ for key, val in my_cyl.get_buckling_results().items():
748
+ print(key, val)
749
+ print(my_cyl.get_buckling_results())
750
+ # #
751
+ # my_flat = FlatStru("Flat plate, stiffened with girder")
752
+ # my_flat.set_material(mat_yield=355, emodule=210000, material_factor=1.15, poisson=0.3)
753
+ # my_flat.set_plate_geometry()
754
+ # my_flat.set_stresses(sigma_x1=50, sigma_x2=50, sigma_y1=150, sigma_y2=150, pressure=0.3)
755
+ # my_flat.set_stiffener()
756
+ # my_flat.set_girder()
757
+ # my_flat.set_fixation_parameters()
758
+ # my_flat.set_buckling_parameters(calculation_method='DNV-RP-C201 - prescriptive', buckling_acceptance='buckling',
759
+ # stiffened_plate_effective_aginst_sigy=True)
760
+ # for key, val in my_flat.get_buckling_results().items():
761
+ # print(key, val)
762
+ #
763
+ # print(my_flat.get_special_provisions_results())
764
+
765
+
766
+
767
+
768
+
769
+
770
+
771
+
772
+