Merge branch 'feature/collisionTimeStep' into 'development'

Adding a time step for collisions

See merge request JorgeGonz/fpakc!22
This commit is contained in:
Jorge Gonzalez 2021-06-15 08:49:19 +00:00
commit 2d3b163700
9 changed files with 88 additions and 53 deletions

Binary file not shown.

View file

@ -29,8 +29,7 @@
\makeglossaries \makeglossaries
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newacronym{fpakc}{fpakc}{Finite element PArticle Code}
\newacronym{fpakc}{fpakc}{Finite Element PArticle Code}
\newacronym{mpi}{MPI}{Message Passing Interface} \newacronym{mpi}{MPI}{Message Passing Interface}
\newacronym{gpu}{GPU}{Graphics Processing Unit} \newacronym{gpu}{GPU}{Graphics Processing Unit}
\newacronym{cpu}{CPU}{Central Processing Unit} \newacronym{cpu}{CPU}{Central Processing Unit}
@ -308,14 +307,13 @@ make
\end{lstlisting} \end{lstlisting}
to compile the code. to compile the code.
If everything is correct, an executable named \textit{fpakc} will be generated. If everything is correct, an executable named \textit{fpakc} will be generated.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Running the code} \section{Running the code}
To run a case, simply execute: To run a case, simply execute:
\begin{lstlisting} \begin{lstlisting}
./fpakc path/to/input-file.json ./fpakc path/to/input-file.json
\end{lstlisting} \end{lstlisting}
in a command line from the root \acrshort{fpakc} folder. in a command line from the root \acrshort{fpakc} folder.
Substitute \lstinline|path/to/input-file.json| with the path to the input file of the case you want to run. Substitute \lstinline|path/to/input-file.json| with the path to the input file of the case you want to run.
The examples in the run directory are presented in Chapter \ref{ch:exampleRuns}. The examples in the run directory are presented in Chapter \ref{ch:exampleRuns}.
@ -659,6 +657,10 @@ make
The file needs to be located in the folder \textbf{output.folder}. The file needs to be located in the folder \textbf{output.folder}.
If this value is not present, the mesh defined in \textbf{geometry.meshFile} is used for \acrshort{mcc}. If this value is not present, the mesh defined in \textbf{geometry.meshFile} is used for \acrshort{mcc}.
The format of this mesh needs to be the same as the one defined in \textbf{geometry.meshType}. The format of this mesh needs to be the same as the one defined in \textbf{geometry.meshType}.
\item \textbf{timeStep}: Real.
Units of $\unit{s}$.
Time step to calculate MCC.
If no time is provided, the minimum time step is used.
\item \textbf{collisions}: Object. \item \textbf{collisions}: Object.
Array. Array.
Contains the different short range interactions (\acrshort{mcc}). Contains the different short range interactions (\acrshort{mcc}).

View file

@ -70,7 +70,7 @@ PROGRAM fpakc
tColl = omp_get_wtime() tColl = omp_get_wtime()
!$OMP END SINGLE !$OMP END SINGLE
IF (ASSOCIATED(meshForMCC)) CALL meshForMCC%doCollisions() IF (ASSOCIATED(meshForMCC)) CALL meshForMCC%doCollisions(t)
!$OMP SINGLE !$OMP SINGLE
tColl = omp_get_wtime() - tColl tColl = omp_get_wtime() - tColl

View file

@ -42,7 +42,7 @@ MODULE moduleMeshOutput0D
USE moduleOutput USE moduleOutput
IMPLICIT NONE IMPLICIT NONE
CLASS(meshGeneric), INTENT(in):: self CLASS(meshGeneric), INTENT(inout):: self
INTEGER, INTENT(in):: t INTEGER, INTENT(in):: t
CHARACTER(:), ALLOCATABLE:: fileName CHARACTER(:), ALLOCATABLE:: fileName
@ -56,7 +56,7 @@ MODULE moduleMeshOutput0D
END IF END IF
OPEN(20, file = path // folder // '/' // fileName, position = 'append', action = 'write') OPEN(20, file = path // folder // '/' // fileName, position = 'append', action = 'write')
WRITE(20, "(ES20.6E3, I20)") REAL(t)*tauMin*ti_ref, mesh%vols(1)%obj%nColl WRITE(20, "(ES20.6E3, I20)") REAL(t)*tauMin*ti_ref, self%vols(1)%obj%nColl
CLOSE(20) CLOSE(20)
END SUBROUTINE printColl0D END SUBROUTINE printColl0D

View file

@ -95,7 +95,7 @@ MODULE moduleMeshOutputGmsh2
USE moduleOutput USE moduleOutput
IMPLICIT NONE IMPLICIT NONE
CLASS(meshGeneric), INTENT(in):: self CLASS(meshGeneric), INTENT(inout):: self
INTEGER, INTENT(in):: t INTEGER, INTENT(in):: t
INTEGER:: numEdges INTEGER:: numEdges
INTEGER:: n INTEGER:: n

View file

@ -310,7 +310,7 @@ MODULE moduleMesh
SUBROUTINE printColl_interface(self, t) SUBROUTINE printColl_interface(self, t)
IMPORT meshGeneric IMPORT meshGeneric
CLASS(meshGeneric), INTENT(in):: self CLASS(meshGeneric), INTENT(inout):: self
INTEGER, INTENT(in):: t INTEGER, INTENT(in):: t
END SUBROUTINE printColl_interface END SUBROUTINE printColl_interface
@ -637,7 +637,7 @@ MODULE moduleMesh
END FUNCTION findCellBrute END FUNCTION findCellBrute
!Computes collisions in element !Computes collisions in element
SUBROUTINE doCollisions(self) SUBROUTINE doCollisions(self, t)
USE moduleCollisions USE moduleCollisions
USE moduleSpecies USE moduleSpecies
USE moduleList USE moduleList
@ -646,6 +646,7 @@ MODULE moduleMesh
IMPLICIT NONE IMPLICIT NONE
CLASS(meshGeneric), INTENT(inout), TARGET:: self CLASS(meshGeneric), INTENT(inout), TARGET:: self
INTEGER, INTENT(in):: t
INTEGER:: e INTEGER:: e
CLASS(meshVol), POINTER:: vol CLASS(meshVol), POINTER:: vol
INTEGER:: nPart !Number of particles inside the cell INTEGER:: nPart !Number of particles inside the cell
@ -657,49 +658,57 @@ MODULE moduleMesh
REAL(8):: sigmaVrelMaxNew REAL(8):: sigmaVrelMaxNew
TYPE(pointerArray), ALLOCATABLE:: partTemp(:) TYPE(pointerArray), ALLOCATABLE:: partTemp(:)
!$OMP DO SCHEDULE(DYNAMIC) IF (MOD(t, everyColl) == 0) THEN
DO e=1, self%numVols !Collisions need to be performed in this iteration
vol => self%vols(e)%obj !$OMP DO SCHEDULE(DYNAMIC)
nPart = vol%listPart_in%amount DO e=1, self%numVols
!Calculates number of collisions if there is more than one particle in the cell vol => self%vols(e)%obj
IF (nPart > 1) THEN nPart = vol%listPart_in%amount
!Probability of collision
pMax = vol%totalWeight*vol%sigmaVrelMax*tauMin/vol%volume
!Number of collisions in the cell !Resets the number of collisions
vol%nColl = NINT(REAL(nPart)*pMax*0.5D0) vol%nColl = 0
IF (vol%nColl > 0) THEN !Calculates number of collisions if there is more than one particle in the cell
!Converts the list of particles to an array for easy access IF (nPart > 1) THEN
partTemp = vol%listPart_in%convert2Array() !Probability of collision
pMax = vol%totalWeight*vol%sigmaVrelMax*tauColl/vol%volume
END IF !Number of collisions in the cell
vol%nColl = NINT(REAL(nPart)*pMax*0.5D0)
DO n = 1, vol%nColl IF (vol%nColl > 0) THEN
!Select random numbers !Converts the list of particles to an array for easy access
rnd = random(1, nPart) partTemp = vol%listPart_in%convert2Array()
part_i => partTemp(rnd)%part
rnd = random(1, nPart)
part_j => partTemp(rnd)%part
ij = interactionIndex(part_i%species%n, part_j%species%n)
sigmaVrelMaxNew = 0.D0
DO k = 1, interactionMatrix(ij)%amount
CALL interactionMatrix(ij)%collisions(k)%obj%collide(vol%sigmaVrelMax, sigmaVrelMaxNew, part_i, part_j)
END DO
!Update maximum cross section*v_rel per each collision
IF (sigmaVrelMaxNew > vol%sigmaVrelMax) THEN
vol%sigmaVrelMax = sigmaVrelMaxNew
END IF END IF
END DO DO n = 1, vol%nColl
!Select random numbers
rnd = random(1, nPart)
part_i => partTemp(rnd)%part
rnd = random(1, nPart)
part_j => partTemp(rnd)%part
ij = interactionIndex(part_i%species%n, part_j%species%n)
sigmaVrelMaxNew = 0.D0
DO k = 1, interactionMatrix(ij)%amount
CALL interactionMatrix(ij)%collisions(k)%obj%collide(vol%sigmaVrelMax, sigmaVrelMaxNew, part_i, part_j)
END IF END DO
END DO !Update maximum cross section*v_rel per each collision
!$OMP END DO IF (sigmaVrelMaxNew > vol%sigmaVrelMax) THEN
vol%sigmaVrelMax = sigmaVrelMaxNew
END IF
END DO
END IF
END DO
!$OMP END DO
END IF
END SUBROUTINE doCollisions END SUBROUTINE doCollisions

View file

@ -4,6 +4,7 @@ MODULE moduleCaseParam
INTEGER:: tFinal, tInitial = 0 INTEGER:: tFinal, tInitial = 0
REAL(8), ALLOCATABLE:: tau(:) REAL(8), ALLOCATABLE:: tau(:)
REAL(8):: tauMin REAL(8):: tauMin
REAL(8):: tauColl
END MODULE moduleCaseParam END MODULE moduleCaseParam

View file

@ -2,6 +2,9 @@ MODULE moduleCollisions
USE moduleSpecies USE moduleSpecies
USE moduleTable USE moduleTable
!Integer for when collisions are computed
INTEGER:: everyColl
!Abstract type for collision between two particles !Abstract type for collision between two particles
TYPE, ABSTRACT:: collisionBinary TYPE, ABSTRACT:: collisionBinary
REAL(8):: rMass !Reduced mass REAL(8):: rMass !Reduced mass

View file

@ -40,6 +40,11 @@ MODULE moduleInput
CALL readSpecies(config) CALL readSpecies(config)
CALL checkStatus(config, "readSpecies") CALL checkStatus(config, "readSpecies")
!Reads case parameters
CALL verboseError('Reading Case parameters...')
CALL readCase(config)
CALL checkStatus(config, "readCase")
!Read interactions between species !Read interactions between species
CALL verboseError('Reading interaction between species...') CALL verboseError('Reading interaction between species...')
CALL readInteractions(config) CALL readInteractions(config)
@ -55,10 +60,10 @@ MODULE moduleInput
CALL readGeometry(config) CALL readGeometry(config)
CALL checkStatus(config, "readGeometry") CALL checkStatus(config, "readGeometry")
!Reads case parameters !Read initial state for species
CALL verboseError('Reading Case parameters...') CALL verboseError('Reading Initial state...')
CALL readCase(config) CALL readInitial(config)
CALL checkStatus(config, "readCase") CALL checkStatus(config, "readInitial")
!Read injection of particles !Read injection of particles
CALL verboseError('Reading injection of particles from boundaries...') CALL verboseError('Reading injection of particles from boundaries...')
@ -233,11 +238,6 @@ MODULE moduleInput
WRITE(tString, '(I1)') iterationDigits WRITE(tString, '(I1)') iterationDigits
iterationFormat = "(I" // tString // "." // tString // ")" iterationFormat = "(I" // tString // "." // tString // ")"
!Read initial state for species
CALL verboseError('Reading Initial state...')
CALL readInitial(config)
CALL checkStatus(config, "readInitial")
END SUBROUTINE readCase END SUBROUTINE readCase
!Reads the initial information for the species !Reads the initial information for the species
@ -558,6 +558,8 @@ MODULE moduleInput
USE moduleCollisions USE moduleCollisions
USE moduleErrors USE moduleErrors
USE moduleMesh USE moduleMesh
USE moduleCaseParam
USE moduleRefParam
USE OMP_LIB USE OMP_LIB
USE json_module USE json_module
IMPLICIT NONE IMPLICIT NONE
@ -595,6 +597,24 @@ MODULE moduleInput
END IF END IF
!Reads collision time step
CALL config%info('interactions.timeStep', found)
IF (found) THEN
CALL config%get('interactions.timeStep', tauColl, found)
tauColl = tauColl / ti_ref
ELSE
tauColl = tauMin
END IF
IF (tauColl < tauMin) THEN
CALL criticalError('Collisional time step below minimum time step.', 'readInteractions')
END IF
everyColl = NINT(tauColl / tauMin)
!Inits the MCC matrix !Inits the MCC matrix
CALL initInteractionMatrix(interactionMatrix) CALL initInteractionMatrix(interactionMatrix)