Erlangで数値解析(並列版)

昨日の続き。
http://d.hatena.ne.jp/yukichanko/20100624/1277377040

少し時間が余ったので、並列版を考えてみた。
しかし、これでイイのかわからない_| ̄|○

並列化したのは、電界/磁界の更新式の部分。

逐次版

並列化対称の関数。

calc_ey({Eps, Dt, Dx}, Ey, Hz) ->
  Diff_Hz = create_diff_list(Hz),   % Hzの差分リストを作成
  Cut_Ey = cut_both_end_element(Ey),   % Eyの両端をカット
  [E - Dt / (Eps * Dx) * DH || {E, DH} <- lists:zip(Cut_Ey, Diff_Hz)].   % Ey更新式

並列版

よくわからんので、リスト内包の部分の計算を別プロセスを立ち上げて、メッセージパッシング。

% Ey計算本体
calc_ey(Const, Ey, Hz) ->
  Diff_Hz = create_diff_list(Hz),   % Hzの差分リストを作成
  Cut_Ey = cut_both_end_element(Ey),   % Eyの両端をカット
  [send_calc_ey_message({E, DH}, Const) || {E, DH} <- lists:zip(Cut_Ey, Diff_Hz)].

% 個々のEy[i]の計算を別プロセスに投げる。
send_calc_ey_message(EH, Const) ->
  Pid = spawn(fdtd, calc_ey_main, []),
  Pid ! {self(), {EH, Const}},
  receive
    {Pid, Msg} -> Msg
  end.

% 個々のEy[i]の計算を実行して、親プロセスに戻す。
calc_ey_main() ->
  receive
    {From, {{E, DH}, {Eps, Dt, Dx}}} ->
      From ! {self(), E - Dt / (Eps * Dx) * DH}
  end.

一応これでいいと思うけど、そもそも計算負荷が軽すぎて、並列化してもほとんど意味ないやん、状態。
う〜ん、もっと別の題材でやらんとおんもろないなぁ。

ソース