type_variable_shift Subroutine

private subroutine type_variable_shift(self, reverse)

Type Bound

type_variable

Arguments

Type IntentOptional Attributes Name
class(type_variable), intent(inout) :: self
logical, intent(in), optional :: reverse

Source Code

    subroutine type_variable_shift(self, reverse)
        class(type_variable), intent(inout) :: self
        logical, intent(in), optional :: reverse
        integer(int32) :: i

        ! ⏪ reverse オプションが指定され、かつ .true. の場合
        if (present(reverse)) then
            if (reverse) then
                ! ステップを1つ巻き戻す
                self%new(:) = self%pre(:)

                if (self%rank > 0) then
                    self%pre(:) = self%old(:, 1)
                    ! 履歴を1つ未来へずらす (old(1) <- old(2), old(2) <- old(3), ...)
                    do i = 1, self%rank - 1
                        self%old(:, i) = self%old(:, i + 1)
                    end do
                    ! 最後の履歴はクリア
                    self%old(:, self%rank) = 0.0d0
                end if
                return
            end if
        end if
        ! ⏩ 通常の順方向シフトの場合
        ! 履歴を1つ過去へずらす (old(2) <- old(1), old(3) <- old(2), ...)
        if (self%rank > 2) then
            do i = self%rank, 2, -1
                self%old(:, i) = self%old(:, i - 1)
            end do
        end if

        self%old(:, 1) = self%pre(:)
        self%pre(:) = self%new(:)

    end subroutine type_variable_shift