我不理解使用pgf90 7.2的present()内在函数的行为.我写了一个20行的示例程序来测试这个,但结果对我来说仍然没有意义.注意:
subroutine testopt(one,two,three,four,five)
implicit none
integer, intent(in) :: one,two
integer, intent(out) :: three
integer, intent(in), optional :: four
integer, intent(out), optional :: five
three = one + two
print *,"present check: ",present(four),present(five)
if (present(four) .and. present(five)) then
five = four*four
end if
end subroutine testopt
Run Code Online (Sandbox Code Playgroud)
如果我:从我的主程序调用testopt(1,2,(任何变量)),它打印:"present check:T F".但是如果我:从子程序中调用testopt(1,2,(任何变量)),它会打印:"present check:T T".我希望在任何一种情况下都能看到"当前检查:F F",因为我只使用3个非可选参数调用子程序,而不是任何可选参数.我无法理解为什么它会以这种方式运行,这导致我正在处理的程序中的一个主要错误.我很欣赏任何见解.谢谢.
我有编码fortran 77但我想转换为fortran 90 ..我可以在哪里下载转换器软件?
我用gfortran编译了一个fortran 90程序,它以我想要的方式构建可扩展的3D数组.运行时,我收到以下错误:
Program received signal SIGSEGV: Segmentation fault - invalid memory reference.
Backtrace for this error:
#0 0x10542ee42
#1 0x10542f60e
#2 0x7fff8d7895a9
#3 0x10542575e
#4 0x105425975
#5 0x105425d0e
Segmentation fault: 11
Run Code Online (Sandbox Code Playgroud)
我相信这是大型3D阵列的内存问题,因为它可以减小尺寸,但是无论如何都可以解决这个问题吗?这是我的代码:
PROGRAM phantomtest
IMPLICIT NONE
INTEGER, PARAMETER:: columns=34, rows=34, diags=((4*columns)-6), m=(4*columns)-6+(2*columns)
REAL, ALLOCATABLE, DIMENSION(:,:,:)::phantom
INTEGER :: i, j, k
CHARACTER (LEN=3) :: nstring, nullstring=''
ALLOCATE(phantom(columns,rows,m))
phantom=0
CALL Phantom_Making(phantom,columns,rows,diags,m)
WRITE(nstring,FMT="(I3)"), columns
PRINT*, nullstring
DO k=1,m
DO i=1,columns
WRITE(*,FMT="("//nstring//"I2)") phantom(i,:,k)
END DO
PRINT *, nullstring
END DO
END PROGRAM phantomtest
!--------------------------- …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(),并且函数在调用时仍将按预期工作.
但是,我可能错了.有谁知道引入结果变量的实际理由是什么?
信不信由你,这个标题大约和我能做到的一样短,仍然描述我遇到的问题!
所以这就是场景:我从VBA调用Fortran DLL,DLL使用用户定义的类型或Fortran名称(结构?)作为参数,并将类型复制回调用者进行验证.
该类型具有一个固定长度字符数组和一些磨机整数运行.
我已经注意到在这个字符数组之后定义的任何属性中有一些有趣的行为,我将在下面描述,在我描述我的煮沸测试设置之后:
Fortran边:
这是主程序:
SUBROUTINE characterArrayTest (simpleTypeIn, simpleTypeOut)
use simpleTypeDefinition
!GCC$ ATTRIBUTES STDCALL :: characterArrayTest
type(simpleType), INTENT(IN) :: simpleTypeIn
type(simpleType), INTENT(OUT) :: simpleTypeOut
simpleTypeOut = simpleTypeIn
END SUBROUTINE characterArrayTest
Run Code Online (Sandbox Code Playgroud)
这是simpleTypeDefinition模块文件:
Module simpleTypeDefinition
Type simpleType
character (len=1) :: CharacterArray(1)
!The length of the array is one here, but modified in tests
integer (kind=2) :: FirstInteger
integer (kind=2) :: SecondInteger
integer (kind=2) :: ThirdInteger
End Type simpleType
End Module simpleTypeDefinition
Run Code Online (Sandbox Code Playgroud)
编译步骤:
gfortran -c simpleTypeDefinition.f90 characterArrayTest.f90
gfortran -shared -static -o …Run Code Online (Sandbox Code Playgroud) 我已经用Fortran 90.一直致力于精美的相当长一段时间写了一个相当大的程序,但今天我上前一步了一个档次,增加问题大小(它是一家集科研非标准FE-求解,如果帮助任何人...)现在我得到"堆栈溢出"错误消息,自然程序终止,而没有给我任何有用的工作.
该程序首先设置所有相关的数组和矩阵,然后完成后,它会将一些关于此的统计信息打印到日志文件中.即使我有一个新的,更大的问题,这个工作正常(尽管有点慢),但随着"数字运算"开始失败.
让我感到困惑的是,那一点上的所有东西都已经分配了(而且没有错误).我不完全确定堆栈是什么(维基百科和这里的几个步骤没有做太多,因为我对计算机的"幕后"工作只有非常基本的知识).
假设我有一些数组初始化为:
INTEGER,DIMENSION(64) :: IA
REAL(8),DIMENSION(:,:),ALLOCATABLE :: AA, BB
Run Code Online (Sandbox Code Playgroud)
在一些初始化例程(即从文件读取输入等)之后被分配为(我存储一些大小整数以便更容易地传递到固定大小的IA中的子例程):
ALLOCATE( AA(N1,N2) , BB(N1,N2) )
IA(1) = N1
IA(2) = N2
Run Code Online (Sandbox Code Playgroud)
这基本上是在初始部分发生的事情,到目前为止一直很好.但是当我接下来调用子程序时
CALL ROUTINE_ONE(AA,BB,IA)
Run Code Online (Sandbox Code Playgroud)
例程看起来像(没什么特别的):
SUBROUTINE ROUTINE_ONE(AA,BB,IA)
IMPLICIT NONE
INTEGER,DIMENSION(64) :: IA
REAL(8),DIMENSION(IA(1),IA(2)) :: AA, BB
...
do lots of other stuff
...
END SUBROUTINE ROUTINE_ONE
Run Code Online (Sandbox Code Playgroud)
现在我收到一个错误!屏幕输出显示:
forrtl: severe (170): Program Exception - stack overflow
Run Code Online (Sandbox Code Playgroud)
然而,当我与调试器中运行该程序它一个名为处断裂线419 winsig.c(不是我的文件,但可能是编译器的一部分?).它似乎是一个sigreterror:被调用的例程的一部分,它是已被调用的默认情况,返回文本Invalid signal or error.这附有评论专栏,奇怪地说/* should never happen, but compiler can't tell */......?
所以我想我的问题是,为什么会发生这种情况以及实际发生了什么?我认为只要我可以分配所有相关的内存我应该没问题?对子程序的调用是否会复制参数,或只是指向它们的指针?如果答案是副本,那么我可以看到问题可能在哪里,如果是这样的话:关于如何绕过它的任何想法?
我试图解决的问题很大,但不以任何方式疯狂.标准的FE解算器可以处理比我现在更大的问题.我在Dell …
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
我正在玩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) 经验:
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) 我只是从Python进入Fortran90,老实说,到目前为止最困难的部分已经习惯了格式化代码来编写输出.我遇到了一个格式化问题,我似乎无法google或摆弄我的方式,我搜索了这个网站的答案,但没有找到任何有用的东西.
我正在进行计算并将输出写入文件.我正在使用以下代码格式化计算结果
写(文件,('13ES11.2)')kappa
一些值非常小,所以我最终得到三位数的负值.所以应该是这样的,
10E-100
但我在输出文件中得到了这个,
10-100
这对我没用,因为我有另一个程序需要读取该文件并理解这些数字是指数.
我很感激任何人的帮助.