MPC向けmatvecの引数エラー?

hecmw1/src/solver/las/hecmw_solver_las_33.f90 内でのmatvecの計算は、以下のようにMPCの有無で大きく2分されています。

subroutine hecmw_matvec_33 (hecMESH, hecMAT, X, Y, time_Ax, COMMtime)

  if (hecmw_mat_get_flag_mpcmatvec(hecMAT) /= 0) then
    call hecmw_TtmatTvec_33(hecMESH, hecMAT, X, Y, WK, Tcomm)
  else
    call hecmw_matvec_33_inner(hecMESH, hecMAT, X, Y, time_Ax, Tcomm)
  endif

end subroutine

MPCがない場合は hecmw_matvec_33_inner の中でそのまま3x3のmatvec演算を行うのに対し、 hecmw_TtmatTvec_33 ではMPC向けの処理としてさらに次のようなステップを踏むようになっています。

subroutine hecmw_TtmatTvec_33 (hecMESH, hecMAT, X, Y, W, COMMtime)

  call hecmw_Tvec_33(hecMESH, X, Y, COMMtime)
  call hecmw_matvec_33_inner(hecMESH, hecMAT, Y, W, COMMtime)
  call hecmw_Ttvec_33(hecMESH, W, Y, COMMtime)

end subroutine hecmw_TtmatTvec_33

つまり、 hecmw_TtmatTvec_33 の中でも hecmw_matvec_33_inner が呼ばれるものの、 hecmw_matvec_33 から呼ばれる場合とは引数の様子が異なります。

  • hecmw_matvec_33 から→ hecmw_matvec_33_inner(hecMESH, hecMAT, X, Y, time_Ax, Tcomm)
  • hecmw_TtmatTvec_33 から→ hecmw_matvec_33_inner(hecMESH, hecMAT, Y, W, COMMtime)

hecmw_matvec_33_inner の引数定義を確認すると

type (hecmwST_local_mesh), intent(in) :: hecMESH
type (hecmwST_matrix), intent(in), target :: hecMAT
real(kind=kreal), intent(in) :: X(:)
real(kind=kreal), intent(out) :: Y(:)
real(kind=kreal), intent(inout) :: time_Ax
real(kind=kreal), intent(inout), optional :: COMMtime

となっており、5つめの time_Ax (matvecの時間を足し込むのが主) は必須、6つめの COMMtime (通信時間、ここではupdateの時間を足し込むのが主) はオプションとなっています。

これを踏まえて、 hecmw_matvec_33_inner の2種類の呼び出しを振り返ると、hecmw_TtmatTvec_33 から呼ばれている方については、5つめに COMMtime があります。
つまり、MPCありの場合の hecmw_matvec_33_inner では、「本来matvecの時間として計上されるものが通信時間として扱われ」「通信時間として計上されるものはカウントされていない」のではないでしょうか?
(※もしくは、 COMMtime=COMMtime なら、必須の time_Ax がなくても許容される、ということはあり得るのですか?)

MPCありの場合については

subroutine hecmw_TtmatTvec_33 (hecMESH, hecMAT, X, Y, W, time_AX, COMMtime)

  call hecmw_Tvec_33(hecMESH, X, Y, COMMtime)
  call hecmw_matvec_33_inner(hecMESH, hecMAT, Y, W, time_AX, COMMtime)
  call hecmw_Ttvec_33(hecMESH, W, Y, COMMtime)

end subroutine hecmw_TtmatTvec_33

のように、 hecmw_TtmatTvec_33 と hecmw_matvec_33_inner の両方に引数 time_Ax を追加する必要があるのではないでしょうか。

※22, 44, 66, nnについても同様です。nnの hecmw_matvec_nn_inner も?

MPC関係ということで、ひとまず @kgoto さんへのメンションを付けておきます。