标签: gfortran

写入fifo(命名管道)

我正在尝试使用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)

linux fortran named-pipes gfortran fortran90

8
推荐指数
1
解决办法
1558
查看次数

使用python-ctypes将fortran与python连接起来

经验:
fortran大约3个月
python - 中间:在此之前从未在python中使用过ctypes模块

我正在寻找一种方法来在python中使用fortran代码进行我的博士工作 - 随后使用matplotlib即时使用可视化计算进行可视化.

这个帖子有帮助(这告诉我可以使用ctypes模块在python中使用/调用fortran代码 - 并且鉴于fortran函数具有绑定到它们的备用名称 - 这在逻辑上对我有意义,尽管我不知道它是如何工作的细节,但我们不要选择我们的战斗明智的!).
然后这个SO帖子也处理从python调用fortran函数.

下一个合乎逻辑的步骤是查找python模块ctypes文档.这里讨论了如何在API级别使用python访问共享库.

我把所有的部分都做成了一个最小的工作示例,另一个答案已经完成了.但我想看看涉及真实浮点数的输出机制和数学运算.这是我做的测试用例.

test.f90

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)

python fortran ctypes gfortran fortran90

8
推荐指数
2
解决办法
4791
查看次数

将SciPy编译为Android - 是否已经完成,有关如何将FORTRAN代码编译为Android Arm的任何帮助

对于一个项目,我正在使用SciPy移植到Android的科学Python应用程序.我目前正在使用

https://github.com/kivy/python-for-android

构建代码.NumPy构建,但SciPy被证明是一个真正的麻烦.使用devenv和kivy python for android进行黑客攻击,我有点将SciPy C库编译为android ARM,但是现在,fortran libs仍然需要构建,我不知所措.

任何帮助将深表感谢.

python arm gfortran scipy android-ndk

8
推荐指数
1
解决办法
2292
查看次数

为什么我的随机数总是一样的?

我正在使用random_numberFortran 的子程序,但是在不同的程序运行中,正在生成的数字不会改变.我应该在代码中包含什么,以便每次编译和运行程序时数字都会改变?

random fortran gfortran

8
推荐指数
2
解决办法
4099
查看次数

brew install veclibfort:gfortran:没有这样的文件或目录

作为八度音阶的先决条件,我需要安装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

但似乎没有相关的解决方案.

homebrew gfortran

8
推荐指数
1
解决办法
2362
查看次数

Fortran运行时警告:临时数组

运行我的代码(使用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的专家,所以任何帮助都非常受欢迎.

warnings fortran temporary gfortran

8
推荐指数
2
解决办法
3213
查看次数

纯Fortran程序中的I/O.

我正在尝试将错误检查纳入我正在编写的纯过程中.我想要像:

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此处的内部类型),在出现错误时输出字符串?

io error-handling fortran gfortran fortran95

7
推荐指数
1
解决办法
1241
查看次数

Gfortran:将纯函数视为正常函数以进行调试?

我需要pure在使用gfortran编译的fortran程序中调试一些函数.有没有办法忽略的pure语句,所以我可以使用write,print在这些等pure功能,不花大力气?不幸的是,只是删除pure声明是不可能的.

debugging fortran gfortran

7
推荐指数
1
解决办法
413
查看次数

获取fortran运行时错误:文件结束

我最近学会了如何在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.

fortran runtime gfortran

7
推荐指数
1
解决办法
4万
查看次数

在FORTRAN中具有带NaN值的参数(常量)变量

是否可以使用NaN设置参数变量?并在特定的模块中.我想用它来初始化一些其他变量.因此,如果没有更新,我将面临运行时错误,而不是使用一些随机数运行的模拟.我正在使用GFORTRAN.

fortran nan gfortran

7
推荐指数
2
解决办法
3488
查看次数