This routine builds up the matrix for least square fit used in linear and quadratic interpolation.
Compute interpolation matrix for least square fit using stencil direction of available sources The parent of target childs coord is 0,0,0 so we could just use of stencil%cxDir to build up this matrix entries Every row in matrix is evaluated with coord of source element
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(tem_intpMatrixLSF_type), | intent(inout) | :: | me |
intpMatrix for LSF fill |
||
integer, | intent(inout) | :: | order |
interpolation order calculated for current element depending on nSources if quadratic LSF matrix is singular fall back to linear |
||
integer, | intent(in) | :: |
Number of stencil directions |
|||
integer, | intent(in) | :: | nDims |
Number of dimensions |
||
integer, | intent(in) | :: | nSources |
Number of sources from coarser found |
||
real(kind=rk), | intent(in) | :: | cxDirRK(3,QQ) |
Stencil directions |
||
integer, | intent(in) | :: | neighDir(nSources) |
direction in which sources are found |
||
integer, | intent(out) | :: | pos |
Pointer to position of interpolation matrix in growing array of matrix |
||
logical, | intent(out) | :: | success |
success if false if matrix is singular reduce interpolation order |
subroutine append_intpMatrixLSF(me, order, QQ, nDims, nSources, cxDirRK, &
& neighDir, pos, success)
! --------------------------------------------------------------------------
!> intpMatrix for LSF fill
type(tem_intpMatrixLSF_type), intent(inout) :: me
!> interpolation order calculated for current element depending on nSources
!! if quadratic LSF matrix is singular fall back to linear
integer, intent(inout) :: order
!> Number of stencil directions
integer, intent(in) :: QQ
!> Number of dimensions
integer, intent(in) :: nDims
!> Number of sources from coarser found
integer, intent(in) :: nSources
!> Stencil directions
real(kind=rk), intent(in) :: cxDirRK(3,QQ)
!> direction in which sources are found
integer, intent(in) :: neighDir(nSources)
!> Pointer to position of interpolation matrix in growing array of matrix
integer, intent(out) :: pos
!> success if false if matrix is singular reduce interpolation order
logical, intent(out) :: success
! --------------------------------------------------------------------------
integer :: hashID
type(tem_matrix_type) :: matLSF_tmp
logical :: wasAdded
integer :: iNeigh, iSrc
! --------------------------------------------------------------------------
write(dbgUnit(4),"(A,I0)") 'Inside append least square fit matrix for intp ' &
& //'order: ', order
! hashID to identify unique combination of available nSources
hashID = 0
do iSrc = 1, nSources
iNeigh = neighDir(iSrc)
hashID = ibset(hashID, iNeigh)
end do
write(dbgUnit(4),"(A,I0)") ' hashID: ', hashID
call append( me = me%ID, &
& val = hashID, &
& pos = pos, &
& wasAdded = wasAdded )
write(dbgUnit(4),"(A,L5)") ' wasAdded: ', wasAdded
write(dbgUnit(4),"(A,I5)") ' pos: ', pos
if (wasAdded) then
select case(order)
case(1) ! linear
call build_matrixLSF_linearIntp( me = matLSF_tmp, &
& QQ = QQ, &
& nDims = nDims, &
& nSources = nSources, &
& cxDirRK = cxDirRK, &
& neighDir = neighDir, &
& nCoeffs = me%nCoeffs, &
& success = success )
case(2) ! quadratic
call build_matrixLSF_quadIntp( me = matLSF_tmp, &
& QQ = QQ, &
& nDims = nDims, &
& nSources = nSources, &
& cxDirRK = cxDirRK, &
& neighDir = neighDir, &
& nCoeffs = me%nCoeffs, &
& success = success )
case default
write(logUnit(1),*) 'Unsupported interpolation order to build matrix ' &
& //'for LSF: ', order
end select
call append( me = me%isInvertible, val = success )
call append( me = me%matArray, val = matLSF_tmp )
else
! hashID already exist then return success depends on matrix isInvertible
if (me%isInvertible%val(pos)) then
success = .true.
else
success = .false.
end if
end if
write(dbgUnit(4),"(A,L5)") ' success : ', success
end subroutine append_intpMatrixLSF