電子書籍の厳選無料作品が豊富!

非定常熱伝導の計算のプログラムを作ったんですけど、エラーは出ないのに、結果が出ません。
何が問題なのでしょうか?

include <stdlib.h>

// パラメータ設定
#define Nx 50 // x方向のグリッド数
#define Ny 50 // y方向のグリッド数
#define Nz 50 // z方向のグリッド数
#define Lx 1.0 // x方向の領域の長さ
#define Ly 1.0 // y方向の領域の長さ
#define Lz 1.0 // z方向の領域の長さ
#define dx (Lx / (Nx - 1)) // x方向のグリッド間隔
#define dy (Ly / (Ny - 1)) // y方向のグリッド間隔
#define dz (Lz / (Nz - 1)) // z方向のグリッド間隔

// 時間のパラメータ
#define dt 0.01 // 時間ステップ
#define totalTime 1.0 // 総シミュレーション時間
#define numTimeSteps ((int)(totalTime / dt)) // 時間ステップ数

// 熱拡散率の定義
#define alpha 0.1

// 初期条件: T(x, y, z, t=0)
double initialTemperature(int i, int j, int k) {
// 例として中心に熱スポットを置く初期条件
double x = i * dx - Lx / 2.0;
double y = j * dy - Ly / 2.0;
double z = k * dz - Lz / 2.0;
double distanceSquared = x*x + y*y + z*z;
return distanceSquared < 0.1 ? 1.0 : 0.0;
}

int main() {
// 温度の配列を初期化
double T[Nx][Ny][Nz];

// 初期条件を設定
for (int i = 0; i < Nx; ++i) {
for (int j = 0; j < Ny; ++j) {
for (int k = 0; k < Nz; ++k) {
T[i][j][k] = initialTemperature(i, j, k);
}
}
}

// 明示的なオイラー法を使用して時間積分する
for (int t = 0; t < numTimeSteps; ++t) {
// 新しい温度を格納するための一時的な配列を作成
double T_new[Nx][Ny][Nz];

// 明示的なスキームを使用して新しい温度を計算する
for (int i = 1; i < Nx - 1; ++i) {
for (int j = 1; j < Ny - 1; ++j) {
for (int k = 1; k < Nz - 1; ++k) {
T_new[i][j][k] = T[i][j][k] + alpha * dt * (
(T[i+1][j][k] - 2*T[i][j][k] + T[i-1][j][k]) / (dx*dx) +
(T[i][j+1][k] - 2*T[i][j][k] + T[i][j-1][k]) / (dy*dy) +
(T[i][j][k+1] - 2*T[i][j][k] + T[i][j][k-1]) / (dz*dz)
);
}
}
}

// 次の時間ステップのために T を T_new に更新する
for (int i = 0; i < Nx; ++i) {
for (int j = 0; j < Ny; ++j) {
for (int k = 0; k < Nz; ++k) {
T[i][j][k] = T_new[i][j][k];
}
}
}
}

// 最終的な温度分布を出力する(例として、中間の平面を出力)
int midIndex = Nx / 2; // 中間平面のインデックス
for (int j = 0; j < Ny; ++j) {
for (int k = 0; k < Nz; ++k) {
printf("%.2f ", T[midIndex][j][k]);
}
printf("\n");
}

return 0;
}

  • 画像を添付する (ファイルサイズ:10MB以内、ファイル形式:JPG/GIF/PNG)
  • 今の自分の気分スタンプを選ぼう!
あと4000文字

A 回答 (5件)

T_newの端っこが初期化されないまま


Tへコピーされてるのがとっても気になる。
    • good
    • 0

T_new に入っているゴミが T を汚染する可能性もあるね.

    • good
    • 0

printf出力だと、コンソール(コマンドプロンプト、シェル)の画面に表示されます。



また、printfはstdio.hをインクルードしないと処理されません。
    • good
    • 1

結果が出ないといったら、結果が出力されていない、つまり、printf()が動作していない、呼ばれていない、という意味にも取れます



技術系の質問をするのであれば、その辺りには気をつけた方が良いとおもいます


ざっとみた感じ、initialTemperature()の、戻り値が、全て1.0(全てが中心点になっている?全体が全て同じ温度?)であれば、下記計算部分で、x,y,zが、int に丸められて、計算結果が、0になって、それが、0.0にキャストされているかもしれません

double x = i * dx - Lx / 2.0;
double y = j * dy - Ly / 2.0;
double z = k * dz - Lz / 2.0;

x, y, z をprintf()で、確認し、常に0.0になっていれば、i, j, k、を(double)でキャストしてから、計算すべきでしょう
    • good
    • 0

プログラムは「思ったとおりには動かず、作った通りに動く」ものです。



当方は非定常熱伝導の計算を知りませんし具体的に現状どのような結果が出力されているのかわかりませんが、要所要所に変数の内容をプリントするprint文を入れてデバッグされてみてはいかがでしょう。

参考まで。
    • good
    • 3

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A