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