summaryrefslogtreecommitdiff
path: root/class/neighbourList.f90
blob: 8bf9c1417613146cefbb93480f9282eebee31243 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
subroutine ONETO2(id, x, y)
    implicit none
    integer, intent(in)  :: id
    integer, intent(out) :: x, y

    y = id / b
    x = mod(id, b)
end subroutine ONETO2

function TWOtoONE(x, y) result(id)
    implicit none
    integer, intent(in) :: x, y
    integer :: id

    id = y * b + x
end function TWOtoONE

function get_neighbour_ids(p) result (neighbours)
    integer, intent(in) :: p !> The sequential position
    integer, allocatable, dimension(:) :: neighbours !> The list of neighbours
    integer :: i,j,k
    integer :: x_cell, y_cell, x_test, y_test
    integer :: max_list(9)

    !> Don't save the values between calls
    k = 1
    max_list = -1

    call ONETO2(p,x_cell,y_cell)
    max_list(k) = p

    !print *, max_list

    !> Start by just getting all of the neighbours
    do i = -1,1
        do j = -1,1
            if(i == 0 .and. j == 0) cycle !> Skip the cell itself
            
            !> The "test" coordinate
            x_test = x_cell + i
            y_test = y_cell + j

            !> If the coordinates are real (within the expected range), add them to the list:
            if((x_test .ge. 0 .and. x_test .lt. b) .and. (y_test .ge. 0 .and. y_test .lt. b)) then
                !> Increment the number of correct coordinates
                k = k + 1
                !> Flip a zero to the new coordinate in the max list
                max_list(k) = TWOtoONE(x_test, y_test)
            end if
        end do
    end do

    !> Return a vector of all non-zero elements
!    neighbours = pack(max_list, max_list>= 0.0)
    neighbours = max_list ! entries -1 must be skipped as they correspond to non-existent neighbours at the edge or corner
end function get_neighbour_ids
    
subroutine buildNBL()
  integer :: sector
  do sector=0,b*b-1
     nbl(sector,:) = get_neighbour_ids(sector)
  end do
end subroutine buildNBL