Reducing overhead when no collisions are present
Particles are added to lists only if there are MCC collisions. Hopefully this will reduce overhead when OpenMP is used and no collisions are active.
This commit is contained in:
parent
1c5b887a6d
commit
7ce1b7a4dd
13 changed files with 142 additions and 114 deletions
|
|
@ -59,7 +59,7 @@ MODULE moduleMesh1DCart
|
|||
PROCEDURE, PASS:: phy2log => phy2logSegm
|
||||
PROCEDURE, PASS:: neighbourElement => neighbourElementSegm
|
||||
!PARTICLUAR PROCEDURES
|
||||
PROCEDURE, PASS, PRIVATE:: vol => volumeSegm
|
||||
PROCEDURE, PASS, PRIVATE:: calculateVolume => volumeSegm
|
||||
|
||||
END TYPE meshCell1DCartSegm
|
||||
|
||||
|
|
@ -193,7 +193,7 @@ MODULE moduleMesh1DCart
|
|||
self%x = (/ r1(1), r2(1) /)
|
||||
|
||||
!Assign node volume
|
||||
CALL self%vol()
|
||||
CALL self%calculateVolume()
|
||||
|
||||
CALL OMP_INIT_LOCK(self%lock)
|
||||
|
||||
|
|
@ -419,7 +419,7 @@ MODULE moduleMesh1DCart
|
|||
|
||||
END SUBROUTINE neighbourElementSegm
|
||||
|
||||
!Compute element vol
|
||||
!Compute element volume
|
||||
PURE SUBROUTINE volumeSegm(self)
|
||||
IMPLICIT NONE
|
||||
|
||||
|
|
@ -478,10 +478,10 @@ MODULE moduleMesh1DCart
|
|||
INTEGER:: e, et
|
||||
|
||||
DO e = 1, self%numCells
|
||||
!Connect Vol-Vol
|
||||
!Connect Cell-Cell
|
||||
DO et = 1, self%numCells
|
||||
IF (e /= et) THEN
|
||||
CALL connectVolVol(self%cells(e)%obj, self%cells(et)%obj)
|
||||
CALL connectCellCell(self%cells(e)%obj, self%cells(et)%obj)
|
||||
|
||||
END IF
|
||||
|
||||
|
|
@ -489,9 +489,9 @@ MODULE moduleMesh1DCart
|
|||
|
||||
SELECT TYPE(self)
|
||||
TYPE IS(meshParticles)
|
||||
!Connect Vol-Edge
|
||||
!Connect Cell-Edge
|
||||
DO et = 1, self%numEdges
|
||||
CALL connectVolEdge(self%cells(e)%obj, self%edges(et)%obj)
|
||||
CALL connectCellEdge(self%cells(e)%obj, self%edges(et)%obj)
|
||||
|
||||
END DO
|
||||
|
||||
|
|
@ -501,7 +501,7 @@ MODULE moduleMesh1DCart
|
|||
|
||||
END SUBROUTINE connectMesh1DCart
|
||||
|
||||
SUBROUTINE connectVolVol(elemA, elemB)
|
||||
SUBROUTINE connectCellCell(elemA, elemB)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell), INTENT(inout):: elemA
|
||||
|
|
@ -517,7 +517,7 @@ MODULE moduleMesh1DCart
|
|||
|
||||
END SELECT
|
||||
|
||||
END SUBROUTINE connectVolVol
|
||||
END SUBROUTINE connectCellCell
|
||||
|
||||
SUBROUTINE connectSegmSegm(elemA, elemB)
|
||||
IMPLICIT NONE
|
||||
|
|
@ -542,7 +542,7 @@ MODULE moduleMesh1DCart
|
|||
|
||||
END SUBROUTINE connectSegmSegm
|
||||
|
||||
SUBROUTINE connectVolEdge(elemA, elemB)
|
||||
SUBROUTINE connectCellEdge(elemA, elemB)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell), INTENT(inout):: elemA
|
||||
|
|
@ -558,7 +558,7 @@ MODULE moduleMesh1DCart
|
|||
|
||||
END SELECT
|
||||
|
||||
END SUBROUTINE connectVolEdge
|
||||
END SUBROUTINE connectCellEdge
|
||||
|
||||
SUBROUTINE connectSegmEdge(elemA, elemB)
|
||||
IMPLICIT NONE
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ MODULE moduleMesh1DRad
|
|||
PROCEDURE, PASS:: phy2log => phy2logSegm
|
||||
PROCEDURE, PASS:: neighbourElement => neighbourElementSegm
|
||||
!PARTICLUAR PROCEDURES
|
||||
PROCEDURE, PASS, PRIVATE:: vol => volumeSegm
|
||||
PROCEDURE, PASS, PRIVATE:: calculateVolume => volumeSegm
|
||||
|
||||
END TYPE meshCell1DRadSegm
|
||||
|
||||
|
|
@ -193,7 +193,7 @@ MODULE moduleMesh1DRad
|
|||
self%r = (/ r1(1), r2(1) /)
|
||||
|
||||
!Assign node volume
|
||||
CALL self%vol()
|
||||
CALL self%calculateVolume()
|
||||
|
||||
CALL OMP_INIT_LOCK(self%lock)
|
||||
|
||||
|
|
@ -427,7 +427,7 @@ MODULE moduleMesh1DRad
|
|||
|
||||
END SUBROUTINE neighbourElementSegm
|
||||
|
||||
!Compute element vol
|
||||
!Compute element volume
|
||||
PURE SUBROUTINE volumeSegm(self)
|
||||
USE moduleConstParam, ONLY: PI4
|
||||
IMPLICIT NONE
|
||||
|
|
@ -493,10 +493,10 @@ MODULE moduleMesh1DRad
|
|||
INTEGER:: e, et
|
||||
|
||||
DO e = 1, self%numCells
|
||||
!Connect Vol-Vol
|
||||
!Connect Cell-Cell
|
||||
DO et = 1, self%numCells
|
||||
IF (e /= et) THEN
|
||||
CALL connectVolVol(self%cells(e)%obj, self%cells(et)%obj)
|
||||
CALL connectCellCell(self%cells(e)%obj, self%cells(et)%obj)
|
||||
|
||||
END IF
|
||||
|
||||
|
|
@ -504,9 +504,9 @@ MODULE moduleMesh1DRad
|
|||
|
||||
SELECT TYPE(self)
|
||||
TYPE IS(meshParticles)
|
||||
!Connect Vol-Edge
|
||||
!Connect Cell-Edge
|
||||
DO et = 1, self%numEdges
|
||||
CALL connectVolEdge(self%cells(e)%obj, self%edges(et)%obj)
|
||||
CALL connectCellEdge(self%cells(e)%obj, self%edges(et)%obj)
|
||||
|
||||
END DO
|
||||
|
||||
|
|
@ -516,7 +516,7 @@ MODULE moduleMesh1DRad
|
|||
|
||||
END SUBROUTINE connectMesh1DRad
|
||||
|
||||
SUBROUTINE connectVolVol(elemA, elemB)
|
||||
SUBROUTINE connectCellCell(elemA, elemB)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell), INTENT(inout):: elemA
|
||||
|
|
@ -532,7 +532,7 @@ MODULE moduleMesh1DRad
|
|||
|
||||
END SELECT
|
||||
|
||||
END SUBROUTINE connectVolVol
|
||||
END SUBROUTINE connectCellCell
|
||||
|
||||
SUBROUTINE connectSegmSegm(elemA, elemB)
|
||||
IMPLICIT NONE
|
||||
|
|
@ -557,7 +557,7 @@ MODULE moduleMesh1DRad
|
|||
|
||||
END SUBROUTINE connectSegmSegm
|
||||
|
||||
SUBROUTINE connectVolEdge(elemA, elemB)
|
||||
SUBROUTINE connectCellEdge(elemA, elemB)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell), INTENT(inout):: elemA
|
||||
|
|
@ -573,7 +573,7 @@ MODULE moduleMesh1DRad
|
|||
|
||||
END SELECT
|
||||
|
||||
END SUBROUTINE connectVolEdge
|
||||
END SUBROUTINE connectCellEdge
|
||||
|
||||
SUBROUTINE connectSegmEdge(elemA, elemB)
|
||||
IMPLICIT NONE
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ MODULE moduleMesh2DCart
|
|||
PROCEDURE, PASS:: phy2log => phy2logQuad
|
||||
PROCEDURE, PASS:: neighbourElement => neighbourElementQuad
|
||||
!PARTICLUAR PROCEDURES
|
||||
PROCEDURE, PASS, PRIVATE:: vol => volumeQuad
|
||||
PROCEDURE, PASS, PRIVATE:: calculateVolume => volumeQuad
|
||||
|
||||
END TYPE meshCell2DCartQuad
|
||||
|
||||
|
|
@ -97,7 +97,7 @@ MODULE moduleMesh2DCart
|
|||
PROCEDURE, PASS:: phy2log => phy2logTria
|
||||
PROCEDURE, PASS:: neighbourElement => neighbourElementTria
|
||||
!PARTICULAR PROCEDURES
|
||||
PROCEDURE, PASS, PRIVATE:: vol => volumeTria
|
||||
PROCEDURE, PASS, PRIVATE:: calculateVolume => volumeTria
|
||||
|
||||
END TYPE meshCell2DCartTria
|
||||
|
||||
|
|
@ -267,7 +267,7 @@ MODULE moduleMesh2DCart
|
|||
self%y = (/r1(2), r2(2), r3(2), r4(2)/)
|
||||
|
||||
!Assign node volume
|
||||
CALL self%vol()
|
||||
CALL self%calculateVolume()
|
||||
|
||||
CALL OMP_INIT_LOCK(self%lock)
|
||||
|
||||
|
|
@ -609,7 +609,7 @@ MODULE moduleMesh2DCart
|
|||
self%x = (/r1(1), r2(1), r3(1)/)
|
||||
self%y = (/r1(2), r2(2), r3(2)/)
|
||||
!Assign node volume
|
||||
CALL self%vol()
|
||||
CALL self%calculateVolume()
|
||||
|
||||
CALL OMP_INIT_LOCK(self%lock)
|
||||
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ MODULE moduleMesh2DCyl
|
|||
PROCEDURE, PASS:: phy2log => phy2logQuad
|
||||
PROCEDURE, PASS:: neighbourElement => neighbourElementQuad
|
||||
!PARTICLUAR PROCEDURES
|
||||
PROCEDURE, PASS, PRIVATE:: vol => volumeQuad
|
||||
PROCEDURE, PASS, PRIVATE:: calculateVolume => volumeQuad
|
||||
|
||||
END TYPE meshCell2DCylQuad
|
||||
|
||||
|
|
@ -97,7 +97,7 @@ MODULE moduleMesh2DCyl
|
|||
PROCEDURE, PASS:: phy2log => phy2logTria
|
||||
PROCEDURE, PASS:: neighbourElement => neighbourElementTria
|
||||
!PARTICULAR PROCEDURES
|
||||
PROCEDURE, PASS, PRIVATE:: vol => volumeTria
|
||||
PROCEDURE, PASS, PRIVATE:: calculateVolume => volumeTria
|
||||
|
||||
END TYPE meshCell2DCylTria
|
||||
|
||||
|
|
@ -275,7 +275,7 @@ MODULE moduleMesh2DCyl
|
|||
self%r = (/r1(2), r2(2), r3(2), r4(2)/)
|
||||
|
||||
!Assign node volume
|
||||
CALL self%vol()
|
||||
CALL self%calculateVolume()
|
||||
|
||||
CALL OMP_INIT_LOCK(self%lock)
|
||||
|
||||
|
|
@ -636,7 +636,7 @@ MODULE moduleMesh2DCyl
|
|||
self%z = (/r1(1), r2(1), r3(1)/)
|
||||
self%r = (/r1(2), r2(2), r3(2)/)
|
||||
!Assign node volume
|
||||
CALL self%vol()
|
||||
CALL self%calculateVolume()
|
||||
|
||||
CALL OMP_INIT_LOCK(self%lock)
|
||||
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ MODULE moduleMesh3DCart
|
|||
PROCEDURE, PASS:: phy2log => phy2logTetra
|
||||
PROCEDURE, PASS:: neighbourElement => neighbourElementTetra
|
||||
!PARTICULAR PROCEDURES
|
||||
PROCEDURE, PASS, PRIVATE:: vol => volumeTetra
|
||||
PROCEDURE, PASS, PRIVATE:: calculateVolume => volumeTetra
|
||||
|
||||
END TYPE meshCell3DCartTetra
|
||||
|
||||
|
|
@ -255,7 +255,7 @@ MODULE moduleMesh3DCart
|
|||
self%z = (/r1(3), r2(3), r3(3), r4(3)/)
|
||||
|
||||
!Computes the element volume
|
||||
CALL self%vol()
|
||||
CALL self%calculateVolume()
|
||||
|
||||
CALL OMP_INIT_LOCK(self%lock)
|
||||
|
||||
|
|
|
|||
|
|
@ -480,6 +480,8 @@ MODULE moduleMesh
|
|||
|
||||
!Logical to indicate if an specific mesh for MC Collisions is used
|
||||
LOGICAL:: doubleMesh
|
||||
!Logical to indicate if MCC collisions are performed
|
||||
LOGICAL:: doMCC
|
||||
!Complete path for the two meshes
|
||||
CHARACTER(:), ALLOCATABLE:: pathMeshColl, pathMeshParticle
|
||||
|
||||
|
|
@ -644,15 +646,18 @@ MODULE moduleMesh
|
|||
Xi = self%phy2log(part%r)
|
||||
!Checks if particle is inside 'self' cell
|
||||
IF (self%inside(Xi)) THEN
|
||||
part%vol = self%n
|
||||
part%cell = self%n
|
||||
part%Xi = Xi
|
||||
part%n_in = .TRUE.
|
||||
!Assign particle to listPart_in
|
||||
CALL OMP_SET_LOCK(self%lock)
|
||||
sp = part%species%n
|
||||
CALL self%listPart_in(sp)%add(part)
|
||||
self%totalWeight(sp) = self%totalWeight(sp) + part%weight
|
||||
CALL OMP_UNSET_LOCK(self%lock)
|
||||
IF (doMCC) THEN
|
||||
CALL OMP_SET_LOCK(self%lock)
|
||||
sp = part%species%n
|
||||
CALL self%listPart_in(sp)%add(part)
|
||||
self%totalWeight(sp) = self%totalWeight(sp) + part%weight
|
||||
CALL OMP_UNSET_LOCK(self%lock)
|
||||
|
||||
END IF
|
||||
|
||||
ELSE
|
||||
!If not, searches for a neighbour and repeats the process.
|
||||
|
|
@ -688,14 +693,14 @@ MODULE moduleMesh
|
|||
|
||||
END SUBROUTINE findCell
|
||||
|
||||
!If Coll and Particle are the same, simply copy the part%vol into part%volColl
|
||||
!If Coll and Particle are the same, simply copy the part%cell into part%cellColl
|
||||
SUBROUTINE findCellSameMesh(part)
|
||||
USE moduleSpecies
|
||||
IMPLICIT NONE
|
||||
|
||||
TYPE(particle), INTENT(inout):: part
|
||||
|
||||
part%volColl = part%vol
|
||||
part%cellColl = part%cell
|
||||
|
||||
END SUBROUTINE findCellSameMesh
|
||||
|
||||
|
|
@ -715,16 +720,19 @@ MODULE moduleMesh
|
|||
|
||||
found = .FALSE.
|
||||
|
||||
cell => meshColl%cells(part%volColl)%obj
|
||||
cell => meshColl%cells(part%cellColl)%obj
|
||||
DO WHILE(.NOT. found)
|
||||
Xi = cell%phy2log(part%r)
|
||||
IF (cell%inside(Xi)) THEN
|
||||
part%volColl = cell%n
|
||||
CALL OMP_SET_LOCK(cell%lock)
|
||||
sp = part%species%n
|
||||
CALL cell%listPart_in(sp)%add(part)
|
||||
cell%totalWeight(sp) = cell%totalWeight(sp) + part%weight
|
||||
CALL OMP_UNSET_LOCK(cell%lock)
|
||||
part%cellColl = cell%n
|
||||
IF (doMCC) THEN
|
||||
CALL OMP_SET_LOCK(cell%lock)
|
||||
sp = part%species%n
|
||||
CALL cell%listPart_in(sp)%add(part)
|
||||
cell%totalWeight(sp) = cell%totalWeight(sp) + part%weight
|
||||
CALL OMP_UNSET_LOCK(cell%lock)
|
||||
|
||||
END IF
|
||||
found = .TRUE.
|
||||
|
||||
ELSE
|
||||
|
|
|
|||
|
|
@ -156,10 +156,10 @@ MODULE moduleMeshBoundary
|
|||
newElectron%r = edge%randPos()
|
||||
newIon%r = newElectron%r
|
||||
|
||||
newElectron%vol = part%vol
|
||||
newIon%vol = part%vol
|
||||
newElectron%cell = part%cell
|
||||
newIon%cell = part%cell
|
||||
|
||||
newElectron%Xi = mesh%cells(part%vol)%obj%phy2log(newElectron%r)
|
||||
newElectron%Xi = mesh%cells(part%cell)%obj%phy2log(newElectron%r)
|
||||
newIon%Xi = newElectron%Xi
|
||||
|
||||
newElectron%weight = part%weight
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue