Fortran Coder

楼主: wzjdse
打印 上一主题 下一主题

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

[复制链接]

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                                                                

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                               

130

帖子

10

主题

0

精华

大师

F 币
617 元
贡献
372 点

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

板凳
发表于 2020-8-20 18:19:28 | 显示全部楼层
1. 如果save的数组太大,会不会出现我这个错误 (像我的这个数组10001*2,这么大的): 不會的

2. SAVE/只讀一次, 很好的coding (於此, 效率是感受不到的)

3. 如果 datafile: 10001 lines, two REALs per line
          do ix=1,10001
              read(55,*)Fxm(ix,1),Fxm(ix,2)
          end do

    ---> READ(55,*) (Fxm(ix,1),Fxm(ix,2), ix=1,10001) !---> only one "READ"
    就算 datafile 不小心相鄰 two lines 合併為  4 REALs per line, 也不會讀錯 (DO/END DO 就會 runtime end-of-file during read)

4. 讀一次沒錯, CLOSE後, 再次OPEN, 讀寫頭一定在初始位置, 同一個(你要自己確定)file, 讀100次也不會有錯

5. 還有一個可能: 不是 first OPEN, 也不是 COLSE後的OPEN, 而是 Re-OPEN
[Fortran] 纯文本查看 复制代码
! [file "qq"]                                                                
!                                                                            
! 1                                                                          
! 2                                                                          
! 3                                                                          
! 4                                                                          
! 5                                                                          
! 6                                                                          
! 7                                                                          
! 8                                                                          
                                                                             
PROGRAM test                                                                 
  IMPLICIT NONE                                                              
  INTEGER :: i, j                                                            
                                                                             
  OPEN(UNIT=22, FILE='qq', STATUS='old')                                     
                                                                             
  READ(22,*) i, j                                                            
  WRITE(*,*) i, j !---> 1, 2                                                 
                                                                             
  call abc()                                                                 
                                                                             
CONTAINS !-----------------------                                            
                                                                             
  SUBROUTINE abc()                                                           
    IMPLICIT NONE                                                            
    INTEGER :: i, j                                                          
                                                                             
    OPEN(UNIT=22, FILE='qq', STATUS='old') !---> re-open                     
                                                                             
    READ(22,*) i, j                                                          
    WRITE(*,*) i, j !---> 3, 4 (not 1, 2)                                    
                                                                             
  END SUBROUTINE abc                                                         
                                                                             
END PROGRAM test                                                             

130

帖子

10

主题

0

精华

大师

F 币
617 元
贡献
372 点

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

地板
发表于 2020-8-20 18:28:55 | 显示全部楼层
SUBROUTINE abc()
    OPEN(UNIT=22, FILE='qq', STATUS='old', POSITION='REWIND') !---> 強迫讀寫頭歸位

可以local的解決問題, 但是有個logical error: 為何會發生re-open?

130

帖子

10

主题

0

精华

大师

F 币
617 元
贡献
372 点

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

5#
发表于 2020-8-21 12:46:12 | 显示全部楼层
[Fortran] 纯文本查看 复制代码
  ! Case [A]                                                
  READ(55,*) (Fxm(i,1), Fxm(i,2) , i=1,10001)               
                                                            
  ! Case [B]                                                
  DO i = 10001                                              
    READ(55,*) Fxm(i,1), Fxm(i,2)                           
  END DO                                                    
                                                            
  ! Case [C]                                                
  DO i = 10001                                              
    READ(55,*) tmp, Fxm(i,1), tmp, Fxm(i,2)                 
  END DO                                                    


0. Fortran Standard,  Default, 每做完一次 READ/WRITE, 就會自動 New Line, 除非是 Formatted Format 且有 ADVANCE='NO' 控制

1. Case [A]: 一次讀入 連續10001*2個 REALs (目前line到底了自動newline, READ做完後newline): 不論 (1, and/or , 2, and/or, 5, and/or, 10, ...)個REALs per line
    Case [B]: 一次讀2個 REALs (READ做完後newline), Loop 10001回: 如果不是嚴謹的2 REALs pe line, 至少有10001 lines, 就 掰掰了
    Case [C]: DataFile : >=4 REALs per line, 只想要 第2 及 第4 個REALs

2. DataFile如果是完美的 10001 lines, 2 REALs per line: Cases[A] ==Case[B], Case[B]可以的Case[A]一定可以
    Case[A]OK, Case[B] Fail,  就表示 DataFile不是完美的 10001 lines, 2 REALs per line, ---> [#7]


3. SAVE/只讀一次 很好的coding ,   or,   Case[A] only one READ, Case[B] 10001回READ,    其效率的差異是感受不到的
    (a) 資料量太少了,  0.001秒與0.01秒的感受
    (b) I/O一次 開門關門一次 是很耗時的, 當然編譯器會 很有效率地去做 白紙黑字Case[B]所要求的

4. 總結一下: 不是 Re-Open, 子程序裡SAVE有其功能, DataFile不是完美的 10001 lines, 2 REALs per line?
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-5-3 04:41

Powered by Tencent X3.4

© 2013-2024 Tencent

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