Final implementation of ionization process by electron impact.
Possibility to input initial species distributions (density, velocity
and temperature) via an input file for each species.
New moduleRandom includes function to generate random numbers in
different ways (still uses) the implicit RANDOM_NUMBER().
This commit is contained in:
parent
e50cc3325b
commit
9e0d1a7cc7
16 changed files with 363 additions and 86 deletions
|
|
@ -21,42 +21,67 @@ MODULE moduleInput
|
|||
!Loads the config file
|
||||
CALL verboseError('Loading input file...')
|
||||
CALL config%load(filename = inputFile)
|
||||
CALL checkStatus(config, "load")
|
||||
|
||||
!Reads reference parameters
|
||||
CALL verboseError('Reading Reference parameters...')
|
||||
CALL readReference(config)
|
||||
CALL checkStatus(config, "readReference")
|
||||
|
||||
!Reads output parameters
|
||||
CALL verboseError('Reading Output parameters...')
|
||||
CALL readOutput(config)
|
||||
CALL checkStatus(config, "readOutput")
|
||||
|
||||
!Read species
|
||||
CALL verboseError('Reading species information...')
|
||||
CALL readSpecies(config)
|
||||
CALL checkStatus(config, "readSpecies")
|
||||
|
||||
!Read interactions between species
|
||||
CALL verboseError('Reading interaction between species...')
|
||||
CALL readInteractions(config)
|
||||
CALL checkStatus(config, "readInteractions")
|
||||
|
||||
!Read boundaries
|
||||
CALL verboseError('Reading boundary conditions...')
|
||||
CALL readBoundary(config)
|
||||
CALL checkStatus(config, "readBoundary")
|
||||
|
||||
!Read Geometry
|
||||
CALL verboseError('Reading Geometry...')
|
||||
CALL readGeometry(config)
|
||||
CALL checkStatus(config, "readGeometry")
|
||||
|
||||
!Reads case parameters
|
||||
CALL verboseError('Reading Case Parameters...')
|
||||
CALL verboseError('Reading Case parameters...')
|
||||
CALL readCase(config)
|
||||
CALL checkStatus(config, "readCase")
|
||||
|
||||
!Read injection of particles
|
||||
CALL verboseError('Reading Interactions between species...')
|
||||
CALL readInject(config)
|
||||
CALL checkStatus(config, "readInject")
|
||||
|
||||
!Read parallel parameters
|
||||
CALL verboseError('Reading Parallel configuration...')
|
||||
CALL readParallel(config)
|
||||
CALL checkStatus(config, "readParallel")
|
||||
|
||||
END SUBROUTINE readConfig
|
||||
|
||||
!Checks the status of the JSON case file and, if failed, exits the execution.
|
||||
SUBROUTINE checkStatus(config, step)
|
||||
USE moduleErrors
|
||||
USE json_module
|
||||
IMPLICIT NONE
|
||||
|
||||
TYPE(json_file), INTENT(inout):: config
|
||||
CHARACTER(LEN=*), INTENT(in):: step
|
||||
|
||||
IF (config%failed()) CALL criticalError("Error reading the JSON input file", TRIM(step))
|
||||
|
||||
END SUBROUTINE checkStatus
|
||||
|
||||
!Reads the reference parameters
|
||||
SUBROUTINE readReference(config)
|
||||
|
|
@ -203,8 +228,127 @@ MODULE moduleInput
|
|||
WRITE(tString, '(I1)') iterationDigits
|
||||
iterationFormat = "(I" // tString // "." // tString // ")"
|
||||
|
||||
!Read initial state for species
|
||||
CALL verboseError('Reading Initial state...')
|
||||
CALL readInitial(config)
|
||||
CALL checkStatus(config, "readInitial")
|
||||
|
||||
END SUBROUTINE readCase
|
||||
|
||||
!Reads the initial information for the species
|
||||
SUBROUTINE readInitial(config)
|
||||
USE moduleSpecies
|
||||
USE moduleMesh
|
||||
USE moduleOutput
|
||||
USE moduleRefParam
|
||||
USE moduleRandom
|
||||
USE json_module
|
||||
IMPLICIT NONE
|
||||
|
||||
TYPE(json_file), INTENT(inout):: config
|
||||
LOGICAL:: found
|
||||
CHARACTER(:), ALLOCATABLE:: object
|
||||
INTEGER:: nInitial
|
||||
INTEGER:: i, p, e
|
||||
CHARACTER(LEN=2):: iString
|
||||
CHARACTER(:), ALLOCATABLE:: spName
|
||||
INTEGER:: sp
|
||||
CHARACTER(:), ALLOCATABLE:: spFile
|
||||
INTEGER:: stat
|
||||
CHARACTER(100):: dummy
|
||||
REAL(8):: density, velocity(1:3), temperature
|
||||
INTEGER:: nNewPart = 0.D0
|
||||
TYPE(particle), POINTER:: partNew
|
||||
REAL(8):: vTh
|
||||
TYPE(lNode), POINTER:: partCurr, partNext
|
||||
|
||||
CALL config%info('case.initial', found, n_children = nInitial)
|
||||
|
||||
IF (found) THEN
|
||||
!Reads the information from initial species
|
||||
DO i = 1, nInitial
|
||||
WRITE(iString, '(I2)') i
|
||||
object = 'case.initial(' // iString // ')'
|
||||
CALL config%get(object // '.speciesName', spName, found)
|
||||
sp = speciesName2Index(spName)
|
||||
CALL config%get(object // '.initialState', spFile, found)
|
||||
OPEN (10, FILE = path // spFile, ACTION = 'READ')
|
||||
DO
|
||||
READ(10, '(A)', IOSTAT = stat) dummy
|
||||
!If EoF, exit reading
|
||||
IF (stat /= 0) EXIT
|
||||
!If comment, skip
|
||||
IF (INDEX(dummy,'#') /= 0) CYCLE
|
||||
!Go up one line
|
||||
BACKSPACE(10)
|
||||
!Read information
|
||||
READ(10, *) e, density, velocity, temperature
|
||||
!Scale variables
|
||||
!Particles in cell volume
|
||||
nNewPart = INT(density * (mesh%vols(e)%obj%volume*Vol_ref) / species(sp)%obj%weight)
|
||||
!Non-dimensional velocity
|
||||
velocity = velocity / v_ref
|
||||
!Non-dimensional temperature
|
||||
temperature = temperature / T_ref
|
||||
!Non-dimensional thermal temperature
|
||||
vTh = DSQRT(temperature/species(sp)%obj%m)
|
||||
!Allocate new particles
|
||||
DO p = 1, nNewPart
|
||||
ALLOCATE(partNew)
|
||||
partNew%sp = sp
|
||||
partNew%v(1) = velocity(1) + vTh*randomMaxwellian()
|
||||
partNew%v(2) = velocity(2) + vTh*randomMaxwellian()
|
||||
partNew%v(3) = velocity(3) + vTh*randomMaxwellian()
|
||||
partNew%vol = e
|
||||
partNew%r = mesh%vols(e)%obj%randPos()
|
||||
partNew%xi = mesh%vols(e)%obj%phy2log(partNew%r)
|
||||
partNew%n_in = .TRUE.
|
||||
partNew%weight = species(sp)%obj%weight
|
||||
!If charged species, add qm to particle
|
||||
SELECT TYPE(sp => species(sp)%obj)
|
||||
TYPE IS (speciesCharged)
|
||||
partNew%qm = sp%qm
|
||||
|
||||
CLASS DEFAULT
|
||||
partNew%qm = 0.D0
|
||||
|
||||
END SELECT
|
||||
|
||||
!Assign particle to temporal list of particles
|
||||
CALL partInitial%add(partNew)
|
||||
|
||||
END DO
|
||||
|
||||
END DO
|
||||
|
||||
END DO
|
||||
|
||||
!Convert temporal list of particles into initial partOld array
|
||||
!Deallocates the list of initial particles
|
||||
nNewPart = partInitial%amount
|
||||
IF (nNewPart > 0) THEN
|
||||
ALLOCATE(partOld(1:nNewPart))
|
||||
partCurr => partInitial%head
|
||||
DO p = 1, nNewPart
|
||||
partNext => partCurr%next
|
||||
partOld(p) = partCurr%part
|
||||
DEALLOCATE(partCurr)
|
||||
partCurr => partNext
|
||||
|
||||
END DO
|
||||
|
||||
IF (ASSOCIATED(partInitial%head)) NULLIFY(partInitial%head)
|
||||
IF (ASSOCIATED(partInitial%tail)) NULLIFY(partInitial%tail)
|
||||
partInitial%amount = 0
|
||||
|
||||
END IF
|
||||
|
||||
nPartOld = SIZE(partOld)
|
||||
|
||||
END IF
|
||||
|
||||
END SUBROUTINE readInitial
|
||||
|
||||
!Reads configuration for the output files
|
||||
SUBROUTINE readOutput(config)
|
||||
USE moduleErrors
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue