标签: fortran90

Fortran元素函数与元素子例程

Fortan允许元素子例程具有intent(inout)和intent(out)参数,但元素函数仅允许intent(in).

这是为什么?它只是一种风格约定,还是在调用函数和调用子例程方面有一些不同之处?

换一种说法,

Elemental Integer Function FOO(i)
  Integer, intent(in) :: i
    ...
  FOO=something
End Function
Run Code Online (Sandbox Code Playgroud)

Elemental Subroutine FOO(i, v)
  Integer, intent(in)  :: i
  Integer, intent(out) :: v
    ...
  v=something
End Subroutine
Run Code Online (Sandbox Code Playgroud)

- 这些FOO的实现是否等效?

parallel-processing performance multithreading fortran fortran90

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

f2py:在与python接口时指定fortran中的实际精度?

我正在玩f2py.我对numpy内在类型与fortran 90类型有点混淆.在与python进行交互时,似乎我只能在fortran 90中使用单精度实数.让我用一个例子来说明:

假设我有这个fortran 90模块test.f90,用f2py编译并在python中导入:

module test
implicit none

integer, parameter :: sp = selected_real_kind(6,37) ! single precision
integer, parameter :: dp = selected_real_kind(15,307) ! double precision

real(sp) :: r_sp = 1.0
real(dp) :: r_dp = 1.0_dp
end module
Run Code Online (Sandbox Code Playgroud)

我这样编译:

f2py -c -m test test.f90

然后,在python中:

>>> import test
>>> test.test.r_sp
array(1.0, dtype=float32)
>>> test.test.r_dp
array(1.0)
Run Code Online (Sandbox Code Playgroud)

IOW,似乎f2py不接受双精度.当从python传递输入到fortran 90子例程时,这变得更加成问题.假设我将模块扩展到:

module test

implicit none
integer, parameter :: sp = selected_real_kind(6,37) ! single precision
integer, parameter :: dp = selected_real_kind(15,307) ! double precision …
Run Code Online (Sandbox Code Playgroud)

python fortran90 f2py

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

使用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
查看次数

在fortran中生成一个序列数组

Fortran中是否存在一个内在函数,它生成一个包含从a到b的数字序列的数组,类似于python range()

>>> range(1,5)
[1, 2, 3, 4]
>>> range(6,10)
[6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)

fortran fortran90

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

从Fortran90中的文本文件中略过一行

我写的是fortran(90).我的程序必须读取file1,对它的每一行做一些事情并将结果写入file2.但问题是 - file1在第一行有一些不需要的信息.

如何使用Fortran从输入文件中跳过一行?

代码:

open (18, file='m3dv.dat')
open (19, file='m3dv2.dat')
do
  read(18,*) x
  tmp = sqrt(x**2 + 1)
  write(19, *) tmp
end do
Run Code Online (Sandbox Code Playgroud)

第一行是文本和数字的组合.

fortran fortran90

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

FORTRAN 77程序比Fortran 90程序快吗?

今天我正在阅读FORTRAN 77中编写的一些非常流行的数字库中的代码,例如QUADPACK(最近更新于1987年),我想知道是否有任何理由不在Fortran 90中重写这些库,除了大量工作之外鉴于Fortran 90为语言带来了巨大的改进,包括自由形式的源代码,更好的控制结构,因此可以忘记GO TO,矢量化,接口等等.

是因为FORTRAN 77编译器生成更优化的代码,也许它更适合并行执行?请注意,我甚至没有谈论Fortran 2003,这只有 8年的历史:我在谈论Fortran 90,所以我认为它已经足够广泛并且编译器已经准备好了.无论如何,我没有与业界联系.

编辑:janneb是对的:LAPACK实际上是用Fortran 90编写的.

legacy fortran fortran77 fortran90

7
推荐指数
3
解决办法
4797
查看次数

Fortran可以直接从二进制文件中读取字节吗?

我有一个二进制文件,我想用Fortran阅读.问题是它不是由Fortran编写的,因此它没有记录长度指示符.因此,通常未格式化的Fortran读取将无法正常工作.

我有一个想法,我可以偷偷摸摸地将文件作为格式化文件,逐字节(或4字节,4字节,真的)读入字符数组,然后将字符的内容转换为整数和浮点数转移函数或可怕的等价语句.但是这不起作用:我尝试一次读取4个字节,根据inquire语句的POS输出,读取超过6000个字节左右,字符数组加载垃圾.

所以这是不行的.我忘了这种方法有一些细节吗?或者在Fortran中只有一种根本不同且更好的方法吗?(顺便说一句,我也试过读入一个integer*1数组和一个字节数组.即使这些代码会被编译,当它出现在read语句中时,代码崩溃了.)

binary file-io byte fortran fortran90

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

Vim突出了FORTRAN的奇怪部分

我正在使用VIM主题molokai,如果这有任何区别.

我最近一直在学习FORTRAN,当我使用VIM编写FORTRAN程序时,根据我的空白,我的颜色很奇怪.

例如,如果我按原样选项(没有缩进),我只在单词的一部分上有这个紫色突出显示(有时它不存在,请注意PRINT和READ).

没有标签

如果我将其选中,则看起来很正常:

带标签

我是VIM的新手(更不用说FORTRAN了)所以我不确定发生了什么,我不介意一直都在使用,但我认为如果整个程序浪费了那段白色空间,那看起来有点荒谬.

vim fortran90

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

返回多个值的函数

在Fortran中,是否可以定义一个返回多个值的函数,如下所示?

[a, b] = myfunc(x, y)
Run Code Online (Sandbox Code Playgroud)

fortran gfortran fortran90

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

如何在Fortran 90中刷新stdout?

我在网上看到很多使用flushFortran中的函数来刷新输出.我想知道,特别是对于Fortran 90,特别是对于stdout,这应该采用什么形式作为单行代码放入我的代码?

我的猜测是flush(*).

fortran fortran90

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