Fortran Coder

查看: 4950|回复: 4
打印 上一主题 下一主题

[其他行业算法] 计算流体力学中两步Lax程序,可以运行,数据错误,求解

[复制链接]

3

帖子

1

主题

0

精华

新人

F 币
22 元
贡献
10 点
跳转到指定楼层
楼主
发表于 2016-5-24 20:30:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[Fortran] 纯文本查看 复制代码
Program TwoStep_Lax
Implicit None

Real(8),Parameter:: lendom=10.0,Tini=300.0
Real(8),Parameter:: PiniL=10.0,PiniR=1.0
Real(8),Parameter:: uini=0.0,gamma=1.4,R=287.0
Real(8),Parameter:: CFL=0.98,timeOut=0.006
Integer,Parameter:: nnod=101
Integer:: i,j,n
Real(8):: dx,DiniL,DiniR,Hini,aini,dt,Eini,time,comp1,comp2

Real(8):: Den(nnod),Tem(nnod),Pre(nnod),Vel(nnod)
Real(8):: M(nnod),Ene(nnod),Ent(nnod),a(nnod)
Real(8):: U(3,nnod),F(3,nnod),Un(3,nnod)


Open(Unit=10,File="TwostepLaxUn1.TXT")
Open(Unit=11,File="TwostepLaxF11.TXT")
Open(Unit=12,File="TwostepLaxF12.TXT")
Open(Unit=13,File="TwostepLaxF13.TXT")
Open(Unit=14,File="TwostepLaxF21.TXT")
Open(Unit=15,File="TwostepLaxF22.TXT")
Open(Unit=16,File="TwostepLaxF23.TXT")
Open(Unit=17,File="TwostepLaxUn2.TXT")
Open(Unit=19,File="TwostepLaxDen.TXT")
Open(Unit=20,File="TwostepLaxVel.TXT")
Open(Unit=21,File="TwostepLaxPre.TXT")
Open(Unit=22,File="TwostepLaxM.TXT")


dx=lendom/(nnod-1)
DiniL=100000.0*PiniL/(R*Tini)
DiniR=100000.0*PiniR/(R*Tini)
Eini=R*Tini/(gamma-1.0)
Hini=Eini+R*Tini
aini=(gamma*R*Tini)**0.5
dt=CFL*dx/aini


Den(1:nnod)=0.0
Tem(1:nnod)=0.0
Pre(1:nnod)=0.0
Vel(1:nnod)=0.0
M(1:nnod)=0.0
Ene(1:nnod)=0.0
Ent(1:nnod)=0.0
a(1:nnod)=0.0


U(1,1:50)=DiniL
U(1,51:nnod)=DiniR
U(2,1:nnod)=0.0
U(3,1:50)=DiniL*Eini
U(3,51:nnod)=DiniR*Eini


F(1,1:nnod)=0.0
F(2,1:50)=PiniL
F(2,51:nnod)=PiniR
F(3,1:nnod)=0.0

Un(1:3,2:100)=0
Un(1:3,1)=U(1:3,1)
Un(1:3,nnod)=U(1:3,nnod)


time=0.0
Do While (time<timeOut)
  time=time+dt

  Do i=1,3
    Do j=2,100
      Un(i,j)=(U(i,j+1)+U(i,j))*0.5-dt/dx*(F(i,j+1)-F(i,j))*0.5
      Write(10,"('Un(',I1,',',I3,')',E17.10)") i,j,Un(i,j)
    End Do
  End Do

  Do j=1,nnod
    Den(j)=Un(1,j)
    Vel(j)=Un(2,j)/Den(j)
    Ene(j)=Un(3,j)/Den(j)
    Tem(j)=(Ene(j)-0.5*Vel(j)**2)*(gamma-1.0)/R
    Pre(j)=R*Den(j)*Tem(j)
    Ent(j)=Ene(j)+R*Tem(j)
    a(j)=(gamma*R*Tem(j))**0.5
    M(j)=Vel(j)/a(j) 

    F(1,j)=Den(j)*Vel(j)
    F(2,j)=Den(j)*Vel(j)**2+Pre(j)
    F(3,j)=Den(j)*Vel(j)*Ent(j)
    Write(11,*) F(1,j)
    Write(12,*) F(2,j)
    Write(13,*) F(3,j)
  End Do

  Do i=1,3
    Do j=2,100
      Un(i,j)=U(i,j)-dt/dx*(F(i,j)-F(i,j-1))
      Write(17,"('Un(',I1,',',I3,')',E17.10)") i,j,Un(i,j)
    End Do
  End Do

  Do j=1,nnod
    Den(j)=Un(1,j)
    Vel(j)=Un(2,j)/Den(j)
    Ene(j)=Un(3,j)/Den(j)
    Tem(j)=(Ene(j)-0.5*Vel(j)**2)*(gamma-1.0)/R
    Pre(j)=R*Den(j)*Tem(j)
    Ent(j)=Ene(j)+R*Tem(j)
    a(j)=(gamma*R*Tem(j))**0.5
    M(j)=Vel(j)/a(j)

    F(1,j)=Den(j)*Vel(j)
    F(2,j)=Den(j)*Vel(j)**2+Pre(j)
    F(3,j)=Den(j)*Vel(j)*Ent(j)
    Write(14,*) F(1,j)
    Write(15,*) F(2,j)
    Write(16,*) F(3,j)
  End Do

  comp1=0.0
  Do j=1,nnod
    comp2=a(j)+Vel(j)
    If (comp2>comp1) comp1=comp2
  End Do
  dt=CFL*dx/comp1

  U(1:3,1:nnod)=Un(1:3,1:nnod)

  n=n+1 

End Do

Do j=1,nnod
  Write(19,*)Den(j)
  Write(20,*)Vel(j)
  Write(21,*)Pre(j)
  Write(22,*)M(j)
End Do


分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
沙发
发表于 2016-5-24 20:59:19 | 只看该作者
代码不完整,没有输入文件,无法判断问题。

3

帖子

1

主题

0

精华

新人

F 币
22 元
贡献
10 点
板凳
 楼主| 发表于 2016-5-25 12:33:13 | 只看该作者
上面的代码就差最后的End Program TwoStep_Lax

TwostepLax.f90

3.06 KB, 下载次数: 0

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
地板
发表于 2016-5-25 19:53:38 | 只看该作者
我试了一下,可以运行,至于结果不对,那我就帮不了你了。因为我不知道什么是对的。

你可以试试单步调试来检查逻辑问题:
以下文章可以参考:
http://debug.w.fcode.cn
以下视频可以学习:
http://v.fcode.cn/video-debugger.html

3

帖子

1

主题

0

精华

新人

F 币
22 元
贡献
10 点
5#
 楼主| 发表于 2016-5-26 09:25:45 | 只看该作者
vvt 发表于 2016-5-25 19:53
我试了一下,可以运行,至于结果不对,那我就帮不了你了。因为我不知道什么是对的。

你可以试试单步调试来 ...

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

本版积分规则

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

GMT+8, 2024-12-23 20:06

Powered by Tencent X3.4

© 2013-2024 Tencent

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