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