subroutine type_variable_predict(self, dt1, dt2, dt3)
class(type_variable), intent(inout) :: self
real(real64), intent(in) :: dt1
real(real64), intent(in), optional :: dt2, dt3
integer(int32) :: i
real(real64) :: w0, w1, w2
real(real64) :: t0, t1, t2, t3
real(real64) :: l0, l1, l2
select case (self%rank)
! --------------------------------------
case (1)
! BDF1 → 1次:preをそのまま代入
!$omp parallel do
do i = 1, self%length
self%new(i) = self%pre(i)
end do
!$omp end parallel do
! --------------------------------------
case (2)
if (.not. present(dt2)) stop "BDF2 predict needs dt2"
! Lagrange 外挿:点 (t_n, t_{n-1}) から t_{n+1} を予測
w0 = (dt1 + dt2) / dt2
w1 = -dt1 / dt2
!$omp parallel do
do i = 1, self%length
self%new(i) = w0 * self%pre(i) + w1 * self%old(i, 1)
end do
!$omp end parallel do
! --------------------------------------
case (3)
if (.not. (present(dt2) .and. present(dt3))) stop "BDF3 predict needs dt2 and dt3"
! 時刻:t3 (最古), t2, t1 (現pre), t0 (新step)
t3 = 0.0d0
t2 = t3 + dt3
t1 = t2 + dt2
t0 = t1 + dt1
!$omp parallel do private(l0, l1, l2)
do i = 1, self%length
l0 = (t0 - t1) * (t0 - t2) / ((t3 - t1) * (t3 - t2)) ! old(:,2)
l1 = (t0 - t3) * (t0 - t2) / ((t1 - t3) * (t1 - t2)) ! old(:,1)
l2 = (t0 - t3) * (t0 - t1) / ((t2 - t3) * (t2 - t1)) ! pre
self%new(i) = l0 * self%old(i, 2) + l1 * self%old(i, 1) + l2 * self%pre(i)
end do
!$omp end parallel do
! --------------------------------------
case default
stop "predict supports only BDF1 to BDF3"
end select
end subroutine type_variable_predict