Fortran Coder

标题: TXT文件数据读入二维数组,后写入为TECplot的格式,出错 [打印本页]

作者: ligenFortran    时间: 2019-7-31 13:11
标题: TXT文件数据读入二维数组,后写入为TECplot的格式,出错
子程序是个数据提取功能,希望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

源文件


作者: ligenFortran    时间: 2019-7-31 19:29
有没有大神帮忙看一下啊啊
作者: fcode    时间: 2019-7-31 20:08
当 DT=0.1,NX=40   (而不是DX)时,随着 N 的增大,U 和 UB,UBB 都快速的增大,一直到超出了双精度浮点的表达范围。

学会单步debug调试,你就能自己解决这一类“运行后”的逻辑问题了。
http://debug.w.fcode.cn  http://v.fcode.cn/video-debugger.html
作者: ligenFortran    时间: 2019-8-1 13:53
非常感谢楼上这位朋友解答~那么我第二个问题里的数据提取的子程序为什么会出现不同的时间提取的正确性不同啊
作者: fcode    时间: 2019-8-1 21:44
我没看出来什么是  t=0.1、0.2  
对应代码里的什么位置?

请一定要理解:你的代码,在别人看来是很陌生的。
虽然能看懂所有的语句,但不一定能看懂你的逻辑
作者: ligenFortran    时间: 2019-8-2 11:08
很抱歉,是我没有把问题表示的很清楚。是在子程序Subroutine result中的if语句,我想要筛选出来5个时间点的数据,然后做图,当t的取值为整数1、2、3等时,最后生成的MAC-BSumecplot-1.txt文件是成功正确的数据,但是t==0.1、0.2、0.3的时候数据提取到最后的文件是不匹配的,不明白这里的问题在哪。以后我会注意发帖的逻辑,谢谢啦




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2