Merge branch 'improve/secondaryElectronIonization' into 'development'
Improve ionization See merge request JorgeGonz/fpakc!47
This commit is contained in:
commit
a3d7b38e3b
6 changed files with 49 additions and 9 deletions
Binary file not shown.
|
|
@ -764,6 +764,11 @@ make
|
||||||
\item \textbf{electron}: Character.
|
\item \textbf{electron}: Character.
|
||||||
Name of species designed as electrons.
|
Name of species designed as electrons.
|
||||||
Only valid for \textbf{ionization} and \textbf{recombination} processes.
|
Only valid for \textbf{ionization} and \textbf{recombination} processes.
|
||||||
|
\item \textbf{electronSecondary}: Character.
|
||||||
|
Optional.
|
||||||
|
Name of species designed as secondary electrons.
|
||||||
|
If none provided, \textbf{electron} is used.
|
||||||
|
Only valid for \textbf{ionization}.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
\item \textbf{Coulomb}: Array of objects.
|
\item \textbf{Coulomb}: Array of objects.
|
||||||
|
|
|
||||||
|
|
@ -93,7 +93,7 @@ MODULE moduleTable
|
||||||
f = self%fMax
|
f = self%fMax
|
||||||
|
|
||||||
ELSE
|
ELSE
|
||||||
i = MINLOC(x - self%x, 1)
|
i = MINLOC(ABS(x - self%x), 1)
|
||||||
deltaX = x - self%x(i)
|
deltaX = x - self%x(i)
|
||||||
IF (deltaX < 0 ) THEN
|
IF (deltaX < 0 ) THEN
|
||||||
i = i - 1
|
i = i - 1
|
||||||
|
|
|
||||||
|
|
@ -634,7 +634,7 @@ MODULE moduleInput
|
||||||
INTEGER:: i, k, ij
|
INTEGER:: i, k, ij
|
||||||
INTEGER:: pt_i, pt_j
|
INTEGER:: pt_i, pt_j
|
||||||
REAL(8):: energyThreshold, energyBinding
|
REAL(8):: energyThreshold, energyBinding
|
||||||
CHARACTER(:), ALLOCATABLE:: electron
|
CHARACTER(:), ALLOCATABLE:: electron, electronSecondary
|
||||||
INTEGER:: e
|
INTEGER:: e
|
||||||
CLASS(meshCell), POINTER:: cell
|
CLASS(meshCell), POINTER:: cell
|
||||||
|
|
||||||
|
|
@ -711,9 +711,17 @@ MODULE moduleInput
|
||||||
IF (.NOT. found) CALL criticalError('energyThreshold not found for collision' // object, 'readInteractions')
|
IF (.NOT. found) CALL criticalError('energyThreshold not found for collision' // object, 'readInteractions')
|
||||||
CALL config%get(object // '.electron', electron, found)
|
CALL config%get(object // '.electron', electron, found)
|
||||||
IF (.NOT. found) CALL criticalError('electron not found for collision' // object, 'readInteractions')
|
IF (.NOT. found) CALL criticalError('electron not found for collision' // object, 'readInteractions')
|
||||||
|
CALL config%get(object // '.electronSecondary', electronSecondary, found)
|
||||||
|
IF (found) THEN
|
||||||
|
CALL initBinaryIonization(interactionMatrix(ij)%collisions(k)%obj, &
|
||||||
|
crossSecFilePath, energyThreshold, electron, electronSecondary)
|
||||||
|
|
||||||
|
ELSE
|
||||||
CALL initBinaryIonization(interactionMatrix(ij)%collisions(k)%obj, &
|
CALL initBinaryIonization(interactionMatrix(ij)%collisions(k)%obj, &
|
||||||
crossSecFilePath, energyThreshold, electron)
|
crossSecFilePath, energyThreshold, electron)
|
||||||
|
|
||||||
|
END IF
|
||||||
|
|
||||||
CASE ('recombination')
|
CASE ('recombination')
|
||||||
!Electorn impact ionization
|
!Electorn impact ionization
|
||||||
CALL config%get(object // '.energyBinding', energyBinding, found)
|
CALL config%get(object // '.energyBinding', energyBinding, found)
|
||||||
|
|
|
||||||
|
|
@ -911,7 +911,9 @@ MODULE moduleMesh
|
||||||
!Loop over collisions
|
!Loop over collisions
|
||||||
DO c = 1, interactionMatrix(k)%amount
|
DO c = 1, interactionMatrix(k)%amount
|
||||||
IF (rnd_real <= probabilityColl(c)) THEN
|
IF (rnd_real <= probabilityColl(c)) THEN
|
||||||
|
!$OMP CRITICAL
|
||||||
CALL interactionMatrix(k)%collisions(c)%obj%collide(part_i, part_j, vRel)
|
CALL interactionMatrix(k)%collisions(c)%obj%collide(part_i, part_j, vRel)
|
||||||
|
!$OMP END CRITICAL
|
||||||
|
|
||||||
!If collisions are gonna be output, count the collision
|
!If collisions are gonna be output, count the collision
|
||||||
IF (collOutput) THEN
|
IF (collOutput) THEN
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,7 @@ MODULE moduleCollisions
|
||||||
REAL(8):: eThreshold !Minimum energy (non-dimensional units) required for ionization
|
REAL(8):: eThreshold !Minimum energy (non-dimensional units) required for ionization
|
||||||
REAL(8):: deltaV !Change in velocity due to exchange of eThreshold
|
REAL(8):: deltaV !Change in velocity due to exchange of eThreshold
|
||||||
CLASS(speciesCharged), POINTER:: electron !Pointer to species considerer as electrons
|
CLASS(speciesCharged), POINTER:: electron !Pointer to species considerer as electrons
|
||||||
|
CLASS(speciesCharged), POINTER:: electronSecondary !Pointer to species considerer as secondary electron
|
||||||
CONTAINS
|
CONTAINS
|
||||||
PROCEDURE, PASS:: collide => collideBinaryIonization
|
PROCEDURE, PASS:: collide => collideBinaryIonization
|
||||||
|
|
||||||
|
|
@ -241,7 +242,7 @@ MODULE moduleCollisions
|
||||||
|
|
||||||
!ELECTRON IMPACT IONIZATION
|
!ELECTRON IMPACT IONIZATION
|
||||||
!Inits electron impact ionization
|
!Inits electron impact ionization
|
||||||
SUBROUTINE initBinaryIonization(collision, crossSectionFilename, energyThreshold, electron)
|
SUBROUTINE initBinaryIonization(collision, crossSectionFilename, energyThreshold, electron, electronSecondary)
|
||||||
USE moduleTable
|
USE moduleTable
|
||||||
USE moduleRefParam
|
USE moduleRefParam
|
||||||
USE moduleConstParam
|
USE moduleConstParam
|
||||||
|
|
@ -253,7 +254,8 @@ MODULE moduleCollisions
|
||||||
CHARACTER(:), ALLOCATABLE, INTENT(in):: crossSectionFilename
|
CHARACTER(:), ALLOCATABLE, INTENT(in):: crossSectionFilename
|
||||||
REAL(8), INTENT(in):: energyThreshold
|
REAL(8), INTENT(in):: energyThreshold
|
||||||
CHARACTER(:), ALLOCATABLE, INTENT(in):: electron
|
CHARACTER(:), ALLOCATABLE, INTENT(in):: electron
|
||||||
INTEGER:: electronIndex
|
CHARACTER(:), ALLOCATABLE, OPTIONAL, INTENT(in):: electronSecondary
|
||||||
|
INTEGER:: electronIndex, electronSecondaryIndex
|
||||||
|
|
||||||
ALLOCATE(collisionBinaryIonization:: collision)
|
ALLOCATE(collisionBinaryIonization:: collision)
|
||||||
|
|
||||||
|
|
@ -276,12 +278,29 @@ MODULE moduleCollisions
|
||||||
TYPE IS(speciesCharged)
|
TYPE IS(speciesCharged)
|
||||||
collision%electron => sp
|
collision%electron => sp
|
||||||
|
|
||||||
|
CLASS DEFAULT
|
||||||
|
CALL criticalError("Species " // sp%name // " chosen for " // &
|
||||||
|
"impacting electron is not a charged species", 'initBinaryIonization')
|
||||||
|
|
||||||
|
END SELECT
|
||||||
|
|
||||||
|
IF (PRESENT(electronSecondary)) THEN
|
||||||
|
electronSecondaryIndex = speciesName2Index(electronSecondary)
|
||||||
|
SELECT TYPE(sp => species(electronSecondaryIndex)%obj)
|
||||||
|
TYPE IS(speciesCharged)
|
||||||
|
collision%electronSecondary => sp
|
||||||
|
|
||||||
CLASS DEFAULT
|
CLASS DEFAULT
|
||||||
CALL criticalError("Species " // sp%name // " chosen for " // &
|
CALL criticalError("Species " // sp%name // " chosen for " // &
|
||||||
"secondary electron is not a charged species", 'initBinaryIonization')
|
"secondary electron is not a charged species", 'initBinaryIonization')
|
||||||
|
|
||||||
END SELECT
|
END SELECT
|
||||||
|
|
||||||
|
ELSE
|
||||||
|
collision%electronSecondary => NULL()
|
||||||
|
|
||||||
|
END IF
|
||||||
|
|
||||||
!momentum change per ionization process
|
!momentum change per ionization process
|
||||||
collision%deltaV = sqrt(collision%eThreshold / collision%electron%m)
|
collision%deltaV = sqrt(collision%eThreshold / collision%electron%m)
|
||||||
|
|
||||||
|
|
@ -336,6 +355,12 @@ MODULE moduleCollisions
|
||||||
!Copy basic information from primary electron
|
!Copy basic information from primary electron
|
||||||
newElectron = electron
|
newElectron = electron
|
||||||
|
|
||||||
|
!If secondary electron species indicates, convert
|
||||||
|
IF (ASSOCIATED(self%electronSecondary)) THEN
|
||||||
|
newElectron%species => self%electronSecondary
|
||||||
|
|
||||||
|
END IF
|
||||||
|
|
||||||
!Secondary electorn gains energy from ionization
|
!Secondary electorn gains energy from ionization
|
||||||
newElectron%v = vChange
|
newElectron%v = vChange
|
||||||
|
|
||||||
|
|
@ -362,7 +387,7 @@ MODULE moduleCollisions
|
||||||
CALL sp%ionize(neutral)
|
CALL sp%ionize(neutral)
|
||||||
|
|
||||||
CLASS DEFAULT
|
CLASS DEFAULT
|
||||||
! CALL criticalError(sp%name // " is not a neutral", 'collideBinaryIonization')
|
CALL criticalError(sp%name // " is not a neutral", 'collideBinaryIonization')
|
||||||
RETURN
|
RETURN
|
||||||
|
|
||||||
END SELECT
|
END SELECT
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue