爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 11326|回复: 22

[求助] fortran转化处理比较大的数据定义的数组超过了最大维数,该怎么解决。

[复制链接]

新浪微博达人勋

发表于 2013-1-11 22:52:22 | 显示全部楼层 |阅读模式

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

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

x
处理数据的程序是:
  integer time,it
        parameter( time= 738 )
        real var(79,24,4,147,time),var1(79,23,147,time)
        open(11,file='radlw_norf.dat',
     $  status='old',form='binary')
        open(12,file='radlw1_no.dat',
     $  status='unknown',form='binary')
       open(13,file='radlw2_no.dat',
     $   status='unknown',form='binary')
        ic=0
         n=0
            do it=1,time
                do m=1,147
                do k=1,4
                do j=1,24
            do i=1,79
                        read(11) var(i,j,k,m,it)
                enddo
                enddo
                enddo
                do j=1,23
                do i=1,79
              read(11) var1(i,j,m,it)
                enddo
                enddo
                enddo
                enddo
        do it=1,time
        do k=1,4
        do j=1,24
        do i=1,79
        do m=1,147
         write(12)var(i,j,k,m,it)
        enddo
        enddo
        enddo
        enddo
        do j=1,23
        do i=1,79
        do m=1,147
          write(13)var1(i,j,m,it)
        enddo
        enddo
        enddo
        enddo
        end
我在大型集群编译这个程序的时候发现不能通过编译出现以下提示:
/tmp/ifortWmTm08.o: In function `MAIN__':
nldat-dat.for:(.text+0x29b): relocation truncated to fit: R_X86_64_32S against `.bss'
nldat-dat.for:(.text+0x4b0): relocation truncated to fit: R_X86_64_32S against `.bss'
/public/soft/intel/Compiler/11.1/059/lib/intel64/libifcore.a(for_init.o): In function `for__signal_handler':
for_init.c:(.text+0xfc): relocation truncated to fit: R_X86_64_PC32 against symbol `for__l_excpt_info' defined in .bss section in /public/soft/intel/Compiler/11.1/059/lib/intel64/libifcore.a(for_init.o)
for_init.c:(.text+0x116): relocation truncated to fit: R_X86_64_PC32 against symbol `for__l_fpe_mask' defined in .bss section in /public/soft/intel/Compiler/11.1/059/lib/intel64/libifcore.a(for_init.o)
for_init.c:(.text+0x372): relocation truncated to fit: R_X86_64_PC32 against symbol `for__l_excpt_info' defined in .bss section in /public/soft/intel/Compiler/11.1/059/lib/intel64/libifcore.a(for_init.o)
for_init.c:(.text+0x398): relocation truncated to fit: R_X86_64_PC32 against symbol `for__l_excpt_info' defined in .bss section in /public/soft/intel/Compiler/11.1/059/lib/intel64/libifcore.a(for_init.o)
for_init.c:(.text+0x3c7): relocation truncated to fit: R_X86_64_PC32 against symbol `for__l_excpt_info' defined in .bss section in /public/soft/intel/Compiler/11.1/059/lib/intel64/libifcore.a(for_init.o)
for_init.c:(.text+0x3cd): relocation truncated to fit: R_X86_64_PC32 against symbol `for__l_undcnt' defined in .bss section in /public/soft/intel/Compiler/11.1/059/lib/intel64/libifcore.a(for_init.o)
for_init.c:(.text+0x3ee): relocation truncated to fit: R_X86_64_PC32 against symbol `for__l_excpt_info' defined in .bss section in /public/soft/intel/Compiler/11.1/059/lib/intel64/libifcore.a(for_init.o)
for_init.c:(.text+0x427): relocation truncated to fit: R_X86_64_PC32 against symbol `for__l_excpt_info' defined in .bss section in /public/soft/intel/Compiler/11.1/059/lib/intel64/libifcore.a(for_init.o)
for_init.c:(.text+0x448): additional relocation overflows omitted from the output
有谁遇到过类似的问题,怎么解决。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-1-11 23:40:55 | 显示全部楼层

回帖奖励 +1 金钱

本帖最后由 做个霸气的木头 于 2013-1-11 23:41 编辑

数组越界,一般来说不是定义的维数不够,就是你数据读取的有问题,也就是没有按照数据本身的顺序去读,这样就算数组定义对了也会越界我把你的程序排了版,这样看循环很清楚,你的数据是这样怕排列的吗,时间啊层次啊什么的你自己最清楚了,好好核对吧~:
        integer time,it
         parameter( time= 738 )
         real var(79,24,4,147,time),var1(79,23,147,time)
         open(11,file='radlw_norf.dat',status='old',form='binary')
         open(12,file='radlw1_no.dat',status='unknown',form='binary')
         open(13,file='radlw2_no.dat',status='unknown',form='binary')

         ic=0
         n=0

         do it=1,time
             do m=1,147

                 do k=1,4
                    do j=1,24
                       do i=1,79
                          read(11) var(i,j,k,m,it)
                       enddo
                    enddo
                 enddo

                 do j=1,23
                    do i=1,79
                       read(11) var1(i,j,m,it)
                    enddo
                 enddo

              enddo
         enddo

         do it=1,time
            do k=1,4

              do j=1,24
                  do i=1,79
                     do m=1,147
                         write(12)var(i,j,k,m,it)
                     enddo
                  enddo
               enddo
             enddo

            do j=1,23
                do i=1,79
                   do m=1,147
                       write(13)var1(i,j,m,it)
                   enddo
                enddo
             enddo

         enddo

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

新浪微博达人勋

 成长值: 0
发表于 2013-1-12 10:08:33 | 显示全部楼层
貌似楼主的数据“binary”型的需要隐式循环来读取,否则读取失败······
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-1-12 10:15:02 | 显示全部楼层

我的数据原来存储的顺序是:
do t=1,time
do k=1,147
........
write(11)((a(i,j),i=1,79,j=1,24)
write(11)((b(i,j),i=1,79,j=1,24)
write(11)((c(i,j),i=1,79,j=1,24)
write(11)((d(i,j),i=1,79,j=1,24)
write(11)((e(i,j),i=1,79,j=1,23)
enddo
enddo
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-1-12 10:20:51 | 显示全部楼层
言深深 发表于 2013-1-12 10:08
貌似楼主的数据“binary”型的需要隐式循环来读取,否则读取失败······

当我把time赋值为300的时候能编译通过,计算也能得到结果
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-1-12 10:25:22 | 显示全部楼层
我的目的就是将a(79,24,147,time)的变量读成(147,79,24,time)这个形式存储
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-1-12 10:45:22 | 显示全部楼层
本帖最后由 云大小子 于 2013-1-12 10:48 编辑
言深深 发表于 2013-1-12 10:08
貌似楼主的数据“binary”型的需要隐式循环来读取,否则读取失败······


读取原始数据我改成隐式循环,还是编译不能通过:
program main
        implicit none
        integer time,it,i,j,k,m
        parameter(time= 700)

        real var111(79,24,147,time),var112(79,24,147,time)
        real var113(79,24,147,time),var114(79,24,147,time)

        real var2(79,23,147,time)
        open(11,file='radlw_rf.dat',status='old',form='binary')

        open(12,file='radlw1.dat',status='unknown',form='binary')
        open(13,file='radlw2.dat',status='unknown',form='binary')


            do it=1,time
            do m=1,147


                        read(11)((var111(i,j,m,it),i=1,79),j=1,24)




                        read(11)((var112(i,j,m,it),i=1,79),j=1,24)



                        read(11) ((var113(i,j,m,it),i=1,79),j=1,24)


                        read(11) ((var114(i,j,m,it),i=1,79),j=1,24)


                       read(11) ((var2(i,j,m,it),i=1,79),j=1,23)


            enddo
            enddo
do it=1,time

            do j=1,24
            do i=1,79
            do m=1,147
            write(12) var111(i,j,m,it)

            enddo
            enddo
            enddo


            do j=1,24
            do i=1,79
            do m=1,147
            write(12) var112(i,j,m,it)

            enddo
            enddo
            enddo

            do j=1,24
            do i=1,79
            do m=1,147
            write(12) var113(i,j,m,it)

            enddo
            enddo
            enddo


            do j=1,24
            do i=1,79
            do m=1,147
write(12) var114(i,j,m,it)

            enddo
            enddo
            enddo

            do j=1,23
            do i=1,79
            do m=1,147
              write(13) var2(i,j,m,it)
            enddo
            enddo
            enddo
           enddo
         close(11)
         close(12)
         close(13)
         end
                       
时间维数我改成300以下都能通过编译 但是实际上应该有700多个时间的
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-1-12 11:09:09 | 显示全部楼层
本帖最后由 godenflame135 于 2013-1-12 11:12 编辑

如果在单机上,应该是能够通过的。
但是在巨型机上,编译都是在服务节点通过的。
如果数组的维大小超过了内存大小,有可能不能通过。
建议:
      对数组的定义使用ALLOCATABLE ,这样数组是否定义成功可知。

      尽量使用fortran自由型(f90)语言书写源代码,新语言对于数组内存等方面的控制更为严谨。至于编译器,如pgf90、pgf95或ifort。

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

新浪微博达人勋

 楼主| 发表于 2013-1-12 12:53:47 | 显示全部楼层
godenflame135 发表于 2013-1-12 11:09
如果在单机上,应该是能够通过的。
但是在巨型机上,编译都是在服务节点通过的。
如果数组的维大小超过了 ...

集群用的编译器是 ifort,然后编译不了,在单机下编译能通过,但是运行的时候,只眨了一下fortran的运算界面就没有了,有以下提示:warning LNK4084: total image size -424378368 exceeds max (268435456); image may not run
,我想问问allocatable这个函数怎么用,去知道数组定义是否成功了。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-1-12 15:32:39 | 显示全部楼层
本帖最后由 爱的侍者 于 2013-1-12 15:43 编辑
言深深 发表于 2013-1-12 10:08
貌似楼主的数据“binary”型的需要隐式循环来读取,否则读取失败······


啥叫隐式循环。。?不用循环读取,拆分成4个就是呀
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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