Я часто нахожу себя пишущим очень похожий код для одной, двух и трехмерных версий данной операции / алгоритма. Поддержание всех этих версий может стать утомительным. Простая генерация кода работает довольно хорошо, но кажется, что должен быть лучший способ.
Есть ли относительно простой способ написать операцию один раз и сделать ее обобщенной для более высоких или более низких измерений?
Один конкретный пример: предположим, мне нужно вычислить градиент поля скорости в спектральном пространстве. В трех измерениях петли Фортрана будут выглядеть примерно так:
do k = 1, n
do j = 1, n
do i = 1, n
phi(i,j,k) = ddx(i)*u(i,j,k) + ddx(j)*v(i,j,k) + ddx(k)*w(i,j,k)
end do
end do
end do
где ddx
массив правильно определен. (Можно также сделать это с умножением матрицы.) Код для двумерного потока почти точно такой же, за исключением: третье измерение отбрасывается из циклов, индексов и количества компонентов. Есть ли лучший способ выразить это?
Другой пример: предположим, у меня есть скорости жидкости, определенные точечно на трехмерной сетке. Чтобы интерполировать скорость в произвольное место (т. Е. Не соответствующее точкам сетки), можно использовать одномерный алгоритм Невилла последовательно по всем трем измерениям (т. Е. Уменьшению размеров). Есть ли простой способ сделать размерную редукцию при одномерной реализации простого алгоритма?