Я работаю над своей докторской диссертацией, и я застрял на этом шаге. Проблема состоит в реализации алгоритма слияния сетки конечных элементов, и, возможно, мое решение не самое лучшее, поэтому, если вы придумаете лучшее, я открыт для предложений.
Что касается проблемы: у меня есть сетка конечных элементов, которая состоит из элементов QUAD (квадраты с 4 узлами) и элементов TRIA (треугольники с 3 узлами). Эти элементы соединены ребрами, ребро определяется двумя узлами (ребро=[узел1,узел2]). У меня есть список ребер, которые я не хочу объединять, но для остальных ребер я хочу, чтобы программа объединила элементы с общим ребром.
В качестве простого примера: предположим, что у меня есть 4 элемента A, B, C и D (QUAD elms, определяемые 4 узлами). Сетка выглядит примерно так
1--------------2----------------3
| | |
| A | B |
| | |
4--------------5----------------6
| | |
| C | D |
| | |
7--------------8----------------9
Эти элементы определены в словаре:
mesh_dict={'A': [1,2,5,4], 'B':[2,3,6,5], 'C':[4,5,8,7],'D':[5,6,9,8]}
У меня также есть словарь для позиции узла со значениями координат X, Y, Z. Допустим, я хочу объединить ребра [4,5] и [5,6].
Мое решение следующее: я начинаю перебирать элементы в mesh_dict, нахожу соседей элемента функцией get_elm_neighbors(element), проверяю угол между элементами функцией check_angle(elm1,elm2,angle) (мне нужен угол между элементами должен быть ниже определенного порога), затем я проверяю, какое ребро должно быть объединено с помощью get_edge_not_bar(), затем у меня есть функция, которая обновляет узлы для первого элемента, чтобы завершить слияние.
for e in mesh_dict:
if e not in delete_keys:
neighbors=get_elm_neighbors(e)
for key,value in neighbors.items():
check = check_angle(e,key,0.5)
if check:
nodes = get_edge_not_bar(value)
if nodes:
new_values=merge_elms(e,key,nodes)
d = {e: new_values}
mesh_dict_merged.update(d)
mesh_dict.update(d)
delete_keys.append(key)
Моя проблема в том, что мне нужно удалить элементы, которые остались после слияния. Например, в приведенном выше случае я начинаю с элемента A и объединяю на ребре [4,5], после этого определение вяза A будет 'A':[1,2,8,7]
, затем мне нужно удалить вяз C и продолжить итерацию.
Мое решение состояло в том, чтобы создать дубликат словаря mesh_dict_merge
, в котором я обновляю значения для элементов, а затем удаляю те, которые мне не нужны, при повторении исходного словаря, но принимая во внимание, что удаленные элементы (список удаленных_ключей) не идут через них
Я предполагаю, что мой вопрос заключается в том, есть ли способ перебирать словарь, обновлять значения и удалять ключи при этом? Или, если есть лучшее решение для решения этой проблемы, может быть, перебирать узлы вместо элементов?
РЕДАКТИРОВАТЬ: изменено «A»: [1,2,4,5] на «A»: [1,2,5,4]