subroutine assign_allocatable_I8P_3D(lhs, rhs, file_unit, msg, verbose)
!< Assign CPU variable with memory checking (kind I8P, rank 3).
!< Variable is returned not allocated if right hand side is not allocated.
!<
!<```fortran
!< use penf
!< integer(I8P), allocatable :: a(:,:,:), b(:,:,:)
!< allocate(b(1:1,1:2,1:3))
!< call assign_allocatable(a, b)
!< print*, allocated(a)
!<```
!=> T <<<
integer(I8P), allocatable, intent(inout) :: lhs(:,:,:) !< Left hand side of assignement.
integer(I8P), allocatable, intent(in) :: rhs(:,:,:) !< Right hand side of assignement.
integer(I4P), intent(in), optional :: file_unit !< File unit for verbose output.
character(*), intent(in), optional :: msg !< Message to be printed in verbose mode.
logical, intent(in), optional :: verbose !< Flag to activate verbose mode.
if (allocated(lhs)) deallocate(lhs)
if (allocated(rhs)) then
if (size(rhs, dim=1)*size(rhs, dim=2)*size(rhs, dim=3)>0) then
call allocate_variable(var=lhs, &
ulb=reshape([lbound(rhs,dim=1),ubound(rhs,dim=1), &
lbound(rhs,dim=2),ubound(rhs,dim=2), &
lbound(rhs,dim=3),ubound(rhs,dim=3)],[2,3]), &
file_unit=file_unit, msg=msg, verbose=verbose)
lhs = rhs
endif
endif
endsubroutine assign_allocatable_I8P_3D