Je me retrouve souvent à écrire du code très similaire pour les versions à une, deux et trois dimensions d'une opération / algorithme donné. La maintenance de toutes ces versions peut devenir fastidieuse. La génération de code simple fonctionne assez bien, mais il semble que l'on pense qu'il doit y avoir un meilleur moyen.
Existe-t-il un moyen relativement simple d'écrire une opération une fois et de la généraliser à des dimensions supérieures ou inférieures?
Un exemple concret est: supposons que j'ai besoin de calculer le gradient d'un champ de vitesse dans l'espace spectral. En trois dimensions, les boucles Fortran ressembleraient à quelque chose comme:
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
où le ddx
tableau est correctement défini. (On pourrait également le faire avec des multiplications matricielles.) Le code d'un flux bidimensionnel est presque exactement le même, sauf: la troisième dimension est supprimée des boucles, des index et du nombre de composants. Y a-t-il une meilleure façon d'exprimer cela?
Un autre exemple est: supposons que j'ai des vitesses de fluide définies point par point sur une grille tridimensionnelle. Pour interpoler la vitesse à un emplacement arbitraire (c'est-à-dire ne correspondant pas aux points de la grille), on peut utiliser successivement l'algorithme Neville unidimensionnel sur les trois dimensions (c'est-à-dire la réduction dimensionnelle). Existe-t-il un moyen facile de faire une réduction dimensionnelle étant donné l'implémentation unidimensionnelle d'un algorithme simple?