RestrictFromChildren Subroutine

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

Restrict (L2-project) the solution on eight children back onto their parent element. Conservative, and the exact left inverse of ProlongToChildren.

Arguments

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

Calls

proc~~restrictfromchildren~~CallsGraph proc~restrictfromchildren RestrictFromChildren tmp1 tmp1 proc~restrictfromchildren->tmp1 up up proc~restrictfromchildren->up tmp2 tmp2 proc~restrictfromchildren->tmp2

Called by

proc~~restrictfromchildren~~CalledByGraph proc~restrictfromchildren RestrictFromChildren proc~applytransferplanwindow ApplyTransferPlanWindow proc~applytransferplanwindow->proc~restrictfromchildren 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 RestrictFromChildren(interp,nVar,uChildren,uParent)
    !! Restrict (L2-project) the solution on eight children back onto their parent element.
    !! Conservative, and the exact left inverse of ProlongToChildren.
    implicit none
    type(Lagrange),intent(in) :: interp
    integer,intent(in) :: nVar
    real(prec),intent(in) :: uChildren(1:interp%N+1,1:interp%N+1,1:interp%N+1,1:nVar,1:8)
    real(prec),intent(out) :: uParent(1:interp%N+1,1:interp%N+1,1:interp%N+1,1:nVar)
    ! Local
    integer :: v,Np

    Np = interp%N+1

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

        up(1:Np,1:Np,1:Np) = 0.0_prec
        do c = 1,8
          kx = transferAxc(c)+1
          ky = transferAyc(c)+1
          kz = transferAzc(c)+1
          ! x-direction: tmp1(i,jj,kk) = sum_ii mortarP(ii,i,kx) * uChild(ii,jj,kk,c)
          do kk = 1,Np
            do jj = 1,Np
              do i = 1,Np
                acc = 0.0_prec
                do ii = 1,Np
                  acc = acc+interp%mortarP(ii,i,kx)*uChildren(ii,jj,kk,v,c)
                enddo
                tmp1(i,jj,kk) = acc
              enddo
            enddo
          enddo
          ! y-direction: tmp2(i,j,kk) = sum_jj mortarP(jj,j,ky) * tmp1(i,jj,kk)
          do kk = 1,Np
            do j = 1,Np
              do i = 1,Np
                acc = 0.0_prec
                do jj = 1,Np
                  acc = acc+interp%mortarP(jj,j,ky)*tmp1(i,jj,kk)
                enddo
                tmp2(i,j,kk) = acc
              enddo
            enddo
          enddo
          ! z-direction and accumulate over the eight children
          do k = 1,Np
            do j = 1,Np
              do i = 1,Np
                acc = 0.0_prec
                do kk = 1,Np
                  acc = acc+interp%mortarP(kk,k,kz)*tmp2(i,j,kk)
                enddo
                up(i,j,k) = up(i,j,k)+acc
              enddo
            enddo
          enddo
        enddo
        uParent(1:Np,1:Np,1:Np,v) = up(1:Np,1:Np,1:Np)
      endblock
    enddo

  endsubroutine RestrictFromChildren