FIXME : Add documentation
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
integer, | intent(in) | :: | nproc | |||
integer, | intent(in) | :: | iproc | |||
real, | intent(out) | :: | unbalanced_amount |
subroutine calculate_unbalanced_y(nproc, iproc, unbalanced_amount)
implicit none
integer, intent (in) :: nproc, iproc
real, intent (out) :: unbalanced_amount
integer :: level_proc_num, i, j, k, m
if(.not. initialized_y_transform) then
write(*,*) 'Y Transform data structures not initialized so calculate_unbalanced_y subroutine will not operate correctly'
write(*,*) 'Aborting subroutine calculate_unbalanced_y'
return
end if
yxf_lo%blocksize = yxf_lo%ulim_world/nproc + 1
yxf_lo%small_block_balance_factor = 1
yxf_lo%large_block_balance_factor = 1
level_proc_num = nproc
k = yxf_lo%nspec
call calculate_block_breakdown(k, i, m, j, level_proc_num)
if(j .eq. 0) then
if(m .eq. 0) then
level_proc_num = level_proc_num/k
k = 1
end if
select case(layout)
case ('yxels')
k = yxf_lo%nlambda * k
case default
k = yxf_lo%negrid * k
end select
call calculate_block_breakdown(k, i, m, j, level_proc_num)
if(j .eq. 0) then
if(m .eq. 0) then
level_proc_num = level_proc_num/k
k = 1
end if
select case(layout)
case ('yxels')
k = yxf_lo%negrid * k
case default
k = yxf_lo%nlambda * k
end select
call calculate_block_breakdown(k, i, m, j, level_proc_num)
if(j .eq. 0) then
if(m .eq. 0) then
level_proc_num = level_proc_num/k
k = 1
end if
k = yxf_lo%nsign * k
call calculate_block_breakdown(k, i, m, j, level_proc_num)
if(j .eq. 0) then
if(m .eq. 0) then
level_proc_num = level_proc_num/k
k = 1
end if
k = yxf_lo%ntgridtotal * k
call calculate_block_breakdown(k, i, m, j, level_proc_num)
if(j .eq. 0) then
if(m .eq. 0) then
level_proc_num = level_proc_num/k
k = 1
end if
k = yxf_lo%nx * k
call calculate_block_breakdown(k, i, m, j, level_proc_num)
if(i .ne. 0) then
call calculate_unbalanced_decomposition(k, yxf_lo%small_block_balance_factor, yxf_lo%large_block_balance_factor, yxf_lo%num_small, yxf_lo%num_large, level_proc_num)
call calculate_block_size(iproc, yxf_lo%num_small, yxf_lo%num_large, yxf_lo%small_block_balance_factor, yxf_lo%large_block_balance_factor, &
1, yxf_lo%blocksize, yxf_lo%small_block_size, yxf_lo%large_block_size, yxf_lo%block_multiple, yxf_lo%llim_proc, yxf_lo%ulim_proc, yxf_lo%ulim_alloc)
end if
else
if(i .ne. 0) then
call calculate_unbalanced_decomposition(k, yxf_lo%small_block_balance_factor, yxf_lo%large_block_balance_factor, yxf_lo%num_small, yxf_lo%num_large, level_proc_num)
call calculate_block_size(iproc, yxf_lo%num_small, yxf_lo%num_large, yxf_lo%small_block_balance_factor, yxf_lo%large_block_balance_factor, &
yxf_lo%nx, yxf_lo%blocksize, yxf_lo%small_block_size, yxf_lo%large_block_size, yxf_lo%block_multiple, yxf_lo%llim_proc, yxf_lo%ulim_proc, yxf_lo%ulim_alloc)
end if
end if
else
if(i .ne. 0) then
call calculate_unbalanced_decomposition(k, yxf_lo%small_block_balance_factor, yxf_lo%large_block_balance_factor, yxf_lo%num_small, yxf_lo%num_large, level_proc_num)
call calculate_block_size(iproc, yxf_lo%num_small, yxf_lo%num_large, yxf_lo%small_block_balance_factor, yxf_lo%large_block_balance_factor, &
yxf_lo%ntgridtotal*yxf_lo%nx, yxf_lo%blocksize, yxf_lo%small_block_size, yxf_lo%large_block_size, yxf_lo%block_multiple, &
yxf_lo%llim_proc, yxf_lo%ulim_proc, yxf_lo%ulim_alloc)
end if
end if
else
if(i .ne. 0) then
call calculate_unbalanced_decomposition(k, yxf_lo%small_block_balance_factor, yxf_lo%large_block_balance_factor, yxf_lo%num_small, yxf_lo%num_large, level_proc_num)
call calculate_block_size(iproc, yxf_lo%num_small, yxf_lo%num_large, yxf_lo%small_block_balance_factor, yxf_lo%large_block_balance_factor, &
yxf_lo%nsign*yxf_lo%ntgridtotal*yxf_lo%nx, yxf_lo%blocksize, yxf_lo%small_block_size, yxf_lo%large_block_size, yxf_lo%block_multiple, &
yxf_lo%llim_proc, yxf_lo%ulim_proc, yxf_lo%ulim_alloc)
end if
end if
else
if(i .ne. 0) then
call calculate_unbalanced_decomposition(k, yxf_lo%small_block_balance_factor, yxf_lo%large_block_balance_factor, yxf_lo%num_small, yxf_lo%num_large, level_proc_num)
select case(layout)
case('yxels')
call calculate_block_size(iproc, yxf_lo%num_small, yxf_lo%num_large, yxf_lo%small_block_balance_factor, yxf_lo%large_block_balance_factor, &
yxf_lo%negrid*yxf_lo%nsign*yxf_lo%ntgridtotal*yxf_lo%nx, yxf_lo%blocksize, yxf_lo%small_block_size, yxf_lo%large_block_size, &
yxf_lo%block_multiple, yxf_lo%llim_proc, yxf_lo%ulim_proc, yxf_lo%ulim_alloc)
case default
call calculate_block_size(iproc, yxf_lo%num_small, yxf_lo%num_large, yxf_lo%small_block_balance_factor, yxf_lo%large_block_balance_factor, &
yxf_lo%nlambda*yxf_lo%nsign*yxf_lo%ntgridtotal*yxf_lo%nx, yxf_lo%blocksize, yxf_lo%small_block_size, yxf_lo%large_block_size, &
yxf_lo%block_multiple, yxf_lo%llim_proc, yxf_lo%ulim_proc, yxf_lo%ulim_alloc)
end select
end if
end if
else
if(i .ne. 0) then
call calculate_unbalanced_decomposition(k, yxf_lo%small_block_balance_factor, yxf_lo%large_block_balance_factor, yxf_lo%num_small, yxf_lo%num_large, level_proc_num)
call calculate_block_size(iproc, yxf_lo%num_small, yxf_lo%num_large, yxf_lo%small_block_balance_factor, yxf_lo%large_block_balance_factor, &
yxf_lo%negrid*yxf_lo%nlambda*yxf_lo%nsign*yxf_lo%ntgridtotal*yxf_lo%nx, yxf_lo%blocksize, yxf_lo%small_block_size, &
yxf_lo%large_block_size, yxf_lo%block_multiple, yxf_lo%llim_proc, yxf_lo%ulim_proc, yxf_lo%ulim_alloc)
end if
end if
if(yxf_lo%large_block_balance_factor .eq. 1 .and. yxf_lo%small_block_balance_factor .eq. 1) then
unbalanced_amount = 0
else
unbalanced_amount = real(yxf_lo%large_block_size)/real(yxf_lo%small_block_size)
unbalanced_amount = unbalanced_amount - 1
end if
if (unbalanced_amount .gt. max_unbalanced_yxf .or. unbalanced_amount .eq. 0) then
unbalanced_yxf = .false.
end if
end subroutine calculate_unbalanced_y