我一直试图找到一种符合标准的方法来检查Fortran 90/95中的无限和NaN值,但事实证明它比我想象的要难.
ieee_arithmeticFortran中2003年与模块ieee_is_nan()和ieee_is_finite()内部函数.然而,所有编译器都不支持它(特别是版本4.9的gfortran).在像一开始定义无限大和NaN pinf = 1. / 0,并nan = 0. / 0似乎hackish的我,恕我直言,可以提出一些建筑问题-例如,如果某些编译器检查这在编译的时候人们就必须提供一个特殊的标志.
有没有办法在标准的Fortran 90/95中实现?
function isinf(x)
! Returns .true. if x is infinity, .false. otherwise
...
end function isinf
Run Code Online (Sandbox Code Playgroud)
和isnan()?
我正在钻研Fortran,我遇到了pure关键字,指定了没有副作用的函数/子程序.
我有一本书,S Chapman的Fortran 90/95,它引入了pure关键字,但奇怪的是没有提供"良好的编码实践"用途.
我想知道如何在程序中使用这个关键字.只是环顾四周,对我来说很明显,大多数没有副作用的程序都没有必要包含pure关键字.
那么它最好用在哪里?只有在程序中才能完全保证没有副作用?或者也许在程序中,计划elemental稍后转换为程序?(elemental必须首先执行程序pure.)
我知道,并使用f2py2e来包装一些旧的Fortran 77代码,但我的理解是它不适用于较新的Fortran 95代码.我已经研究了我应该使用的东西,并且遇到了fwrap 和G3 f2py,它们似乎都没有给出它们当前状态的任何解释,或者如何使用它们.我已经看到f2py的版本可以选择使用第三代f2py,但它被评为不起作用.鉴于此,我不知道应该使用哪个项目.我应该使用哪一个?
这个问题现已交叉发布到Computational Science堆栈交换站点(并在其中回答),我应该使用哪个包来用Python包装Modern Fortran Code?
我正在寻找一个库来处理fortran 90/95中的稀疏矩阵.我只需要非常基本的操作,如矩阵向量乘法.你建议我用什么?
我已经搜索过了一个扩展名(?)到BLAS,称为"稀疏blas",在爆炸技术论坛规范的第3章中有记录:
http://www.netlib.org/blas/blast-forum/ ,
看起来很理想 根据该文档,库应该有一个fortran 95接口.但是,我无法在任何可以下载的地方找到该规范的实际实现.我有点认为fortran 95稀疏blas规范并没有在任何地方真正实现?反正不是开源的.
我还找到了一个名为sparsekit的库:
http://people.sc.fsu.edu/~jburkardt/f_src/sparsekit/sparsekit.html
任何人都有这两个中的任何一个的经验,或任何其他稀疏矩阵库为fortran 90/95?我想建议使用哪一个,以及从哪里获取它(在sparsekit的情况下,源代码可通过上面的链接获得).对于稀疏矩阵,有没有类似"标准"的东西,比如BLAS用于密集矩阵?
干杯,
阿恩
我需要开发一个库来打开文件并解析这些东西.由于fortran IO风格,单位编号必须由我决定,但我不知道客户端代码中打开了哪些其他单位.有标准功能give_me_any_unit_number_that_is_free()吗?
Fortran对我来说是全新的,有人可以帮我解决以下问题吗?我想知道我的电脑上每种类型的所有整数类型数字以及最大和最小值.我的代码如下:
program intkind
implicit none
integer :: n=1
integer :: integer_range =1
do while(integer_range /= -1)
print*, "kind_number ", selected_int_kind(n)
call rang(integer_range)
n = n *2
integer_range = selected_int_kind(n)
end do
contains
subroutine rang(largest)
integer largest
print*, huge(largest)
end subroutine
end
Run Code Online (Sandbox Code Playgroud)
我得到的整数类型数字是:1,2,4,8.
为什么每种类型的每个最大整数都相同:2147483647?并且是否存在最小整数的内在函数?
在调用子程序时如何保留整数种类rang?我认为这是最大整数的关键.
我的任务是编写一个Fortran 95程序,它将从一个文件中读取字符输入,然后(开始)只需将它再次吐出来.棘手的部分是这些输入行具有不同的长度(没有给出最大长度),并且文件中可以有任意数量的行.
我用过
do
read( 1, *, iostat = IO ) DNA ! reads to EOF -- GOOD!!
if ( IO < 0 ) exit ! if EOF is reached, exit do
I = I + 1
NumRec = I ! used later for total no. of records
allocate( Seq(I) )
Seq(I) = DNA
print*, I, Seq(I)
X = Len_Trim( Seq(I) ) ! length of individual sequence
print*, 'Sequence size: ', X
print*
end do
Run Code Online (Sandbox Code Playgroud)
但是,我的初始陈述清单
character(100), dimension(:), allocatable :: …Run Code Online (Sandbox Code Playgroud) 在Fortran中,有两种标准方法可以从函数返回结果.第一种方法是将函数的返回值赋给函数名.
function foo()
integer :: foo
foo = 10
end function foo
Run Code Online (Sandbox Code Playgroud)
在Fortran 90中标准化的第二种形式是通过"结果"变量.
function foo result(res)
integer :: res
res = 10
end function foo
Run Code Online (Sandbox Code Playgroud)
调用函数的任何一种形式都会返回值10.我的问题是,Fortran 90委员会引入结果变量的理由是什么?他们是否标准化了一种常规做法?或者他们通过不将函数名称绑定到函数结果来允许程序更加模块化.例如,在第二个版本中foo(),函数的名称foo()可以更改为bar(),并且函数在调用时仍将按预期工作.
但是,我可能错了.有谁知道引入结果变量的实际理由是什么?
Fortran 90模块是渐渐消失的生物.我使用(奇异)模块一段时间取得了一些成功(使用英特尔Visual Fortran和Visual Studio 2010进行编译).然后我写了另一个模块并尝试在另一个函数中使用它,然后才收到此错误:
error #7002: Error in opening the compiled module file. Check INCLUDE paths.
Run Code Online (Sandbox Code Playgroud)
所以我删除了有问题的模块.但是现在我在尝试访问原始模块后收到了同样的错误!
我怎样才能找到这些神秘的生物?为什么一个模块工作但不是两个?我假设我需要删除并重新编译它们,或者告诉编译器以某种方式包含它们.我知道源代码的文件位置,但不知道它们编译的位置.
fortran visual-studio-2010 fortran90 fortran95 intel-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此处的内部类型),在出现错误时输出字符串?