Minor improvements in performance and code clarity.

Still no solution for the reset subroutine. It is really time
consumming.
This commit is contained in:
Jorge Gonzalez 2020-10-13 18:16:18 +02:00
commit ffb03e634b
12 changed files with 233 additions and 117 deletions

View file

@ -43,9 +43,9 @@ PROGRAM DSMC_Neutrals
!$OMP PARALLEL PRIVATE(t) DEFAULT(SHARED)
DO t = 1, tmax
tStep = omp_get_wtime()
!Insert new particles
!$OMP SINGLE
tStep = omp_get_wtime()
tPush = omp_get_wtime()
DO i=1, nInject
CALL inject(i)%addParticles()
@ -55,6 +55,7 @@ PROGRAM DSMC_Neutrals
!$OMP DO
DO n=1, n_part_old
CALL push(part_old(n))
CALL mesh%vols(part_old(n)%e_p)%obj%findCell(part_old(n))
END DO
!$OMP END DO
@ -62,10 +63,12 @@ PROGRAM DSMC_Neutrals
!$OMP SINGLE
tPush = omp_get_wtime() - tPush
tReset = omp_get_wtime()
!$OMP END SINGLE
!Reset particles
CALL resetParticles()
CALL resetParticles(part_inj, part_old)
!$OMP SINGLE
tReset = omp_get_wtime() - tReset
tColl = omp_get_wtime()
!$OMP END SINGLE
@ -73,7 +76,6 @@ PROGRAM DSMC_Neutrals
!Collisions
!$OMP DO
DO e=1, mesh%numVols
mesh%vols(e)%obj%nColl = 0 !Reset number of collisions
CALL mesh%vols(e)%obj%collision()
END DO
!$OMP END DO
@ -85,7 +87,7 @@ PROGRAM DSMC_Neutrals
tWeight = omp_get_wtime()
!$OMP END SINGLE
CALL scatterGrid()
CALL scatterGrid(mesh, part_old)
!$OMP SINGLE
tWeight = omp_get_wtime() - tWeight

View file

@ -16,7 +16,7 @@ moduleInput.o: moduleParallel.o moduleRefParam.o moduleCaseParam.o moduleSolver.
moduleInject.o: moduleSpecies.o moduleSolver.o moduleMesh.o moduleMeshCyl.o moduleInject.f95
$(FC) $(FCFLAGS) -c $(subst .o,.f95, $@) -o $(OBJDIR)/$@
moduleList.o: moduleErrors.o moduleList.f95
moduleList.o: moduleSpecies.o moduleErrors.o moduleList.f95
$(FC) $(FCFLAGS) -c $(subst .o,.f95, $@) -o $(OBJDIR)/$@
moduleMesh.o: moduleOutput.o moduleList.o moduleSpecies.o moduleMesh.f95
@ -37,7 +37,7 @@ moduleOutput.o: moduleSpecies.o moduleRefParam.o moduleOutput.f95
moduleRefParam.o: moduleConstParam.o moduleRefParam.f95
$(FC) $(FCFLAGS) -c $(subst .o,.f95, $@) -o $(OBJDIR)/$@
moduleSpecies.o: moduleCaseParam.o moduleList.o moduleSpecies.f95
moduleSpecies.o: moduleCaseParam.o moduleSpecies.f95
$(FC) $(FCFLAGS) -c $(subst .o,.f95, $@) -o $(OBJDIR)/$@
moduleSolver.o: moduleSpecies.o moduleRefParam.o moduleMesh.o moduleOutput.o moduleSolver.f95

View file

@ -17,13 +17,13 @@ MODULE moduleCollisions
END SUBROUTINE
SUBROUTINE collideBinary_interface(self, sigmaVRelMax, sigmaVrel, part_i, part_j)
SUBROUTINE collideBinary_interface(self, sigmaVRelMax, sigmaVrelMaxNew, part_i, part_j)
USE moduleSpecies
IMPORT:: collisionBinary
CLASS(collisionBinary), INTENT(in):: self
REAL(8), INTENT(in):: sigmaVrelMax
REAL(8), INTENT(out):: sigmaVrel
REAL(8), INTENT(inout):: sigmaVrelMaxNew
TYPE(particle), INTENT(inout):: part_i, part_j
END SUBROUTINE
@ -115,7 +115,8 @@ MODULE moduleCollisions
END SUBROUTINE
SUBROUTINE collideBinaryElastic(self, sigmaVrelMax, sigmaVrel, part_i, part_j)
SUBROUTINE collideBinaryElastic(self, sigmaVrelMax, sigmaVrelMaxNew, &
part_i, part_j)
USE moduleConstParam
USE moduleSpecies
USE moduleTable
@ -123,8 +124,9 @@ MODULE moduleCollisions
CLASS(collisionBinaryElastic), INTENT(in):: self
REAL(8), INTENT(in):: sigmaVrelMax
REAL(8), INTENT(out):: sigmaVrel
REAL(8), INTENT(inout):: sigmaVrelMaxNew
TYPE(particle), INTENT(inout):: part_i, part_j
REAL(8):: sigmaVrel
REAL(8):: vRel !relative velocity
REAL(8):: vp_i, vp_j, v_i, v_j !post and pre-collision velocities
REAL(8):: alpha
@ -132,7 +134,8 @@ MODULE moduleCollisions
!v relative (in units of [m][L]^2[s]^-2
vRel = species(1)%obj%m*NORM2(part_i%v - part_j%v)**2
sigmaVrel = self%crossSec%get(vRel)*vRel
IF (sigmaVrel/sigmaVrelMax > RAND()) THEN
sigmaVrelMaxNew = sigmaVrelMaxNew + sigmaVrel
IF (sigmaVrelMaxNew/sigmaVrelMax > RAND()) THEN
!Applies the collision
v_i = NORM2(part_i%v)
v_j = NORM2(part_j%v)
@ -147,6 +150,7 @@ MODULE moduleCollisions
END IF
END SUBROUTINE
END MODULE moduleCollisions

View file

@ -178,6 +178,8 @@ MODULE moduleInject
!Push new particle
CALL push(part_inj(n))
!Assign cell to new particle
CALL mesh%vols(part_inj(n)%e_p)%obj%findCell(part_inj(n))
END DO

View file

@ -1,9 +1,11 @@
!Linked list of particles
MODULE moduleList
USE moduleSpecies
IMPLICIT NONE
TYPE lNode
INTEGER:: n = 0
TYPE(lNode), POINTER:: next => NULL()
TYPE(particle), POINTER:: part => NULL()
TYPE(lNode), POINTER:: next => NULL()
END TYPE lNode
TYPE listNode
@ -17,46 +19,48 @@ MODULE moduleList
END TYPE listNode
CONTAINS
!Finalize node
!Adds element to list
SUBROUTINE addToList(this,n)
INTEGER,INTENT(in):: n
CLASS(listNode):: this
SUBROUTINE addToList(this,part)
USE moduleSpecies
CLASS(listNode), INTENT(inout):: this
TYPE(particle),INTENT(in), TARGET:: part
TYPE(lNode),POINTER:: temp
ALLOCATE(temp)
temp%n = n
temp%part => part
NULLIFY(temp%next)
this%amount = this%amount + 1
IF (.NOT. ASSOCIATED(this%head)) THEN
!First element
this%head => temp
this%tail => temp
this%amount = 1
ELSE
!Append element
this%tail%next => temp
this%tail => temp
this%amount = this%amount + 1
END IF
END SUBROUTINE addToList
FUNCTION getFromList(self, iObj) RESULT(n)
FUNCTION getFromList(self, iObj) RESULT(partTemp)
use moduleErrors
IMPLICIT NONE
CLASS(listNode):: self
INTEGER:: iObj
INTEGER:: n
TYPE(particle), POINTER:: partTemp
INTEGER:: i
TYPE(lNode), POINTER:: tempNode
TYPE(lNode), POINTER:: nodeTemp
IF (iObj > self%amount) CALL criticalError('Accessing to element list outisde range','getFromList')
tempNode => self%head
nodeTemp => self%head
DO i = 1, iObj - 1
tempNode => tempNode%next
nodeTemp => nodeTemp%next
END DO
n = tempNode%n
partTemp => nodeTemp%part
END FUNCTION getFromList

View file

@ -93,10 +93,11 @@ MODULE moduleMesh
!Number of collisions per volume
INTEGER:: nColl = 0
CONTAINS
PROCEDURE(initVol_interface), DEFERRED, PASS:: init
PROCEDURE(scatter_interface), DEFERRED, PASS:: scatter
PROCEDURE(collision_interface), DEFERRED, PASS:: collision
PROCEDURE(findCell_interface), DEFERRED, PASS:: findCell
PROCEDURE(initVol_interface), DEFERRED, PASS:: init
PROCEDURE(scatter_interface), DEFERRED, PASS:: scatter
PROCEDURE(collision_interface), DEFERRED, PASS:: collision
PROCEDURE(findCell_interface), DEFERRED, PASS:: findCell
PROCEDURE(resetOutput_interface), DEFERRED, PASS:: resetOutput
END TYPE meshVol
@ -128,12 +129,18 @@ MODULE moduleMesh
USE moduleSpecies
IMPORT:: meshVol
CLASS(meshVol), INTENT(in):: self
CLASS(meshVol), INTENT(inout):: self
CLASS(meshVol), OPTIONAL, INTENT(in):: oldCell
CLASS(particle), INTENT(inout):: part
END SUBROUTINE findCell_interface
SUBROUTINE resetOutput_interface(self)
IMPORT:: meshVol
CLASS(meshVol), INTENT(inout):: self
END SUBROUTINE resetOutput_interface
END INTERFACE
!Containers for volumes in the mesh

View file

@ -62,17 +62,18 @@ MODULE moduleMeshCyl
REAL(8):: arNodes(1:4) = 0.D0
CONTAINS
PROCEDURE, PASS:: init => initVolQuadCyl
PROCEDURE, PASS:: locKe => localKeQuad
PROCEDURE, PASS:: detJac => detJQuad
PROCEDURE, PASS:: invJ => invJQuad
PROCEDURE, PASS:: area => areaQuad
PROCEDURE, NOPASS:: weight => weightQuad
PROCEDURE, NOPASS:: inside => insideQuad
PROCEDURE, PASS:: dVal => dValQuad
PROCEDURE, PASS:: scatter => scatterQuad
PROCEDURE, PASS:: phy2log => phy2logQuad
PROCEDURE, PASS:: findCell => findCellCylQuad
PROCEDURE, PASS:: init => initVolQuadCyl
PROCEDURE, PASS:: locKe => localKeQuad
PROCEDURE, PASS:: detJac => detJQuad
PROCEDURE, PASS:: invJ => invJQuad
PROCEDURE, PASS:: area => areaQuad
PROCEDURE, NOPASS:: weight => weightQuad
PROCEDURE, NOPASS:: inside => insideQuad
PROCEDURE, PASS:: dVal => dValQuad
PROCEDURE, PASS:: scatter => scatterQuad
PROCEDURE, PASS:: phy2log => phy2logQuad
PROCEDURE, PASS:: findCell => findCellCylQuad
PROCEDURE, PASS:: resetOutput => resetOutputQuad
END TYPE meshVolCylQuad
@ -430,7 +431,7 @@ MODULE moduleMeshCyl
USE moduleSpecies
IMPLICIT NONE
CLASS(meshVolCylQuad), INTENT(in):: self
CLASS(meshVolCylQuad), INTENT(inout):: self
CLASS(meshVol), OPTIONAL, INTENT(in):: oldCell
CLASS(particle), INTENT(inout):: part
REAL(8):: xLog(1:2)
@ -482,6 +483,36 @@ MODULE moduleMeshCyl
END SUBROUTINE findCellCylQuad
PURE SUBROUTINE resetOutputQuad(self)
USE moduleSpecies
USE moduleOutput
IMPLICIT NONE
CLASS(meshVolCylQuad), INTENT(inout):: self
INTEGER:: k
DO k = 1, nSpecies
self%n1%output(k)%den = 0.D0
self%n1%output(k)%mom = 0.D0
self%n1%output(k)%tensorS = 0.D0
self%n2%output(k)%den = 0.D0
self%n2%output(k)%mom = 0.D0
self%n2%output(k)%tensorS = 0.D0
self%n3%output(k)%den = 0.D0
self%n3%output(k)%mom = 0.D0
self%n3%output(k)%tensorS = 0.D0
self%n4%output(k)%den = 0.D0
self%n4%output(k)%mom = 0.D0
self%n4%output(k)%tensorS = 0.D0
END DO
END SUBROUTINE resetOutputQuad
SUBROUTINE collision2DCyl(self)
USE moduleRefParam
USE moduleConstParam
@ -492,45 +523,41 @@ MODULE moduleMeshCyl
CLASS(meshVolCyl), INTENT(inout):: self
INTEGER:: Npart !Number of particles inside the cell
INTEGER:: Ncoll !Maximum number of collisions
REAL(8):: Fn !Specific weight
REAL(8):: Pmax !Maximum probability of collision
INTEGER:: i,j !random particles index
INTEGER:: rnd !random index
TYPE(particle), POINTER:: part_i, part_j
INTEGER:: n !collision
INTEGER:: ij, k
REAL(8):: sigmaVrel
REAL(8):: sigmaVrelMaxNew
Fn = species(1)%obj%weight!Check how to do this for multiple species
Fn = species(1)%obj%weight!TODO: Check how to do this for multiple species
Npart = self%listPart_in%amount
Pmax = Fn*self%sigmaVrelMax*tau/self%volume
Ncoll = INT(REAL(Npart*(Npart-1))*Pmax*0.5D0)
self%nColl = Ncoll
self%nColl = INT(REAL(Npart*(Npart-1))*Pmax*0.5D0)
DO n = 1, NColl
DO n = 1, self%NColl
!Select random numbers
rnd = 1 + FLOOR(Npart*RAND())
i = self%listPart_in%get(rnd)
part_i => part_old(i)
part_i => self%listPart_in%get(rnd)
rnd = 1 + FLOOR(Npart*RAND())
j = self%listPart_in%get(rnd)
part_j => part_old(j)
part_j => self%listPart_in%get(rnd)
ij = interactionIndex(part_i%pt, part_j%pt)
sigmaVrelMaxNew = 0.D0
DO k = 1, interactionMatrix(ij)%amount
CALL interactionMatrix(ij)%collisions(k)%obj%collide(self%sigmaVrelMax, sigmaVrel, part_i, part_j)
sigmaVrelMaxNew = sigmaVrel + SigmaVrelMaxNew
CALL interactionMatrix(ij)%collisions(k)%obj%collide(self%sigmaVrelMax, sigmaVrelMaxNew, part_i, part_j)
END DO
!Update maximum cross section times vrelative per each collision
IF (sigmaVrelMaxNew > self%sigmaVrelMax) self%sigmaVrelMax = sigmaVrelMaxNew
END DO
!Reset output in nodes
CALL self%resetOutput()
!Erase the list of particles inside the cell
CALL self%listPart_in%erase()
END SUBROUTINE collision2DCyl

View file

@ -2,38 +2,25 @@ MODULE moduleSolver
CONTAINS
SUBROUTINE scatterGrid()
SUBROUTINE scatterGrid(meshIn, partArray)
USE moduleSpecies
USE moduleRefParam
USE moduleMesh
USE moduleOutput
INTEGER:: n, e, k
!Cleans previous output
!$OMP DO PRIVATE(k)
DO e = 1, mesh%numNodes
DO k= 1, nSpecies
mesh%nodes(e)%obj%output(k)%den = 0.D0
mesh%nodes(e)%obj%output(k)%mom = 0.D0
mesh%nodes(e)%obj%output(k)%tensorS = 0.D0
END DO
END DO
!$OMP END DO
CLASS(meshGeneric), INTENT(in):: meshIn
TYPE(particle), INTENT(in):: partArray(:)
INTEGER:: n
!Loops over the particles to scatter them
!$OMP DO
DO n=1, n_part_old
CALL mesh%vols(part_old(n)%e_p)%obj%scatter(part_old(n))
CALL meshIn%vols(partArray(n)%e_p)%obj%scatter(partArray(n))
END DO
!$OMP END DO
END SUBROUTINE scatterGrid
SUBROUTINE push(part)
PURE SUBROUTINE push(part)
USE moduleSpecies
USE moduleMesh
IMPLICIT NONE
@ -68,44 +55,66 @@ MODULE moduleSolver
part_temp%e_p = part%e_p
!Assign cell to particle
part=part_temp
CALL mesh%vols(part%e_p)%obj%findCell(part)
END SUBROUTINE push
SUBROUTINE resetParticles()
SUBROUTINE resetParticles(partInj, partOld)
USE moduleSpecies
USE moduleList
USE moduleMesh
IMPLICIT NONE
TYPE(particle), INTENT(in), ALLOCATABLE:: partInj(:)
TYPE(particle), INTENT(inout), ALLOCATABLE:: partOld(:)
INTEGER:: nn, n
INTEGER, SAVE:: n_inj_in, n_old_in
TYPE(particle), ALLOCATABLE:: partTemp(:)
IF (n_part_old > 0) THEN
n_part_new = COUNT(part_old%n_in) + COUNT(part_inj%n_in)
ELSE
n_part_new = COUNT(part_inj%n_in)
END IF
!$OMP SECTIONS
!$OMP SECTION
n_inj_in = 0
IF (ALLOCATED(partInj)) THEN
n_inj_in = COUNT(partInj%n_in)
END IF
!$OMP SECTION
n_old_in = 0
IF (ALLOCATED(partOld)) THEN
n_old_in = COUNT(partOld%n_in)
END IF
!$OMP END SECTIONS
!$OMP BARRIER
!$OMP SINGLE
CALL MOVE_ALLOC(part_old, partTemp)
ALLOCATE(part_old(1:n_part_new))
n_part_new = n_inj_in + n_old_in
ALLOCATE(partOld(1:n_part_new))
nn = 0
DO n = 1, nPartInj
IF (part_inj(n)%n_in) THEN
nn = nn + 1
part_old(nn) = part_inj(n)
CALL mesh%vols(part_old(nn)%e_p)%obj%listPart_in%add(nn)
CALL mesh%vols(part_old(nn)%e_p)%obj%listPart_in%add(part_old(nn))
END IF
END DO
DO n = 1, n_part_old
IF (partTemp(n)%n_in) THEN
nn = nn + 1
part_old(nn) = partTemp(n)
CALL mesh%vols(part_old(nn)%e_p)%obj%listPart_in%add(nn)
partOld(nn) = partTemp(n)
CALL mesh%vols(partOld(nn)%e_p)%obj%listPart_in%add(partOld(nn))
END IF
END DO
n_part_old = n_part_new
!$OMP END SINGLE
END SUBROUTINE resetParticles

View file

@ -1,7 +1,6 @@
!Contains the information about species (particles)
MODULE moduleSpecies
USE moduleCaseParam
USE moduleList
IMPLICIT NONE
TYPE, ABSTRACT:: speciesGeneric