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.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| 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) |
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