type_variable_predict Subroutine

private subroutine type_variable_predict(self, dt1, dt2, dt3)

Type Bound

type_variable

Arguments

Type IntentOptional Attributes Name
class(type_variable), intent(inout) :: self
real(kind=real64), intent(in) :: dt1
real(kind=real64), intent(in), optional :: dt2
real(kind=real64), intent(in), optional :: dt3

Source Code

    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