fpakc/src/modules/moduleList.f90

97 lines
2.6 KiB
Fortran

!Linked list of particles
MODULE moduleList
USE moduleSpecies
IMPLICIT NONE
TYPE lNode
TYPE(particle), POINTER:: part => NULL()
TYPE(lNode), POINTER:: next => NULL()
END TYPE lNode
TYPE listNode
INTEGER:: amount = 0!TODO: Make private
TYPE(lNode),POINTER:: head => NULL()
TYPE(lNode),POINTER:: tail => NULL()
CONTAINS
PROCEDURE,PASS:: add => addToList
PROCEDURE,PASS:: convert2Array
PROCEDURE,PASS:: erase => eraseList
END TYPE listNode
TYPE(listNode):: partWScheme !Particles comming from the nonAnalogue scheme
INTEGER(KIND=OMP_LOCK_KIND):: lockWScheme !Lock for the NA list of particles
TYPE(listNode):: partCollisions !Particles created in collisional process
INTEGER(KIND=OMP_LOCK_KIND):: lockCollisions !Lock for the NA list of particles
TYPE(listNode):: partSurfaces !Particles created in surface interactions
INTEGER(KIND=OMP_LOCK_KIND):: lockSurfaces !Lock for the NA list of particles
TYPE(listNode):: partInitial !Initial distribution of particles
TYPE pointerArray
TYPE(particle), POINTER:: part
END TYPE
CONTAINS
!Adds element to list
SUBROUTINE addToList(self,part)
USE moduleSpecies
CLASS(listNode), INTENT(inout):: self
TYPE(particle),INTENT(in), TARGET:: part
TYPE(lNode),POINTER:: temp
ALLOCATE(temp)
temp%part => part
temp%next => NULL()
self%amount = self%amount + 1
IF (.NOT. ASSOCIATED(self%head)) THEN
!First element
self%head => temp
self%tail => temp
ELSE
!Append element
self%tail%next => temp
self%tail => temp
END IF
END SUBROUTINE addToList
!converts list to array
FUNCTION convert2Array(self) RESULT(partArray)
IMPLICIT NONE
CLASS(listNode), INTENT(in):: self
TYPE(pointerArray), ALLOCATABLE:: partArray(:)
TYPE(lNode), POINTER:: tempNode
INTEGER:: n
ALLOCATE(partArray(1:self%amount))
tempNode => self%head
DO n=1, self%amount
!Point element in array to element in list
partArray(n)%part => tempNode%part
!Go to next element
tempNode => tempNode%next
END DO
END FUNCTION convert2Array
!Erase list
SUBROUTINE eraseList(self)
CLASS(listNode):: self
TYPE(lNode),POINTER:: current, next
current => self%head
DO WHILE (ASSOCIATED(current))
next => current%next
DEALLOCATE(current)
current => next
END DO
IF (ASSOCIATED(self%head)) NULLIFY(self%head)
IF (ASSOCIATED(self%tail)) NULLIFY(self%tail)
self%amount = 0
END SUBROUTINE eraseList
END MODULE moduleList