generate_bernoulli_mask Subroutine

private subroutine generate_bernoulli_mask(this)

Generate Bernoulli mask

Type Bound

dropblock2d_layer_type

Arguments

Type IntentOptional Attributes Name
class(dropblock2d_layer_type), intent(inout) :: this

Instance of the 2D dropblock layer


Source Code

  subroutine generate_bernoulli_mask(this)
    !! Generate Bernoulli mask
    implicit none

    ! Arguments
    class(dropblock2d_layer_type), intent(inout) :: this
    !! Instance of the 2D dropblock layer

    ! Local variables
    real(real32), allocatable, dimension(:,:) :: mask_real
    !! Real mask
    integer :: i, j
    !! Loop indices
    integer, dimension(2) :: ilim, jlim
    !! Limits for mask


    ! Generate Bernoulli mask
    !---------------------------------------------------------------------------
    ! assume random number already seeded and don't need to again
    allocate(mask_real(size(this%mask,1), size(this%mask,2)))
    call random_number(mask_real)  ! Generate random values in [0..1]

    this%mask = .true. ! 1 = keep

    ! Apply threshold to create binary mask
    !---------------------------------------------------------------------------
    do j = 1 + this%half, size(this%mask, dim=2) - this%half
       do i = 1 + this%half, size(this%mask, dim=1) - this%half
          if(mask_real(i, j).lt.this%gamma)then
             ilim(:) = [ &
                  max(i - this%half, lbound(this%mask,1)), &
                  min(i + this%half, ubound(this%mask,1)) ]
             jlim(:) = [ &
                  max(j - this%half, lbound(this%mask,2)), &
                  min(j + this%half, ubound(this%mask,2)) ]
             this%mask(ilim(1):ilim(2), jlim(1):jlim(2)) = .false. ! 0 = drop
          end if
       end do
    end do

  end subroutine generate_bernoulli_mask