A menudo me encuentro escribiendo código muy similar para versiones de una, dos y tres dimensiones de una operación / algoritmo dado. Mantener todas estas versiones puede volverse tedioso. La generación de código simple funciona bastante bien, pero parece que debe haber una mejor manera.
¿Existe una forma relativamente simple de escribir una operación una vez y hacer que se generalice a dimensiones superiores o inferiores?
Un ejemplo concreto es: supongamos que necesito calcular el gradiente de un campo de velocidad en el espacio espectral. En tres dimensiones, los bucles Fortran se verían así:
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
donde la ddx
matriz se define adecuadamente. (También se podría hacer esto con multiplicaciones matriciales). El código para un flujo bidimensional es casi exactamente el mismo, excepto: la tercera dimensión se elimina de los bucles, índices y número de componentes. ¿Hay una mejor manera de expresar esto?
Otro ejemplo es: supongamos que tengo velocidades de fluido definidas puntualmente en una cuadrícula tridimensional. Para interpolar la velocidad a una ubicación arbitraria (es decir, que no corresponde a los puntos de la cuadrícula), se puede utilizar el algoritmo unidimensional de Neville sucesivamente en las tres dimensiones (es decir, reducción dimensional). ¿Existe una manera fácil de hacer la reducción dimensional dada una implementación unidimensional de un algoritmo simple?