版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一维问题数值解与计算程序一维问题,即激波管问题,是一个典型的一维可压缩无黏气体动力学问题,并有解析解。对它采用二阶精度两步差分格式进行数值求解。同时,为了初学者入门和练习方便,这里给出了用语言和编写的计算一维问题的计算程序,供大家学习参考。A-1利用两步差分格式求解一维问题1.一维问题图A.1激波管问题示意图一维问题实际上就是激波管问题。激波管是一根两端封闭、内部充满气体的直管,如图A.1所示。在直管中由一薄膜将激波管隔开,在薄膜两侧充有均匀理想气体〔可以是同一种气体,也可以是不同种气体〕,薄膜两侧气体的压力、密度不同。当时,气体处于静止状态。当时,薄膜瞬时突然破裂,气体从高压端冲向低压端,同时在管内形成激波、稀疏波和接触间断等复杂波系。图A.1激波管问题示意图2.根本方程组、初始条件和边界条件设气体是理想气体。一维问题在数学上可以用一维可压缩无黏气体方程组来描述。在直角坐标系下量纲为一的一维方程组为:(A.1)其中()这里、、、分别是流体的密度、速度、压力和单位体积总能。理想气体状态方程:〔A.3〕初始条件:;。边界条件:和处为自由输出条件,,。3.二阶精度差分格式两步差分格式:()其中。计算实践说明,两步差分格式不能抑制激波附近非物理振荡。因此在计算激波时,必须采用人工黏性滤波方法:()为了在激波附近人工黏性起作用,而在光滑区域人工黏性为零,需要引入一个与密度〔或者压力〕相关的开关函数:()由式()可以看出,在光滑区域,密度变化很缓,因此值也很小;而在激波附近密度变化很陡,值就很大。带有开关函数的前置人工黏性滤波方法为:()其中参数往往需要通过实际试算来确定,也可采用线性近似方法得到:()由于声速不会超过3,所以取,在本计算中取。4.计算结果分析计算分别采用标准的语言和语言编写程序。计算中网格数取,计算总时间为。计算得到在时刻的密度、速度和压力分布如图A.2〔语言计算结果〕和图A.3〔语言计算结果〕所示。采用两种不同语言编写程序所得到的计算结果完全吻合。从图A.2和图A.3中可以发现,两步差分格式能很好地捕捉激波,计算得到的激波面很陡、很窄,计算激波精度是很高的。采用带开关函数的前置人工滤波法能消除激波附近的非物理振荡,计算效果很好。从图A.2和图A.3中可以看出通过激波后气体的密度、压力和速度都是增加的;在压力分布中存在第二个台阶,说明在这里存在一个接触间断,在接触间断两侧压力是有间断的,而密度和速度是相等的。这个计算结果正确地反映了一维问题的物理特性,并被激波管实验所验证。图A.图A.2采用语言程序得到的一维问题密度、速度和压力分布图采用语言程序得到的一维问题密度、速度和压力分布A-2一维问题数值计算源程序1.语言源程序//MacCormack1D.cpp:定义控制台应用程序的入口点。///*-----------------------------------------------------------------------------------------------------*利用差分格式求解一维激波管问题〔语言版本〕*-------------------------------------------------------------------------------------------------------*///#include"stdafx.h"#include<stdio.h>#include<stdlib.h>#include<math.h>#defineJ1000//网格数//全局变量doubleU[J+2][3],Uf[J+2][3],Ef[J+2][3];/*-------------------------------------------------------计算时间步长入口:U,当前物理量,dx,网格宽度;返回:时间步长。---------------------------------------------------------*/doubleCFL(doubleU[J+2][3],doubledx){inti;doublemaxvel,p,u,vel;maxvel=1e-100;for(i=1;i<=J;i++){u=U[i][1]/U[i][0];p=(GAMA-1)*(U[i][2]-0.5*U[i][0]*u*u);vel=sqrt(GAMA*p/U[i][0])+fabs(u);if(vel>maxvel)maxvel=vel;}returnSf*dx/maxvel;}/*-------------------------------------------------------初始化入口:无;出口:U,已经给定的初始值,dx,网格宽度。---------------------------------------------------------*/voidInit(doubleU[J+2][3],double&dx){inti;doublerou1=1.0,u1=0.0,p1=1.0;//初始条件doublerou2=0.125,u2=0.0,p2=0.1;dx=L/J;for(i=0;i<=J/2;i++){U[i][0]=rou1;U[i][1]=rou1*u1;U[i][2]=p1/(GAMA-1)+rou1*u1*u1/2;}for(i=J/2+1;i<=J+1;i++){U[i][0]=rou2;U[i][1]=rou2*u2;U[i][2]=p2/(GAMA-1)+rou2*u2*u2/2;}}/*-------------------------------------------------------边界条件入口:dx,网格宽度;出口:U,已经给定的边界。---------------------------------------------------------*/voidbound(doubleU[J+2][3],doubledx){intk;//左边界for(k=0;k<3;k++)U[0][k]=U[1][k];//右边界for(k=0;k<3;k++)U[J+1][k]=U[J][k];}/*-------------------------------------------------------根据U计算E入口:U,当前U矢量;出口:E,计算得到的E矢量,U、E的定义见Euler方程组。---------------------------------------------------------*/voidU2E(doubleU[3],doubleE[3]){doubleu,p;u=U[1]/U[0];p=(GAMA-1)*(U[2]-0.5*U[1]*U[1]/U[0]);E[0]=U[1];E[1]=U[0]*u*u+p;E[2]=(U[2]+p)*u;}/*-------------------------------------------------------一维差分格式求解器入口:U,上一时刻的U矢量,Uf、Ef,临时变量,dx,网格宽度,dt,时间步长;出口:U,计算得到的当前时刻U矢量。---------------------------------------------------------*/voidMacCormack_1DSolver(doubleU[J+2][3],doubleUf[J+2][3],doubleEf[J+2][3],doubledx,doubledt){inti,k;doubler,nu,q;r=dt/dx;nu=0.25;for(i=1;i<=J;i++){q=fabs(fabs(U[i+1][0]-U[i][0])-fabs(U[i][0]-U[i-1][0]))/(fabs(U[i+1][0]-U[i][0])+fabs(U[i][0]-U[i-1][0])+1e-100);//开关函数for(k=0;k<3;k++)Ef[i][k]=U[i][k]+0.5*nu*q*(U[i+1][k]-2*U[i][k]+U[i-1][k]);//人工黏性项}for(k=0;k<3;k++)for(i=1;i<=J;i++)U[i][k]=Ef[i][k];for(i=0;i<=J+1;i++)U2E(U[i],Ef[i]);for(i=0;i<=J;i++)for(k=0;k<3;k++)Uf[i][k]=U[i][k]-r*(Ef[i+1][k]-Ef[i][k]);//U(n+1/2)(i+1/2)for(i=0;i<=J;i++)U2E(Uf[i],Ef[i]);//E(n+1/2)(i+1/2)for(i=1;i<=J;i++)for(k=0;k<3;k++)U[i][k]=0.5*(U[i][k]+Uf[i][k])-0.5*r*(Ef[i][k]-Ef[i-1][k]);//U(n+1)(i)}/*-------------------------------------------------------输出结果,用数据格式画图入口:U,当前时刻U矢量,dx,网格宽度;出口:无。---------------------------------------------------------*/voidOutput(doubleU[J+2][3],doubledx){inti;FILE*fp;doublerou,u,p;fp=fopen("result.txt","w");for(i=0;i<=J+1;i++){rou=U[i][0];u=U[i][1]/rou;p=(GAMA-1)*(U[i][2]-0.5*U[i][0]*u*u);fprintf(fp,"%20f%20.10e%20.10e%20.10e%20.10e\n",i*dx,rou,u,p,U[i][2]);}fclose(fp);}/*-------------------------------------------------------主函数入口:无;出口:无。---------------------------------------------------------*/voidmain(){doubleT,dx,dt;Init(U,dx);T=0;while(T<TT){dt=CFL(U,dx);T+=dt;printf("T=%10gdt=%10g\n",T,dt);MacCormack_1DSolver(U,Uf,Ef,dx,dt);bound(U,dx);}Output(U,dx);}--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------2.语言源程序!MacCormack1D.for------------------------------------------------------------------------------------------------------------!利用差分格式求解一维激波管问题〔语言版本〕--------------------------------------------------------------------------------------------------------------*/programMacCormack1Dimplicitdoubleprecision(a-h,o-z)parameter(M=1000)common/G_def/GAMA,PI,J,JJ,dL,TT,SfdimensionU(0:M+1,0:2),Uf(0:M+1,0:2)dimensionEf(0:M+1,0:2)!气体常数!网格数J=M!计算区域!总时间!时间步长因子callInit(U,dx)T=01dt=CFL(U,dx)T=T+dtwrite(*,*)'T=',T,'dt=',dtcallMacCormack_1D_Solver(U,Uf,Ef,dx,dt) callbound(U,dx)if(T.lt.TT)goto1callOutput(U,dx)end!-------------------------------------------------------!计算时间步长!入口:U,当前物理量,dx,网格宽度;!返回:时间步长。!-------------------------------------------------------doubleprecisionfunctionCFL(U,dx)implicitdoubleprecision(a-h,o-z)common/G_def/GAMA,PI,J,JJ,dL,TT,SfdimensionU(0:J+1,0:2)dmaxvel=1e-10do10i=1,Juu=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=vel10continueCFL=Sf*dx/dmaxvelend!-------------------------------------------------------!初始化!入口:无;!出口:U,已经给定的初始值,dx,网格宽度。!-------------------------------------------------------subroutineInit(U,dx)implicitdoubleprecision(a-h,o-z)common/G_def/GAMA,PI,J,JJ,dL,TT,SfdimensionU(0:J+1,0:2)!初始条件u1=0v1=0u2=0v2=0dx=dL/Jdo20i=0,J/2U(i,0)=rou1U(i,1)=rou1*u1U(i,2)=p1/(GAMA-1)+0.5*rou1*u1*u120continuedo21i=J/2+1,J+1U(i,0)=rou2U(i,1)=rou2*u2U(i,2)=p2/(GAMA-1)+0.5*rou2*u2*u221continueend!-------------------------------------------------------!边界条件!入口:dx,网格宽度;!出口:U,已经给定边界。!-------------------------------------------------------subroutinebound(U,dx)implicitdoubleprecision(a-h,o-z)common/G_def/GAMA,PI,J,JJ,dL,TT,SfdimensionU(0:J+1,0:2)!左边界do30k=0,2 U(0,k)=U(1,k)30continue!右边界do31k=0,2U(J+1,k)=U(J,k)31continueend!-------------------------------------------------------!根据U计算E!入口:U,当前U矢量;!出口:E,计算得到的E矢量,!U、E定义见Euler方程组。!-------------------------------------------------------subroutineU2E(U,E,is,in)implicitdoubleprecision(a-h,o-z)common/G_def/GAMA,PI,J,JJ,dL,TT,SfdimensionU(0:J+1,0:2),E(0:J+1,0:2)do40i=is,inuu=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+pE(i,2)=(U(i,2)+p)*uu40continueend!-------------------------------------------------------!一维差分格式求解器!入口:U,上一时刻U矢量,!Uf、Ef,临时变量,!dx,网格宽度,dt,,时间步长;!出口:U,计算得到得当前时刻U矢量。!-------------------------------------------------------subroutineMacCormack_1D_Solver(U,Uf,Ef,dx,dt)implicitdoubleprecision(a-h,o-z)common/G_def/GAMA,PI,J,JJ,dL,TT,SfdimensionU(0:J+1,0:2),Uf(0:J+1,0:2)dimensionEf(0:J+1,0:2)r=dt/dxdo60i=1,Jdo60k=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))60continuedo61k=0,2do61i=1,JU(i,k)=Ef(i,k)61continuecallU2E(U,Ef,0,J+1)do63i=0,Jdo63k=0,2!U(n+1/2)(i+1/2)Uf(i,k)=U(i,k)-r*(Ef(i+1,k)-Ef(i,k))63continue !E(n+1/2)(i+1/2)callU2E(Uf,Ef,0,J)do64i=1,Jdo64k=0,2!U(n+1)(i)U(i,k)=0.5*(U(i,k)+Uf(i,k))
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 初中数学听评课教研记录
- 03早教指导课程设计
- 《上课带薪年休假相关问题》课件
- 《安全吊装作业培训》课件
- 《SMT工艺技术》课件
- 理学领域展望模板
- 《债券知识》课件
- 《催化裂化简化》课件
- 市场营销下半年工作计划
- 厂房质量保证措施施工方案
- 2024政府采购评审专家考试题库附含答案
- 《法理学》(第三版教材)形成性考核作业1234答案
- 某厂1000MW发电机测绝缘
- 产品跌落测试报告
- 2022-2023学年北京市朝阳区人教版六年级上册期末测试数学试卷(无答案和有答案版)
- (高清版)TDT 1035-2013 县级土地整治规划编制规程
- (高清版)DZT 0399-2022 矿山资源储量管理规范
- 2024年同等学力申硕-同等学力(社会学)笔试历年真题荟萃含答案
- 铁路巡防方案
- 安检基础知识课件
- 现代礼仪馈赠礼仪课件
评论
0/150
提交评论