Często piszę bardzo podobny kod dla jedno-, dwu- i trójwymiarowych wersji danej operacji / algorytmu. Utrzymanie wszystkich tych wersji może być nudne. Proste generowanie kodu działa dość dobrze, ale wydaje się, że istnieje lepszy sposób.
Czy istnieje względnie prosty sposób, aby napisać operację raz i generalizować ją do wyższych lub niższych wymiarów?
Jednym konkretnym przykładem jest: załóżmy, że muszę obliczyć gradient pola prędkości w przestrzeni spektralnej. W trzech wymiarach pętle Fortrana wyglądałyby mniej więcej tak:
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
gdzie ddx
tablica jest odpowiednio zdefiniowana. (Można to również zrobić z mnożnikami macierzy.) Kod dwuwymiarowego przepływu jest prawie dokładnie taki sam, z wyjątkiem: trzeci wymiar jest usuwany z pętli, indeksów i liczby składników. Czy istnieje lepszy sposób na wyrażenie tego?
Innym przykładem jest: załóżmy, że mam prędkości płynu zdefiniowane punktowo na trójwymiarowej siatce. Aby interpolować prędkość do dowolnej lokalizacji (tj. Nie odpowiadającej punktom siatki), można zastosować jednowymiarowy algorytm Neville'a kolejno we wszystkich trzech wymiarach (tj. Redukcja wymiarów). Czy istnieje prosty sposób na zmniejszenie wymiarów, biorąc pod uwagę jednowymiarową implementację prostego algorytmu?