fortran读取namelist以及MINVAL函数传参问题



  • 最近遇到两个问题,有些不明白

    1. 神威上的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调换位置就可以读出来了。

    1. 下面这句 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,就不再往下查找了,造成读取失败。举个不恰当的例子,就像正则匹配最后没有加 $ 只匹配了一部分


登录后回复