Impliementation of a collision mesh which is independent for the mesh
used to scatter particles and compute the EM field.
This commit is contained in:
parent
16b86542d4
commit
a2631f6b78
19 changed files with 636 additions and 368 deletions
|
|
@ -59,7 +59,7 @@ MODULE moduleInput
|
|||
CALL checkStatus(config, "readCase")
|
||||
|
||||
!Read injection of particles
|
||||
CALL verboseError('Reading Interactions between species...')
|
||||
CALL verboseError('Reading injection of particles from boundaries...')
|
||||
CALL readInject(config)
|
||||
CALL checkStatus(config, "readInject")
|
||||
|
||||
|
|
@ -483,7 +483,6 @@ MODULE moduleInput
|
|||
END DO
|
||||
|
||||
!Set number of particles to 0 for init state
|
||||
!TODO: In a future, this should include the particles from init states
|
||||
nPartOld = 0
|
||||
|
||||
!Initialize the lock for the non-analogue (NA) list of particles
|
||||
|
|
@ -497,6 +496,7 @@ MODULE moduleInput
|
|||
USE moduleList
|
||||
USE moduleCollisions
|
||||
USE moduleErrors
|
||||
USE moduleMesh
|
||||
USE OMP_LIB
|
||||
USE json_module
|
||||
IMPLICIT NONE
|
||||
|
|
@ -515,74 +515,98 @@ MODULE moduleInput
|
|||
REAL(8):: energyThreshold, energyBinding
|
||||
CHARACTER(:), ALLOCATABLE:: electron
|
||||
|
||||
CALL initInteractionMatrix(interactionMatrix)
|
||||
!Firstly, checks if the object 'interactions' exists
|
||||
CALL config%info('interactions', found)
|
||||
IF (found) THEN
|
||||
!Checks if MC collisions have been defined
|
||||
CALL config%info('interactions.collisions', found)
|
||||
IF (found) THEN
|
||||
!Checks if a mesh for collisions has been defined
|
||||
!The mesh will be initialized and reader in readGeometry
|
||||
CALL config%info('interactions.meshCollisions', found)
|
||||
IF (found) THEN
|
||||
!Points meshForMCC to the specific mesh defined
|
||||
meshForMCC => meshColl
|
||||
|
||||
!Path for collision cross-section data files
|
||||
CALL config%get('interactions.folderCollisions', pathCollisions, found)
|
||||
ELSE
|
||||
!Points the meshForMCC pointer to the Particles Mesh
|
||||
meshForMCC => mesh
|
||||
|
||||
!Inits lock for list of particles
|
||||
CALL OMP_INIT_LOCK(lockCollisions)
|
||||
END IF
|
||||
|
||||
CALL config%info('interactions.collisions', found, n_children = nInteractions)
|
||||
DO i = 1, nInteractions
|
||||
WRITE(iString, '(I2)') i
|
||||
object = 'interactions.collisions(' // TRIM(iString) // ')'
|
||||
CALL config%get(object // '.species_i', species_i, found)
|
||||
pt_i = speciesName2Index(species_i)
|
||||
CALL config%get(object // '.species_j', species_j, found)
|
||||
pt_j = speciesName2Index(species_j)
|
||||
CALL config%info(object // '.cTypes', found, n_children = nCollisions)
|
||||
ij = interactionIndex(pt_i,pt_j)
|
||||
!Allocates the required number of collisions per each pair of species ij
|
||||
CALL interactionMatrix(ij)%init(nCollisions)
|
||||
!Inits the MCC matrix
|
||||
CALL initInteractionMatrix(interactionMatrix)
|
||||
|
||||
DO k = 1, nCollisions
|
||||
WRITE (kString, '(I2)') k
|
||||
object = 'interactions.collisions(' // TRIM(iString) // ').cTypes(' // TRIM(kString) // ')'
|
||||
!Reads the cross section file
|
||||
CALL config%get(object // '.crossSection', crossSecFile, found)
|
||||
crossSecFilePath = pathCollisions // crossSecFile
|
||||
IF (.NOT. found) CALL criticalError('crossSection not found for ' // object, 'readInteractions')
|
||||
!Reads the type of collision
|
||||
CALL config%get(object // '.type', cType, found)
|
||||
!Initialize collision type and reads required additional data
|
||||
SELECT CASE(cType)
|
||||
CASE ('elastic')
|
||||
!Elastic collision
|
||||
CALL initBinaryElastic(interactionMatrix(ij)%collisions(k)%obj, &
|
||||
crossSecFilePath, species(pt_i)%obj%m, species(pt_j)%obj%m)
|
||||
!Path for collision cross-section data files
|
||||
CALL config%get('interactions.folderCollisions', pathCollisions, found)
|
||||
|
||||
CASE ('chargeExchange')
|
||||
!Resonant charge exchange
|
||||
CALL initBinaryChargeExchange(interactionMatrix(ij)%collisions(k)%obj, &
|
||||
crossSecFilePath, species(pt_i)%obj%m, species(pt_j)%obj%m)
|
||||
!Inits lock for list of particles
|
||||
CALL OMP_INIT_LOCK(lockCollisions)
|
||||
|
||||
CASE ('ionization')
|
||||
!Electorn impact ionization
|
||||
CALL config%get(object // '.energyThreshold', energyThreshold, found)
|
||||
IF (.NOT. found) CALL criticalError('energyThreshold not found for collision' // object, 'readInteractions')
|
||||
CALL config%get(object // '.electron', electron, found)
|
||||
IF (.NOT. found) CALL criticalError('electron not found for collision' // object, 'readInteractions')
|
||||
CALL initBinaryIonization(interactionMatrix(ij)%collisions(k)%obj, &
|
||||
crossSecFilePath, energyThreshold, species(pt_i)%obj%m, species(pt_j)%obj%m, electron)
|
||||
CALL config%info('interactions.collisions', found, n_children = nInteractions)
|
||||
DO i = 1, nInteractions
|
||||
WRITE(iString, '(I2)') i
|
||||
object = 'interactions.collisions(' // TRIM(iString) // ')'
|
||||
CALL config%get(object // '.species_i', species_i, found)
|
||||
pt_i = speciesName2Index(species_i)
|
||||
CALL config%get(object // '.species_j', species_j, found)
|
||||
pt_j = speciesName2Index(species_j)
|
||||
CALL config%info(object // '.cTypes', found, n_children = nCollisions)
|
||||
ij = interactionIndex(pt_i,pt_j)
|
||||
!Allocates the required number of collisions per each pair of species ij
|
||||
CALL interactionMatrix(ij)%init(nCollisions)
|
||||
|
||||
CASE ('recombination')
|
||||
!Electorn impact ionization
|
||||
CALL config%get(object // '.energyBinding', energyBinding, found)
|
||||
IF (.NOT. found) CALL criticalError('energyThreshold not found for collision' // object, 'readInteractions')
|
||||
CALL config%get(object // '.electron', electron, found)
|
||||
IF (.NOT. found) CALL criticalError('electron not found for collision' // object, 'readInteractions')
|
||||
CALL initBinaryRecombination(interactionMatrix(ij)%collisions(k)%obj, &
|
||||
crossSecFilePath, energyBinding, species(pt_i)%obj%m, species(pt_j)%obj%m, electron)
|
||||
DO k = 1, nCollisions
|
||||
WRITE (kString, '(I2)') k
|
||||
object = 'interactions.collisions(' // TRIM(iString) // ').cTypes(' // TRIM(kString) // ')'
|
||||
!Reads the cross section file
|
||||
CALL config%get(object // '.crossSection', crossSecFile, found)
|
||||
crossSecFilePath = pathCollisions // crossSecFile
|
||||
IF (.NOT. found) CALL criticalError('crossSection not found for ' // object, 'readInteractions')
|
||||
!Reads the type of collision
|
||||
CALL config%get(object // '.type', cType, found)
|
||||
!Initialize collision type and reads required additional data
|
||||
SELECT CASE(cType)
|
||||
CASE ('elastic')
|
||||
!Elastic collision
|
||||
CALL initBinaryElastic(interactionMatrix(ij)%collisions(k)%obj, &
|
||||
crossSecFilePath, species(pt_i)%obj%m, species(pt_j)%obj%m)
|
||||
|
||||
CASE DEFAULT
|
||||
CALL criticalError('Collision type' // cType // 'not defined yet', 'readInteractions')
|
||||
CASE ('chargeExchange')
|
||||
!Resonant charge exchange
|
||||
CALL initBinaryChargeExchange(interactionMatrix(ij)%collisions(k)%obj, &
|
||||
crossSecFilePath, species(pt_i)%obj%m, species(pt_j)%obj%m)
|
||||
|
||||
END SELECT
|
||||
CASE ('ionization')
|
||||
!Electorn impact ionization
|
||||
CALL config%get(object // '.energyThreshold', energyThreshold, found)
|
||||
IF (.NOT. found) CALL criticalError('energyThreshold not found for collision' // object, 'readInteractions')
|
||||
CALL config%get(object // '.electron', electron, found)
|
||||
IF (.NOT. found) CALL criticalError('electron not found for collision' // object, 'readInteractions')
|
||||
CALL initBinaryIonization(interactionMatrix(ij)%collisions(k)%obj, &
|
||||
crossSecFilePath, energyThreshold, species(pt_i)%obj%m, species(pt_j)%obj%m, electron)
|
||||
|
||||
END DO
|
||||
CASE ('recombination')
|
||||
!Electorn impact ionization
|
||||
CALL config%get(object // '.energyBinding', energyBinding, found)
|
||||
IF (.NOT. found) CALL criticalError('energyThreshold not found for collision' // object, 'readInteractions')
|
||||
CALL config%get(object // '.electron', electron, found)
|
||||
IF (.NOT. found) CALL criticalError('electron not found for collision' // object, 'readInteractions')
|
||||
CALL initBinaryRecombination(interactionMatrix(ij)%collisions(k)%obj, &
|
||||
crossSecFilePath, energyBinding, species(pt_i)%obj%m, species(pt_j)%obj%m, electron)
|
||||
|
||||
END DO
|
||||
CASE DEFAULT
|
||||
CALL criticalError('Collision type' // cType // 'not defined yet', 'readInteractions')
|
||||
|
||||
END SELECT
|
||||
|
||||
END DO
|
||||
|
||||
END DO
|
||||
|
||||
END IF
|
||||
|
||||
END IF
|
||||
|
||||
END SUBROUTINE readInteractions
|
||||
|
||||
|
|
@ -702,17 +726,23 @@ MODULE moduleInput
|
|||
|
||||
TYPE(json_file), INTENT(inout):: config
|
||||
LOGICAL:: found
|
||||
LOGICAL:: doubleMesh
|
||||
CHARACTER(:), ALLOCATABLE:: meshFormat, meshFile
|
||||
CHARACTER(:), ALLOCATABLE:: fullPath
|
||||
|
||||
!Firstly, indicates if a specific mesh for MC collisions is being use
|
||||
doubleMesh = ASSOCIATED(meshForMCC, meshColl)
|
||||
|
||||
!Selects the type of geometry.
|
||||
CALL config%get('geometry.type', mesh%geometry, found)
|
||||
IF (doubleMesh) meshColl%geometry = mesh%geometry
|
||||
|
||||
!Gets the type of mesh
|
||||
CALL config%get('geometry.meshType', meshFormat, found)
|
||||
SELECT CASE(meshFormat)
|
||||
CASE ("gmsh2")
|
||||
CALL initGmsh2(mesh)
|
||||
IF (doubleMesh) CALL initGmsh2(meshColl)
|
||||
|
||||
CASE DEFAULT
|
||||
CALL criticalError("Mesh format " // meshFormat // " not recogniced", "readGeometry")
|
||||
|
|
@ -723,6 +753,14 @@ MODULE moduleInput
|
|||
CALL config%get('geometry.meshFile', meshFile, found)
|
||||
fullpath = path // meshFile
|
||||
CALL mesh%readMesh(fullPath)
|
||||
DEALLOCATE(fullPath, meshFile)
|
||||
IF (doubleMesh) THEN
|
||||
!Reads the mesh file for collisions
|
||||
CALL config%get('interactions.meshCollisions', meshFile, found)
|
||||
fullpath = path // meshFile
|
||||
CALL meshColl%readMesh(fullPath)
|
||||
|
||||
END IF
|
||||
|
||||
!Creates the connectivity between elements
|
||||
SELECT CASE(mesh%geometry)
|
||||
|
|
@ -744,9 +782,24 @@ MODULE moduleInput
|
|||
END SELECT
|
||||
CALL mesh%connectMesh
|
||||
|
||||
!Builds the K matrix
|
||||
IF (doubleMesh) THEN
|
||||
meshColl%connectMesh => mesh%connectMesh
|
||||
CALL meshColl%connectMesh
|
||||
|
||||
END IF
|
||||
|
||||
!Builds the K matrix for the Particles mesh
|
||||
CALL mesh%constructGlobalK()
|
||||
|
||||
!Assign the procedure to find a volume for meshColl
|
||||
IF (doubleMesh) THEN
|
||||
findCellColl => findCellCollMesh
|
||||
|
||||
ELSE
|
||||
findCellColl => findCellSameMesh
|
||||
|
||||
END IF
|
||||
|
||||
END SUBROUTINE readGeometry
|
||||
|
||||
SUBROUTINE readEMBoundary(config)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue