fortran读取namelist以及MINVAL函数传参问题
-
最近遇到两个问题,有些不明白
- 神威上的fortran程序读取namelist文件时,似乎跟顺序有关,即读取的变量名如果和位于它之前的的变量名前半部分重合,就会读取不出来,下面是我抽象出来的一个程序
program main implicit none integer :: zzzz, ssss NAMELIST/ab/ ssss NAMELIST/abcd/ zzzz OPEN(UNIT=100, FILE='namelist', FORM='FORMATTED', ACCESS='SEQUENTIAL', STATUS='OLD', IOSTAT=iost) REWIND(100) READ(100, ab, IOSTAT = iost) print *, 'ab: iost=', iost, ssss REWIND(100) READ(100, abcd, IOSTAT = iost) print *, 'abcd: iost=', iost, zzzz end program main
namelist文件:
&abcd zzzz = 6 / &ab ssss = 1 /
这样 ab 是读不出来的,把namelist中的ab和abcd调换位置就可以读出来了。
- 下面这句
MINLOC(a, mask = b == MINVAL(b), dim = 1)
中的mask = b == MINVAL(b)
写法得到的结果是错误的0,先把b == MINVAL(b)
存到中间变量再把中间变量赋值给mask参数结果就正确了
program main implicit none INTEGER, DIMENSION(8) :: a, b a = (/1, 2, 3, 4, 2, 4, 3, 4/) b = (/704, 374, 264, 220, 384, 204, 288, 224/) print *, MINLOC(a, mask = b == MINVAL(b), dim = 1) end program main
上面两个问题我在intel平台ifort试了下都没有问题,不知道是哪里出现了问题?是神威编译器的特性不支持上面两种情况吗?谢谢
-
@坚强的鞋带 应该是
openf95
前端的问题,目前不知道怎么回事。
-
我测试了一下,目测是不是因为前缀的问题,是因为这个f90库读namelist的时候必须按顺序读,不然读不进来。
要是想强行不按顺序读可以试试这样program main implicit none integer :: zzzz, ssss integer :: iost NAMELIST/ab/ ssss NAMELIST/abcd/ zzzz OPEN(UNIT=100, FILE='namelist', STATUS='OLD', IOSTAT=iost) REWIND(100)!还是要从头开始读 iost=1 do while (iost > 0) READ(100, nml=ab, IOSTAT = iost) !如果能读到那么iost=0,如果读到了末尾都没有那么iost<0 enddo !READ(100, nml=ab, IOSTAT = iost) print *, 'ab: iost=', iost, ssss REWIND(100) end program main
-
@段晓辉 我试了下,如果abcd在ab的下面,代码直接读取abcd也是可以一次读出来的,所以感觉不像是必须按顺序来读。感觉是匹配的时候按顺序查找,匹配到了上面的abcd里有ab,就不再往下查找了,造成读取失败。举个不恰当的例子,就像正则匹配最后没有加 $ 只匹配了一部分