interpolate Subroutine

private subroutine interpolate(x, y, x_out, y_out)

Arguments

Type IntentOptional Attributes Name
real(kind=dp), intent(in) :: x(:)
real(kind=dp), intent(in) :: y(:)
real(kind=dp), intent(in) :: x_out
real(kind=dp), intent(out) :: y_out

Called by

proc~~interpolate~~CalledByGraph proc~interpolate interpolate proc~interpolate_vector interpolate_vector proc~interpolate_vector->proc~interpolate proc~signal_init signal_t%signal_init proc~signal_init->proc~interpolate_vector proc~boundary_init_part1 boundary_init_part1 proc~boundary_init_part1->proc~signal_init proc~channel_init_part1 channel_init_part1 proc~channel_init_part1->proc~signal_init proc~mesh2d_init_part1 mesh2D_init_part1 proc~mesh2d_init_part1->proc~signal_init proc~sim_init simulation_t%sim_init proc~sim_init->proc~signal_init proc~solid_init_part1 solid_init_part1 proc~solid_init_part1->proc~signal_init proc~strand_init_part1 strand_init_part1 proc~strand_init_part1->proc~signal_init program~reims_p reims_p program~reims_p->proc~boundary_init_part1 program~reims_p->proc~channel_init_part1 program~reims_p->proc~mesh2d_init_part1 program~reims_p->proc~sim_init program~reims_p->proc~solid_init_part1 program~reims_p->proc~strand_init_part1

Source Code

subroutine interpolate(x, y, x_out, y_out) ! TODO this should be a function not subroutine
    real(dp), intent(in) :: x(:), y(:), x_out
    real(dp), intent(out) :: y_out
    integer :: i

    ! Check if x_out is outside the range of x
    if (x_out <= x(1)) then
        y_out = y(1)
    elseif (x_out >= x(size(x))) then
        y_out = y(size(y))
    else
        ! Find the interval [x(i), x(i+1)] that contains x_out
        do i = 1, size(x) - 1
            if (x_out >= x(i) .and. x_out <= x(i+1)) then
                ! Perform linear interpolation
                y_out = y(i) + (y(i+1) - y(i)) * (x_out - x(i)) / (x(i+1) - x(i))
                exit
            endif
        enddo
    endif
end subroutine interpolate