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.
- anystruct/ANYstructure_documentation.pdf +0 -0
- anystruct/SN_curve_parameters.py +35 -0
- anystruct/__init__.py +0 -0
- anystruct/__main__.py +24 -0
- anystruct/api.py +772 -0
- anystruct/buckling_calc_external.py +120 -0
- anystruct/bulb_anglebar_tbar_flatbar.csv +677 -0
- anystruct/calc_loads.py +526 -0
- anystruct/calc_structure.py +4838 -0
- anystruct/compartment_window.py +176 -0
- anystruct/example_data.py +532 -0
- anystruct/example_data_puls.py +46 -0
- anystruct/excel_inteface.py +244 -0
- anystruct/fatigue_window.py +352 -0
- anystruct/grid_window.py +307 -0
- anystruct/gui.py +24 -0
- anystruct/helper.py +623 -0
- anystruct/images/ANYstructure_logo.jpg +0 -0
- anystruct/images/Buckling_Strength_of_Shells.png +0 -0
- anystruct/images/Panel_geometry_definitions.png +0 -0
- anystruct/images/current_comps_NONE.png +0 -0
- anystruct/images/fls_button.gif +0 -0
- anystruct/images/img_T_L_FB.gif +0 -0
- anystruct/images/img_axial_stresses.gif +0 -0
- anystruct/images/img_ext_pressure_button.gif +0 -0
- anystruct/images/img_ext_pressure_button_def.gif +0 -0
- anystruct/images/img_fixation_parameters.gif +0 -0
- anystruct/images/img_generate_report.gif +0 -0
- anystruct/images/img_int_pressure_button.gif +0 -0
- anystruct/images/img_int_pressure_button_search.gif +0 -0
- anystruct/images/img_multi_opt.gif +0 -0
- anystruct/images/img_optimize.gif +0 -0
- anystruct/images/img_plate_and_stiffener.gif +0 -0
- anystruct/images/img_stf_button.gif +0 -0
- anystruct/images/img_stiffener.gif +0 -0
- anystruct/images/img_stress_button.gif +0 -0
- anystruct/images/img_title.gif +0 -0
- anystruct/images/img_transverse_stress.gif +0 -0
- anystruct/load_factor_window.py +166 -0
- anystruct/load_window.py +721 -0
- anystruct/main_application.py +7918 -0
- anystruct/make_grid_numpy.py +506 -0
- anystruct/make_queue.py +52 -0
- anystruct/make_stack.py +52 -0
- anystruct/ml_files/CL_CSR-Tank_req_cl_predictor.pickle +0 -0
- anystruct/ml_files/CL_CSR-Tank_req_cl_scaler.pickle +0 -0
- anystruct/ml_files/CL_CSR_plate_cl,_CSR_web_cl,_CSR_web_flange_cl,_CSR_flange_cl_predictor.pickle +0 -0
- anystruct/ml_files/CL_CSR_plate_cl,_CSR_web_cl,_CSR_web_flange_cl,_CSR_flange_cl_scaler.pickle +0 -0
- anystruct/ml_files/CL_output_cl_str_buc_110_predictor_In-plane_support_cl_1_SP.pickle +0 -0
- anystruct/ml_files/CL_output_cl_str_buc_110_predictor_In-plane_support_cl_1_UP.pickle +0 -0
- anystruct/ml_files/CL_output_cl_str_buc_110_predictor_In-plane_support_cl_2,_3_SP.pickle +0 -0
- anystruct/ml_files/CL_output_cl_str_buc_110_predictor_In-plane_support_cl_2,_3_UP.pickle +0 -0
- anystruct/ml_files/CL_output_cl_str_buc_110_scaler_In-plane_support_cl_1_SP.pickle +0 -0
- anystruct/ml_files/CL_output_cl_str_buc_110_scaler_In-plane_support_cl_1_UP.pickle +0 -0
- anystruct/ml_files/CL_output_cl_str_buc_110_scaler_In-plane_support_cl_2,_3_SP.pickle +0 -0
- anystruct/ml_files/CL_output_cl_str_buc_110_scaler_In-plane_support_cl_2,_3_UP.pickle +0 -0
- anystruct/ml_files/CL_output_cl_str_buc_115_predictor_In-plane_support_cl_1_SP.pickle +0 -0
- anystruct/ml_files/CL_output_cl_str_buc_115_predictor_In-plane_support_cl_1_UP.pickle +0 -0
- anystruct/ml_files/CL_output_cl_str_buc_115_predictor_In-plane_support_cl_2,_3_SP.pickle +0 -0
- anystruct/ml_files/CL_output_cl_str_buc_115_predictor_In-plane_support_cl_2,_3_UP.pickle +0 -0
- anystruct/ml_files/CL_output_cl_str_buc_115_scaler_In-plane_support_cl_1_SP.pickle +0 -0
- anystruct/ml_files/CL_output_cl_str_buc_115_scaler_In-plane_support_cl_1_UP.pickle +0 -0
- anystruct/ml_files/CL_output_cl_str_buc_115_scaler_In-plane_support_cl_2,_3_SP.pickle +0 -0
- anystruct/ml_files/CL_output_cl_str_buc_115_scaler_In-plane_support_cl_2,_3_UP.pickle +0 -0
- anystruct/ml_files/CL_output_cl_str_ult_110_predictor_In-plane_support_cl_1_SP.pickle +0 -0
- anystruct/ml_files/CL_output_cl_str_ult_110_predictor_In-plane_support_cl_1_UP.pickle +0 -0
- anystruct/ml_files/CL_output_cl_str_ult_110_predictor_In-plane_support_cl_2,_3_SP.pickle +0 -0
- anystruct/ml_files/CL_output_cl_str_ult_110_predictor_In-plane_support_cl_2,_3_UP.pickle +0 -0
- anystruct/ml_files/CL_output_cl_str_ult_110_scaler_In-plane_support_cl_1_SP.pickle +0 -0
- anystruct/ml_files/CL_output_cl_str_ult_110_scaler_In-plane_support_cl_1_UP.pickle +0 -0
- anystruct/ml_files/CL_output_cl_str_ult_110_scaler_In-plane_support_cl_2,_3_SP.pickle +0 -0
- anystruct/ml_files/CL_output_cl_str_ult_110_scaler_In-plane_support_cl_2,_3_UP.pickle +0 -0
- anystruct/ml_files/CL_output_cl_str_ult_115_predictor_In-plane_support_cl_1_SP.pickle +0 -0
- anystruct/ml_files/CL_output_cl_str_ult_115_predictor_In-plane_support_cl_1_UP.pickle +0 -0
- anystruct/ml_files/CL_output_cl_str_ult_115_predictor_In-plane_support_cl_2,_3_SP.pickle +0 -0
- anystruct/ml_files/CL_output_cl_str_ult_115_predictor_In-plane_support_cl_2,_3_UP.pickle +0 -0
- anystruct/ml_files/CL_output_cl_str_ult_115_scaler_In-plane_support_cl_1_SP.pickle +0 -0
- anystruct/ml_files/CL_output_cl_str_ult_115_scaler_In-plane_support_cl_1_UP.pickle +0 -0
- anystruct/ml_files/CL_output_cl_str_ult_115_scaler_In-plane_support_cl_2,_3_SP.pickle +0 -0
- anystruct/ml_files/CL_output_cl_str_ult_115_scaler_In-plane_support_cl_2,_3_UP.pickle +0 -0
- anystruct/opt_problem.py +31 -0
- anystruct/optimize.py +1680 -0
- anystruct/optimize_cylinder.py +898 -0
- anystruct/optimize_geometry.py +1708 -0
- anystruct/optimize_multiple_window.py +1507 -0
- anystruct/optimize_window.py +1117 -0
- anystruct/pl_stf_window.py +572 -0
- anystruct/report_generator.py +912 -0
- anystruct/sections.csv +202 -0
- anystruct/sesam_interface.py +115 -0
- anystruct/ship_section_example.txt +1 -0
- anystruct/stresses_window.py +269 -0
- anystruct/testCalc.py +118 -0
- anystructure-5.2.0.dist-info/METADATA +86 -0
- anystructure-5.2.0.dist-info/RECORD +99 -0
- anystructure-5.2.0.dist-info/WHEEL +5 -0
- anystructure-5.2.0.dist-info/entry_points.txt +2 -0
- anystructure-5.2.0.dist-info/licenses/LICENSE +21 -0
- 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
|
+
|