【发布时间】:2016-06-28 11:23:57
【问题描述】:
前言
我正在编写的 Fortran 程序应该根据ndims 处理 1D、2D 和 3D 问题,它可以是 1、2 或 3,并且是从输入文件中读取的。
在这些情况下,感兴趣的数量可以存储在数组中(可以命名为phi)
- 等级为
dims(ALLOCATABLE(:)或ALLOCATABLE(:,:)或ALLOCATABLE(:,:,:)), - 或在秩为 3 的数组中(
ALLOCATABLE(:,:,:)在 2D 中设置为等于 1 或在 1D 中第二和第三维都等于 1);
这两种情况在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
(这里mysub2 作用于mysub 的位置。)
所以问题是我应该如何存储 phi,以便我可以用第二个代码替换第一个代码?
也许我可以回到前言并决定遵循第 1 点,在这种情况下,编写通用接口会更容易。我认为,这只是“隐藏”SELECT CASE 会做什么的一种方式。两者中的哪一个(SELECT CASE/generic INTERFACE)效率更高?
只有这两种方法可以解决这个问题吗?
【问题讨论】:
-
这已成为一个常见问题解答。昨天最近问的——stackoverflow.com/questions/38058080/…。
-
这个问题显然是相关的,但这个问题的答案不会是这个问题的答案:如果我理解正确,这个问题是关于选择数组的等级;我的问题更多的是关于“编写代码的最佳方法,它不依赖于它所操作的数组的等级”。
标签: multidimensional-array fortran storage