数値振動からの解放

計算が途中で思わぬ数値振動が発生して発展してしまうケースがあった。
色々と対応策を考えてやってみたが結果は良くなるどころか悪化するだけ。
 
数値フィルタを使うとうまく行ったが駄目ケースがありフィルタリングを小まめにやるようにした。
しかし、本来の計算結果と矛盾を起こして数値振動は爆発的になるようなになってしまった。
 
よく調べてみると地形の精度に依存しているようだった。
勾配が極端な箇所で起きる事が分かった。なので地形側を平滑化してみたが少し解消しただけだった。
それでもっと平滑化してみたが数値振動が起きなくなるまでやると元の地形とは大きく変わってしまっていた。これではまったく意味が無い。
 
思いついては試すという事を5ヶ月ほど、、、もう無理、、、。
 
もう少し調べてみるかぁと思ったのが先週。
 
本来必要な平滑化場所があるに違いない!!
そう思って複数の可能性を試したがやっぱり駄目だった。
そして先日、試していない一つの可能性に気が付いた。
それは非常に水深の浅い箇所それも1cm程度、隣のセルでは水深が50mという場所が気になった。調べてみるとそこでの計算が伝播して数値振動が起きているのでは無いか?。そしてそのような位置をマーキングしてみるとなんとこれまで見つけていた数値振動の起因箇所に近い所に一致していた。
そこで平滑化は勾配が極端な箇所をノイズとして軽く除去しておいて上記のマーキング位置だけ移流項の計算を1次精度風上差分で計算してみた。
 
ばっちり!!
他のケースの数値振動は全て解消していた。
 
つまり、異常な地形(鋭い突起、凹み位置)だけ少し平滑化して水深の浅い箇所それも1cm程度の位置で急激な段差(50m以上)があるようなとこだけ移流項の計算を1次精度風上差分で計算するという方法だ。
これならフィルタ処理も無いし、地形の修正も少しで済むので精度を大きく犠牲にする事も無くなった。
 
ここには書いていないがもっと色んないやらしい対応を試しているが上記の対応はそれらに比べたら美しい!!(それだけ迷路にまよって変てこな策を沢山試していたという事)。