2017-10-05 98 views
-3

我使用FORTRAN GNU编译器编译使用fortran(.f90)编写的一段代码。与其他编译器不同,写入语句的输出不显示在屏幕上,而是写入输出文件中。Gnu Fortran编译器写入选项

例如我在源代码的中间放置了“write(*,*)'在此处检查'',以便当有人运行代码的编译版本时,此消息显示在屏幕上。

我不明白为什么运行代码时没有在终端窗口中显示此消息,但它是写在输出文件。

我会感激你的帮助来解决这个!

>

我编译这些源代码:

https://github.com/firemodels/fds/tree/master/Source

make文件,我使用的编译代码位于:

https://github.com/firemodels/fds/tree/master/Build/mpi_intel_linux_64

我运行使用生成文件创建

一个可执行程序

,我使用的编译器的版本是

GNU的Fortran(Ubuntu的5.4.0-6ubuntu1〜16.04.5)5.4.0 20160609

>

谢谢。

+1

您所描述的行为是不期望的。 gfortran编译器不是问题。请发布代码。 – Manfredo

+1

请告诉我们你到底在做什么。我们需要*精确的*代码(请参阅[mcve])和*精确*的方式来编译它(您正在使用的所有编译器选项和标志)以及如何运行它。我们需要您的操作系统和编译器版本。 –

+0

请把代码**放到这个问题**中。在外部链接的代码是不够的,你的代码是**方式太大**。见[问]和[mcve]。您必须告诉我们错误发生的位置。解决问题的正式原因是:*“寻求调试帮助的问题(”为什么不是这个代码工作?“)必须包含所需的行为,特定的问题或错误以及在问题本身中重现它所需的最短代码。“* –

回答

0

方式大局观:有没有你是从源代码构建FDS而不是从https://pages.nist.gov/fds-smv/downloads.html直接从NIST即下载的二进制文件的一个原因?

当然,如果你有资格获得安全相关使用的代码,你可能需要从源代码编译,而不是用别人的二进制文件。您可能需要将特定信息添加到标题页面,例如代码版本,运行日期等,以满足质量保证要求。

如果你只是学习FDS(练火的分析,了解CFD,评估的代码),我强烈建议使用NIST的二进制文件。如果您需要/想要从源代码进行编译,我们需要更多信息来诊断问题。

这就是说,在你有需要,你构建代码的使用情况的假设操作,您的具体问题似乎是写入默认输出单元*是不是把你想到哪里输出。

现代Fortran提供了iso_fortran_env模块,它将Fortran的许多隐晦琐事正式化,在这种情况下,默认输入和输出单元。

在正在修改,寻找类似的模块:

use iso_fortran_env 

use iso_fortran_env, only: output_unit 

use, intrinsic:: iso_fortran_env, only: STDOUT => output_unit 

如果你看到的output_unit或进口(如在最后一种情况下)的别名,写入该单元而不是*

如果您不从iso_fortran_env导入,请将上面的最后一行添加到您打印的例程或模块中,然后写入STDOUT而不是*

这可能会或可能不会解决问题,具体取决于FDS作者是否做了一些奇怪的重定向IO操作。他们可能;我不确定如何在MPI环境下编写屏幕,在该环境下代码可以在多台联网机器上并行运行(在这种情况下,我会写入网络日志记录系统,但这只是我)。但是在运行代码的单个实例的简单情况下,写入output_unit比写入*更精确,并且比写入6更便于阅读。

祝你好运与FDS;我试着简单地用它来模拟空气中的氢气羽流形成层。 FDS带来了我可怜的8 CPU机器,所以我回过头去估计它,而不是试图使CFD工作...

+0

所以你建议,一般应该使用'写(STDOUT,'而不是'write(*,'?我不希望他/她一定做了一些错误的事情,如果它做了一些奇怪的事情。 –

+0

写作没有什么不准确如果它们(可能)出现同样的问题,你会如何修改'print'语句? –

+0

对于我来说,'write(*,...)'是不明确的因为Fortran处理器决定'*'的含义;它可能是标准化和记录的,但它仍然让我感到不安,我更喜欢'output_unit',因为我从来不需要猜测我的代码在做什么,我更愿意明确地指定这个单位,因为它少了一个元素,我也避免使用'print',但这是另一回事,如果'write(*,'适合你,很好,它会让我紧张,所以我避免它:) – arclight