Fortran Coder

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

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

[复制链接]

16

帖子

1

主题

0

精华

入门

F 币
73 元
贡献
36 点
11#
 楼主| 发表于 2020-8-20 16:45:14 | 只看该作者
chiangtp 发表于 2020-8-20 15:49
1. 用abaqus调用fortran子程序,  "abaqus" 是 Fortran library?
2. 上述程序是子程序, 如果是被某一Fortran ...

abaqus是一个仿真软件,我只需要编辑好子程序,然后他会自动调用

130

帖子

10

主题

0

精华

大师

F 币
617 元
贡献
372 点

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

12#
发表于 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 点

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

13#
发表于 2020-8-20 18:28:55 | 只看该作者
SUBROUTINE abc()
    OPEN(UNIT=22, FILE='qq', STATUS='old', POSITION='REWIND') !---> 強迫讀寫頭歸位

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

213

帖子

2

主题

0

精华

宗师

F 币
2126 元
贡献
875 点

规矩勋章

14#
发表于 2020-8-20 23:54:01 | 只看该作者
本帖最后由 风平老涡 于 2020-8-20 16:33 编辑
wzjdse 发表于 2020-8-19 19:42
我的txt就是10001行,两列,如下:
0.000000        19476.300000        
0.000100        19475.066748        

是否编一个小程序,只读这个txt文件

213

帖子

2

主题

0

精华

宗师

F 币
2126 元
贡献
875 点

规矩勋章

15#
发表于 2020-8-21 03:45:10 | 只看该作者
本帖最后由 风平老涡 于 2020-8-20 16:36 编辑
wzjdse 发表于 2020-8-19 19:42
我的txt就是10001行,两列,如下:
0.000000        19476.300000        
0.000100        19475.066748        

这个txt文件是由abaqus产生的吧,原先的format是什么?

16

帖子

1

主题

0

精华

入门

F 币
73 元
贡献
36 点
16#
 楼主| 发表于 2020-8-21 08:55:15 | 只看该作者
风平老涡 发表于 2020-8-21 03:45
这个txt文件是由abaqus产生的吧,原先的format是什么?

您好,这个txt是之前就有的(拿matlab算出的力的数据),所以我想在最初的时候读入进来

16

帖子

1

主题

0

精华

入门

F 币
73 元
贡献
36 点
17#
 楼主| 发表于 2020-8-21 09:00:44 | 只看该作者
风平老涡 发表于 2020-8-20 23:54
是否编一个小程序,只读这个txt文件

我试了一下,是不是子程序没法再调用另一个子程序? 所以我就直接在子程序里写的读txt的代码,没有单独写一个子程序去读txt

16

帖子

1

主题

0

精华

入门

F 币
73 元
贡献
36 点
18#
 楼主| 发表于 2020-8-21 09:17:28 | 只看该作者
chiangtp 发表于 2020-8-20 18:19
1. 如果save的数组太大,会不会出现我这个错误 (像我的这个数组10001*2,这么大的): 不會的

2. SAVE/只讀 ...

您好,下面这句代码:
[Fortran] 纯文本查看 复制代码
READ(55,*) (Fxm(ix,1),Fxm(ix,2), ix=1,10001)

报错了,错误信息: error #8093: A do-variable within a DO body shall not appear in a variable definition context。显示do的变量不能存在于循环体中。
还是说您的意思是:
[Fortran] 纯文本查看 复制代码
open(22,file='D:\temp\ydata.txt',status='old')
read(22,*)(Fym(iy,1),Fym(iy,2),iy=1,2001)
close(22)

16

帖子

1

主题

0

精华

入门

F 币
73 元
贡献
36 点
19#
 楼主| 发表于 2020-8-21 09:41:29 | 只看该作者
chiangtp 发表于 2020-8-20 18:19
1. 如果save的数组太大,会不会出现我这个错误 (像我的这个数组10001*2,这么大的): 不會的

2. SAVE/只讀 ...

非常感谢您,回答很专业,第三点:
[Fortran] 纯文本查看 复制代码
      open(22,file='D:\temp\ydata.txt',status='old')
      read(22,*)(Fym(iy,1),Fym(iy,2),iy=1,2001)
      close(22)

这样改就解决问题了。

我还想请教一下第二点:SAVE/只讀一次, 很好的coding (於此, 效率是感受不到的)。我不太理解什么意思,是说只读一次效率比较低吗

213

帖子

2

主题

0

精华

宗师

F 币
2126 元
贡献
875 点

规矩勋章

20#
发表于 2020-8-21 11:01:32 | 只看该作者
用下面的程序读txt文件, 看看是否有错。

[Fortran] 纯文本查看 复制代码
program test
   implicit none
   integer, parameter :: rk=8
   integer :: i
   real(kind=rk) :: x(10001),y(10001)

   open(11, file="xtxt.txt")
   do i=1, 10001
       read(11,*) x(i), y(i)
       write(*,*) x(i), y(i)
   end do
end program test


您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-4-20 19:53

Powered by Tencent X3.4

© 2013-2024 Tencent

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