Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In
| Download
Project: TechnoCloud
Views: 193
1
# Андрей Ширшов [email protected]
2
3
# Образец программного кода расчёта на примере расчёта
4
# стержня на растяжение. В расчёте определяется минимально
5
# допустимый диаметр стержня, при котором он выдержит растягивающую
6
# нагрузку, потом этот диаметр сравниваем с диаметром стержня.
7
8
# импорт библиотек, системные переменные
9
10
import numpy as np, sys, operator
11
load('technocloud_shared_scripts/cartesian.py') # скрипт перебора исходных данных
12
13
# базы данных
14
15
# База данных физических свойств материалов
16
17
materials_db = np.array([[630, 330, 250, 310, 180],
18
[650, 350, 260, 320, 185],
19
[650, 350, 260, 325, 185]])
20
# строка-заголовок
21
materials_hheader = ['сталь', 'sigma_в', 'sigma_т', 'sigma_{-1р}', 'sigma_{-1}', 'tau{-1}']
22
# столбец-заголовок
23
materials_vheader = ['сталь 40Х', 'сталь 45Х', 'сталь 50Х']
24
25
# Получение исходных данных
26
27
# input_data - исходные данные для расчёта, limts - номера решений, которые надо
28
# вывести в таблице с результатами расчётов.
29
# input_data и limits передаются извне.
30
# input_data = {'F':[100, 150, 200], 'k':[2, 1.5], 'd':[10,8,12], 'material':['сталь 40Х', 'сталь 45Х']}
31
# limits = (0,49)
32
33
F = input_data['F'] # Растягивающее усилие, Н
34
k = input_data['k'] # Коэффициент запаса, б/разм
35
d = input_data['d'] # Диаметр стержня, мм
36
material = input_data['material'] # Материал стержня
37
38
# Проверим, что все материалы, введённые пользователем, присутствуют в базе данных
39
errors = [] # список сообщений об ошибках, которые останавливают работу программы
40
warnings = [] # список сообщений об ошибках, которые не останавливают работу программы
41
missing_materials = set(material) - set(materials_vheader)
42
if missing_materials:
43
warnings.append("Ошибка 1. Следующие материалы отстутствуют в базе данных: {0}. Пожалуйста, проверьте правильность их написания или сообщите в техподдержку, какие материалы следует добавить. Расчёт будет продолжен для правильно указанных материалов.".format(', '.join(missing_materials)))
44
# удалим отстуствующие материалы из списка material:
45
for m in copy(material):
46
if m in missing_materials:
47
material.remove(m)
48
# если после коррекции списка material этот список окажется пуст,
49
# нужно остановить работу программы
50
if material == []:
51
errors.append("Ошибка 2. Все материалы написаны неправильно или отсутствуют в базе данных. Пожалуйста, проверьте правильность написания материалов или сообщите в службу поддержки, какие материалы следует добавить.")
52
sys.exit("Выполнение расчёта прервано")
53
54
# Т.к. массив Numpy не может комбинировать данных разных типов, заменим текстовые
55
# значения материалов на индексы этих материалов. Индекс материала совпадает с номером
56
# позиции этого материала в списке materials_vheader.
57
58
material_ind = [materials_vheader.index(m) for m in material]
59
60
start_ind, end_ind = limits # номер начальной и конечной строк таблицы с результатами.
61
62
# Составление комбинаций из исходных данных
63
# T - транспонирование матрицы
64
# Из всех возможных комбинаций возмьмём только те, номера которых
65
# находятся в диапазоне от start_id до end_id.
66
67
d_list, F_list, k_list, materials_ind_list = cartesian((d, F, k, material_ind))[start_ind:end_ind].T
68
69
# суммарное количество всех комбинаций исходных данных
70
count = reduce(operator.mul, [len(el) for el in [d, F, k, material_ind]], 1)
71
72
# Определяем напряжение среза
73
74
# Копирование массива numpy выполняется явно через B = np.copy(A).
75
# Если использовать B=A, то при изменении массива B изменится массив А.
76
77
# Возьмём массив индексов материала и заменим индексы
78
# на напряжения среза этих материалов.
79
sigma_t_list_part = np.copy(materials_ind_list_part)
80
sigma_t_ind = hmaterials_db.index('sigma_т') # номер столбца 'sigma_т' в базе данных
81
for m in material:
82
sigma_t_list_part[np.where(materials_ind_list_part == material.index(m))] = materials_db[sigma_t_ind, vmaterials_db.index(m)]
83
84
# Определяем допускаемое напряжение
85
86
sigma_lim_list_part = sigma_t_list_part/k_list_part
87
88
# Определяем минимально допустимый диаметр стержня
89
90
d_lim_list_part = np.sqrt(4*F_list_part/(np.pi*sigma_lim_list_part))
91
92
# формирование результата
93
94
# Переменная результата (res и только res)
95
res = []
96
97
# Структура вкладки
98
tab1 = {
99
'table': {'head': [], 'body': []},
100
'errors': [],
101
'bads': [],
102
'exports': [],
103
'count': count
104
}
105
106
# Заголовок таблицы
107
tab1['table']['head'] = [
108
r"Диаметр стержня $d$, мм", #.........................id 0
109
r"Растягивающее усилие $F$, Н", #.....................id 1
110
r"Коэффициент запаса $k$, б/разм", #..................id 2
111
r"Материал стержня", #................................id 3
112
r"Предел текучести $\sigma_т$, МПа", #................id 4
113
r"Допускаемое напряжение $[\sigma]$, МПа", #..........id 5
114
r"Минимально допустимый диаметр стержня $[d]$, мм" #..id 6
115
]
116
117
# Тексты ошибок
118
tab1['errors'] = [
119
r'$[d]$ > d', #id 0
120
]
121
122
# Вывод констант
123
tab1['text'] = "Тип нагрузки: растяжение."
124
125
# округление с точностью до одного знака после запятой
126
sigma_t_list_part = np.around(sigma_t_list_part, decimals=1)
127
sigma_t_list_part = np.around(sigma_t_list_part, decimals=1)
128
sigma_lim_list_part = np.around(sigma_lim_list_part, decimals=1)
129
d_lim_list_part = np.around(d_lim_list_part, decimals=1)
130
131
# Заполнение таблицы
132
res_table = np.transpose(np.array([d_list_part, F_list_part, k_list_part, materials_ind_list_part, sigma_t_list_part, sigma_lim_list_part, d_lim_list_part]))
133
134
res_table = res_table.tolist() # перевод матрицы Numpy в список Python
135
# замена индекса материала на его название
136
for i in srange(len(res_table)):
137
res_table[i][3] = material[int(res_table[i][3])]
138
139
tab1['table']['body'] = res_table
140
141
# Заполнение ошибок (номер строки, номер столбца, id сообщения об ошибке)
142
d_warn = np.where(d_lim_list_part > d_list_part)
143
tab1['bads'] = [(t,6,0) for t in d_warn[0].tolist()]
144
145
# Экспорт
146
tab1['export'] = [
147
{
148
'title': '.csv',
149
'filename': 'barTension.csv',
150
'header': 'd,F,k,material,sigma_t,[sigma],[d]',
151
'data': []
152
},
153
{
154
'title': 'T-Flex CAD',
155
'filename': 'barTension.txt',
156
'header': 'd,F,k,material,sigma_t,[sigma],[d]',
157
'data': []
158
},
159
]
160
# Заполняем результатами расчётов
161
for row in res_table:
162
tab1['export'][0]['data'].append(';'.join([str(t) for t in row])) # csv
163
tab1['export'][1]['data'].append(','.join([str(row[t]) for t in [0,1,2,3,6]])) # t-flex
164
165
# Если нет результатов - убираем таблицу и выводим сообщение
166
if len(tab1['table']['body']) == 0:
167
tab1['table'] = False
168
tab1['html'] = '<strong>Не удалось подобрать стержень</strong>'
169
170
# Добавляем вкладку в результат
171
res.append(tab1)
172