- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一、上机目的
用数值方法计算一维对流方程在A、B、C三种差分格式下的解。取为0.05. 取值为0.5,1,2。并作相关讨论。
二、实验原理
三、上机要求:
1.学会对MS-FORTRAN的基本操作。
2.用Fortran编写程序计算一维对流方程在A、B、C三种格式下的解。
3.讨论各种格式下不同的值的差分格式解的特点。
四、实验程序
以A格式为例,对微分方程进行离散化, 得出 A 格式的差分解的表达式:
B、C格式同理可以写出。由此编写如下的Fortran程序。
注:除了循环时间层的计算公式略有不同外,三个程序没有区别,因此这里只用一个主程序,并根据格式选择的不同,采用条件语句判断执行哪一部分循环体。
!空间节点321,dx=0.05 输出依次为(时间,空间,数值)
program main
implicit none
real dx_dt !定义Δx/Δt的值
integer abc,r_t,i,j,k !定义变量,abc为格式类型,r_t为时间网格数,其余为循环变量
real,allocatable::s(:,:) !定义存储矩阵s
write(*,*) 输入dx_dt=0.5,1,2
read(*,*) dx_dt
write(*,*) 选择格式,A,B,C分别输入1,2或3
read(*,*) abc
!根据格式选择生成相应的文件
if(abc==1) then
open(unit=8,file=out_a.csv)
elseif(abc==2) then
open(unit=8,file=out_b.csv)
elseif(abc==3) then
open(unit=8,file=out_c.csv)
endif
r_t=160/dx_dt !计算时间网格总数
allocate(s(r_t+1,321)) !分配存储矩阵的空间
!第一层赋初值
do i=1,140,1
s(1,i)=0
write(8,*)1,,,i,,,s(1,i)
end do
do i=141,161,1
s(1,i)=1+0.05*(i-161)
write(8,*)1,,,i,,,s(1,i)
end do
do i=162,181,1
s(1,i)=1-0.05*(i-161)
write(8,*)1,,,i,,,s(1,i)
end do
do i=182,321,1
s(1,i)=0
write(8,*)1,,,i,,,s(1,i)
end do
!循环时间层,根据格式的选择来判断执行哪一部分
if(abc==1) then
do i=2,r_t,1
do j=i,322-i,1
s(i,j)=s(i-1,j)-(s(i-1,j+1)-s(i-1,j-1))/(dx_dt*2)
write(8,*)i,,,j,,,s(i,j)
end do
do k=1,i-1,1 !余下部分赋值0,下同
s(i,k)=0
write(8,*)i,,,k,,,s(i,k)
end do
do k=322-i,321,1
s(i,k)=0
write(8,*)i,,,k,,,s(i,k)
end do
end do
elseif(abc==2) then
do i=2,r_t+1,1
do j=1,322-i,1
s(i,j)=s(i-1,j)-(s(i-1,j+1)-s(i-1,j))/dx_dt
write(8,*)i,,,j,,,s(i,j)
end do
do k=322-i,321,1
s(i,k)=0
write(8,*)i,,,k,,,s(i,k)
end do
end do
elseif(abc==3) then
do i=2,r_t+1,1
do j=i,321,1
s(i,j)=s(i-1,j)-(s(i-1,j)-s(i-1,j-1))/dx_dt
write(8,*)i,,,j,,,s(i,j)
end do
do k=1
原创力文档


文档评论(0)