爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 7188|回复: 9

[求助] fortran脚本在Unix下编译出现问题

[复制链接]

新浪微博达人勋

发表于 2012-6-14 10:04:46 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 MacTaylor 于 2012-6-14 13:46 编辑

我之前有一个脚本,在win下做东西都没问题,在Unxi下编译出现错误提示:
PGF90-S-0201-Illegal I/O specifier - FILE (uq.f: 23)
  0 inform,   0 warnings,   1 severes, 0 fatal for MAIN
在我自己机子上的Linux下的gfortran编译出现以下提示:
open(unit=11,file=filename(M,:),form='unformatted',            
                           1
错误: FILE 标记在(1)处必须是标量

似乎是读入语句和输出语句有问题,是因为recl=4在不同环境下的设定的问题吗?我确认此程序在win下没有问题,请教大家是怎么回事?谢谢!

脚本如下:
        dimension uq(256,128,2400),uqt(256,128,2400,8)
         real lon(256),lat(128)
         integer M,L
         character*7 filename(8,7)
         
         filename(1,:)='uq1.bin'
         filename(2,:)='uq2.bin'
         filename(3,:)='uq3.bin'
         filename(4,:)='uq4.bin'
         filename(5,:)='uq5.bin'
         filename(6,:)='uq6.bin'
         filename(7,:)='uq7.bin'
         filename(8,:)='uq8.bin'

         do i=1,256
          lon(i)=0.0+(i-1)*1.40625
         enddo
         do j=1,128
          lat(j)=-90.0+(j-1)*1.40625
         enddo

         do M=1,8
         open(unit=11,file=filename(M,:),form='unformatted',
     &    access='direct',recl=256*128*2400*4)
         read(11,rec=1)uq
         close(11)
         
         
         do i=1,256
          do j=1,128
           do k=1,2400
            if(abs(uq(i,j,k)).ge.100000) then
             uqt(i,j,k,M)=0
            else
             uqt(i,j,k,M)=uq(i,j,k)
            endif
           enddo
          enddo
         enddo
        enddo

        do i=1,256
         do j=1,128
          do k=1,2400
           s=0
           do L=1,8
            s=s+uqt(i,j,k,L)
           enddo
           uq(i,j,k)=s
          enddo
         enddo
        enddo

        open(unit=12,file='uq.bin',form='unformatted',
     &    access='direct',recl=256*128*2400*4)
        write(12,rec=1)(((uq(i,j,k),i=1,256),j=1,128),k=1,2400)
        close(12)
                 
        end


密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-6-14 11:12:02 | 显示全部楼层
do M=1,8
         open(unit=11,file=filename(M,:)。。。) 在win下是对的???
你这一个设备号连接了 n 个文件啊....
话说 filename为什么不定义成filename(8)  ,还要加个 ‘:’??不是很懂你的意思。。。从程序来看定义为一维数组就可以了。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-6-14 11:19:27 | 显示全部楼层
本帖最后由 ogions 于 2012-6-14 11:19 编辑

定义数组是不是应该定义成: character*7 filename(8)

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-6-14 11:29:59 | 显示全部楼层

我也试过这样定义,但是错误信息是:
/panfs/panasas/opt/pgi/linux86-64/9.0-3/lib/libpgf90.a(initpar.o): In function `__hpf_myprocnum':
initpar.c:(.text+0x2): relocation truncated to fit: R_X86_64_PC32 against symbol `__hpf_lcpu' defined in COMMON section in /panfs/panasas/opt/pgi/linux86-64/9.0-3/lib/libpgf90.a(initpar.o)
/panfs/panasas/opt/pgi/linux86-64/9.0-3/lib/libpgf90.a(initpar.o): In function `__hpf_ncpus':
initpar.c:(.text+0x12): relocation truncated to fit: R_X86_64_PC32 against symbol `__hpf_tcpus' defined in COMMON section in /panfs/panasas/opt/pgi/linux86-64/9.0-3/lib/libpgf90.a(initpar.o)
/panfs/panasas/opt/pgi/linux86-64/9.0-3/lib/libpgf90.a(initpar.o): In function `__hpf_getioproc':
initpar.c:(.text+0x22): relocation truncated to fit: R_X86_64_PC32 against symbol `__hpf_ioproc' defined in COMMON section in /panfs/panasas/opt/pgi/linux86-64/9.0-3/lib/libpgf90.a(initpar.o)
/panfs/panasas/opt/pgi/linux86-64/9.0-3/lib/libpgf90.a(initpar.o): In function `__hpf_is_ioproc':
initpar.c:(.text+0x32): relocation truncated to fit: R_X86_64_PC32 against symbol `__hpf_ioproc' defined in COMMON section in /panfs/panasas/opt/pgi/linux86-64/9.0-3/lib/libpgf90.a(initpar.o)
initpar.c:(.text+0x38): relocation truncated to fit: R_X86_64_PC32 against symbol `__hpf_lcpu' defined in COMMON section in /panfs/panasas/opt/pgi/linux86-64/9.0-3/lib/libpgf90.a(initpar.o)
/panfs/panasas/opt/pgi/linux86-64/9.0-3/lib/libpgf90.a(initpar.o): In function `__hpf_abort':
initpar.c:(.text+0x5f): relocation truncated to fit: R_X86_64_PC32 against symbol `__hpf_lcpu' defined in COMMON section in /panfs/panasas/opt/pgi/linux86-64/9.0-3/lib/libpgf90.a(initpar.o)
/panfs/panasas/opt/pgi/linux86-64/9.0-3/lib/libpgf90.a(initpar.o): In function `__hpf_abortp':
initpar.c:(.text+0xeb): relocation truncated to fit: R_X86_64_PC32 against symbol `__hpf_lcpu' defined in COMMON section in /panfs/panasas/opt/pgi/linux86-64/9.0-3/lib/libpgf90.a(initpar.o)
/panfs/panasas/opt/pgi/linux86-64/9.0-3/lib/libpgf90.a(initpar.o): In function `__hpf_initarg':
initpar.c:(.text+0x127): relocation truncated to fit: R_X86_64_PC32 against `.bss'
initpar.c:(.text+0x151): relocation truncated to fit: R_X86_64_PC32 against `.bss'
initpar.c:(.text+0x17b): relocation truncated to fit: R_X86_64_PC32 against `.bss'
initpar.c:(.text+0x18b): additional relocation overflows omitted from the output
而且定义成二维在win下是调通了的,以前没在Unix下做过for,大家帮帮忙!谢谢!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-6-14 11:33:19 | 显示全部楼层
残月 发表于 2012-6-14 11:12
do M=1,8
         open(unit=11,file=filename(M,:)。。。) 在win下是对的???
你这一个设备号连接了 ...

数组定义成二维在win是对的,之前一直能运行成功的,而且我也试过filename(M),但是也错误,错误信息请看我下面的回复。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-6-15 13:02:29 | 显示全部楼层
确实由于系统架构不同,fortran使用不同编译器在读取二进制文件时有*4或不*4的问题。pgi就不用,ifort要用。由于此问题的存在,建议使用如下方式读取文件。
program read_uq
   implicit none
!-----------------------------------------------
dimension uq(256,128,2400),uqt(256,128,2400,8)
integer*4       ::   i ,j,k
!------------------------------------------------
...

     do M=1,8
         open(unit=11,file=filename(M,:),form='binary', access='sequential')
         read(11)  ( ( (  uq(i,j,k),i=1,256),j=1,128,),k=1,2400)
         close(11)
    end do
...
stop

end program read_uq

这样就不会因为架构不同,而有不同编辑方法的差别了。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-6-16 17:51:43 | 显示全部楼层
godenflame135 发表于 2012-6-15 13:02
确实由于系统架构不同,fortran使用不同编译器在读取二进制文件时有*4或不*4的问题。pgi就不用,ifort要用。 ...

十分感谢!学习了
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-4-12 19:59:20 | 显示全部楼层
我也是,同求解。。。。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-4-13 04:42:07 | 显示全部楼层
zhuxueshuai 发表于 2013-4-12 19:59
我也是,同求解。。。。

试试改成:

character*7 filename(8)*7
         
filename(1)='uq1.bin'
......
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-4-14 13:06:20 | 显示全部楼层
MacTaylor 发表于 2013-4-13 04:42
试试改成:

character*7 filename(8)*7

好的,谢谢啦,亲
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表