cubt2 Subroutine

private subroutine cubt2(nx, ny, p, mx, my, q, intpol, jy, dym, dy, dyp, dypp, pjm, pj, pjp, pjpp, ix, dxm, dx, dxp, dxpp)

Arguments

Type IntentOptional Attributes Name
integer :: nx
integer :: ny
real(kind=wp) :: p(nx,ny)
integer :: mx
integer :: my
real(kind=wp) :: q(mx,my)
integer :: intpol(2)
integer :: jy(my)
real(kind=wp) :: dym(my)
real(kind=wp) :: dy(my)
real(kind=wp) :: dyp(my)
real(kind=wp) :: dypp(my)
real(kind=wp) :: pjm(mx)
real(kind=wp) :: pj(mx)
real(kind=wp) :: pjp(mx)
real(kind=wp) :: pjpp(mx)
integer :: ix(mx)
real(kind=wp) :: dxm(mx)
real(kind=wp) :: dx(mx)
real(kind=wp) :: dxp(mx)
real(kind=wp) :: dxpp(mx)

Calls

proc~~cubt2~~CallsGraph proc~cubt2 regridpack_module::cubt2 proc~cubt1 regridpack_module::cubt1 proc~cubt2->proc~cubt1 proc~lint1 regridpack_module::lint1 proc~cubt2->proc~lint1

Called by

proc~~cubt2~~CalledByGraph proc~cubt2 regridpack_module::cubt2 proc~cubt3 regridpack_module::cubt3 proc~cubt3->proc~cubt2 proc~lint3 regridpack_module::lint3 proc~lint3->proc~cubt2 proc~rgrd2 regridpack_module::rgrd2 proc~rgrd2->proc~cubt2 interface~regrid regridpack_module::regrid interface~regrid->proc~rgrd2 proc~rgrd2_wrapper regridpack_module::rgrd2_wrapper interface~regrid->proc~rgrd2_wrapper proc~rgrd3 regridpack_module::rgrd3 interface~regrid->proc~rgrd3 proc~rgrd3_wrapper regridpack_module::rgrd3_wrapper interface~regrid->proc~rgrd3_wrapper proc~rgrd4 regridpack_module::rgrd4 interface~regrid->proc~rgrd4 proc~rgrd4_wrapper regridpack_module::rgrd4_wrapper interface~regrid->proc~rgrd4_wrapper proc~cubt4 regridpack_module::cubt4 proc~cubt4->proc~cubt3 proc~cubt4->proc~lint3 proc~lint4 regridpack_module::lint4 proc~lint4->proc~cubt3 proc~lint4->proc~lint3 proc~rgrd2_wrapper->proc~rgrd2 proc~rgrd3->proc~cubt3 proc~rgrd3->proc~lint3 proc~rgrd3_wrapper->proc~rgrd3 proc~rgrd4->proc~cubt4 proc~rgrd4->proc~lint4 proc~rgrd4_wrapper->proc~rgrd4

Source Code

    subroutine cubt2(nx,ny,p,mx,my,q,intpol,jy,dym,dy,dyp,dypp,pjm,pj,pjp,pjpp,ix,dxm,dx,dxp,dxpp)

    implicit none

    integer  :: nx,ny,mx,my,intpol(2),jy(my),ix(mx)
    integer  :: jsave,j,jj,ii
    real(wp) :: p(nx,ny),q(mx,my)
    real(wp) :: pjm(mx),pj(mx),pjp(mx),pjpp(mx)
    real(wp) :: dym(my),dy(my),dyp(my),dypp(my)
    real(wp) :: dxm(mx),dx(mx),dxp(mx),dxpp(mx)

    if (intpol(1)==1) then

        ! linear in x

        jsave = -3
        do jj=1,my

            ! load closest four j lines containing interpolate on xx mesh
            ! for j-1,j,j+1,j+2 in pjm,pj,pjp,pjpp

            j = jy(jj)
            if (j==jsave) then
                ! j pointer has not moved since last pass (no updates or interpolation)
            else if (j==jsave+1) then
                ! update j-1,j,j+1 and interpolate j+2
                do ii=1,mx
                    pjm(ii) = pj(ii)
                    pj(ii) = pjp(ii)
                    pjp(ii) = pjpp(ii)
                end do
                call lint1(nx,p(1,j+2),mx,pjpp,ix,dx)
            else if (j==jsave+2) then
                ! update j-1,j and interpolate j+1,j+2
                do ii=1,mx
                    pjm(ii) = pjp(ii)
                    pj(ii) = pjpp(ii)
                end do
                call lint1(nx,p(1,j+1),mx,pjp,ix,dx)
                call lint1(nx,p(1,j+2),mx,pjpp,ix,dx)
            else if (j==jsave+3) then
                ! update j-1 and interpolate j,j+1,j+2
                do ii=1,mx
                    pjm(ii) = pjpp(ii)
                end do
                call lint1(nx,p(1,j),mx,pj,ix,dx)
                call lint1(nx,p(1,j+1),mx,pjp,ix,dx)
                call lint1(nx,p(1,j+2),mx,pjpp,ix,dx)
            else
                ! interpolate all four j-1,j,j+1,j+2
                call lint1(nx,p(1,j-1),mx,pjm,ix,dx)
                call lint1(nx,p(1,j),mx,pj,ix,dx)
                call lint1(nx,p(1,j+1),mx,pjp,ix,dx)
                call lint1(nx,p(1,j+2),mx,pjpp,ix,dx)
            end if

            ! save j pointer for next pass

            jsave = j

            ! cubically interpolate q(ii,jj) from pjm,pj,pjp,pjpp in y direction

            do ii=1,mx
                q(ii,jj) = dym(jj)*pjm(ii)+dy(jj)*pj(ii)+dyp(jj)*pjp(ii)+dypp(jj)*pjpp(ii)
            end do
        end do
        return

    else

        ! cubic in x

        jsave = -3
        do jj=1,my

            ! load closest four j lines containing interpolate on xx mesh
            ! for j-1,j,j+1,j+2 in pjm,pj,pjp,pjpp

            j = jy(jj)
            if (j==jsave) then
                ! j pointer has not moved since last pass (no updates or interpolation)
            else if (j==jsave+1) then
                ! update j-1,j,j+1 and interpolate j+2
                do ii=1,mx
                    pjm(ii) = pj(ii)
                    pj(ii) = pjp(ii)
                    pjp(ii) = pjpp(ii)
                end do
                call cubt1(nx,p(1,j+2),mx,pjpp,ix,dxm,dx,dxp,dxpp)
            else if (j==jsave+2) then
                ! update j-1,j and interpolate j+1,j+2
                do ii=1,mx
                    pjm(ii) = pjp(ii)
                    pj(ii) = pjpp(ii)
                end do
                call cubt1(nx,p(1,j+1),mx,pjp,ix,dxm,dx,dxp,dxpp)
                call cubt1(nx,p(1,j+2),mx,pjpp,ix,dxm,dx,dxp,dxpp)
            else if (j==jsave+3) then
                ! update j-1 and interpolate j,j+1,j+2
                do ii=1,mx
                    pjm(ii) = pjpp(ii)
                end do
                call cubt1(nx,p(1,j),mx,pj,ix,dxm,dx,dxp,dxpp)
                call cubt1(nx,p(1,j+1),mx,pjp,ix,dxm,dx,dxp,dxpp)
                call cubt1(nx,p(1,j+2),mx,pjpp,ix,dxm,dx,dxp,dxpp)
            else
                ! interpolate all four j-1,j,j+1,j+2
                call cubt1(nx,p(1,j-1),mx,pjm,ix,dxm,dx,dxp,dxpp)
                call cubt1(nx,p(1,j),mx,pj,ix,dxm,dx,dxp,dxpp)
                call cubt1(nx,p(1,j+1),mx,pjp,ix,dxm,dx,dxp,dxpp)
                call cubt1(nx,p(1,j+2),mx,pjpp,ix,dxm,dx,dxp,dxpp)
            end if

            ! save j pointer for next pass

            jsave = j

            ! cubically interpolate q(ii,jj) from pjm,pj,pjp,pjpp in y direction

            do ii=1,mx
                q(ii,jj) = dym(jj)*pjm(ii)+dy(jj)*pj(ii)+dyp(jj)*pjp(ii)+dypp(jj)*pjpp(ii)
            end do
        end do

    end if

    end subroutine cubt2