特定の操作/アルゴリズムの1次元、2次元、3次元のバージョンについて、非常によく似たコードを書くことがよくあります。これらのバージョンをすべて維持するのは面倒です。単純なコード生成はかなりうまく機能しますが、より良い方法が必要だと考えられているようです。
一度操作を記述し、それを高次元または低次元に一般化する比較的簡単な方法はありますか?
具体例の1つは次のとおりです。スペクトル空間で速度場の勾配を計算する必要があるとします。3次元では、Fortranループは次のようになります。
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
ここで、ddx
配列は適切に定義されています。(マトリックス乗算でもこれを行うことができます。)2次元フローのコードはほぼ同じですが、3番目の次元がループ、インデックス、およびコンポーネントの数から削除されます。これを表現するより良い方法はありますか?
別の例は次のとおりです。3次元グリッド上で点ごとに定義された流体速度があるとします。速度を任意の位置(つまり、グリッドポイントに対応しない)に補間するには、3次元すべてにわたって連続して1次元ネビルアルゴリズムを使用します(つまり、次元削減)。単純なアルゴリズムの1次元の実装を前提として、次元削減を行う簡単な方法はありますか?