OpenSeesPyAssistant 1.1
OpenSeesPy for everyone
MaterialModels.py
Go to the documentation of this file.
1"""
2Module for the material models.
3Carmine Schipani, 2021
4"""
5
6from openseespy.opensees import *
7import matplotlib.pyplot as plt
8import numpy as np
9import os
10import math
11from abc import abstractmethod
12from copy import copy, deepcopy
16from OpenSeesPyAssistant.Units import *
17
18
20 """
21 Parent abstract class for the storage and manipulation of a material model's information (mechanical
22 and geometrical parameters, etc) and initialisation in the model.
23
24 @param DataManagement: Parent abstract class.
25 """
26 @abstractmethod
28 """
29 Abstract function used to check the applicability of the material model.
30 """
31 pass
32
33
35 """
36 Class that stores funcions and material properties of a steel double symmetric I-shape profile
37 with modified Ibarra-Medina-Krawinkler as the material model for the nonlinear springs and the OpenSeesPy command type used to model it is Bilin.
38 The default values are valid for a simple cantelever.
39 For more information about the empirical model for the computation of the parameters, see Lignos Krawinkler 2011.
40 The parameter 'n' is used as global throughout the SteelIShape sections to optimise the program (given the fact that is constant everytime).
41
42 @param MaterialModels: Parent abstract class.
43 """
44 global n
45 n = 10.0
46
47 def __init__(self, ID: int, Type: str, d, bf, tf, tw, h_1, Iy_mod, iz, E, Fy, Npl, My, L,
48 N_G = 0, K_factor = 3, L_0 = -1, L_b = -1, Mc = -1, K = -1, theta_u = -1, safety_factors = False):
49 """
50 Constructor of the class. Every argument that is optional and is initialised as -1, will be computed in this class.
51
52 @param ID (int): ID of the material model.
53 @param Type (str): Type of the section. It can be 'Col' for column or 'Beam' for beams.
54 @param d (float): Depth of the section.
55 @param bf (float): Flange's width of the section
56 @param tf (float): Flange's thickness of the section
57 @param tw (float): Web's thickness of the section
58 @param h_1 (float): Depth excluding the flange's thicknesses and the weld fillets.
59 @param Iy_mod (float): n modified moment of inertia (strong axis)
60 @param iz (float): Radius of gyration (weak axis).
61 @param E (float): Young modulus.
62 @param Fy (float): Yield strength.
63 @param Npl (float): Maximal vertical axial load.
64 @param My (float): Yielding moment.
65 @param L (float): Effective length of the element associated with this section.
66 If the panel zone is present, exclude its dimension.
67 @param N_G (float, optional): Gravity axial load. Defaults to 0.
68 @param K_factor (float, optional): Rigidity factor. Defaults to 3 (assuming cantilever).
69 @param L_0 (float, optional): Position of the inflection point.
70 Defaults to -1, e.g. computed as the total length, assuming cantilever.
71 @param L_b (float, optional): Maximal unbraced lateral torsional buckling length.
72 Defaults to -1, e.g. computed as the total length, assuming cantilever with no bracing support.
73 @param Mc (float, optional): Capping moment. Defaults to -1, e.g. computed in ComputeMc.
74 @param K (float, optional): Residual strength ratio. Defaults to -1, e.g. computed in ComputeK.
75 @param theta_u (float, optional): Ultimate rotation. Defaults to -1, e.g. computed in ComputeTheta_u.
76 @param safety_factors (bool, optional): Safety factors used if standard mechanical parameters are used (not test results). Defaults to False.
77
78 @exception NegativeValue: ID needs to be a positive integer.
79 @exception WrongArgument: Type needs to be 'Col' or 'Beam'.
80 @exception NegativeValue: d needs to be positive.
81 @exception NegativeValue: bf needs to be positive.
82 @exception NegativeValue: tf needs to be positive.
83 @exception NegativeValue: tw needs to be positive.
84 @exception NegativeValue: h_1 needs to be positive.
85 @exception NegativeValue: Iy_mod needs to be positive.
86 @exception NegativeValue: iz needs to be positive.
87 @exception NegativeValue: E needs to be positive.
88 @exception NegativeValue: Fy needs to be positive.
89 @exception NegativeValue: Npl needs to be positive.
90 @exception NegativeValue: My needs to be positive.
91 @exception NegativeValue: L needs to be positive.
92 @exception NegativeValue: N_G needs to be positive.
93 @exception NegativeValue: L_0 needs to be positive if different from -1.
94 @exception NegativeValue: L_b needs to be positive if different from -1.
95 @exception NegativeValue: Mc needs to be positive if different from -1.
96 @exception NegativeValue: K needs to be positive if different from -1.
97 @exception NegativeValue: theta_u needs to be positive if different from -1.
98 @exception InconsistentGeometry: h_1 can't be bigger than d
99 @exception MemberFailure: N_G can't be bigger than Npl (section failure).
100 @exception InconsistentGeometry: L_0 can't be bigger than L
101 """
102 # Check
103 if ID < 0: raise NegativeValue()
104 if Type != "Beam" and Type != "Col": raise WrongArgument()
105 if d < 0: raise NegativeValue()
106 if bf < 0: raise NegativeValue()
107 if tf < 0: raise NegativeValue()
108 if tw < 0: raise NegativeValue()
109 if h_1 < 0: raise NegativeValue()
110 if Iy_mod < 0: raise NegativeValue()
111 if iz < 0: raise NegativeValue()
112 if E < 0: raise NegativeValue()
113 if Fy < 0: raise NegativeValue()
114 if Npl < 0: raise NegativeValue()
115 if My < 0: raise NegativeValue()
116 if L < 0: raise NegativeValue()
117 if N_G < 0: raise NegativeValue()
118 if L_0 != -1 and L_0 < 0: raise NegativeValue()
119 if L_b != -1 and L_b < 0: raise NegativeValue()
120 if Mc != -1 and Mc < 0: raise NegativeValue()
121 if K != -1 and K < 0: raise NegativeValue()
122 if theta_u != -1 and theta_u < 0: raise NegativeValue()
123 if h_1 > d: raise InconsistentGeometry()
124 if N_G > Npl: raise MemberFailure()
125 if L_0 > L: raise InconsistentGeometry()
126
127 # Arguments
128 self.TypeType = Type
129 self.IDID = ID
130 self.dd = d
131 self.bfbf = bf
132 self.tftf = tf
133 self.twtw = tw
134 self.h_1h_1 = h_1
135 self.Iy_modIy_mod = Iy_mod
136 self.iziz = iz
137 self.EE = E
138 self.FyFy = Fy
139 self.NplNpl = Npl
140 self.MyMy = My
141 self.LL = L
142 self.N_GN_G = N_G
143 self.K_factorK_factor = K_factor
144 self.L_0L_0 = L if L_0 == -1 else L_0
145 self.L_bL_b = L if L_b == -1 else L_b
146
147 # Initialized the parameters that are dependent from others
148 self.section_name_tagsection_name_tag = "None"
149 self.InitializedInitialized = False
150 if safety_factors:
151 self.gamma_rmgamma_rm = 1.25
152 self.prob_factorprob_factor = 1.15
153 else:
154 self.gamma_rmgamma_rm = 1.0
155 self.prob_factorprob_factor = 1.0
156 self.ReInitReInit(Mc, K, theta_u)
157
158
159 # Methods
160 def ReInit(self, Mc = -1, K = -1, theta_u = -1):
161 """
162 Implementation of the homonym abstract method.
163 See parent class DataManagement for detailed information.
164
165 @param Mc (float, optional): Capping moment. Defaults to -1, e.g. computed in ComputeMc.
166 @param K (float, optional): Residual strength ratio. Defaults to -1, e.g. computed in ComputeK.
167 @param theta_u (float, optional): Ultimate rotation. Defaults to -1, e.g. computed in ComputeTheta_u.
168 """
169 # Precompute some members
170 self.My_starMy_star = self.ComputeMyStarComputeMyStar()
171
172 # Arguments
173 self.McMc = self.ComputeMcComputeMc() if Mc == -1 else Mc
174 self.KK = self.ComputeKComputeK() if K == -1 else K
175 self.theta_utheta_u = self.ComputeTheta_uComputeTheta_u() if theta_u == -1 else theta_u
176
177 # Check applicability
178 self.CheckApplicabilityCheckApplicabilityCheckApplicability()
179
180 # Members
181 self.KeKe = self.ComputeKeComputeKe()
182 self.theta_ytheta_y = self.ComputeTheta_yComputeTheta_y()
183 self.theta_ptheta_p = self.ComputeTheta_pComputeTheta_p()
184 self.theta_pctheta_pc = self.ComputeTheta_pcComputeTheta_pc()
185 self.McMyMcMy = self.McMc/self.My_starMy_star
186 self.rate_detrate_det = self.ComputeRefEnergyDissipationCapComputeRefEnergyDissipationCap()
187 self.aa = self.ComputeaComputea()
188 self.a_sa_s = self.Computea_sComputea_s()
189 if self.section_name_tagsection_name_tag != "None": self.section_name_tagsection_name_tag = self.section_name_tagsection_name_tag + " (modified)"
190
191 # Data storage for loading/saving
192 self.UpdateStoredDataUpdateStoredData()
193
194
196 """
197 Implementation of the homonym abstract method.
198 See parent class DataManagement for detailed information.
199 """
200 self.datadata = [["INFO_TYPE", "ModifiedIMK"], # Tag for differentiating different data
201 ["ID", self.IDID],
202 ["section_name_tag", self.section_name_tagsection_name_tag],
203 ["Type", self.TypeType],
204 ["d", self.dd],
205 ["bf", self.bfbf],
206 ["tf", self.tftf],
207 ["tw", self.twtw],
208 ["h_1", self.h_1h_1],
209 ["Iy_mod", self.Iy_modIy_mod],
210 ["iz", self.iziz],
211 ["E", self.EE],
212 ["Fy", self.FyFy],
213 ["L", self.LL],
214 ["N_G", self.N_GN_G],
215 ["K_factor", self.K_factorK_factor],
216 ["Ke", self.KeKe],
217 ["L_0", self.L_0L_0],
218 ["L_b", self.L_bL_b],
219 ["gamma_rm", self.gamma_rmgamma_rm],
220 ["prob_factor", self.prob_factorprob_factor],
221 ["Npl", self.NplNpl],
222 ["My", self.MyMy],
223 ["My_star", self.My_starMy_star],
224 ["Mc", self.McMc],
225 ["McMy", self.McMyMcMy],
226 ["K", self.KK],
227 ["theta_y", self.theta_ytheta_y],
228 ["theta_p", self.theta_ptheta_p],
229 ["theta_pc", self.theta_pctheta_pc],
230 ["theta_u", self.theta_utheta_u],
231 ["rate_det", self.rate_detrate_det],
232 ["a", self.aa],
233 ["a_s", self.a_sa_s],
234 ["Initialized", self.InitializedInitialized]]
235
236
237 def ShowInfo(self, plot = False, block = False):
238 """
239 Implementation of the homonym abstract method.
240 See parent class DataManagement for detailed information.
241
242 @param plot (bool, optional): Option to show the plot of the material model. Defaults to False.
243 @param block (bool, optional): Option to wait the user command 'plt.show()' (avoiding the stop of the program everytime that a plot should pop up). Defaults to False.
244 """
245 Mr = self.KK*self.My_starMy_star
246 theta_p_plot = self.theta_ptheta_p
247 if self.theta_ptheta_p > self.theta_utheta_u-self.theta_ytheta_y:
248 theta_p_plot = self.theta_utheta_u-self.theta_ytheta_y
249 theta_r = self.theta_ytheta_y + theta_p_plot + self.theta_pctheta_pc*(1.0-Mr/self.McMc)
250 if theta_r > self.theta_utheta_u:
251 theta_r = self.theta_utheta_u
252 Mr = self.McMc*(1.0-1.0/self.theta_pctheta_pc*(self.theta_utheta_u-self.theta_ytheta_y-theta_p_plot))
253
254 print("")
255 print("Requested info for Modified IMK (Ibarra-Medina-Krawinkler) material model Parameters, ID = {}".format(self.IDID))
256 print("Section associated: {}".format(self.section_name_tagsection_name_tag))
257 print('theta y = {}'.format(self.theta_ytheta_y))
258 print('theta p = {}'.format(self.theta_ptheta_p))
259 print('theta r = {}'.format(theta_r))
260 print('theta pc = {}'.format(self.theta_pctheta_pc))
261 print('theta u = {}'.format(self.theta_utheta_u))
262 print('My star = {} kNm'.format(self.My_starMy_star/kNm_unit))
263 print('Mc = {} kNm'.format(self.McMc/kNm_unit))
264 print('Mr = {} kNm'.format(Mr/kNm_unit))
265 print('a = {} '.format(self.aa))
266 print('as = {} '.format(self.a_sa_s))
267 print('lambda (deterioration rate) = {} '.format(self.rate_detrate_det))
268 print("")
269
270 if plot:
271 # Data for plotting
272 x_axis = np.array([0.0, self.theta_ytheta_y, self.theta_ytheta_y + theta_p_plot, theta_r, self.theta_utheta_u, self.theta_utheta_u])
273 x_axis2 = np.array([self.theta_ytheta_y + theta_p_plot, self.theta_ytheta_y + theta_p_plot + self.theta_pctheta_pc])
274 y_axis = np.array([0.0, self.My_starMy_star, self.McMc, Mr, Mr, 0.0])/kNm_unit
275 y_axis2 = np.array([self.McMc, 0.0])/kNm_unit
276
277 fig, ax = plt.subplots()
278 ax.plot(x_axis, y_axis, 'k-')
279 ax.plot(x_axis2, y_axis2, 'k--')
280
281 ax.set(xlabel='Rotation [rad]', ylabel='Moment [kNm]',
282 title='Modified IMK deterioration model (ID={})'.format(self.IDID))
283 ax.grid()
284
285 if block:
286 plt.show()
287
288
290 """
291 Implementation of the homonym abstract method.
292 See parent class MaterialModels for detailed information.
293 """
294 Check = True
295 if self.TypeType == "Beam":
296 if self.dd/self.twtw < 20 or self.dd/self.twtw > 55:
297 Check = False
298 print("The d/tw check was not fullfilled")
299 if self.L_bL_b/self.iziz < 20 or self.L_bL_b/self.iziz > 80:
300 Check = False
301 print("The Lb/iz check was not fullfilled")
302 if self.bfbf/2/self.tftf < 4 or self.bfbf/2/self.tftf > 8:
303 Check = False
304 print("The bf/2/tf check was not fullfilled")
305 if self.LL/self.dd < 2.5 or self.LL/self.dd > 7:
306 Check = False
307 print("The check L/d was not fullfilled")
308 if self.dd < 102*mm_unit or self.dd > 914*mm_unit:
309 Check = False
310 print("The d check was not fullfilled")
311 if self.FyFy < 240*MPa_unit or self.FyFy > 450*MPa_unit:
312 Check = False
313 print("The Fy check was not fullfilled")
314 else:
315 if self.h_1h_1/self.twtw < 3.71 or self.dd/self.twtw > 57.5:
316 Check = False
317 print("The h1/tw check was not fullfilled")
318 if self.L_bL_b/self.iziz < 38.4 or self.L_bL_b/self.iziz > 120:
319 Check = False
320 print("The Lb/iz check was not fullfilled")
321 if self.N_GN_G/self.NplNpl < 0 or self.N_GN_G/self.NplNpl > 0.75:
322 Check = False
323 print("The NG/Npl check was not fullfilled")
324 if not Check:
325 print("The validity of the equations is not fullfilled.")
326 print("!!!!!!! WARNING !!!!!!! Check material model of Modified IMK, ID=", self.IDID)
327 print("")
328
329 def ComputeKe(self):
330 """
331 Method that computes the elastic stiffness.
332
333 @returns float: The stiffness
334 """
335 return self.K_factorK_factor*n*self.EE*self.Iy_modIy_mod/self.LL
336
337 def Computea(self):
338 """
339 Method that computes the strain hardening ratio with the n modification.
340
341 @returns float: Strain hardening ratio.
342 """
343 # strain hardening ratio of spring
344 return (n+1.0)*self.My_starMy_star*(self.McMyMcMy-1.0)/(self.KeKe*self.theta_ptheta_p)
345
346 def Computea_s(self):
347 """
348 Method that computes the modified strain hardening ratio for the spring.
349 For more info see Ibarra & Krawinkler 2005.
350
351 @returns float: Strain hardening ratio.
352 """
353 return self.aa/(1.0+n*(1.0-self.aa))
354
355 def ComputeMyStar(self):
356 """
357 Method that computes the effective yield moment.
358 For more info see Lignos & Krawinkler 2011 and Lignos et Al. 2019.
359
360 @returns float: Effective yield moment.
361 """
362 if self.TypeType == "Beam":
363 return self.prob_factorprob_factor*self.MyMy*self.gamma_rmgamma_rm*1.1
364 else:
365 if self.N_GN_G/self.NplNpl > 0.2:
366 return 1.15*self.prob_factorprob_factor*self.MyMy*self.gamma_rmgamma_rm*(1-self.N_GN_G/self.NplNpl)*9.0/8.0
367 else:
368 return 1.15*self.prob_factorprob_factor*self.MyMy*self.gamma_rmgamma_rm*(1-self.N_GN_G/2.0/self.NplNpl)
369
370 def ComputeMc(self):
371 """
372 Method that computes the capping moment.
373 For more info see Lignos & Krawinkler 2011 and Lignos et Al. 2019.
374
375 @returns float: Capping moment.
376 """
377 if self.TypeType == "Beam":
378 return self.My_starMy_star*1.11
379 # For RBS: My_star*1.09
380 else:
381 tmp = 12.5*(self.h_1h_1/self.twtw)**(-0.2)*(self.L_bL_b/self.iziz)**(-0.4)*(1-self.N_GN_G/self.NplNpl)**0.4
382 return max(min(1.3, tmp), 1.0)*self.My_starMy_star
383
384 def ComputeK(self):
385 """
386 Method that computes the residual strength ratio.
387 For more info see Lignos & Krawinkler 2011 and Lignos et Al. 2019.
388
389 @returns float: Residual strength ratio.
390 """
391 if self.TypeType == "Beam":
392 return 0.4
393 else:
394 tmp = 0.5-0.4*self.N_GN_G/self.NplNpl
395 return max(tmp, 0)
396
397 def ComputeTheta_y(self):
398 """
399 Method that computes the yield rotation.
400 For more info see Lignos & Krawinkler 2011 and Lignos et Al. 2019.
401
402 @returns float: Yield rotation.
403 """
404 return self.My_starMy_star/self.KeKe*(n+1)
405
406 def ComputeTheta_p(self):
407 """
408 Method that computes the plastic rotation.
409 For more info see Lignos & Krawinkler 2011 and Lignos et Al. 2019.
410
411 @returns float: Plastic rotation.
412 """
413 if self.TypeType == "Beam":
414 if self.dd < 533.0*mm_unit:
415 return 0.0865*(self.h_1h_1/self.twtw)**(-0.365)*(self.bfbf/2.0/self.tftf)**(-0.14)*(self.L_0L_0/self.dd)**(0.34)*(self.dd/(533.0*mm_unit))**(-0.721)*(self.FyFy/(355.0*MPa_unit))**(-0.23)
416 else:
417 return 0.318*(self.h_1h_1/self.twtw)**(-0.550)*(self.bfbf/2.0/self.tftf)**(-0.345)*(self.L_0L_0/self.dd)**(0.090)*(self.L_bL_b/self.iziz)**(-0.023)*(self.dd/(533.0*mm_unit))**(-0.330)*(self.FyFy/(355.0*MPa_unit))**(-0.130)
418 # With RBS: ...
419 else:
420 tmp = 294.0*(self.h_1h_1/self.twtw)**(-1.7)*(self.L_bL_b/self.iziz)**(-0.7)*(1.0-self.N_GN_G/self.NplNpl)**(1.6) # *(self.E/self.Fy/gamma_rm)**(0.2) # EC8
421 if tmp > 0.2:
422 tmp = 0.2
423 # if tmp > self.theta_u-self.theta_y:
424 # tmp = (self.theta_u-self.theta_y)*0.799 # convergence issue
425 return tmp
426
428 """
429 Method that computes the post capping rotation.
430 For more info see Lignos & Krawinkler 2011 and Lignos et Al. 2019.
431
432 @returns float: Post capping rotation.
433 """
434 if self.TypeType == "Beam":
435 if self.dd < 533.0*mm_unit:
436 return 5.63*(self.h_1h_1/self.twtw)**(-0.565)*(self.bfbf/2.0/self.tftf)**(-0.800)*(self.dd/(533.0*mm_unit))**(-0.280)*(self.FyFy/(355.0*MPa_unit))**(-0.430)
437 else:
438 return 7.50*(self.h_1h_1/self.twtw)**(-0.610)*(self.bfbf/2.0/self.tftf)**(-0.710)*(self.L_bL_b/self.iziz)**(-0.110)*(self.dd/(533.0*mm_unit))**(-0.161)*(self.FyFy/(355.0*MPa_unit))**(-0.320)
439 # With RBS: ...
440 else:
441 tmp = 90.0*(self.h_1h_1/self.twtw)**(-0.8)*(self.L_bL_b/self.iziz)**(-0.8)*(1.0-self.N_GN_G/self.NplNpl)**(2.5) # *(self.E/self.Fy/gamma_rm)**(0.07) # EC8
442 return min(tmp, 0.3)
443
444 def ComputeTheta_u(self):
445 """
446 Method that computes the ultimate rotation.
447 For more info see Lignos & Krawinkler 2011 and Lignos et Al. 2019.
448
449 @returns float: Ultimate rotation.
450 """
451 if self.TypeType == "Beam":
452 return 0.2
453 else:
454 return 0.15
455
457 """
458 Method that computes the reference energy dissipation capacity.
459 For more info see Lignos & Krawinkler 2011 and Lignos et Al. 2019.
460
461 @returns float: Reference energy dissipation capacity.
462 """
463 if self.TypeType == "Beam":
464 if self.dd < 533.0*mm_unit:
465 return 495.0*(self.h_1h_1/self.twtw)**(-1.34)*(self.bfbf/2.0/self.tftf)**(-0.595)*(self.FyFy/(355.0*MPa_unit))**(-0.360)
466 else:
467 return 536.0*(self.h_1h_1/self.twtw)**(-1.26)*(self.bfbf/2.0/self.tftf)**(-0.525)*(self.L_bL_b/self.iziz)**(-0.130)*(self.FyFy/(355.0*MPa_unit))**(-0.291)
468 # With RBS: ...
469 else:
470 if self.N_GN_G/self.NplNpl > 0.35:
471 tmp = 268000.0*(self.h_1h_1/self.twtw)**(-2.30)*(self.L_bL_b/self.iziz)**(-1.130)*(1.0-self.N_GN_G/self.NplNpl)**(1.19)
472 return min(tmp, 3.0)
473 else:
474 tmp = 25000.0*(self.h_1h_1/self.twtw)**(-2.14)*(self.L_bL_b/self.iziz)**(-0.53)*(1.0-self.N_GN_G/self.NplNpl)**(4.92)
475 return min(tmp, 3.0)
476
477
478 def Bilin(self):
479 """
480 Generate the material model Bilin (Modified IMK) using the computed parameters.
481 See _Bilin function for more information.
482 """
483 _Bilin(self.IDID, self.KeKe, self.a_sa_s, self.My_starMy_star, self.theta_ptheta_p, self.theta_pctheta_pc, self.KK, self.theta_utheta_u, self.rate_detrate_det)
484 self.InitializedInitialized = True
485 self.UpdateStoredDataUpdateStoredData()
486
487
489 """
490 Class that is the children of ModifiedIMK and combine the class SteelIShape (section) to retrieve the information needed.
491
492 @param ModifiedIMK: Parent class.
493 """
494 def __init__(self, ID, section: SteelIShape, N_G = 0, K_factor = 3, L_0 = -1, L_b = -1, Mc = -1, K = -1, theta_u = -1, safety_factors = False):
495 """
496 Constructor of the class. It passes the arguments into the parent class to generate the combination of the parent class
497 and the section class SteelIShape.
498 Every argument that is optional and is initialised as -1, will be computed in this class.
499 The copy of the section passed is stored in the member variable self.sectionsection.
500
501 @param ID (int): ID of the material model.
502 @param section (SteelIShape): Object that store informations for a steel I shpae section.
503 @param N_G (float, optional): Gravity axial load. Defaults to 0.
504 @param K_factor (float, optional): Rigidity factor. Defaults to 3 (assuming cantilever).
505 @param L_0 (float, optional): Position of the inflection point.
506 Defaults to -1, e.g. computed as the total length, assuming cantilever.
507 @param L_b (float, optional):Maximal unbraced lateral torsional buckling length.
508 Defaults to -1, e.g computed as the total length, assuming cantilever with no bracing support.
509 @param Mc (float, optional): Capping moment. Defaults to -1, e.g. computed in ComputeMc.
510 @param K (float, optional): Residual strength ratio. Defaults to -1, e.g. computed in ComputeK.
511 @param theta_u (float, optional): Ultimate rotation. Defaults to -1, e.g. computed in ComputeTheta_u.
512 @param safety_factors (bool, optional): Safety factors used if standard mechanical parameters are used (not test results). Defaults to False.
513 """
514 self.sectionsection = deepcopy(section)
515 super().__init__(ID, section.Type, section.d, section.bf, section.tf, section.tw, section.h_1,
516 section.Iy_mod, section.iz, section.E, section.Fy, section.Npl, section.My, section.L, N_G,
517 K_factor, L_0, L_b, Mc, K, theta_u, safety_factors)
518 self.section_name_tagsection_name_tagsection_name_tag = section.name_tag
519 self.UpdateStoredDataUpdateStoredData()
520
521
523 """
524 Class that stores funcions and material properties of a steel double symmetric I-shape profile
525 with Gupta 1999 as the material model for the panel zone and the OpenSeesPy command type used to model it is Hysteresis.
526 The material model is valid only if the column is continuous.
527 For more information about the empirical model for the computation of the parameters, see Gupta 1999.
528
529 @param MaterialModels: Parent abstract class.
530 """
531 def __init__(self, ID: int, d_c, bf_c, tf_c, I_c, d_b, tf_b, Fy, E, t_p,
532 t_dp = 0.0, a_s = 0.03, pinchx = 0.25, pinchy = 0.75, dmg1 = 0.0, dmg2 = 0.0, beta = 0.0, safety_factor = False):
533 """
534 Constructor of the class.
535
536 @param ID (int): Unique material model ID.
537 @param d_c (float): Column depth.
538 @param bf_c (float): Column flange width.
539 @param tf_c (float): Column flange thickness.
540 @param I_c (float): Column moment of inertia (strong axis).
541 @param d_b (float): Beam depth.
542 @param tf_b (float): Beam flange thickness.
543 @param Fy (float): Yield strength (if assume continous column, Fy of the web).
544 @param E (float): Young modulus.
545 @param t_p (float): Panel zone thickness.
546 @param t_dp (float, optional): Doubler plate thickness. Defaults to 0.0.
547 @param a_s (float, optional): Strain hardening. Defaults to 0.03.
548 @param pinchx (float, optional): Pinching factor for strain (or deformation) during reloading. Defaults to 0.25.
549 @param pinchy (float, optional): Pinching factor for stress (or force) during reloading. Defaults to 0.75.
550 @param dmg1 (float, optional): Damage due to ductility: D1(mu-1). Defaults to 0.0.
551 @param dmg2 (float, optional): Damage due to energy: D2(Eii/Eult). Defaults to 0.0.
552 @param beta (float, optional): Power used to determine the degraded unloading stiffness based on ductility, mu-beta. Defaults to 0.0.
553 @param safety_factor (bool, optional): Safety factor used if standard mechanical parameters are used (not test results). Defaults to False.
554
555 @exception NegativeValue: ID needs to be a positive integer.
556 @exception NegativeValue: d_c needs to be positive.
557 @exception NegativeValue: bf_c needs to be positive.
558 @exception NegativeValue: tf_c needs to be positive.
559 @exception NegativeValue: d_b needs to be positive.
560 @exception NegativeValue: tf_b needs to be positive.
561 @exception NegativeValue: Fy needs to be positive.
562 @exception NegativeValue: E needs to be positive.
563 @exception NegativeValue: t_p needs to be positive.
564 @exception NegativeValue: a_s needs to be positive.
565 """
566 # Check
567 if ID < 1: raise NegativeValue()
568 if d_c < 0: raise NegativeValue()
569 if bf_c < 0: raise NegativeValue()
570 if tf_c < 0: raise NegativeValue()
571 if d_b < 0: raise NegativeValue()
572 if tf_b < 0: raise NegativeValue()
573 if Fy < 0: raise NegativeValue()
574 if E < 0: raise NegativeValue()
575 if t_p < 0: raise NegativeValue()
576 if a_s < 0: raise NegativeValue()
577
578 # Arguments
579 self.IDID = ID
580 self.d_cd_c = d_c
581 self.bf_cbf_c = bf_c
582 self.tf_ctf_c = tf_c
583 self.I_cI_c = I_c
584 self.d_bd_b = d_b
585 self.tf_btf_b = tf_b
586 self.FyFy = Fy
587 self.EE = E
588 self.t_pt_p = t_p
589 self.t_dpt_dp = t_dp
590 self.a_sa_s = a_s
591 self.pinchxpinchx = pinchx
592 self.pinchypinchy = pinchy
593 self.dmg1dmg1 = dmg1
594 self.dmg2dmg2 = dmg2
595 self.betabeta = beta
596 if safety_factor:
597 self.RyRy = 1.2
598 else:
599 self.RyRy = 1.0
600
601 # Initialized the parameters that are dependent from others
602 self.beam_section_name_tagbeam_section_name_tag = "None"
603 self.col_section_name_tagcol_section_name_tag = "None"
604 self.InitializedInitialized = False
605 self.ReInitReInit()
606
607
608 # Methods
609 def ReInit(self):
610 """
611 Implementation of the homonym abstract method.
612 See parent class DataManagement for detailed information.
613 """
614 # Check applicability
615 self.CheckApplicabilityCheckApplicabilityCheckApplicability()
616
617 # Members
618 if self.beam_section_name_tagbeam_section_name_tag != "None": self.beam_section_name_tagbeam_section_name_tag = self.beam_section_name_tagbeam_section_name_tag + " (modified)"
619 if self.col_section_name_tagcol_section_name_tag != "None": self.col_section_name_tagcol_section_name_tag = self.col_section_name_tagcol_section_name_tag + " (modified)"
620
621 # Trilinear Parameters
622 self.t_pzt_pz = self.t_pt_p + self.t_dpt_dp
623 self.VyVy = 0.55 * self.FyFy * self.RyRy * self.d_cd_c * self.t_pzt_pz # Yield Shear
624 self.GG = self.EE/(2.0 * (1.0 + 0.30)) # Shear Modulus
625 self.KeKe = 0.95 * self.GG * self.t_pzt_pz * self.d_cd_c # Elastic Stiffness
626 self.KpKp = 0.95 * self.GG * self.bf_cbf_c * (self.tf_ctf_c * self.tf_ctf_c) / self.d_bd_b # Plastic Stiffness
627
628 # Define Trilinear Equivalent Rotational Spring
629 # Yield point for Trilinear Spring at gamma1_y
630 self.gamma1_ygamma1_y = self.VyVy / self.KeKe
631 self.M1yM1y = self.gamma1_ygamma1_y * (self.KeKe * self.d_bd_b)
632 # Second Point for Trilinear Spring at 4 * gamma1_y
633 self.gamma2_ygamma2_y = 4.0 * self.gamma1_ygamma1_y
634 self.M2yM2y = self.M1yM1y + (self.KpKp * self.d_bd_b) * (self.gamma2_ygamma2_y - self.gamma1_ygamma1_y)
635 # Third Point for Trilinear Spring at 100 * gamma1_y
636 self.gamma3_ygamma3_y = 100.0 * self.gamma1_ygamma1_y
637 self.M3yM3y = self.M2yM2y + (self.a_sa_s * self.KeKe * self.d_bd_b) * (self.gamma3_ygamma3_y - self.gamma2_ygamma2_y)
638
639 # Data storage for loading/saving
640 self.UpdateStoredDataUpdateStoredData()
641
642
644 """
645 Implementation of the homonym abstract method.
646 See parent class DataManagement for detailed information.
647 """
648 self.datadata = [["INFO_TYPE", "Gupta1999"], # Tag for differentiating different data
649 ["ID", self.IDID],
650 ["beam_section_name_tag", self.beam_section_name_tagbeam_section_name_tag],
651 ["col_section_name_tag", self.col_section_name_tagcol_section_name_tag],
652 ["d_c", self.d_cd_c],
653 ["bf_c", self.bf_cbf_c],
654 ["tf_c", self.tf_ctf_c],
655 ["I_c", self.I_cI_c],
656 ["d_b", self.d_bd_b],
657 ["tf_b", self.tf_btf_b],
658 ["Fy", self.FyFy],
659 ["E", self.EE],
660 ["G", self.GG],
661 ["t_p", self.t_pt_p],
662 ["t_dp", self.t_dpt_dp],
663 ["t_pz", self.t_pzt_pz],
664 ["a_s", self.a_sa_s],
665 ["pinchx", self.pinchxpinchx],
666 ["pinchy", self.pinchypinchy],
667 ["dmg1", self.dmg1dmg1],
668 ["dmg2", self.dmg2dmg2],
669 ["beta", self.betabeta],
670 ["Ry", self.RyRy],
671 ["Vy", self.VyVy],
672 ["Ke", self.KeKe],
673 ["Kp", self.KpKp],
674 ["gamma1_y", self.gamma1_ygamma1_y],
675 ["M1y", self.M1yM1y],
676 ["gamma2_y", self.gamma2_ygamma2_y],
677 ["M2y", self.M2yM2y],
678 ["gamma3_y", self.gamma3_ygamma3_y],
679 ["M3y", self.M3yM3y],
680 ["Initialized", self.InitializedInitialized]]
681
682 def ShowInfo(self, plot = False, block = False):
683 """
684 Implementation of the homonym abstract method.
685 See parent class DataManagement for detailed information.
686
687 @param plot (bool, optional): Option to show the plot of the material model. Defaults to False.
688 @param block (bool, optional): Option to wait the user command 'plt.show()' (avoiding the stop of the program everytime that a plot should pop up). Defaults to False.
689 """
690 print("")
691 print("Requested info for Gupta 1999 material model Parameters, ID = {}".format(self.IDID))
692 print("Sections associated, column: {} ".format(self.col_section_name_tagcol_section_name_tag))
693 print("Sections associated, beam: {} ".format(self.beam_section_name_tagbeam_section_name_tag))
694 print("gamma1_y = {} rad".format(self.gamma1_ygamma1_y))
695 print("gamma2_y = {} rad".format(self.gamma2_ygamma2_y))
696 print("gamma3_y = {} rad".format(self.gamma3_ygamma3_y))
697 print("M1y = {} kNm".format(self.M1yM1y/kNm_unit))
698 print("M2y = {} kNm".format(self.M2yM2y/kNm_unit))
699 print("M3y = {} kNm".format(self.M3yM3y/kNm_unit))
700 print("")
701
702 if plot:
703 # Data for plotting
704 # Last point for plot
705 gamma3_y_plot = 10.0 * self.gamma1_ygamma1_y
706 M3y_plot = self.M2yM2y + (self.a_sa_s * self.KeKe * self.d_bd_b) * (gamma3_y_plot - self.gamma2_ygamma2_y)
707
708 x_axis = np.array([0.0, self.gamma1_ygamma1_y, self.gamma2_ygamma2_y, gamma3_y_plot])
709 y_axis = np.array([0.0, self.M1yM1y, self.M2yM2y, M3y_plot])/kNm_unit
710
711 fig, ax = plt.subplots()
712 ax.plot(x_axis, y_axis, 'k-')
713
714 ax.set(xlabel='Rotation [rad]', ylabel='Moment [kNm]',
715 title='Gupta 1999 material model (ID={})'.format(self.IDID))
716 ax.grid()
717
718 if block:
719 plt.show()
720
721
723 """
724 Implementation of the homonym abstract method.
725 See parent class MaterialModels for detailed information.
726 """
727 Check = True
728 # No checks
729 if not Check:
730 print("The validity of the equations is not fullfilled.")
731 print("!!!!!!! WARNING !!!!!!! Check material model of Gupta 1999, ID=", self.IDID)
732 print("")
733
734
735 def Hysteretic(self):
736 """
737 Generate the material model Hysteretic (Gupta 1999) using the computed parameters.
738 See _Hysteretic function for more information.
739 """
740 _Hysteretic(self.IDID, self.M1yM1y, self.gamma1_ygamma1_y, self.M2yM2y, self.gamma2_ygamma2_y, self.M3yM3y, self.gamma3_ygamma3_y,
741 self.pinchxpinchx, self.pinchypinchy, self.dmg1dmg1, self.dmg2dmg2, self.betabeta)
742 self.InitializedInitialized = True
743 self.UpdateStoredDataUpdateStoredData()
744
745
747 """
748 Class that is the children of Gupta1999 and combine the class SteelIShape (section) to retrieve the information needed.
749
750 @param Gupta1999: Parent class.
751 """
752 def __init__(self, ID: int, col: SteelIShape, beam: SteelIShape,
753 t_dp = 0.0, a_s = 0.03, pinchx = 0.25, pinchy = 0.75, dmg1 = 0.0, dmg2 = 0.0, beta = 0.0, safety_factor = False):
754 """
755 Constructor of the class. It passes the arguments into the parent class to generate the combination of the parent class
756 and the section class SteelIShape.
757 The copy of the sections (col and beam) passed is stored in the member variable self.section.
758
759 @param ID (int): Unique material model ID.
760 @param col (SteelIShape): SteelIShape column section object.
761 @param beam (SteelIShape): SteelIShape beam section object.
762 @param t_dp (float, optional): Doubler plate thickness. Defaults to 0.0.
763 @param a_s (float, optional): Strain hardening. Defaults to 0.03.
764 @param pinchx (float, optional): Pinching factor for strain (or deformation) during reloading. Defaults to 0.25.
765 @param pinchy (float, optional): Pinching factor for stress (or force) during reloading. Defaults to 0.75
766 @param dmg1 (float, optional): Damage due to ductility: D1(mu-1). Defaults to 0.0.
767 @param dmg2 (float, optional): Damage due to energy: D2(Eii/Eult). Defaults to 0.0.
768 @param beta (float, optional): Power used to determine the degraded unloading stiffness based on ductility, mu-beta. Defaults to 0.0.
769 @param safety_factor (bool, optional): Safety factor used if standard mechanical parameters are used (not test results). Defaults to False.
770 """
771 self.colcol = deepcopy(col)
772 self.beambeam = deepcopy(beam)
773 super().__init__(ID, col.d, col.bf, col.tf, col.Iy, beam.d, beam.tf, col.Fy_web, col.E, col.tw,
774 t_dp, a_s, pinchx, pinchy, dmg1, dmg2, beta, safety_factor)
775 self.beam_section_name_tagbeam_section_name_tagbeam_section_name_tag = beam.name_tag
776 self.col_section_name_tagcol_section_name_tagcol_section_name_tag = col.name_tag
777 self.UpdateStoredDataUpdateStoredData()
778
779
781 """
782 Class that stores funcions and material properties of a steel double symmetric I-shape profile
783 with Skiadopoulos 2021 as the material model for the panel zone and the OpenSeesPy command type used to model it is Hysteresis.
784 The material model is valid only if the column is continuous.
785 For more information about the empirical model for the computation of the parameters, see Skiadopoulos et Al. 2021.
786 The vectors that forms the matrix used to compute the material model parameters (Kf_Ke_tests, Cw1_tests, Cf1_tests,
787 Cw4_tests, Cf4_tests, Cw6_tests, Cf6_tests) are used as global throughout the class to optimise the program (given the fact that is constant everytime).
788
789 @param MaterialModels: Parent abstract class.
790 """
791 global Kf_Ke_tests, Cw1_tests, Cf1_tests, Cw4_tests, Cf4_tests, Cw6_tests, Cf6_tests
792
793 Kf_Ke_tests = [1.000, 0.153, 0.120, 0.090, 0.059, 0.031, 0.019, 0.009, 0.005, 0.004, 0.000]
794 Kf_Ke_tests.reverse()
795 Cw1_tests = [0.96, 0.96, 0.955, 0.94, 0.93, 0.90, 0.89, 0.89, 0.88, 0.88, 0.88]
796 Cw1_tests.reverse()
797 Cf1_tests = [0.035, 0.035, 0.033, 0.031, 0.018, 0.015, 0.013, 0.009, 0.009, 0.010, 0.010]
798 Cf1_tests.reverse()
799 Cw4_tests = [1.145, 1.145, 1.140, 1.133, 1.120, 1.115, 1.115, 1.11, 1.10, 1.10, 1.10]
800 Cw4_tests.reverse()
801 Cf4_tests = [0.145, 0.145, 0.123, 0.111, 0.069, 0.040, 0.040, 0.018, 0.010, 0.012, 0.012]
802 Cf4_tests.reverse()
803 Cw6_tests = [1.205, 1.2050, 1.2000, 1.1925, 1.1740, 1.1730, 1.1720, 1.1690, 1.1670, 1.1650, 1.1650]
804 Cw6_tests.reverse()
805 Cf6_tests = [0.165, 0.1650, 0.1400, 0.1275, 0.0800, 0.0500, 0.0500, 0.0180, 0.0140, 0.0120, 0.0120]
806 Cf6_tests.reverse()
807
808 def __init__(self, ID: int, d_c, bf_c, tf_c, I_c, d_b, tf_b, Fy, E, t_p,
809 t_dp = 0.0, a_s = 0.03, pinchx = 0.25, pinchy = 0.75, dmg1 = 0.0, dmg2 = 0.0, beta = 0.0, safety_factor = False, t_fbp = 0):
810 """
811 Constructor of the class.
812
813 @param ID (int): Unique material model ID.
814 @param d_c (float): Column depth.
815 @param bf_c (float): Column flange width.
816 @param tf_c (float): Column flange thickness.
817 @param I_c (float): Column moment of inertia (strong axis).
818 @param d_b (float): Beam depth.
819 @param tf_b (float): Beam flange thickness.
820 @param Fy (float): Yield strength (if assume continous column, Fy of the web).
821 @param E (float): Young modulus.
822 @param t_p (float): Panel zone thickness.
823 @param t_dp (float, optional): Doubler plate thickness. Defaults to 0.0.
824 @param a_s (float, optional): Strain hardening. Defaults to 0.03.
825 @param pinchx (float, optional): Pinching factor for strain (or deformation) during reloading. Defaults to 0.25
826 @param pinchy (float, optional): Pinching factor for stress (or force) during reloading. Defaults to 0.75
827 @param dmg1 (float, optional): Damage due to ductility: D1(mu-1). Defaults to 0.0.
828 @param dmg2 (float, optional): Damage due to energy: D2(Eii/Eult). Defaults to 0.0.
829 @param beta (float, optional): Power used to determine the degraded unloading stiffness based on ductility, mu-beta. Defaults to 0.0.
830 @param safety_factor (bool, optional): Safety factor used if standard mechanical parameters are used (not test results). Defaults to False.
831 @param t_fbp (float, optional): Thickness of the face bearing plate (if present). Defaults to 0.
832
833 @exception NegativeValue: ID needs to be a positive integer.
834 @exception NegativeValue: d_c needs to be positive.
835 @exception NegativeValue: bf_c needs to be positive.
836 @exception NegativeValue: tf_c needs to be positive.
837 @exception NegativeValue: d_b needs to be positive.
838 @exception NegativeValue: tf_b needs to be positive.
839 @exception NegativeValue: Fy needs to be positive.
840 @exception NegativeValue: E needs to be positive.
841 @exception NegativeValue: t_p needs to be positive.
842 @exception NegativeValue: a_s needs to be positive.
843 """
844 # Check
845 if ID < 1: raise NegativeValue()
846 if d_c < 0: raise NegativeValue()
847 if bf_c < 0: raise NegativeValue()
848 if tf_c < 0: raise NegativeValue()
849 if d_b < 0: raise NegativeValue()
850 if tf_b < 0: raise NegativeValue()
851 if Fy < 0: raise NegativeValue()
852 if E < 0: raise NegativeValue()
853 if t_p < 0: raise NegativeValue()
854 if a_s < 0: raise NegativeValue()
855 if t_fbp < 0: raise NegativeValue()
856
857 # Arguments
858 self.IDID = ID
859 self.d_cd_c = d_c
860 self.bf_cbf_c = bf_c
861 self.tf_ctf_c = tf_c
862 self.I_cI_c = I_c
863 self.d_bd_b = d_b
864 self.tf_btf_b = tf_b
865 self.FyFy = Fy
866 self.EE = E
867 self.t_pt_p = t_p
868 self.t_dpt_dp = t_dp
869 self.a_sa_s = a_s
870 self.pinchxpinchx = pinchx
871 self.pinchypinchy = pinchy
872 self.dmg1dmg1 = dmg1
873 self.dmg2dmg2 = dmg2
874 self.betabeta = beta
875 if safety_factor:
876 self.RyRy = 1.2
877 else:
878 self.RyRy = 1.0
879 self.t_fbpt_fbp = t_fbp
880
881 # Initialized the parameters that are dependent from others
882 self.beam_section_name_tagbeam_section_name_tag = "None"
883 self.col_section_name_tagcol_section_name_tag = "None"
884 self.InitializedInitialized = False
885 self.ReInitReInit()
886
887
888 # Methods
889 def ReInit(self):
890 """
891 Implementation of the homonym abstract method.
892 See parent class DataManagement for detailed information.
893 """
894 # Check applicability
895 self.CheckApplicabilityCheckApplicabilityCheckApplicability()
896
897 # Memebers
898 if self.beam_section_name_tagbeam_section_name_tag != "None": self.beam_section_name_tagbeam_section_name_tag = self.beam_section_name_tagbeam_section_name_tag + " (modified)"
899 if self.col_section_name_tagcol_section_name_tag != "None": self.col_section_name_tagcol_section_name_tag = self.col_section_name_tagcol_section_name_tag + " (modified)"
900 self.t_pzt_pz = self.t_pt_p + self.t_dpt_dp
901 self.GG = self.EE/(2.0 * (1.0 + 0.30)) # Shear Modulus
902
903 # Refined computation of the parameters for the backbone curve for the panel zone spring (Skiadopoulos et al. (2021))
904 # Panel Zone Elastic Stiffness
905 self.KsKs = self.t_pzt_pz*(self.d_cd_c-self.tf_ctf_c)*self.GG
906 self.KbKb = 12.0*self.EE*(self.I_cI_c+self.t_dpt_dp*(self.d_cd_c-2.0*self.tf_ctf_c)**3/12.0)/(self.d_bd_b-0)**2
907 self.KeKe = self.KsKs*self.KbKb/(self.KsKs+self.KbKb)
908
909 # Column Flange Stiffness
910 self.KsfKsf = 2.0*((self.tf_ctf_c+self.t_fbpt_fbp)*self.bf_cbf_c*self.GG)
911 self.KbfKbf = 2.0*(12.0*self.EE*self.bf_cbf_c*(self.tf_ctf_c**3+self.t_fbpt_fbp**3)/12.0/(self.d_bd_b-0)**2)
912 self.KfKf = self.KsfKsf*self.KbfKbf/(self.KsfKsf+self.KbfKbf)
913
914 # Kf/Ke Calculation for Panel Zone Categorization
915 self.Kf_KeKf_Ke = self.KfKf/self.KeKe
916
917 # Panel Zone Strength Coefficients (results from tests for a_w_eff and a_f_eff)
918 self.Cw1Cw1 = np.interp(self.Kf_KeKf_Ke, Kf_Ke_tests, Cw1_tests)
919 self.Cf1Cf1 = np.interp(self.Kf_KeKf_Ke, Kf_Ke_tests, Cf1_tests)
920 self.Cw4Cw4 = np.interp(self.Kf_KeKf_Ke, Kf_Ke_tests, Cw4_tests)
921 self.Cf4Cf4 = np.interp(self.Kf_KeKf_Ke, Kf_Ke_tests, Cf4_tests)
922 self.Cw6Cw6 = np.interp(self.Kf_KeKf_Ke, Kf_Ke_tests, Cw6_tests)
923 self.Cf6Cf6 = np.interp(self.Kf_KeKf_Ke, Kf_Ke_tests, Cf6_tests)
924
925 # Panel Zone Model
926 self.V1V1 = self.FyFy*self.RyRy/math.sqrt(3)*(self.Cw1Cw1*(self.d_cd_c-self.tf_ctf_c)*self.t_pzt_pz + self.Cf1Cf1*2*(self.bf_cbf_c-self.t_pt_p)*self.tf_ctf_c)
927 self.V4V4 = self.FyFy*self.RyRy/math.sqrt(3)*(self.Cw4Cw4*(self.d_cd_c-self.tf_ctf_c)*self.t_pzt_pz + self.Cf4Cf4*2*(self.bf_cbf_c-self.t_pt_p)*self.tf_ctf_c)
928 self.V6V6 = self.FyFy*self.RyRy/math.sqrt(3)*(self.Cw6Cw6*(self.d_cd_c-self.tf_ctf_c)*self.t_pzt_pz + self.Cf6Cf6*2*(self.bf_cbf_c-self.t_pt_p)*self.tf_ctf_c)
929
930 self.M1M1 = self.V1V1*(self.d_bd_b-self.tf_btf_b)
931 self.M4M4 = self.V4V4*(self.d_bd_b-self.tf_btf_b)
932 self.M6M6 = self.V6V6*(self.d_bd_b-self.tf_btf_b)
933
934 self.Gamma_1Gamma_1 = self.V1V1/self.KeKe
935 self.Gamma_4Gamma_4 = 4*self.Gamma_1Gamma_1
936 self.Gamma_6Gamma_6 = 6*self.Gamma_1Gamma_1
937
938 # Data storage for loading/saving
939 self.UpdateStoredDataUpdateStoredData()
940
941
943 """
944 Implementation of the homonym abstract method.
945 See parent class DataManagement for detailed information.
946 """
947 self.datadata = [["INFO_TYPE", "Skiadopoulos2021"], # Tag for differentiating different data
948 ["ID", self.IDID],
949 ["beam_section_name_tag", self.beam_section_name_tagbeam_section_name_tag],
950 ["col_section_name_tag", self.col_section_name_tagcol_section_name_tag],
951 ["d_c", self.d_cd_c],
952 ["bf_c", self.bf_cbf_c],
953 ["tf_c", self.tf_ctf_c],
954 ["I_c", self.I_cI_c],
955 ["d_b", self.d_bd_b],
956 ["tf_b", self.tf_btf_b],
957 ["Fy", self.FyFy],
958 ["E", self.EE],
959 ["G", self.GG],
960 ["t_p", self.t_pt_p],
961 ["t_dp", self.t_dpt_dp],
962 ["t_pz", self.t_pzt_pz],
963 ["a_s", self.a_sa_s],
964 ["pinchx", self.pinchxpinchx],
965 ["pinchy", self.pinchypinchy],
966 ["dmg1", self.dmg1dmg1],
967 ["dmg2", self.dmg2dmg2],
968 ["beta", self.betabeta],
969 ["Ry", self.RyRy],
970 ["Ks", self.KsKs],
971 ["Kb", self.KbKb],
972 ["Ke", self.KeKe],
973 ["Ksf", self.KsfKsf],
974 ["Kbf", self.KbfKbf],
975 ["Kf", self.KfKf],
976 ["Kf_Ke", self.Kf_KeKf_Ke],
977 ["V1", self.V1V1],
978 ["V4", self.V4V4],
979 ["V6", self.V6V6],
980 ["M1", self.M1M1],
981 ["M4", self.M4M4],
982 ["M6", self.M6M6],
983 ["Gamma_1", self.Gamma_1Gamma_1],
984 ["Gamma_4", self.Gamma_4Gamma_4],
985 ["Gamma_6", self.Gamma_6Gamma_6],
986 ["Initialized", self.InitializedInitialized]]
987
988
989 def ShowInfo(self, plot = False, block = False):
990 """
991 Implementation of the homonym abstract method.
992 See parent class DataManagement for detailed information.
993
994 @param plot (bool, optional): Option to show the plot of the material model. Defaults to False.
995 @param block (bool, optional): Option to wait the user command 'plt.show()' (avoiding the stop of the program everytime that a plot should pop up). Defaults to False.
996 """
997 print("")
998 print("Requested info for Skiadopoulos 2021 material model Parameters, ID = {}".format(self.IDID))
999 print("Sections associated, column: {} ".format(self.col_section_name_tagcol_section_name_tag))
1000 print("Sections associated, beam: {} ".format(self.beam_section_name_tagbeam_section_name_tag))
1001 print("Gamma_1 = {} rad".format(self.Gamma_1Gamma_1))
1002 print("Gamma_4 = {} rad".format(self.Gamma_4Gamma_4))
1003 print("Gamma_6 = {} rad".format(self.Gamma_6Gamma_6))
1004 print("M1 = {} kNm".format(self.M1M1/kNm_unit))
1005 print("M4 = {} kNm".format(self.M4M4/kNm_unit))
1006 print("M6 = {} kNm".format(self.M6M6/kNm_unit))
1007 print("")
1008
1009 if plot:
1010 # Data for plotting
1011 x_axis = np.array([0.0, self.Gamma_1Gamma_1, self.Gamma_4Gamma_4, self.Gamma_6Gamma_6])
1012 y_axis = np.array([0.0, self.M1M1, self.M4M4, self.M6M6])/kNm_unit
1013
1014 fig, ax = plt.subplots()
1015 ax.plot(x_axis, y_axis, 'k-')
1016
1017 ax.set(xlabel='Rotation [rad]', ylabel='Moment [kNm]',
1018 title='Skiadopoulos 2021 material model (ID={})'.format(self.IDID))
1019 ax.grid()
1020
1021 if block:
1022 plt.show()
1023
1024
1026 """
1027 Implementation of the homonym abstract method.
1028 See parent class DataManagement for detailed information.
1029 """
1030 Check = True
1031 # No checks
1032 if not Check:
1033 print("The validity of the equations is not fullfilled.")
1034 print("!!!!!!! WARNING !!!!!!! Check material model of Skiadopoulos 2021, ID=", self.IDID)
1035 print("")
1036
1037
1038 def Hysteretic(self):
1039 """
1040 Generate the material model Hysteretic (Skiadopoulos 2021) using the computed parameters.
1041 See _Hysteretic function for more information.
1042 """
1043 _Hysteretic(self.IDID, self.M1M1, self.Gamma_1Gamma_1, self.M4M4, self.Gamma_4Gamma_4, self.M6M6, self.Gamma_6Gamma_6,
1044 self.pinchxpinchx, self.pinchypinchy, self.dmg1dmg1, self.dmg2dmg2, self.betabeta)
1045 self.InitializedInitialized = True
1046 self.UpdateStoredDataUpdateStoredData()
1047
1048
1050 """
1051 Class that is the children of Skiadopoulos2021 and combine the class SteelIShape (section) to retrieve the information needed.
1052
1053 @param Skiadopoulos2021: Parent class.
1054 """
1055 def __init__(self, ID: int, col: SteelIShape, beam: SteelIShape,
1056 t_dp=0, a_s=0.03, pinchx=0.25, pinchy=0.75, dmg1=0, dmg2=0, beta=0, safety_factor=False, t_fbp = 0):
1057 """
1058 Constructor of the class. It passes the arguments into the parent class to generate the combination of the parent class
1059 and the section class SteelIShape.
1060 The copy of the sections (col and beam) passed are stored in the member variable self.colcol and self.beambeam.
1061
1062 @param ID (int): Unique material model ID.
1063 @param col (SteelIShape): SteelIShape column section object.
1064 @param beam (SteelIShape): SteelIShape beam section object.
1065 @param t_dp (float, optional): Doubler plate thickness. Defaults to 0.0.
1066 @param a_s (float, optional): Strain hardening. Defaults to 0.03.
1067 @param pinchx (float, optional): Pinching factor for strain (or deformation) during reloading. Defaults to 0.25.
1068 @param pinchy (float, optional): Pinching factor for stress (or force) during reloading. Defaults to 0.75.
1069 @param dmg1 (float, optional): Damage due to ductility: D1(mu-1). Defaults to 0.0.
1070 @param dmg2 (float, optional): Damage due to energy: D2(Eii/Eult). Defaults to 0.0.
1071 @param beta (float, optional): Power used to determine the degraded unloading stiffness based on ductility, mu-beta. Defaults to 0.0.
1072 @param safety_factor (bool, optional): Safety factor used if standard mechanical parameters are used (not test results). Defaults to False.
1073 @param t_fbp (float, optional): Thickness of the face bearing plate (if present). Defaults to 0.
1074 """
1075 self.colcol = deepcopy(col)
1076 self.beambeam = deepcopy(beam)
1077 super().__init__(ID, col.d, col.bf, col.tf, col.Iy, beam.d, beam.tf, col.Fy_web, col.E, col.tw,
1078 t_dp=t_dp, a_s=a_s, pinchx=pinchx, pinchy=pinchy, dmg1=dmg1, dmg2=dmg2, beta=beta, safety_factor=safety_factor, t_fbp=t_fbp)
1079 self.beam_section_name_tagbeam_section_name_tagbeam_section_name_tag = beam.name_tag
1080 self.col_section_name_tagcol_section_name_tagcol_section_name_tag = col.name_tag
1081 self.UpdateStoredDataUpdateStoredData()
1082
1083
1085 """
1086 WIP: Class that is the children of Skiadopoulos2021 and it's used for the panel zone spring in a RCS (RC column continous, Steel beam).
1087
1088 @param Skiadopoulos2021: Parent class.
1089 """
1090 def __init__(self, ID: int, beam: SteelIShape, d_col, t_fbp = 0,
1091 t_dp=0, a_s=0.03, pinchx=0.25, pinchy=0.75, dmg1=0, dmg2=0, beta=0, safety_factor=False):
1092 """
1093 Constructor of the class. It passes the arguments into the parent class to generate the combination of the parent class
1094 and the section class SteelIShape.
1095 The copy of the section (beam) passed is stored in the member variable self.beambeam.
1096
1097 @param ID (int): Unique material model ID.
1098 @param beam (SteelIShape): SteelIShape beam section object.
1099 @param d_col (float): Depth of the RC column (continous)
1100 @param t_fbp (float, optional): Thickness of the face bearing plate (if present). Defaults to 0.
1101 @param t_dp (float, optional): Doubler plate thickness. Defaults to 0.0.
1102 @param a_s (float, optional): Strain hardening. Defaults to 0.03.
1103 @param pinchx (float, optional): Pinching factor for strain (or deformation) during reloading. Defaults to 0.25
1104 @param pinchy (float, optional): Pinching factor for stress (or force) during reloading. Defaults to 0.75
1105 @param dmg1 (float, optional): Damage due to ductility: D1(mu-1). Defaults to 0.0.
1106 @param dmg2 (float, optional): Damage due to energy: D2(Eii/Eult). Defaults to 0.0.
1107 @param beta (float, optional): Power used to determine the degraded unloading stiffness based on ductility, mu-beta. Defaults to 0.0.
1108 @param safety_factor (bool, optional): Safety factor used if standard mechanical parameters are used (not test results). Defaults to False.
1109 """
1110 self.beambeam = deepcopy(beam)
1111 super().__init__(ID, beam.d, beam.bf, beam.tf, beam.Iy, d_col, 0, beam.Fy_web, beam.E, beam.tw,
1112 t_dp=t_dp, a_s=a_s, pinchx=pinchx, pinchy=pinchy, dmg1=dmg1, dmg2=dmg2, beta=beta, safety_factor=safety_factor, t_fbp=t_fbp)
1113 self.beam_section_name_tagbeam_section_name_tagbeam_section_name_tag = beam.name_tag
1114 self.UpdateStoredDataUpdateStoredData()
1115
1116
1118 """
1119 Class that stores funcions and material properties of a RC rectangular or circular section
1120 with Mander 1988 as the material model for the unconfined reinforced concrete and the OpenSeesPy command type used to model it is Concrete04 or Concrete01.
1121 For more information about the empirical model for the computation of the parameters, see Mander et Al. 1988, Karthik and Mander 2011 and SIA 262:2012.
1122
1123 @param MaterialModels: Parent abstract class.
1124 """
1125 def __init__(self, ID: int, fc, Ec, ec = 1, ecp = 1, fct = -1, et = -1, beta = 0.1):
1126 """
1127 Constructor of the class.
1128
1129 @param ID (int): Unique material model ID.
1130 @param fc (float): Compressive concrete yield strength (needs to be negative).
1131 @param Ec (float): Young modulus.
1132 @param ec (float, optional): Compressive concrete yield strain. Defaults to 1, e.g. computed according to Karthik and Mander 2011.
1133 @param ecp (float, optional): Concrete spalling strain. Defaults to 1, e.g. computed according to Mander 1988.
1134 @param fct (float, optional): Tensile concrete yield strain. Defaults to -1, e.g. computed according to SIA 262:2012.
1135 @param et (float, optional): Tensile concrete yield strain. Defaults to -1, e.g. computed according to SIA 262:2012.
1136 @param beta (float, optional): Loating point value defining the exponential curve parameter to define the residual stress.
1137 Defaults to 0.1 (according to OpenSeesPy documentation)
1138
1139 @exception NegativeValue: ID needs to be a positive integer.
1140 @exception PositiveValue: fc needs to be negative.
1141 @exception NegativeValue: Ec needs to be positive.
1142 @exception PositiveValue: ec needs to be negative if different from 1.
1143 @exception PositiveValue: ecp needs to be positive if different from 1.
1144 @exception NegativeValue: fct needs to be positive if different from -1.
1145 @exception NegativeValue: et needs to be positive if different from -1.
1146 """
1147 # Check
1148 if ID < 0: raise NegativeValue()
1149 if fc > 0: raise PositiveValue()
1150 if Ec < 0: raise NegativeValue()
1151 if ec != 1 and ec > 0: raise PositiveValue()
1152 if ecp != 1 and ecp > 0: raise PositiveValue()
1153 if fct != -1 and fct < 0: raise NegativeValue()
1154 if et != -1 and et < 0: raise NegativeValue()
1155
1156 # Arguments
1157 self.IDID = ID
1158 self.fcfc = fc
1159 self.EcEc = Ec
1160 self.betabeta = beta
1161
1162 # Initialized the parameters that are dependent from others
1163 self.section_name_tagsection_name_tag = "None"
1164 self.InitializedInitialized = False
1165 self.ReInitReInit(ec, ecp, fct, et)
1166
1167 # Methods
1168 def ReInit(self, ec = 1, ecp = 1, fct = -1, et = -1):
1169 """
1170 Implementation of the homonym abstract method.
1171 See parent class DataManagement for detailed information.
1172
1173 @param ec (float, optional): Compressive concrete yield strain. Defaults to 1, e.g. computed according to Karthik and Mander 2011.
1174 @param ecp (float, optional): Concrete spalling strain. Defaults to 1, e.g. computed according to Mander 1988.
1175 @param fct (float, optional): Tensile concrete yield strain. Defaults to -1, e.g. computed according to SIA 262:2012.
1176 @param et (float, optional): Tensile concrete yield strain. Defaults to -1, e.g. computed according to SIA 262:2012.
1177 """
1178 # Check applicability
1179 self.CheckApplicabilityCheckApplicabilityCheckApplicability()
1180
1181 # Arguments
1182 self.ecec = self.Compute_ecCompute_ec() if ec == 1 else ec
1183 self.ecpecp = self.Compute_ecpCompute_ecp() if ecp == 1 else ecp
1184 self.fctfct = self.Compute_fctCompute_fct() if fct == -1 else fct
1185 self.etet = self.Compute_etCompute_et() if et == -1 else et
1186
1187 # Members
1188 self.ecuecu = self.Compute_ecuCompute_ecu()
1189 if self.section_name_tagsection_name_tag != "None": self.section_name_tagsection_name_tag = self.section_name_tagsection_name_tag + " (modified)"
1190
1191 # Data storage for loading/saving
1192 self.UpdateStoredDataUpdateStoredData()
1193
1194
1196 """
1197 Implementation of the homonym abstract method.
1198 See parent class DataManagement for detailed information.
1199 """
1200 self.datadata = [["INFO_TYPE", "UnconfMander1988"], # Tag for differentiating different data
1201 ["ID", self.IDID],
1202 ["section_name_tag", self.section_name_tagsection_name_tag],
1203 ["fc", self.fcfc],
1204 ["Ec", self.EcEc],
1205 ["ec", self.ecec],
1206 ["ecp", self.ecpecp],
1207 ["ecu", self.ecuecu],
1208 ["fct", self.fctfct],
1209 ["et", self.etet],
1210 ["beta", self.betabeta],
1211 ["Initialized", self.InitializedInitialized]]
1212
1213
1214 def ShowInfo(self, plot = False, block = False, concrete04 = True):
1215 """
1216 Implementation of the homonym abstract method.
1217 See parent class DataManagement for detailed information.
1218
1219 @param plot (bool, optional): Option to show the plot of the material model. Defaults to False.
1220 @param block (bool, optional): Option to wait the user command 'plt.show()' (avoiding the stop of the program everytime that a plot should pop up). Defaults to False.
1221 @param concrete04 (bool, optional): Option to show in the plot the concrete04 or concrete01 if False. Defaults to True.
1222 """
1223 print("")
1224 print("Requested info for Unconfined Mander 1988 material model Parameters, ID = {}".format(self.IDID))
1225 print("Section associated: {} ".format(self.section_name_tagsection_name_tag))
1226 print('Concrete strength fc = {} MPa'.format(self.fcfc/MPa_unit))
1227 print('Strain at maximal strength ec = {}'.format(self.ecec))
1228 print('Maximal strain ecu = {}'.format(self.ecuecu))
1229 print("")
1230
1231 if plot:
1232 fig, ax = plt.subplots()
1233 if concrete04:
1234 PlotConcrete04(self.fcfc, self.EcEc, self.ecec, self.ecuecu, "U", ax, self.IDID)
1235 else:
1236 PlotConcrete01(self.fcfc, self.ecec, 0, self.ecuecu, ax, self.IDID)
1237
1238 if block:
1239 plt.show()
1240
1241
1243 """
1244 Implementation of the homonym abstract method.
1245 See parent class MaterialModels for detailed information.
1246 """
1247 Check = True
1248 if self.fcfc < -110*MPa_unit: # Deierlein 1999
1249 Check = False
1250 print("With High Strength concrete (< -110 MPa), a better material model should be used (see Abdesselam et Al. 2019")
1251 if not Check:
1252 print("The validity of the equations is not fullfilled.")
1253 print("!!!!!!! WARNING !!!!!!! Check material model of Unconfined Mander 1988, ID=", self.IDID)
1254 print("")
1255
1256
1257 def Compute_ec(self):
1258 """
1259 Method that computes the compressive concrete yield strain.
1260 For more information, see Karthik and Mander 2011.
1261
1262 @returns float: Strain
1263 """
1264 # return -0.002 # Alternative: Mander et Al. 1988
1265 return -0.0015 + self.fcfc/MPa_unit/70000 # Karthik Mander 2011
1266
1267 def Compute_ecp(self):
1268 """
1269 Method that computes the compressive concrete spalling strain.
1270 For more information, see Mander et Al. 1988.
1271
1272 @returns float: Strain
1273 """
1274 return 2.0*self.ecec
1275
1276
1277 def Compute_fct(self):
1278 """
1279 Method that computes the tensile concrete yield stress.
1280 For more information, see SIA 262:2012.
1281
1282 @returns float: Stress.
1283 """
1284 return 0.30 * math.pow(-self.fcfc/MPa_unit, 2/3) * MPa_unit
1285
1286
1287 def Compute_et(self):
1288 """
1289 Method that computes the tensile concrete yield strain.
1290 For more information, see Mander et Al. 1988 (eq 45).
1291
1292 @returns float: Strain.
1293 """
1294 return self.fctfct/self.EcEc
1295
1296
1297 def Compute_ecu(self):
1298 """
1299 Method that computes the compressive concrete failure strain.
1300 For more information, see Karthik and Mander 2011.
1301
1302 @returns float: Strain
1303 """
1304 # return -0.004 # Alternative: Mander et Al. 1988
1305 return -0.012 - 0.0001 * self.fcfc/MPa_unit # Karthik Mander 2011
1306
1307 def Concrete01(self):
1308 """
1309 Generate the material model Concrete01 for unconfined concrete using the computed parameters.
1310 See _Concrete01 function for more information. Use this method or Concrete04, not both (only one material model for ID).
1311 """
1312 _Concrete01(self.IDID, self.ecec, self.fcfc, self.ecuecu)
1313 self.InitializedInitialized = True
1314 self.UpdateStoredDataUpdateStoredData()
1315
1316
1317 def Concrete04(self):
1318 """
1319 Generate the material model Concrete04 for unconfined concrete (Mander 1988) using the computed parameters.
1320 See _Concrete04 function for more information. Use this method or Concrete01, not both (only one material model for ID).
1321 """
1322 _Concrete04(self.IDID, self.fcfc, self.ecec, self.ecuecu, self.EcEc, self.fctfct, self.etet, self.betabeta)
1323 self.InitializedInitialized = True
1324 self.UpdateStoredDataUpdateStoredData()
1325
1326
1328 """
1329 Class that is the children of UnconfMander1988 and combine the class RCRectShape (section) to retrieve the information needed.
1330
1331 @param UnconfMander1988: Parent class.
1332 """
1333 def __init__(self, ID: int, section: RCRectShape, ec=1, ecp=1, fct=-1, et=-1, beta=0.1):
1334 """
1335 Constructor of the class. It passes the arguments into the parent class to generate the combination of the parent class
1336 and the section class RCRectShape.
1337 The copy of the section passed is stored in the member variable self.sectionsection.
1338
1339 @param ID (int): Unique material model ID.
1340 @param section (RCRectShape): RCRectShape section object.
1341 @param ec (float, optional): Compressive concrete yield strain. Defaults to 1, e.g. computed according to Karthik and Mander 2011.
1342 @param ecp (float, optional): Concrete spalling strain. Defaults to 1, e.g. computed according to Mander 1988.
1343 @param fct (float, optional): Tensile concrete yield strain. Defaults to -1, e.g. computed according to SIA 262:2012.
1344 @param et (float, optional): Tensile concrete yield strain. Defaults to -1, e.g. computed according to SIA 262:2012.
1345 @param beta (float, optional): Loating point value defining the exponential curve parameter to define the residual stress.
1346 Defaults to 0.1 (according to OpenSeesPy documentation)
1347 """
1348 self.sectionsection = deepcopy(section)
1349 super().__init__(ID, section.fc, section.Ec, ec=ec, ecp=ecp, fct=fct, et=et, beta=beta)
1350 self.section_name_tagsection_name_tagsection_name_tag = section.name_tag
1351 self.UpdateStoredDataUpdateStoredData()
1352
1353
1355 """
1356 Class that is the children of UnconfMander1988 and combine the class RCCircShape (section) to retrieve the information needed.
1357
1358 @param UnconfMander1988: Parent class.
1359 """
1360 def __init__(self, ID: int, section: RCCircShape, ec=1, ecp=1, fct=-1, et=-1, beta=0.1):
1361 """
1362 Constructor of the class. It passes the arguments into the parent class to generate the combination of the parent class
1363 and the section class RCCircShape.
1364 The copy of the section passed is stored in the member variable self.sectionsection.
1365
1366 @param ID (int): Unique material model ID.
1367 @param section (RCCircShape): RCCircShape section object.
1368 @param ec (float, optional): Compressive concrete yield strain. Defaults to 1, e.g. computed according to Karthik and Mander 2011.
1369 @param ecp (float, optional): Concrete spalling strain. Defaults to 1, e.g. computed according to Mander 1988.
1370 @param fct (float, optional): Tensile concrete yield strain. Defaults to -1, e.g. computed according to SIA 262:2012.
1371 @param et (float, optional): Tensile concrete yield strain. Defaults to -1, e.g. computed according to SIA 262:2012.
1372 @param beta (float, optional): Loating point value defining the exponential curve parameter to define the residual stress.
1373 Defaults to 0.1 (according to OpenSeesPy documentation)
1374 """
1375 self.sectionsection = deepcopy(section)
1376 super().__init__(ID, section.fc, section.Ec, ec=ec, ecp=ecp, fct=fct, et=et, beta=beta)
1377 self.section_name_tagsection_name_tagsection_name_tag = section.name_tag
1378 self.UpdateStoredDataUpdateStoredData()
1379
1380
1382 """
1383 Class that stores funcions and material properties of a RC rectangular section
1384 with Mander 1988 as the material model for the confined reinforced concrete and the OpenSeesPy command type used to model it is Concrete04 or Concrete01.
1385 For more information about the empirical model for the computation of the parameters, see Mander et Al. 1988, Karthik and Mander 2011 and SIA 262:2012.
1386 The array array_fl2 and curve curve_fl1 are the parameter of the digitized table used to extrapolate the confinement factor;
1387 they are used as global throughout the ConfMander1988Rect material model to optimise the program (given the fact that is constant everytime).
1388
1389 @param MaterialModels: Parent abstract class.
1390 """
1391 global array_fl2, curve_fl1
1392
1393 curve_fl1 = np.arange(0, 0.3+0.02, 0.02)
1394 array_fl2 = [None] * len(curve_fl1)
1395
1396 array_fl2[0] = [[1.0, 0],
1397 [1.0026455026455026, 6.5359477124183E-4],
1398 [1.0423280423280423, 0.01699346405228758],
1399 [1.0846560846560847, 0.037254901960784306],
1400 [1.119047619047619, 0.05686274509803921],
1401 [1.1455026455026456, 0.0784313725490196],
1402 [1.1666666666666667, 0.09607843137254903],
1403 [1.193121693121693, 0.11830065359477124],
1404 [1.208994708994709, 0.1392156862745098],
1405 [1.2248677248677249, 0.15751633986928104],
1406 [1.2380952380952381, 0.17712418300653593],
1407 [1.2513227513227514, 0.19673202614379084],
1408 [1.2645502645502646, 0.21699346405228756],
1409 [1.2724867724867726, 0.23660130718954248],
1410 [1.2804232804232805, 0.2594771241830065],
1411 [1.2883597883597884, 0.2777777777777778],
1412 [1.2936507936507937, 0.3]]
1413
1414 array_fl2[1] = [[1.1349206349206349, 0.01895424836601307],
1415 [1.1825396825396826, 0.03790849673202614],
1416 [1.2222222222222223, 0.05686274509803921],
1417 [1.2513227513227514, 0.07777777777777777],
1418 [1.2724867724867726, 0.09738562091503267],
1419 [1.291005291005291, 0.11895424836601308],
1420 [1.3174603174603174, 0.13856209150326795],
1421 [1.335978835978836, 0.1588235294117647],
1422 [1.3518518518518519, 0.17777777777777776],
1423 [1.3677248677248677, 0.19738562091503267],
1424 [1.3783068783068784, 0.2176470588235294],
1425 [1.3941798941798942, 0.238562091503268],
1426 [1.41005291005291, 0.2594771241830065],
1427 [1.4126984126984126, 0.28104575163398693],
1428 [1.4232804232804233, 0.3]]
1429
1430 array_fl2[2] = [[1.246031746031746, 0.037254901960784306],
1431 [1.298941798941799, 0.05751633986928104],
1432 [1.335978835978836, 0.07712418300653595],
1433 [1.3650793650793651, 0.09869281045751634],
1434 [1.3888888888888888, 0.11699346405228757],
1435 [1.4153439153439153, 0.1392156862745098],
1436 [1.439153439153439, 0.1568627450980392],
1437 [1.4603174603174602, 0.17712418300653593],
1438 [1.4735449735449735, 0.1980392156862745],
1439 [1.4894179894179893, 0.21633986928104573],
1440 [1.5052910052910053, 0.23790849673202616],
1441 [1.5211640211640212, 0.2581699346405229],
1442 [1.5317460317460316, 0.2777777777777778],
1443 [1.5423280423280423, 0.3]]
1444
1445 array_fl2[3] = [[1.3544973544973544, 0.05686274509803921],
1446 [1.3994708994708995, 0.07777777777777777],
1447 [1.4417989417989419, 0.09738562091503267],
1448 [1.4735449735449735, 0.11699346405228757],
1449 [1.4947089947089947, 0.13790849673202613],
1450 [1.5238095238095237, 0.15751633986928104],
1451 [1.5423280423280423, 0.17777777777777776],
1452 [1.560846560846561, 0.1980392156862745],
1453 [1.5820105820105819, 0.21633986928104573],
1454 [1.5952380952380953, 0.2372549019607843],
1455 [1.6137566137566137, 0.2588235294117647],
1456 [1.626984126984127, 0.27908496732026145],
1457 [1.6375661375661377, 0.3]]
1458
1459 array_fl2[4] = [[1.455026455026455, 0.07647058823529412],
1460 [1.5, 0.09738562091503267],
1461 [1.5423280423280423, 0.1196078431372549],
1462 [1.574074074074074, 0.13856209150326795],
1463 [1.6058201058201058, 0.1588235294117647],
1464 [1.6296296296296298, 0.17777777777777776],
1465 [1.6534391534391535, 0.1980392156862745],
1466 [1.671957671957672, 0.21699346405228756],
1467 [1.6904761904761905, 0.238562091503268],
1468 [1.7063492063492065, 0.2588235294117647],
1469 [1.716931216931217, 0.27908496732026145],
1470 [1.7248677248677249, 0.3]]
1471
1472 array_fl2[5] = [[1.5634920634920635, 0.09869281045751634],
1473 [1.6058201058201058, 0.11895424836601308],
1474 [1.6428571428571428, 0.13790849673202613],
1475 [1.6746031746031746, 0.1588235294117647],
1476 [1.701058201058201, 0.17908496732026144],
1477 [1.7222222222222223, 0.19673202614379084],
1478 [1.7433862433862433, 0.2176470588235294],
1479 [1.7698412698412698, 0.2392156862745098],
1480 [1.783068783068783, 0.2581699346405229],
1481 [1.798941798941799, 0.27908496732026145],
1482 [1.8095238095238095, 0.3]]
1483
1484 array_fl2[6] = [[1.6507936507936507, 0.11633986928104575],
1485 [1.693121693121693, 0.13856209150326795],
1486 [1.7328042328042328, 0.15751633986928104],
1487 [1.7645502645502646, 0.17843137254901958],
1488 [1.7910052910052912, 0.1980392156862745],
1489 [1.8148148148148149, 0.2176470588235294],
1490 [1.8333333333333335, 0.23790849673202616],
1491 [1.8571428571428572, 0.2581699346405229],
1492 [1.8677248677248677, 0.2797385620915033],
1493 [1.8915343915343916, 0.3]]
1494
1495 array_fl2[7] = [[1.753968253968254, 0.14052287581699346],
1496 [1.7883597883597884, 0.15816993464052287],
1497 [1.8174603174603174, 0.17843137254901958],
1498 [1.8412698412698414, 0.19738562091503267],
1499 [1.8677248677248677, 0.21699346405228756],
1500 [1.8835978835978837, 0.2372549019607843],
1501 [1.9047619047619047, 0.257516339869281],
1502 [1.925925925925926, 0.27908496732026145],
1503 [1.9417989417989419, 0.3]]
1504
1505 array_fl2[8] = [[1.8386243386243386, 0.16013071895424835],
1506 [1.8703703703703702, 0.17908496732026144],
1507 [1.8994708994708995, 0.1980392156862745],
1508 [1.925925925925926, 0.2176470588235294],
1509 [1.9497354497354498, 0.23790849673202616],
1510 [1.9761904761904763, 0.2588235294117647],
1511 [1.992063492063492, 0.27908496732026145],
1512 [2.0132275132275135, 0.3]]
1513
1514 array_fl2[9] = [[1.9179894179894181, 0.1823529411764706],
1515 [1.939153439153439, 0.19869281045751636],
1516 [1.9682539682539684, 0.21895424836601307],
1517 [1.992063492063492, 0.238562091503268],
1518 [2.0132275132275135, 0.2568627450980392],
1519 [2.0396825396825395, 0.27908496732026145],
1520 [2.060846560846561, 0.3]]
1521
1522 array_fl2[10] = [[1.9761904761904763, 0.19673202614379084],
1523 [2.007936507936508, 0.21633986928104573],
1524 [2.0343915343915344, 0.2372549019607843],
1525 [2.066137566137566, 0.257516339869281],
1526 [2.08994708994709, 0.2784313725490196],
1527 [2.111111111111111, 0.3]]
1528
1529 array_fl2[11] = [[2.044973544973545, 0.21633986928104573],
1530 [2.0767195767195767, 0.238562091503268],
1531 [2.1084656084656084, 0.2581699346405229],
1532 [2.134920634920635, 0.28039215686274505],
1533 [2.158730158730159, 0.3]]
1534
1535 array_fl2[12] = [[2.113756613756614, 0.2372549019607843],
1536 [2.1455026455026456, 0.257516339869281],
1537 [2.1719576719576716, 0.2797385620915033],
1538 [2.193121693121693, 0.3]]
1539
1540 array_fl2[13] = [[2.177248677248677, 0.2581699346405229],
1541 [2.2063492063492065, 0.27908496732026145],
1542 [2.2275132275132274, 0.3]]
1543
1544 array_fl2[14] = [[2.2407407407407405, 0.2784313725490196],
1545 [2.261904761904762, 0.3]]
1546
1547 array_fl2[15] = [[2.2962962962962963, 0.3]]
1548
1549 def __init__(self, ID: int, bc, dc, Ac, fc, Ec, nr_bars, D_bars, wx_top: np.ndarray, wx_bottom: np.ndarray, wy: np.ndarray, s, D_hoops, rho_s_x, rho_s_y, fs,
1550 ec = 1, ecp = 1, fct = -1, et = -1, esu = -1, beta = 0.1):
1551 """
1552 Constructor of the class.
1553
1554 @param ID (int): Unique material model ID.
1555 @param bc (float): Width of the confined core (from the centerline of the hoops, according to Mander et Al. 1988).
1556 @param dc (float): Depth of the confined core (from the centerline of the hoops, according to Mander et Al. 1988).
1557 @param Ac (float): Area of the confined core (according to Mander et Al. 1988).
1558 @param fc (float): Compressive concrete yield strength (needs to be negative).
1559 @param Ec (float): Young modulus.
1560 @param nr_bars (float): Number of reinforcement (allow float for computing the equivalent nr_bars with different reinforcement areas).
1561 @param D_bars (float): Diameter of the vertical reinforcing bars.
1562 @param wx_top (np.ndarray): Vector of 1 dimension that defines the distance between top vertical bars in x direction (NOT CENTERLINE DISTANCES).
1563 @param wx_bottom (np.ndarray): Vector of 1 dimension that defines the distance between bottom vertical bars in x direction (NOT CENTERLINE DISTANCES).
1564 @param wy (np.ndarray): Vector of 1 dimension that defines the distance between vertical bars in y direction (lateral) (NOT CENTERLINE DISTANCES).
1565 @param s (float): Vertical spacing between hoops.
1566 @param D_hoops (float): Diameter of hoops.
1567 @param rho_s_x (float): Ratio of the transversal area of the hoops to the associated concrete area in the x direction.
1568 @param rho_s_y (float): Ratio of the transversal area of the hoops to the associated concrete area in the y direction.
1569 @param fs (float): Yield stress for the hoops.
1570 @param ec (float, optional): Compressive concrete yield strain. Defaults to 1, e.g. computed according to Karthik and Mander 2011.
1571 @param ecp (float, optional): Concrete spalling strain. Defaults to 1, e.g. computed according to Mander 1988.
1572 @param fct (float, optional): Tensile concrete yield strain. Defaults to -1, e.g. computed according to SIA 262:2012.
1573 @param et (float, optional): Tensile concrete yield strain. Defaults to -1, e.g. computed according to SIA 262:2012.
1574 @param esu (float, optional): Tensile steel bars failure strain. Defaults to -1, e.g. computed according to Mander 1988.
1575 @param beta (float, optional): Loating point value defining the exponential curve parameter to define the residual stress.
1576 Defaults to 0.1 (according to OpenSeesPy documentation)
1577
1578 @exception NegativeValue: ID needs to be a positive integer.
1579 @exception NegativeValue: bc needs to be positive.
1580 @exception NegativeValue: dc needs to be positive.
1581 @exception NegativeValue: Ac needs to be positive.
1582 @exception PositiveValue: fc needs to be negative.
1583 @exception NegativeValue: Ec needs to be positive.
1584 @exception NegativeValue: nr_bars needs to be positive.
1585 @exception NegativeValue: D_bars needs to be positive.
1586 @exception NegativeValue: s needs to be positive.
1587 @exception NegativeValue: D_hoops needs to be positive.
1588 @exception NegativeValue: rho_s_x needs to be positive.
1589 @exception NegativeValue: rho_s_y needs to be positive.
1590 @exception NegativeValue: fs needs to be positive.
1591 @exception PositiveValue: ec needs to be negative if different from 1.
1592 @exception PositiveValue: ecp needs to be negative if different from 1.
1593 @exception NegativeValue: fct needs to be positive if different from -1.
1594 @exception NegativeValue: et needs to be positive if different from -1.
1595 @exception NegativeValue: esu needs to be positive if different from -1.
1596 """
1597 # Check
1598 if ID < 1: raise NegativeValue()
1599 if bc < 0: raise NegativeValue()
1600 if dc < 0: raise NegativeValue()
1601 if Ac < 0: raise NegativeValue()
1602 if fc > 0: raise PositiveValue()
1603 if Ec < 0: raise NegativeValue()
1604 if nr_bars < 0: raise NegativeValue()
1605 if D_bars < 0: raise NegativeValue()
1606 if s < 0: raise NegativeValue()
1607 if D_hoops < 0: raise NegativeValue()
1608 if rho_s_x < 0: raise NegativeValue()
1609 if rho_s_y < 0: raise NegativeValue()
1610 if fs < 0: raise NegativeValue()
1611 if ec != 1 and ec > 0: raise PositiveValue()
1612 if ecp != 1 and ecp > 0: raise PositiveValue()
1613 if fct != -1 and fct < 0: raise NegativeValue()
1614 if et != -1 and et < 0: raise NegativeValue()
1615 if esu != -1 and esu < 0: raise NegativeValue()
1616
1617 # Arguments
1618 self.IDID = ID
1619 self.bcbc = bc
1620 self.dcdc = dc
1621 self.AcAc = Ac
1622 self.fcfc = fc
1623 self.EcEc = Ec
1624 self.nr_barsnr_bars = nr_bars
1625 self.D_barsD_bars = D_bars
1626 self.wx_topwx_top = copy(wx_top)
1627 self.wx_bottomwx_bottom = copy(wx_bottom)
1628 self.wywy = copy(wy)
1629 self.ss = s
1630 self.D_hoopsD_hoops = D_hoops
1631 self.rho_s_xrho_s_x = rho_s_x
1632 self.rho_s_yrho_s_y = rho_s_y
1633 self.fsfs = fs
1634 self.esuesu = 0.05 if esu == -1 else esu # Mander 1988
1635 self.betabeta = beta
1636
1637 # Initialized the parameters that are dependent from others
1638 self.section_name_tagsection_name_tag = "None"
1639 self.InitializedInitialized = False
1640 self.ReInitReInit(ec, ecp, fct, et)
1641
1642 def ReInit(self, ec = 1, ecp = 1, fct = -1, et = -1):
1643 """
1644 Implementation of the homonym abstract method.
1645 See parent class DataManagement for detailed information.
1646
1647 @param ec (float, optional): Compressive concrete yield strain. Defaults to 1, e.g. computed according to Karthik and Mander 2011.
1648 @param ecp (float, optional): Concrete spalling strain. Defaults to 1, e.g. computed according to Mander 1988.
1649 @param fct (float, optional): Tensile concrete yield strain. Defaults to -1, e.g. computed according to SIA 262:2012.
1650 @param et (float, optional): Tensile concrete yield strain. Defaults to -1, e.g. computed according to SIA 262:2012.
1651 """
1652 # Check applicability
1653 self.CheckApplicabilityCheckApplicabilityCheckApplicability()
1654
1655 # Arguments
1656 self.ecec = self.Compute_ecCompute_ec() if ec == 1 else ec
1657 self.ecpecp = self.Compute_ecpCompute_ecp() if ecp == 1 else ecp
1658 self.fctfct = self.Compute_fctCompute_fct() if fct == -1 else fct
1659 self.etet = self.Compute_etCompute_et() if et == -1 else et
1660
1661 # Members (according to Mander 1988, confined concrete)
1662 self.ecuecu = self.Compute_ecuCompute_ecu()
1663 self.AiAi = self.ComputeAiComputeAi()
1664 self.AeAe = (self.AcAc - self.AiAi) * (1.0 - (self.ss-self.D_hoopsD_hoops)/2.0/self.bcbc)*(1.0 - (self.ss-self.D_hoopsD_hoops)/2.0/self.dcdc)
1665 self.rho_ccrho_cc = self.nr_barsnr_bars*self.D_barsD_bars**2/4.0*math.pi / self.AcAc
1666 self.AccAcc = self.AcAc*(1.0-self.rho_ccrho_cc)
1667 self.keke = self.AeAe/self.AccAcc
1668 self.fl_xfl_x = -self.rho_s_xrho_s_x * self.fsfs
1669 self.fl_yfl_y = -self.rho_s_yrho_s_y * self.fsfs
1670 self.K_comboK_combo = self.ComputeConfinementFactorComputeConfinementFactor()
1671 self.fccfcc = self.fcfc * self.K_comboK_combo
1672 self.eccecc = self.Compute_eccCompute_ecc()
1673 self.eccueccu = self.Compute_eccuCompute_eccu()
1674 if self.section_name_tagsection_name_tag != "None": self.section_name_tagsection_name_tag = self.section_name_tagsection_name_tag + " (modified)"
1675
1676 # Data storage for loading/saving
1677 self.UpdateStoredDataUpdateStoredData()
1678
1679
1680 # Methods
1682 """
1683 Implementation of the homonym abstract method.
1684 See parent class DataManagement for detailed information.
1685 """
1686 self.datadata = [["INFO_TYPE", "ConfMander1988rect"], # Tag for differentiating different data
1687 ["ID", self.IDID],
1688 ["section_name_tag", self.section_name_tagsection_name_tag],
1689 ["bc", self.bcbc],
1690 ["dc", self.dcdc],
1691 ["Ac", self.AcAc],
1692 ["fc", self.fcfc],
1693 ["Ec", self.EcEc],
1694 ["ec", self.ecec],
1695 ["ecp", self.ecpecp],
1696 ["ecu", self.ecuecu],
1697 ["fct", self.fctfct],
1698 ["et", self.etet],
1699 ["fcc", self.fccfcc],
1700 ["ecc", self.eccecc],
1701 ["eccu", self.eccueccu],
1702 ["beta", self.betabeta],
1703 ["nr_bars", self.nr_barsnr_bars],
1704 ["D_bars", self.D_barsD_bars],
1705 ["wx_top", self.wx_topwx_top],
1706 ["wx_bottom", self.wx_bottomwx_bottom],
1707 ["wy", self.wywy],
1708 ["s", self.ss],
1709 ["D_hoops", self.D_hoopsD_hoops],
1710 ["rho_s_x", self.rho_s_xrho_s_x],
1711 ["rho_s_y", self.rho_s_yrho_s_y],
1712 ["fs", self.fsfs],
1713 ["esu", self.esuesu],
1714 ["Ai", self.AiAi],
1715 ["Ae", self.AeAe],
1716 ["rho_cc", self.rho_ccrho_cc],
1717 ["Acc", self.AccAcc],
1718 ["ke", self.keke],
1719 ["fl_x", self.fl_xfl_x],
1720 ["fl_y", self.fl_yfl_y],
1721 ["K_combo", self.K_comboK_combo],
1722 ["Initialized", self.InitializedInitialized]]
1723
1724
1725 def ShowInfo(self, plot = False, block = False, concrete04 = True):
1726 """
1727 Implementation of the homonym abstract method.
1728 See parent class DataManagement for detailed information.
1729
1730 @param plot (bool, optional): Option to show the plot of the material model. Defaults to False.
1731 @param block (bool, optional): Option to wait the user command 'plt.show()' (avoiding the stop of the program everytime that a plot should pop up). Defaults to False.
1732 @param concrete04 (bool, optional): Option to show in the plot the concrete04 or concrete01 if False. Defaults to True.
1733 """
1734 print("")
1735 print("Requested info for Confined Mander 1988 (rectangular) material model Parameters, ID = {}".format(self.IDID))
1736 print("Section associated: {} ".format(self.section_name_tagsection_name_tag))
1737 print('Concrete strength fc = {} MPa'.format(self.fcfc/MPa_unit))
1738 print('Concrete strength confined fcc = {} MPa'.format(self.fccfcc/MPa_unit))
1739 print('Strain at maximal strength ec = {}'.format(self.ecec))
1740 print('Strain at maximal strength confined ecc = {}'.format(self.eccecc))
1741 print('Maximal strain ecu = {}'.format(self.ecuecu))
1742 print('Maximal strain confined eccu = {}'.format(self.eccueccu))
1743 print("")
1744
1745 if plot:
1746 fig, ax = plt.subplots()
1747 if concrete04:
1748 PlotConcrete04(self.fccfcc, self.EcEc, self.eccecc, self.eccueccu, "C", ax, self.IDID)
1749 else:
1750 PlotConcrete01(self.fccfcc, self.eccecc, 0.0, self.eccueccu, ax, self.IDID)
1751
1752 if block:
1753 plt.show()
1754
1755
1757 """
1758 Implementation of the homonym abstract method.
1759 See parent class MaterialModels for detailed information.
1760 """
1761 Check = True
1762 if self.fcfc < -110*MPa_unit: # Deierlein 1999
1763 Check = False
1764 print("With High Strength concrete (< -110 MPa), a better material model should be used (see Abdesselam et Al. 2019")
1765 if not Check:
1766 print("The validity of the equations is not fullfilled.")
1767 print("!!!!!!! WARNING !!!!!!! Check material model of Confined Mander 1988, ID=", self.IDID)
1768 print("")
1769
1770
1771 def Compute_ec(self):
1772 """
1773 Method that computes the compressive concrete yield strain.
1774 For more information, see Karthik and Mander 2011.
1775
1776 @returns float: Strain
1777 """
1778 # return -0.002 # Alternative: Mander et Al. 1988
1779 return -0.0015 + self.fcfc/MPa_unit/70000 # Karthik Mander 2011
1780
1781
1782 def Compute_ecp(self):
1783 """
1784 Method that computes the compressive concrete spalling strain.
1785 For more information, see Mander et Al. 1988.
1786
1787 @returns float: Strain
1788 """
1789 return 2.0*self.ecec
1790
1791
1792 def Compute_fct(self):
1793 """
1794 Method that computes the tensile concrete yield stress.
1795 For more information, see SIA 262:2012. Assume that the confinement do not play an essential role in tension.
1796
1797 @returns float: Stress.
1798 """
1799 return 0.30 * math.pow(-self.fcfc/MPa_unit, 2/3) * MPa_unit
1800
1801
1802 def Compute_et(self):
1803 """
1804 Method that computes the tensile concrete yield strain.
1805 For more information, see Mander et Al. 1988 (eq 45).
1806
1807 @returns float: Strain.
1808 """
1809 return self.fctfct/self.EcEc
1810
1811
1812 def Compute_ecu(self):
1813 """
1814 Method that computes the compressive concrete failure strain.
1815 For more information, see Karthik and Mander 2011.
1816
1817 @returns float: Strain
1818 """
1819 # return -0.004 # Alternative: Mander et Al. 1988
1820 return -0.012 - 0.0001 * self.fcfc/MPa_unit # Karthik Mander 2011
1821
1822
1823 def Compute_ecc(self):
1824 """
1825 Method that computes the compressive confined concrete yield strain.
1826 For more information, see Karthik and Mander 2011.
1827
1828 @returns float: Strain
1829 """
1830 return (1.0 + 5.0 * (self.K_comboK_combo-1.0)) * self.ecec # Karthik Mander 2011
1831
1832
1833 def Compute_eccu(self):
1834 """
1835 Method that computes the compressive confined concrete failure strain.
1836 For more information, see Karthik and Mander 2011.
1837
1838 @returns float: Strain
1839 """
1840 # return -0.004 + (1.4*(self.rho_s_x+self.rho_s_y)*self.esu*self.fs) / self.fcc # Alternative: Prof. Katrin Beyer
1841 return 5*self.eccecc # Karthik Mander 2011
1842
1843
1844 def ComputeAi(self):
1845 """
1846 Method that computes the ineffectual area.
1847 For more information, see Mander et Al. 1988.
1848
1849 @returns float: Area.
1850 """
1851 return ( np.sum(np.multiply(self.wywy, self.wywy))*2.0 +
1852 np.sum(np.multiply(self.wx_topwx_top, self.wx_topwx_top)) +
1853 np.sum(np.multiply(self.wx_bottomwx_bottom, self.wx_bottomwx_bottom)) ) / 6.0
1854
1855
1857 """
1858 Method that computes the confinement factor using the digitized table from Mander et Al. 1988 that
1859 extrapolates the factor using the lateral confining stress in the two direction.
1860
1861 @exception NoApplicability: The table from Mander accept ratio of fl/fc smaller than 0.3.
1862 @exception NoApplicability: The table from Mander accept ratio of fl/fc smaller than 0.3.
1863 @exception NegativeValue: fl1_ratio needs to be positive.
1864 @exception NegativeValue: fl2_ratio needs to be positive.
1865
1866 @returns float: Confinement factor.
1867 """
1868 if self.fl_xfl_x == self.fl_yfl_y:
1869 return -1.254 + 2.254 * math.sqrt(1.0+7.94*self.fl_xfl_x*self.keke/self.fcfc) - 2.0*self.fl_xfl_x*self.keke/self.fcfc # in Mander, it has a prime
1870 else:
1871 fl2_ratio = max(self.fl_xfl_x*self.keke/self.fcfc, self.fl_yfl_y*self.keke/self.fcfc)
1872 fl1_ratio = min(self.fl_xfl_x*self.keke/self.fcfc, self.fl_yfl_y*self.keke/self.fcfc)
1873
1874 if fl1_ratio > 0.3: raise NoApplicability()
1875 if fl2_ratio > 0.3: raise NoApplicability()
1876 if fl1_ratio < 0: raise NegativeValue()
1877 if fl2_ratio < 0: raise NegativeValue()
1878
1879 # choose one or two curves
1880 for ii, fl1 in enumerate(curve_fl1):
1881 if fl1 == fl1_ratio:
1882 # one curve
1883 # choose curve
1884 # curve_fl2 = [curve for ii, curve in enumerate(array_fl2) if index[ii]][0]
1885 curve_fl2 = array_fl2[ii]
1886
1887 # Take value (interpole)
1888 K = [item[0] for item in curve_fl2]
1889 fl2 = [item[1] for item in curve_fl2]
1890 K_res = np.interp(fl2_ratio, fl2, K)
1891
1892 #TODO: to check fucntion:
1893 # fig, ax = plt.subplots()
1894 # ax.plot(fl2, K, 'k-')
1895 # ax.scatter(fl2_ratio, K_res, color='k')
1896 # ax.grid()
1897 # plt.show()
1898 return K_res
1899
1900 # two curves
1901 if fl1 > fl1_ratio:
1902 fl1_max = fl1
1903 fl1_min = curve_fl1[ii-1]
1904 curve_fl2_max = array_fl2[ii]
1905 curve_fl2_min = array_fl2[ii-1]
1906
1907 # Take the values (interpole)
1908 K_max = [item[0] for item in curve_fl2_max]
1909 fl2_max = [item[1] for item in curve_fl2_max]
1910 K_res_max = np.interp(fl2_ratio, fl2_max, K_max)
1911
1912 K_min = [item[0] for item in curve_fl2_min]
1913 fl2_min = [item[1] for item in curve_fl2_min]
1914 K_res_min = np.interp(fl2_ratio, fl2_min, K_min)
1915
1916 # interpole with distance from fl1 for fl2
1917 # should be logarithmic interpolation but error negligibile
1918 K_res = np.interp(fl1_ratio, [fl1_min, fl1_max], [K_res_min, K_res_max])
1919 return K_res
1920
1921
1922 def Concrete01(self):
1923 """
1924 Generate the material model Concrete01 for rectangular section confined concrete (Mander 1988).
1925 See _Concrete01 function for more information. Use this method or Concrete04, not both (only one material model for ID).
1926 """
1927 _Concrete01(self.IDID, self.eccecc, self.fccfcc, self.eccueccu)
1928 self.InitializedInitialized = True
1929 self.UpdateStoredDataUpdateStoredData()
1930
1931
1932 def Concrete04(self):
1933 """
1934 Generate the material model Concrete04 for rectangular section confined concrete (Mander 1988).
1935 See _Concrete04 function for more information. Use this method or Concrete01, not both (only one material model for ID).
1936 """
1937 _Concrete04(self.IDID, self.fccfcc, self.eccecc, self.eccueccu, self.EcEc, self.fctfct, self.etet, self.betabeta)
1938 self.InitializedInitialized = True
1939 self.UpdateStoredDataUpdateStoredData()
1940
1941
1943 """
1944 Class that is the children of ConfMander1988Rect and combine the class RCRectShape (section) to retrieve the information needed.
1945
1946 @param ConfMander1988Rect: Parent class.
1947 """
1948 def __init__(self, ID: int, section: RCRectShape, ec=1, ecp=1, fct=-1, et=-1, esu=-1, beta=0.1):
1949 """
1950 Constructor of the class. It passes the arguments into the parent class to generate the combination of the parent class
1951 and the section class RCRectShape. wx_bottom, wx_top and wy are computed using the private method __Compute_w that
1952 and the member variable bars_ranges_position_y and bars_position_x from the section passed.
1953 The copy of the section passed is stored in the member variable self.sectionsection.
1954
1955 @param ID (int): Unique material model ID.
1956 @param section (RCRectShape): RCRectShape section object.
1957 @param ec (float, optional): Compressive concrete yield strain. Defaults to 1, e.g. computed according to Karthik and Mander 2011.
1958 @param ecp (float, optional): Concrete spalling strain. Defaults to 1, e.g. computed according to Mander 1988.
1959 @param fct (float, optional): Tensile concrete yield strain. Defaults to -1, e.g. computed according to SIA 262:2012.
1960 @param et (float, optional): Tensile concrete yield strain. Defaults to -1, e.g. computed according to SIA 262:2012.
1961 @param esu (float, optional): Tensile steel bars failure strain. Defaults to -1, e.g. computed according to Mander 1988.
1962 @param beta (float, optional): Loating point value defining the exponential curve parameter to define the residual stress.
1963 Defaults to 0.1 (according to OpenSeesPy documentation)
1964 """
1965 self.sectionsection = deepcopy(section)
1966 ranges = section.bars_ranges_position_y
1967 bars = section.bars_position_x
1968 wy = self.__Compute_w__Compute_w(ranges, section.D_bars)
1969 wx_top = self.__Compute_w__Compute_w(bars[0], section.D_bars)
1970 wx_bottom = self.__Compute_w__Compute_w(bars[-1], section.D_bars)
1971
1972 super().__init__(ID, section.bc, section.dc, section.Ac, section.fc, section.Ec, section.nr_bars, section.D_bars,
1973 wx_top, wx_bottom, wy, section.s, section.D_hoops, section.rho_s_x, section.rho_s_y, section.fs,
1974 ec=ec, ecp=ecp, fct=fct, et=et, esu=esu, beta=beta)
1975 self.section_name_tagsection_name_tagsection_name_tag = section.name_tag
1976 self.UpdateStoredDataUpdateStoredData()
1977
1978 def __Compute_w(self, vector, D_bars):
1979 """
1980 Private method that converts information from the section passed to the format of the class ConfMander1988Rect.
1981
1982 @param vector (list): Vector with the information from the section.
1983 @param D_bars (float): Diameter of the bars.
1984
1985 @returns list: Converted information.
1986 """
1987 l = len(vector)
1988 w = np.zeros(l-2)
1989 for i, elem in enumerate(vector[1:l-1]):
1990 w[i] = elem - D_bars
1991 return w
1992
1993
1995 """
1996 Class that stores funcions and material properties of a RC circular section
1997 with Mander 1988 as the material model for the confined reinforced concrete and the OpenSeesPy command type used to model it is Concrete04 or Concrete01.
1998 For more information about the empirical model for the computation of the parameters, see Mander et Al. 1988, Karthik and Mander 2011 and SIA 262:2012.
1999
2000 @param MaterialModels: Parent abstract class.
2001 """
2002 def __init__(self, ID: int, bc, Ac, fc, Ec, nr_bars, D_bars, s, D_hoops, rho_s_vol, fs,
2003 ec = 1, ecp = 1, fct = -1, et = -1, esu = -1, beta = 0.1):
2004 """
2005 Constructor of the class.
2006
2007 @param ID (int): Unique material model ID.
2008 @param bc (float): Width of the confined core (from the centerline of the hoops, according to Mander et Al. 1988).
2009 @param Ac (float): Area of the confined core (according to Mander et Al. 1988).
2010 @param fc (float): Compressive concrete yield strength (needs to be negative).
2011 @param Ec (float): Young modulus.
2012 @param nr_bars (float): Number of reinforcement (allow float for computing the equivalent nr_bars with different reinforcement areas).
2013 @param D_bars (float): Diameter of the vertical reinforcing bars.
2014 @param s (float): Vertical spacing between hoops.
2015 @param D_hoops (float): Diameter of hoops.
2016 @param rho_s_vol (float): Compute the ratio of the volume of transverse confining steel to the volume of confined concrete core.
2017 @param fs (float): Yield stress for the hoops.
2018 @param ec (float, optional): Compressive concrete yield strain. Defaults to 1, e.g. computed according to Karthik and Mander 2011.
2019 @param ecp (float, optional): Concrete spalling strain. Defaults to 1, e.g. computed according to Mander 1988.
2020 @param fct (float, optional): Tensile concrete yield strain. Defaults to -1, e.g. computed according to SIA 262:2012.
2021 @param et (float, optional): Tensile concrete yield strain. Defaults to -1, e.g. computed according to SIA 262:2012.
2022 @param esu (float, optional): Tensile steel bars failure strain. Defaults to -1, e.g. computed according to Mander 1988.
2023 @param beta (float, optional): Loating point value defining the exponential curve parameter to define the residual stress.
2024 Defaults to 0.1 (according to OpenSeesPy documentation)
2025
2026 @exception NegativeValue: ID needs to be a positive integer.
2027 @exception NegativeValue: bc needs to be positive.
2028 @exception NegativeValue: Ac needs to be positive.
2029 @exception PositiveValue: fc needs to be negative.
2030 @exception NegativeValue: Ec needs to be positive.
2031 @exception NegativeValue: nr_bars needs to be positive.
2032 @exception NegativeValue: D_bars needs to be positive.
2033 @exception NegativeValue: s needs to be positive.
2034 @exception NegativeValue: D_hoops needs to be positive.
2035 @exception NegativeValue: rho_s_vol needs to be positive.
2036 @exception NegativeValue: fs needs to be positive.
2037 @exception PositiveValue: ec needs to be negative if different from 1.
2038 @exception PositiveValue: ecp needs to be negative if different from 1.
2039 @exception NegativeValue: fct needs to be positive if different from -1.
2040 @exception NegativeValue: et needs to be positive if different from -1.
2041 @exception NegativeValue: esu needs to be positive if different from -1.
2042 """
2043 # Check
2044 if ID < 0: raise NegativeValue()
2045 if bc < 0: raise NegativeValue()
2046 if Ac < 0: raise NegativeValue()
2047 if fc > 0: raise PositiveValue()
2048 if Ec < 0: raise NegativeValue()
2049 if nr_bars < 0: raise NegativeValue()
2050 if D_bars < 0: raise NegativeValue()
2051 if s < 0: raise NegativeValue()
2052 if D_hoops < 0: raise NegativeValue()
2053 if rho_s_vol < 0: raise NegativeValue()
2054 if fs < 0: raise NegativeValue()
2055 if ec != 1 and ec > 0: raise PositiveValue()
2056 if ecp != 1 and ecp > 0: raise PositiveValue()
2057 if fct != -1 and fct < 0: raise NegativeValue()
2058 if et != -1 and et < 0: raise NegativeValue()
2059 if esu != -1 and esu < 0: raise NegativeValue()
2060
2061 # Arguments
2062 self.IDID = ID
2063 self.bcbc = bc
2064 self.AcAc = Ac
2065 self.fcfc = fc
2066 self.EcEc = Ec
2067 self.nr_barsnr_bars = nr_bars
2068 self.D_barsD_bars = D_bars
2069 self.ss = s
2070 self.D_hoopsD_hoops = D_hoops
2071 self.rho_s_volrho_s_vol = rho_s_vol
2072 self.fsfs = fs
2073 self.esuesu = 0.05 if esu == -1 else esu
2074 self.betabeta = beta
2075
2076 # Initialized the parameters that are dependent from others
2077 self.section_name_tagsection_name_tag = "None"
2078 self.InitializedInitialized = False
2079 self.ReInitReInit(ec, ecp, fct, et)
2080
2081 def ReInit(self, ec = 1, ecp = 1, fct = -1, et = -1):
2082 """
2083 Implementation of the homonym abstract method.
2084 See parent class DataManagement for detailed information.
2085
2086 @param ec (float, optional): Compressive concrete yield strain. Defaults to 1, e.g. computed according to Karthik and Mander 2011.
2087 @param ecp (float, optional): Concrete spalling strain. Defaults to 1, e.g. computed according to Mander 1988.
2088 @param fct (float, optional): Tensile concrete yield strain. Defaults to -1, e.g. computed according to SIA 262:2012.
2089 @param et (float, optional): Tensile concrete yield strain. Defaults to -1, e.g. computed according to SIA 262:2012.
2090 """
2091 # Check applicability
2092 self.CheckApplicabilityCheckApplicabilityCheckApplicability()
2093
2094 # Arguments
2095 self.ecec = self.Compute_ecCompute_ec() if ec == 1 else ec
2096 self.ecpecp = self.Compute_ecpCompute_ecp() if ecp == 1 else ecp
2097 self.fctfct = self.Compute_fctCompute_fct() if fct == -1 else fct
2098 self.etet = self.Compute_etCompute_et() if et == -1 else et
2099
2100 # Members
2101 s_prime = self.ss - self.D_hoopsD_hoops
2102 self.ecuecu = self.Compute_ecuCompute_ecu()
2103 self.AeAe = math.pi/4 * (self.bcbc - s_prime/2)**2
2104 self.rho_ccrho_cc = self.nr_barsnr_bars*self.D_barsD_bars**2/4.0*math.pi / self.AcAc
2105 self.AccAcc = self.AcAc*(1.0-self.rho_ccrho_cc)
2106 self.keke = self.AeAe/self.AccAcc
2107 self.flfl = -self.rho_s_volrho_s_vol * self.fsfs / 2
2108 self.fl_primefl_prime = self.flfl * self.keke
2109 self.K_comboK_combo = -1.254 + 2.254 * math.sqrt(1.0+7.94*self.fl_primefl_prime/self.fcfc) - 2.0*self.fl_primefl_prime/self.fcfc
2110 self.fccfcc = self.fcfc * self.K_comboK_combo
2111 self.eccecc = self.Compute_eccCompute_ecc()
2112 self.eccueccu = self.Compute_eccuCompute_eccu()
2113 if self.section_name_tagsection_name_tag != "None": self.section_name_tagsection_name_tag = self.section_name_tagsection_name_tag + " (modified)"
2114
2115 # Data storage for loading/saving
2116 self.UpdateStoredDataUpdateStoredData()
2117
2118
2119 # Methods
2121 """
2122 Implementation of the homonym abstract method.
2123 See parent class DataManagement for detailed information.
2124 """
2125 self.datadata = [["INFO_TYPE", "ConfMander1988Circ"], # Tag for differentiating different data
2126 ["ID", self.IDID],
2127 ["section_name_tag", self.section_name_tagsection_name_tag],
2128 ["bc", self.bcbc],
2129 ["Ac", self.AcAc],
2130 ["fc", self.fcfc],
2131 ["Ec", self.EcEc],
2132 ["ec", self.ecec],
2133 ["ecp", self.ecpecp],
2134 ["ecu", self.ecuecu],
2135 ["fct", self.fctfct],
2136 ["et", self.etet],
2137 ["fcc", self.fccfcc],
2138 ["ecc", self.eccecc],
2139 ["eccu", self.eccueccu],
2140 ["beta", self.betabeta],
2141 ["nr_bars", self.nr_barsnr_bars],
2142 ["D_bars", self.D_barsD_bars],
2143 ["s", self.ss],
2144 ["D_hoops", self.D_hoopsD_hoops],
2145 ["rho_s_vol", self.rho_s_volrho_s_vol],
2146 ["fs", self.fsfs],
2147 ["esu", self.esuesu],
2148 ["Initialized", self.InitializedInitialized]]
2149
2150
2151 def ShowInfo(self, plot = False, block = False, concrete04 = True):
2152 """
2153 Implementation of the homonym abstract method.
2154 See parent class DataManagement for detailed information.
2155
2156 @param plot (bool, optional): Option to show the plot of the material model. Defaults to False.
2157 @param block (bool, optional): Option to wait the user command 'plt.show()' (avoiding the stop of the program everytime that a plot should pop up). Defaults to False.
2158 @param concrete04 (bool, optional): Option to show in the plot the concrete04 or concrete01 if False. Defaults to True.
2159 """
2160 print("")
2161 print("Requested info for Confined Mander 1988 (circular) material model Parameters, ID = {}".format(self.IDID))
2162 print("Section associated: {} ".format(self.section_name_tagsection_name_tag))
2163 print('Concrete strength fc = {} MPa'.format(self.fcfc/MPa_unit))
2164 print('Concrete strength confined fcc = {} MPa'.format(self.fccfcc/MPa_unit))
2165 print('Strain at maximal strength ec = {}'.format(self.ecec))
2166 print('Strain at maximal strength confined ecc = {}'.format(self.eccecc))
2167 print('Maximal strain ecu = {}'.format(self.ecuecu))
2168 print('Maximal strain confined eccu = {}'.format(self.eccueccu))
2169 print("")
2170
2171 if plot:
2172 fig, ax = plt.subplots()
2173 if concrete04:
2174 PlotConcrete04(self.fccfcc, self.EcEc, self.eccecc, self.eccueccu, "C", ax, self.IDID)
2175 else:
2176 PlotConcrete01(self.fccfcc, self.eccecc, 0.0, self.eccueccu, ax, self.IDID)
2177
2178 if block:
2179 plt.show()
2180
2181
2183 """
2184 Implementation of the homonym abstract method.
2185 See parent class MaterialModels for detailed information.
2186 """
2187 Check = True
2188 if self.fcfc < -110*MPa_unit: # Deierlein 1999
2189 Check = False
2190 print("With High Strength concrete (< -110 MPa), a better material model should be used (see Abdesselam et Al. 2019")
2191 if not Check:
2192 print("The validity of the equations is not fullfilled.")
2193 print("!!!!!!! WARNING !!!!!!! Check material model of Confined Mander 1988, ID=", self.IDID)
2194 print("")
2195
2196
2197 def Compute_ec(self):
2198 """
2199 Method that computes the compressive concrete yield strain.
2200 For more information, see Karthik and Mander 2011.
2201
2202 @returns float: Strain
2203 """
2204 # return -0.002 # Alternative: Mander et Al. 1988
2205 return -0.0015 + self.fcfc/MPa_unit/70000 # Karthik Mander 2011
2206
2207
2208 def Compute_ecp(self):
2209 """
2210 Method that computes the compressive concrete spalling strain.
2211 For more information, see Mander et Al. 1988.
2212
2213 @returns float: Strain
2214 """
2215 return 2.0*self.ecec
2216
2217
2218 def Compute_fct(self):
2219 """
2220 Method that computes the tensile concrete yield stress.
2221 For more information, see SIA 262:2012. Assume that the confinement do not play an essential role in tension.
2222
2223 @returns float: Stress.
2224 """
2225 return 0.30 * math.pow(-self.fcfc/MPa_unit, 2/3) * MPa_unit
2226
2227
2228 def Compute_et(self):
2229 """
2230 Method that computes the tensile concrete yield strain.
2231 For more information, see Mander et Al. 1988 (eq 45).
2232
2233 @returns float: Strain.
2234 """
2235 return self.fctfct/self.EcEc
2236
2237
2238 def Compute_ecu(self):
2239 """
2240 Method that computes the compressive concrete failure strain.
2241 For more information, see Karthik and Mander 2011.
2242
2243 @returns float: Strain
2244 """
2245 # return -0.004 # Alternative: Mander et Al. 1988
2246 return -0.012 - 0.0001 * self.fcfc/MPa_unit # Karthik Mander 2011
2247
2248
2249 def Compute_ecc(self):
2250 """
2251 Method that computes the compressive confined concrete yield strain.
2252 For more information, see Karthik and Mander 2011.
2253
2254 @returns float: Strain
2255 """
2256 return (1.0 + 5.0 * (self.K_comboK_combo-1.0)) * self.ecec # Karthik Mander 2011
2257
2258
2259 def Compute_eccu(self):
2260 """
2261 Method that computes the compressive confined concrete failure strain.
2262 For more information, see Karthik and Mander 2011.
2263
2264 @returns float: Strain
2265 """
2266 # return -0.004 + (1.4*(self.rho_s_x+self.rho_s_y)*self.esu*self.fs) / self.fcc # Alternative: Prof. Katrin Beyer
2267 return 5*self.eccecc # Karthik Mander 2011
2268
2269
2270 def Concrete01(self):
2271 """
2272 Generate the material model Concrete01 for rectangular section confined concrete (Mander 1988).
2273 See _Concrete01 function for more information. Use this method or Concrete04, not both (only one material model for ID).
2274 """
2275 _Concrete01(self.IDID, self.eccecc, self.fccfcc, self.eccueccu)
2276 self.InitializedInitialized = True
2277 self.UpdateStoredDataUpdateStoredData()
2278
2279
2280 def Concrete04(self):
2281 """
2282 Generate the material model Concrete04 for circular section confined concrete (Mander 1988).
2283 See _Concrete04 function for more information. Use this method or Concrete01, not both (only one material model for ID).
2284 """
2285 _Concrete04(self.IDID, self.fccfcc, self.eccecc, self.eccueccu, self.EcEc, self.fctfct, self.etet, self.betabeta)
2286 self.InitializedInitialized = True
2287 self.UpdateStoredDataUpdateStoredData()
2288
2289
2291 """
2292 Class that is the children of ConfMander1988Circ and combine the class RCCircShape (section) to retrieve the information needed.
2293
2294 @param ConfMander1988Circ: Parent class.
2295 """
2296 def __init__(self, ID: int, section: RCCircShape, ec=1, ecp=1, fct=-1, et=-1, esu=-1, beta=0.1):
2297 """
2298 Constructor of the class. It passes the arguments into the parent class to generate the combination of the parent class
2299 and the section class RCCircShape.
2300 The copy of the section passed is stored in the member variable self.sectionsection.
2301
2302 @param ID (int): Unique material model ID.
2303 @param section (RCCircShape): RCCircShape section object.
2304 @param ec (float, optional): Compressive concrete yield strain. Defaults to 1, e.g. computed according to Karthik and Mander 2011.
2305 @param ecp (float, optional): Concrete spalling strain. Defaults to 1, e.g. computed according to Mander 1988.
2306 @param fct (float, optional): Tensile concrete yield strain. Defaults to -1, e.g. computed according to SIA 262:2012.
2307 @param et (float, optional): Tensile concrete yield strain. Defaults to -1, e.g. computed according to SIA 262:2012.
2308 @param esu (float, optional): Tensile steel bars failure strain. Defaults to -1, e.g. computed according to Mander 1988.
2309 @param beta (float, optional): Loating point value defining the exponential curve parameter to define the residual stress.
2310 Defaults to 0.1 (according to OpenSeesPy documentation)
2311 """
2312 self.sectionsection = deepcopy(section)
2313 super().__init__(ID, section.bc, section.Ac, section.fc, section.Ec, section.n_bars, section.D_bars, section.s, section.D_hoops,
2314 section.rho_s_vol, section.fs, ec=ec, ecp=ecp, fct=fct, et=et, esu=esu, beta=beta)
2315 self.section_name_tagsection_name_tagsection_name_tag = section.name_tag
2316 self.UpdateStoredDataUpdateStoredData()
2317
2318
2320 """
2321 Class that stores funcions and material properties of a simple uniaxial bilinear model
2322 with the OpenSeesPy command type used to model it is Steel01.
2323
2324 @param MaterialModels: Parent abstract class.
2325 """
2326 def __init__(self, ID: int, fy, Ey, b = 0.01):
2327 """
2328 Constructor of the class.
2329
2330 @param ID (int): Unique material model ID.
2331 @param fy (float): Yield stress.
2332 @param Ey (float): Young modulus.
2333 @param b (float, optional): Strain hardening factor. Defaults to 0.01.
2334
2335 @exception NegativeValue: ID needs to be a positive integer.
2336 @exception NegativeValue: fy needs to be positive.
2337 @exception NegativeValue: Ey needs to be positive.
2338 """
2339 # Check
2340 if ID < 1: raise NegativeValue()
2341 if fy < 0: raise NegativeValue()
2342 if Ey < 0: raise NegativeValue()
2343
2344 # Arguments
2345 self.IDID = ID
2346 self.fyfy = fy
2347 self.EyEy = Ey
2348 self.bb = b
2349
2350 # Initialized the parameters that are dependent from others
2351 self.section_name_tagsection_name_tag = "None"
2352 self.InitializedInitialized = False
2353 self.ReInitReInit()
2354
2355 def ReInit(self):
2356 """
2357 Implementation of the homonym abstract method.
2358 See parent class DataManagement for detailed information.
2359 """
2360 # Check applicability
2361 self.CheckApplicabilityCheckApplicabilityCheckApplicability()
2362
2363 # Members
2364 self.eyey = self.fyfy / self.EyEy
2365 if self.section_name_tagsection_name_tag != "None": self.section_name_tagsection_name_tag = self.section_name_tagsection_name_tag + " (modified)"
2366
2367 # Data storage for loading/saving
2368 self.UpdateStoredDataUpdateStoredData()
2369
2370
2371 # Methods
2373 """
2374 Implementation of the homonym abstract method.
2375 See parent class DataManagement for detailed information.
2376 """
2377 self.datadata = [["INFO_TYPE", "UniaxialBilinear"], # Tag for differentiating different data
2378 ["ID", self.IDID],
2379 ["section_name_tag", self.section_name_tagsection_name_tag],
2380 ["fy", self.fyfy],
2381 ["Ey", self.EyEy],
2382 ["ey", self.eyey],
2383 ["b", self.bb],
2384 ["Initialized", self.InitializedInitialized]]
2385
2386
2387 def ShowInfo(self, plot = False, block = False):
2388 """
2389 Implementation of the homonym abstract method.
2390 See parent class DataManagement for detailed information.
2391
2392 @param plot (bool, optional): Option to show the plot of the material model. Defaults to False.
2393 @param block (bool, optional): Option to wait the user command 'plt.show()' (avoiding the stop of the program everytime that a plot should pop up). Defaults to False.
2394 """
2395 print("")
2396 print("Requested info for Uniaxial Bilinear material model Parameters, ID = {}".format(self.IDID))
2397 print("Section associated: {} ".format(self.section_name_tagsection_name_tag))
2398 print('Yielding stress fy = {} MPa'.format(self.fyfy/MPa_unit))
2399 print('Young modulus Ey = {} MPa'.format(self.EyEy/MPa_unit))
2400 print('Maximal elastic strain epsilon y = {}'.format(self.eyey))
2401 print('Hardening factor b = {}'.format(self.bb))
2402 print("")
2403
2404 if plot:
2405 # Data for plotting
2406 e_pl = 10.0 * self.eyey # to show that if continues with this slope
2407 sigma_pl = self.bb * self.EyEy * e_pl
2408
2409 x_axis = np.array([0.0, self.eyey, (self.eyey+e_pl)])*100
2410 y_axis = np.array([0.0, self.fyfy, (self.fyfy+sigma_pl)])/MPa_unit
2411
2412 fig, ax = plt.subplots()
2413 ax.plot(x_axis, y_axis, 'k-')
2414
2415 ax.set(xlabel='Strain [%]', ylabel='Stress [MPa]',
2416 title='Uniaxial Bilinear model for material ID={}'.format(self.IDID))
2417 ax.grid()
2418
2419 if block:
2420 plt.show()
2421
2422
2424 """
2425 Implementation of the homonym abstract method.
2426 See parent class MaterialModels for detailed information.
2427 """
2428 Check = True
2429 # if len(self.wy) == 0 or len(self.wx_top) == 0 or len(self.wx_bottom) == 0:
2430 # Check = False
2431 # print("Hypothesis of one bar per corner not fullfilled.")
2432 if not Check:
2433 print("The validity of the equations is not fullfilled.")
2434 print("!!!!!!! WARNING !!!!!!! Check material model of Uniaxial Bilinear, ID=", self.IDID)
2435 print("")
2436
2437
2438 def Steel01(self):
2439 """
2440 Generate the material model Steel01 uniaxial bilinear material model.
2441 See _Steel01 function for more information.
2442 """
2443 _Steel01(self.IDID, self.fyfy, self.EyEy, self.bb)
2444 self.InitializedInitialized = True
2445 self.UpdateStoredDataUpdateStoredData()
2446
2447
2449 """
2450 Class that is the children of UniaxialBilinear and combine the class SteelIShape (section) to retrieve the information needed.
2451
2452 @param UniaxialBilinear: Parent class.
2453 """
2454 def __init__(self, ID: int, section: SteelIShape, b=0.01):
2455 """
2456 Constructor of the class. It passes the arguments into the parent class to generate the combination of the parent class
2457 and the section class SteelIShape.
2458 The copy of the section passed is stored in the member variable self.sectionsection.
2459
2460 @param ID (int): Unique material model ID.
2461 @param section (SteelIShape): SteelIShape section object.
2462 @param b (float, optional): Strain hardening factor. Defaults to 0.01.
2463 """
2464 self.sectionsection = deepcopy(section)
2465 super().__init__(ID, section.Fy, section.E, b=b)
2466 self.section_name_tagsection_name_tagsection_name_tag = section.name_tag
2467 self.UpdateStoredDataUpdateStoredData()
2468
2469
2471 """
2472 Class that stores funcions and material properties of the vertical steel reinforcement bars
2473 with Giuffré, Menegotto and Pinto 1970 as the material model and the OpenSeesPy command type used to model it is Steel02.
2474 For more information about the empirical model for the computation of the parameters, see Giuffré, Menegotto and Pinto 1970 and Carreno et Al. 2020.
2475
2476 @param MaterialModels: Parent abstract class.
2477 """
2478 def __init__(self, ID: int, fy, Ey, b = 0.02, R0 = 20, cR1 = 0.9, cR2 = 0.08, a1 = 0.039, a2 = 1.0, a3 = 0.029, a4 = 1.0):
2479 """
2480 Constructor of the class. The parameters are suggested as exposed in Carreno et Al. 2020 but also the one suggested by OpenSeesPy documentation are reliable
2481 (b = 0.015, R0 = 10, cR1 = 0.925, cR2 = 0.15).
2482
2483 @param ID (int): Unique material model ID.
2484 @param fy (float): Steel yield strength.
2485 @param Ey (float): Young modulus.
2486 @param b (float, optional): Strain-hardening ratio. Defaults to 0.02, according to Carreno et Al. 2020.
2487 @param R0 (int, optional): First parameter to control the transition from elastic to plastic branches. Defaults to 20, according to Carreno et Al. 2020.
2488 @param cR1 (float, optional): Second parameter to control the transition from elastic to plastic branches. Defaults to 0.9, according to Carreno et Al. 2020.
2489 @param cR2 (float, optional): Third parameter to control the transition from elastic to plastic branches. Defaults to 0.08, according to Carreno et Al. 2020.
2490 @param a1 (float, optional): Isotropic hardening parameter, increase of compression yield envelope as proportion of yield strength after a plastic strain.
2491 Defaults to 0.039, according to Carreno et Al. 2020.
2492 @param a2 (float, optional): Coupled with a1. Defaults to 1.0, according to Carreno et Al. 2020.
2493 @param a3 (float, optional): Isotropic hardening parameter, increase of tension yield envelope as proportion of yield strength after a plastic strain.
2494 Defaults to 0.029, according to Carreno et Al. 2020.
2495 @param a4 (float, optional): Coupled with a3. Defaults to 1.0, according to Carreno et Al. 2020.
2496
2497 @exception NegativeValue: ID needs to be a positive integer.
2498 """
2499 # Check
2500 if ID < 1: raise NegativeValue()
2501
2502 # Arguments
2503 self.IDID = ID
2504 self.fyfy = fy
2505 self.EyEy = Ey
2506 self.bb = b
2507 self.R0R0 = R0
2508 self.cR1cR1 = cR1
2509 self.cR2cR2 = cR2
2510 self.a1a1 = a1
2511 self.a2a2 = a2
2512 self.a3a3 = a3
2513 self.a4a4 = a4
2514
2515 # Initialized the parameters that are dependent from others
2516 self.section_name_tagsection_name_tag = "None"
2517 self.InitializedInitialized = False
2518 self.ReInitReInit()
2519
2520 def ReInit(self):
2521 """
2522 Implementation of the homonym abstract method.
2523 See parent class DataManagement for detailed information.
2524 """
2525 # Check applicability
2526 self.CheckApplicabilityCheckApplicabilityCheckApplicability()
2527
2528 # Members
2529 if self.section_name_tagsection_name_tag != "None": self.section_name_tagsection_name_tag = self.section_name_tagsection_name_tag + " (modified)"
2530
2531 # Data storage for loading/saving
2532 self.UpdateStoredDataUpdateStoredData()
2533
2534
2535 # Methods
2537 """
2538 Implementation of the homonym abstract method.
2539 See parent class DataManagement for detailed information.
2540 """
2541 self.datadata = [["INFO_TYPE", "GMP1970"], # Tag for differentiating different data
2542 ["ID", self.IDID],
2543 ["section_name_tag", self.section_name_tagsection_name_tag],
2544 ["fy", self.fyfy],
2545 ["Ey", self.EyEy],
2546 ["b", self.bb],
2547 ["R0", self.R0R0],
2548 ["cR1", self.cR1cR1],
2549 ["cR2", self.cR2cR2],
2550 ["a1", self.a1a1],
2551 ["a2", self.a2a2],
2552 ["a3", self.a3a3],
2553 ["a4", self.a4a4],
2554 ["Initialized", self.InitializedInitialized]]
2555
2556
2557 def ShowInfo(self):
2558 """
2559 Implementation of the homonym abstract method.
2560 See parent class DataManagement for detailed information.
2561 """
2562 print("")
2563 print("Requested info for GMP1970 (Giuffré-Menegotto-Pinto) material model Parameters, ID = {}".format(self.IDID))
2564 print("Section associated: {} ".format(self.section_name_tagsection_name_tag))
2565 print("Yield stress fy = {} MPa".format(self.fyfy/MPa_unit))
2566 print("Young modulus Ey = {} MPa".format(self.EyEy/MPa_unit))
2567 print("Strain hardening ratio b = {}".format(self.bb))
2568 print("Bauschinger effect factors R0 = {}, cR1 = {} and cR2 = {}".format(self.R0R0, self.cR1cR1, self.cR2cR2))
2569 print("Isotropic hardening factors a1 = {}, a2 = {}, a3 = {} and a4 = {}".format(self.a1a1, self.a2a2, self.a3a3, self.a4a4))
2570 print("")
2571
2572 #TODO: add plot option (difficult to implement)
2573
2574
2576 """
2577 Implementation of the homonym abstract method.
2578 See parent class MaterialModels for detailed information.
2579 """
2580 Check = True
2581 # No checks
2582 if not Check:
2583 print("The validity of the equations is not fullfilled.")
2584 print("!!!!!!! WARNING !!!!!!! Check material model of GMP1970, ID=", self.IDID)
2585 print("")
2586
2587
2588 def Steel02(self):
2589 """
2590 Generate the material model Steel02 uniaxial Giuffre-Menegotto-Pinto steel material with isotropic strain hardening.
2591 See _Steel02 function for more information.
2592 """
2593 _Steel02(self.IDID, self.fyfy, self.EyEy, self.bb, self.R0R0, self.cR1cR1, self.cR2cR2, self.a1a1, self.a2a2, self.a3a3, self.a4a4)
2594 self.InitializedInitialized = True
2595 self.UpdateStoredDataUpdateStoredData()
2596
2597
2599 """
2600 Class that is the children of GMP1970 and combine the class RCRectShape (section) to retrieve the information needed.
2601
2602 @param GMP1970: Parent class.
2603 """
2604 def __init__(self, ID: int, section: RCRectShape, b=0.02, R0=20.0, cR1=0.9, cR2=0.08, a1=0.039, a2=1.0, a3=0.029, a4=1.0):
2605 """
2606 Constructor of the class. It passes the arguments into the parent class to generate the combination of the parent class
2607 and the section class RCRectShape.
2608 The copy of the section passed is stored in the member variable self.sectionsection.
2609
2610 @param ID (int): Unique material model ID.
2611 @param section (RCRectShape): RCRectShape section object.
2612 @param b (float, optional): Strain-hardening ratio. Defaults to 0.02, according to Carreno et Al. 2020.
2613 @param R0 (int, optional): First parameter to control the transition from elastic to plastic branches. Defaults to 20, according to Carreno et Al. 2020.
2614 @param cR1 (float, optional): Second parameter to control the transition from elastic to plastic branches. Defaults to 0.9, according to Carreno et Al. 2020.
2615 @param cR2 (float, optional): Third parameter to control the transition from elastic to plastic branches. Defaults to 0.08, according to Carreno et Al. 2020.
2616 @param a1 (float, optional): Isotropic hardening parameter, increase of compression yield envelope as proportion of yield strength after a plastic strain.
2617 Defaults to 0.039, according to Carreno et Al. 2020.
2618 @param a2 (float, optional): Coupled with a1. Defaults to 1.0, according to Carreno et Al. 2020.
2619 @param a3 (float, optional): Isotropic hardening parameter, increase of tension yield envelope as proportion of yield strength after a plastic strain.
2620 Defaults to 0.029, according to Carreno et Al. 2020.
2621 @param a4 (float, optional): Coupled with a3. Defaults to 1.0, according to Carreno et Al. 2020.
2622 """
2623 self.sectionsection = deepcopy(section)
2624 super().__init__(ID, section.fy, section.Ey, b=b, R0=R0, cR1=cR1, cR2=cR2, a1=a1, a2=a2, a3=a3, a4=a4)
2625 self.section_name_tagsection_name_tagsection_name_tag = section.name_tag
2626 self.UpdateStoredDataUpdateStoredData()
2627
2628
2630 """
2631 Class that stores funcions and material properties of a steel profile or reinforcing bar
2632 with Updated Voce-Chaboche as the material model and the OpenSeesPy command type used to model it is UVCuniaxial.
2633 For more information about the how to calibrate the set of parameters, see
2634 de Castro e Sousa, Suzuki and Lignos 2020 and Hartloper, de Castro e Sousa and Lignos 2021.
2635
2636 @param MaterialModels: Parent abstract class.
2637 """
2638 def __init__(self, ID: int, fy, Ey, QInf, b, DInf, a, cK: np.ndarray, gammaK: np.ndarray):
2639 """
2640 Constructor of the class.
2641
2642 @param ID (int): Unique material model ID.
2643 @param fy (float): Initial yield stress of the steel material.
2644 @param Ey (float): Elastic modulus of the steel material.
2645 @param QInf (float): Maximum increase in yield stress due to cyclic hardening (isotropic hardening).
2646 @param b (float): Saturation rate of QInf.
2647 @param DInf (float): Decrease in the initial yield stress, to neglect the model updates set DInf = 0.
2648 @param a (float): Saturation rate of DInf, a > 0. If DInf == 0, then a is arbitrary (but still a > 0).
2649 @param cK (np.ndarray): Array of 1 dimension; each entry is one kinematic hardening parameter associated with one backstress, up to 8 may be specified.
2650 @param gammaK (np.ndarray): Array of 1 dimension; each entry is one saturation rate of kinematic hardening associated with one backstress, up to 8 may be specified.
2651
2652 @exception NegativeValue: ID needs to be a positive integer.
2653 @exception NegativeValue: fy needs to be positive.
2654 @exception NegativeValue: Ey needs to be positive.
2655 @exception NegativeValue: QInf needs to be positive.
2656 @exception NegativeValue: b needs to be positive.
2657 @exception NegativeValue: DInf needs to be positive.
2658 @exception NegativeValue: a needs to be positive.
2659 @exception WrongArgument: cK can't be empty.
2660 @exception WrongArgument: cK and gammaK have as many entries as the number of backstresses (thus they have the same length).
2661 """
2662 # Check
2663 if ID < 1: raise NegativeValue()
2664 if fy < 0: raise NegativeValue()
2665 if Ey < 0: raise NegativeValue()
2666 if QInf < 0: raise NegativeValue()
2667 if b < 0: raise NegativeValue()
2668 if DInf < 0: raise NegativeValue()
2669 if a < 0: raise NegativeValue()
2670 if len(cK) == 0: raise WrongArgument()
2671 if len(cK) != len(gammaK): raise WrongArgument()
2672 if len(cK) != 2: print("!!!!!!! WARNING !!!!!!! Number of backstresses should be 2 for optimal performances")
2673 if DInf == 0: print("!!!!!!! WARNING !!!!!!! With DInf = 0, the model used is Voce-Chaboche (VC) not updated (UVC)")
2674
2675 # Arguments
2676 self.IDID = ID
2677 self.fyfy = fy
2678 self.EyEy = Ey
2679 self.QInfQInf = QInf
2680 self.bb = b
2681 self.DInfDInf = DInf
2682 self.aa = a
2683 self.cKcK = copy(cK)
2684 self.gammaKgammaK = copy(gammaK)
2685
2686 # Initialized the parameters that are dependent from others
2687 self.section_name_tagsection_name_tag = "None"
2688 self.InitializedInitialized = False
2689 self.ReInitReInit()
2690
2691 def ReInit(self):
2692 """
2693 Implementation of the homonym abstract method.
2694 See parent class DataManagement for detailed information.
2695 """
2696 # Check applicability
2697 self.CheckApplicabilityCheckApplicabilityCheckApplicability()
2698
2699 # Members
2700 self.NN = len(self.cKcK)
2701 if self.section_name_tagsection_name_tag != "None": self.section_name_tagsection_name_tag = self.section_name_tagsection_name_tag + " (modified)"
2702
2703 # Data storage for loading/saving
2704 self.UpdateStoredDataUpdateStoredData()
2705
2706
2707 # Methods
2709 """
2710 Implementation of the homonym abstract method.
2711 See parent class DataManagement for detailed information.
2712 """
2713 self.datadata = [["INFO_TYPE", "UVC"], # Tag for differentiating different data
2714 ["ID", self.IDID],
2715 ["section_name_tag", self.section_name_tagsection_name_tag],
2716 ["fy", self.fyfy],
2717 ["Ey", self.EyEy],
2718 ["QInf", self.QInfQInf],
2719 ["b", self.bb],
2720 ["DInf", self.DInfDInf],
2721 ["a", self.aa],
2722 ["N", self.NN],
2723 ["ck", self.cKcK],
2724 ["gammaK", self.gammaKgammaK],
2725 ["Initialized", self.InitializedInitialized]]
2726
2727
2728 def ShowInfo(self):
2729 """
2730 Implementation of the homonym abstract method.
2731 See parent class DataManagement for detailed information.
2732 """
2733 print("")
2734 print("Requested info for UVC material model Parameters, ID = {}".format(self.IDID))
2735 print("Section associated: {} ".format(self.section_name_tagsection_name_tag))
2736 print("Yield strength fy = {} MPa".format(self.fyfy/MPa_unit))
2737 print("Young modulus Ey = {} MPa".format(self.EyEy/MPa_unit))
2738 print("Isotropic hardening factor QInf = {} MPa and saturation rate b = {}".format(self.QInfQInf/MPa_unit, self.bb))
2739 print("Decrease the initial yield stress DInf = {} MPa and saturation rate a = {}".format(self.DInfDInf/MPa_unit, self.aa))
2740 print("Kinematic hardening vector ({} backstresses) cK = {} MPa".format(self.NN, self.cKcK/MPa_unit))
2741 print("And associated saturation rate gammaK = {}".format(self.gammaKgammaK))
2742 print("")
2743
2744 #TODO: implement plot (too complex for now)
2745
2746
2748 """
2749 Implementation of the homonym abstract method.
2750 See parent class MaterialModels for detailed information.
2751 """
2752 Check = True
2753 # No checks
2754 if not Check:
2755 print("The validity of the equations is not fullfilled.")
2756 print("!!!!!!! WARNING !!!!!!! Check material model of UVC, ID=", self.IDID)
2757 print("")
2758
2759
2760 def UVCuniaxial(self):
2761 """
2762 Generate the material model Updated Voce-Chaboche (UVC) for uniaxial stress states.
2763 See _UVCuniaxial function for more information.
2764 """
2765 _UVCuniaxial(self.IDID, self.EyEy, self.fyfy, self.QInfQInf, self.bb, self.DInfDInf, self.aa, self.NN, self.cKcK, self.gammaKgammaK)
2766 self.InitializedInitialized = True
2767 self.UpdateStoredDataUpdateStoredData()
2768
2769
2771 """
2772 Class that is the children of UVC that retrieve calibrated parameters from UVC_calibrated_parameters.txt.
2773 The file text can be modified by adding more calibrated parameters.
2774
2775 @param UVC: Parent class.
2776 """
2777 def __init__(self, ID: int, calibration: str, fy = -1, E = -1):
2778 """
2779 Constructor of the class. It retrieve the parameters from UVC_calibrated_parameters.txt and pass them in the parent class.
2780
2781 @param ID (int): Unique material model ID.
2782 @param calibration (str): Label of the calibration parameter set. The options are: \n
2783 # 'S355J2_25mm_plate' \n
2784 # 'S355J2_50mm_plate' \n
2785 # 'S355J2_HEB500_flange' \n
2786 # 'S355J2_HEB500_web' \n
2787 # 'S460NL_25mm_plate' \n
2788 # 'S690QL_25mm_plate' \n
2789 # 'A992Gr50_W14X82_web' \n
2790 # 'A992Gr50_W14X82_flange' \n
2791 # 'A500GrB_HSS305X16' \n
2792 # 'BCP325_22mm_plate' \n
2793 # 'BCR295_HSS350X22' \n
2794 # 'HYP400_27mm_plate' \n
2795 @param fy (float, optional): Yield strength. Defaults to -1, e.g. taken equal to the one given in the calibration parameter set.
2796 @param E (float, optional): Young modulus. Defaults to -1, e.g. taken equal to the one given in the calibration parameter set.
2797
2798 @exception NegativeValue: fy needs to be positive if different from -1.
2799 @exception NegativeValue: E needs to be positive if different from -1.
2800 @exception NameError: calibration needs to be equal to the label of one of the set of calibrated parameters.
2801 """
2802 if fy != -1 and fy < 0: raise NegativeValue()
2803 if E != -1 and E < 0: raise NegativeValue()
2804
2805 self.calibrationcalibration = calibration
2806
2807 # Structure of the data to be stored
2808 names = ["Material", "Ey", "fy", "QInf", "b","DInf", "a", "C1", "gamma1", "C2", "gamma2"]
2809 # Get the data
2810 __location__ = os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file__)))
2811 UVC_data = np.genfromtxt(os.path.join(__location__, 'UVC_calibrated_parameters.txt'), dtype=None, skip_header=1, names = names, encoding='ascii', delimiter='\t')
2812 # Define the index (with the location of the correct set of parameters)
2813 index = UVC_data["Material"] == calibration
2814 fy = UVC_data["fy"][index][0]*MPa_unit if fy == -1 else fy
2815 E = UVC_data["Ey"][index][0]*GPa_unit if E == -1 else E
2816 # Check
2817 if not index.any(): raise NameError("No calibrated parameters with that name. Note that there are no spaces in the label.")
2818
2819 # Assign arguments value
2820 super().__init__(ID, fy, E, UVC_data["QInf"][index][0]*MPa_unit, UVC_data["b"][index][0],
2821 UVC_data["DInf"][index][0]*MPa_unit, UVC_data["a"][index][0],
2822 np.array([UVC_data["C1"][index][0], UVC_data["C2"][index][0]])*MPa_unit,
2823 np.array([UVC_data["gamma1"][index][0], UVC_data["gamma2"][index][0]]))
2824
2825
2827 """
2828 Class that is the children of UVCCalibrated and combines the class RCRectShape (section) to retrieve the information needed.
2829
2830 @param UVCCalibrated: Parent class.
2831 """
2832 def __init__(self, ID: int, section: RCRectShape, calibration = 'S460NL_25mm_plate'):
2833 """
2834 Constructor of the class.
2835
2836 @param ID (int): Unique material model ID.
2837 @param section (RCRectShape): RCRectShape section object.
2838 @param calibration (str): Label of the calibration parameter set. The options are listed in UVCCalibrated.
2839 Defaults to 'S460NL_25mm_plate'. Change it accordingly to the steel rebars material properties.
2840 """
2841 self.sectionsection = deepcopy(section)
2842 super().__init__(ID, calibration, section.fy, section.Ey)
2843 self.section_name_tagsection_name_tagsection_name_tag = section.name_tag
2844 self.UpdateStoredDataUpdateStoredData()
2845
2846
2848 """
2849 Class that is the children of UVCCalibrated and combine the class RCCircShape (section) to retrieve the information needed.
2850
2851 @param UVCCalibrated: Parent class.
2852 """
2853 def __init__(self, ID: int, section: RCCircShape, calibration = 'S460NL_25mm_plate'):
2854 """
2855 Constructor of the class.
2856
2857 @param ID (int): Unique material model ID.
2858 @param section (RCCircShape): RCCircShape section object.
2859 @param calibration (str, optional): Label of the calibration parameter set. The options are listed in UVCCalibrated.
2860 Defaults to 'S460NL_25mm_plate'. Change it accordingly to the steel rebars material properties.
2861 """
2862 self.sectionsection = deepcopy(section)
2863 super().__init__(ID, calibration, section.fy, section.Ey)
2864 self.section_name_tagsection_name_tagsection_name_tag = section.name_tag
2865 self.UpdateStoredDataUpdateStoredData()
2866
2867
2869 """
2870 Class that is the children of UVCCalibrated and combine the class SteelIShape (section) to retrieve the information needed
2871 for the material model of the flange (often used fo the entire section).
2872
2873 @param UVCCalibrated: Parent class.
2874 """
2875 def __init__(self, ID: int, section: SteelIShape, calibration = 'S355J2_HEB500_flange'):
2876 """
2877 Constructor of the class.
2878
2879 @param ID (int): Unique material model ID.
2880 @param section (SteelIShape): SteelIShape section object.
2881 @param calibration (str, optional): Label of the calibration parameter set. The options are listed in UVCCalibrated.
2882 Defaults to 'S355J2_HEB500_flange'. Change it accordingly to the steel rebars material properties.
2883 """
2884 self.sectionsection = deepcopy(section)
2885 super().__init__(ID, calibration, section.Fy, section.E)
2886 self.section_name_tagsection_name_tagsection_name_tag = section.name_tag
2887 self.UpdateStoredDataUpdateStoredData()
2888
2889
2891 """
2892 Class that is the children of UVCCalibrated and combine the class SteelIShape (section) to retrieve the information needed
2893 for the material model of the web.
2894
2895 @param UVCCalibrated: Parent class.
2896 """
2897 def __init__(self, ID: int, section: SteelIShape, calibration = 'S355J2_HEB500_web'):
2898 """
2899 Constructor of the class.
2900
2901 @param ID (int): Unique material model ID.
2902 @param section (SteelIShape): SteelIShape section object.
2903 @param calibration (str, optional): Label of the calibration parameter set. The options are listed in UVCCalibrated.
2904 Defaults to 'S355J2_HEB500_web'. Change it accordingly to the steel rebars material properties.
2905 """
2906 self.sectionsection = deepcopy(section)
2907 super().__init__(ID, calibration, section.Fy_web, section.E)
2908 self.section_name_tagsection_name_tagsection_name_tag = section.name_tag
2909 self.UpdateStoredDataUpdateStoredData()
2910
2911
2912# Public functions
2913def Concrete04Funct(fc, discretized_eps, ec, Ec):
2914 """
2915 Function with the equation of the curve of the confined and unconfined concrete (Popovics 1973).
2916
2917 @param fc (float): Compressive concrete yield stress (negative).
2918 @param discretized_eps (float): Variable strain.
2919 @param ec (float): Compressive concrete yield strain (negative).
2920 @param Ec (float): Concrete Young modulus.
2921
2922 @returns float: Stress in function of variable strain.
2923 """
2924 x = discretized_eps/ec
2925 r = Ec / (Ec - fc/ec)
2926 return fc*x*r / (r-1+x**r)
2927
2928
2929def PlotConcrete04(fc, Ec, ec, ecu, Type: str, ax, ID = 0):
2930 """
2931 Function that plots the confined/unconfined Concrete04 stress-strain curve.
2932
2933 @param fc (float): Compressive concrete yield strength (needs to be negative).
2934 @param Ec (float): Young modulus.
2935 @param ec (float): Compressive concrete yield strain.
2936 @param ecu (float): Compressive concrete failure strain (negative).
2937 @param Type (str): Type of concrete (confined = 'C', unconfined = 'U')
2938 @param ax (matplotlib.axes._subplots.AxesSubplot): The figure's wrapper.
2939 @param ID (int, optional): ID of the material model. Defaults to 0 (= not defined).
2940
2941 @exception NameError:
2942
2943 Example: to create the plot, call this line to pass the correct ax:
2944 fig, ax = plt.subplots()
2945 """
2946 if Type == "C":
2947 name = "Confined (Co04)"
2948 elif Type == "U":
2949 name = "Unconfined (Co04)"
2950 else:
2951 raise NameError("Type should be C or U (ID={})".format(ID))
2952
2953 # Data for plotting
2954 N = 1000
2955 x_axis = np.zeros(N)
2956 y_axis = np.zeros(N)
2957 for i in range(N):
2958 x_axis[i] = i/N*ecu
2959 y_axis[i] = Concrete04Funct(fc, x_axis[i], ec, Ec)
2960
2961
2962 ax.plot(x_axis*100.0, y_axis/MPa_unit, 'k-', label = name)
2963 ax.set(xlabel='Strain [%]', ylabel='Stress [MPa]',
2964 title='Mander 1988 (Concrete04) material model (ID={})'.format(ID))
2965 plt.legend()
2966 plt.grid()
2967
2968
2969def Concrete01Funct(fc, ec, fpcu, ecu, discretized_eps):
2970 """
2971 Function with the equation of the curve of the Concrete01 model.
2972 For more information, see Kent-Scott-Park concrete material object with
2973 degraded linear unloading/reloading stiffness according to the work of Karsan-Jirsa and no tensile strength.
2974
2975 @param fc (float): Compressive concrete yield stress (negative).
2976 @param ec (float): Compressive concrete yield strain (negative).
2977 @param fpcu (float): Concrete crushing strength (negative).
2978 @param ecu (float): Concrete strain at crushing strength (negative).
2979 @param discretized_eps (float): Variable strain.
2980
2981 @returns float: Stress in function of variable strain.
2982 """
2983 if discretized_eps > ec:
2984 eta = discretized_eps/ec;
2985 return fc*(2*eta-eta*eta);
2986 else:
2987 Ttangent = (fc-fpcu)/(ec-ecu)
2988 return fc + Ttangent*(discretized_eps-ec);
2989
2990
2991def PlotConcrete01(fc, ec, fpcu, ecu, ax, ID = 0):
2992 """
2993 Function that plots the Concrete01 stress-strain curve.
2994
2995 @param fc (float): Compressive concrete yield stress (negative).
2996 @param ec (float): Compressive concrete yield strain (negative).
2997 @param fpcu (float): Concrete crushing strength (negative).
2998 @param ecu (float): Concrete strain at crushing strength (negative).
2999 @param ax (matplotlib.axes._subplots.AxesSubplot): The figure's wrapper.
3000 @param ID (int, optional): ID of the material model. Defaults to 0 (= not defined).
3001
3002 Example: to create the plot, call this line to pass the correct ax:
3003 fig, ax = plt.subplots()
3004 """
3005
3006 # Data for plotting
3007 N = 1000
3008 x_axis = np.zeros(N)
3009 y_axis = np.zeros(N)
3010 for i in range(N):
3011 x_axis[i] = i/N*ecu
3012 y_axis[i] = Concrete01Funct(fc, ec, fpcu, ecu, x_axis[i])
3013
3014
3015 ax.plot(x_axis*100.0, y_axis/MPa_unit, 'k--', label = "Co01")
3016 ax.set(xlabel='Strain [%]', ylabel='Stress [MPa]',
3017 title='Mander 1988 (Concrete01) material model (ID={})'.format(ID))
3018 plt.legend()
3019 plt.grid()
3020
3021
3022# Private functions
3023def _Bilin(ID, Ke, a_s, My_star, theta_p, theta_pc, K, theta_u, rate_det):
3024 """
3025 Private function that generates the material model Bilin.
3026 OpenSeesPy command: \n
3027 uniaxialMaterial("Bilin", IDMat, K, asPos, asNeg, MyPos, MyNeg, LS, LK, LA, LD, cS, cK, cA, cD, th_pP, th_pN, th_pcP, th_pcN, ResP, ResN, th_uP, th_uN, DP, DN) \n
3028 Parameters (see OpenSeesPy documentation for more information): \n
3029 ID Material Identification (integer)
3030 K Initial stiffness after the modification for n (see Ibarra and Krawinkler, 2005)
3031 asPos Strain hardening ratio after n modification (see Ibarra and Krawinkler, 2005)
3032 asNeg Strain hardening ratio after n modification (see Ibarra and Krawinkler, 2005)
3033 MyPos Positive yield moment (with sign)
3034 MyNeg Negative yield moment (with sign)
3035 LS = 1000 Basic strength deterioration parameter (see Lignos and Krawinkler, 2009) (a very large # = no cyclic deterioration)
3036 LK = 1000 Unloading stiffness deterioration parameter (see Lignos and Krawinkler, 2009) (a very large # = no cyclic deterioration)
3037 LA = 1000 Accelerated reloading stiffness deterioration parameter (see Lignos and Krawinkler, 2009) (a very large # = no cyclic deterioration)
3038 LD = 1000 Post-capping strength deterioration parameter (see Lignos and Krawinkler, 2009) (a very large # = no cyclic deterioration)
3039 cS = 1 Exponent for basic strength deterioration (c = 1.0 for no deterioration)
3040 cK = 1 Exponent for unloading stiffness deterioration (c = 1.0 for no deterioration)
3041 cA = 1 Exponent for accelerated reloading stiffness deterioration (c = 1.0 for no deterioration)
3042 cD = 1 Exponent for post-capping strength deterioration (c = 1.0 for no deterioration)
3043 th_pP Plastic rotation capacity for positive loading direction (exemple 0.025)
3044 th_pN Plastic rotation capacity for negative loading direction (exemple 0.025)
3045 th_pcP Post-capping rotation capacity for positive loading direction (exemple 0.3)
3046 th_pcN Post-capping rotation capacity for negative loading direction (exemple 0.3)
3047 KP Residual strength ratio for positive loading direction (exemple 0.4)
3048 KN Residual strength ratio for negative loading direction (exemple 0.4)
3049 th_uP Ultimate rotation capacity for positive loading direction (exemple 0.4)
3050 th_uN Ultimate rotation capacity for negative loading direction (exemple 0.4)
3051 rateDetP Rate of cyclic deterioration for positive loading direction (exemple 1.0)
3052 rateDetN Rate of cyclic deterioration for negative loading direction (exemple 1.0)
3053 """
3054 uniaxialMaterial("Bilin", ID, Ke, a_s, a_s, My_star, -1.0*My_star, 1., 1., 1., 1., 1., 1., 1., 1., theta_p, theta_p, theta_pc, theta_pc,
3055 K, K, theta_u, theta_u, rate_det, rate_det)
3056
3057
3058def _Hysteretic(ID, M1, gamma1, M2, gamma2, M3, gamma3, pinchx, pinchy, dmg1, dmg2, beta):
3059 """
3060 Private function that generates the material model Hysteretic.
3061 OpenSeesPy command: \n
3062 uniaxialMaterial('Hysteretic', matTag, *p1, *p2, *p3=p2, *n1, *n2, *n3=n2, pinchX, pinchY, damage1, damage2, beta=0.0) \n
3063 Parameters (see OpenSeesPy documentation for more information): \n
3064 matTag integer tag identifying material
3065 p1 stress and strain (or force & deformation) at first point of the envelope in the positive direction
3066 p2 stress and strain (or force & deformation) at second point of the envelope in the positive direction
3067 p3 stress and strain (or force & deformation) at third point of the envelope in the positive direction (optional)
3068 n1 stress and strain (or force & deformation) at first point of the envelope in the negative direction
3069 n2 stress and strain (or force & deformation) at second point of the envelope in the negative direction
3070 n3 stress and strain (or force & deformation) at third point of the envelope in the negative direction (optional)
3071 pinchX pinching factor for strain (or deformation) during reloading
3072 pinchY pinching factor for stress (or force) during reloading
3073 damage1 damage due to ductility: D1(mu-1)
3074 damage2 damage due to energy: D2(Eii/Eult)
3075 beta power used to determine the degraded unloading stiffness based on ductility, mu-beta (optional, default=0.0)
3076 """
3077 uniaxialMaterial("Hysteretic", ID, M1, gamma1, M2, gamma2, M3, gamma3, -M1, -gamma1, -M2, -gamma2, -M3, -gamma3,
3078 pinchx, pinchy, dmg1, dmg2, beta)
3079
3080
3081def _Concrete04(ID, fc, ec, ecu, Ec, fct, et, beta):
3082 """
3083 Private function that generates the material model Concrete04 Popovics Concrete material model.
3084 OpenSeesPy command: \n
3085 uniaxialMaterial("Concrete04", matTag, fc, ec, ecu, Ec, <fct et> <beta>) \n
3086 Parameters (see OpenSeesPy documentation for more information): \n
3087 matTag integer tag identifying material
3088 fc floating point values defining concrete compressive strength at 28 days (compression is negative)*
3089 ec floating point values defining concrete strain at maximum strength*
3090 ecu floating point values defining concrete strain at crushing strength*
3091 Ec floating point values defining initial stiffness**
3092 fct floating point value defining the maximum tensile strength of concrete
3093 et floating point value defining ultimate tensile strain of concrete
3094 beta loating point value defining the exponential curve parameter to define the residual stress (as a factor of ft) at etu
3095 """
3096 uniaxialMaterial("Concrete04", ID, fc, ec, ecu, Ec, fct, et, beta)
3097
3098
3099def _Concrete01(ID, ec, fc, ecu, fpcu = 0.0):
3100 """
3101 Private function that generates the material model Concrete02 concrete material model.
3102 OpenSeesPy command: \n
3103 uniaxialMaterial('Concrete01', matTag, fpc, epsc0, fpcu, epsU) \n
3104 Parameters (see OpenSeesPy documentation for more information): \n
3105 matTag integer tag identifying material
3106 fpc concrete compressive strength at 28 days (compression is negative)*
3107 epsc0 concrete strain at maximum strength*
3108 fpcu concrete crushing strength *
3109 epsU concrete strain at crushing strength*
3110 """
3111 uniaxialMaterial('Concrete01', ID, fc, ec, fpcu, ecu)
3112
3113
3114def _Steel01(ID, fy, Ey, b):
3115 """
3116 Private function that generates the material model Steel01 uniaxial bilinear steel material
3117 with kinematic hardening and optional isotropic hardening described by a non-linear evolution equation.
3118 OpenSeesPy command: \n
3119 uniaxialMaterial('Steel01', matTag, Fy, E0, b, a1, a2, a3, a4) \n
3120 Parameters (see OpenSeesPy documentation for more information): \n
3121 matTag integer tag identifying material
3122 Fy yield strength
3123 E0 initial elastic tangent
3124 b strain-hardening ratio (ratio between post-yield tangent and initial elastic tangent)
3125 a1 isotropic hardening parameter, increase of compression yield envelope as proportion of yield strength after a plastic strain of a2*(Fy/E0). (optional)
3126 a2 isotropic hardening parameter (see explanation under a1). (optional).
3127 a3 isotropic hardening parameter, increase of tension yield envelope as proportion of yield strength after a plastic strain of a4*(Fy/E0). (optional)
3128 a4 isotropic hardening parameter (see explanation under a3). (optional)
3129 """
3130 uniaxialMaterial("Steel01", ID, fy, Ey, b)
3131
3132
3133def _Steel02(ID, fy, Ey, b, R0, cR1, cR2, a1, a2, a3, a4):
3134 """
3135 Private function that generates the material model Steel02 uniaxial Giuffre-Menegotto-Pinto steel material with isotropic strain hardening.
3136 OpenSeesPy command: \n
3137 uniaxialMaterial('Steel02', matTag, Fy, E, b, R0, cR1, cR2, a1, a2, a3, a4, sigInit) \n
3138 Parameters (see OpenSeesPy documentation for more information): \n
3139 matTag Integer tag identifying material
3140 Fy Yield strength
3141 E0 Initial elastic tangent
3142 b Strain-hardening ratio (ratio between post-yield tangent and initial elastic tangent)
3143 R0 CR1 CR2 Parameters to control the transition from elastic to plastic branches.
3144 a1 Isotropic hardening parameter, increase of compression yield envelope as proportion of yield strength after a plastic strain of a2*(Fy/E0). (optional)
3145 a2 Isotropic hardening parameter (see explanation under a1). (optional default = 1.0).
3146 a3 Isotropic hardening parameter, increase of tension yield envelope as proportion of yield strength after a plastic strain of a4*(Fy/E0). (optional default = 0.0)
3147 a4 Isotropic hardening parameter (see explanation under a3). (optional default = 1.0)
3148 sigInit Initial Stress Value (optional, default: 0.0) the strain is calculated from epsP=sigInit/E
3149 if (sigInit!= 0.0) { double epsInit = sigInit/E; eps = trialStrain+epsInit; } else eps = trialStrain;
3150 """
3151 uniaxialMaterial('Steel02', ID, fy, Ey, b, R0, cR1, cR2, a1, a2, a3, a4)
3152
3153
3154def _UVCuniaxial(ID, Ey, fy, QInf, b, DInf, a, N, cK, gammaK):
3155 """
3156 Private function that generates the material model Updated Voce-Chaboche (UVC) material for uniaxial stress states.
3157 This material is a refined version of the classic nonlinear isotropic/kinematic hardening material model based on the Voce
3158 isotropic hardening law and the Chaboche kinematic hardening law.
3159 The UVC model contains an updated isotropic hardening law, with parameter constraints, to simulate the permanent decrease
3160 in yield stress with initial plastic loading associated with the discontinuous yielding phenomenon in mild steels.
3161 OpenSeesPy command: \n
3162 uniaxialMaterial('UVCuniaxial', matTag, E, fy, QInf, b, DInf, a, N, C1, gamma1, <C2 gamma2 C3 gamma3 … C8 gamma8>) \n
3163 Parameters (see OpenSeesPy documentation for more information): \n
3164 matTag Integer tag identifying the material.
3165 E Elastic modulus of the steel material.
3166 fy Initial yield stress of the steel material.
3167 QInf Maximum increase in yield stress due to cyclic hardening (isotropic hardening).
3168 b Saturation rate of QInf, b > 0.
3169 DInf Decrease in the initial yield stress, to neglect the model updates set DInf = 0.
3170 a Saturation rate of DInf, a > 0. If DInf == 0, then a is arbitrary (but still a > 0).
3171 N Number of backstresses to define, N >= 1.
3172 cK Kinematic hardening parameter associated with backstress component k (vector).
3173 gammaK Saturation rate of kinematic hardening associated with backstress component k (vector).
3174 """
3175 backstresses = []
3176 for ii in range(N):
3177 backstresses.append(cK[ii])
3178 backstresses.append(gammaK[ii])
3179 uniaxialMaterial('UVCuniaxial', ID, Ey, fy, QInf, b, DInf, a, N, *backstresses)
3180
Class that is the children of ConfMander1988Circ and combine the class RCCircShape (section) to retri...
def __init__(self, int ID, RCCircShape section, ec=1, ecp=1, fct=-1, et=-1, esu=-1, beta=0.1)
Constructor of the class.
Class that stores funcions and material properties of a RC circular section with Mander 1988 as the m...
def CheckApplicability(self)
Implementation of the homonym abstract method.
def Concrete04(self)
Generate the material model Concrete04 for circular section confined concrete (Mander 1988).
def ReInit(self, ec=1, ecp=1, fct=-1, et=-1)
Implementation of the homonym abstract method.
def Compute_et(self)
Method that computes the tensile concrete yield strain.
def ShowInfo(self, plot=False, block=False, concrete04=True)
Implementation of the homonym abstract method.
def Concrete01(self)
Generate the material model Concrete01 for rectangular section confined concrete (Mander 1988).
def Compute_fct(self)
Method that computes the tensile concrete yield stress.
def Compute_ec(self)
Method that computes the compressive concrete yield strain.
def Compute_ecc(self)
Method that computes the compressive confined concrete yield strain.
def UpdateStoredData(self)
Implementation of the homonym abstract method.
def Compute_ecu(self)
Method that computes the compressive concrete failure strain.
def __init__(self, int ID, bc, Ac, fc, Ec, nr_bars, D_bars, s, D_hoops, rho_s_vol, fs, ec=1, ecp=1, fct=-1, et=-1, esu=-1, beta=0.1)
Constructor of the class.
def Compute_ecp(self)
Method that computes the compressive concrete spalling strain.
def Compute_eccu(self)
Method that computes the compressive confined concrete failure strain.
Class that is the children of ConfMander1988Rect and combine the class RCRectShape (section) to retri...
def __init__(self, int ID, RCRectShape section, ec=1, ecp=1, fct=-1, et=-1, esu=-1, beta=0.1)
Constructor of the class.
Class that stores funcions and material properties of a RC rectangular section with Mander 1988 as th...
def CheckApplicability(self)
Implementation of the homonym abstract method.
def Concrete04(self)
Generate the material model Concrete04 for rectangular section confined concrete (Mander 1988).
def ReInit(self, ec=1, ecp=1, fct=-1, et=-1)
Implementation of the homonym abstract method.
def Compute_et(self)
Method that computes the tensile concrete yield strain.
def ShowInfo(self, plot=False, block=False, concrete04=True)
Implementation of the homonym abstract method.
def Concrete01(self)
Generate the material model Concrete01 for rectangular section confined concrete (Mander 1988).
def Compute_fct(self)
Method that computes the tensile concrete yield stress.
def ComputeAi(self)
Method that computes the ineffectual area.
def Compute_ec(self)
Method that computes the compressive concrete yield strain.
def __init__(self, int ID, bc, dc, Ac, fc, Ec, nr_bars, D_bars, np.ndarray wx_top, np.ndarray wx_bottom, np.ndarray wy, s, D_hoops, rho_s_x, rho_s_y, fs, ec=1, ecp=1, fct=-1, et=-1, esu=-1, beta=0.1)
Constructor of the class.
def Compute_ecc(self)
Method that computes the compressive confined concrete yield strain.
def UpdateStoredData(self)
Implementation of the homonym abstract method.
def Compute_ecu(self)
Method that computes the compressive concrete failure strain.
def Compute_ecp(self)
Method that computes the compressive concrete spalling strain.
def ComputeConfinementFactor(self)
Method that computes the confinement factor using the digitized table from Mander et Al.
def Compute_eccu(self)
Method that computes the compressive confined concrete failure strain.
Class that is the children of GMP1970 and combine the class RCRectShape (section) to retrieve the inf...
def __init__(self, int ID, RCRectShape section, b=0.02, R0=20.0, cR1=0.9, cR2=0.08, a1=0.039, a2=1.0, a3=0.029, a4=1.0)
Constructor of the class.
Class that stores funcions and material properties of the vertical steel reinforcement bars with Giuf...
def CheckApplicability(self)
Implementation of the homonym abstract method.
def ShowInfo(self)
Implementation of the homonym abstract method.
def UpdateStoredData(self)
Implementation of the homonym abstract method.
def ReInit(self)
Implementation of the homonym abstract method.
def Steel02(self)
Generate the material model Steel02 uniaxial Giuffre-Menegotto-Pinto steel material with isotropic st...
def __init__(self, int ID, fy, Ey, b=0.02, R0=20, cR1=0.9, cR2=0.08, a1=0.039, a2=1.0, a3=0.029, a4=1.0)
Constructor of the class.
Class that is the children of Gupta1999 and combine the class SteelIShape (section) to retrieve the i...
def __init__(self, int ID, SteelIShape col, SteelIShape beam, t_dp=0.0, a_s=0.03, pinchx=0.25, pinchy=0.75, dmg1=0.0, dmg2=0.0, beta=0.0, safety_factor=False)
Constructor of the class.
Class that stores funcions and material properties of a steel double symmetric I-shape profile with G...
def CheckApplicability(self)
Implementation of the homonym abstract method.
def ShowInfo(self, plot=False, block=False)
Implementation of the homonym abstract method.
def UpdateStoredData(self)
Implementation of the homonym abstract method.
def __init__(self, int ID, d_c, bf_c, tf_c, I_c, d_b, tf_b, Fy, E, t_p, t_dp=0.0, a_s=0.03, pinchx=0.25, pinchy=0.75, dmg1=0.0, dmg2=0.0, beta=0.0, safety_factor=False)
Constructor of the class.
def ReInit(self)
Implementation of the homonym abstract method.
def Hysteretic(self)
Generate the material model Hysteretic (Gupta 1999) using the computed parameters.
Parent abstract class for the storage and manipulation of a material model's information (mechanical ...
def CheckApplicability(self)
Abstract function used to check the applicability of the material model.
Class that is the children of ModifiedIMK and combine the class SteelIShape (section) to retrieve the...
def __init__(self, ID, SteelIShape section, N_G=0, K_factor=3, L_0=-1, L_b=-1, Mc=-1, K=-1, theta_u=-1, safety_factors=False)
Constructor of the class.
Class that stores funcions and material properties of a steel double symmetric I-shape profile with m...
def ComputeMyStar(self)
Method that computes the effective yield moment.
def CheckApplicability(self)
Implementation of the homonym abstract method.
def Computea(self)
Method that computes the strain hardening ratio with the n modification.
def ComputeRefEnergyDissipationCap(self)
Method that computes the reference energy dissipation capacity.
def ShowInfo(self, plot=False, block=False)
Implementation of the homonym abstract method.
def Bilin(self)
Generate the material model Bilin (Modified IMK) using the computed parameters.
def UpdateStoredData(self)
Implementation of the homonym abstract method.
def __init__(self, int ID, str Type, d, bf, tf, tw, h_1, Iy_mod, iz, E, Fy, Npl, My, L, N_G=0, K_factor=3, L_0=-1, L_b=-1, Mc=-1, K=-1, theta_u=-1, safety_factors=False)
Constructor of the class.
def ComputeTheta_p(self)
Method that computes the plastic rotation.
def ComputeKe(self)
Method that computes the elastic stiffness.
def ComputeK(self)
Method that computes the residual strength ratio.
def Computea_s(self)
Method that computes the modified strain hardening ratio for the spring.
def ComputeTheta_u(self)
Method that computes the ultimate rotation.
def ComputeMc(self)
Method that computes the capping moment.
def ComputeTheta_y(self)
Method that computes the yield rotation.
def ReInit(self, Mc=-1, K=-1, theta_u=-1)
Implementation of the homonym abstract method.
def ComputeTheta_pc(self)
Method that computes the post capping rotation.
WIP: Class that is the children of Skiadopoulos2021 and it's used for the panel zone spring in a RCS ...
def __init__(self, int ID, SteelIShape beam, d_col, t_fbp=0, t_dp=0, a_s=0.03, pinchx=0.25, pinchy=0.75, dmg1=0, dmg2=0, beta=0, safety_factor=False)
Constructor of the class.
Class that is the children of Skiadopoulos2021 and combine the class SteelIShape (section) to retriev...
def __init__(self, int ID, SteelIShape col, SteelIShape beam, t_dp=0, a_s=0.03, pinchx=0.25, pinchy=0.75, dmg1=0, dmg2=0, beta=0, safety_factor=False, t_fbp=0)
Constructor of the class.
Class that stores funcions and material properties of a steel double symmetric I-shape profile with S...
def CheckApplicability(self)
Implementation of the homonym abstract method.
def ShowInfo(self, plot=False, block=False)
Implementation of the homonym abstract method.
def UpdateStoredData(self)
Implementation of the homonym abstract method.
def ReInit(self)
Implementation of the homonym abstract method.
def Hysteretic(self)
Generate the material model Hysteretic (Skiadopoulos 2021) using the computed parameters.
def __init__(self, int ID, d_c, bf_c, tf_c, I_c, d_b, tf_b, Fy, E, t_p, t_dp=0.0, a_s=0.03, pinchx=0.25, pinchy=0.75, dmg1=0.0, dmg2=0.0, beta=0.0, safety_factor=False, t_fbp=0)
Constructor of the class.
Class that is the children of UVCCalibrated and combine the class RCCircShape (section) to retrieve t...
def __init__(self, int ID, RCCircShape section, calibration='S460NL_25mm_plate')
Constructor of the class.
Class that is the children of UVCCalibrated and combines the class RCRectShape (section) to retrieve ...
def __init__(self, int ID, RCRectShape section, calibration='S460NL_25mm_plate')
Constructor of the class.
Class that is the children of UVCCalibrated and combine the class SteelIShape (section) to retrieve t...
def __init__(self, int ID, SteelIShape section, calibration='S355J2_HEB500_flange')
Constructor of the class.
Class that is the children of UVCCalibrated and combine the class SteelIShape (section) to retrieve t...
def __init__(self, int ID, SteelIShape section, calibration='S355J2_HEB500_web')
Constructor of the class.
Class that is the children of UVC that retrieve calibrated parameters from UVC_calibrated_parameters....
def __init__(self, int ID, str calibration, fy=-1, E=-1)
Constructor of the class.
Class that stores funcions and material properties of a steel profile or reinforcing bar with Updated...
def CheckApplicability(self)
Implementation of the homonym abstract method.
def UVCuniaxial(self)
Generate the material model Updated Voce-Chaboche (UVC) for uniaxial stress states.
def ShowInfo(self)
Implementation of the homonym abstract method.
def UpdateStoredData(self)
Implementation of the homonym abstract method.
def ReInit(self)
Implementation of the homonym abstract method.
def __init__(self, int ID, fy, Ey, QInf, b, DInf, a, np.ndarray cK, np.ndarray gammaK)
Constructor of the class.
Class that is the children of UnconfMander1988 and combine the class RCCircShape (section) to retriev...
def __init__(self, int ID, RCCircShape section, ec=1, ecp=1, fct=-1, et=-1, beta=0.1)
Constructor of the class.
Class that is the children of UnconfMander1988 and combine the class RCRectShape (section) to retriev...
def __init__(self, int ID, RCRectShape section, ec=1, ecp=1, fct=-1, et=-1, beta=0.1)
Constructor of the class.
Class that stores funcions and material properties of a RC rectangular or circular section with Mande...
def CheckApplicability(self)
Implementation of the homonym abstract method.
def Concrete04(self)
Generate the material model Concrete04 for unconfined concrete (Mander 1988) using the computed param...
def ReInit(self, ec=1, ecp=1, fct=-1, et=-1)
Implementation of the homonym abstract method.
def Compute_et(self)
Method that computes the tensile concrete yield strain.
def ShowInfo(self, plot=False, block=False, concrete04=True)
Implementation of the homonym abstract method.
def Concrete01(self)
Generate the material model Concrete01 for unconfined concrete using the computed parameters.
def Compute_fct(self)
Method that computes the tensile concrete yield stress.
def Compute_ec(self)
Method that computes the compressive concrete yield strain.
def UpdateStoredData(self)
Implementation of the homonym abstract method.
def Compute_ecu(self)
Method that computes the compressive concrete failure strain.
def __init__(self, int ID, fc, Ec, ec=1, ecp=1, fct=-1, et=-1, beta=0.1)
Constructor of the class.
def Compute_ecp(self)
Method that computes the compressive concrete spalling strain.
Class that is the children of UniaxialBilinear and combine the class SteelIShape (section) to retriev...
def __init__(self, int ID, SteelIShape section, b=0.01)
Constructor of the class.
Class that stores funcions and material properties of a simple uniaxial bilinear model with the OpenS...
def CheckApplicability(self)
Implementation of the homonym abstract method.
def ShowInfo(self, plot=False, block=False)
Implementation of the homonym abstract method.
def UpdateStoredData(self)
Implementation of the homonym abstract method.
def ReInit(self)
Implementation of the homonym abstract method.
def Steel01(self)
Generate the material model Steel01 uniaxial bilinear material model.
def __init__(self, int ID, fy, Ey, b=0.01)
Constructor of the class.
Module with the parent abstract class DataManagement.
def Concrete01Funct(fc, ec, fpcu, ecu, discretized_eps)
Function with the equation of the curve of the Concrete01 model.
def PlotConcrete04(fc, Ec, ec, ecu, str Type, ax, ID=0)
Function that plots the confined/unconfined Concrete04 stress-strain curve.
def Concrete04Funct(fc, discretized_eps, ec, Ec)
Function with the equation of the curve of the confined and unconfined concrete (Popovics 1973).
def PlotConcrete01(fc, ec, fpcu, ecu, ax, ID=0)
Function that plots the Concrete01 stress-strain curve.