【发布时间】:2016-02-15 15:04:36
【问题描述】:
我有一个 Fortran 函数,我想在编译时初始化一个大数组。下面是一个简化的工作示例,其中fill_coefficients 中的参数coeff 的大小已大大减小。
当coeff 很大时如何编写类似的代码,而不超过maximum of 255 continuation lines 或maximum of 132 characters per line?这里的fill_coefficients 应该真的是PURE,这可能导致无法在运行时从文件中读取一次coeff,然后存储结果。
文件“main.f03”:
PROGRAM main
USE coefficients
IMPLICIT NONE
REAL(dp), ALLOCATABLE, DIMENSION(:,:) :: matrix
CALL fill_coefficients(matrix,2)
PRINT *, "The first row of 'matrix':"
PRINT *, matrix(1,:)
END PROGRAM main
文件“coefficients.f03”:
MODULE coefficients
USE iso_fortran_env
IMPLICIT NONE
INTEGER, PARAMETER :: dp = REAL64
CONTAINS
PURE SUBROUTINE fill_coefficients(my_coefficients, n)
IMPLICIT NONE
REAL(dp), ALLOCATABLE, DIMENSION(:,:), INTENT(OUT) :: my_coefficients
INTEGER, INTENT(IN) :: n
! The size of the following array would be roughly 200 x 200 = 40.000.
REAL(dp), DIMENSION(3,3), PARAMETER :: coeff = &
RESHAPE ( &
[ + 10.6770782520313112108115239655957106_dp, &
- 854.166260162504896864921917247656850_dp, &
- 85.4166260162504896864921917247656850_dp, &
+ 16250.5130995916556628551394756366716_dp, &
+ 6747.91345528378868523288314625648912_dp, &
+ 106.770782520313112108115239655957106_dp, &
- 123256.191341449456617608232658836883_dp, &
- 8328.12103658442274443298869316465429_dp, &
+ 500381.272281447399894682070647642979_dp ], &
[3,3] )
IF (ALLOCATED(my_coefficients)) DEALLOCATE(my_coefficients)
ALLOCATE(my_coefficients(n,n))
my_coefficients = coeff(1:n,1:n)
END SUBROUTINE fill_coefficients
END MODULE coefficients
输出:
The first row of 'matrix':
10.677078252031311 16250.513099591655
【问题讨论】:
-
如果它那么大,你不能从文件中读取内容吗?你需要
parameter吗? -
我找不到我认为存在的答案/问题,但您也可以看到stackoverflow.com/q/25811884。您可以通过与链接答案类似的方式从其他较小的命名常量有效地构建命名常量。
-
对@VladimirF 的评论的进一步说明:你说“应该很纯粹”。你真的需要它是纯粹的(这使我的第一个建议重复无效)还是你也在问这个要求?也就是,我们能不能根据不纯来提出建议?
-
我希望
fill_coefficients是 PURE,因为从现在起大约一年后,我可能需要运行我的 FEM 多核,并且该例程位于最内层循环中。我相信这使得在运行时无法从文件中读取一次coeff,然后存储结果。我也许可以使用从其他几个较小的数组构建数组的“技巧”,或者分多个步骤进行。除了该解决方案的丑陋之外,我最终不会多次存储所有元素吗? -
关于您的预期用途和
pure的要求:我怀疑您可能想要考虑不涉及内部循环中的巨大数组分配的方法。也许可以从文件中读取它,然后只对数组部分执行操作(例如我们在 F77 时代如何使用静态内存布局进行操作)。 [但那是题外话:如果你真的想要求pure我不会争论 - 有时这就是想要的。]
标签: arrays fortran compile-time-constant