// Jacobi.v 差分法により熱平衡状態を求める
// まわりの温度(固定値)を定義
#define T_SIDE 0.
#define T_UD 200.
// 温度差の閾値
#define epsilon 1.
module Jacobi(in:input,out:output)
float in on pixel cache 1;
float out on pixel;
{
// 全体の温度差のうち最も値の大きなもの
float res;
#vios mutex res off max
res = 2.;
// 画像を初期化します
parallel{
in[][] = 0.;
}
// 新たに求められた温度と過去の温度の差のうち
// 最も大きなものが閾値以下になるまで繰り返す
while(epsilon < res){
// 最大の温度差を初期化
res = 0.;
parallel{
float left=0.,right=0.,up=0.,down=0.;
// 注目点における温度差
float localres = 0.;
// 上下左右に隣接する点の温度を取得
// 左
if(hotx(in) == 0) left = T_SIDE;
else left = in[-1][];
// 右
if(hotx(in) == width(in)-1) right = T_SIDE;
else right = in[+1][];
// 上
if(hoty(in) == 0) up = T_UD;
else up = in[][-1];
// 下
if(hoty(in) == height(in)-1) down = T_UD;
else down = in[][+1];
// 上下左右の温度の平均が注目点の温度となる
out[][] = (left + right + up + down)/4;
// 注目点の以前の温度との差をとる
localres = fabs(in[][] - out[][]);
// 差型の点と比べ大きければその値で更新
(res < localres) && (res = localres);
}
// 出力画像に結果書き込み
parallel{
in[][] = out[][];
}
// キャッシュ値を更新
sync_cache(in);
}
}
メインフローへ戻る
VIOS トップページ