雖然這可能更多的是評論,那麼如何定義這樣的宏...?
subroutine mysub(momentum)
complex, intent(in) :: momentum(:,:,:,:,:)
#define _(i) size(momentum, i)
complex :: prefactor(_(1), _(2), _(4), _(5))
它也可以被重複定義的不同的參數,例如:
subroutine mysub(momentum, coeff)
complex, intent(in) :: momentum(:,:,:,:,:), coeff(:,:,:)
#define _(i) size(momentum, i)
complex :: prefactor_momentum(_(1), _(2), _(4), _(5))
#define _(i) size(coeff, i)
complex :: prefactor_coeff(_(1), _(3))
如果是確定以使用的可分配數組,我可以如下分配它:
subroutine sub(momentum)
complex, intent(in) :: momentum(:,:,:,:,:)
complex, allocatable :: prefactor(:,:,:,:)
integer :: d(5)
d = shape(momentum)
allocate(prefactor(d(1), d(2), d(4), d(5)))
要獲得幾個不同參數的組合宏,可能需要嘗試this approach :
#define dim2(A,i1,i2) size(A,i1), size(A,i2)
#define dim3(A,i1,i2,i3) size(A,i1), size(A,i2), size(A,i3)
#define dim4(A,i1,i2,i3,i4) size(A,i1), size(A,i2), size(A,i3), size(A,i4)
#define _dims(A,_1,_2,_3,_4,NAME,...) NAME
#define getdims(A,...) _dims(A, __VA_ARGS__, dim4, dim3, dim2)(A,__VA_ARGS__)
subroutine mysub(momentum)
complex, intent(in) :: momentum(:,:,:,:,:)
complex :: prefactor2(getdims(momentum, 1, 5))
complex :: prefactor3(getdims(momentum, 1, 3, 5))
complex :: prefactor4(getdims(momentum, 1, 2, 4, 5))
它轉換(由cpp -P
)到
...
complex :: prefactor2(size(momentum,1), size(momentum,5))
complex :: prefactor3(size(momentum,1), size(momentum,3), size(momentum,5))
complex :: prefactor4(size(momentum,1), size(momentum,2), size(momentum,4), size(momentum,5))
你說「前4個指數」,但使用1,2,4和5.這是正確的嗎? – francescalus
我只保留原文。特別是如果你有理由更喜歡自動數組。 –