在这里使用其他人的代码。它与gfortran编译得很好。不过,在波特兰集团的领导下,我收到了一个错误:
pgf90 -DsysLinux -DcompPGF90 -I/home/cables/GITM/share/Library/src -c -r8 -fast ModUtilities.F90
PGF90-S-0084-Illegal use of symbol mpi_wtime - not public entity of module (ModUtilities.F90: 419)
0 inform, 0 warnings, 1 severes, 0 fatal for sleep
违规行似乎:
use ModMpi, ONLY : MPI_wtime
(显然这里有很多MPI的东西,但我认为不重要。)所以我转到ModMpi
的源代码,这是ModMpi.f90,我看到没有引用MPI_WTIME
,但我看到了:
use ModMpiInterfaces
最后,我转到ModMpiInterface
的来源,我找到了一行:
public:: mpi_wtime
好的,我能够通过编辑ModMpi.f90并声明mpi_wtime
是公开的,从PGI获得编译。但是,我仍然想知道:为什么gfortran(显然)认为mpi_wtime
是公开的,但PGI必须明确地告诉它?为什么PGI不假设原始公开声明贯穿“使用链”?
我认为一种行为或另一种行为更接近Fortran标准。那会是什么?
答案 0 :(得分:1)
对于完全相同的Fortran 源代码(与某种MPI库相反),编译器行为应该在这里相同。
实体是否是模块的公共实体特定于定义或访问(通过USE)该实体的每个模块。模块A可以声明“某事物”并指定它是公共的,模块B可以使用模块A然后指定相同的“某物”然后是私有的。使用模块A的任何代码都可以访问“某些东西”,任何仅使用模块B的代码都不会。
模块中声明的事物的默认可访问性是PUBLIC,但是默认值可以通过PRIVATE语句(没有任何后续标识符)来更改。如果出现这样的私有语句,您将看到使用PGI编译器描述的行为。
隐式输入(即来自没有IMPLICIT NONE的源代码)也可能会混淆这里的内容。