<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 &gt; 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 &gt; even_blocks) then
-         local_block_number = blocks_per_proc_min
+       if(global_block_number &gt; 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 &gt; 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 &gt; 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 &lt; 10) then
+            write(filename,'(a,i1)') trim(config_proc_decomp_file_prefix), dminfo % nProcs
+         else if (dminfo % nProcs &lt; 100) then
+            write(filename,'(a,i2)') trim(config_proc_decomp_file_prefix), dminfo % nProcs
+         else if (dminfo % nProcs &lt; 1000) then
+            write(filename,'(a,i3)') trim(config_proc_decomp_file_prefix), dminfo % nProcs
+         else if (dminfo % nProcs &lt; 10000) then
+            write(filename,'(a,i4)') trim(config_proc_decomp_file_prefix), dminfo % nProcs
+         else if (dminfo % nProcs &lt; 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>