aboutsummaryrefslogtreecommitdiff
path: root/Carpet/Carpet/src/LoadBalanceReal/test.F90
diff options
context:
space:
mode:
Diffstat (limited to 'Carpet/Carpet/src/LoadBalanceReal/test.F90')
-rw-r--r--Carpet/Carpet/src/LoadBalanceReal/test.F90101
1 files changed, 101 insertions, 0 deletions
diff --git a/Carpet/Carpet/src/LoadBalanceReal/test.F90 b/Carpet/Carpet/src/LoadBalanceReal/test.F90
new file mode 100644
index 000000000..ff87fc554
--- /dev/null
+++ b/Carpet/Carpet/src/LoadBalanceReal/test.F90
@@ -0,0 +1,101 @@
+program test
+
+ use carpet_boxtypes
+ implicit none
+
+ type(bbox), dimension(100) :: inboxes
+ integer, dimension(3,2) :: obound_init = reshape (source = (/ 1, 1, 1, 1, 1, 1 /), shape = (/ 3, 2 /))
+ type(boundary) :: outbound
+ integer :: nprocs, i, j, nregs, &
+ mode
+ type(ptr), dimension(:), allocatable :: sregions
+ integer, dimension(:), allocatable :: proc_load
+ real(wp) :: totcost, idealcost
+
+ namelist /input/ nregs
+ namelist /superregions/ inboxes, nprocs, ghostsize, alpha, limit_size
+
+ open(unit=1,file='boxes.par',status='old',action='read')
+ read(1, nml=input)
+ close(1)
+
+ open(unit=1,file='boxes.par',status='old',action='read')
+ read(1, nml=superregions)
+ close(1)
+
+ mode = 2
+
+! In mode 1 the processor decomposition is obtained for all integer values
+! from 1 to nprocs and only the processor number and load imbalance is printed.
+ if ( mode == 1) then
+ do j = 1, nprocs
+
+ allocate ( sregions(nregs) )
+ outbound%obound = obound_init
+
+ do i = 1, nregs
+ call create_sregion ( inboxes(i), outbound, i-1, sregions(i)%point )
+ end do
+
+ call SplitSuperRegions ( sregions, j )
+
+ allocate ( proc_load(j) )
+
+ proc_load = 0
+
+ call calc_proc_load ( sregions, proc_load )
+ totcost = sum ( proc_load )
+ idealcost = totcost / j
+
+ do i = 1, nregs
+ call destroy_sregion ( sregions(i)%point )
+ end do
+
+ print*, j, 100*(maxval(proc_load) - idealcost)/idealcost
+
+ deallocate ( sregions, proc_load )
+
+ end do
+
+! In mode 2 the processor decomposition is done for nprocs only but more datail
+! including the full tree information is printed.
+ else
+
+ allocate ( sregions(nregs) )
+ outbound%obound = obound_init
+
+ do i = 1, nregs
+ call create_sregion ( inboxes(i), outbound, i-1, sregions(i)%point )
+ end do
+
+ call SplitSuperRegions ( sregions, nprocs )
+
+ do i = 1, nregs
+ call print_tree ( sregions(i)%point )
+ end do
+
+ allocate ( proc_load(nprocs) )
+
+ proc_load = 0
+
+ call calc_proc_load ( sregions, proc_load )
+
+ print*,'proc_load = ', proc_load
+
+ totcost = sum ( proc_load )
+ print*,'total load = ', totcost
+
+ idealcost = totcost / nprocs
+ print*,'ideal load = ', idealcost
+ print*,'max load = ', maxval ( proc_load )
+ print*,'load_imbalance (%) = ', 100*(maxval(proc_load) - idealcost)/idealcost
+
+ do i = 1, nregs
+ call destroy_sregion ( sregions(i)%point )
+ end do
+
+ deallocate ( sregions, proc_load )
+
+ end if
+
+end program test