<p><b>dwj07@fsu.edu</b> 2012-02-01 12:56:38 -0700 (Wed, 01 Feb 2012)</p><p><br>
        -- BRANCH COMMIT --<br>
<br>
        Adding an explicit decomposition method.<br>
<br>
        Debugging/Testing print statments are commented out.<br>
        Should be removed before trunk commit<br>
</p><hr noshade><pre><font color="gray">Modified: branches/omp_blocks/block_decomp/src/framework/mpas_block_decomp.F
===================================================================
--- branches/omp_blocks/block_decomp/src/framework/mpas_block_decomp.F        2012-02-01 18:47:09 UTC (rev 1444)
+++ branches/omp_blocks/block_decomp/src/framework/mpas_block_decomp.F        2012-02-01 19:56:38 UTC (rev 1445)
@@ -14,6 +14,9 @@
end type graph
integer :: total_blocks
+ logical :: explicitDecomp
+ integer, dimension(:), allocatable :: block_proc_list
+ integer, dimension(:), allocatable :: block_local_id_list
contains
@@ -48,6 +51,9 @@
total_blocks = config_number_of_blocks
end if
+ explicitDecomp = config_explicit_proc_decomp
+
+ call mpas_build_block_proc_list(dminfo)
call mpas_get_blocks_per_proc(dminfo, dminfo % my_proc_id, blocks_per_proc)
if(total_blocks > 1) then
@@ -82,7 +88,7 @@
local_nvertices(:) = 0
do i=1,partial_global_graph_info % nVerticesTotal
read(unit=iunit, fmt=*) global_block_id
- owning_proc = (global_block_id) / blocks_per_proc
+ call mpas_get_owning_proc(dminfo, global_block_id, owning_proc)
local_nvertices(owning_proc+1) = local_nvertices(owning_proc+1) + 1
end do
@@ -97,7 +103,7 @@
do i=1,partial_global_graph_info % nVerticesTotal
read(unit=iunit, fmt=*) global_block_id
- owning_proc = (global_block_id) / blocks_per_proc
+ call mpas_get_owning_proc(dminfo, global_block_id, owning_proc)
global_cell_list(global_start(owning_proc+1)) = i
global_block_list(global_start(owning_proc+1)) = global_block_id
@@ -167,7 +173,8 @@
!dwj 01/31/12 debugging multiple blocks
! do i=1,local_nvertices(dminfo % my_proc_id +1)
-! write(*,*) sorted_local_cell_list(1, i), sorted_local_cell_list(2,i)
+! call mpas_get_local_block_id(dminfo, sorted_local_cell_list(1, i), local_block_id)
+! write(*,*) sorted_local_cell_list(1, i), local_block_id, sorted_local_cell_list(2,i)
! end do
deallocate(sorted_local_cell_list)
@@ -408,14 +415,18 @@
integer :: blocks_per_proc_min, even_blocks, remaining_blocks
- 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
+ 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(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 = block_local_id_list(global_block_number+1)
end if
end subroutine mpas_get_local_block_id!}}}
@@ -426,15 +437,82 @@
integer :: blocks_per_proc_min, even_blocks, remaining_blocks
- 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(.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
+ 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 = block_proc_list(global_block_number+1)
end if
end subroutine mpas_get_owning_proc!}}}
+ subroutine mpas_build_block_proc_list(dminfo)!{{{
+
+ use mpas_configure
+
+ implicit none
+
+ type(dm_info), intent(in) :: dminfo
+
+ integer :: iounit, istatus, i, owning_proc
+ character (len=256) :: filename
+
+ integer, dimension(:), allocatable :: block_counter
+
+ if(.not.explicitDecomp) return
+
+ allocate(block_proc_list(total_blocks))
+ allocate(block_local_id_list(total_blocks))
+
+ if (dminfo % my_proc_id == IO_NODE) then
+ allocate(block_counter(dminfo % nProcs))
+ block_counter = 0
+
+ iounit = 51 + dminfo % my_proc_id
+ if (dminfo % nProcs < 10) then
+ write(filename,'(a,i1)') trim(config_proc_decomp_file_prefix), dminfo % nProcs
+ else if (dminfo % nProcs < 100) then
+ write(filename,'(a,i2)') trim(config_proc_decomp_file_prefix), dminfo % nProcs
+ else if (dminfo % nProcs < 1000) then
+ write(filename,'(a,i3)') trim(config_proc_decomp_file_prefix), dminfo % nProcs
+ else if (dminfo % nProcs < 10000) then
+ write(filename,'(a,i4)') trim(config_proc_decomp_file_prefix), dminfo % nProcs
+ else if (dminfo % nProcs < 100000) then
+ write(filename,'(a,i5)') trim(config_proc_decomp_file_prefix), dminfo % nProcs
+ end if
+
+ open(unit=iounit, file=trim(filename), form='formatted', status='old', iostat=istatus)
+
+ do i=1,total_blocks
+ read(unit=iounit, fmt=*) owning_proc
+
+ block_proc_list(i) = owning_proc
+ block_local_id_list(i) = block_counter(owning_proc+1)
+
+ block_counter(owning_proc+1) = block_counter(owning_proc+1) + 1
+ end do
+
+ close(unit=iounit)
+ deallocate(block_counter)
+ call mpas_dmpar_bcast_ints(dminfo, total_blocks, block_proc_list)
+ call mpas_dmpar_bcast_ints(dminfo, total_blocks, block_local_id_list)
+ else
+ call mpas_dmpar_bcast_ints(dminfo, total_blocks, block_proc_list)
+ call mpas_dmpar_bcast_ints(dminfo, total_blocks, block_local_id_list)
+ endif
+
+ end subroutine mpas_build_block_proc_list!}}}
+
+ subroutine mpas_finish_block_proc_list()!{{{
+ if(.not.explicitDecomp) return
+ deallocate(block_proc_list)
+ deallocate(block_local_id_list)
+ end subroutine mpas_finish_block_proc_list!}}}
+
end module mpas_block_decomp
</font>
</pre>