LCOV - code coverage report
Current view: top level - dynamics/se/dycore - ll_mod.F90 (source / functions) Hit Total Coverage
Test: coverage.info Lines: 47 56 83.9 %
Date: 2024-12-17 17:57:11 Functions: 6 10 60.0 %

          Line data    Source code
       1             : module ll_mod
       2             :   implicit none
       3             :   private
       4             :   type :: node_t
       5             :      integer :: id
       6             :      integer :: Src,Dest
       7             :      type(node_t), pointer :: prev => NULL()
       8             :      type(node_t), pointer :: next => NULL()
       9             :   end type node_t
      10             : 
      11             :   type :: root_t
      12             :      integer     :: number
      13             :      type(node_t), pointer :: first => NULL()
      14             :   end type root_t
      15             :   public :: node_t, root_t
      16             :   integer, public :: NumEdges
      17             : 
      18             :   public :: PrintEdgeList
      19             :   public :: LLAddEdge,LLFindEdge, LLInsertEdge
      20             :   public :: LLSetEdgeCount,LLGetEdgeCount
      21             :   public :: LLFree
      22             : 
      23             : contains
      24             : 
      25        1536 :   subroutine LLSetEdgeCount(value)
      26             :     implicit none
      27             :     integer,intent(in)   :: value
      28        1536 :     NumEdges=value
      29        1536 :   end subroutine LLSetEdgeCount
      30             : 
      31        1536 :   subroutine LLGetEdgeCount(value)
      32             :     implicit none
      33             :     integer,intent(out)  :: value
      34        1536 :     value=NumEdges
      35        1536 :   end subroutine LLGetEdgeCount
      36             : 
      37           0 :   subroutine PrintEdgeList(EdgeList)
      38             : 
      39             :     type(root_t) :: EdgeList(:)
      40             :     type(node_t), pointer :: temp_node
      41             :     integer :: nlist, i
      42           0 :     nlist = SIZE(EdgeList)
      43             : 
      44           0 :     do i=1,nlist
      45           0 :        temp_node => EdgeList(i)%first
      46           0 :        do while(associated(temp_node))
      47           0 :           print *,'Vertex: ',EdgeList(i)%number ,temp_node%Src,'->' ,temp_node%dest, '(',temp_node%id,')'
      48           0 :           temp_node => temp_node%next
      49             :        enddo
      50             :     enddo
      51             : 
      52           0 :   end subroutine PrintEdgeList
      53             : 
      54        1536 :   subroutine LLFree(List)
      55             : 
      56             :     implicit none
      57             :     type(root_t) :: List
      58             :     type(node_t), pointer :: temp_node
      59             :     integer :: nlist,i
      60             : 
      61             : 
      62        1536 :     temp_node => List%first
      63        1536 :     if (associated(temp_node)) then
      64             :       ! Find the end of the list
      65       21320 :       do while(associated(temp_node%next))
      66        1536 :         temp_node => temp_node%next
      67             :       end do
      68             : 
      69        1536 :       temp_node => temp_node%prev
      70             :       !Now step back and deallocate all entries
      71       21320 :       do while(associated(temp_node))
      72       19784 :         deallocate(temp_node%next)
      73       19784 :         temp_node => temp_node%prev
      74             :       end do
      75             :     end if
      76             : 
      77        1536 :   end subroutine LLFree
      78             : 
      79      134168 :   subroutine LLInsertEdge(EdgeList,src,dest,eNum)
      80             :     type (root_t), intent(inout) :: EdgeList
      81             :     integer, intent(in) :: src,dest
      82             :     integer, intent(out) :: eNum
      83             :     logical :: found
      84             : 
      85      134168 :     call LLFindEdge(EdgeList,src,dest,eNum,found)
      86      134168 :     if(.not. found) then
      87       21320 :        call LLAddEdge(EdgeList,src,dest,eNum)
      88             :     endif
      89             : 
      90      134168 :   end subroutine LLInsertEdge
      91             : 
      92   132770840 :   subroutine LLFindEdge(Edge,src,dest,id,found)
      93             : 
      94             :     type (root_t), intent(in) :: Edge
      95             :     integer, intent(in)  :: src,dest
      96             :     integer, intent(out) :: id
      97             :     logical, intent(out) :: found
      98             : 
      99             :     type (node_t), pointer :: temp_node
     100             : 
     101   132770840 :     found =.FALSE.
     102             : 
     103   132770840 :     temp_node => Edge%first
     104  1972765522 :     do while(associated(temp_node) .and. (.not. found))
     105  1972765522 :        if((dest .eq. temp_node%dest) .and. (src .eq. temp_node%Src) ) then
     106      381184 :           found = .TRUE.
     107      381184 :           id=temp_node%id
     108             :        else
     109  1839613498 :           temp_node => temp_node%next
     110             :        endif
     111             :     enddo
     112   132770840 :   end subroutine LLFindEdge
     113             : 
     114       21320 :   subroutine LLAddEdge(EdgeList,src,dest,id)
     115             :     type (root_t), intent(inout) :: EdgeList
     116             :     integer, intent(in)  :: src
     117             :     integer, intent(in)  :: dest
     118             :     integer, intent(out)  :: id
     119             : 
     120             :     type(node_t), pointer :: temp_node
     121             :     type(node_t), pointer  :: new_node
     122             :     type(node_t), pointer :: parent
     123             : 
     124       21320 :     temp_node => EdgeList%first
     125       21320 :     parent    => EdgeList%first
     126             : 
     127      162420 :     do while(associated(temp_node))
     128      141100 :        parent => temp_node
     129      141100 :        temp_node => parent%next
     130             :     enddo
     131       21320 :     allocate(new_node)
     132       21320 :     NumEdges = NumEdges + 1
     133             : 
     134       21320 :     new_node%src=src
     135       21320 :     new_node%dest=dest
     136       21320 :     new_node%id=NumEdges
     137             :     NULLIFY(new_node%next)
     138       21320 :     new_node%prev => parent
     139             : 
     140       21320 :     if(associated(EdgeList%first)) then
     141       19784 :        parent%next => new_node
     142             :     else
     143        1536 :        EdgeList%first => new_node
     144             :     endif
     145       21320 :     id = NumEdges
     146             : 
     147       21320 :   end subroutine LLAddEdge
     148             : 
     149           0 : end module ll_mod

Generated by: LCOV version 1.14