Я пытаюсь поместить неструктурированную сетку, состоящую из (тетраэдрических) ячеек, их (треугольных) граней, ребер и узлов, в структуру данных Python, которая является одновременно интуитивно понятной и эффективной.
Вопросы, на которые структура данных должна уметь отвечать: «Каковы координаты узла k?», «Какие ребра находятся в ячейке j?», «Какие ячейки примыкают к грани i?» и пр.
Мое первое предположение состояло в следующем:
nodes_coords = np.array(num_nodes, dtype=np.dtype((float,3)))
cells_dtype = np.dtype([('nodes', (int,4))])
cells = np.array(num_cells, dtype=cells_dtype)
и пр.
Преимущество этого состоит в том, что существует очень интуитивный способ получения отношений ячейка-узел, а именно
cells[4]['nodes']
даст вам узлы в ячейке # 4.
Есть один недостаток, который я сейчас вижу:
Массивы не являются расширяемыми. Предположим, что позже я решу во время выполнения добавить информацию о гранях и ребрах; Как я могу добавить поля в массив ячеек, не перемещаясь вокруг данных, то есть, как динамически расширять dtypes массивов?
Обходным путем будет создание отдельных массивов, таких как
cells_nodes = ...
cells_faces = ...
cells_edges = ...
и заполните их при необходимости. Это не кажется идиоматичным, хотя. Например, для циклического обхода ячеек, в которых требуются узлы, грани и ребра, каждый раз требуется сжать три массива.
Полезные предложения, кто-нибудь?