fortran应用程序的输出未显示在Matlab中

时间:2012-09-27 20:45:08

标签: macos matlab fortran stdout gfortran

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

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

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

我很肯定输出是stdout(而不是stderr),我已经尝试从代码中刷新两者(调用flush(6)& call 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中我得到以下内容:

  
    

!./测试     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会产生相同的结果。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

BB

答案 2 :(得分:0)

根据system function documentation

  
    

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

         

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

  

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

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

或者您可以将stdout分配给变量:

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