Я занимаюсь разработкой системы конечных элементов.Как обычно, моделирование состоит из набора узлов сетки, каждый из которых имеет набор свойств (с плавающей запятой), например, таких как несколько свойств материала, координат или физических величин, которые эволюционируют во времени.
Вы можете использоватьдва крайних подхода:
В отношении свойств: ведение единого массива для каждого свойства:
double* x, *y, *z, *e_field, *b_field, *conductivity;
Ввод-wise: Поддерживать один единственный массив, где каждый массив имеет структуру
struct { double x, y, z, e_field, b_field, conductivity; } *meshnodedata;
Между ними можно смешиваться, например, применяя второй подход только для координатx, y, z и используя первый подход для остальных свойств.Чем больше свойств ваша симуляция поддерживает для каждого узла сетки, тем больше возможностей для микширования.
С одной стороны, у меня возник классический вопрос, какой из этих подходов (и их миксов) лучше всего подходит для научных вычислений в отношениипроизводительность программы и ремонтопригодность кода.С другой стороны, мне интересно, как реализовать код таким образом, чтобы переход между различными подходами стал простым.Кроме того, это может быть даже решение для перехода между различными макетами памяти для разных частей программы.
Чтобы подойти к вопросу:
- Какие у вас были переживания с этими разнымиподходы?
- Насколько значительными были эти различия?
- Получили ли вы опыт миграции между этими двумя макетами?