Fortran Coder

查看: 78|回复: 5

[文件读写] TXT文件数据读入二维数组,后写入为TECplot的格式,出错

[复制链接]

6

帖子

2

主题

0

精华

入门

F 币
39 元
贡献
22 点
发表于 2019-7-31 13:11:10 | 显示全部楼层 |阅读模式
子程序是个数据提取功能,希望x一列,然后不同时间点下u的值一列(筛选时间点)
问题:1.这个问中,当我选用不同的DT、DX时,比如DT=0.1,DX=40,会运行出错,              子程序里read(9, *) it, t
              read(9, *) (tempRes(I), I = 1, IX)提示,end of file
        2.取dt=0.01,dx=0.04运行成功时,当我的筛选时间为t=1.0、2.0、3.0都可以正确的将txt中的行数据转化为列数据,但是当我取t=0.1、0.2等时就会出现不匹配的数据,而且在t=4.0时就全部变成了0。
我附上需要转化的数据文件,希望大神帮我看看,真的是困扰好多天了,感谢感谢!超感谢!



!     MAIN (Explicit method)
!     Two-step predictor-corrector scheme of MacCormack for NON-linear Euler Equationn
!===============================================================

      PROGRAM PC
      IMPLICIT NONE
      INTEGER, PARAMETER :: NMAX = 1001
      REAL*8, DIMENSION(NMAX) :: U, UB, UBB, E, EB
      REAL*8 :: DT, t                                                                   !声明时间离散变量
      INTEGER :: n, NLIMIT = 400
      REAL*8 :: DX, x
      INTEGER :: NX, IX                                                            !声明空间离散变量
      REAL*8 :: sigma, PI = 4.0d0*DATAN(1.0d0)
      INTEGER :: I
      REAL*8 :: fun
      WRITE (*, *) "Enter DT and NX"
      READ  (*, *) DT,NX
! DT = 0.01
! NX = 50

      open(unit=1, file="MAC-BOut.txt")
      IX = NX+1
      DX = 4.0d0/NX
      sigma = DT/DX
      write(1, 310) DX,  DT, sigma
      310  FORMAT("DX =",F6.3,"  DT =",F7.5,"  sigma = 1.0*dt/dx =",F6.3)

! Initial COndition
      DO I = 1, IX
          x = dble((I-1)*DX)
          if ( x .le. 2.0d0 ) then
            U(I) = 1
          else
            U(I) = 0.0d0
          end if
        END DO
        n = 0
        t = dble(n*DT)

        open(unit=2, file="MAC-BSum.txt")
        WRITE(1,*) "Time = ", t
      WRITE (1,300)(U(I), I = 1, IX)
      write(2, 300) ((I-1)*DX, I = 1, IX )
      write(2, 330) n, t
      330 FORMAT(I6, f17.7)
      write(2, 300) (U(I), I = 1, IX)

! March
10        n = n + 1
      t = dble(n*DT)
! Boundary condition
      U(1) = 0.0d0
!     UB_{i} = U^n_i - sigma * (E^n_(i+1) - E^n_i)     (5.3.3a)
! Predictor (5.3.3a)
        DO I = 1, NX
        E(I) = fun(U(I))
          UB(I) = U(I) - sigma * ( E(I+1) - E(I) )
        END DO
! Numerical Boundary Condition
      UB(IX) = 2.0d0*UB(IX-1) - UB(IX-2)
! Corrector (5.3.3b)
        DO I = 2, IX
        EB(I) = fun(UB(I))
          UBB(I) = U(I) - sigma * (EB(I) - EB(I-1))
        END DO
! Boundary condition
      UBB(1) = 0.0d0
! Updating (5.3.3c)
      DO I = 1, IX
          U(I) =  0.5d0*( UB(I) + UBB(I) )
        END DO

! Numerical boundary condition (extrapolation)
!     U(IX) = 2.0d0*U(IX-1) - U(IX-2)
      WRITE(1,370)  n,  t
      WRITE (1,300)(U(I), I = 1, IX)
       write(2, 330) n, t
      write(2,300) (U(I), I = 1, IX)
      370  FORMAT("n = ",I6,"  Time = ", f10.4)

      if (  n .lt. NLIMIT  ) goto 10
      close(1)
      close(2)

      call Results(IX, NLIMIT, DX, DT)


      WRITE(*, *) "Numerical Solution is in MAC-BOut.txt"
      WRITE(*, *) "Summary file is in       MAC-BSum.txt"
      write(*, *)
      WRITE(*, *) "Calculations are successfully completed. "
      WRITE(*, *) "Hit any key to close DOS window!"

      300 FORMAT(10(F10.5, 1x))
      STOP
      END PROGRAM PC

SUBROUTINE Results(IX, n, dx, dt)
! to write results in column for plot purpose
      IMPLICIT NONE
      INTEGER, PARAMETER :: NMAX = 1001
      INTEGER :: IX, n, ic, k, i ,j, it
      REAL*8 :: t, dx, dt
      REAL*8 :: Res(6,NMAX), tempRes(NMAX)
      open(unit=9, file="MAC-BSum.txt")
      rewind 9
      ic = 1
      read(9,*) (Res(ic, K), k=1, IX )
      do j = 0, n
              read(9, *) it, t
              read(9, *) (tempRes(I), I = 1, IX)
              if (t == 0.0 .or. &
              t .eq. 0.2 .or. &
          t .eq. 1.5 .or. &
          t .eq. 2.0 .or. &
          t .eq. 3.0)  then
                          ic = ic + 1
                  do k = 1, IX
                Res(ic,K) = tempRes(K)
                  end do
              end if
      end do
      close(9)


      open(unit=10, file="MAC-BSumecplot-1.txt")
      rewind 10
      write(10,31)  DX,  DT, DT/DX
      31  FORMAT(21x,"DX =",F6.3,"  DT =",F7.5,"  tau = dt/dx =",F6.3)
      write(10, 32)
      32  FORMAT(8x,"x  ",13x,"t=0  ",8x,"t=1.0   ",7x,"t=2.0  ",8x, &
      "t=3.0    ",7x,"t=4.0")
      DO k = 1, IX
              write(10, 33) (Res(ic,k), ic =1, 6)
      END DO
      33  FORMAT(6(f14.7, 1x))
      close(10)
      RETURN
      END
      REAL*8 FUNCTION fun(X)
      IMPLICIT NONE
      REAL*8 :: X
! Burger's Equation
      fun = 0.5*X*X
      END FUNCTION



MAC-BOut.txt

451.57 KB, 下载次数: 1

想要转化的数据

MAC-BSum.txt

450.26 KB, 下载次数: 1

整理后想要转化的数据

MAC-BSumecplot-1.txt

9.13 KB, 下载次数: 1

错误的转化数据

macormac-Burgers.f90

3.95 KB, 下载次数: 1

源文件

回复

使用道具 举报

6

帖子

2

主题

0

精华

入门

F 币
39 元
贡献
22 点
 楼主| 发表于 2019-7-31 19:29:26 | 显示全部楼层
有没有大神帮忙看一下啊啊

1418

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
700 元
贡献
531 点

新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2019-7-31 20:08:09 | 显示全部楼层
当 DT=0.1,NX=40   (而不是DX)时,随着 N 的增大,U 和 UB,UBB 都快速的增大,一直到超出了双精度浮点的表达范围。

学会单步debug调试,你就能自己解决这一类“运行后”的逻辑问题了。
http://debug.w.fcode.cn  http://v.fcode.cn/video-debugger.html

6

帖子

2

主题

0

精华

入门

F 币
39 元
贡献
22 点
 楼主| 发表于 2019-8-1 13:53:12 来自移动端 | 显示全部楼层
非常感谢楼上这位朋友解答~那么我第二个问题里的数据提取的子程序为什么会出现不同的时间提取的正确性不同啊

1418

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
700 元
贡献
531 点

新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2019-8-1 21:44:12 | 显示全部楼层
我没看出来什么是  t=0.1、0.2  
对应代码里的什么位置?

请一定要理解:你的代码,在别人看来是很陌生的。
虽然能看懂所有的语句,但不一定能看懂你的逻辑

6

帖子

2

主题

0

精华

入门

F 币
39 元
贡献
22 点
 楼主| 发表于 2019-8-2 11:08:56 来自移动端 | 显示全部楼层
很抱歉,是我没有把问题表示的很清楚。是在子程序Subroutine result中的if语句,我想要筛选出来5个时间点的数据,然后做图,当t的取值为整数1、2、3等时,最后生成的MAC-BSumecplot-1.txt文件是成功正确的数据,但是t==0.1、0.2、0.3的时候数据提取到最后的文件是不匹配的,不明白这里的问题在哪。以后我会注意发帖的逻辑,谢谢啦
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

QQ|捐赠本站|Archiver|关于我们 About Us|群聊|Fcode

GMT+8, 2019-8-21 23:27

Powered by Discuz! X3.2

© 2001-2017 Comsenz Inc.

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