我试图理解用fortran编写的代码的一部分。该代码包含以下部分:
REAL(KIND=8), DIMENSION(x,y), INTENT(INOUT) :: AR
_REAL_, DIMENSION(x,y), INTENT(INOUT) :: BR
从this page开始,我发现_REAL_
是精确控制的预处理器。
_REAL_
在此代码中实际做了什么?AR
值分配给BR
吗?它们之间是否存在类型不兼容问题?AR
将BR
的值分配给extern "C" void assign_(double *AR, double *BR , int *x, int*y)
但我遇到了问题,似乎问题是由于不兼容问题在AR
和BR
之间,因为如果我将上述代码更改为:REAL(KIND=8), DIMENSION(x,y), INTENT(INOUT) :: AR
REAL(KIND=8), DIMENSION(x,y), INTENT(INOUT) :: BR
,
问题已经解决了。如果我以这种方式更改代码有什么问题吗?答案 0 :(得分:1)
您引用的页面似乎是关于构建Molecular Dynamics软件包的错误报告Amber。我从链接(... / gcc-bugs / ...)推断出这一点,从页面的第二行开始说明:
!+ Specification and control of Amber's working precision
最后来自描述如何更改Amber构建的精度(安装单精度或双精度版本软件)的描述。
如果您正在查看的书面代码是Amber的一部分,那么您引用的页面会解释_REAL_
在代码中的作用。也就是说,它是基于工作精度的通用类型定义,在编译时用real(kind=4)
或real(kind=8)
替换。根据Amber的描述,默认构建是双精度,这意味着在编译时,_REAL_
将替换为real(kind=8)
。这应该回答问题1.
请注意,AR
的fortran值始终可以分配给BR
,但它们需要转换为适当的类型。即如果BR
是整数数组,则AR
的值将需要转换为整数。假设您正在查看的编写代码再次为Amber,并且默认的双精度未被覆盖,则BR
是双精度数组,就像AR
一样,因此可以自由赋值他们之间。
对于问题3,您可能需要定义一个宏,以便_REAL_
实际上意味着双精度。虽然没有经常讨论,但许多fortran编译器会很乐意应用预处理器。对于自动预处理(允许编译器确定标志),只需要确保fortran源文件具有正确的扩展名,例如.F90
,.F
,.fpp
或{ {1}}如第一段on this documentation page for gfortran所述(快速说明,这些也是英特尔编译器所理解的)。由于我通常在Fortran 90或更高版本中编码,扩展程序.FPP
对我来说很有意义。然后,可能在源文件的标题中,只需添加以下行:
.F90
请注意,我在最后一个下划线和real之间添加了多个空格,以强调那里必须有一个空格。这样做将允许Fortran编译器用#define _REAL_ real(kind=8)
替换所有出现的_REAL_
,并通过修改一行而不调用编译器标志来为全局修改实际精度提供一种方法。
我认为这样做可能会让你的外部C引用工作。