2次元の移流方程式を解くプログラムです。
これは風上差分を用いて行っています。
多分結果は半時計回りだと思う・・・・・(苦笑)


俺がてこずったのはまず最初の2次元配列の取り方。
前回までのように1次元のつもりで大きく取りすぎると走ってくれません。
(よく考えてみると解るのだが仮に400×400の配列を取ると16万・・・・・)
(つまりはメモリーに書き込み切れなくなるらしい)
あとはプログラムの計算をする段階で自分でどこから計算しているかを理解していた方が良いそうだ。
俺の場合はx=−1、y=−1から計算している。
他の注意点としてはかなり時間がかかるので根気強く頑張る事かな〜。


#include <stdio.h>

int main(void)

{
     int i,j,k;
     int a,b,c,d;
     double f[201][201]={0.000};
     double F[201][201]={0.000};
     double u,v;
     double dt,dx,dy;

     FILE *one;
     one=fopen("result.xls","w");

     dx=0.01;
     dy=0.01;
     dt=0.004;

     for(j=0;j<=200;j++){
          for(i=0;i<=200;i++){
             if (i==150 && j==150)
                f[i][j]=1.00;
             else
                f[i][j]=0.00;
          }
     }//初期条件

     for(k=0;k<=600;k++){

          u=1.00;

          for(j=1;j<=199;j++){

               v=-1.00;

               for(i=1;i<=199;i++){

                    if(u>=0.00){
                       a=0;
                       b=-1;
                    }
                    else{
                       a=1;
                       b=0;
                    }

                    if(v>=0.00){
                       c=0;
                       d=-1;
                    }
                    else{
                       c=1;
                       d=0;
                    }

                    F[i][j]=f[i][j]-((u*dt)/dx)*(f[i+a][j]-f[i+b][j])-((v*dt)/dy)*(f[i][j+c]-f[i][j+d]);

                    v=v+dx;
               }//for(i)end
          u=u-dy;
          }//for(j)end

          for(j=0;j<=199;j++){
               for(i=0;i<=199;i++){
                    f[i][j]=F[i][j];
               }
          }//入替
     }//for(k)end

     for(j=0;j<=200;j++){
          if(j==0){
               fprintf(one," ");
          }

          fprintf(one,"%d ",j-100);
          if(j==200)
               fprintf(one,"%d\n",j-100);
     }

     for(j=0;j<=200;j++){
          for(i=0;i<=200;i++){
               if(i==0)
                    fprintf(one,"%d ",j-100);

                    fprintf(one,"%f ",f[i][j]);

                    if(i==200)
                         fprintf(one,"f\n",f[i][j]);
          }//for(i)end
     }//for(j)end
     return(0);
}