Oft schreibe ich sehr ähnlichen Code für ein-, zwei- und dreidimensionale Versionen einer bestimmten Operation / eines Algorithmus. Das Verwalten all dieser Versionen kann mühsam werden. Einfache Code-Generierung funktioniert ziemlich gut, aber es scheint, als gäbe es einen besseren Weg.
Gibt es eine relativ einfache Möglichkeit, eine Operation einmal zu schreiben und auf höhere oder niedrigere Dimensionen zu verallgemeinern?
Ein konkretes Beispiel ist: Angenommen, ich muss den Gradienten eines Geschwindigkeitsfeldes im Spektralraum berechnen. In drei Dimensionen würden die Fortran-Schleifen ungefähr so aussehen:
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
wo das ddx
Array entsprechend definiert ist. (Man könnte dies auch mit Matrixmultiplikatoren tun.) Der Code für einen zweidimensionalen Fluss ist nahezu identisch, mit der Ausnahme, dass die dritte Dimension aus den Schleifen, Indizes und der Anzahl der Komponenten entfernt wird. Gibt es eine bessere Möglichkeit, dies auszudrücken?
Ein anderes Beispiel ist: Angenommen, ich habe Fluidgeschwindigkeiten, die punktweise auf einem dreidimensionalen Gitter definiert sind. Um die Geschwindigkeit auf einen beliebigen Ort zu interpolieren (dh nicht den Gitterpunkten zu entsprechen), kann der eindimensionale Neville- Algorithmus nacheinander über alle drei Dimensionen hinweg verwendet werden (dh Dimensionsreduktion). Gibt es eine einfache Möglichkeit zur Dimensionsreduktion bei eindimensionaler Implementierung eines einfachen Algorithmus?