-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathcult_i.py
110 lines (104 loc) · 4.1 KB
/
cult_i.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import numpy as np
import intersection as inter
def cult_I(m, n, input_values, values):
"""
capacity utilization of linings in tunnels (CULT-I)
according to the paper:
Performance indicator of tunnel linings under geotechnical uncertainty;
Spyridis, Panagiotis; Konstantis, Spyridon; Gakis, Angelos
cult_I = sqrt( (N_rel,i^2 + M_rel,i^2) / (N_rel,max^2 + M_rel,max^2) )
:input:
m = x coordinate of a point, moment, float
n = y coordinate of a point, normal force, float
input_values = dict of input values, dict[str:float]
values = dict of resulting values from core function, dict[str:float]
:return:
cult_I: float
"""
if input_values['a_s1'] == 0:
limit_x_pos = values['Moment']
limit_y = values['Normal Force']
n_rel_max = abs(min(limit_y) - max(limit_y))
m_rel_max = abs(max(limit_x_pos))
else:
limit_x_pos = values['Moment Reinf']
limit_y = values['Normal Force Reinf']
n_rel_max = abs(min(limit_y) - max(limit_y)) / 2 # take the half
m_rel_max = abs(max(limit_x_pos))
if input_values['a_s2'] == 0:
limit_x_neg = values['Moment Neg']
else:
limit_x_neg = values['Moment Reinf Neg']
limit_x_pos = np.array(limit_x_pos)
limit_x_neg = np.array(limit_x_neg)
limit_y = np.array(limit_y)
horizontal_cut_x = np.array([min(limit_x_neg),
max(limit_x_pos)])
horizontal_cut_y = np.array([n, n])
vertical_cut_x = np.array([m, m])
vertical_cut_y = np.array([max(limit_y),
min(limit_y)])
if m > 0:
x1, _ = inter.intersection(horizontal_cut_x,
horizontal_cut_y,
limit_x_pos,
limit_y)
_, y2 = inter.intersection(vertical_cut_x,
vertical_cut_y,
limit_x_pos,
limit_y)
if len(x1) == 0 or len(y2) == 0:
cult_I = 'outside'
return cult_I
m_rel_i = x1 - m
if len(y2) > 1:
n_rel_i = min(abs(y2[0] - n), abs(y2[1] - n))
else:
n_rel_i = abs(y2[0] - n)
if n_rel_i > n_rel_max:
n_rel_i = min(abs(min(limit_y)) - abs(n),
max(limit_y) - abs(n))
if m_rel_i < 0:
cult_I = 'outside'
return cult_I
elif m == 0:
m_rel_i = m_rel_max
n_rel_i = min(abs(min(limit_y)) - abs(n), max(limit_y) - abs(n))
if max(limit_y) < n < min(limit_y):
cult_I = 'outside'
return cult_I
else:
x1, _ = inter.intersection(horizontal_cut_x,
horizontal_cut_y,
limit_x_neg,
limit_y)
_, y2 = inter.intersection(vertical_cut_x,
vertical_cut_y,
limit_x_neg,
limit_y)
if len(x1) == 0 or len(y2) == 0:
cult_I = 'outside'
return cult_I
m_rel_i = x1 - m
if len(y2) > 1:
n_rel_i = min(abs(y2[0] - n), abs(y2[1] - n))
else:
n_rel_i = abs(y2[0] - n)
if n_rel_i > n_rel_max:
n_rel_i = min(abs(min(limit_y)) - abs(n),
max(limit_y) - abs(n))
if m_rel_i > 0:
cult_I = 'outside'
return cult_I
cult_I = np.sqrt((m_rel_i*m_rel_i + n_rel_i*n_rel_i) / (
m_rel_max*m_rel_max + n_rel_max*n_rel_max))
if cult_I is not str:
if type(cult_I) is np.float64:
cult_I = round(cult_I, 3)
else:
cult_I = round(cult_I[0], 3)
return cult_I
if __name__ == '__main__':
import core
i_val, val = core.int_diagram() # initiate with default
print(cult_I(m=-0.21, n=-1, input_values=i_val, values=val))