Issue with random position in volumes

Fixed an issue in which  the position in triangular an thetrahedron
elements were not correctly being computed.

Other minor issues fixed:
  - Units in input file now do not use '/'.
  - Collisions accuratly conserve momentum.
  - Minor improvements in mass calculation in collisions.
This commit is contained in:
Jorge Gonzalez 2021-05-24 12:37:16 +02:00
commit 9af3429395
7 changed files with 95 additions and 35 deletions

View file

@ -5,7 +5,7 @@ MODULE moduleCollisions
!Abstract type for collision between two particles
TYPE, ABSTRACT:: collisionBinary
REAL(8):: rMass !Reduced mass
REAL(8):: sMass !Summed mass
REAL(8):: sMassInv !Summed mass
TYPE(table1D):: crossSec !cross section of collision
CONTAINS
PROCEDURE(collideBinary_interface), PASS, DEFERRED:: collide
@ -169,8 +169,8 @@ MODULE moduleCollisions
CALL collision%crossSec%convert(eV2J/(m_ref*v_ref**2), 1.D0/L_ref**2)
!Calculates reduced mass
collision%sMass = mass_i+mass_j
collision%rMass = (mass_i*mass_j)/collision%sMass
collision%sMassInv = 1.D0/(mass_i+mass_j)
collision%rMass = (mass_i*mass_j)*collision%sMassInv
END SUBROUTINE initBinaryElastic
@ -180,6 +180,7 @@ MODULE moduleCollisions
USE moduleSpecies
USE moduleConstParam
USE moduleRandom
USE moduleMath
IMPLICIT NONE
CLASS(collisionBinaryElastic), INTENT(in):: self
@ -193,7 +194,7 @@ MODULE moduleCollisions
REAL(8), DIMENSION(1:3):: vCM
REAL(8):: vp(1:3)
vRel = SUM(DABS(part_i%v-part_j%v)) !TODO make function of norm1
vRel = NORM2(part_i%v-part_j%v)
eRel = self%rMass*vRel**2
sigmaVrel = self%crossSec%get(eRel)*vRel
sigmaVrelMaxNew = sigmaVrelMaxNew + sigmaVrel
@ -205,8 +206,8 @@ MODULE moduleCollisions
vp = vRel*randomDirectionVHS()
!Assign velocities to particles
part_i%v = vCM + m_j*vp/self%sMass
part_j%v = vCM - m_i*vp/self%sMass
part_i%v = vCM + m_j*vp*self%sMassInv
part_j%v = vCM - m_i*vp*self%sMassInv
END IF
@ -238,8 +239,8 @@ MODULE moduleCollisions
CALL collision%crossSec%convert(eV2J/(m_ref*v_ref**2), 1.D0/L_ref**2)
!Calculates reduced mass
collision%sMass = mass_i+mass_j
collision%rMass = (mass_i*mass_j)/collision%sMass
collision%sMassInv = 1.D0/(mass_i+mass_j)
collision%rMass = (mass_i*mass_j)*collision%sMassInv
!Specific parameters for ionization collision
SELECT TYPE(collision)
@ -269,6 +270,7 @@ MODULE moduleCollisions
USE moduleErrors
USE moduleList
USE moduleRandom
USE moduleMath
USE OMP_LIB
IMPLICIT NONE
@ -283,7 +285,7 @@ MODULE moduleCollisions
REAL(8), DIMENSION(1:3):: vp_e, vp_n
!eRel (in units of [m][L]^2[t]^-2
vRel = SUM(DABS(part_i%v-part_j%v)) !TODO make function of norm1
vRel = NORM2(part_i%v-part_j%v)
eRel = self%rMass*vRel**2
!Relative energy must be higher than threshold
IF (eRel > self%eThreshold) THEN
@ -370,8 +372,8 @@ MODULE moduleCollisions
CALL collision%crossSec%convert(eV2J/(m_ref*v_ref**2), 1.D0/L_ref**2)
!Calculates reduced mass
collision%sMass = mass_i+mass_j
collision%rMass = (mass_i*mass_j)/collision%sMass
collision%sMassInv = 1.D0/(mass_i+mass_j)
collision%rMass = (mass_i*mass_j)*collision%sMassInv
!Specific parameters for ionization collision
SELECT TYPE(collision)
@ -401,7 +403,7 @@ MODULE moduleCollisions
USE moduleErrors
USE moduleList
USE moduleRandom
USE OMP_LIB
USE moduleMath
IMPLICIT NONE
CLASS(collisionBinaryRecombination), INTENT(in):: self
@ -414,7 +416,7 @@ MODULE moduleCollisions
REAL(8), DIMENSION(1:3):: vp_i
!eRel (in units of [m][L]^2[t]^-2
vRel = SUM(DABS(part_i%v-part_j%v)) !TODO make function of norm1
vRel = NORM2(part_i%v-part_j%v)
eRel = self%rMass*vRel**2
!Relative energy must be higher than threshold
sigmaVrel = self%crossSec%get(eRel)*vRel
@ -476,8 +478,8 @@ MODULE moduleCollisions
CALL collision%crossSec%convert(eV2J/(m_ref*v_ref**2), 1.D0/L_ref**2)
!Calculates reduced mass
collision%sMass = mass_i+mass_j
collision%rMass = (mass_i*mass_j)/collision%sMass
collision%sMassInv = 1.D0/(mass_i+mass_j)
collision%rMass = (mass_i*mass_j)/collision%sMassInv
END SUBROUTINE initBinaryChargeExchange
@ -485,6 +487,7 @@ MODULE moduleCollisions
part_i, part_j)
USE moduleSpecies
USE moduleRandom
USE moduleMath
IMPLICIT NONE
CLASS(collisionBinaryChargeExchange), INTENT(in):: self
@ -496,7 +499,7 @@ MODULE moduleCollisions
REAL(8):: eRel !relative energy
!eRel (in units of [m][L]^2[t]^-2
vRel = SUM(DABS(part_i%v-part_j%v)) !TODO make function of norm1
vRel = NORM2(part_i%v-part_j%v)
eRel = self%rMass*vRel**2
sigmaVrel = self%crossSec%get(eRel)*vRel
sigmaVrelMaxNew = sigmaVrelMaxNew + sigmaVrel