|
すいません。
gccでコンパイルできるのですが、
./a.outで出力すると途中からuu[0][i][j]=NaNになります。
<pre>#include <stdio.h>
#include <math.h>
#define imax 20
#define jmax 20
#define qmax 9
double g=1.0;
void calw(double uu[qmax][imax+1][jmax+1],double ww[qmax][imax+1][jmax+1][2])
{
int i,j;
double p,b2;
for(j=0;j<=jmax;j++)
for(i=0;i<=imax;i++){
b2=(uu[6][i][j]*uu[6][i][j]+uu[7][i][j]*uu[7][i][j]+uu[8][i][j]*uu[8][i][j])/2.0;
p=(uu[4][i][j] -((uu[1][i][j]*uu[1][i][j]+uu[2][i][j]*uu[2][i][j]
+uu[3][i][j]*uu[3][i][j])/uu[0][i][j])/2.0-b2)*(5.0/3.0-1.0);
ww[0][i][j][0]=uu[1][i][j];
ww[1][i][j][0]=uu[1][i][j]*uu[1][i][j]/uu[0][i][j]+p+b2-uu[6][i][j]*uu[6][i][j];
ww[2][i][j][0]=uu[1][i][j]*uu[2][i][j]/uu[0][i][j]-uu[6][i][j]*uu[7][i][j];
ww[3][i][j][0]=uu[1][i][j]*uu[3][i][j]/uu[0][i][j]-uu[6][i][j]*uu[8][i][j];
ww[4][i][j][0]=(uu[4][i][j]+p+b2)*(uu[1][i][j]/uu[0][i][j])-(uu[6][i][j]*uu[1][i][j]/uu[0][i][j]
+uu[7][i][j]*uu[2][i][j]/uu[0][i][j]+uu[8][i][j]*uu[3][i][j]/uu[0][i][j])*uu[6][i][j];
ww[5][i][j][0]=uu[5][i][j]*uu[1][i][j]/uu[0][i][j];
ww[6][i][j][0]=0.0;
ww[7][i][j][0]=-uu[6][i][j]*uu[2][i][j]/uu[0][i][j]+uu[7][i][j]*uu[1][i][j]/uu[0][i][j];
ww[8][i][j][0]=-uu[6][i][j]*uu[3][i][j]/uu[0][i][j]+uu[8][i][j]*uu[1][i][j]/uu[0][i][j];
ww[0][i][j][1]=uu[2][i][j];
ww[1][i][j][1]=uu[1][i][j]*uu[2][i][j]/uu[0][i][j]-uu[6][i][j]*uu[7][i][j];
ww[2][i][j][1]=uu[2][i][j]*uu[2][i][j]/uu[0][i][j]+p+b2-uu[7][i][j]*uu[7][i][j];
ww[3][i][j][1]=uu[2][i][j]*uu[3][i][j]/uu[0][i][j]-uu[7][i][j]*uu[8][i][j];
ww[4][i][j][1]=(uu[4][i][j]+p+b2)*(uu[2][i][j]/uu[0][i][j])-(uu[6][i][j]*uu[1][i][j]/uu[0][i][j]
+uu[7][i][j]*uu[2][i][j]/uu[0][i][j]+uu[8][i][j]*uu[3][i][j]/uu[0][i][j])*uu[7][i][j];
ww[5][i][j][1]=uu[5][i][j]*uu[2][i][j]/uu[0][i][j];
ww[6][i][j][1]=-uu[7][i][j]*uu[1][i][j]/uu[0][i][j]+uu[6][i][j]*uu[2][i][j]/uu[0][i][j];
ww[7][i][j][1]=0.0;
ww[8][i][j][1]=-uu[7][i][j]*uu[3][i][j]/uu[0][i][j]+uu[8][i][j]*uu[2][i][j]/uu[0][i][j];
}
}
main(){
double x[imax+1] , y[jmax+1] , uu[qmax][imax+1][jmax+1] , un[qmax][imax+1][jmax+1],ua[qmax][imax+1][jmax+1],ub[qmax][imax+1][jmax+1],dx,dy;
double dt=0.01, kap;
double ww[qmax][imax+1][jmax+1][2],uh[qmax][imax+1][jmax+1],u0[qmax], u1[qmax];
int i , j ,n,q;
int nmax=400;
int nskip=nmax/10 ;
dx = (double) 1.0/imax ;
dy = (double) 1.0/jmax ;
for(i=0;i<=imax;i++)
x[i]=(double) dx*i;
for(j=0;j<=jmax;j++)
y[j]=(double) dy*j;
for(i=0;i<=imax;i++)
for(j=0;j<=jmax;j++)
{
uu[1][i][j]=0.0;
uu[2][i][j] =0.0;
uu[3][i][j] =0.0;
uu[5][i][j]=1.0;
uu[6][i][j]=0.0;
uu[8][i][j] =0.0;
uu[7][i][j] =0.0;
if(y[j] >=0.5)
{ uu[0][i][j] =1.0*exp(-g*(y[j]-0.5));
uu[4][i][j] =1.5*1.0*exp(-g*(y[j]-0.5));
}
else
{
uu[0][i][j] =0.5*1.0*exp(-g*(y[j]-0.5));
uu[4][i][j] =1.5*0.5*1.0*exp(-g*(y[j]-0.5))+0.5;
}
}
for(i=0;i<=imax;i++)
for(j=1;j<=jmax-1;j++)
{
ua[0][i][j]=(uu[0][i][j+1]+uu[0][i][j-1])/2.0;
ua[4][i][j]=(uu[4][i][j+1]+uu[4][i][j-1])/2.0;
}
for(i=0;i<=imax;i++)
for(j=1;j<=jmax-1;j++)
{
ub[0][i][j]=(ua[0][i][j+1]+ua[0][i][j-1])/2.0;
ub[4][i][j]=(ua[4][i][j+1]+ua[4][i][j-1])/2.0;
}
for(i=0;i<=imax;i++)
for(j=1;j<=jmax-1;j++)
{
uu[0][i][j]=ub[0][i][j];
uu[4][i][j]=ub[4][i][j];
}
for(i=0;i<=imax;i++)
for(j=0;j<=jmax;j++)
printf("%f , %f, %f \n" ,x[i],y[j],uu[0][i][j]);
u0[0] =0.5*1.0*exp((-g)*(-0.5));
u0[1] =0.0;
u0[2]=0.0;
u0[3] =0.0;
u0[4]=1.5*0.5*1.0*exp((-g)*(-0.5))+0.5;
u0[5]=1.0;
u0[6]=0.0;
u0[8] =0.0;
u0[7] =0.0;
u1[0] =1.0*exp((-g)*0.5);
u1[1] =0.0;
u1[2]=0.0;
u1[3]=0.0;
u1[4] =1.5*1.0*exp((-g)*0.5);
u1[5]=1.0;
u1[6]=0.0;
u1[8] =0.0;
u1[7] =0.0;
kap = dt/dx;
for(n=1;n<=nmax;n++){
calw(uu,ww);
for(i=0;i<imax;i++)
for(j=0;j<=jmax;j++)
for(q=0;q<qmax;q++)
uh[q][i][j]=uu[q][i][j]-kap*(ww[q][i+1][j][0]-ww[q][i][j][0])-kap*(ww[q][i][j+1][1]-ww[q][i][j][1]);
for(i=0;i<=imax;i++)
for(j=0;j<=jmax;j++)
for(q=0;q<qmax;q++)
{
uh[q][imax][j] = uh[q][0][j];
uh[q][i][jmax] = u1[q];
}
calw(uh,ww);
for(i=0;i<=imax;i++)
for(j=0;j<=jmax;j++)
for(q=0;q<qmax;q++)
un[q][i][j] = 0.5*(uu[q][i][j] + uh[q][i][j]
-kap*(ww[q][i][j][0] - ww[q][i-1][j][0])-kap*(ww[q][i][j][1] - ww[q][i][j-1][1]));
for(i=0;i<=imax;i++)
for(j=0;j<=jmax;j++)
un[2][i][j]=uu[2][i][j] - uu[0][i][j] *g*dt;
for(i=0;i<=imax;i++)
for(j=0;j<=jmax;j++)
for(q=0;q<qmax;q++)
{
un[q][0][j] = un[q][imax][j];
un[q][i][0] = u0[q];
}
for(i=0;i<=imax;i++)
for(j=0;j<=jmax;j++)
for(q=0;q<qmax;q++)
uu[q][i][j]=un[q][i][j];
if(n%nskip==0)
for(i=0;i<=imax;i++)
for(j=0;j<=jmax;j++)
printf("%f , %f, %f \n" ,x[i],y[j],uu[0][i][j]);
}
}
</pre>
|