Fixed an issue with reflection of particles in all geometries and also
assigning the normal vector in 2D and 3D. 3D Cartesian geometry is working properly, although it needs testing. Still issue with ionization boundary.
This commit is contained in:
parent
3b01099aba
commit
db6b0a2c03
15 changed files with 349 additions and 265 deletions
|
|
@ -191,9 +191,9 @@ MODULE moduleMesh2DCyl
|
|||
self%z = (/r1(1), r2(1)/)
|
||||
self%r = (/r1(2), r2(2)/)
|
||||
!Normal vector
|
||||
self%normal = (/ self%r(2)-self%r(1), &
|
||||
self%z(2)-self%z(1), &
|
||||
0.D0 /)
|
||||
self%normal = (/ -(self%r(2)-self%r(1)), &
|
||||
self%z(2)-self%z(1) , &
|
||||
0.D0 /)
|
||||
self%normal = self%normal/NORM2(self%normal)
|
||||
!Boundary index
|
||||
self%boundary => boundary(bt)
|
||||
|
|
@ -221,20 +221,22 @@ MODULE moduleMesh2DCyl
|
|||
|
||||
END FUNCTION getNodes2DCyl
|
||||
|
||||
PURE FUNCTION intersection2DCylEdge(self, r0, v0) RESULT(r)
|
||||
PURE FUNCTION intersection2DCylEdge(self, r0) RESULT(r)
|
||||
USE moduleMath
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshEdge2DCyl), INTENT(in):: self
|
||||
REAL(8), DIMENSION(1:3), INTENT(in):: r0, v0
|
||||
REAL(8), DIMENSION(1:3), INTENT(in):: r0
|
||||
REAL(8), DIMENSION(1:3):: r
|
||||
REAL(8), DIMENSION(1:3):: rS !base point of surface
|
||||
REAL(8):: d
|
||||
REAL(8), DIMENSION(1:3):: edge0, edgeV
|
||||
REAL(8):: tI
|
||||
|
||||
rS = (/ self%z(1), self%r(1), 0.D0 /)
|
||||
edge0 = (/self%z(1), self%r(1), 0.D0 /)
|
||||
edgeV = (/self%z(2), self%r(2), 0.D0 /) - edge0
|
||||
|
||||
d = DOT_PRODUCT((rS - r0), self%normal)/DOT_PRODUCT(v0, self%normal)
|
||||
tI = DOT_PRODUCT(r0 - edge0, edgeV)/DOT_PRODUCT(edgeV, edgeV)
|
||||
|
||||
r = r0 + v0*d
|
||||
r = edge0 + tI*edgeV
|
||||
|
||||
END FUNCTION intersection2DCylEdge
|
||||
|
||||
|
|
@ -507,7 +509,7 @@ MODULE moduleMesh2DCyl
|
|||
|
||||
!Scatter properties of particle into element nodes
|
||||
SUBROUTINE scatterQuad(self, part)
|
||||
USE moduleOutput
|
||||
USE moduleMath
|
||||
USE moduleSpecies
|
||||
IMPLICIT NONE
|
||||
|
||||
|
|
@ -874,7 +876,7 @@ MODULE moduleMesh2DCyl
|
|||
|
||||
!Scatter properties of particles into element
|
||||
SUBROUTINE scatterTria(self, part)
|
||||
USE moduleOutput
|
||||
USE moduleMath
|
||||
USE moduleSpecies
|
||||
IMPLICIT NONE
|
||||
|
||||
|
|
|
|||
|
|
@ -217,6 +217,29 @@ MODULE moduleMesh2DCylRead
|
|||
|
||||
END SUBROUTINE connectedVolEdge
|
||||
|
||||
PURE FUNCTION coincidentNodes(nodesA, nodesB) RESULT(coincident)
|
||||
IMPLICIT NONE
|
||||
|
||||
INTEGER, DIMENSION(1:2), INTENT(in):: nodesA, nodesB
|
||||
LOGICAL:: coincident
|
||||
INTEGER:: i
|
||||
|
||||
coincident = .FALSE.
|
||||
DO i = 1, 2
|
||||
IF (ANY(nodesA(i) == nodesB)) THEN
|
||||
coincident = .TRUE.
|
||||
|
||||
ELSE
|
||||
coincident = .FALSE.
|
||||
EXIT
|
||||
|
||||
END IF
|
||||
|
||||
END DO
|
||||
|
||||
END FUNCTION coincidentNodes
|
||||
|
||||
|
||||
SUBROUTINE connectedQuadQuad(elemA, elemB)
|
||||
IMPLICIT NONE
|
||||
|
||||
|
|
@ -437,15 +460,15 @@ MODULE moduleMesh2DCylRead
|
|||
IF (elemA%n1%n == elemB%n1%n .AND. &
|
||||
elemA%n2%n == elemB%n2%n) THEN
|
||||
elemA%e1 => elemB
|
||||
elemB%e2 => elemA
|
||||
|
||||
!Revers the normal to point inside the domain
|
||||
elemB%normal = - elemB%normal
|
||||
elemB%e1 => elemA
|
||||
|
||||
ELSEIF (elemA%n1%n == elemB%n2%n .AND. &
|
||||
elemA%n2%n == elemB%n1%n) THEN
|
||||
elemA%e1 => elemB
|
||||
elemB%e1 => elemA
|
||||
elemB%e2 => elemA
|
||||
|
||||
!Revers the normal to point inside the domain
|
||||
elemB%normal = - elemB%normal
|
||||
|
||||
END IF
|
||||
|
||||
|
|
@ -456,15 +479,15 @@ MODULE moduleMesh2DCylRead
|
|||
IF (elemA%n2%n == elemB%n1%n .AND. &
|
||||
elemA%n3%n == elemB%n2%n) THEN
|
||||
elemA%e2 => elemB
|
||||
elemB%e2 => elemA
|
||||
|
||||
!Revers the normal to point inside the domain
|
||||
elemB%normal = - elemB%normal
|
||||
elemB%e1 => elemA
|
||||
|
||||
ELSEIF (elemA%n2%n == elemB%n2%n .AND. &
|
||||
elemA%n3%n == elemB%n1%n) THEN
|
||||
elemA%e2 => elemB
|
||||
elemB%e1 => elemA
|
||||
elemB%e2 => elemA
|
||||
|
||||
!Revers the normal to point inside the domain
|
||||
elemB%normal = - elemB%normal
|
||||
|
||||
END IF
|
||||
|
||||
|
|
@ -475,15 +498,15 @@ MODULE moduleMesh2DCylRead
|
|||
IF (elemA%n3%n == elemB%n1%n .AND. &
|
||||
elemA%n4%n == elemB%n2%n) THEN
|
||||
elemA%e3 => elemB
|
||||
elemB%e2 => elemA
|
||||
|
||||
!Revers the normal to point inside the domain
|
||||
elemB%normal = - elemB%normal
|
||||
elemB%e1 => elemA
|
||||
|
||||
ELSEIF (elemA%n3%n == elemB%n2%n .AND. &
|
||||
elemA%n4%n == elemB%n1%n) THEN
|
||||
elemA%e3 => elemB
|
||||
elemB%e1 => elemA
|
||||
elemB%e2 => elemA
|
||||
|
||||
!Revers the normal to point inside the domain
|
||||
elemB%normal = - elemB%normal
|
||||
|
||||
END IF
|
||||
|
||||
|
|
@ -494,12 +517,15 @@ MODULE moduleMesh2DCylRead
|
|||
IF (elemA%n4%n == elemB%n1%n .AND. &
|
||||
elemA%n1%n == elemB%n2%n) THEN
|
||||
elemA%e4 => elemB
|
||||
elemB%e2 => elemA
|
||||
elemB%e1 => elemA
|
||||
|
||||
ELSEIF (elemA%n4%n == elemB%n2%n .AND. &
|
||||
elemA%n1%n == elemB%n1%n) THEN
|
||||
elemA%e4 => elemB
|
||||
elemB%e1 => elemA
|
||||
elemB%e2 => elemA
|
||||
|
||||
!Revers the normal to point inside the domain
|
||||
elemB%normal = - elemB%normal
|
||||
|
||||
END IF
|
||||
|
||||
|
|
@ -518,15 +544,15 @@ MODULE moduleMesh2DCylRead
|
|||
IF (elemA%n1%n == elemB%n1%n .AND. &
|
||||
elemA%n2%n == elemB%n2%n) THEN
|
||||
elemA%e1 => elemB
|
||||
elemB%e2 => elemA
|
||||
|
||||
!Revers the normal to point inside the domain
|
||||
elemB%normal = - elemB%normal
|
||||
elemB%e1 => elemA
|
||||
|
||||
ELSEIF (elemA%n1%n == elemB%n2%n .AND. &
|
||||
elemA%n2%n == elemB%n1%n) THEN
|
||||
elemA%e1 => elemB
|
||||
elemB%e1 => elemA
|
||||
elemB%e2 => elemA
|
||||
|
||||
!Revers the normal to point inside the domain
|
||||
elemB%normal = - elemB%normal
|
||||
|
||||
END IF
|
||||
|
||||
|
|
@ -537,15 +563,15 @@ MODULE moduleMesh2DCylRead
|
|||
IF (elemA%n2%n == elemB%n1%n .AND. &
|
||||
elemA%n3%n == elemB%n2%n) THEN
|
||||
elemA%e2 => elemB
|
||||
elemB%e2 => elemA
|
||||
|
||||
!Revers the normal to point inside the domain
|
||||
elemB%normal = - elemB%normal
|
||||
elemB%e1 => elemA
|
||||
|
||||
ELSEIF (elemA%n2%n == elemB%n2%n .AND. &
|
||||
elemA%n3%n == elemB%n1%n) THEN
|
||||
elemA%e2 => elemB
|
||||
elemB%e1 => elemA
|
||||
elemB%e2 => elemA
|
||||
|
||||
!Revers the normal to point inside the domain
|
||||
elemB%normal = - elemB%normal
|
||||
|
||||
END IF
|
||||
|
||||
|
|
@ -556,15 +582,15 @@ MODULE moduleMesh2DCylRead
|
|||
IF (elemA%n3%n == elemB%n1%n .AND. &
|
||||
elemA%n1%n == elemB%n2%n) THEN
|
||||
elemA%e3 => elemB
|
||||
elemB%e2 => elemA
|
||||
|
||||
!Revers the normal to point inside the domain
|
||||
elemB%normal = - elemB%normal
|
||||
elemB%e1 => elemA
|
||||
|
||||
ELSEIF (elemA%n3%n == elemB%n2%n .AND. &
|
||||
elemA%n1%n == elemB%n1%n) THEN
|
||||
elemA%e3 => elemB
|
||||
elemB%e1 => elemA
|
||||
elemB%e2 => elemA
|
||||
|
||||
!Revers the normal to point inside the domain
|
||||
elemB%normal = - elemB%normal
|
||||
|
||||
END IF
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue