Implementation of the 0D grid to test collisional processes. An OMP_LOCK was added to the nodes to properly write perform the scattering (it is weird that multiple threads work in the same node at the same time, but in 0D happens everytime). Added a new case to test the 0D geometry. User Manual updated with the new options.
120 lines
3.6 KiB
Fortran
120 lines
3.6 KiB
Fortran
!Contains information about output
|
|
MODULE moduleOutput
|
|
IMPLICIT NONE
|
|
!Output for each node
|
|
TYPE outputNode
|
|
REAL(8):: den = 0.D0, mom(1:3) = 0.D0, tensorS(1:3,1:3) = 0.D0
|
|
|
|
END TYPE
|
|
|
|
!Type for EM data in node
|
|
TYPE emNode
|
|
CHARACTER(:), ALLOCATABLE:: type
|
|
REAL(8):: phi
|
|
|
|
END TYPE emNode
|
|
|
|
!Output in dimensional units to print
|
|
TYPE outputFormat
|
|
REAL(8):: density, velocity(1:3), pressure, temperature
|
|
|
|
END TYPE
|
|
|
|
CHARACTER(:), ALLOCATABLE:: path
|
|
CHARACTER(:), ALLOCATABLE:: folder
|
|
INTEGER:: iterationDigits
|
|
CHARACTER(:), ALLOCATABLE:: iterationFormat
|
|
INTEGER:: triggerOutput, counterOutput = 0
|
|
INTEGER:: triggerCPUTime, counterCPUTime = 0
|
|
LOGICAL:: timeOutput = .FALSE.
|
|
LOGICAL:: collOutput = .FALSE.
|
|
LOGICAL:: emOutput = .FALSE.
|
|
|
|
CONTAINS
|
|
FUNCTION tensorTrace(a) RESULT(t)
|
|
IMPLICIT NONE
|
|
|
|
REAL(8), DIMENSION(1:3,1:3):: a
|
|
REAL(8):: t
|
|
|
|
t = 0.D0
|
|
t = a(1,1)+a(2,2)+a(3,3)
|
|
|
|
END FUNCTION tensorTrace
|
|
|
|
SUBROUTINE calculateOutput(rawValues, formatValues, nodeVol, speciesIn)
|
|
USE moduleConstParam
|
|
USE moduleRefParam
|
|
USE moduleSpecies
|
|
USE moduleMath
|
|
IMPLICIT NONE
|
|
|
|
TYPE(outputNode), INTENT(in):: rawValues
|
|
TYPE(outputFormat), INTENT(out):: formatValues
|
|
REAL(8), INTENT(in):: nodeVol
|
|
CLASS(speciesGeneric), INTENT(in):: speciesIn
|
|
REAL(8), DIMENSION(1:3,1:3):: tensorTemp
|
|
REAL(8), DIMENSION(1:3):: tempVel
|
|
REAL(8):: tempVol
|
|
|
|
!Resets the node outputs
|
|
formatValues%density = 0.D0
|
|
formatValues%velocity = 0.D0
|
|
formatValues%pressure = 0.D0
|
|
formatValues%temperature = 0.D0
|
|
tempVol = 1.D0/(nodeVol*Vol_ref)
|
|
IF (rawValues%den > 0.D0) THEN
|
|
tempVel = rawValues%mom(:)/rawValues%den
|
|
tensorTemp = (rawValues%tensorS(:,:) - rawValues%den*outerProduct(tempVel,tempVel))
|
|
formatValues%density = rawValues%den*tempVol
|
|
formatValues%velocity(:) = tempVel
|
|
IF (tensorTrace(tensorTemp) > 0.D0) THEN
|
|
formatValues%pressure = speciesIn%m*tensorTrace(tensorTemp)*tempVol/3.D0
|
|
formatValues%temperature = formatValues%pressure/(formatValues%density*kb)
|
|
|
|
END IF
|
|
END IF
|
|
|
|
formatValues%velocity = formatValues%velocity*v_ref
|
|
formatValues%pressure = formatValues%pressure*m_ref*v_ref**2
|
|
formatValues%temperature = formatValues%temperature*m_ref*v_ref**2
|
|
|
|
END SUBROUTINE calculateOutput
|
|
|
|
SUBROUTINE printTime(t, first)
|
|
USE moduleSpecies
|
|
USE moduleCompTime
|
|
IMPLICIT NONE
|
|
|
|
INTEGER, INTENT(in):: t
|
|
LOGICAL, INTENT(in), OPTIONAL:: first
|
|
CHARACTER(:), ALLOCATABLE:: fileName
|
|
|
|
fileName = 'cpuTime.dat'
|
|
|
|
IF (timeOutput) THEN
|
|
IF (PRESENT(first)) THEN
|
|
IF (first) THEN
|
|
OPEN(20, file = path // folder // '/' // fileName, action = 'write')
|
|
WRITE(20, "(A1, 8X, A1, 9X, A1, 7(A20))") "#","t","n","total (s)","push (s)","reset (s)", &
|
|
"collision (s)","coulomb (s)", &
|
|
"weighting (s)","EMField (s)"
|
|
WRITE(*, "(6X,A15,A)") "Creating file: ", fileName
|
|
CLOSE(20)
|
|
|
|
END IF
|
|
|
|
END IF
|
|
|
|
OPEN(20, file = path // folder // '/' // fileName, position = 'append', action = 'write')
|
|
|
|
WRITE (20, "(I10, I10, 7(ES20.6E3))") t, nPartOld, tStep, tPush, tReset, tColl, tCoul, tWeight, tEMField
|
|
|
|
CLOSE(20)
|
|
|
|
END IF
|
|
|
|
END SUBROUTINE printTime
|
|
|
|
END MODULE moduleOutput
|
|
|