module kinds_modTypes:
public type morton_iterVariables:
integer (kind=i_k), private, parameter :: SFC_DIMS = 3Subroutines and functions:
public pure subroutine morton_c2i (lev, p, idx) public pure subroutine morton_c2i_qsz (lev, qsz, p, idx) public pure subroutine morton_i2c_qsz (lev, qsz, idx, p, iter) public pure subroutine morton_iter_init (iter, lev, opt_qsz) public pure subroutine morton_iter_set (iter, idx) public pure subroutine morton_iter_next (iter)
Uses simple bit-interleaving algorithm as described in M.J. Aftosmis, M.J. Berger and S.M. Murman, "Applications of Space-Filling Curves to Cartesian Methods for CFD", 2004 (except for the subroutines with limited query region size)
Routines accept position and morton-index starting at 1!
Author: Matthias Lieber
public type morton_iter integer (kind=i_k) :: idx = -1 integer (kind=i_k), dimension (SFC_DIMS) :: p = -1 integer (kind=i_k) :: lev = -1 integer (kind=i_k), dimension (SFC_DIMS) :: qsz = -1 integer (kind=i_k) :: len = -1 integer (kind=i_k), dimension (SFC_MAX_LEV) :: c = -1 integer (kind=i_k), dimension (SFC_DIMS,SFC_MAX_LEV) :: p0 = 1 integer (kind=i_K) :: jump_level = SFC_MAX_LEV + 1 end type morton_iterIterator to traverse the 3D Morton curve
public pure subroutine morton_c2i (lev, p, idx) integer (kind=i_k), intent(in) :: lev integer (kind=i_k), intent(in), dimension (3) :: p integer (kind=i_k), intent(out) :: idx end subroutine morton_c2iParameters:
lev | level of the morton curve (1=2x2x2, 2=4x4x4, 3=8x8x8, etc) |
p | 3D coordinates [1 ... 2^lev] |
idx | index on the 3D morton curve [1 ... (2^lev)^3] |
Has logarithmic complexity: number of loop iterations = lev. Due to performance reasons, no checking of arguments is performend!
public pure subroutine morton_c2i_qsz (lev, qsz, p, idx) integer (kind=i_k), intent(in) :: lev integer (kind=i_k), intent(in), dimension (3) :: qsz integer (kind=i_k), intent(in), dimension (3) :: p integer (kind=i_k), intent(out) :: idx end subroutine morton_c2i_qszParameters:
lev | level of the morton curve (1=2x2x2, 2=4x4x4, 3=8x8x8, etc) |
qsz | query region size |
p | 3D coordinates [1 ... 2^lev] |
idx | index on the 3D morton curve [1 ... (2^lev)^3] |
The size of the query region is restricted by qsz for each dimension. qsz must be <= lev**2 and pos must be <= qsz.
Has logarithmic complexity: number of loop iterations = lev. Due to performance reasons, no checking of arguments is performend!
public pure subroutine morton_i2c_qsz (lev, qsz, idx, p, iter) integer (kind=i_k), intent(in) :: lev integer (kind=i_k), intent(in), dimension (3) :: qsz integer (kind=i_k), intent(in) :: idx integer (kind=i_k), intent(out), dimension (3) :: p type (morton_iter), optional, intent(inout) :: iter end subroutine morton_i2c_qszParameters:
lev | level of the morton curve (1=2x2x2, 2=4x4x4, 3=8x8x8, etc) |
qsz | query region size |
idx | index on the 3D morton curve [1 ... (2^lev)^3 ] |
p | 3D coordinates [1 ... 2^lev] |
iter | for internal use only |
The size of the query region is restricted by qsz for each dimension. qsz must be <= lev**2 and pos must be <= qsz.
Has logarithmic complexity: number of loop iterations = lev. Due to performance reasons, no checking of arguments is performend!
public pure subroutine morton_iter_init (iter, lev, opt_qsz) type (morton_iter), intent(inout) :: iter integer (kind=i_k), intent(in) :: lev integer (kind=i_k), optional, intent(in), dimension (SFC_DIMS) :: opt_qsz end subroutine morton_iter_initInitialize the iterator.
The current index is iter%idx and the current 3D position iter%p.
call morton_iter_init(iter, lev, qsz) do while(iter%idx > 0) array(iter%p(1),iter%p(2)) = iter%idx call morton_iter_next(iter) end do
public pure subroutine morton_iter_set (iter, idx) type (morton_iter), intent(inout) :: iter integer (kind=i_k), intent(in) :: idx end subroutine morton_iter_setSet the iterator to given index
public pure subroutine morton_iter_next (iter) type (morton_iter), intent(inout) :: iter end subroutine morton_iter_nextIterate to next point on the Morton curve
After reaching the end of the curve, iter%idx is set to 0.