ProlongToChildren Subroutine

public subroutine ProlongToChildren(interp, nVar, uParent, uChildren)

Prolong (interpolate) a parent element's nodal solution onto its eight children. uChildren(:,:,:,:,c) is the field on child c (SELF child ordering = CGNS corner order). Exact for the parent's degree-N polynomial representation.

Arguments

TypeIntentOptionalAttributesName
type(Lagrange), intent(in) :: interp
integer, intent(in) :: nVar
real(kind=prec), intent(in) :: uParent(1:interp%N+1,1:interp%N+1,1:interp%N+1,1:nVar)
real(kind=prec), intent(out) :: uChildren(1:interp%N+1,1:interp%N+1,1:interp%N+1,1:nVar,1:8)

Calls

proc~~prolongtochildren~~CallsGraph proc~prolongtochildren ProlongToChildren tmp1 tmp1 proc~prolongtochildren->tmp1 tmp2 tmp2 proc~prolongtochildren->tmp2

Called by

proc~~prolongtochildren~~CalledByGraph proc~prolongtochildren ProlongToChildren proc~applytransferplanwindow ApplyTransferPlanWindow proc~applytransferplanwindow->proc~prolongtochildren proc~applytransferplanrange ApplyTransferPlanRange proc~applytransferplanrange->proc~applytransferplanwindow proc~applytransferplan_dgmodel3d_t ApplyTransferPlan_DGModel3D_t proc~applytransferplan_dgmodel3d_t->proc~applytransferplanwindow proc~applytransferplan_dgmodel3d_t->proc~applytransferplanrange proc~verifywindowedapply~2 VerifyWindowedApply proc~verifywindowedapply~2->proc~applytransferplanwindow proc~applytransferplan ApplyTransferPlan proc~applytransferplan->proc~applytransferplanrange proc~adapt_amrcontroller3d Adapt_AMRController3D proc~adapt_amrcontroller3d->proc~applytransferplan_dgmodel3d_t proc~adapt_amrcontroller3d->proc~verifywindowedapply~2 proc~applytransferplan_dgmodel3d ApplyTransferPlan_DGModel3D proc~applytransferplan_dgmodel3d->proc~applytransferplan_dgmodel3d_t

Contents

Source Code


Source Code

  subroutine ProlongToChildren(interp,nVar,uParent,uChildren)
    !! Prolong (interpolate) a parent element's nodal solution onto its eight children.
    !! uChildren(:,:,:,:,c) is the field on child c (SELF child ordering = CGNS corner order).
    !! Exact for the parent's degree-N polynomial representation.
    implicit none
    type(Lagrange),intent(in) :: interp
    integer,intent(in) :: nVar
    real(prec),intent(in) :: uParent(1:interp%N+1,1:interp%N+1,1:interp%N+1,1:nVar)
    real(prec),intent(out) :: uChildren(1:interp%N+1,1:interp%N+1,1:interp%N+1,1:nVar,1:8)
    ! Local
    integer :: c,v,Np

    Np = interp%N+1

    do concurrent(c=1:8,v=1:nVar)
      block
        integer :: i,j,k,ii,jj,kk,kx,ky,kz
        real(prec) :: acc
        real(prec) :: tmp1(1:Np,1:Np,1:Np) ! tmp1(childX, parentY, parentZ) after the x pass
        real(prec) :: tmp2(1:Np,1:Np,1:Np) ! tmp2(childX, childY, parentZ) after the y pass

        kx = transferAxc(c)+1
        ky = transferAyc(c)+1
        kz = transferAzc(c)+1

        ! x-direction: tmp1(i,jj,kk) = sum_ii mortarR(ii,i,kx) * uParent(ii,jj,kk)
        do k = 1,Np
          do j = 1,Np
            do i = 1,Np
              acc = 0.0_prec
              do ii = 1,Np
                acc = acc+interp%mortarR(ii,i,kx)*uParent(ii,j,k,v)
              enddo
              tmp1(i,j,k) = acc
            enddo
          enddo
        enddo
        ! y-direction: tmp2(i,j,kk) = sum_jj mortarR(jj,j,ky) * tmp1(i,jj,kk)
        do k = 1,Np
          do j = 1,Np
            do i = 1,Np
              acc = 0.0_prec
              do jj = 1,Np
                acc = acc+interp%mortarR(jj,j,ky)*tmp1(i,jj,k)
              enddo
              tmp2(i,j,k) = acc
            enddo
          enddo
        enddo
        ! z-direction: uChild(i,j,k) = sum_kk mortarR(kk,k,kz) * tmp2(i,j,kk)
        do k = 1,Np
          do j = 1,Np
            do i = 1,Np
              acc = 0.0_prec
              do kk = 1,Np
                acc = acc+interp%mortarR(kk,k,kz)*tmp2(i,j,kk)
              enddo
              uChildren(i,j,k,v,c) = acc
            enddo
          enddo
        enddo
      endblock
    enddo

  endsubroutine ProlongToChildren