cubnmxu Subroutine

private subroutine cubnmxu(nx, mx, ix, dxm, dx, dxp, dxpp)

set cubic interpolation terms

Arguments

Type IntentOptional Attributes Name
integer :: nx
integer :: mx
integer :: ix(mx)
real(kind=wp) :: dxm(mx)
real(kind=wp) :: dx(mx)
real(kind=wp) :: dxp(mx)
real(kind=wp) :: dxpp(mx)

Called by

proc~~cubnmxu~~CalledByGraph proc~cubnmxu regridpack_module::cubnmxu proc~rgrd1u regridpack_module::rgrd1u proc~rgrd1u->proc~cubnmxu proc~rgrd2u regridpack_module::rgrd2u proc~rgrd2u->proc~cubnmxu proc~rgrd3u regridpack_module::rgrd3u proc~rgrd3u->proc~cubnmxu proc~rgrd4u regridpack_module::rgrd4u proc~rgrd4u->proc~cubnmxu interface~regrid regridpack_module::regrid interface~regrid->proc~rgrd1u interface~regrid->proc~rgrd2u interface~regrid->proc~rgrd3u interface~regrid->proc~rgrd4u

Source Code

    subroutine cubnmxu(nx,mx,ix,dxm,dx,dxp,dxpp)

    implicit none

    integer :: nx,mx,ix(mx),i,ii
    real(wp) :: dxm(mx),dx(mx),dxp(mx),dxpp(mx),dnx,dmx,odnx3
    real(wp) :: xx,xim,xi,xip,xipp

    ! set "virtual" uniform increments
    dnx = 1.0_wp/(nx-1)
    dmx = 1.0_wp/(mx-1)
    odnx3 = 1.0_wp/(6.0_wp*dnx*dnx*dnx)

    ! set i=ix(ii) in [2,nx-2] such that
    ! i-1,i,i+1,i+2 can be used to interpolate at ii
    do ii=1,mx
        xx = (ii-1)*dmx
        ix(ii) = min(max(int(xx/dnx)+1,2),nx-2)
        i = ix(ii)
        ! set scale terms for cubic
        xi = (i-1)*dnx
        xim = xi-dnx
        xip = xi+dnx
        xipp = xip+dnx
        dxm(ii) = -(xx-xi)*(xx-xip)*(xx-xipp)*odnx3
        dx(ii) = 3.0_wp*(xx-xim)*(xx-xip)*(xx-xipp)*odnx3
        dxp(ii) = -3.0_wp*(xx-xim)*(xx-xi)*(xx-xipp)*odnx3
        dxpp(ii) = (xx-xim)*(xx-xi)*(xx-xip)*odnx3
    end do

    end subroutine cubnmxu