Restrict (L2-project) the solution on eight children back onto their parent element. Conservative, and the exact left inverse of ProlongToChildren.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| 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) |
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