This lightly commented program performs a unit test on the Communication Class.
program Unit_Test
use Caesar_Intrinsics_Module
use Caesar_Communication_Class
implicit none
type(real,1) :: R, R2
type(real,1) :: R_PE
type(integer,1) :: Length_PE
type(integer) :: already_counted, i, index, Length, pe
type(Communication_type) :: Comm
! Initialize communications.
call Initialize (Comm)
call Output (Comm)
! Set total length and individual lengths of parallel vectors.
Length = 100
call Initialize (Length_PE, NPEs)
! Unequal setting per PE to trip more possible bugs.
Length_PE(NPEs) = Length
do pe = 1, NPEs-1
Length_PE(pe) = (Length / NPEs) / 2
Length_PE(NPEs) = Length_PE(NPEs) - Length_PE(pe)
end do
! Initialize assembled and distributed vectors.
if (this_is_IO_PE) then
call Initialize (R, Length)
call Initialize (R2, Length)
else
call Initialize (R, 0)
call Initialize (R2, 0)
end if
call Initialize (R_PE, Length_PE(this_PE))
! Set the assembled vector.
if (this_is_IO_PE) then
R = (/ ( changetype(real, Length - i), i=1,Length ) /)
end if
! Distribute the vector.
call Distribute (R_PE, R, Length_PE)
! Check the distributed vector.
if (NPEs == 1) then
already_counted = 0
else
already_counted = SUM( Length_PE(1:this_PE-1) )
end if
do i = 1, Length_PE(this_PE)
index = already_counted + i
if (R_PE(i) /= changetype(real, Length - index) ) then
write (6,*) 'Error --> ', R_PE(i), R(i), i, Length - index
end if
end do
! Assemble and check the vector.
call Assemble (R2, R_PE)
if (ANY(R2 /= R) .and. this_is_IO_PE) then
write (6,*) 'Error --> R /= R2'
end if
! Check state of communication.
VERIFY(Valid_State(Comm),0)
! Finalize communications.
call Finalize (Comm)
end