This function calculates the tree ID for a given x,y and z on the given refinement level. This ID in the complete tree does not have to be in the list of leafs (treeIDlist) An example of this procedure is following: 1. Convert coordinates into binary representation: (x,y,z) = (5,9,1) = (0101,1001,0001) 2. Interleaving the bits by 3 digits for each direction: x(0101): 0 1 0 1 y(1001): 1 0 0 1 z(0001): 0 0 0 1 Combining these bits results in a binary number: 010 001 000 111, which is 1095 when seen as a 10-base number. 3. This number is the cell position in a single level sorted element list. Its treeID can be obtained by adding the correspoding level offset.
Periodic displacement for requested elements outside the cube
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
integer, | intent(in) | :: | coord(4) |
3D Coordinates to translate |
||
integer(kind=long_k), | intent(in), | optional | :: | offset |
resulting treeID
pure function tem_IdOfCoord(coord, offset) result(nTreeID) ! --------------------------------------------------------------------------- !> 3D Coordinates to translate integer, intent(in) :: coord(4) !> integer(kind=long_k), intent(in), optional :: offset !> resulting treeID integer(kind=long_k) :: nTreeID ! --------------------------------------------------------------------------- integer :: iLevel ! level iterator ! this variable defines the upper threshold for x, y and z coordinates ! for a given refinement level e.g. for level = 1 only x, y and z ! from 0 to 1 are allowed, otherwise this neighbor is outside of the ! geometry integer :: upperBoundary integer :: myCoord(3) integer :: fak2 integer(kind=long_k) :: fak8 ! --------------------------------------------------------------------------- ! the offset has to be added to the level summation ! @todo: level offset is hard coded in array firstIdAtLevel, ! thus no need to pass offset as an argument. if (present(offset)) then nTreeID = offset else nTreeID = firstIdAtLevel(coord(4)) end if !! Periodic displacement for requested elements outside the cube upperBoundary = 2**coord(4) myCoord = mod(coord(1:3) + upperBoundary, upperBoundary) ! To compute the tree ID of a neighbor on the same refinement level the ! following formula is used: ! newTreeID = sum(i=0, level) {8**i * (mod( (x / (2**level) ) , 2) ! + 2 * mod( ( y / (2**level) ) , 2) ! + 4 * mod( (z / (2**level) ) , 2) ) } fak8 = 1 fak2 = 1 do iLevel = 0, coord(4) - 1 nTreeID = nTreeID + fak8 * ( mod( (myCoord(1) / fak2), 2) & & + 2 * mod( (myCoord(2) / fak2), 2) & & + 4 * mod( (myCoord(3) / fak2), 2) ) fak2 = fak2 * 2 fak8 = fak8 * 8 end do end function tem_IdOfCoord