前言存储多维阵列
的Fortran程序,我正在写应处理取决于ndims
1D,2D和3D的问题,它可以是1,2或3并从输入文件中读取。
在这些情况下的量/所关注IES可以(一个可以被命名为phi
)存储在数组
-
秩
- ,
- 或在等级阵列3(
ALLOCATABLE(:,:,:)
,第三维在2D中等于1或者第二和第三维在1D中等于1);
dims
(
ALLOCATABLE(:)
或
ALLOCATABLE(:,:)
或
ALLOCATABLE(:,:,:)
)的
这两种情况在this answer都有很好的解释。第一种方法对我来说似乎更加优雅,但在下面我假设第二种方法,这绝对简单。
这些量必须由几个子程序上进行操作(如mysub
)沿ndims
尺寸(沿“铅笔”应该给图形的想法),所以我应该叫像
SELECT CASE (ndims)
! 3D case
CASE (3)
DO j = ...
DO k = ...
CALL mysub(phi(:,j,k))
END DO
END DO
DO i = ...
DO k = ...
CALL mysub(phi(i,:,k))
END DO
END DO
DO i = ...
DO j = ...
CALL mysub(phi(i,j,:))
END DO
END DO
! 2D case
CASE (2)
DO j = ...
DO k = ...
CALL mysub(phi(:,j,1))
END DO
END DO
DO i = ...
DO k = ...
CALL mysub(phi(i,:,1))
END DO
END DO
! 1D case
CASE (1)
DO j = ...
DO k = ...
CALL mysub(phi(:,1,1))
END DO
END DO
END SELECT
实际问题
任何人都可以建议我(或帮助我设计!)一种不同的存储方式phi
(可能涉及派生数据类型?),以便我可以折叠前面的代码如下?
DO id = 1, ndims
CALL mysub2(phi,id)
END DO
(这里作用mysub
的地方。)
所以,问题是我应该如何存储披,这样我就可以用第二个替代第一码?
也许我可以回到前言,并决定按照1点,在这种情况下会更容易编写一个通用的接口。我认为,这只是一种“隐藏”SELECT CASE
会做什么的方法。哪两个(SELECT CASE
/通用INTERFACE
)会更有效率?
这些是面对这个问题只有两个办法?
这正在成为一种常见的东西。最近问昨天 - http://stackoverflow.com/questions/38058080/fortran-choosing-the-rank-of-an-allocatable-array。 –
问题有明显的关联,但这个问题的答案不会回答这个:这个问题,如果我理解正确的,是关于如何选择一个数组的等级;我的问题更多地是关于“编写不依赖于其所操作阵列的等级的代码的最佳方式”。 –