
移流方程式(非保存系)
δf(t,x)/δt+u*δf(t,x)/δx=0
においてu=1で、初期条件
φ(x)=sin(x) 0<=x<=2π
φ(x)=0 othewise
の問題を離散化して解く。t=π、2π、3πでのf(t、x)を厳密解と比較する。
ここでは離散化方法は1次精度風上差分を用いる。
//風上差分
#include <stdio.h>
#include <math.h>
int main(void)
{
int i,n;//座標i,時間n
double ii;
double t,dt,dx,dxx,D;
double mena,menb,menc,mend;
double va[300]={0.000};
double vd[300]={0.000};
double vb[300]={0.000};
double vc[300]={0.000};
double wa[300]={0.000};
double xa[300]={0.000};
double ya[300]={0.000};
D=0.000;
dt=0.000;
dx=0.000;
dxx=0.000;
mena=0.000;
menb=0.000;
menc=0.000;
mend=0.000;//初期化
FILE *one;
one=fopen("result.xls","w");//記録
FILE *two;
two=fopen("date1.txt","r");//データ1
FILE *thr;
thr=fopen("date2.txt","r");//データ2
fscanf(two,"%8lf",&dt);//データ1の読み込み
fscanf(thr,"%8lf",&dx);//データ2の読み込み
dxx=6.2831/dx;
t=3.141/dt;
for (i=1;i<=300;i++){
if(i>=10 &&
i<dxx+10){
ii=dx*(i-10);
va[i]=sin(ii);
wa[i+10]=sin(ii);
xa[i+20]=sin(ii);
ya[i+30]=sin(ii);
}
else{
va[i]=0.000;
wa[i+10]=0.000;
xa[i+20]=0.000;
ya[i+30]=0.000;
}
}//初期条件決定
for(n=1;n<=3*t;n++){
for(i=10;i<=299;i++){
D=dt/dx;
vb[i]=va[i]-D*(va[i]-va[i-1]);
if (n ==
t)
vc[i]=vb[i];
else if (n
== 2*t)
vd[i]=vb[i];
}
for(i=1;i<=300;i++){
va[i]=vb[i];
}//change
}//for(n) end
for(i=1;i<=300;i++){
fprintf(one,"%d
",i);
fprintf(one,"%8f
",vc[i]);
fprintf(one,"%8f
",wa[i]);
fprintf(one,"%8f
",vd[i]);
fprintf(one,"%8f
",xa[i]);
fprintf(one,"%8f
",vb[i]);
fprintf(one,"%8f\n",ya[i]);
}//出力1
for(i=1;i<=300;i++){
if(wa[i]<=0.000)
wa[i]=(-1)*wa[i];
if(vc[i]<=0.000)
vc[i]=(-1)*vc[i];
if(vd[i]<=0.000)
vd[i]=(-1)*vd[i];
if(vb[i]<=0.000)
vb[i]=(-1)*vb[i];
mena=mena+wa[i];
menc=menc+vc[i];
mend=mend+vd[i];
menb=menb+vb[i];
}//面積の時間変化
fprintf(one,"%f ",mena);
fprintf(one,"%f ",menc);
fprintf(one,"%f ",mend);
fprintf(one,"%f\n",menb);//出力2
return(0);
}
