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
|
|
@ -134,6 +134,7 @@ MODULE moduleMesh3DCart
|
|||
USE moduleSpecies
|
||||
USE moduleBoundary
|
||||
USE moduleErrors
|
||||
USE moduleMath
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshEdge3DCartTria), INTENT(out):: self
|
||||
|
|
@ -142,6 +143,7 @@ MODULE moduleMesh3DCart
|
|||
INTEGER, INTENT(in):: bt
|
||||
INTEGER, INTENT(in):: physicalSurface
|
||||
REAL(8), DIMENSION(1:3):: r1, r2, r3
|
||||
REAL(8), DIMENSION(1:3):: vec1, vec2
|
||||
INTEGER:: s
|
||||
|
||||
self%n = n
|
||||
|
|
@ -156,10 +158,14 @@ MODULE moduleMesh3DCart
|
|||
self%y = (/r1(2), r2(2), r3(2)/)
|
||||
self%z = (/r1(3), r2(3), r3(3)/)
|
||||
!Normal vector
|
||||
self%normal = (/ (self%y(2)-self%y(1))*(self%z(3)-self%z(1)) - (self%z(2)-self%z(1))*(self%y(3)-self%y(1)), &
|
||||
(self%x(2)-self%x(1))*(self%z(3)-self%z(1)) - (self%z(2)-self%z(1))*(self%x(3)-self%x(1)), &
|
||||
(self%x(2)-self%x(1))*(self%y(3)-self%y(1)) - (self%z(2)-self%z(1))*(self%y(3)-self%y(1)) /)
|
||||
self%normal = self%normal/NORM2(self%normal)
|
||||
vec1 = (/ self%x(2) - self%x(1), &
|
||||
self%y(2) - self%y(1), &
|
||||
self%z(2) - self%z(1) /)
|
||||
vec2 = (/ self%x(3) - self%x(1), &
|
||||
self%y(3) - self%y(1), &
|
||||
self%z(3) - self%z(1) /)
|
||||
self%normal = crossProduct(vec1, vec2)
|
||||
self%normal = normalize(self%normal)
|
||||
|
||||
!Boundary index
|
||||
self%boundary => boundary(bt)
|
||||
|
|
@ -187,20 +193,21 @@ MODULE moduleMesh3DCart
|
|||
|
||||
END FUNCTION getNodes3DCartTria
|
||||
|
||||
PURE FUNCTION intersection3DCartTria(self, r0, v0) RESULT(r)
|
||||
PURE FUNCTION intersection3DCartTria(self, r0) RESULT(r)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshEdge3DCartTria), INTENT(in):: self
|
||||
REAL(8), DIMENSION(1:3), INTENT(in):: r0, v0
|
||||
REAL(8), INTENT(in):: r0(1:3)
|
||||
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%x(1), self%y(1), self%z(1) /)
|
||||
edge0 = (/self%x(1), self%y(1), self%z(1) /)
|
||||
edgeV = (/self%x(2), self%y(2), self%z(2) /) - 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 intersection3DCartTria
|
||||
|
||||
|
|
@ -476,7 +483,7 @@ MODULE moduleMesh3DCart
|
|||
END FUNCTION insideTetra
|
||||
|
||||
SUBROUTINE scatterTetra(self, part)
|
||||
USE moduleOutput
|
||||
USE moduleMath
|
||||
USE moduleSpecies
|
||||
IMPLICIT NONE
|
||||
|
||||
|
|
@ -577,7 +584,7 @@ MODULE moduleMesh3DCart
|
|||
INTEGER:: nextInt
|
||||
|
||||
!TODO: Review when connectivity
|
||||
xiArray = (/ xi(3), xi(2), 1.D0 - xi(1) - xi(2) - xi(3), xi(1) /)
|
||||
xiArray = (/ xi(3), 1.D0 - xi(1) - xi(2) - xi(3), xi(2), xi(1) /)
|
||||
nextInt = MINLOC(xiArray, 1)
|
||||
NULLIFY(nextElement)
|
||||
SELECT CASE(nextInt)
|
||||
|
|
@ -647,9 +654,11 @@ MODULE moduleMesh3DCart
|
|||
invJ(2,2) = (dx(1)*dz(3) - dx(3)*dz(1))
|
||||
invJ(2,3) = -(dx(1)*dz(2) - dx(2)*dz(1))
|
||||
|
||||
invJ(3,1) = -(dx(2)*dy(3) - dx(3)*dy(2))
|
||||
invJ(3,2) = (dx(1)*dy(3) - dx(3)*dy(1))
|
||||
invJ(3,3) = -(dx(1)*dy(2) - dx(2)*dy(1))
|
||||
invJ(3,1) = (dx(2)*dy(3) - dx(3)*dy(2))
|
||||
invJ(3,2) = -(dx(1)*dy(3) - dx(3)*dy(1))
|
||||
invJ(3,3) = (dx(1)*dy(2) - dx(2)*dy(1))
|
||||
|
||||
invJ = TRANSPOSE(invJ)
|
||||
|
||||
END FUNCTION invJ3DCart
|
||||
|
||||
|
|
|
|||
|
|
@ -269,25 +269,25 @@ MODULE moduleMesh3DCartRead
|
|||
|
||||
!Check surface 2
|
||||
IF (.NOT. ASSOCIATED(elemA%e2)) THEN
|
||||
IF (coincidentNodes((/elemA%n1%n, elemA%n2%n, elemA%n4%n/), &
|
||||
IF (coincidentNodes((/elemA%n2%n, elemA%n3%n, elemA%n4%n/), &
|
||||
(/elemB%n1%n, elemB%n2%n, elemB%n3%n/))) THEN
|
||||
|
||||
elemA%e2 => elemB
|
||||
elemB%e1 => elemA
|
||||
|
||||
ELSEIF (coincidentNodes((/elemA%n1%n, elemA%n2%n, elemA%n4%n/), &
|
||||
ELSEIF (coincidentNodes((/elemA%n2%n, elemA%n3%n, elemA%n4%n/), &
|
||||
(/elemB%n2%n, elemB%n3%n, elemB%n4%n/))) THEN
|
||||
|
||||
elemA%e2 => elemB
|
||||
elemB%e2 => elemA
|
||||
|
||||
ELSEIF (coincidentNodes((/elemA%n1%n, elemA%n2%n, elemA%n4%n/), &
|
||||
ELSEIF (coincidentNodes((/elemA%n2%n, elemA%n3%n, elemA%n4%n/), &
|
||||
(/elemB%n1%n, elemB%n2%n, elemB%n4%n/))) THEN
|
||||
|
||||
elemA%e2 => elemB
|
||||
elemB%e3 => elemA
|
||||
|
||||
ELSEIF (coincidentNodes((/elemA%n1%n, elemA%n2%n, elemA%n4%n/), &
|
||||
ELSEIF (coincidentNodes((/elemA%n2%n, elemA%n3%n, elemA%n4%n/), &
|
||||
(/elemB%n1%n, elemB%n3%n, elemB%n4%n/))) THEN
|
||||
|
||||
elemA%e2 => elemB
|
||||
|
|
@ -299,25 +299,25 @@ MODULE moduleMesh3DCartRead
|
|||
|
||||
!Check surface 3
|
||||
IF (.NOT. ASSOCIATED(elemA%e3)) THEN
|
||||
IF (coincidentNodes((/elemA%n2%n, elemA%n3%n, elemA%n4%n/), &
|
||||
IF (coincidentNodes((/elemA%n1%n, elemA%n2%n, elemA%n4%n/), &
|
||||
(/elemB%n1%n, elemB%n2%n, elemB%n3%n/))) THEN
|
||||
|
||||
elemA%e3 => elemB
|
||||
elemB%e1 => elemA
|
||||
|
||||
ELSEIF (coincidentNodes((/elemA%n2%n, elemA%n3%n, elemA%n4%n/), &
|
||||
ELSEIF (coincidentNodes((/elemA%n1%n, elemA%n2%n, elemA%n4%n/), &
|
||||
(/elemB%n2%n, elemB%n3%n, elemB%n4%n/))) THEN
|
||||
|
||||
elemA%e3 => elemB
|
||||
elemB%e2 => elemA
|
||||
|
||||
ELSEIF (coincidentNodes((/elemA%n2%n, elemA%n3%n, elemA%n4%n/), &
|
||||
ELSEIF (coincidentNodes((/elemA%n1%n, elemA%n2%n, elemA%n4%n/), &
|
||||
(/elemB%n1%n, elemB%n2%n, elemB%n4%n/))) THEN
|
||||
|
||||
elemA%e3 => elemB
|
||||
elemB%e3 => elemA
|
||||
|
||||
ELSEIF (coincidentNodes((/elemA%n2%n, elemA%n3%n, elemA%n4%n/), &
|
||||
ELSEIF (coincidentNodes((/elemA%n1%n, elemA%n2%n, elemA%n4%n/), &
|
||||
(/elemB%n1%n, elemB%n3%n, elemB%n4%n/))) THEN
|
||||
|
||||
elemA%e3 => elemB
|
||||
|
|
@ -328,7 +328,7 @@ MODULE moduleMesh3DCartRead
|
|||
END IF
|
||||
|
||||
!Check surface 4
|
||||
IF (.NOT. ASSOCIATED(elemA%e3)) THEN
|
||||
IF (.NOT. ASSOCIATED(elemA%e4)) THEN
|
||||
IF (coincidentNodes((/elemA%n1%n, elemA%n3%n, elemA%n4%n/), &
|
||||
(/elemB%n1%n, elemB%n2%n, elemB%n3%n/))) THEN
|
||||
|
||||
|
|
@ -360,77 +360,78 @@ MODULE moduleMesh3DCartRead
|
|||
END SUBROUTINE connectedTetraTetra
|
||||
|
||||
SUBROUTINE connectedTetraEdge(elemA, elemB)
|
||||
USE moduleMath
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol3DCartTetra), INTENT(inout), TARGET:: elemA
|
||||
CLASS(meshEdge3DCartTria), INTENT(inout), TARGET:: elemB
|
||||
INTEGER:: nodesEdge(1:3)
|
||||
REAL(8), DIMENSION(1:3):: vec1, vec2
|
||||
REAL(8):: normVol(1:3)
|
||||
|
||||
nodesEdge = (/ elemB%n1%n, elemB%n2%n, elemB%n3%n /)
|
||||
|
||||
!Check surface 1
|
||||
IF (.NOT. ASSOCIATED(elemA%e1)) THEN
|
||||
IF ((elemA%n1%n == elemB%n1%n .AND. &
|
||||
elemA%n2%n == elemB%n2%n .AND. &
|
||||
elemA%n3%n == elemB%n3%n) .OR. &
|
||||
(elemA%n1%n == elemB%n3%n .AND. &
|
||||
elemA%n2%n == elemB%n1%n .AND. &
|
||||
elemA%n3%n == elemB%n2%n) .OR. &
|
||||
(elemA%n1%n == elemB%n2%n .AND. &
|
||||
elemA%n2%n == elemB%n3%n .AND. &
|
||||
elemA%n3%n == elemB%n1%n)) THEN
|
||||
IF (coincidentNodes((/elemA%n1%n, elemA%n2%n, elema%n3%n/), &
|
||||
nodesEdge)) THEN
|
||||
|
||||
elemA%e1 => elemB
|
||||
elemB%e1 => elemA
|
||||
vec1 = (/ elemA%x(2) - elemA%x(1), &
|
||||
elemA%y(2) - elemA%y(1), &
|
||||
elemA%z(2) - elemA%z(1) /)
|
||||
vec2 = (/ elemA%x(3) - elemA%x(1), &
|
||||
elemA%y(3) - elemA%y(1), &
|
||||
elemA%z(3) - elemA%z(1) /)
|
||||
normVol = crossProduct(vec1, vec2)
|
||||
normVol = normalize(normVol)
|
||||
|
||||
ELSEIF ((elemA%n1%n == elemB%n3%n .AND. &
|
||||
elemA%n2%n == elemB%n2%n .AND. &
|
||||
elemA%n3%n == elemB%n1%n) .OR. &
|
||||
(elemA%n1%n == elemB%n1%n .AND. &
|
||||
elemA%n2%n == elemB%n3%n .AND. &
|
||||
elemA%n3%n == elemB%n2%n) .OR. &
|
||||
(elemA%n1%n == elemB%n2%n .AND. &
|
||||
elemA%n2%n == elemB%n1%n .AND. &
|
||||
elemA%n3%n == elemB%n3%n)) THEN
|
||||
IF (DOT_PRODUCT(elemB%normal, normVol) == -1.D0) THEN
|
||||
|
||||
elemA%e1 => elemB
|
||||
elemB%e2 => elemA
|
||||
elemA%e1 => elemB
|
||||
elemB%e1 => elemA
|
||||
|
||||
!Revers the normal to point inside the domain
|
||||
elemB%normal = -elemB%normal
|
||||
ELSE
|
||||
|
||||
elemA%e1 => elemB
|
||||
elemB%e2 => elemA
|
||||
|
||||
!Revers the normal to point inside the domain
|
||||
elemB%normal = -elemB%normal
|
||||
|
||||
END IF
|
||||
|
||||
END IF
|
||||
|
||||
|
||||
END IF
|
||||
|
||||
!Check surface 2
|
||||
IF (.NOT. ASSOCIATED(elemA%e2)) THEN
|
||||
IF ((elemA%n1%n == elemB%n1%n .AND. &
|
||||
elemA%n2%n == elemB%n2%n .AND. &
|
||||
elemA%n4%n == elemB%n3%n) .OR. &
|
||||
(elemA%n1%n == elemB%n3%n .AND. &
|
||||
elemA%n2%n == elemB%n1%n .AND. &
|
||||
elemA%n4%n == elemB%n2%n) .OR. &
|
||||
(elemA%n1%n == elemB%n2%n .AND. &
|
||||
elemA%n2%n == elemB%n3%n .AND. &
|
||||
elemA%n4%n == elemB%n1%n)) THEN
|
||||
IF (coincidentNodes((/elemA%n2%n, elemA%n3%n, elemA%n4%n/), &
|
||||
nodesEdge)) THEN
|
||||
|
||||
elemA%e2 => elemB
|
||||
elemB%e1 => elemA
|
||||
vec1 = (/ elemA%x(3) - elemA%x(2), &
|
||||
elemA%y(3) - elemA%y(2), &
|
||||
elemA%z(3) - elemA%z(2) /)
|
||||
vec2 = (/ elemA%x(4) - elemA%x(2), &
|
||||
elemA%y(4) - elemA%y(2), &
|
||||
elemA%z(4) - elemA%z(2) /)
|
||||
normVol = crossProduct(vec1, vec2)
|
||||
normVol = normalize(normVol)
|
||||
|
||||
ELSEIF ((elemA%n1%n == elemB%n3%n .AND. &
|
||||
elemA%n2%n == elemB%n2%n .AND. &
|
||||
elemA%n4%n == elemB%n1%n) .OR. &
|
||||
(elemA%n1%n == elemB%n1%n .AND. &
|
||||
elemA%n2%n == elemB%n3%n .AND. &
|
||||
elemA%n4%n == elemB%n2%n) .OR. &
|
||||
(elemA%n1%n == elemB%n2%n .AND. &
|
||||
elemA%n2%n == elemB%n1%n .AND. &
|
||||
elemA%n4%n == elemB%n3%n)) THEN
|
||||
IF (DOT_PRODUCT(elemB%normal, normVol) == -1.D0) THEN
|
||||
|
||||
elemA%e2 => elemB
|
||||
elemB%e2 => elemA
|
||||
elemA%e2 => elemB
|
||||
elemB%e1 => elemA
|
||||
|
||||
!Revers the normal to point inside the domain
|
||||
elemB%normal = -elemB%normal
|
||||
ELSE
|
||||
|
||||
elemA%e2 => elemB
|
||||
elemB%e2 => elemA
|
||||
|
||||
!Revers the normal to point inside the domain
|
||||
elemB%normal = -elemB%normal
|
||||
|
||||
END IF
|
||||
|
||||
END IF
|
||||
|
||||
|
|
@ -438,66 +439,66 @@ MODULE moduleMesh3DCartRead
|
|||
|
||||
!Check surface 3
|
||||
IF (.NOT. ASSOCIATED(elemA%e3)) THEN
|
||||
IF ((elemA%n2%n == elemB%n1%n .AND. &
|
||||
elemA%n3%n == elemB%n2%n .AND. &
|
||||
elemA%n4%n == elemB%n3%n) .OR. &
|
||||
(elemA%n2%n == elemB%n3%n .AND. &
|
||||
elemA%n3%n == elemB%n1%n .AND. &
|
||||
elemA%n4%n == elemB%n2%n) .OR. &
|
||||
(elemA%n2%n == elemB%n2%n .AND. &
|
||||
elemA%n3%n == elemB%n3%n .AND. &
|
||||
elemA%n4%n == elemB%n1%n)) THEN
|
||||
IF (coincidentNodes((/elemA%n1%n, elemA%n2%n, elema%n4%n/), &
|
||||
nodesEdge)) THEN
|
||||
|
||||
elemA%e3 => elemB
|
||||
elemB%e1 => elemA
|
||||
vec1 = (/ elemA%x(2) - elemA%x(1), &
|
||||
elemA%y(2) - elemA%y(1), &
|
||||
elemA%z(2) - elemA%z(1) /)
|
||||
vec2 = (/ elemA%x(4) - elemA%x(1), &
|
||||
elemA%y(4) - elemA%y(1), &
|
||||
elemA%z(4) - elemA%z(1) /)
|
||||
normVol = crossProduct(vec1, vec2)
|
||||
normVol = normalize(normVol)
|
||||
|
||||
ELSEIF ((elemA%n2%n == elemB%n3%n .AND. &
|
||||
elemA%n3%n == elemB%n2%n .AND. &
|
||||
elemA%n4%n == elemB%n1%n) .OR. &
|
||||
(elemA%n2%n == elemB%n1%n .AND. &
|
||||
elemA%n3%n == elemB%n3%n .AND. &
|
||||
elemA%n4%n == elemB%n2%n) .OR. &
|
||||
(elemA%n2%n == elemB%n2%n .AND. &
|
||||
elemA%n3%n == elemB%n1%n .AND. &
|
||||
elemA%n4%n == elemB%n3%n)) THEN
|
||||
IF (DOT_PRODUCT(elemB%normal, normVol) == -1.D0) THEN
|
||||
|
||||
elemA%e3 => elemB
|
||||
elemB%e2 => elemA
|
||||
elemA%e3 => elemB
|
||||
elemB%e1 => elemA
|
||||
|
||||
!Revers the normal to point inside the domain
|
||||
elemB%normal = -elemB%normal
|
||||
ELSE
|
||||
|
||||
elemA%e3 => elemB
|
||||
elemB%e2 => elemA
|
||||
|
||||
!Revers the normal to point inside the domain
|
||||
elemB%normal = -elemB%normal
|
||||
|
||||
END IF
|
||||
|
||||
END IF
|
||||
|
||||
END IF
|
||||
|
||||
!Check surface 4
|
||||
IF (.NOT. ASSOCIATED(elemA%e3)) THEN
|
||||
IF ((elemA%n1%n == elemB%n1%n .AND. &
|
||||
elemA%n3%n == elemB%n2%n .AND. &
|
||||
elemA%n4%n == elemB%n3%n) .OR. &
|
||||
(elemA%n1%n == elemB%n3%n .AND. &
|
||||
elemA%n3%n == elemB%n1%n .AND. &
|
||||
elemA%n4%n == elemB%n2%n) .OR. &
|
||||
(elemA%n1%n == elemB%n2%n .AND. &
|
||||
elemA%n3%n == elemB%n3%n .AND. &
|
||||
elemA%n4%n == elemB%n1%n)) THEN
|
||||
IF (.NOT. ASSOCIATED(elemA%e4)) THEN
|
||||
IF (coincidentNodes((/elemA%n1%n, elemA%n3%n, elema%n4%n/), &
|
||||
nodesEdge)) THEN
|
||||
|
||||
elemA%e4 => elemB
|
||||
elemB%e1 => elemA
|
||||
vec1 = (/ elemA%x(3) - elemA%x(1), &
|
||||
elemA%y(3) - elemA%y(1), &
|
||||
elemA%z(3) - elemA%z(1) /)
|
||||
vec2 = (/ elemA%x(4) - elemA%x(1), &
|
||||
elemA%y(4) - elemA%y(1), &
|
||||
elemA%z(4) - elemA%z(1) /)
|
||||
normVol = crossProduct(vec1, vec2)
|
||||
normVol = normalize(normVol)
|
||||
|
||||
ELSEIF ((elemA%n1%n == elemB%n3%n .AND. &
|
||||
elemA%n3%n == elemB%n2%n .AND. &
|
||||
elemA%n4%n == elemB%n1%n) .OR. &
|
||||
(elemA%n1%n == elemB%n1%n .AND. &
|
||||
elemA%n3%n == elemB%n3%n .AND. &
|
||||
elemA%n4%n == elemB%n2%n) .OR. &
|
||||
(elemA%n1%n == elemB%n2%n .AND. &
|
||||
elemA%n3%n == elemB%n1%n .AND. &
|
||||
elemA%n4%n == elemB%n3%n)) THEN
|
||||
IF (DOT_PRODUCT(elemB%normal, normVol) == -1.D0) THEN
|
||||
|
||||
elemA%e4 => elemB
|
||||
elemB%e2 => elemA
|
||||
elemA%e4 => elemB
|
||||
elemB%e1 => elemA
|
||||
|
||||
|
||||
ELSE
|
||||
|
||||
elemA%e4 => elemB
|
||||
elemB%e2 => elemA
|
||||
|
||||
!Revers the normal to point inside the domain
|
||||
elemB%normal = -elemB%normal
|
||||
|
||||
END IF
|
||||
|
||||
END IF
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue