find grid cell for certain position
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(t_sGrid), | intent(in) | :: | sf |
self |
||
| real(kind=wp), | intent(in) | :: | x |
FUNCTION sGrid_find_elem( sf , x) RESULT(iElem) ! MODULES IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES CLASS(t_sgrid), INTENT(IN ) :: sf !! self REAL(wp) , INTENT(IN ) :: x !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES INTEGER :: iElem !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: low,high REAL(wp) :: xloc !=================================================================================================================================== iElem=1 xloc=MIN(1.0_wp,MAX(0.0_wp,x)) IF(xloc.LT.(sf%sp(0)+sf%ds(1))) THEN iElem=1 RETURN END IF IF(xloc.GE.(sf%sp(sf%nElems)-sf%ds(sf%nElems))) THEN iElem=sf%nElems RETURN END IF SELECT CASE(sf%grid_type) CASE(GRID_TYPE_UNIFORM) iElem=CEILING(xloc*sf%nElems) RETURN CASE(GRID_TYPE_S2) !finer at the center iElem=CEILING(SQRT(xloc)*sf%nElems) RETURN CASE(GRID_TYPE_SQRT_S) !finer at the edge iElem=CEILING((xloc**2)*sf%nElems) RETURN END SELECT !not efficient, bisection of sp array is better!! !DO jElem=2,sf%nElems ! IF((xloc.GE.sf%sp(iElem-1)).AND.(xloc.LT.sf%sp(jElem)))THEN ! iElem=jElem ! EXIT ! END IF !END DO !bisection low = 1 high = sf%nElems-1 iElem = (low + high) / 2 +1 DO WHILE ( (xloc .LT. sf%sp(iElem-1)) .OR. (xloc .GE. sf%sp(iElem)) ) IF (xloc .LT. sf%sp(iElem-1)) THEN high = iElem-1 ELSE low = iElem END IF iElem = (low + high) / 2+1 END DO END FUNCTION sGrid_find_elem