<p><b>dwj07@fsu.edu</b> 2012-06-01 13:50:54 -0600 (Fri, 01 Jun 2012)</p><p><br>
        -- BRANCH COMMIT --<br>
<br>
        Fixing some issues in block_decomp module, to prepare for processors with 0 blocks.<br>
</p><hr noshade><pre><font color="gray">Modified: branches/omp_blocks/multiple_blocks/src/framework/mpas_block_decomp.F
===================================================================
--- branches/omp_blocks/multiple_blocks/src/framework/mpas_block_decomp.F        2012-06-01 19:09:43 UTC (rev 1953)
+++ branches/omp_blocks/multiple_blocks/src/framework/mpas_block_decomp.F        2012-06-01 19:50:54 UTC (rev 1954)
@@ -141,6 +141,9 @@
call mpas_dmpar_scatter_ints(dminfo, dminfo % nprocs, local_nvertices(dminfo % my_proc_id + 1), &
global_start, local_nvertices, global_block_list, local_block_list)
end if
+
+ write(6,*) 'NUM BLOCKS',blocks_per_proc
+ write(6,*) 'NUM CELLS', local_nvertices(dminfo % my_proc_id + 1)
allocate(sorted_local_cell_list(2, local_nvertices(dminfo % my_proc_id + 1)))
allocate(block_id(blocks_per_proc))
@@ -399,27 +402,35 @@
integer :: blocks_per_proc_min, even_blocks, remaining_blocks
integer :: i, owning_proc, local_block_id
-! if(.not. explicitDecomp) then
- blocks_per_proc_min = total_blocks / dminfo % nProcs
- remaining_blocks = total_blocks - (blocks_per_proc_min * dminfo % nProcs)
- even_blocks = total_blocks - remaining_blocks
+ if(.not. explicitDecomp) then
+ if(total_blocks > dminfo % nProcs) then
+ blocks_per_proc_min = total_blocks / dminfo % nProcs
+ remaining_blocks = total_blocks - (blocks_per_proc_min * dminfo % nProcs)
+ even_blocks = total_blocks - remaining_blocks
+
+ blocks_per_proc = blocks_per_proc_min
+
+ if(proc_number < remaining_blocks) then
+ blocks_per_proc = blocks_per_proc + 1
+ end if
+ else
+ if(dminfo % my_proc_id < total_blocks) then
+ blocks_per_proc = 1
+ else
+ blocks_per_proc = 0
+ end if
+ end if
+ else
+ blocks_per_proc = 0
+ do i = 1, total_blocks
+ call mpas_get_owning_proc(dminfo, i, owning_proc)
+ if(owning_proc == proc_number) then
+ call mpas_get_local_block_id(dminfo, i, local_block_id)
+ blocks_per_proc = max(blocks_per_proc, local_block_id)
+ end if
+ end do
+ end if
- blocks_per_proc = blocks_per_proc_min
-
- if(proc_number .le. remaining_blocks) then
- block_per_proc = blocks_per_proc + 1
- endif
-! else
-! blocks_per_proc = 0
-! do i = 1, total_blocks
-! call mpas_get_owning_proc(dminfo, i, owning_proc)
-! if(owning_proc == proc_number) then
-! call mpas_get_local_block_id(dminfo, i, local_block_id)
-! blocks_per_proc = integer(max(real(block_per_proc), real(local_block_id)))
-! end if
-! end do
-! end if
-
end subroutine mpas_get_blocks_per_proc!}}}
subroutine mpas_get_local_block_id(dminfo, global_block_number, local_block_number)!{{{
@@ -430,14 +441,18 @@
integer :: blocks_per_proc_min, even_blocks, remaining_blocks
if(.not.explicitDecomp) then
- blocks_per_proc_min = total_blocks / dminfo % nProcs
- remaining_blocks = total_blocks - (blocks_per_proc_min * dminfo % nProcs)
- even_blocks = total_blocks - remaining_blocks
-
- if(global_block_number > even_blocks) then
- local_block_number = blocks_per_proc_min
+ if(total_blocks > dminfo % nProcs) then
+ blocks_per_proc_min = total_blocks / dminfo % nProcs
+ remaining_blocks = total_blocks - (blocks_per_proc_min * dminfo % nProcs)
+ even_blocks = total_blocks - remaining_blocks
+
+ if(global_block_number > even_blocks) then
+ local_block_number = blocks_per_proc_min
+ else
+ local_block_number = mod(global_block_number, blocks_per_proc_min)
+ end if
else
- local_block_number = mod(global_block_number, blocks_per_proc_min)
+ local_block_number = 0
end if
else
local_block_number = block_local_id_list(global_block_number+1)
@@ -452,14 +467,18 @@
integer :: blocks_per_proc_min, even_blocks, remaining_blocks
if(.not.explicitDecomp) then
- blocks_per_proc_min = total_blocks / dminfo % nProcs
- remaining_blocks = total_blocks - (blocks_per_proc_min * dminfo % nProcs)
- even_blocks = total_blocks - remaining_blocks
+ if(total_blocks >= dminfo % nProcs) then
+ blocks_per_proc_min = total_blocks / dminfo % nProcs
+ remaining_blocks = total_blocks - (blocks_per_proc_min * dminfo % nProcs)
+ even_blocks = total_blocks - remaining_blocks
- if(global_block_number > even_blocks) then
- owning_proc = global_block_number - even_blocks
+ if(global_block_number > even_blocks) then
+ owning_proc = global_block_number - even_blocks
+ else
+ owning_proc = global_block_number / blocks_per_proc_min
+ end if
else
- owning_proc = global_block_number / blocks_per_proc_min
+ owning_proc = global_block_number
end if
else
owning_proc = block_proc_list(global_block_number+1)
</font>
</pre>