小编mil*_*cic的帖子

指针数组

我正在尝试实现一个指针数组,以便我可以遍历元素.但是我不确定如何正确地做到这一点:

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(标量指针).实现这个的正确方法是什么?

谢谢.

arrays fortran pointers fortran90

29
推荐指数
1
解决办法
6184
查看次数

具有不同长度的多维数组

我试图在第二维中制作具有不同长度的数组,例如:

  A = 1 3 5 6 9
      2 3 2
      2 5 8 9
Run Code Online (Sandbox Code Playgroud)

这可能吗?我花了相当多的时间看,但无论如何都找不到.

arrays fortran multidimensional-array

12
推荐指数
1
解决办法
856
查看次数

如何在F90中编写to_upper()或to_lower()函数?

如何写一个(英特尔)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 - 如果你能用一串不固定的长度做到这一点,你可以获得奖励积分!

string fortran function

10
推荐指数
3
解决办法
1万
查看次数

执行命令行并返回命令输出

目前,我正在使用来自我的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号码)?

linux shell fortran posix

9
推荐指数
1
解决办法
3950
查看次数

有关提高Fortran代码性能的提示和技巧

作为我博士的一部分 研究,我正在研究大气和海洋环流的数值模型.这些涉及在大约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代码效率的任何技巧和提示.还有什么呢?如果您知道上述每个编译器与此问题相关的具体内容,请同时包含该内容.

补充:请注意,我本身没有任何瓶颈或性能问题.我问的是,在操作意义上是否存在优化代码的一般规则.

谢谢!

performance fortran hpc

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

将泛型过程作为实际参数传递给函数

我试图将泛型过程作为函数的实际参数传递:

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)

fortran

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

交互式提示处的空行规则

我想知道为什么在交互式提示之间以及从shell作为可执行文件运行程序时,Python中的空白行有不同的规则.

由于空白行被忽略,我喜欢大量使用它们.但是,在交互式提示中,空行用于终止循环.因此,当我将一大块代码粘贴到交互式提示中时,我一直遇到缩进错误,因为在整个循环中我会有空行.因此,这使得交互式调试/开发过程有些繁琐.使用#而不是空行有帮助,但我喜欢我的空白行.

更令人讨厌的是提示之间的不同行为(例如python和ipython).在python交互式提示符会给我一个错误,我希望它,ipython将继续执行缩进代码,就好像它不是抱怨的循环的一部分.

我觉得有一个简单的解决方案,但我不知道.我正在使用vi进行编辑和python/ipython提示.谢谢.

python interactive command-prompt

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

Fortran如何解除链接列表?

我想在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 pointers memory-management linked-list

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

过程指针不能指向元素函数

我正在尝试使用过程指针(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)

fortran pointers procedure function

6
推荐指数
1
解决办法
666
查看次数

提高由整数商定义的变量的精度

说我有以下程序:

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.0b=3.0使用相同的方法,然后定义c=a/b我得到一个输出0.666666666666666666685,这是好的.我如何将变量定义为整数的商并让它存储我想要的所有精度数字selected_real_kind

precision fortran

5
推荐指数
1
解决办法
177
查看次数