Costumo encontrar-me escrevendo código muito semelhante para uma, duas e três versões dimensionais de uma dada operação / algoritmo. Manter todas essas versões pode se tornar tediosa. A geração simples de código funciona razoavelmente bem, mas parece que deve haver uma maneira melhor.
Existe uma maneira relativamente simples de escrever uma operação uma vez e generalizá-la para dimensões superiores ou inferiores?
Um exemplo concreto é: suponha que eu precise calcular o gradiente de um campo de velocidade no espaço espectral. Em três dimensões, os loops Fortran se pareceriam com:
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
onde a ddx
matriz é definida adequadamente. (Também é possível fazer isso com multiplicações de matrizes.) O código para um fluxo bidimensional é quase exatamente o mesmo, exceto: a terceira dimensão é eliminada dos loops, índices e número de componentes. Existe uma maneira melhor de expressar isso?
Outro exemplo é: suponha que eu tenha velocidades de fluido definidas ponto a ponto em uma grade tridimensional. Para interpolar a velocidade para um local arbitrário (isto é, não corresponde aos pontos da grade), pode-se usar o algoritmo unidimensional de Neville sucessivamente nas três dimensões (isto é, redução dimensional). Existe uma maneira fácil de fazer redução dimensional, dada a implementação unidimensional de um algoritmo simples?