我正在尝试使用fortran 90应用程序打开fifo并将格式化数据写入其中.我把它剥夺了一个最小的例子.让我们foo.f90成为以下计划:
program foo
open(1,file='fifo',position='asis',action='write')
write(1,*)'Hello, world!'
write(1,*)'Goodbye.'
end program
Run Code Online (Sandbox Code Playgroud)
现在编译并运行程序:
$ gfortran-4.7.1 -o foo foo.f90
$ rm -f fifo
$ ./foo
$ cat fifo
Hello, world!
$ rm -f fifo
$ mkfifo fifo
$ cat fifo > bar &
[1] 6115
$ strace -o foo.st ./foo
At line 3 of file foo.f90 (unit = 1, file = 'fifo')
Fortran runtime error: Invalid argument
[1]+ Done cat fifo > bar
$ tail foo.st
write(3, " Hello, world!\n", 15) …Run Code Online (Sandbox Code Playgroud) 经验:
fortran大约3个月
python - 中间:在此之前从未在python中使用过ctypes模块
我正在寻找一种方法来在python中使用fortran代码进行我的博士工作 - 随后使用matplotlib即时使用可视化计算进行可视化.
这个帖子有帮助(这告诉我可以使用ctypes模块在python中使用/调用fortran代码 - 并且鉴于fortran函数具有绑定到它们的备用名称 - 这在逻辑上对我有意义,尽管我不知道它是如何工作的细节,但我们不要选择我们的战斗明智的!).
然后这个SO帖子也处理从python调用fortran函数.
下一个合乎逻辑的步骤是查找python模块ctypes的文档.这里讨论了如何在API级别使用python访问共享库.
我把所有的部分都做成了一个最小的工作示例,另一个答案已经完成了.但我想看看涉及真实浮点数的输出机制和数学运算.这是我做的测试用例.
function prnt(s)
character(80):: s
logical :: prnt
print*, s
prnt = .true.
end function prnt
function sin_2(r)
real:: r,sin_2
sin_2 = sin(r)**2
end function sin_2
Run Code Online (Sandbox Code Playgroud)
$gfortran -shared -g -o test.so test.f90
Run Code Online (Sandbox Code Playgroud)
编辑:由于某种原因,我的工作计算机需要-fPIC选项进行编译
为了确保我的两个功能prnt,sin_2并在那里,我检查nm:
$ nm test.so | tail -3
0000067f T prnt_
0000065c T sin_2_ …Run Code Online (Sandbox Code Playgroud) 对于一个项目,我正在使用SciPy移植到Android的科学Python应用程序.我目前正在使用
https://github.com/kivy/python-for-android
构建代码.NumPy构建,但SciPy被证明是一个真正的麻烦.使用devenv和kivy python for android进行黑客攻击,我有点将SciPy C库编译为android ARM,但是现在,fortran libs仍然需要构建,我不知所措.
任何帮助将深表感谢.
我正在使用random_numberFortran 的子程序,但是在不同的程序运行中,正在生成的数字不会改变.我应该在代码中包含什么,以便每次编译和运行程序时数字都会改变?
作为八度音阶的先决条件,我需要安装veclibfort:
brew install veclibfort
Run Code Online (Sandbox Code Playgroud)
我收到了错误
==> make check
gfortran -o tester -O tester.f90 vecLibFort.o -framework vecLib
make: gfortran: No such file or directory
make: *** [check] Error 1
Run Code Online (Sandbox Code Playgroud)
这个错误听起来像我没有安装gfortran,但我确实如此.如果我跑gfortran -v:
Using built-in specs.
COLLECT_GCC=gfortran
COLLECT_LTO_WRAPPER=/usr/local/Cellar/gcc/4.8.3/libexec/gcc/x86_64-apple-darwin13.2.0/4.8.3/lto-wrapper
Target: x86_64-apple-darwin13.2.0
Configured with: ../configure --build=x86_64-apple-darwin13.2.0 --(snip)
Thread model: posix
gcc version 4.8.3 (GCC)
Run Code Online (Sandbox Code Playgroud)
这个问题似乎在这里得到解决:
https://github.com/Homebrew/homebrew-science/issues/992
但似乎没有相关的解决方案.
运行我的代码(使用gfortran编译)时,我得到fortran运行时警告"创建了一个数组临时",我想知道是否有更好的方法来解决此警告.
我的原始代码是这样的:
allocate(flx_est(lsign,3))
allocate(flx_err(lsign,3))
do i=1,lsign
call combflx_calc(flx_est(i,:),flx_err(i,:))
enddo
Run Code Online (Sandbox Code Playgroud)
在子例程中我定义了这样的变量:
subroutine combflx_calc(flx_est,flx_err)
use,intrinsic :: ISO_Fortran_env, only: real64
implicit none
real(real64),intent(inout) :: flx_est(3),flx_err(3)
Run Code Online (Sandbox Code Playgroud)
flux_est并且flx_err矢量可能会在子程序内部发生变化,具体取决于几个条件,我需要相应地更新它们的值.
Fortran似乎不喜欢这种结构.我可以解决它定义临时变量:
tmp_flx_est=flx_est(i,:)
tmp_flx_err=flx_err(i,:)
call combflx_calc(tmp_flx_est,tmp_flx_err)
flx_est(i,:)=tmp_flx_est
flx_err(i,:)=tmp_flx_err
Run Code Online (Sandbox Code Playgroud)
但在我看来,修复它是一种非常愚蠢的方式.
你可能已经看到我不是Fortran的专家,所以任何帮助都非常受欢迎.
我正在尝试将错误检查纳入我正在编写的纯过程中.我想要像:
pure real function func1(output_unit,a)
implicit none
integer :: a, output_unit
if (a < 0) then
write(output_unit,*) 'Error in function func1: argument must be a nonnegative integer. It is ', a
else
func1 = a/3
endif
return
end function func1
Run Code Online (Sandbox Code Playgroud)
但是,不允许纯函数将IO语句赋予外部文件,因此我尝试将单元号传递给函数,例如output_unit = 6,这是默认输出.gfortran仍然认为这是非法的.有没有解决的办法?是否有可能使函数成为派生类型(而不是real此处的内部类型),在出现错误时输出字符串?
我需要pure在使用gfortran编译的fortran程序中调试一些函数.有没有办法忽略的pure语句,所以我可以使用write,print在这些等pure功能,不花大力气?不幸的是,只是删除pure声明是不可能的.
我最近学会了如何在Fortran中使用基本文件,我认为它很简单:
open(unit=10,file="data.dat")
read(10,*) some_variable, somevar2
close(10)
Run Code Online (Sandbox Code Playgroud)
所以我无法理解为什么我写的这个函数不起作用.它编译得很好但是当我运行它打印:
fortran runtime error:end of file
Run Code Online (Sandbox Code Playgroud)
码:
Function Load_Names()
character(len=30) :: Staff_Name(65)
integer :: i = 1
open(unit=10, file="Staff_Names.txt")
do while(i < 65)
read(10,*) Staff_Name(i)
print*, Staff_Name(i)
i = i + 1
end do
close(10)
end Function Load_Names
Run Code Online (Sandbox Code Playgroud)
我正在使用Fortran 2008和gfortran.
是否可以使用NaN设置参数变量?并在特定的模块中.我想用它来初始化一些其他变量.因此,如果没有更新,我将面临运行时错误,而不是使用一些随机数运行的模拟.我正在使用GFORTRAN.