Adjusting weights for collisions

Ionization and recombination collisions have been modified to have the
right products accounting for the possibility that primary electron and
target particle have different weight.
This commit is contained in:
Jorge Gonzalez 2022-12-31 10:46:25 +01:00
commit 0677684f85

View file

@ -305,7 +305,7 @@ MODULE moduleCollisions
REAL(8):: rMass, eRel REAL(8):: rMass, eRel
TYPE(particle), POINTER:: electron => NULL(), neutral => NULL() TYPE(particle), POINTER:: electron => NULL(), neutral => NULL()
REAL(8), DIMENSION(1:3):: vChange REAL(8), DIMENSION(1:3):: vChange
TYPE(particle), POINTER:: newElectron TYPE(particle), POINTER:: newElectron => NULL(), remainingNeutral => NULL()
rMass = reducedMass(part_i%weight*part_i%species%m, part_j%weight*part_j%species%m) rMass = reducedMass(part_i%weight*part_i%species%m, part_j%weight*part_j%species%m)
eRel = rMass*vRel**2 eRel = rMass*vRel**2
@ -324,6 +324,39 @@ MODULE moduleCollisions
END IF END IF
!Exchange of velocity between particles
vChange = self%deltaV*randomDirectionVHS()
!Energy is loss by the primary electron
electron%v = electron%v - vChange
!Creates a new electron from ionization
ALLOCATE(newElectron)
!Copy basic information from primary electron
newElectron = electron
!Secondary electorn gains energy from ionization
newElectron%v = vChange
!Correct the weight of the particles
IF (electron%weight >= neutral%weight) THEN
!If primary electron is hevier than neutral, reduce weight to secondary electron
newElectron%weight = neutral%weight
ELSEIF (electron%weight < neutral%weight) THEN
!If primary electron is ligther than neutral, change weight of neutral and create new neutral
ALLOCATE(remainingNeutral)
PRINT *, "ionize"
remainingNeutral = neutral
remainingNeutral%weight = neutral%weight - electron%weight
neutral%weight = electron%weight
END IF
!Ionize neutral particle !Ionize neutral particle
SELECT TYPE(sp => neutral%species) SELECT TYPE(sp => neutral%species)
TYPE IS(speciesNeutral) TYPE IS(speciesNeutral)
@ -335,27 +368,13 @@ MODULE moduleCollisions
END SELECT END SELECT
!Exchange of velocity between particles !Adds new particles to the list
vChange = self%deltaV*randomDirectionVHS()
!Energy is loss by the primary electron
electron%v = electron%v - vChange
!Creates a new electron from ionization
ALLOCATE(newElectron)
newElectron%species => electron%species
!Secondary electorn gains energy from ionization
newElectron%v = vChange
newElectron%r = neutral%r
newElectron%xi = neutral%xi
newElectron%n_in = .TRUE.
newElectron%vol = neutral%vol
newElectron%volColl = neutral%volColl
newElectron%weight = neutral%weight
!Adds new electron to list of new particles from collisions
CALL OMP_SET_LOCK(lockCollisions) CALL OMP_SET_LOCK(lockCollisions)
CALL partCollisions%add(newElectron) CALL partCollisions%add(newElectron)
IF (ASSOCIATED(remainingNeutral)) THEN
CALL partCollisions%add(remainingNeutral)
END IF
CALL OMP_UNSET_LOCK(lockCollisions) CALL OMP_UNSET_LOCK(lockCollisions)
END IF END IF
@ -399,7 +418,8 @@ MODULE moduleCollisions
collision%electron => sp collision%electron => sp
CLASS DEFAULT CLASS DEFAULT
CALL criticalError("Species " // sp%name // " chosen for ionization is not a charged species", 'initBinaryIonization') CALL criticalError("Species " // sp%name // " chosen for recombination is not a charged species", &
'initBinaryRecombination')
END SELECT END SELECT
@ -422,6 +442,7 @@ MODULE moduleCollisions
TYPE(particle), POINTER:: electron => NULL(), ion => NULL() TYPE(particle), POINTER:: electron => NULL(), ion => NULL()
REAL(8):: sigmaVrel REAL(8):: sigmaVrel
REAL(8), DIMENSION(1:3):: vp_i REAL(8), DIMENSION(1:3):: vp_i
TYPE(particle), POINTER:: remainingIon => NULL()
IF (ASSOCIATED(part_i%species, self%electron)) THEN IF (ASSOCIATED(part_i%species, self%electron)) THEN
electron => part_i electron => part_i
@ -440,8 +461,27 @@ MODULE moduleCollisions
!TODO: This energy should be transformed into photons !TODO: This energy should be transformed into photons
vp_i = ion%v* (1.D0 - (vRel + self%deltaV)/NORM2(ion%v)) vp_i = ion%v* (1.D0 - (vRel + self%deltaV)/NORM2(ion%v))
!Remove electron from simulation IF (electron%weight > ion%weight) THEN
electron%n_in = .FALSE. !Reduce weight of primary electron but particle continues
electron%weight = electron%weight - ion%weight
ELSE
!Remove electron from simulation
electron%n_in = .FALSE.
!There is some ion remaining
IF (electron%weight < ion%weight) THEN
ALLOCATE(remainingIon)
remainingIon = ion
remainingIon%weight = ion%weight - electron%weight
ion%weight = electron%weight
END IF
END IF
!Neutralize ion particle !Neutralize ion particle
SELECT TYPE(sp => ion%species) SELECT TYPE(sp => ion%species)
@ -453,6 +493,13 @@ MODULE moduleCollisions
END SELECT END SELECT
!Adds new particles to the list
IF (ASSOCIATED(remainingIon)) THEN
CALL OMP_SET_LOCK(lockCollisions)
CALL partCollisions%add(remainingIon)
CALL OMP_UNSET_LOCK(lockCollisions)
END IF
END SUBROUTINE collideBinaryRecombination END SUBROUTINE collideBinaryRecombination
!RESONANT CHARGE EXCHANGE !RESONANT CHARGE EXCHANGE