[原创]Ausm格式的简单源代码
自己编的很简单的CFD二维求解程序,原先是学习Ausm格式用的。说它简单,因为除了最必须的东东,其余一概没有,刚好拿来玩。况且这个结果的精度不高。至于计算结果的正确性如何,偶也8晓得啦。*^_^*大家有空看看,最好对程序提些意见。可别用鸡蛋砸偶呵。
//---------------------------------------------------------------------------
//filename: TEuler2d-mod.cpp
//written by : Dr.Tinghe Lee
//this is additional cpp file to assume the right of my code
//a very neat code for ausm scheme test usage!
//---------------------------------------------------------------------------
#include <fstream>
#include <iostream>
#include <cmath>
#define gama 1.4
using namespace std;
//---------------------------------------------------------------------------
// predeclare variables
int im,jm,imax,jmax,it,itmax;
double rm,cfl;
double *x,*y,*rr,*ru,*rv,*re,*pp,*flxrj,*flxuj,*flxvj,*flxej,*dtime;
double *vol,*rrn,*run,*rvn,*ren,*flxri,*flxui,*flxvi,*flxei;
double *rrt,*rut,*rvt,*ret,p0,r0,u0,v0,e0,c0,q0;
//---------------------------------------------------------------------------
// predeclare functions
void input(),initflow(),bound(),rnk(),resid(),output(),farbnd(),walbnd(),
timestep(),tecgrid();
//---------------------------------------------------------------------------
template<class Type> Type mmin(Type a,Type b)
{
return (a<=b)?a:b;
}
//---------------------------------------------------------------------------
template<class Type> Type mmax(Type a,Type b)
{
return (a>=b)?a:b;
}
//---------------------------------------------------------------------------
int main()
{
rm= 3.0;
cfl = 1.1;
itmax = 2000;
input();
tecgrid();
initflow();
bound();
for(it=0;it<itmax;it++)
{
rnk();
resid();
}
output();
delete [] vol; delete [] pp; delete [] rr; delete [] ru; delete [] rv; delete [] re;
delete [] rrn; delete [] run; delete [] rvn; delete [] ren; delete [] dtime;
delete [] rrt; delete [] rut; delete [] rvt; delete [] ret;
delete [] flxri; delete [] flxui; delete [] flxvi; delete [] flxei;
delete [] flxrj; delete [] flxuj; delete [] flxvj; delete [] flxej;
delete [] x; delete [] y;
return 0;
}
//---------------------------------------------------------------------------
void input()
{
int i,j,ii,i1,i2,i3,i4;
double rx1,rx2,ry1,ry2,vot;
fstream mfile;
mfile.open("gri2d.dat",ios::in);
mfile>> im >> jm;
imax = im+2;
jmax = jm+2;
x = new double ;
y = new double ;
for(i=1;i<=im;i++)
for(j=1;j<=jm;j++)
{
ii = i*jmax+j;
mfile>> x>>y;
}
mfile.close();
vol = new double ;
rr= new double ;
ru= new double ;
rv= new double ;
re= new double ;
pp= new double ;
flxri = new double ;
flxui = new double ;
flxvi = new double ;
flxei = new double ;
flxrj = new double ;
flxuj = new double ;
flxvj = new double ;
flxej = new double ;
rrn= new double ;
run= new double ;
rvn= new double ;
ren= new double ;
rrt= new double ;
rut= new double ;
rvt= new double ;
ret= new double ;
dtime = new double ;
for(i=1;i<im+1;i++)
for(j=1;j<jm+1;j++)
{
i1 = i*jmax+j;
i2 = (i+1)*jmax+j;
i3 = (i+1)*jmax+j+1;
i4 = i*jmax+j+1;
rx1 = x-x;
ry1 = y-y;
rx2 = x-x;
ry2 = y-y;
vot = rx1*ry2-rx2*ry1;
rx2 = rx1;
ry2 = ry1;
rx1 = x-x;
ry1 = y-y;
vol = 0.5*(rx1*ry2-rx2*ry1+vot);
}
}
//---------------------------------------------------------------------------
void initflow()
{
int i,j,ii;
p0 = 1;
r0 = 1;
c0 = sqrt(gama*p0/r0);
q0 = rm*c0;
u0 = q0;
v0 = 0.0;
e0 = p0/((gama-1.0)*r0)+q0*q0*0.5;
for(i=0;i<imax;i++)
for(j=0;j<jmax;j++)
{
ii = i*jmax+j;
rr = r0;
ru = r0*u0;
rv = r0*v0;
re = r0*e0;
pp = p0;
}
}
//---------------------------------------------------------------------------
void farbnd()
{
int i,j,ii,i1;
for(i=0;i<=0;i++)
for(j=1;j<jm;j++)
{
ii = i*jmax+j;
rr = r0;
ru = r0*u0;
rv = r0*v0;
re = r0*e0;
pp = p0;
}
for(i=im;i<=im;i++)
for(j=1;j<jm;j++)
{
ii = i*jmax+j;
i1 = (i-1)*jmax+j;
rr = rr;
ru = ru;
rv = rv;
re = re;
pp = pp;
}
}
//---------------------------------------------------------------------------
void walbnd()
{
int i,j,ii,i1;
for(i=1;i<im;i++)
for(j=0;j<=0;j++)
{
ii = i*jmax+j;
i1 = i*jmax+j+1;
rr = 0;
ru = -ru;
rv = -rv;
re = 0;
pp = pp;
}
for(i=1;i<im;i++)
for(j=jm;j<=jm;j++)
{
ii = i*jmax+j;
i1 = i*jmax+j-1;
rr = 0;
ru = -ru;
rv = -rv;
re = 0;
pp = pp;
}
}
//---------------------------------------------------------------------------
void flux()
{
int i,j,i1,i2,i3,i4,il,ir;
double rrl,rul,rvl,rel,rhl,rrr,rur,rvr,rer,rhr,ppl,ppr;
double xn,yn,al,ar,area,ql,qr,ml,mr,ms,pl,pr,alf,arf,ps,as;
for(i=1;i<=im;i++)
for(j=1;j<jm;j++)
{
i1 = i*jmax+j;
i2 = (i+1)*jmax+j;
i3 = (i+1)*jmax+j+1;
i4 = i*jmax+j+1;
il = (i-1)*jmax+j;
ir = i1;
xn = y-y;
yn = x-x;
area = sqrt(xn*xn+yn*yn);
rrl = rr;
rul = ru;
rvl = rv;
rel = re;
ppl = pp;
rhl = rel+ppl;
rrr = rr;
rur = ru;
rvr = rv;
rer = re;
ppr = pp;
rhr = rer+ppr;
al = sqrt(2.0*(gama-1.0)*rhl/rrl/(gama+1.0));
ar = sqrt(2.0*(gama-1.0)*rhr/rrr/(gama+1.0));
ql = (rul*xn+rvl*yn)/rrl/area;
qr = (rur*xn+rvr*yn)/rrr/area;
al = al*al/mmax(fabs(ql),al);
ar = ar*ar/mmax(fabs(qr),ar);
as = mmin(al,ar);
ml = ql/as;
mr = qr/as;
if(fabs(ml)<1.0) ml = 0.25*(ml+1.0)*(ml+1.0);
if(ml<=-1.0) ml = 0.0;
if(fabs(mr)<1.0) mr = -0.25*(mr-1.0)*(mr-1.0);
if(mr>=1.0) mr = 0.0;
pl = ppl;
pr = ppr;
if(fabs(ml)<1.0) pl = 0.25*ppl*(ml+1.0)*(ml+1.0)*(2.0-ml);
if(ml<=-1.0) pl = 0.0;
if(fabs(mr)<1.0) pr = 0.25*ppr*(mr-1.0)*(mr-1.0)*(2.0+mr);
if(mr>=1.0) pr = 0.0;
ps= pl+pr;
ms= ml+mr;
alf = 0.5*ms*area;
arf = 0.5*(fabs(ms)+0.5*(mr-1.0)*(mr-1.0))*area;
flxri = alf*(rrl*al+rrr*ar)-arf*(rrr*ar-rrl*al);
flxui = alf*(rul*al+rur*ar)-arf*(rur*ar-rul*al)+ps*xn;
flxvi = alf*(rvl*al+rvr*ar)-arf*(rvr*ar-rvl*al)+ps*yn;
flxei = alf*(rhl*al+rhr*ar)-arf*(rhr*ar-rhl*al);
}
for(j=2;j<jm;j++)
for(i=1;i<im;i++)
{
i1 = i*jmax+j;
i2 = (i+1)*jmax+j;
i3 = (i+1)*jmax+j+1;
i4 = i*jmax+j+1;
il = i*jmax+j-1;
ir = i1;
xn = y-y;
yn = x-x;
area = sqrt(xn*xn+yn*yn);
rrl = rr;
rul = ru;
rvl = rv;
rel = re;
ppl = pp;
rhl = rel+ppl;
rrr = rr;
rur = ru;
rvr = rv;
rer = re;
ppr = pp;
rhr = rer+ppr;
al = sqrt(2.0*(gama-1.0)*rhl/rrl/(gama+1.0));
ar = sqrt(2.0*(gama-1.0)*rhr/rrr/(gama+1.0));
ql = (rul*xn+rvl*yn)/rrl/area;
qr = (rur*xn+rvr*yn)/rrr/area;
al = al*al/mmax(fabs(ql),al);
ar = ar*ar/mmax(fabs(qr),ar);
as = mmin(al,ar);
ml = ql/as;
mr = qr/as;
if(fabs(ml)<1.0) ml = 0.25*(ml+1.0)*(ml+1.0);
if(ml<=-1.0) ml = 0.0;
if(fabs(mr)<1.0) mr = -0.25*(mr-1.0)*(mr-1.0);
if(mr>=1.0) mr = 0.0;
pl = ppl;
pr = ppr;
if(fabs(ml)<1.0) pl = 0.25*ppl*(ml+1.0)*(ml+1.0)*(2.0-ml);
if(ml<=-1.0) pl = 0.0;
if(fabs(mr)<1.0) pr = 0.25*ppr*(mr-1.0)*(mr-1.0)*(2.0+mr);
if(mr>=1.0) pr = 0.0;
ps= pl+pr;
ms= ml+mr;
alf = 0.5*ms*area;
arf = 0.5*(fabs(ms)+0.5*(mr-1.0)*(mr-1.0))*area;
flxrj = alf*(rrl*al+rrr*ar)-arf*(rrr*ar-rrl*al);
flxuj = alf*(rul*al+rur*ar)-arf*(rur*ar-rul*al)+ps*xn;
flxvj = alf*(rvl*al+rvr*ar)-arf*(rvr*ar-rvl*al)+ps*yn;
flxej = alf*(rhl*al+rhr*ar)-arf*(rhr*ar-rhl*al);
}
for(j=1;j<=1;j++)
for(i=1;i<im;i++)
{
i1 = i*jmax+j;
i2 = (i+1)*jmax+j;
xn = y-y;
yn = x-x;
ps= pp;
flxrj =0;
flxuj =ps*xn;
flxvj =ps*yn;
flxej =0;
}
for(j=jm;j<=jm;j++)
for(i=1;i<im;i++)
{
i1 = i*jmax+j;
i2 = (i+1)*jmax+j;
i3 = i*jmax+j-1;
xn = y-y;
yn = x-x;
ps= pp;
flxrj =0;
flxuj =ps*xn;
flxvj =ps*yn;
flxej =0;
}
for(i=1;i<im;i++)
for(j=1;j<jm;j++)
{
i1 = i*jmax+j;
i2 = (i+1)*jmax+j;
i4 = i*jmax+j+1;
rrn = -flxri+flxri-flxrj+flxrj;
run = -flxui+flxui-flxuj+flxuj;
rvn = -flxvi+flxvi-flxvj+flxvj;
ren = -flxei+flxei-flxej+flxej;
}
}
//---------------------------------------------------------------------------
void rnk()
{
int i,j,n,ii;
double rq;
double alf={0.25,1.0/6.0,3.0/8.0,0.5,1.0};
for(i=1;i<im;i++)
for(j=1;j<jm;j++)
{
ii = i*jmax+j;
rrt = rr;
rut = ru;
rvt = rv;
ret = re;
}
for(n=0;n<5;n++)
{
timestep();
flux();
for(i=1;i<im;i++)
for(j=1;j<jm;j++)
{
ii = i*jmax+j;
rr = rrt - alf*dtime*rrn/vol;
ru = rut - alf*dtime*run/vol;
rv = rvt - alf*dtime*rvn/vol;
re = ret - alf*dtime*ren/vol;
rq = ru*ru+rv*rv;
pp = (gama-1.0)*(re-rq/rr*0.5);
if(pp<0||rr<0)
{
rr = r0;
ru = r0*u0;
rv = r0*v0;
re = r0*e0;
pp = p0;
}
}
bound();
}
}
//---------------------------------------------------------------------------
void bound()
{
farbnd();
walbnd();
}
//---------------------------------------------------------------------------
void timestep()
{
int i,j,i1,i2,i3,i4;
double xt,yt,xn,yn,a1,a2,c,uu,vv;
for(i=1;i<im;i++)
for(j=1;j<jm;j++)
{
i1 = i*jmax+j;
i2 = (i+1)*jmax+j;
i3 = (i+1)*jmax+j+1;
i4 = i*jmax+j+1;
c= sqrt(gama*pp/rr);
xt = 0.5*(x-x+x-x);
yt = 0.5*(y-y+y-y);
xn = yt;
yn = -xt;
a1 = sqrt(xn*xn+yn*yn);
uu = (ru*xn+rv*yn)/rr/a1;
xt = 0.5*(x-x+x-x);
yt = 0.5*(y-y+y-y);
xn = -yt;
yn =xt;
a2 = sqrt(xn*xn+yn*yn);
vv = (ru*xn+rv*yn)/rr/a2;
dtime = cfl*vol/(fabs(uu)+fabs(vv)+c*(a1+a2));
}
}
//---------------------------------------------------------------------------
void resid()
{
int i,j,ii,ierrm,jerrm;
double err,errmax,dskip;
err = 0;
errmax = 0;
for(i=1;i<im;i++)
for(j=1;j<jm;j++)
{
ii = i*jmax+j;
dskip = rr-rrt;
err = dskip*dskip+err;
if(fabs(dskip)>errmax)
{
errmax = fabs(dskip);
ierrm = i;
jerrm = j;
}
}
err = sqrt(err/(im-1)/(jm-1));
cout<<"it="<<it<<" err="<<err<<" irm="<<ierrm<<" jrm="<<jerrm
<<" errm="<<errmax<<endl;
}
//---------------------------------------------------------------------------
void output()
{
int i,j,i1,i2,i3,i4;
double uu,vv,qq,cc,ma;
double *xc,*yc;
xc = new double;
yc = new double;
for(i=1;i<im;i++)
for(j=1;j<jm;j++)
{
i1 = i*jmax+j;
i2 = (i+1)*jmax+j;
i3 = (i+1)*jmax+j+1;
i4 = i*jmax+j+1;
xc = 0.25*(x+x+x+x);
yc = 0.25*(y+y+y+y);
}
fstream mfile;
mfile.open("tecress.dat",ios::out);
mfile<<"variables=\"x\",\"y\",\"ma\",\"r\",\"p\",\"u\",\"v\"";
mfile<<endl;
mfile<<"zone i="<<im-1<<" j="<<jm-1<<" f=point"<<endl;
for(j=1;j<jm;j++)
for(i=1;i<im;i++)
{
i1 = i*jmax+j;
uu = ru/rr;
vv = rv/rr;
qq = sqrt(uu*uu+vv*vv);
cc = sqrt(gama*pp/rr);
ma = qq/cc;
mfile<<xc<<" "<<yc<<" "<<ma<<" "<<rr<<" ";
mfile<<pp<<" "<<ru/rr<<" "<<rv/rr<<endl;
}
mfile.close();
delete [] xc;
delete [] yc;
}
//---------------------------------------------------------------------------
void tecgrid()
{
int i,j,ii;
fstream mfile;
mfile.open("tecMe.dat",ios::out);
mfile<<"variables=\"x\",\"y\""<<endl;
mfile<<"zone i="<<im<<" j="<<jm<<" f=point"<<endl;
for(j=1;j<=jm;j++)
for(i=1;i<=im;i++)
{
ii = i*jmax+j;
mfile<<x<<" "<<y<<endl;
}
mfile.close();
}
//---------------------------------------------------------------------------
[原创]Ausm格式的简单源代码
很不错呀,编程风格也很好,看来功底很深厚!!!佩服中。。。
[原创]Ausm格式的简单源代码
不错,不错。虽然激波形状很粗,但网格也稀。
[原创]Ausm格式的简单源代码
大侠能不能对 Ausm 格式,进行一点介绍亚!渴望了解!有什么优点吗?
谢谢了
[原创]Ausm格式的简单源代码
楼主,我也在搞AUSM格式,不少地方弄不明白。请问你的格式里用的是什么限制器?我想用Van Albada限制器,但是其具体形式看不太明白,请指教。[原创]Ausm格式的简单源代码
最近我也了解了一下AUSM格式,AUSM是Advection Upstream Splitting Method,现在AUSM已经发展成一系列格式,如AUSM+,AUSMD,AUSMV,AUSMDV等等。在原理上AUSM格式和Van Leer flux splitting差不多,都是属于矢通量分裂。在AUSM中,将压力进行了分裂,但是Van Leer flux splitting没有。详细可以看看这个链接http://www.chimeracfd.com/java/gryphon/fluxausm.html[原创]Ausm格式的简单源代码
[这个贴子最后由laser2k在 2006/01/06 05:04pm 第 1 次编辑][原创]Ausm格式的简单源代码
有没有例子数据?[原创]Ausm格式的简单源代码
楼主能把程序拿出来共享,应该鼓励。我也觉得例子没有算好,所以看了一下程序,发现这个程序只能用来算正交网格,lz给出的例子不恰当,因为网格不是正交的。
[原创]Ausm格式的简单源代码
鼓励原创回复 1# iceArcher 的帖子
这个程序是不是没贴完,还是要从别的地方看。正在学习ausm格式。对其中一些点很是不理解。 本帖最后由 kaiqun98 于 2021-5-1 22:19 编辑感谢楼主分享
页:
[1]