subroutine tuneMinNRow()
use job_manage, only: timer_local
use mp, only: nproc, max_reduce, min_reduce, sum_reduce, broadcast, proc0
use fields_arrays, only: phinew, aparnew, bparnew
use gs2_layouts, only: g_lo
use warning_helpers, only: exactly_equal
implicit none
integer :: i
integer :: current_best_size
real :: start_time, end_time, current_best, temp_best
real :: min_best, max_best, av_best, current_av_best
logical :: do_update, do_gather
do_gather = .true.
do_update=do_smart_update
if(g_lo%x_local.and.g_lo%y_local) do_update=.false.
minNRow = 2
current_best = -1
do i = 1,10
call init_fields_matrixlocal(fieldmat, pc, tuning_in=.true.)
start_time = timer_local()
call getfield_local(phinew,aparnew,bparnew,do_gather,do_update)
end_time = timer_local()
call finish_fields_local()
temp_best = end_time - start_time
max_best = temp_best
call max_reduce(max_best, 0)
min_best = temp_best
call min_reduce(min_best, 0)
av_best = temp_best
call sum_reduce(av_best, 0)
if(proc0) then
av_best = av_best/nproc
if(current_best < 0) then
current_best = max_best
current_av_best = av_best
current_best_size = minNRow
else
if(max_best < current_best) then
current_best = max_best
current_av_best = av_best
current_best_size = minNRow
else if(exactly_equal(max_best, current_best)) then
if(av_best < current_av_best) then
current_best = max_best
current_av_best = av_best
current_best_size = minNRow
end if
end if
end if
end if
minNRow = minNRow*2
end do
call broadcast(current_best_size)
minNRow = current_best_size
if(proc0) then
write(*,*) 'Chosen rowsize for matrix-vector operations in fields update',minNRow,current_best
end if
end subroutine tuneMinNRow