移流方程式(非保存系)
δ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);
}