Fortran Coder

查看: 35348|回复: 21

[文件读写] abaqus调用fortran子程序读取txt文件报错forrtl: severe (24)

[复制链接]

16

帖子

1

主题

0

精华

入门

F 币
73 元
贡献
36 点
发表于 2020-8-19 22:10:55 | 显示全部楼层 |阅读模式
各位大佬,我想请教一下,我在用abaqus调用fortran子程序做分析,提示错误:forrtl: severe (24): end-of-file during read, unit 11, file D:\temp\xdata.txt。在网上查网友说是对同一个txt多次读取,后来我就改了一下程序,设置只读一次。如下为代码:但改完依然报同样的错误
[Fortran] 纯文本查看 复制代码
if (stepTime==0) then
          
          !读入轴承力Fx数据
          open(11,file='D:\temp\xdata.txt',status='old')
          do ix=1,10001
              read(11,*)Fxm(ix,1),Fxm(ix,2)    !循环写入
          end do
      
          !读入轴承力Fy数据
          open(11,file='D:\temp\ydata.txt',status='old')
          do iy=1,10001
              read(11,*)Fym(iy,1),Fym(iy,2)    !循环写入
          end do
          
      end if

根据本论坛的一个贴又做了如下修改:

[Fortran] 纯文本查看 复制代码
!只读入一次
      if (stepTime.eq.0) then
          
          !读入轴承力Fx数据
          do ix=1,10001
              open(11,file='D:\temp\xdata.txt',ioStat=krl,
     &        action="readwrite",status="old")
              if(krl==0) then
                  read(11,*)Fxm(ix,1),Fxm(ix,2)    !循环写入
                  close(11)
              end if
          end do
      
          !读入轴承力Fy数据
          do iy=1,10001
              open(11,file='D:\temp\ydata.txt',ioStat=krl,
     &        action="readwrite",status="old")
              if(krl==0) then
                  read(11,*)Fym(iy,1),Fym(iy,2)    !循环写入
                  close(11)
              end if
          end do
          
      end if



报错信息改变为:forrtl: severe (29): file not found, unit 11, file C:\Users\WANGZI~1\AppData\Local\Temp\WangZijia_Housing_15704\fort.11

请教各位大神,我原本以为读取txt很简单,没成想在这卡了好久了




16

帖子

1

主题

0

精华

入门

F 币
73 元
贡献
36 点
 楼主| 发表于 2020-8-19 22:12:31 | 显示全部楼层
我的思路其实很简答,仿真最开始,读入一个已经存在的txt,之后就不读了(之前方法比较笨,想着是每次abaqus调用子程序时都要读一遍这个txt,但是发现会报错forrtl: severe (24): end-of-file during read,所以正好优化一下只读一次)。

213

帖子

2

主题

0

精华

宗师

F 币
2126 元
贡献
875 点

规矩勋章

发表于 2020-8-20 01:39:05 | 显示全部楼层
在你原先的俩循环之间加一个close(11),

213

帖子

2

主题

0

精华

宗师

F 币
2126 元
贡献
875 点

规矩勋章

发表于 2020-8-20 01:44:58 | 显示全部楼层
还有就是你的txt文件是否有20002个数据。

16

帖子

1

主题

0

精华

入门

F 币
73 元
贡献
36 点
 楼主| 发表于 2020-8-20 08:42:54 | 显示全部楼层
风平老涡 发表于 2020-8-20 01:44
还有就是你的txt文件是否有20002个数据。

我的txt就是10001行,两列,如下:
0.000000        19476.300000       
0.000100        19475.066748       
0.000200        19473.864231       
0.000300        19472.702313       
0.000400        19471.590858       
0.000500        19470.539728       
0.000600        19469.558788       
0.000700        19468.657901       
0.000800        19467.846931       
0.000900        19467.135741       
0.001000        19466.534195       
0.001100        19466.049638       
0.001200        19465.659818       
0.001300        19465.343557       
0.001400        19465.083727       

我有两个txt ,分别是xdata和ydata,分别读他们两个并循环给数组赋值,我是这么个思路

16

帖子

1

主题

0

精华

入门

F 币
73 元
贡献
36 点
 楼主| 发表于 2020-8-20 08:46:13 | 显示全部楼层
风平老涡 发表于 2020-8-20 01:44
还有就是你的txt文件是否有20002个数据。

如果是10001行,2列,那确实是20002个数据

130

帖子

10

主题

0

精华

大师

F 币
617 元
贡献
372 点

贡献勋章管理勋章帅哥勋章元老勋章星光勋章规矩勋章

发表于 2020-8-20 12:35:10 | 显示全部楼层
0. 程式裡 沒有其他地方 對 'D:\temp\xdata.txt'檔案 做READ動作

1. 'D:\temp\xdata.txt'檔案 确实是10001行

2. 可能有若干行 不小心的 "沒有2个数据"

3. 一個小 程式驗證一下
[Fortran] 纯文本查看 复制代码
PROGRAM test                                                                    
  IMPLICIT NONE                                                                 
                                                                                
  INTEGER :: i, ier                                                             
  REAL    :: a, b                                                               
                                                                                
  !-----------------                                                            
                                                                                
  OPEN(UNIT=11, FILE='D:\temp\xdata.txt', status='old', IOSTAT=ier)             
  IF( ier /= 0 ) STOP 'Open Error'                                              
                                                                                
  OPEN(UNIT=22, FILE='check.txt')                                               
                                                                                
  !-------                                                                      
                                                                                
  DO i = 0, 10000                                                               
    READ(11, *, IOSTAT=ier) a, b                                                
                                                                                
    IF( ier /= 0 ) THEN                                                         
      WRITE(*,*) i                                                              
      STOP 'Reading Error'                                                      
    END IF                                                                      
                                                                                
   !IF( NINT(a*10000.0) /= i ) THEN                                             
   !  WRITE(*,*) i, a, b                                                        
   !  STOP 'Data Error?'                                                        
   !END IF                                                                      
                                                                                
    WRITE(22,*) i, a, b                                                         
  END DO                                                                        
                                                                                
  !-------                                                                      
                                                                                
  CLOSE(UNIT=11)                                                                
  CLOSE(UNIT=22)                                                                
                                                                                
END PROGRAM test                                                                

16

帖子

1

主题

0

精华

入门

F 币
73 元
贡献
36 点
 楼主| 发表于 2020-8-20 14:54:04 | 显示全部楼层
chiangtp 发表于 2020-8-20 12:35
0. 程式裡 沒有其他地方 對 'D:\temp\xdata.txt'檔案 做READ動作

1. 'D:\temp\xdata.txt'檔案 确实是10001 ...

您好,我只读一次的问题已经,解决,我换了一个判据。但是我想把数组Fxm和Fym只读一次就保存下来,下次ABAQUS再调用子程序的时候就能用,所以用了save。但是一加save后,又出现了上述错误:forrtl: severe (24): end-of-file during read, unit 55, file D:\temp\xdata.txt.  下面是我的代码:
[Fortran] 纯文本查看 复制代码
dimension Fxm(10001,2)
      dimension Fym(10001,2)
      double precision Fxm,Fym,Fx,Fy,F

      data iread /1/
      save iread
      save Fxm
      save Fym
      
      !只读入一次
      if (iread.eq.1) then
          
          iread=2
          !读入轴承力Fx数据
          open(55,file='D:\temp\xdata.txt',status='old')
          do ix=1,10001
              read(55,*)Fxm(ix,1),Fxm(ix,2)    !循环写入
          end do
          close(55)
      
          !读入轴承力Fy数据
          open(22,file='D:\temp\ydata.txt',status='old')
          do iy=1,10001
              read(22,*)Fym(iy,1),Fym(iy,2)    !循环写入
          end do
          close(22)
          
      end if


想请教您这是为何

130

帖子

10

主题

0

精华

大师

F 币
617 元
贡献
372 点

贡献勋章管理勋章帅哥勋章元老勋章星光勋章规矩勋章

发表于 2020-8-20 15:49:01 | 显示全部楼层
1. 用abaqus调用fortran子程序,  "abaqus" 是 Fortran library?
2. 上述程序是子程序, 如果是被某一Fortran程序調用, SAVE: 應該只會讀一次, 数组Fxm和Fym會保存下来
3. 試試
[Fortran] 纯文本查看 复制代码
      if (iread.eq.1) then                                           
          open(55,file='D:\temp\xdata.txt',status='old')             
          do ix=1,10001                                              
              read(55,*) Fxm(ix,1), Fxm(ix,2)                        
              IF( NINT(Fxm(ix,1)*10000.0) /= ix ) THEN               
                WRITE(*,*) iread, ix, Fxm(ix,1), Fxm(ix,2)           
                STOP 'Data Error?'                                   
              END IF                                                 
          end do                                                     
          close(55)                                                  
          iread = 2 !---> move to here                               

16

帖子

1

主题

0

精华

入门

F 币
73 元
贡献
36 点
 楼主| 发表于 2020-8-20 16:01:42 | 显示全部楼层
chiangtp 发表于 2020-8-20 15:49
1. 用abaqus调用fortran子程序,  "abaqus" 是 Fortran library?
2. 上述程序是子程序, 如果是被某一Fortran ...

如果save的数组太大,会不会出现我这个错误,像我的这个数组10001*2,这么大的
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-6-14 02:01

Powered by Tencent X3.4

© 2013-2024 Tencent

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