Fortran中_real_预处理器的用途是什么?

时间:2014-12-22 09:14:02

标签: fortran preprocessor real-datatype

我试图理解用fortran编写的代码的一部分。该代码包含以下部分:

REAL(KIND=8), DIMENSION(x,y), INTENT(INOUT) :: AR
      _REAL_,    DIMENSION(x,y), INTENT(INOUT) :: BR 

this page开始,我发现_REAL_是精确控制的预处理器。

  1. _REAL_在此代码中实际做了什么?
  2. 可以将AR值分配给BR吗?它们之间是否存在类型不兼容问题?
  3. 我尝试使用C函数ARBR的值分配给extern "C" void assign_(double *AR, double *BR , int *x, int*y)但我遇到了问题,似乎问题是由于不兼容问题在ARBR之间,因为如果我将上述代码更改为:
    REAL(KIND=8), DIMENSION(x,y), INTENT(INOUT) :: AR REAL(KIND=8), DIMENSION(x,y), INTENT(INOUT) :: BR, 问题已经解决了。如果我以这种方式更改代码有什么问题吗?

1 个答案:

答案 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引用工作。

相关问题