
非定常熱伝導の計算のプログラムを作ったんですけど、エラーは出ないのに、結果が出ません。
何が問題なのでしょうか?
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;
}
A 回答 (5件)
- 最新から表示
- 回答順に表示

No.2
- 回答日時:
結果が出ないといったら、結果が出力されていない、つまり、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)でキャストしてから、計算すべきでしょう
No.1
- 回答日時:
プログラムは「思ったとおりには動かず、作った通りに動く」ものです。
当方は非定常熱伝導の計算を知りませんし具体的に現状どのような結果が出力されているのかわかりませんが、要所要所に変数の内容をプリントするprint文を入れてデバッグされてみてはいかがでしょう。
参考まで。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
return 1L
-
if と配列の組み合わせ
-
【C++】関数ポインタの使い方
-
c++でサインカーブ、コサインカ...
-
ラップ関数とはどんなものですか?
-
C言語で三目並べをするプログラ...
-
入力を待たずにstdinの監視をし...
-
C言語 等差数列問題
-
C言語のプログラム作成について
-
「{ } で囲むだけ」は正しい?
-
野球の対戦成績のテーブル表示...
-
複数桁10進数の*桁目だけを抽出...
-
acceptをalarmでタイムアウトさ...
-
C言語で分からないところがあり...
-
実数の整数部,小数部の取得
-
部分行列の抜き出し(C言語)
-
C言語の関数で戻り値を返す必要...
-
windows-findstrの正規表現を使...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数桁10進数の*桁目だけを抽出...
-
C言語での引数の省略方法
-
「指定されたキャストは有効で...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
【C++】関数ポインタの使い方
-
ラップ関数とはどんなものですか?
-
エラー 添字が付けられた値が、...
-
acceptをalarmでタイムアウトさ...
-
if と配列の組み合わせ
-
式は定数値が必要です」という...
-
「{ } で囲むだけ」は正しい?
-
(マルチスレッド)_beginthrea...
-
構造体の勉強中です 合計点の高...
-
数字列を3桁ごとにカンマで区切...
-
return 1L
-
std::set<int> で、ある値が何...
-
C#のコンパイルエラーCS0120に...
-
比較回数と交換回数表示について
-
C言語で分からないところがあり...
おすすめ情報