一维对流方程在三种差分格式下的解

一维对流方程在三种差分格式下的数值解

一、实验目的

用数值方法计算一维对流方程在A 、B 、C 三种差分格式下的解。∆x 取为0.05,∆t为0.5,1,2. 并作相关讨论

ðζðζ+=0, −8≤x≤8 ,t>0 ðtðx

ζ(x,0) =1+x,−1≤x≤0 ζ(x,0) =1−x,0≤x≤1 ζ(x,0) =0,

x1

∆x

二、实验要求

1. 学会对MS-FORTRAN 的基本操作

2. 用Fortran 编写程序计算一维对流方程在A 、B 、C 三种格式下的解。 3. 讨论各种格式下不同的

∆x∆t

三、实验步骤

1. 写出一维对流方程的三种格式的差分方程:

nn

A 格式:ζin+1=ζin+2∆x(ζi+1−ζi−1)

∆t

B 格式:ζin+1=ζin+C 格式:ζin+1=ζin+

∆t∆x∆t∆x

n

(ζi+1−ζin) n(ζin−ζi−1)

2. 根据上述差分方程,写出求解的fortran 程序(附件1,2);

3. 根据fortran 程序求出三种格式下的解;

4. 比较各种格式下不同的的数值解,讨论它们的特点。

∆x∆t

四、实验结果分析

利用上述fortran 程序的计算结果,可以观察计算数值,初步判断差分格式的收敛性和稳定性;然后利用EXCEL 或MATLAB 进行绘图,更形象地体现计算结果。以下为利用计算数据在MATLAB 所绘制的图(为了使图更清晰,对比更明显,只画了x ∈[-3,3]的图):

1.

∆t

∆x

=0.5(

∆x∆t

=2)

A 格式:

B 格式:

C 格式:

从上述三图看出,A 格式收敛不稳定,B 格式不收敛,C 格式收敛稳定,但有数据耗散的情况。总体来说,在

2.

∆t∆x

=0.5的情况下,C 格式计算精度最高。

=1(∆t=1) ∆x

∆t∆x

A 格式:

B 格式:

C 格式:

从上述三图可以看出,A 格式和B 格式依然不收敛,C 格式稳定收敛,没有发生数值耗散,解出的结果最精确。

3.

∆t

∆x

=2(

∆x∆t

=0.5)

A 格式:

B 格式:

C 格式:

从上述三图可以看出,A 、B 、C 格式均不收敛。因为 的值过大,导致时间网格过大,所

∆x∆t

以三种格式都不收敛。

五、实验结论

在为0.5,1时,A 格式收敛不稳定;在为2时,A 不收敛。在0.5,1,2时,B 格式

∆x

∆x

∆x

∆t

∆t

∆t

均不收敛。在而在时,C 格式收敛,但会有数据耗散;在=1时,C 格式稳定收敛;

∆x

∆x

∆t∆t

但在∆x=2时,C 格式不收敛。该结论与收敛性分析和稳定性分析结果一致。

∆t

附件:

(1)Main.f90文件

! 使用说明

!

注意:该程序必须与data.txt 在同一文件夹内

! 若要修改gamma 和delta x,可在data.txt 中分别修改GAMMA 和DX 的值

! 计算完成后请在该程序项目所在文件夹下寻找Output_FormA(B或C).txt 文件查看计算结果 PROGRAM MAIN ! 声明变量

!TN 时间网格数,XN 空间网格数 !DX ,DT/DX(GAMMA) !RB 右边界,LB 左边界 IMPLICIT NONE INTEGER ::TN,XN,I,J REAL ::DX,GAMMA REAL ::LB,RB

REAL , ALLOCATABLE ::U(:,:),X(:)

LOGICAL ALIVE

CHARACTER (len=79)::TEMP CHARACTER (len=2)::FORM ! 声明全局变量

common TN,XN,DX,GAMMA,RB,LB

WRITE (*,*)"*************Computing***********" ! 打开数据文件"data.txt" 录入6个参数 INQUIRE (FILE='data.txt' ,EXIST=ALIVE) IF (ALIVE) THEN

OPEN (UNIT=10,FILE="data.txt" ,STATUS='OLD' ,ACTION='READ' ) READ (10,"(a)")TEMP ! 标题信息

READ (10,*) TN,DX,GAMMA,LB,RB,FORM ! 读取6个参数 WRITE (*,*) "Read successfully" ELSE

WRITE (*,*)"The document doesn't exist." STOP END IF

! 计算空间网格数 XN=(RB-LB)/DX+1

! 确定U 矩阵和X 向量的大小 ALLOCATE (U(XN,TN+1)) ALLOCATE (X(XN)) ! 定义U 初值为0 U=0

! 计算t=0时,U 的函数值U (:,1) DO I=1,XN

X(I)=LB+(I-1)*DX

IF (X(I)>=-1 .AND. X(I)

ELSE IF(X(I)>0 .AND. X(I)

! 调用子程序计算求解

IF (FORM=="A" .or.FORM=="a" ) THEN CALL FormA(U,X)

ELSE IF(FORM=="B" .or.FORM=="b" ) THEN CALL FormB(U,X)

ELSE IF(FORM=="C" .or.FORM=="c" ) THEN CALL FormC(U,X) ELSE

WRITE (*,*)"ERROR:Form fault"

stop

END IF stop END PROGRAM

!***************子程序 A******************** Subroutine FormA(U,X) implicit none INTEGER ::TN,XN,I,J REAL ::DX,GAMMA REAL ::LB,RB

real ::U(XN,TN),X(XN) common TN,XN,DX,GAMMA,RB,LB ! 打开输出文件用于输出数据

OPEN (UNIT=9,FILE="Output_FormA.txt") ! 计算T=TN的值

WRITE (9,*)" 差分格式:格式A" WRITE (9,*)"DT/DX=",GAMMA DO J=2,TN

WRITE (9,*) "TIME=",J-1

WRITE (9,"(A5,10X,A1)") " 坐标X" , "U" DO I=1,XN

IF (I==1)THEN ! 边界点置为相邻点的值 U(I,J)=U(I+1,J-1) ELSE IF(I==XN) then

U(I,J)=U(I-1,J-1) ELSE

U(I,J)=U(I,J-1)-GAMMA*(U(I+1,J-1)-U(I-1,J-1))/2 END IF

WRITE (9,*) X(I),U(I,J) END DO END DO

WRITE (*,*)"***********Finish**********"

write (*,*)" 请在程序文件夹下打开Output_FormA.txt查看结果" return end subroutine

!***************子程序 B******************** Subroutine FormB(U,X) implicit none INTEGER ::TN,XN,I,J REAL ::DX,GAMMA REAL ::LB,RB

real ::U(XN,TN),X(XN) common TN,XN,DX,GAMMA,RB,LB ! 打开输出文件用于输出数据

OPEN (UNIT=9,FILE="Output_FormB.TXT") ! 计算T=TN的值

WRITE (9,*)" 差分格式:格式B" WRITE (9,*)"DT/DX=",GAMMA DO J=2,TN

WRITE (9,*) "TIME=",J-1

WRITE (9,"(A5,10X,A1)") " 坐标X" , "U" DO I=1,XN

IF (I==1)THEN ! 边界点置为相邻点的值 U(I,J)=U(I+1,J-1) ELSE IF(I==XN) then

U(I,J)=U(I-1,J-1) ELSE

U(I,J)=U(I,J-1)-GAMMA*(U(I+1,J-1)-U(I,J-1)) END IF

WRITE (9,"(F6.3,6X,F6.3)") X(I),U(I,J) END DO END DO

WRITE (*,*)"***********Finish**********"

write (*,*)" 请在程序文件夹下打开Output_FormB.txt查看结果" return end subroutine

!***************子程序 C******************** Subroutine FormC(U,X) implicit none INTEGER ::TN,XN,I,J REAL ::DX,GAMMA REAL ::LB,RB

real ::U(XN,TN),X(XN) common TN,XN,DX,GAMMA,RB,LB ! 打开输出文件用于输出数据

OPEN (UNIT=9,FILE="Output_FormC.txt") ! 计算T=TN的值

WRITE (9,*)" 差分格式:格式C" WRITE (9,*)"DT/DX=",GAMMA DO J=2,TN

WRITE (9,*) "TIME=",J-1

WRITE (9,"(A5,10X,A1)") " 坐标X" , "U" DO I=1,XN

IF (I==1)THEN ! 边界点置为相邻点的值

U(I,J)=U(I+1,J-1) ELSE IF(I==XN) then

U(I,J)=U(I-1,J-1) ELSE

U(I,J)=U(I,J-1)-GAMMA*(U(I,J-1)-U(I-1,J-1)) END IF

WRITE (9,"(F6.3,6X,F6.3)") X(I),U(I,J) END DO

write (9,"(80X)") END DO

WRITE (*,*)"***********Finish**********"

write (*,*)" 请在程序文件夹下打开Output_FormC.txt查看结果" return end subroutine

(2)data.txt

TN DX GAMMA LB RB FORM 5 0.05 0.5 -8 8 A

附件说明:主要更改TN,GAMMA 和FORM 的值。分别为时间网格数,DT_DX,差分格式 其中,TN 取任何大于1的整数;GAMMA 可取值为0.5,1,2;FORM 可取为A,B,C

一维对流方程在三种差分格式下的数值解

一、实验目的

用数值方法计算一维对流方程在A 、B 、C 三种差分格式下的解。∆x 取为0.05,∆t为0.5,1,2. 并作相关讨论

ðζðζ+=0, −8≤x≤8 ,t>0 ðtðx

ζ(x,0) =1+x,−1≤x≤0 ζ(x,0) =1−x,0≤x≤1 ζ(x,0) =0,

x1

∆x

二、实验要求

1. 学会对MS-FORTRAN 的基本操作

2. 用Fortran 编写程序计算一维对流方程在A 、B 、C 三种格式下的解。 3. 讨论各种格式下不同的

∆x∆t

三、实验步骤

1. 写出一维对流方程的三种格式的差分方程:

nn

A 格式:ζin+1=ζin+2∆x(ζi+1−ζi−1)

∆t

B 格式:ζin+1=ζin+C 格式:ζin+1=ζin+

∆t∆x∆t∆x

n

(ζi+1−ζin) n(ζin−ζi−1)

2. 根据上述差分方程,写出求解的fortran 程序(附件1,2);

3. 根据fortran 程序求出三种格式下的解;

4. 比较各种格式下不同的的数值解,讨论它们的特点。

∆x∆t

四、实验结果分析

利用上述fortran 程序的计算结果,可以观察计算数值,初步判断差分格式的收敛性和稳定性;然后利用EXCEL 或MATLAB 进行绘图,更形象地体现计算结果。以下为利用计算数据在MATLAB 所绘制的图(为了使图更清晰,对比更明显,只画了x ∈[-3,3]的图):

1.

∆t

∆x

=0.5(

∆x∆t

=2)

A 格式:

B 格式:

C 格式:

从上述三图看出,A 格式收敛不稳定,B 格式不收敛,C 格式收敛稳定,但有数据耗散的情况。总体来说,在

2.

∆t∆x

=0.5的情况下,C 格式计算精度最高。

=1(∆t=1) ∆x

∆t∆x

A 格式:

B 格式:

C 格式:

从上述三图可以看出,A 格式和B 格式依然不收敛,C 格式稳定收敛,没有发生数值耗散,解出的结果最精确。

3.

∆t

∆x

=2(

∆x∆t

=0.5)

A 格式:

B 格式:

C 格式:

从上述三图可以看出,A 、B 、C 格式均不收敛。因为 的值过大,导致时间网格过大,所

∆x∆t

以三种格式都不收敛。

五、实验结论

在为0.5,1时,A 格式收敛不稳定;在为2时,A 不收敛。在0.5,1,2时,B 格式

∆x

∆x

∆x

∆t

∆t

∆t

均不收敛。在而在时,C 格式收敛,但会有数据耗散;在=1时,C 格式稳定收敛;

∆x

∆x

∆t∆t

但在∆x=2时,C 格式不收敛。该结论与收敛性分析和稳定性分析结果一致。

∆t

附件:

(1)Main.f90文件

! 使用说明

!

注意:该程序必须与data.txt 在同一文件夹内

! 若要修改gamma 和delta x,可在data.txt 中分别修改GAMMA 和DX 的值

! 计算完成后请在该程序项目所在文件夹下寻找Output_FormA(B或C).txt 文件查看计算结果 PROGRAM MAIN ! 声明变量

!TN 时间网格数,XN 空间网格数 !DX ,DT/DX(GAMMA) !RB 右边界,LB 左边界 IMPLICIT NONE INTEGER ::TN,XN,I,J REAL ::DX,GAMMA REAL ::LB,RB

REAL , ALLOCATABLE ::U(:,:),X(:)

LOGICAL ALIVE

CHARACTER (len=79)::TEMP CHARACTER (len=2)::FORM ! 声明全局变量

common TN,XN,DX,GAMMA,RB,LB

WRITE (*,*)"*************Computing***********" ! 打开数据文件"data.txt" 录入6个参数 INQUIRE (FILE='data.txt' ,EXIST=ALIVE) IF (ALIVE) THEN

OPEN (UNIT=10,FILE="data.txt" ,STATUS='OLD' ,ACTION='READ' ) READ (10,"(a)")TEMP ! 标题信息

READ (10,*) TN,DX,GAMMA,LB,RB,FORM ! 读取6个参数 WRITE (*,*) "Read successfully" ELSE

WRITE (*,*)"The document doesn't exist." STOP END IF

! 计算空间网格数 XN=(RB-LB)/DX+1

! 确定U 矩阵和X 向量的大小 ALLOCATE (U(XN,TN+1)) ALLOCATE (X(XN)) ! 定义U 初值为0 U=0

! 计算t=0时,U 的函数值U (:,1) DO I=1,XN

X(I)=LB+(I-1)*DX

IF (X(I)>=-1 .AND. X(I)

ELSE IF(X(I)>0 .AND. X(I)

! 调用子程序计算求解

IF (FORM=="A" .or.FORM=="a" ) THEN CALL FormA(U,X)

ELSE IF(FORM=="B" .or.FORM=="b" ) THEN CALL FormB(U,X)

ELSE IF(FORM=="C" .or.FORM=="c" ) THEN CALL FormC(U,X) ELSE

WRITE (*,*)"ERROR:Form fault"

stop

END IF stop END PROGRAM

!***************子程序 A******************** Subroutine FormA(U,X) implicit none INTEGER ::TN,XN,I,J REAL ::DX,GAMMA REAL ::LB,RB

real ::U(XN,TN),X(XN) common TN,XN,DX,GAMMA,RB,LB ! 打开输出文件用于输出数据

OPEN (UNIT=9,FILE="Output_FormA.txt") ! 计算T=TN的值

WRITE (9,*)" 差分格式:格式A" WRITE (9,*)"DT/DX=",GAMMA DO J=2,TN

WRITE (9,*) "TIME=",J-1

WRITE (9,"(A5,10X,A1)") " 坐标X" , "U" DO I=1,XN

IF (I==1)THEN ! 边界点置为相邻点的值 U(I,J)=U(I+1,J-1) ELSE IF(I==XN) then

U(I,J)=U(I-1,J-1) ELSE

U(I,J)=U(I,J-1)-GAMMA*(U(I+1,J-1)-U(I-1,J-1))/2 END IF

WRITE (9,*) X(I),U(I,J) END DO END DO

WRITE (*,*)"***********Finish**********"

write (*,*)" 请在程序文件夹下打开Output_FormA.txt查看结果" return end subroutine

!***************子程序 B******************** Subroutine FormB(U,X) implicit none INTEGER ::TN,XN,I,J REAL ::DX,GAMMA REAL ::LB,RB

real ::U(XN,TN),X(XN) common TN,XN,DX,GAMMA,RB,LB ! 打开输出文件用于输出数据

OPEN (UNIT=9,FILE="Output_FormB.TXT") ! 计算T=TN的值

WRITE (9,*)" 差分格式:格式B" WRITE (9,*)"DT/DX=",GAMMA DO J=2,TN

WRITE (9,*) "TIME=",J-1

WRITE (9,"(A5,10X,A1)") " 坐标X" , "U" DO I=1,XN

IF (I==1)THEN ! 边界点置为相邻点的值 U(I,J)=U(I+1,J-1) ELSE IF(I==XN) then

U(I,J)=U(I-1,J-1) ELSE

U(I,J)=U(I,J-1)-GAMMA*(U(I+1,J-1)-U(I,J-1)) END IF

WRITE (9,"(F6.3,6X,F6.3)") X(I),U(I,J) END DO END DO

WRITE (*,*)"***********Finish**********"

write (*,*)" 请在程序文件夹下打开Output_FormB.txt查看结果" return end subroutine

!***************子程序 C******************** Subroutine FormC(U,X) implicit none INTEGER ::TN,XN,I,J REAL ::DX,GAMMA REAL ::LB,RB

real ::U(XN,TN),X(XN) common TN,XN,DX,GAMMA,RB,LB ! 打开输出文件用于输出数据

OPEN (UNIT=9,FILE="Output_FormC.txt") ! 计算T=TN的值

WRITE (9,*)" 差分格式:格式C" WRITE (9,*)"DT/DX=",GAMMA DO J=2,TN

WRITE (9,*) "TIME=",J-1

WRITE (9,"(A5,10X,A1)") " 坐标X" , "U" DO I=1,XN

IF (I==1)THEN ! 边界点置为相邻点的值

U(I,J)=U(I+1,J-1) ELSE IF(I==XN) then

U(I,J)=U(I-1,J-1) ELSE

U(I,J)=U(I,J-1)-GAMMA*(U(I,J-1)-U(I-1,J-1)) END IF

WRITE (9,"(F6.3,6X,F6.3)") X(I),U(I,J) END DO

write (9,"(80X)") END DO

WRITE (*,*)"***********Finish**********"

write (*,*)" 请在程序文件夹下打开Output_FormC.txt查看结果" return end subroutine

(2)data.txt

TN DX GAMMA LB RB FORM 5 0.05 0.5 -8 8 A

附件说明:主要更改TN,GAMMA 和FORM 的值。分别为时间网格数,DT_DX,差分格式 其中,TN 取任何大于1的整数;GAMMA 可取值为0.5,1,2;FORM 可取为A,B,C


相关文章

  • 用Excel快速求解一维非稳态对流扩散方程
  • 第26卷 第2期 2006年6月 西安科技大学学报Vol.26 No.2Jun.2006 JOURNALOFXI.ANUNIVERSITYOFSCIENCEANDTECHNOLOGY 文章编号:1672-9315(2006)02-0286- ...查看


  • 传热学课程教学大纲
  • <传热学>教学大纲 课程名称:传热学 课程编码:20511019 学 时:58 学 分:4 开课学期:第五学期 课程类别:必修 课程性质:专业基础课 适用专业:建筑环境与设备工程专业本科生 先修课程:高等数学.大学物理.流体力学 ...查看


  • 对流扩散方程引言
  • 对流扩散方程的定解问题是指物质输运与分子扩散的物理过程和黏性流体流动的数学模型,它可以用来描述河流污染.大气污染.核污染中污染物质的分布,流体的流动和流体中热传导等众多物理现象.关于对流扩散方程的求解很也备受关注,因此寻找一种稳定实用的数值 ...查看


  • 现代模具设计方法复习题
  • <现代模具设计方法>练习题及答案 第一章 现代模具设计方法概述 1.注射模CAD/CAE/CAM的技术特点是什么? CAD/CAM技术特点是重点在于注射制品的几何型计.绘图和数控加工数据及指令的生成. CAE则是将工程试验.分析 ...查看


  • 高精度迎风偏斜格式的比较与分析
  • 第31卷第2期2007年3月 大 气 科 学 ChineseJournalofAtmosphericSciencesVol131 No12 Mar.2007 高精度迎风偏斜格式的比较与分析 冯涛1,2 李建平1 1 1000292中国科学院 ...查看


  • 热传导方程的导出及其定解问题的导出
  • 热传导方程的导出及其定解问题的导出 1. 热传导方程的导出 考察空间某物体G 的热传导问题.以函数u (x , y , z , t ) 表示物体G 在位置(x , y , z ) 及时刻t 的温度. 依据传热学中的Fourier 实验定律, ...查看


  • CFD离散格式
  • CFD 离散格式 discretization 插值方式常称为离散格式. 中心差分格式central differencing scheme:就是界面上的物理量采用线性插值公式来计算,即取上游和下游节点的算术平均值.它是条件稳定的,在网格P ...查看


  • 流体力学中英文对照
  • 流体力学相关词汇中英文对照 流体动力学 fluid dynamics 连续介质力学 mechanics of continuous media 介质 medium 流体质点 fluid particle 无粘性流体 nonviscous f ...查看


  • 二维热传导方程有限容积法的MATLAB实现_薛琼
  • ComputerEngineeringandApplications计算机工程与应用2012,48(24)197 二维热传导方程有限容积法的MATLAB实现 薛琼1,肖小峰2 XUEQiong1,XIAOXiaofeng2 1.武汉理工大学 ...查看


热门内容