我正在尝试实现一个指针数组,以便我可以遍历元素.但是我不确定如何正确地做到这一点:
TYPE(domain),POINTER :: d01,d02,d03
TYPE(domain),DIMENSION(:),POINTER :: dom
...
dom(1) => d01
dom(2) => d02
dom(3) => d03
...
Run Code Online (Sandbox Code Playgroud)
然后:
...
IF(ASSOCIATED(dom(2),d02))THEN
...
Run Code Online (Sandbox Code Playgroud)
编译器(x86-64 Linux -tp istanbul-64上的pgf90 10.6-0 64位目标)给出了以下错误消息:
PGF90-S-0074-Illegal number or type of arguments to associated - keyword argument pointer (test_ptr.f90: 10)
0 inform, 0 warnings, 1 severes, 0 fatal for MAIN
Run Code Online (Sandbox Code Playgroud)
据我所知,如何对指针数组进行子集化是有问题的.两个dom(2)和d02是秩0(标量指针).实现这个的正确方法是什么?
谢谢.
我试图在第二维中制作具有不同长度的数组,例如:
A = 1 3 5 6 9
2 3 2
2 5 8 9
Run Code Online (Sandbox Code Playgroud)
这可能吗?我花了相当多的时间看,但无论如何都找不到.
如何写一个(英特尔)F90函数将字符串转换为小写(或者,大写)?我想将一个字符数组传递给函数并让它返回一个字符数组,例如
program main
implicit none
character*32 :: origStr = "Hello, World!"
character*32 :: newStr
newStr = to_lower(origStr)
write (*,*) newStr
end program main
Run Code Online (Sandbox Code Playgroud)
这样程序输出hello, world!.
我一直to_lower()在RosettaCode中找到的子程序开始,但我无法弄清楚如何将其作为函数编写.
提前致谢!
PS - 如果你能用一串不固定的长度做到这一点,你可以获得奖励积分!
目前,我正在使用来自我的fortran程序的shell命令行调用,使用非标准的SYSTEM内部例程(类似于Fortran 2008 EXECUTE_COMMAND_LINE内部函数):
CALL SYSTEM(commandStr)
Run Code Online (Sandbox Code Playgroud)
其中commandStr是一个包含我想要执行的shell命令的字符串.目前,我不知道返回commandStr输出的直接方法,只知道返回状态.所以,我现在正在做的是将输出写入文件,然后从Fortran程序中读取文件.例:
CALL SYSTEM('sed ''s/,//g'' myFile > dummyFile')
Run Code Online (Sandbox Code Playgroud)
如果我想从myFile中删除逗号.然后我使用OPEN和READ来获取dummyFile的内容.
这很好用,但我担心从磁盘写入/读取文件,特别是如果我在长循环中这样做,并且如果commandStr输出很大.有没有办法将commandStr输出重定向到我可以直接从我的Fortran程序访问的内存缓冲区(而不是硬盘)(可能通过特定的UNIT号码)?
作为我博士的一部分 研究,我正在研究大气和海洋环流的数值模型.这些涉及在大约10 ^ 4个时间步长的数值上解决大约10 ^ 6个网格点的PDE系统.因此,在MPI上运行数十个CPU时,典型的模型仿真需要数小时到几天才能完成.当然,尽可能提高模型效率很重要,同时确保结果是逐字节相同的.
虽然我对Fortran编程感到非常满意,并且我意识到使代码更高效的一些技巧,但我觉得还有待改进的空间,以及我不知道的技巧.
目前,我确保尽可能少地使用分区,并尽量不使用文字常量(我很早就教会这样做,例如在实际计算中使用half = 0.5而不是0.5),使用少量超越函数尽可能等
还有哪些其他性能敏感因素?目前,我想知道几个:
1)数学运算的顺序是否重要?例如,如果我有:
a=1E-7 ; b=2E4 ; c=3E13
d=a*b*c
Run Code Online (Sandbox Code Playgroud)
会根据乘法的顺序以不同的效率进行评估吗?如今,这必须是特定于编译器的,但有一个直接的答案吗?我注意到基于订单(精度限制)得到(略微)不同的值,但这会影响效率吗?
2)将多个(例如几十个)数组作为子程序的参数传递,而不是从子程序中的模块访问这些数组?
3)Fortran 95构造(FORALL和WHERE)与DO和IF?我知道这些问题在90年代很重要,因为代码矢量化是一件大事,但是现在的编译器能否对显式DO循环进行矢量化有什么不同吗?(我在工作中使用PGI,Intel和IBM编译器)
4)将数字提高到整数倍与乘法相比?例如:
b=a**4
Run Code Online (Sandbox Code Playgroud)
要么
b=a*a*a*a
Run Code Online (Sandbox Code Playgroud)
我被教导要尽可能使用后者.这会影响效率和/或精度吗?(也可能是编译器依赖)
请讨论和/或添加有关提高Fortran代码效率的任何技巧和提示.还有什么呢?如果您知道上述每个编译器与此问题相关的具体内容,请同时包含该内容.
补充:请注意,我本身没有任何瓶颈或性能问题.我问的是,在操作意义上是否存在优化代码的一般规则.
谢谢!
我试图将泛型过程作为函数的实际参数传递:
module mymod
implicit none
interface func
module procedure :: func1
module procedure :: func2
endinterface func
contains
real function func1(x)
real,intent(in) :: x
func1 = 2*x
endfunction func1
real function func2(x,y)
real,intent(in) :: x
real,intent(in) :: y
func2 = 2*x + 3*y
endfunction func2
real function func3(func,x,y)
interface
real function func(x,y)
real,intent(in) :: x
real,intent(in) :: y
endfunction func
endinterface
real,intent(in) :: x
real,intent(in) :: y
func3 = func(x,y)
endfunction func3
endmodule mymod
program myprogram
use mymod
implicit none …Run Code Online (Sandbox Code Playgroud) 我想知道为什么在交互式提示之间以及从shell作为可执行文件运行程序时,Python中的空白行有不同的规则.
由于空白行被忽略,我喜欢大量使用它们.但是,在交互式提示中,空行用于终止循环.因此,当我将一大块代码粘贴到交互式提示中时,我一直遇到缩进错误,因为在整个循环中我会有空行.因此,这使得交互式调试/开发过程有些繁琐.使用#而不是空行有帮助,但我喜欢我的空白行.
更令人讨厌的是提示之间的不同行为(例如python和ipython).在python交互式提示符会给我一个错误,我希望它,ipython将继续执行缩进代码,就好像它不是抱怨的循环的一部分.
我觉得有一个简单的解决方案,但我不知道.我正在使用vi进行编辑和python/ipython提示.谢谢.
我想在Fortran中使用链表来保存未定义长度的数据数组.
我有以下设置:
TYPE linked_list
INTEGER :: data
TYPE(linked_list) :: next_item => NULL()
END TYPE
Run Code Online (Sandbox Code Playgroud)
现在说我创建了这样一个列表:
TYPE(LINKED_LIST) :: example_list
example_list%data =1
ALLOCATE(example_list%next_item)
example_list%next_item%data = 2
ALLOCATE(example_list%next_item%next_item)
example_list%next_item%next_item%data = 3
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果我执行:
DEALLOCATE(example_list)
Run Code Online (Sandbox Code Playgroud)
所有嵌套的级别也会被释放,或者我是否需要遍历列表到最深的元素并从最深的元素向上释放?
我正在尝试使用过程指针(Fortran 2003中的新功能)指向元素函数,但它不起作用.我真的需要函数,ELEMENTAL并需要一个指向它的指针.在Fortran中指向元素函数真的不可能吗?
module elemfunc
implicit none
contains
elemental function fun111(x) result(y)
real*8, intent(in) :: x
real*8 :: y
y = x**2+1
end function fun111
end module elemfunc
program testptr
use elemfunc
implicit none
interface
elemental function func (z)
real*8 :: func
real*8, intent (in) :: z
end function func
end interface
procedure (func), pointer :: ptr
ptr => fun111
print *, ptr( (/1.0d0,2.0d0/) )
end program testptr
Run Code Online (Sandbox Code Playgroud)
错误信息:
main.f90:12.7:ptr=>fun111
1
Nonintrinstic elemental procedure pointer 'func111' is invalid in …Run Code Online (Sandbox Code Playgroud) 说我有以下程序:
program derp
implicit none
integer, parameter :: ikind = selected_real_kind(18)
real (kind = ikind) :: a = 2.0 / 3.0
print*, a
end program derp
Run Code Online (Sandbox Code Playgroud)
程序derp输出0.6666666865348815917,显然不是18位精度.但是,如果我定义a=2.0并b=3.0使用相同的方法,然后定义c=a/b我得到一个输出0.666666666666666666685,这是好的.我如何将变量定义为整数的商并让它存储我想要的所有精度数字selected_real_kind?