LehreWiki

Water mask resizing, Fortran

module ar_stats

implicit none

integer  scf
real, allocatable, dimension(:,:) :: wm
real, allocatable, dimension(:,:) :: new_wm

contains

subroutine mean
! This subroutine runs a moving window across large array
! and does simple averaging

integer xdim, ydim
integer i, j
integer , dimension(2) :: sh
integer , allocatable, dimension(:,:) :: box
allocate(box(scf,scf))

if ((allocated(wm)).and.(allocated(new_wm))) then
sh = shape(wm)
xdim = sh(1)
ydim = sh(2)

! "scf + 1" is used to tackle difference in
! Python and Fortran array indexing approaches

do i = 1, xdim - scf + 1, scf
    do j =  1, ydim - scf + 1, scf
        new_wm(i/scf + 1, j/scf + 1) = sum(wm(i: i+scf-1, j: j+scf-1))/scf**2
    end do
end do
end if

end subroutine mean


subroutine mode
! subroutine "mode" runs a moving window across large array
! flattens it to a 1D array and finds *single* most common 
! value via counting elements occurrences. Can be easily extended
! to returning several modal values (if this is the case)

integer xdim, ydim
integer i, j
integer ndim
integer, dimension(2) :: sh
integer, allocatable, dimension(:,:) :: box ! moving window
real, allocatable, dimension(:) :: fbox ! flat box
real mfv ! mfv - most frequent value
integer ncounter, ocounter ! new counter and old counter
integer m, n

allocate(box(scf,scf))
allocate(fbox(scf**2))

if ((allocated(wm)).and.(allocated(new_wm))) then

sh = shape(wm)
xdim = sh(1)
ydim = sh(2)
ndim = scf * scf

do i = 1, xdim - scf + 1, scf
do j = 1, ydim - scf + 1, scf
        mfv = -999
        ocounter = 0
        box = (wm(i: i+scf-1, j: j+scf-1))
        fbox = reshape(box, (/ ndim /) )
        do m = 1, ndim
            ncounter = 1
            do n = m, ndim
                if (fbox(n).eq.fbox(m)) then
                    ncounter = ncounter + 1
                end if
            end do
            if (ncounter.gt.ocounter) then
                mfv = fbox(m)
                ocounter = ncounter
            end if
        end do
    new_wm(i/scf + 1, j/scf + 1) = mfv
end do
end do
end if

end subroutine mode


end module array_funcs

LehreWiki: PythonCourse/PythonLES/F2Py/ArStats (last edited 2012-12-06 09:20:32 by MikhailItkin)