97 lines
2.6 KiB
Fortran
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
|