This function returns a coordinate in the given treelmesh for a physical point location on the finest possible level.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(treelmesh_type), | intent(in) | :: | mesh | |||
real(kind=rk), | intent(in) | :: | point(3) | |||
integer, | intent(in), | optional | :: | level |
coordinate on |
pure function tem_CoordOfReal(mesh, point, level) result(coord) ! -------------------------------------------------------------------- ! type(treelmesh_type), intent(in) :: mesh !< Mesh to locate the point in real(kind=rk), intent(in) :: point(3) !< Point to look up integer, intent(in), optional :: level !< optional level to return the !! coordinate on integer :: coord(4) !< x,y,z,level ! -------------------------------------------------------------------- ! real(kind=rk) :: locInCube(3) real(kind=rk) :: meshDensity integer :: dimLen integer :: coordlevel ! -------------------------------------------------------------------- ! if (present(level)) then coordlevel = min(level, globalMaxLevels) else coordlevel = globalMaxLevels end if locInCube = point - mesh%global%Origin dimLen = 2**coordlevel meshDensity = real(dimLen, kind=rk) / mesh%global%BoundingCubeLength ! Look up the real coordinate on the finest possible resolution. coord(4) = coordlevel ! Coordinates range from 0 to dimLen-1 in each direction ! Do not use periodic domain here, instead use the first ! and last element to capture all points outside the ! domain to deal with numerical inaccuracies. ! That is all elements include their lower boundaries, except ! the last one in a given direction, which includes the lower ! as well as the upper. coord(1:3) = max( min( int(locInCube*meshDensity), dimLen-1 ), 0 ) end function tem_CoordOfReal