I'm dying with hay fever but I have to commit
I'm feeling awful but I have work in my desktop that I need to commit so I can work with my laptop while I'm at the IEPC 2022 in Boston.
This commit is contained in:
parent
cbb5fe0bf2
commit
23e2fe9bae
17 changed files with 313 additions and 140 deletions
|
|
@ -3,6 +3,7 @@ MODULE moduleMesh
|
|||
USE moduleList
|
||||
USE moduleOutput
|
||||
USE moduleBoundary
|
||||
USE moduleCollisions
|
||||
IMPLICIT NONE
|
||||
|
||||
!Generic mesh element
|
||||
|
|
@ -148,15 +149,15 @@ MODULE moduleMesh
|
|||
!Parent of Volume element
|
||||
TYPE, PUBLIC, ABSTRACT, EXTENDS(meshElement):: meshVol
|
||||
!Maximum collision rate
|
||||
REAL(8):: sigmaVrelMax = 0.D0
|
||||
REAL(8), ALLOCATABLE:: sigmaVrelMax(:)
|
||||
!Arrays for counting number of collisions
|
||||
TYPE(tallyCollisions), ALLOCATABLE:: tallyColl(:)
|
||||
!Volume
|
||||
REAL(8):: volume = 0.D0
|
||||
!List of particles inside the volume
|
||||
TYPE(listNode), ALLOCATABLE:: listPart_in(:)
|
||||
!Lock indicator for listPart_in
|
||||
INTEGER(KIND=OMP_LOCK_KIND):: lock
|
||||
!Number of collisions per volume
|
||||
INTEGER:: nColl = 0
|
||||
!Total weight of particles inside cell
|
||||
REAL(8), ALLOCATABLE:: totalWeight(:)
|
||||
CONTAINS
|
||||
|
|
@ -658,15 +659,17 @@ MODULE moduleMesh
|
|||
USE moduleList
|
||||
use moduleRefParam
|
||||
USE moduleRandom
|
||||
USE moduleOutput
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshGeneric), INTENT(inout), TARGET:: self
|
||||
INTEGER, INTENT(in):: t
|
||||
INTEGER:: e
|
||||
CLASS(meshVol), POINTER:: vol
|
||||
INTEGER:: k, nPairs, i, j
|
||||
INTEGER:: k, i, j
|
||||
INTEGER:: nPart_i, nPart_j, nPart!Number of particles inside the cell
|
||||
REAL(8):: pMax !Maximum probability of collision
|
||||
INTEGER:: nColl
|
||||
TYPE(pointerArray), ALLOCATABLE:: partTemp_i(:), partTemp_j(:)
|
||||
TYPE(particle), POINTER:: part_i, part_j
|
||||
INTEGER:: n, c
|
||||
|
|
@ -674,21 +677,23 @@ MODULE moduleMesh
|
|||
REAL(8):: sigmaVrelTotal
|
||||
REAL(8), ALLOCATABLE:: sigmaVrel(:), probabilityColl(:)
|
||||
REAL(8):: rnd !Random number for collision
|
||||
INTEGER:: realCollisions
|
||||
|
||||
IF (MOD(t, everyColl) == 0) THEN
|
||||
!Collisions need to be performed in this iteration
|
||||
!$OMP DO SCHEDULE(DYNAMIC)
|
||||
!$OMP DO SCHEDULE(DYNAMIC) PRIVATE(part_i, part_j, partTemp_i, partTemp_j)
|
||||
DO e=1, self%numVols
|
||||
|
||||
realCollisions = 0
|
||||
|
||||
vol => self%vols(e)%obj
|
||||
|
||||
!TODO: Simplify this, to many sublevels
|
||||
!Iterate over the number of pairs
|
||||
nPairs = SIZE(interactionMatrix) !TODO: This does not change, make a variable in a module
|
||||
DO k = 1, nPairs
|
||||
DO k = 1, nCollPairs
|
||||
!Reset tally of collisions
|
||||
IF (collOutput) THEN
|
||||
vol%tallyColl(k)%tally = 0
|
||||
|
||||
END IF
|
||||
|
||||
IF (interactionMatrix(k)%amount > 0) THEN
|
||||
!Select the species for the collision pair
|
||||
i = interactionMatrix(k)%sp_i%n
|
||||
|
|
@ -703,22 +708,22 @@ MODULE moduleMesh
|
|||
nPart = nPart_i + nPart_j
|
||||
|
||||
!Resets the number of collisions in the cell
|
||||
vol%nColl = 0
|
||||
nColl = 0
|
||||
|
||||
!Probability of collision for pair i-j
|
||||
pMax = (vol%totalWeight(i) + vol%totalWeight(j))*vol%sigmaVrelMax*tauColl/vol%volume
|
||||
pMax = (vol%totalWeight(i) + vol%totalWeight(j))*vol%sigmaVrelMax(k)*tauColl/vol%volume
|
||||
|
||||
!Number of collisions in the cell
|
||||
vol%nColl = NINT(REAL(nPart)*pMax*0.5D0)
|
||||
nColl = NINT(REAL(nPart)*pMax*0.5D0)
|
||||
|
||||
!Converts the list of particles to an array for easy access
|
||||
IF (vol%nColl > 0) THEN
|
||||
IF (nColl > 0) THEN
|
||||
partTemp_i = vol%listPart_in(i)%convert2Array()
|
||||
partTemp_j = vol%listPart_in(j)%convert2Array()
|
||||
|
||||
END IF
|
||||
|
||||
DO n = 1, vol%nColl
|
||||
DO n = 1, nColl
|
||||
!Select random particles
|
||||
part_i => NULL()
|
||||
part_j => NULL()
|
||||
|
|
@ -735,13 +740,12 @@ MODULE moduleMesh
|
|||
|
||||
!If particles do not belong to the species, skip collision
|
||||
!This can happen, for example, if particle has been previously ionized or removed
|
||||
!TODO: Try to find a way to no lose these collisions. Check new 'k' and use that for the collision, maybe?
|
||||
!TODO: Try to find a way to no lose these collisions. Maybe check new 'k' and use that for the collision, maybe?
|
||||
IF (part_i%species%n /= i .OR. &
|
||||
part_j%species%n /= j) THEN
|
||||
CYCLE
|
||||
|
||||
END IF
|
||||
|
||||
!Obtain the cross sections for the different processes
|
||||
!TODO: From here it might be a procedure in interactionMatrix
|
||||
vRel = NORM2(part_i%v-part_j%v)
|
||||
|
|
@ -749,26 +753,34 @@ MODULE moduleMesh
|
|||
CALL interactionMatrix(k)%getSigmaVrel(vRel, eRel, sigmaVrelTotal, sigmaVrel)
|
||||
|
||||
!Update maximum sigma*v_rel
|
||||
IF (sigmaVrelTotal > vol%sigmaVrelMax) THEN
|
||||
vol%sigmaVrelMax = sigmaVrelTotal
|
||||
IF (sigmaVrelTotal > vol%sigmaVrelMax(k)) THEN
|
||||
vol%sigmaVrelMax(k) = sigmaVrelTotal
|
||||
|
||||
END IF
|
||||
|
||||
ALLOCATE(probabilityColl(0:interactionMatrix(k)%amount))
|
||||
probabilityColl(0) = 0.0
|
||||
probabilityColl(1:interactionMatrix(k)%amount) = sigmaVrel/vol%sigmaVrelMax
|
||||
probabilityColl = 0.0
|
||||
DO c = 1, interactionMatrix(k)%amount
|
||||
probabilityColl(c) = sigmaVrel(c)/vol%sigmaVrelMax(k) + SUM(probabilityColl(0:c-1))
|
||||
|
||||
END DO
|
||||
|
||||
!Selects random number between 0 and 1
|
||||
rnd = random()
|
||||
|
||||
!If the random number is below the total probability of collision, collide particles
|
||||
IF (rnd < sigmaVrelTotal / vol%sigmaVrelMax) THEN
|
||||
IF (rnd < sigmaVrelTotal / vol%sigmaVrelMax(k)) THEN
|
||||
|
||||
!Loop over collisions
|
||||
DO c = 1, interactionMatrix(k)%amount
|
||||
IF (SUM(probabilityColl(0:c-1)) + rnd <= probabilityColl(c)) THEN
|
||||
IF (rnd <= probabilityColl(c)) THEN
|
||||
CALL interactionMatrix(k)%collisions(c)%obj%collide(part_i, part_j, vRel)
|
||||
realCollisions = realCollisions + 1
|
||||
|
||||
!If collisions are gonna be output, count the collision
|
||||
IF (collOutput) THEN
|
||||
vol%tallyColl(k)%tally(c) = vol%tallyColl(k)%tally(c) + 1
|
||||
|
||||
END IF
|
||||
|
||||
!A collision has ocurred, exit the loop
|
||||
EXIT
|
||||
|
|
@ -782,16 +794,17 @@ MODULE moduleMesh
|
|||
!Deallocate arrays for next collision
|
||||
DEALLOCATE(sigmaVrel, probabilityColl)
|
||||
|
||||
!End loop collisions in cell
|
||||
END DO
|
||||
|
||||
END IF
|
||||
|
||||
END IF
|
||||
|
||||
!End loop collision pairs
|
||||
END DO
|
||||
|
||||
vol%nColl = realCollisions
|
||||
|
||||
!End loop volumes
|
||||
END DO
|
||||
!$OMP END DO
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue