This routine returns value at the given index. If value is pre-computed and value at given index is returned else value is computing on the points for given index.
If a variable has more than one spacetime function, then result is first spacetime function in the overlapping region.
For vectorial variable
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(tem_varSys_op_type), | intent(in) | :: | fun |
Description of the method to obtain the variables, here some preset values might be stored, like the space time function to use or the required variables. |
||
type(tem_varSys_type), | intent(in) | :: | varSys |
The variable system to obtain the variable from. |
||
type(tem_time_type), | intent(in) | :: | time |
Point in time at which to evaluate the variable. |
||
integer, | intent(in) | :: | iLevel |
Level on which values are requested |
||
integer, | intent(in) | :: | idx(:) |
Index of points in the growing array and variable val array to return. Size: nVals |
||
integer, | intent(in), | optional | :: | idxLen(:) |
With idx as start index in contiguous memory, idxLength defines length of each contiguous memory Size: nVals |
|
integer, | intent(in) | :: | nVals |
Number of values to obtain for this variable (vectorized access). |
||
real(kind=rk), | intent(out) | :: | res(:) |
Resulting values for the requested variable. Dimension: n requested entries x nComponents of this variable Access: (iElem-1)*fun%nComponents + iComp |
recursive subroutine get_valOfIndex_first_vector_spacetime( fun, varSys, & & time, iLevel, & & idx, idxLen, & & nVals, res ) !--------------------------------------------------------------------------! !> Description of the method to obtain the variables, here some preset !! values might be stored, like the space time function to use or the !! required variables. class(tem_varSys_op_type), intent(in) :: fun !> The variable system to obtain the variable from. type(tem_varSys_type), intent(in) :: varSys !> Point in time at which to evaluate the variable. type(tem_time_type), intent(in) :: time !> Level on which values are requested integer, intent(in) :: iLevel !> Index of points in the growing array and variable val array to !! return. !! Size: nVals integer, intent(in) :: idx(:) !> With idx as start index in contiguous memory, !! idxLength defines length of each contiguous memory !! Size: nVals integer, optional, intent(in) :: idxLen(:) !> Number of values to obtain for this variable (vectorized access). integer, intent(in) :: nVals !> Resulting values for the requested variable. !! !! Dimension: n requested entries x nComponents of this variable !! Access: (iElem-1)*fun%nComponents + iComp real(kind=rk), intent(out) :: res(:) !--------------------------------------------------------------------------! ! -------------------------------------------------------------------------! integer :: iStFun, iVal, pos type(tem_st_fun_listElem_type), pointer :: fPtr ! element wise output real(kind=rk) :: st_res(1, fun%nComponents) logical :: found ! -------------------------------------------------------------------------! call C_F_POINTER( fun%method_Data, fPtr ) res = 0.0_rk ! check if number of index are the same as number of values asked for call tem_varsys_check_inArgs( fun, varSys, time, iLevel, idx, idxLen, & & nVals, label = 'get_valOfIndex_first_vector_spacetime' ) do iVal = 1, nVals found = .false. stLoop: do iStFun = 1, fPtr%nVals if (fPtr%val(iStFun)%subTree%useGlobalMesh) then found = .true. else if (idx(iVal) > 0) then ! position of element matches with any of map2global then ! this element is part of this subTree pos = tem_PositionInSorted( & & me = fPtr%val(iStFun)%subTree%map2global, & & val = fPtr%pntData%pntLvl(iLevel) & & %elemPos%val(idx(iVal)) ) found = (pos > 0) end if end if ! global mesh ! We found the one value we were looking for, so we can stop now if (found) then st_res = tem_spacetime_for( me = fPtr%val(iStFun), & & grwPnt = fPtr%pntData%pntLvl(iLevel) & & %grwPnt, & & idx = (/ idx(iVal) /), & & nVals = 1, & & iLevel = ilevel, & & time = time, & & nComps = fun%nComponents ) res( (iVal-1)*fun%nComponents + 1 : iVal*fun%nComponents ) & & = st_res(1, :) exit stLoop end if ! found end do stLoop end do !iVal end subroutine get_valOfIndex_first_vector_spacetime