1

我在从 Matlab 中执行的 fortran 应用程序的输出中遇到一些问题。我们使用 Matlab 调用许多 fortran 应用程序并显示输出和结果。

我在 OSX 上使用 gfortran 来构建其中一个程序,它会输出大量文件并输出少量到 stdout 以跟踪进度。stdout 输出主要通过 print * 语句完成,但我也尝试过 write( * , * )。该程序使用 OpenMP,但在 OpenMP 并行部分中没有执行任何 print * 或 write( * , * ) 语句。从终端执行程序时一切正常。但是,当从 matlab 中执行程序时,stdout 没有输出。文件输出工作正常。

此外,相同的代码在使用 Intel 的 ifort 编译时,在 matlab 中显示其输出没有问题。不幸的是,我无法定期访问英特尔编译器。

我很肯定输出将输出到标准输出(不是标准错误),我已经尝试从代码中刷新两者(调用flush(6)和调用flush(0)),但这似乎并没有区别。

我不确定是什么原因造成的。有什么想法吗?

一些相关信息:操作系统:OSX 10.6.8(64位模式)

Matlab:R2012b

gfortran:4.7.2(通过 fink 获得)

编译标志:-cpp -fopenmp -ffree-line-length-0 -fno-range-check -m64 -static-libgfortran -fconvert=little-endian -fstrict-aliasing

编辑:

我做了更多的测试,创建了一个简单的“hello”程序:

program printTest
write (*,*) 'hello'
end program

编译...

gfortran test.f90 -o test

表现出相同的行为。

我还尝试使用早期版本的 gfortran (4.2.1) 进行编译,这产生了一些有趣的结果。它在终端中执行良好,但在 matlab 中我得到以下信息:

!./test dyld:惰性符号绑定失败:找不到符号:__gfortran_set_std 引用自:/Users/sah/Desktop/./test 预期于:/Applications/MATLAB_R2012b.app/sys/os/maci64/libgfortran.2.dylib

dyld:找不到符号:__gfortran_set_std 引用自:/Users/sah/Desktop/./test 预期于:/Applications/MATLAB_R2012b.app/sys/os/maci64/libgfortran.2.dylib

./test:跟踪/断点陷阱

这让我相信这是一个图书馆问题。在这种情况下,使用 -static-libgfortran 会产生相同的结果。

4

3 回答 3

0

根据系统功能文档

[status, result] = system('command') 将完成状态返回给状态变量,并将命令的结果返回给结果变量。

[status,result] = system('command','-echo') 还强制输出到命令行窗口。

所以你应该在系统调用中使用'-echo'参数来直接在命令窗口中查看输出

system(['cd "',handles.indir,'";chmod u+x ./qp.exe',... ';./qp.exe'], '-echo')

或者您可以将标准输出分配给一个变量:

[ret txt] = system(['cd "',handles.indir,'";chmod u+x ./qp.exe',... ';./qp.exe'])
于 2012-09-29T06:18:26.983 回答
0

我相信 Matlab 是一个单线程应用程序。当您调用多线程执行程序时,我已经看到将输出通过管道传输回 Matlab 的各种问题。您是否考虑过重新编译成 Fortran mex 文件?

于 2012-09-27T23:09:31.623 回答
0

我不确定 mex 文件是否会比独立的可执行文件更好地打印到标准输出。

还有其他选择。一种是将所有诊断信息写入(附加)到文件中,并在需要时查看文件。例如,Emacs 每秒自动“还原”文件的内容,或者任何您设置的时间间隔。另一种选择可能是将 fortran 源代码转换为 matlab 源代码(参见 f2matlab)并将其全部保存在 matlab 中。

bb

于 2012-09-28T01:00:53.350 回答