Fortran Coder

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

[通用算法] 一维黎曼问题求助

[复制链接]

801

帖子

2

主题

0

精华

大宗师

F 币
3804 元
贡献
2273 点
板凳
发表于 2020-6-13 10:41:18 | 只看该作者
你需要写清楚,改动了哪里?

17

帖子

5

主题

0

精华

入门

F 币
98 元
贡献
61 点
沙发
 楼主| 发表于 2020-6-12 22:40:07 | 只看该作者
这是网上的代码


! MacCormack1D.for
!------------------------------------------------------------------------------------------------------------
!利用差分格式求解一维激波管问题(语言版本)(网上的代码)        
!--------------------------------------------------------------------------------------------------------------*/
      program MacCormack1D
      implicit double precision (a-h,o-z)
      parameter (M=1000)
      common /G_def/ GAMA,PI,J,JJ,dL,TT,Sf
       
      dimension U(0:M+1,0:2),Uf(0:M+1,0:2)
      dimension Ef(0:M+1,0:2)
!气体常数
      GAMA=1.4
      PI=3.1415926
!网格数
      J=M
!计算区域  
      dL=2.0
!总时间
      TT=0.45
!时间步长因子
      Sf=0.8
       
      call Init(U,dx)
      
      T=0

1     dt=CFL(U,dx)
      T=T+dt
      write(*,*)'T=',T,'dt=',dt
      call MacCormack_1D_Solver(U,Uf,Ef,dx,dt)
        call bound(U,dx)
      if(T.lt.TT)goto 1
                  
      call Output(U,dx)
      end
!-------------------------------------------------------
!计算时间步长
!入口: U, 当前物理量,dx, 网格宽度;
!返回: 时间步长。
!-------------------------------------------------------
      double precision function CFL(U,dx)
      implicit double precision (a-h,o-z)
      common /G_def/ GAMA,PI,J,JJ,dL,TT,Sf
      dimension U(0:J+1,0:2)

      dmaxvel=1e-10
      do 10 i=1,J
       uu=U(i,1)/U(i,0)
       p=(GAMA-1)*(U(i,2)-0.5*U(i,0)*uu*uu)  
       vel=dsqrt(GAMA*p/U(i,0))+dabs(uu)
       if(vel.gt.dmaxvel)dmaxvel=vel
10    continue
      CFL=Sf*dx/dmaxvel
      end
   
!-------------------------------------------------------
!初始化
!入口: 无;
!出口: U, 已经给定的初始值,dx,网格宽度。
!-------------------------------------------------------
      subroutine Init(U,dx)
      implicit double precision (a-h,o-z)
      common /G_def/ GAMA,PI,J,JJ,dL,TT,Sf
      dimension U(0:J+1,0:2)

!初始条件
      rou1=1.0
      u1=0
      v1=0
      p1=1.0
      rou2=0.125
      u2=0
      v2=0
      p2=0.1

      dx=dL/J

      do 20 i=0,J/2
       U(i,0)=rou1
       U(i,1)=rou1*u1
       U(i,2)=p1/(GAMA-1)+0.5*rou1*u1*u1
20    continue
      do 21 i=J/2+1,J+1
       U(i,0)=rou2
       U(i,1)=rou2*u2
       U(i,2)=p2/(GAMA-1)+0.5*rou2*u2*u2
21    continue
      end

!-------------------------------------------------------
!边界条件
!入口: dx,网格宽度;
!出口: U, 已经给定边界。
!-------------------------------------------------------
      subroutine bound(U,dx)
      implicit double precision (a-h,o-z)
      common /G_def/ GAMA,PI,J,JJ,dL,TT,Sf
      dimension U(0:J+1,0:2)

!左边界
      do 30 k=0,2
         U(0,k)=U(1,k)
30    continue
!右边界
      do 31 k=0,2
       U(J+1,k)=U(J,k)
31    continue
      end

!-------------------------------------------------------
!根据U计算E
!入口: U,当前U矢量;
!出口: E,计算得到的E矢量,
!     U、E定义见Euler方程组。
!-------------------------------------------------------
      subroutine U2E(U,E,is,in)
      implicit double precision (a-h,o-z)
      common /G_def/ GAMA,PI,J,JJ,dL,TT,Sf
      dimension U(0:J+1,0:2),E(0:J+1,0:2)
      
      do 40 i=is,in
       uu=U(i,1)/U(i,0)
       p=(GAMA-1)*(U(i,2)-0.5*U(i,1)*U(i,1)/U(i,0))
       E(i,0)=U(i,1)
       E(i,1)=U(i,0)*uu*uu+p
       E(i,2)=(U(i,2)+p)*uu
40    continue
      end

!-------------------------------------------------------
!一维差分格式求解器
!入口: U, 上一时刻U矢量,
!     Uf、Ef,临时变量,
!     dx,网格宽度,dt,,时间步长;
!出口: U, 计算得到得当前时刻U矢量。
!-------------------------------------------------------
      subroutine MacCormack_1D_Solver(U,Uf,Ef,dx,dt)
      implicit double precision (a-h,o-z)
      common /G_def/ GAMA,PI,J,JJ,dL,TT,Sf
      dimension U(0:J+1,0:2),Uf(0:J+1,0:2)
      dimension Ef(0:J+1,0:2)
      
      r=dt/dx
      dnu=0.25

      do 60 i=1,J
       do 60 k=0,2
!开关函数
        q=dabs(dabs(U(i+1,0)-U(i,0))-dabs(U(i,0)-U(i-1,0)))/(dabs(U(i+1,0)-U(i,0))+dabs(U(i,0)-U(i-1,0))+1e-10)
!人工黏性项      
        Ef(i,k)=U(i,k)+0.5*dnu*q*(U(i+1,k)-2*U(i,k)+U(i-1,k))
60    continue
      do 61 k=0,2
       do 61 i=1,J
        U(i,k)=Ef(i,k)
61    continue
      
      call U2E(U,Ef,0,J+1)
      
      do 63 i=0,J
       do 63 k=0,2
!U(n+1/2)(i+1/2)
        Uf(i,k)=U(i,k)-r*(Ef(i+1,k)-Ef(i,k))
63    continue                         

!E(n+1/2)(i+1/2)     
      call U2E(Uf,Ef,0,J)
     
      do 64 i=1,J
       do 64 k=0,2
!U(n+1)(i)
        U(i,k)=0.5*(U(i,k)+Uf(i,k))-0.5*r*(Ef(i,k)-Ef(i-1,k))
64    continue
      end

!-------------------------------------------------------
!输出结果, 用数据格式画图
!入口: U, 当前时刻U矢量,
!     dx,网格宽度;
!出口: 无。
!-------------------------------------------------------
      subroutine Output(U,dx)
      implicit double precision (a-h,o-z)
      common /G_def/ GAMA,PI,J,JJ,dL,TT,Sf
      dimension U(0:J+1,0:2)

      open(1,file='result.txt',status='unknown')
             
      do 80 i=0,J+1
       rou=U(i,0)
       uu=U(i,1)/rou
       p=(GAMA-1)*(U(i,2)-0.5*U(i,0)*uu*uu)
       write(1,81)i*dx,rou,uu,p,U(i,2)
80    continue
      close(1)
      
81    format(D20.10,D20.10,D20.10,D20.10,D20.10)
      end       
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-5-19 07:17

Powered by Tencent X3.4

© 2013-2024 Tencent

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