私はこれで本当に対立しています。次のように、C で 3 次元配列を作成しています。
double maxEval = 0;
double Evals[2][le-1];
double Waves[2][2][le-1];
for(int i=0; i<le-1; i++){
getEvalsandWaves(&Evals[0][i], &Evals[1][i], &Waves[0][0][i], &Waves[0][1][i],
&Waves[1][0][i], &Waves[1][1][i], g, dx, &maxEval,
Q[0][i], Q[0][i+1], Q[1][i], Q[1][i+1]);
if(myRank==0){
printf("i= %d, %f %f\n",i,Waves[0][0][i],Waves[0][1][i]);
printf(" %f %f\n\n",Waves[1][0][i],Waves[1][1][i]);
}
}
getEvalsandWaves のプロト関数と関数は次のとおりです。
/*The objective of this function is to calculate eigenvalues which have a close*/
/*form (e1 and e2) as well as the wave speeds associated with each eigenvalue */
/*[w00; w10]) and [w01;w11] which then are stored in a thee dimensional matrix */
void getEvalsandWaves(double *e1, double *e2, double *w00,double *w01, double *w10,
double *w11, double g,double dx, double *max, double him,
double hi, double uim, double ui);
void getEvalsandWaves(double *e1, double *e2, double *w00, double *w01, double *w10,
double *w11, double g, double dx, double *max, double him,
double hi, double uim, double ui){
double hbar=0; double ubar=0;
/*this function only returns the Roe averages */
/*using the values him,hi,uim,ui which are all*/
/*doubles */
RoeAvg(&hbar, &ubar,him,hi,uim,ui);
(*e1) = ubar - sqrt(g*hbar);
(*e2) = ubar + sqrt(g*hbar);
/*I tried to use this values instead of (*e1) and (*e2)*/
/*in calculating the w'sbelow to see if it fixed the */
/*problem but it didn't work. */
double ei1 = ubar - sqrt(g*hbar);
double ei2 = ubar + sqrt(g*hbar);
if(fabs((*e1))>(*max))
(*max)=fabs((*e1));
if(abs((*e2))>(*max))
(*max)=fabs((*e2));
double c = 1/(2*sqrt(g*hbar));
(*w00) = c * ( ei2*(hi-him)+(ui-uim) ) * 1;
(*w01) = c * ( (-1)*ei1*(hi-him)-(ui-uim) ) * 1;
(*w10) = c * ( ei2*(hi-him)+(ui-uim) ) * ei1;
(*w11) = c * ( (-1)*ei1*(hi-him)-(ui-uim) ) * ei2;
}
ですから、ここで何が起こっているのかわかりません。for ループの内側に気付いた場合は、3 次元配列 Waves の値を出力しており、次のサンプル出力が得られます。
...
i= 47, 0.000000 0.000000
-0.000000 0.000000
i= 48, 0.000000 0.000000
-0.000000 0.000000
i= 49, -1.000000 -1.000000
1.414214 -1.414214
...
これは正しい値です。ただし、for ループの直後に Waves の値を出力すると、次のようになります。
...
i= 47, 0.000000 0.000000
-1.000000 -1.000000
i= 48, 0.000000 0.000000
0.000000 0.000000
i= 49, -1.000000 -1.000000
0.000000 0.000000
...
forループが終了したときに値が変わる理由が本当にわかりません。どんな助けでも大歓迎です.(Evals 配列と maxEval 変数はループ後に正しい値を保持します.)