Method to divide collisions from a collisional iteration into multiple
pushing iterations.
This commit is contained in:
parent
a45df9de22
commit
4ba08e74af
7 changed files with 110 additions and 64 deletions
|
|
@ -352,7 +352,7 @@ MODULE moduleMesh1DRad
|
|||
|
||||
!Computes local stiffness matrix
|
||||
PURE FUNCTION elemKRad(self) RESULT(ke)
|
||||
USE moduleConstParam, ONLY: PI
|
||||
USE moduleConstParam, ONLY: PI2
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol1DRadSegm), INTENT(in):: self
|
||||
|
|
@ -371,12 +371,12 @@ MODULE moduleMesh1DRad
|
|||
ke(1,:) = (/ dPsi(1,1)*dPsi(1,1), dPsi(1,1)*dPsi(1,2) /)
|
||||
ke(2,:) = (/ dPsi(1,2)*dPsi(1,1), dPsi(1,2)*dPsi(1,2) /)
|
||||
ke = 2.D0*ke*invJ
|
||||
ke = ke*r*2.D0*PI
|
||||
ke = ke*r*PI2
|
||||
|
||||
END FUNCTION elemKRad
|
||||
|
||||
PURE FUNCTION elemFRad(self, source) RESULT(localF)
|
||||
USE moduleConstParam, ONLY: PI
|
||||
USE moduleConstParam, ONLY: PI2
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol1DRadSegm), INTENT(in):: self
|
||||
|
|
@ -393,7 +393,7 @@ MODULE moduleMesh1DRad
|
|||
r = DOT_PRODUCT(fPsi,self%r)
|
||||
ALLOCATE(localF(1:2))
|
||||
localF = 2.D0*DOT_PRODUCT(fPsi, source)*detJ
|
||||
localF = localF*r*2.D0*PI
|
||||
localF = localF*r*PI2
|
||||
|
||||
END FUNCTION elemFRad
|
||||
|
||||
|
|
|
|||
|
|
@ -369,7 +369,7 @@ MODULE moduleMeshCyl
|
|||
|
||||
!Computes element area
|
||||
PURE SUBROUTINE areaQuad(self)
|
||||
USE moduleConstParam
|
||||
USE moduleConstParam, ONLY: PI8
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylQuad), INTENT(inout):: self
|
||||
|
|
@ -381,7 +381,7 @@ MODULE moduleMeshCyl
|
|||
self%arNodes = 0.D0
|
||||
!2D 1 point Gauss Quad Integral
|
||||
xi = 0.D0
|
||||
detJ = self%detJac(xi)*8.D0*PI !4*2*pi
|
||||
detJ = self%detJac(xi)*PI8 !4*2*pi
|
||||
fPsi = self%fPsi(xi)
|
||||
r = DOT_PRODUCT(fPsi,self%r)
|
||||
self%volume = r*detJ
|
||||
|
|
@ -466,7 +466,7 @@ MODULE moduleMeshCyl
|
|||
|
||||
!Computes element local stiffness matrix
|
||||
PURE FUNCTION elemKQuad(self) RESULT(ke)
|
||||
USE moduleConstParam, ONLY: PI
|
||||
USE moduleConstParam, ONLY: PI2
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylQuad), INTENT(in):: self
|
||||
|
|
@ -493,13 +493,13 @@ MODULE moduleMeshCyl
|
|||
|
||||
END DO
|
||||
END DO
|
||||
ke = ke*2.D0*PI
|
||||
ke = ke*PI2
|
||||
|
||||
END FUNCTION elemKQuad
|
||||
|
||||
!Computes the local source vector for a force f
|
||||
PURE FUNCTION elemFQuad(self, source) RESULT(localF)
|
||||
USE moduleConstParam
|
||||
USE moduleConstParam, ONLY: PI2
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylQuad), INTENT(in):: self
|
||||
|
|
@ -525,7 +525,7 @@ MODULE moduleMeshCyl
|
|||
|
||||
END DO
|
||||
END DO
|
||||
localF = localF*2.D0*PI
|
||||
localF = localF*PI2
|
||||
|
||||
END FUNCTION elemFQuad
|
||||
|
||||
|
|
@ -760,7 +760,7 @@ MODULE moduleMeshCyl
|
|||
|
||||
!Calculates area for triangular element
|
||||
PURE SUBROUTINE areaTria(self)
|
||||
USE moduleConstParam
|
||||
USE moduleConstParam, ONLY: PI
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylTria), INTENT(inout):: self
|
||||
|
|
@ -851,7 +851,7 @@ MODULE moduleMeshCyl
|
|||
|
||||
!Computes element local stiffness matrix
|
||||
PURE FUNCTION elemKTria(self) RESULT(ke)
|
||||
USE moduleConstParam
|
||||
USE moduleConstParam, ONLY: PI2
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylTria), INTENT(in):: self
|
||||
|
|
@ -875,13 +875,13 @@ MODULE moduleMeshCyl
|
|||
ke = ke + MATMUL(TRANSPOSE(MATMUL(invJ,dPsi)),MATMUL(invJ,dPsi))*r*wTria(l)/detJ
|
||||
|
||||
END DO
|
||||
ke = ke*2.D0*PI
|
||||
ke = ke*PI2
|
||||
|
||||
END FUNCTION elemKTria
|
||||
|
||||
!Computes element local source vector
|
||||
PURE FUNCTION elemFTria(self, source) RESULT(localF)
|
||||
USE moduleConstParam
|
||||
USE moduleConstParam, ONLY: PI2
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylTria), INTENT(in):: self
|
||||
|
|
@ -906,7 +906,7 @@ MODULE moduleMeshCyl
|
|||
localF = localF + r*f*fPsi*wTria(l)*detJ
|
||||
|
||||
END DO
|
||||
localF = localF*2.D0*PI
|
||||
localF = localF*PI2
|
||||
|
||||
END FUNCTION elemFTria
|
||||
|
||||
|
|
|
|||
|
|
@ -379,7 +379,7 @@ MODULE moduleMesh
|
|||
END SUBROUTINE findCell
|
||||
|
||||
!Computes collisions in element
|
||||
SUBROUTINE collision(self)
|
||||
SUBROUTINE collision(self, t)
|
||||
USE moduleCollisions
|
||||
USE moduleSpecies
|
||||
USE moduleList
|
||||
|
|
@ -388,8 +388,12 @@ MODULE moduleMesh
|
|||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol), INTENT(inout):: self
|
||||
INTEGER, INTENT(in):: t
|
||||
INTEGER:: modCollisions !Remain of current iteration and everyCollisions
|
||||
INTEGER:: iterToCollisions !Number of iterations from current to next collision
|
||||
INTEGER:: nPart !Number of particles inside the cell
|
||||
REAL(8):: pMax !Maximum probability of collision
|
||||
INTEGER:: nCollIter !Number of collisions to be computed in this iteration
|
||||
INTEGER:: rnd !random index
|
||||
TYPE(particle), POINTER:: part_i, part_j
|
||||
INTEGER:: n !collision
|
||||
|
|
@ -397,19 +401,36 @@ MODULE moduleMesh
|
|||
REAL(8):: sigmaVrelMaxNew
|
||||
TYPE(pointerArray), ALLOCATABLE:: partTemp(:)
|
||||
|
||||
self%nColl = 0
|
||||
modCollisions = MOD(t, everyCollisions)
|
||||
iterToCollisions = everyCollisions - modCollisions
|
||||
|
||||
nPart = self%listPart_in%amount
|
||||
IF (nPart > 1) THEN
|
||||
pMax = self%totalWeight*self%sigmaVrelMax*tauCollisions/self%volume
|
||||
self%nColl = INT(REAL(nPart)*pMax*0.5D0)
|
||||
|
||||
!Converts the list of particles to an array for easy access
|
||||
IF (self%nColl > 0) THEN
|
||||
partTemp = self%listPart_in%convert2Array()
|
||||
IF (modCollisions == 0) THEN
|
||||
!Collisional iteration, computes the number of iterations
|
||||
pMax = self%totalWeight*self%sigmaVrelMax*tauCollisions/self%volume
|
||||
self%nColl = INT(REAL(nPart)*pMax*0.5D0)
|
||||
|
||||
END IF
|
||||
|
||||
DO n = 1, self%nColl
|
||||
IF (self%nColl > iterToCollisions) THEN
|
||||
nCollIter = self%nColl / iterToCollisions
|
||||
|
||||
ELSE
|
||||
nCollIter = self%nColl
|
||||
|
||||
END IF
|
||||
|
||||
IF (nCollIter > 0) THEN
|
||||
!Converts the list of particles to an array for easy access
|
||||
partTemp = self%listPart_in%convert2Array()
|
||||
|
||||
!Removes collisions from this iteration form the total in the cell
|
||||
self%nColl = self%nColl - nCollIter
|
||||
|
||||
END IF
|
||||
|
||||
DO n = 1, nCollIter
|
||||
!Select random numbers
|
||||
rnd = random(1, nPart)
|
||||
part_i => partTemp(rnd)%part
|
||||
|
|
@ -429,11 +450,8 @@ MODULE moduleMesh
|
|||
END IF
|
||||
|
||||
END DO
|
||||
|
||||
END IF
|
||||
|
||||
self%totalWeight = 0.D0
|
||||
|
||||
END SUBROUTINE collision
|
||||
|
||||
SUBROUTINE printOutputGmsh(self, t)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue