structuralcodes 0.3.0__py3-none-any.whl → 0.4.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of structuralcodes might be problematic. Click here for more details.

@@ -5,6 +5,7 @@ import warnings
5
5
 
6
6
  from structuralcodes.codes import mc2010
7
7
 
8
+ from ..constitutive_laws import ConstitutiveLaw, create_constitutive_law
8
9
  from ._concrete import Concrete
9
10
 
10
11
 
@@ -18,7 +19,6 @@ class ConcreteMC2010(Concrete):
18
19
  _fctkmin: t.Optional[float] = None
19
20
  _fctkmax: t.Optional[float] = None
20
21
  _Gf: t.Optional[float] = None
21
- _Eci: t.Optional[float] = None
22
22
  _alpha_cc: t.Optional[float] = None
23
23
  _eps_c1: t.Optional[float] = None
24
24
  _eps_cu1: t.Optional[float] = None
@@ -35,8 +35,33 @@ class ConcreteMC2010(Concrete):
35
35
  name: t.Optional[str] = None,
36
36
  density: float = 2400.0,
37
37
  gamma_c: t.Optional[float] = None,
38
- existing: bool = False,
39
38
  alpha_cc: t.Optional[float] = None,
39
+ constitutive_law: t.Optional[
40
+ t.Union[
41
+ t.Literal[
42
+ 'elastic',
43
+ 'parabolarectangle',
44
+ 'bilinearcompression',
45
+ 'sargin',
46
+ 'popovics',
47
+ ],
48
+ ConstitutiveLaw,
49
+ ]
50
+ ] = 'parabolarectangle',
51
+ fcm: t.Optional[float] = None,
52
+ fctm: t.Optional[float] = None,
53
+ fctkmin: t.Optional[float] = None,
54
+ fctkmax: t.Optional[float] = None,
55
+ Eci: t.Optional[float] = None,
56
+ Gf: t.Optional[float] = None,
57
+ eps_c1: t.Optional[float] = None,
58
+ eps_cu1: t.Optional[float] = None,
59
+ k_sargin: t.Optional[float] = None,
60
+ eps_c2: t.Optional[float] = None,
61
+ eps_cu2: t.Optional[float] = None,
62
+ n_parabolic_rectangular: t.Optional[float] = None,
63
+ eps_c3: t.Optional[float] = None,
64
+ eps_cu3: t.Optional[float] = None,
40
65
  **kwargs,
41
66
  ):
42
67
  """Initializes a new instance of Concrete for MC 2010.
@@ -49,11 +74,49 @@ class ConcreteMC2010(Concrete):
49
74
  name (Optional(str)): A descriptive name for concrete.
50
75
  density (float): Density of material in kg/m3 (default: 2400).
51
76
  gamma_c (Optional(float)): The partial factor for concrete.
52
- existing (bool): The material is of an existing structure
53
- (default: False).
54
77
  alpha_cc (float, optional): A factor for considering long-term
55
78
  effects on the strength, and effects that arise from the way
56
79
  the load is applied.
80
+ fcm (float, optional): The mean compressive strength.
81
+ fctm (float, optional): The mean tensile strength.
82
+ fctkmin (float, optional): The minimum tensile strength.
83
+ fctkmax (float, optional): The maximum tensile strength.
84
+ Eci (float, optional): The initial tangent Young's modulus.
85
+ Gf (float, optional): The tensile fracture energy.
86
+ eps_c1 (float, optional): The strain at peak stress for the Sargin
87
+ constitutive law.
88
+ eps_cu1 (float, optional): The ultimate strain for the Sargin
89
+ constitutive law.
90
+ k_sargin (float, optional): The coefficient for the Sargin
91
+ constitutive law.
92
+ eps_c2 (float, optional): The strain at peak stress for the
93
+ parabolic rectangular constitutive law.
94
+ eps_cu2 (float, optional): The ultimate strain for the parabolic
95
+ rectangular constitutive law.
96
+ n_parabolic_rectangular (float, optional): The coefficient for the
97
+ parabolic rectangular constitutive law.
98
+ eps_c3 (float, optional): The strain at peak stress for the
99
+ bilinear constitutive law.
100
+ eps_cu3 (float, optional): The ultimate strain for the bilinear
101
+ constitutive law.
102
+
103
+ Raises:
104
+ ValueError: If fcm is lower than fck.
105
+ ValueError: If k_sargin is negative.
106
+ ValueError: If n_parabolic_rectangular is negative.
107
+ ValueError: If the constitutive law name is not available for the
108
+ material.
109
+ ValueError: If the provided constitutive law is not valid for
110
+ concrete.
111
+ Warning: If Eci is lower than 1e4 or larger than 1e5.
112
+ Warning: If fctm is larger than 0.5 * fck.
113
+ Warning: If eps_c1 is larger than 0.1.
114
+ Warning: If eps_cu1 is larger than 0.1.
115
+ Warning: If eps_c2 is larger than 0.1.
116
+ Warning: If eps_cu2 is larger than 0.1.
117
+ Warning: If n_parabolic_rectangular is larger than 5.
118
+ Warning: If eps_c3 is larger than 0.1.
119
+ Warning: If eps_cu3 is larger than 0.1.
57
120
  """
58
121
  del kwargs
59
122
  if name is None:
@@ -62,26 +125,137 @@ class ConcreteMC2010(Concrete):
62
125
  fck=fck,
63
126
  name=name,
64
127
  density=density,
65
- existing=existing,
66
128
  gamma_c=gamma_c,
67
129
  )
68
130
  self._alpha_cc = alpha_cc
131
+ self._fcm = abs(fcm) if fcm is not None else None
132
+ self._fctm = abs(fctm) if fctm is not None else None
133
+ self._fctkmin = abs(fctkmin) if fctkmin is not None else None
134
+ self._fctkmax = abs(fctkmax) if fctkmax is not None else None
135
+ self._Eci = abs(Eci) if Eci is not None else None
136
+ self._Gf = abs(Gf) if Gf is not None else None
137
+ self._eps_c1 = abs(eps_c1) if eps_c1 is not None else None
138
+ self._eps_cu1 = abs(eps_cu1) if eps_cu1 is not None else None
139
+ self._k_sargin = k_sargin if k_sargin is not None else None
140
+ self._eps_c2 = abs(eps_c2) if eps_c2 is not None else None
141
+ self._eps_cu2 = abs(eps_cu2) if eps_cu2 is not None else None
142
+ self._n_parabolic_rectangular = (
143
+ n_parabolic_rectangular
144
+ if n_parabolic_rectangular is not None
145
+ else None
146
+ )
147
+ self._eps_c3 = abs(eps_c3) if eps_c3 is not None else None
148
+ self._eps_cu3 = abs(eps_cu3) if eps_cu3 is not None else None
149
+
150
+ self.__post_init__()
151
+
152
+ # The constitutive law requires valid attributes, so it should be set
153
+ # after validation
154
+ self._constitutive_law = (
155
+ constitutive_law
156
+ if isinstance(constitutive_law, ConstitutiveLaw)
157
+ else create_constitutive_law(
158
+ constitutive_law_name=constitutive_law, material=self
159
+ )
160
+ )
161
+ if 'concrete' not in self._constitutive_law.__materials__:
162
+ raise ValueError(
163
+ 'The provided constitutive law is not valid for concrete.'
164
+ )
165
+
166
+ def __post_init__(self):
167
+ """Validator for the attributes that are set in the constructor."""
168
+ # fcm
169
+ if self._fcm is not None and self._fcm <= self._fck:
170
+ raise ValueError(
171
+ (
172
+ 'Mean compressive strength cannot be lower than',
173
+ 'characteristic strength.\n',
174
+ 'Current characteristing strength: ',
175
+ f'fck = {self._fck}.',
176
+ f'Current value: value = {self._fcm}',
177
+ )
178
+ )
179
+
180
+ # Eci
181
+ if self._Eci is not None and (self._Eci < 1e4 or self._Eci > 1e5):
182
+ warnings.warn(
183
+ 'A suspect value of Eci has been input.\n'
184
+ f'Please check Eci that should be in MPa ({self._Eci} given).'
185
+ )
186
+
187
+ # fctm
188
+ if self._fctm is not None and self._fctm > 0.5 * self._fck:
189
+ warnings.warn(
190
+ 'A suspect value of fctm has been input. Please check.'
191
+ )
192
+
193
+ # eps_c1
194
+ if self._eps_c1 is not None and abs(self._eps_c1) >= 0.1:
195
+ warnings.warn(
196
+ 'A suspect value is input for eps_c1 that should be a pure'
197
+ f' number without units. Please check ({self._eps_c1} given).'
198
+ )
199
+
200
+ # eps_cu1
201
+ if self._eps_cu1 is not None and abs(self._eps_cu1) >= 0.1:
202
+ warnings.warn(
203
+ 'A suspect value is input for eps_cu1 that should be a pure'
204
+ f' number without units. Please check ({self._eps_cu1} given).'
205
+ )
206
+
207
+ # k_sargin
208
+ if self._k_sargin is not None and self._k_sargin < 0:
209
+ raise ValueError(
210
+ f'k_sargin should be a positive value ({self._k_sargin} given)'
211
+ )
212
+
213
+ # eps_c2
214
+ if self._eps_c2 is not None and abs(self._eps_c2) >= 0.1:
215
+ warnings.warn(
216
+ 'A suspect value is input for eps_c2 that should be a pure'
217
+ f' number without units. Please check ({self._eps_c2} given).'
218
+ )
219
+
220
+ # eps_cu2
221
+ if self._eps_cu2 is not None and abs(self._eps_cu2) >= 0.1:
222
+ warnings.warn(
223
+ 'A suspect value is input for eps_cu2 that should be a pure'
224
+ f' number without units. Please check ({self._eps_cu2} given).'
225
+ )
226
+
227
+ # n_parabolic_rectangular
228
+ if (
229
+ self._n_parabolic_rectangular is not None
230
+ and self._n_parabolic_rectangular < 0
231
+ ):
232
+ raise ValueError(
233
+ 'n should be a positive value '
234
+ f'({self._n_parabolic_rectangular} given)'
235
+ )
236
+ if (
237
+ self._n_parabolic_rectangular is not None
238
+ and self._n_parabolic_rectangular >= 5
239
+ ):
240
+ warnings.warn(
241
+ 'A suspect value is input for n_parabolic_rectangular. Please '
242
+ 'check '
243
+ f'({self._n_parabolic_rectangular} given).'
244
+ )
69
245
 
70
- def _reset_attributes(self):
71
- self._fcm = None
72
- self._fctm = None
73
- self._fctkmin = None
74
- self._fctkmax = None
75
- self._Gf = None
76
- self._Eci = None
77
- self._eps_c1 = None
78
- self._eps_cu1 = None
79
- self._k_sargin = None
80
- self._eps_c2 = None
81
- self._eps_cu2 = None
82
- self._n_parabolic_rectangular = None
83
- self._eps_c3 = None
84
- self._eps_cu3 = None
246
+ # eps_c3
247
+ if self._eps_c3 is not None and abs(self._eps_c3) >= 0.1:
248
+ warnings.warn(
249
+ 'A suspect value is input for eps_c3 that should be a pure'
250
+ f' number without units. Please check ({self._eps_c3} given).'
251
+ )
252
+
253
+ # eps_cu3
254
+ if self._eps_cu3 is not None and abs(self._eps_cu3) >= 0.1:
255
+ warnings.warn(
256
+ 'A suspect value is input for eps_cu3 that should be a pure'
257
+ f' number without units. Please check ({self._eps_cu3} given).'
258
+ )
85
259
 
86
260
  @property
87
261
  def fcm(self) -> float:
@@ -89,31 +263,14 @@ class ConcreteMC2010(Concrete):
89
263
 
90
264
  Returns:
91
265
  float: The mean compressive strength in MPa.
92
- """
93
- self._fcm = self._fcm or mc2010.fcm(self._fck)
94
- return self._fcm
95
-
96
- @fcm.setter
97
- def fcm(self, value: float):
98
- """Sets a user defined value for fcm.
99
266
 
100
- Arguments:
101
- value (float): The value of fcm in MPa.
102
-
103
- Raises:
104
- ValueError: If value is lower than fck.
267
+ Note:
268
+ The returned value is derived from fck if fcm is not manually
269
+ provided when initializing the object.
105
270
  """
106
- if abs(value) <= self._fck:
107
- raise ValueError(
108
- (
109
- 'Mean compressive strength cannot be lower than',
110
- 'characteristic strength.\n',
111
- 'Current characteristing strength: ',
112
- f'fck = {self._fck}.',
113
- f'Current value: value = {value}',
114
- )
115
- )
116
- self._fcm = abs(value)
271
+ if self._fcm is None:
272
+ return mc2010.fcm(self._fck)
273
+ return self._fcm
117
274
 
118
275
  @property
119
276
  def Eci(self) -> float:
@@ -121,24 +278,17 @@ class ConcreteMC2010(Concrete):
121
278
  days.
122
279
 
123
280
  It is assumed a normal concrete with quartzite aggregates (alfa_e = 1)
124
- """
125
- self._Eci = self._Eci or mc2010.Eci(self.fcm)
126
- return self._Eci
127
281
 
128
- @Eci.setter
129
- def Eci(self, value: float):
130
- """Sets a user defined value for modulus of elasticity at the concrete
131
- age of 28 days, Eci.
282
+ Returns:
283
+ float: The modulus of elasticity in MPa.
132
284
 
133
- Arguments:
134
- value (float): The value of Eci in MPa.
285
+ Note:
286
+ The returned value is derived from fcm if Eci is not manually
287
+ provided when initializing the object.
135
288
  """
136
- if value < 1e4 or value > 1e5:
137
- warnings.warn(
138
- 'A suspect value of Eci has been input.\n'
139
- 'Please check Eci that should be in MPa ({value} given).'
140
- )
141
- self._Eci = abs(value)
289
+ if self._Eci is None:
290
+ return mc2010.Eci(self.fcm)
291
+ return self._Eci
142
292
 
143
293
  @property
144
294
  def fctm(self) -> float:
@@ -146,22 +296,14 @@ class ConcreteMC2010(Concrete):
146
296
 
147
297
  Returns:
148
298
  float: The mean tensile strength in MPa.
149
- """
150
- self._fctm = self._fctm or mc2010.fctm(self._fck)
151
- return self._fctm
152
-
153
- @fctm.setter
154
- def fctm(self, value: float):
155
- """Sets a user defined value for fctm.
156
299
 
157
- Arguments:
158
- value (float): The value of fctm in MPa.
300
+ Note:
301
+ The returned value is derived from fck if fctm is not manually
302
+ provided when initializing the object.
159
303
  """
160
- if value > 0.5 * self._fck:
161
- warnings.warn(
162
- 'A suspect value of fctm has been input. Please check.'
163
- )
164
- self._fctm = abs(value)
304
+ if self._fctm is None:
305
+ return mc2010.fctm(self._fck)
306
+ return self._fctm
165
307
 
166
308
  @property
167
309
  def fctkmin(self) -> float:
@@ -169,18 +311,14 @@ class ConcreteMC2010(Concrete):
169
311
 
170
312
  Returns:
171
313
  float: The lower bound tensile strength in MPa.
172
- """
173
- self._fctkmin = self._fctkmin or mc2010.fctkmin(self.fctm)
174
- return self._fctkmin
175
-
176
- @fctkmin.setter
177
- def fctkmin(self, value: float):
178
- """Sets a user defined value for fctkmin.
179
314
 
180
- Arguments:
181
- value (float): The value of fctkmin in MPa.
315
+ Note:
316
+ The returned value is derived from fctm if fctkmin is not manually
317
+ provided when initializing the object.
182
318
  """
183
- self._fctkmin = abs(value)
319
+ if self._fctkmin is None:
320
+ return mc2010.fctkmin(self.fctm)
321
+ return self._fctkmin
184
322
 
185
323
  @property
186
324
  def fctkmax(self) -> float:
@@ -188,18 +326,14 @@ class ConcreteMC2010(Concrete):
188
326
 
189
327
  Returns:
190
328
  float: The upper bound tensile strength in MPa.
191
- """
192
- self._fctkmax = self._fctkmax or mc2010.fctkmax(self.fctm)
193
- return self._fctkmax
194
-
195
- @fctkmax.setter
196
- def fctkmax(self, value: float):
197
- """Sets a user defined value for fctkmax.
198
329
 
199
- Arguments:
200
- value (float): The value of fctkmax in MPa.
330
+ Note:
331
+ The returned value is derived from fctm if fctkmax is not manually
332
+ provided when initializing the object.
201
333
  """
202
- self._fctkmax = abs(value)
334
+ if self._fctkmax is None:
335
+ return mc2010.fctkmax(self.fctm)
336
+ return self._fctkmax
203
337
 
204
338
  @property
205
339
  def Gf(self) -> float:
@@ -207,18 +341,14 @@ class ConcreteMC2010(Concrete):
207
341
 
208
342
  Returns:
209
343
  float: The fracture energy in N/m.
210
- """
211
- self._Gf = self._Gf or mc2010.Gf(self._fck)
212
- return self._Gf
213
-
214
- @Gf.setter
215
- def Gf(self, value: float):
216
- """Sets a user defined value for fracture energy Gf.
217
344
 
218
- Arguments:
219
- value (float): The value of Gf in N/m.
345
+ Note:
346
+ The returned value is derived from fck if Gf is not manually
347
+ provided when initializing the object.
220
348
  """
221
- self._Gf = abs(value)
349
+ if self._Gf is None:
350
+ return mc2010.Gf(self._fck)
351
+ return self._Gf
222
352
 
223
353
  @property
224
354
  def gamma_c(self) -> float:
@@ -251,24 +381,14 @@ class ConcreteMC2010(Concrete):
251
381
 
252
382
  Returns:
253
383
  float: The strain at maximum compressive strength of concrete.
254
- """
255
- self._eps_c1 = self._eps_c1 or mc2010.eps_c1(self._fck)
256
- return self._eps_c1
257
384
 
258
- @eps_c1.setter
259
- def eps_c1(self, value: float):
260
- """Sets a user defined value for strain at peak strenght for Sargin
261
- constitutive law.
262
-
263
- Arguments:
264
- value (float): The new value for eps_c1, no units.
385
+ Note:
386
+ The returned value is derived from fck if eps_c1 is not manually
387
+ provided when initializing the object.
265
388
  """
266
- if abs(value) >= 0.1:
267
- warnings.warn(
268
- 'A suspect value is input for eps_c1 that should be a pure'
269
- ' number without units. Plase check ({value} given).'
270
- )
271
- self._eps_c1 = value
389
+ if self._eps_c1 is None:
390
+ return mc2010.eps_c1(self._fck)
391
+ return self._eps_c1
272
392
 
273
393
  @property
274
394
  def eps_cu1(self) -> float:
@@ -276,23 +396,14 @@ class ConcreteMC2010(Concrete):
276
396
 
277
397
  Returns:
278
398
  float: The maximum strength at failure of concrete.
279
- """
280
- self._eps_cu1 = self._eps_cu1 or mc2010.eps_cu1(self._fck)
281
- return self._eps_cu1
282
-
283
- @eps_cu1.setter
284
- def eps_cu1(self, value: float):
285
- """Sets the nominal ultimate strain for Sargin constitutive law.
286
399
 
287
- Arguments:
288
- value (float): The new value for eps_cu1, no units.
400
+ Note:
401
+ The returned value is derived from fck if eps_cu1 is not manually
402
+ provided when initializing the object.
289
403
  """
290
- if abs(value) >= 0.1:
291
- warnings.warn(
292
- 'A suspect value is input for eps_cu1 that should be a pure'
293
- ' number without units. Plase check ({value} given).'
294
- )
295
- self._eps_cu1 = value
404
+ if self._eps_cu1 is None:
405
+ return mc2010.eps_cu1(self._fck)
406
+ return self._eps_cu1
296
407
 
297
408
  @property
298
409
  def k_sargin(self) -> float:
@@ -300,23 +411,14 @@ class ConcreteMC2010(Concrete):
300
411
 
301
412
  Returns:
302
413
  float: The plastic coefficient for Sargin law.
303
- """
304
- self._k_sargin = self._k_sargin or mc2010.k_sargin(self._fck)
305
- return self._k_sargin
306
-
307
- @k_sargin.setter
308
- def k_sargin(self, value: float):
309
- """Sets the the coefficient for Sargin constitutive law.
310
-
311
- Arguments:
312
- value (float): The new value for k, no units.
313
414
 
314
- Raises:
315
- ValueError: If value < 0.
415
+ Note:
416
+ The returned value is derived from fck if k_sargin is not manually
417
+ provided when initializing the object.
316
418
  """
317
- if value < 0:
318
- raise ValueError(f'n should be a positive value ({value} given)')
319
- self._k_sargin = value
419
+ if self._k_sargin is None:
420
+ return mc2010.k_sargin(self._fck)
421
+ return self._k_sargin
320
422
 
321
423
  @property
322
424
  def eps_c2(self) -> float:
@@ -325,24 +427,14 @@ class ConcreteMC2010(Concrete):
325
427
 
326
428
  Returns:
327
429
  float: The strain at maximum compressive strength of concrete.
328
- """
329
- self._eps_c2 = self._eps_c2 or mc2010.eps_c2(self.fck)
330
- return self._eps_c2
331
430
 
332
- @eps_c2.setter
333
- def eps_c2(self, value: float):
334
- """Sets the strain at maximum compressive strength of concrete (fcd)
335
- for the Parabola-rectangle constitutive law.
336
-
337
- Arguments:
338
- value (float): The new value for eps_c2, no units.
431
+ Note:
432
+ The returned value is derived from fck if eps_c2 is not manually
433
+ provided when initializing the object.
339
434
  """
340
- if abs(value) >= 0.1:
341
- warnings.warn(
342
- 'A suspect value is input for eps_c2 that should be a pure'
343
- ' number without units. Plase check ({value} given).'
344
- )
345
- self._eps_c2 = value
435
+ if self._eps_c2 is None:
436
+ return mc2010.eps_c2(self.fck)
437
+ return self._eps_c2
346
438
 
347
439
  @property
348
440
  def eps_cu2(self) -> float:
@@ -351,24 +443,14 @@ class ConcreteMC2010(Concrete):
351
443
 
352
444
  Returns:
353
445
  float: The maximum strain at failure of concrete.
354
- """
355
- self._eps_cu2 = self._eps_cu2 or mc2010.eps_cu2(self.fck)
356
- return self._eps_cu2
357
446
 
358
- @eps_cu2.setter
359
- def eps_cu2(self, value: float):
360
- """Sets the strain at concrete failure of concrete for the
361
- Parabola-rectangle constitutive law.
362
-
363
- Arguments:
364
- value (float): The new value for eps_cu2, no units.
447
+ Note:
448
+ The returned value is derived from fck if eps_cu2 is not manually
449
+ provided when initializing the object.
365
450
  """
366
- if abs(value) >= 0.1:
367
- warnings.warn(
368
- 'A suspect value is input for eps_cu2 that should be a pure'
369
- ' number without units. Plase check ({value} given).'
370
- )
371
- self._eps_cu2 = value
451
+ if self._eps_cu2 is None:
452
+ return mc2010.eps_cu2(self.fck)
453
+ return self._eps_cu2
372
454
 
373
455
  @property
374
456
  def n_parabolic_rectangular(self) -> float:
@@ -376,31 +458,14 @@ class ConcreteMC2010(Concrete):
376
458
 
377
459
  Returns:
378
460
  float: The exponent for Parabola-recangle law.
379
- """
380
- self._n_parabolic_rectangular = (
381
- self._n_parabolic_rectangular
382
- or mc2010.n_parabolic_rectangular(self.fck)
383
- )
384
- return self._n_parabolic_rectangular
385
461
 
386
- @n_parabolic_rectangular.setter
387
- def n_parabolic_rectangular(self, value: float):
388
- """Sets the coefficient for Parabola-rectangle constitutive law.
389
-
390
- Arguments:
391
- value (float): The new value for n, no units.
392
-
393
- Raises:
394
- ValueError: If value < 0.
462
+ Note:
463
+ The returned value is derived from fck if n is not manually
464
+ provided when initializing the object.
395
465
  """
396
- if value < 0:
397
- raise ValueError(f'n should be a positive value ({value} given)')
398
- if value >= 5:
399
- warnings.warn(
400
- 'A suspect value is input for eps_cu2 that should be a pure'
401
- ' number without units. Plase check ({value} given).'
402
- )
403
- self._n_parabolic_rectangular = value
466
+ if self._n_parabolic_rectangular is None:
467
+ return mc2010.n_parabolic_rectangular(self.fck)
468
+ return self._n_parabolic_rectangular
404
469
 
405
470
  @property
406
471
  def eps_c3(self) -> float:
@@ -409,24 +474,14 @@ class ConcreteMC2010(Concrete):
409
474
 
410
475
  Returns:
411
476
  float: The strain at maximum compressive strength of concrete.
412
- """
413
- self._eps_c3 = self._eps_c3 or mc2010.eps_c3(self.fck)
414
- return self._eps_c3
415
477
 
416
- @eps_c3.setter
417
- def eps_c3(self, value: float):
418
- """Sets the strain at maximum compressive strength of concrete (fcd)
419
- for the Bi-linear constitutive law.
420
-
421
- Arguments:
422
- value (float): The new value for eps_c3, no units.
478
+ Note:
479
+ The returned value is derived from fck if eps_c3 is not manually
480
+ provided when initializing the object.
423
481
  """
424
- if abs(value) >= 0.1:
425
- warnings.warn(
426
- 'A suspect value is input for eps_c3 that should be a pure'
427
- ' number without units. Plase check ({value} given).'
428
- )
429
- self._eps_c3 = value
482
+ if self._eps_c3 is None:
483
+ return mc2010.eps_c3(self.fck)
484
+ return self._eps_c3
430
485
 
431
486
  @property
432
487
  def eps_cu3(self) -> float:
@@ -435,24 +490,14 @@ class ConcreteMC2010(Concrete):
435
490
 
436
491
  Returns:
437
492
  float: The maximum strain at failure of concrete.
438
- """
439
- self._eps_cu3 = self._eps_cu3 or mc2010.eps_cu3(self.fck)
440
- return self._eps_cu3
441
-
442
- @eps_cu3.setter
443
- def eps_cu3(self, value: float):
444
- """Sets the strain at concrete failure of concrete for the Bi-linear
445
- constitutive law.
446
493
 
447
- Arguments:
448
- value (float): The new value for eps_cu3, no units.
494
+ Note:
495
+ The returned value is derived from fck if eps_cu3 is not manually
496
+ provided when initializing the object.
449
497
  """
450
- if abs(value) >= 0.1:
451
- warnings.warn(
452
- 'A suspect value is input for eps_cu3 that should be a pure'
453
- ' number without units. Plase check ({value} given).'
454
- )
455
- self._eps_cu3 = value
498
+ if self._eps_cu3 is None:
499
+ return mc2010.eps_cu3(self.fck)
500
+ return self._eps_cu3
456
501
 
457
502
  def __elastic__(self) -> dict:
458
503
  """Returns kwargs for creating an elastic constitutive law."""