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:
Jorge Gonzalez 2021-03-22 12:39:34 +01:00
commit db6b0a2c03
15 changed files with 349 additions and 265 deletions

View file

@ -3,7 +3,7 @@ OBJECTS = $(OBJDIR)/moduleMesh.o $(OBJDIR)/moduleMeshBoundary.o $(OBJDIR)/module
$(OBJDIR)/moduleErrors.o $(OBJDIR)/moduleList.o $(OBJDIR)/moduleOutput.o \ $(OBJDIR)/moduleErrors.o $(OBJDIR)/moduleList.o $(OBJDIR)/moduleOutput.o \
$(OBJDIR)/moduleBoundary.o $(OBJDIR)/moduleCaseParam.o $(OBJDIR)/moduleRefParam.o \ $(OBJDIR)/moduleBoundary.o $(OBJDIR)/moduleCaseParam.o $(OBJDIR)/moduleRefParam.o \
$(OBJDIR)/moduleCollisions.o $(OBJDIR)/moduleTable.o $(OBJDIR)/moduleParallel.o \ $(OBJDIR)/moduleCollisions.o $(OBJDIR)/moduleTable.o $(OBJDIR)/moduleParallel.o \
$(OBJDIR)/moduleEM.o $(OBJDIR)/moduleRandom.o \ $(OBJDIR)/moduleEM.o $(OBJDIR)/moduleRandom.o $(OBJDIR)/moduleMath.o \
$(OBJDIR)/moduleMesh3DCart.o $(OBJDIR)/moduleMesh3DCartRead.o \ $(OBJDIR)/moduleMesh3DCart.o $(OBJDIR)/moduleMesh3DCartRead.o \
$(OBJDIR)/moduleMesh2DCyl.o $(OBJDIR)/moduleMesh2DCylRead.o \ $(OBJDIR)/moduleMesh2DCyl.o $(OBJDIR)/moduleMesh2DCylRead.o \
$(OBJDIR)/moduleMesh2DCart.o $(OBJDIR)/moduleMesh2DCartRead.o \ $(OBJDIR)/moduleMesh2DCart.o $(OBJDIR)/moduleMesh2DCartRead.o \

View file

@ -2,11 +2,11 @@
OBJS = moduleCaseParam.o moduleCompTime.o moduleList.o \ OBJS = moduleCaseParam.o moduleCompTime.o moduleList.o \
moduleOutput.o moduleInput.o moduleSolver.o \ moduleOutput.o moduleInput.o moduleSolver.o \
moduleCollisions.o moduleTable.o moduleParallel.o \ moduleCollisions.o moduleTable.o moduleParallel.o \
moduleEM.o moduleRandom.o moduleEM.o moduleRandom.o moduleMath.o
all: $(OBJS) mesh.o all: $(OBJS) mesh.o
mesh.o: moduleCollisions.o moduleBoundary.o mesh.o: moduleCollisions.o moduleBoundary.o moduleMath.o
$(MAKE) -C mesh all $(MAKE) -C mesh all
moduleCollisions.o: moduleRandom.o moduleTable.o moduleSpecies.o moduleRefParam.o moduleConstParam.o moduleCollisions.f90 moduleCollisions.o: moduleRandom.o moduleTable.o moduleSpecies.o moduleRefParam.o moduleConstParam.o moduleCollisions.f90
@ -21,7 +21,7 @@ moduleInject.o: moduleRandom.o moduleSpecies.o moduleSolver.o moduleInject.f90
moduleList.o: moduleSpecies.o moduleErrors.o moduleList.f90 moduleList.o: moduleSpecies.o moduleErrors.o moduleList.f90
$(FC) $(FCFLAGS) -c $(subst .o,.f90,$@) -o $(OBJDIR)/$@ $(FC) $(FCFLAGS) -c $(subst .o,.f90,$@) -o $(OBJDIR)/$@
moduleOutput.o: moduleSpecies.o moduleRefParam.o moduleOutput.f90 moduleOutput.o: moduleMath.o moduleSpecies.o moduleRefParam.o moduleOutput.f90
$(FC) $(FCFLAGS) -c $(subst .o,.f90,$@) -o $(OBJDIR)/$@ $(FC) $(FCFLAGS) -c $(subst .o,.f90,$@) -o $(OBJDIR)/$@
moduleRandom.o: moduleConstParam.o moduleRandom.f90 moduleRandom.o: moduleConstParam.o moduleRandom.f90

View file

@ -148,7 +148,6 @@ MODULE moduleMesh1DCart
self%x = r1(1) self%x = r1(1)
self%normal = (/ 1.D0, 0.D0, 0.D0 /) self%normal = (/ 1.D0, 0.D0, 0.D0 /)
self%normal = self%normal/NORM2(self%normal)
!Boundary index !Boundary index
self%boundary => boundary(bt) self%boundary => boundary(bt)
@ -176,11 +175,11 @@ MODULE moduleMesh1DCart
END FUNCTION getNodes1DCart END FUNCTION getNodes1DCart
PURE FUNCTION intersection1DCart(self, r0, v0) RESULT(r) PURE FUNCTION intersection1DCart(self, r0) RESULT(r)
IMPLICIT NONE IMPLICIT NONE
CLASS(meshEdge1DCart), INTENT(in):: self CLASS(meshEdge1DCart), 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):: r
r = (/ self%x, 0.D0, 0.D0 /) r = (/ self%x, 0.D0, 0.D0 /)
@ -383,7 +382,7 @@ MODULE moduleMesh1DCart
END FUNCTION insideSegm END FUNCTION insideSegm
SUBROUTINE scatterSegm(self, part) SUBROUTINE scatterSegm(self, part)
USE moduleOutput USE moduleMath
USE moduleSpecies USE moduleSpecies
IMPLICIT NONE IMPLICIT NONE

View file

@ -7,6 +7,9 @@ MODULE moduleMesh1DRad
USE moduleMeshBoundary USE moduleMeshBoundary
IMPLICIT NONE IMPLICIT NONE
REAL(8), PARAMETER:: corSeg(1:3) = (/ -DSQRT(3.D0/5.D0), 0.D0, DSQRT(3.D0/5.D0) /)
REAL(8), PARAMETER:: wSeg(1:3) = (/ 5.D0/9.D0 , 8.D0/9.D0, 5.D0/9.D0 /)
TYPE, PUBLIC, EXTENDS(meshNode):: meshNode1DRad TYPE, PUBLIC, EXTENDS(meshNode):: meshNode1DRad
!Element coordinates !Element coordinates
REAL(8):: r = 0.D0 REAL(8):: r = 0.D0
@ -174,11 +177,11 @@ MODULE moduleMesh1DRad
END FUNCTION getNodes1DRad END FUNCTION getNodes1DRad
PURE FUNCTION intersection1DRad(self, r0, v0) RESULT(r) PURE FUNCTION intersection1DRad(self, r0) RESULT(r)
IMPLICIT NONE IMPLICIT NONE
CLASS(meshEdge1DRad), INTENT(in):: self CLASS(meshEdge1DRad), 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):: r
r = (/ self%r, 0.D0, 0.D0 /) r = (/ self%r, 0.D0, 0.D0 /)
@ -317,19 +320,26 @@ MODULE moduleMesh1DRad
REAL(8):: ke(1:2,1:2) REAL(8):: ke(1:2,1:2)
REAL(8):: Xii(1:3) REAL(8):: Xii(1:3)
REAL(8):: dPsi(1:1, 1:2) REAL(8):: dPsi(1:1, 1:2)
REAL(8):: invJ REAL(8):: invJ(1), detJ
REAL(8):: r, fPsi(1:2) REAL(8):: r, fPsi(1:2)
INTEGER:: l
ke = 0.D0 ke = 0.D0
Xii = 0.D0 Xii = 0.D0
DO l = 1, 3
xii(1) = corSeg(l)
dPsi = self%dPsi(Xii) dPsi = self%dPsi(Xii)
detJ = self%detJac(Xii, dPsi)
invJ = self%invJac(Xii, dPsi) invJ = self%invJac(Xii, dPsi)
fPsi = self%fPsi(Xii) fPsi = self%fPsi(Xii)
r = DOT_PRODUCT(fPsi, self%r) r = DOT_PRODUCT(fPsi, self%r)
ke(1,:) = (/ dPsi(1,1)*dPsi(1,1), dPsi(1,1)*dPsi(1,2) /) ke = ke + MATMUL(RESHAPE(MATMUL(invJ,dPsi), (/ 2, 1/)), &
ke(2,:) = (/ dPsi(1,2)*dPsi(1,1), dPsi(1,2)*dPsi(1,2) /) RESHAPE(MATMUL(invJ,dPsi), (/ 1, 2/)))* &
ke = 2.D0*ke*invJ r*wSeg(l)/detJ
ke = ke*r*PI2
END DO
ke = ke*PI2
END FUNCTION elemKRad END FUNCTION elemKRad
@ -341,17 +351,23 @@ MODULE moduleMesh1DRad
REAL(8), INTENT(in):: source(1:) REAL(8), INTENT(in):: source(1:)
REAL(8), ALLOCATABLE:: localF(:) REAL(8), ALLOCATABLE:: localF(:)
REAL(8):: fPsi(1:2) REAL(8):: fPsi(1:2)
REAL(8):: r REAL(8):: detJ, f, r
REAL(8):: detJ
REAL(8):: Xii(1:3) REAL(8):: Xii(1:3)
INTEGER:: l
Xii = 0.D0
fPsi = self%fPsi(Xii)
detJ = self%detJac(Xii)
r = DOT_PRODUCT(fPsi,self%r)
ALLOCATE(localF(1:2)) ALLOCATE(localF(1:2))
localF = 2.D0*DOT_PRODUCT(fPsi, source)*detJ localF = 0.D0
localF = localF*r*PI2 Xii = 0.D0
DO l = 1, 3
xii(1) = corSeg(l)
detJ = self%detJac(Xii)
fPsi = self%fPsi(Xii)
r = DOT_PRODUCT(fPsi, self%r)
f = DOT_PRODUCT(fPsi, source)
localF = localF + f*fPsi*r*wSeg(l)*detJ
END DO
END FUNCTION elemFRad END FUNCTION elemFRad
@ -377,7 +393,7 @@ MODULE moduleMesh1DRad
END FUNCTION insideRad END FUNCTION insideRad
SUBROUTINE scatterRad(self, part) SUBROUTINE scatterRad(self, part)
USE moduleOutput USE moduleMath
USE moduleSpecies USE moduleSpecies
IMPLICIT NONE IMPLICIT NONE

View file

@ -190,7 +190,7 @@ MODULE moduleMesh2DCart
self%x = (/r1(1), r2(1)/) self%x = (/r1(1), r2(1)/)
self%y = (/r1(2), r2(2)/) self%y = (/r1(2), r2(2)/)
!Normal vector !Normal vector
self%normal = (/ self%y(2)-self%y(1), & self%normal = (/ -(self%y(2)-self%y(1)), &
self%x(2)-self%x(1) , & self%x(2)-self%x(1) , &
0.D0 /) 0.D0 /)
self%normal = self%normal/NORM2(self%normal) self%normal = self%normal/NORM2(self%normal)
@ -243,20 +243,21 @@ MODULE moduleMesh2DCart
END FUNCTION getNodes2DCart END FUNCTION getNodes2DCart
PURE FUNCTION intersection2DCartEdge(self, r0, v0) RESULT(r) PURE FUNCTION intersection2DCartEdge(self, r0) RESULT(r)
IMPLICIT NONE IMPLICIT NONE
CLASS(meshEdge2DCart), INTENT(in):: self CLASS(meshEdge2DCart), 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):: r
REAL(8), DIMENSION(1:3):: rS !base point of surface REAL(8), DIMENSION(1:3):: edge0, edgeV
REAL(8):: d REAL(8):: tI
rS = (/ self%x(1), self%y(1), 0.D0 /) edge0 = (/self%x(1), self%y(1), 0.D0 /)
edgeV = (/self%x(2), self%y(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 intersection2DCartEdge END FUNCTION intersection2DCartEdge
@ -496,7 +497,7 @@ MODULE moduleMesh2DCart
!Scatter properties of particle into element nodes !Scatter properties of particle into element nodes
SUBROUTINE scatterQuad(self, part) SUBROUTINE scatterQuad(self, part)
USE moduleOutput USE moduleMath
USE moduleSpecies USE moduleSpecies
IMPLICIT NONE IMPLICIT NONE
@ -855,7 +856,7 @@ MODULE moduleMesh2DCart
!Scatter properties of particles into element !Scatter properties of particles into element
SUBROUTINE scatterTria(self, part) SUBROUTINE scatterTria(self, part)
USE moduleOutput USE moduleMath
USE moduleSpecies USE moduleSpecies
IMPLICIT NONE IMPLICIT NONE

View file

@ -437,15 +437,15 @@ MODULE moduleMesh2DCartRead
IF (elemA%n1%n == elemB%n1%n .AND. & IF (elemA%n1%n == elemB%n1%n .AND. &
elemA%n2%n == elemB%n2%n) THEN elemA%n2%n == elemB%n2%n) THEN
elemA%e1 => elemB elemA%e1 => elemB
elemB%e2 => elemA elemB%e1 => elemA
!Revers the normal to point inside the domain
elemB%normal = - elemB%normal
ELSEIF (elemA%n1%n == elemB%n2%n .AND. & ELSEIF (elemA%n1%n == elemB%n2%n .AND. &
elemA%n2%n == elemB%n1%n) THEN elemA%n2%n == elemB%n1%n) THEN
elemA%e1 => elemB elemA%e1 => elemB
elemB%e1 => elemA elemB%e2 => elemA
!Revers the normal to point inside the domain
elemB%normal = - elemB%normal
END IF END IF
@ -456,15 +456,15 @@ MODULE moduleMesh2DCartRead
IF (elemA%n2%n == elemB%n1%n .AND. & IF (elemA%n2%n == elemB%n1%n .AND. &
elemA%n3%n == elemB%n2%n) THEN elemA%n3%n == elemB%n2%n) THEN
elemA%e2 => elemB elemA%e2 => elemB
elemB%e2 => elemA elemB%e1 => elemA
!Revers the normal to point inside the domain
elemB%normal = - elemB%normal
ELSEIF (elemA%n2%n == elemB%n2%n .AND. & ELSEIF (elemA%n2%n == elemB%n2%n .AND. &
elemA%n3%n == elemB%n1%n) THEN elemA%n3%n == elemB%n1%n) THEN
elemA%e2 => elemB elemA%e2 => elemB
elemB%e1 => elemA elemB%e2 => elemA
!Revers the normal to point inside the domain
elemB%normal = - elemB%normal
END IF END IF
@ -475,15 +475,15 @@ MODULE moduleMesh2DCartRead
IF (elemA%n3%n == elemB%n1%n .AND. & IF (elemA%n3%n == elemB%n1%n .AND. &
elemA%n4%n == elemB%n2%n) THEN elemA%n4%n == elemB%n2%n) THEN
elemA%e3 => elemB elemA%e3 => elemB
elemB%e2 => elemA elemB%e1 => elemA
!Revers the normal to point inside the domain
elemB%normal = - elemB%normal
ELSEIF (elemA%n3%n == elemB%n2%n .AND. & ELSEIF (elemA%n3%n == elemB%n2%n .AND. &
elemA%n4%n == elemB%n1%n) THEN elemA%n4%n == elemB%n1%n) THEN
elemA%e3 => elemB elemA%e3 => elemB
elemB%e1 => elemA elemB%e2 => elemA
!Revers the normal to point inside the domain
elemB%normal = - elemB%normal
END IF END IF
@ -494,15 +494,15 @@ MODULE moduleMesh2DCartRead
IF (elemA%n4%n == elemB%n1%n .AND. & IF (elemA%n4%n == elemB%n1%n .AND. &
elemA%n1%n == elemB%n2%n) THEN elemA%n1%n == elemB%n2%n) THEN
elemA%e4 => elemB elemA%e4 => elemB
elemB%e2 => elemA elemB%e1 => elemA
!Revers the normal to point inside the domain
elemB%normal = - elemB%normal
ELSEIF (elemA%n4%n == elemB%n2%n .AND. & ELSEIF (elemA%n4%n == elemB%n2%n .AND. &
elemA%n1%n == elemB%n1%n) THEN elemA%n1%n == elemB%n1%n) THEN
elemA%e4 => elemB elemA%e4 => elemB
elemB%e1 => elemA elemB%e2 => elemA
!Revers the normal to point inside the domain
elemB%normal = - elemB%normal
END IF END IF
@ -521,15 +521,15 @@ MODULE moduleMesh2DCartRead
IF (elemA%n1%n == elemB%n1%n .AND. & IF (elemA%n1%n == elemB%n1%n .AND. &
elemA%n2%n == elemB%n2%n) THEN elemA%n2%n == elemB%n2%n) THEN
elemA%e1 => elemB elemA%e1 => elemB
elemB%e2 => elemA elemB%e1 => elemA
!Revers the normal to point inside the domain
elemB%normal = - elemB%normal
ELSEIF (elemA%n1%n == elemB%n2%n .AND. & ELSEIF (elemA%n1%n == elemB%n2%n .AND. &
elemA%n2%n == elemB%n1%n) THEN elemA%n2%n == elemB%n1%n) THEN
elemA%e1 => elemB elemA%e1 => elemB
elemB%e1 => elemA elemB%e2 => elemA
!Revers the normal to point inside the domain
elemB%normal = - elemB%normal
END IF END IF
@ -540,15 +540,15 @@ MODULE moduleMesh2DCartRead
IF (elemA%n2%n == elemB%n1%n .AND. & IF (elemA%n2%n == elemB%n1%n .AND. &
elemA%n3%n == elemB%n2%n) THEN elemA%n3%n == elemB%n2%n) THEN
elemA%e2 => elemB elemA%e2 => elemB
elemB%e2 => elemA elemB%e1 => elemA
!Revers the normal to point inside the domain
elemB%normal = - elemB%normal
ELSEIF (elemA%n2%n == elemB%n2%n .AND. & ELSEIF (elemA%n2%n == elemB%n2%n .AND. &
elemA%n3%n == elemB%n1%n) THEN elemA%n3%n == elemB%n1%n) THEN
elemA%e2 => elemB elemA%e2 => elemB
elemB%e1 => elemA elemB%e2 => elemA
!Revers the normal to point inside the domain
elemB%normal = - elemB%normal
END IF END IF
@ -559,15 +559,15 @@ MODULE moduleMesh2DCartRead
IF (elemA%n3%n == elemB%n1%n .AND. & IF (elemA%n3%n == elemB%n1%n .AND. &
elemA%n1%n == elemB%n2%n) THEN elemA%n1%n == elemB%n2%n) THEN
elemA%e3 => elemB elemA%e3 => elemB
elemB%e2 => elemA elemB%e1 => elemA
!Revers the normal to point inside the domain
elemB%normal = - elemB%normal
ELSEIF (elemA%n3%n == elemB%n2%n .AND. & ELSEIF (elemA%n3%n == elemB%n2%n .AND. &
elemA%n1%n == elemB%n1%n) THEN elemA%n1%n == elemB%n1%n) THEN
elemA%e3 => elemB elemA%e3 => elemB
elemB%e1 => elemA elemB%e2 => elemA
!Revers the normal to point inside the domain
elemB%normal = - elemB%normal
END IF END IF

View file

@ -191,7 +191,7 @@ MODULE moduleMesh2DCyl
self%z = (/r1(1), r2(1)/) self%z = (/r1(1), r2(1)/)
self%r = (/r1(2), r2(2)/) self%r = (/r1(2), r2(2)/)
!Normal vector !Normal vector
self%normal = (/ self%r(2)-self%r(1), & self%normal = (/ -(self%r(2)-self%r(1)), &
self%z(2)-self%z(1) , & self%z(2)-self%z(1) , &
0.D0 /) 0.D0 /)
self%normal = self%normal/NORM2(self%normal) self%normal = self%normal/NORM2(self%normal)
@ -221,20 +221,22 @@ MODULE moduleMesh2DCyl
END FUNCTION getNodes2DCyl END FUNCTION getNodes2DCyl
PURE FUNCTION intersection2DCylEdge(self, r0, v0) RESULT(r) PURE FUNCTION intersection2DCylEdge(self, r0) RESULT(r)
USE moduleMath
IMPLICIT NONE IMPLICIT NONE
CLASS(meshEdge2DCyl), INTENT(in):: self 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):: r
REAL(8), DIMENSION(1:3):: rS !base point of surface REAL(8), DIMENSION(1:3):: edge0, edgeV
REAL(8):: d 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 END FUNCTION intersection2DCylEdge
@ -507,7 +509,7 @@ MODULE moduleMesh2DCyl
!Scatter properties of particle into element nodes !Scatter properties of particle into element nodes
SUBROUTINE scatterQuad(self, part) SUBROUTINE scatterQuad(self, part)
USE moduleOutput USE moduleMath
USE moduleSpecies USE moduleSpecies
IMPLICIT NONE IMPLICIT NONE
@ -874,7 +876,7 @@ MODULE moduleMesh2DCyl
!Scatter properties of particles into element !Scatter properties of particles into element
SUBROUTINE scatterTria(self, part) SUBROUTINE scatterTria(self, part)
USE moduleOutput USE moduleMath
USE moduleSpecies USE moduleSpecies
IMPLICIT NONE IMPLICIT NONE

View file

@ -217,6 +217,29 @@ MODULE moduleMesh2DCylRead
END SUBROUTINE connectedVolEdge 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) SUBROUTINE connectedQuadQuad(elemA, elemB)
IMPLICIT NONE IMPLICIT NONE
@ -437,15 +460,15 @@ MODULE moduleMesh2DCylRead
IF (elemA%n1%n == elemB%n1%n .AND. & IF (elemA%n1%n == elemB%n1%n .AND. &
elemA%n2%n == elemB%n2%n) THEN elemA%n2%n == elemB%n2%n) THEN
elemA%e1 => elemB elemA%e1 => elemB
elemB%e2 => elemA elemB%e1 => elemA
!Revers the normal to point inside the domain
elemB%normal = - elemB%normal
ELSEIF (elemA%n1%n == elemB%n2%n .AND. & ELSEIF (elemA%n1%n == elemB%n2%n .AND. &
elemA%n2%n == elemB%n1%n) THEN elemA%n2%n == elemB%n1%n) THEN
elemA%e1 => elemB elemA%e1 => elemB
elemB%e1 => elemA elemB%e2 => elemA
!Revers the normal to point inside the domain
elemB%normal = - elemB%normal
END IF END IF
@ -456,15 +479,15 @@ MODULE moduleMesh2DCylRead
IF (elemA%n2%n == elemB%n1%n .AND. & IF (elemA%n2%n == elemB%n1%n .AND. &
elemA%n3%n == elemB%n2%n) THEN elemA%n3%n == elemB%n2%n) THEN
elemA%e2 => elemB elemA%e2 => elemB
elemB%e2 => elemA elemB%e1 => elemA
!Revers the normal to point inside the domain
elemB%normal = - elemB%normal
ELSEIF (elemA%n2%n == elemB%n2%n .AND. & ELSEIF (elemA%n2%n == elemB%n2%n .AND. &
elemA%n3%n == elemB%n1%n) THEN elemA%n3%n == elemB%n1%n) THEN
elemA%e2 => elemB elemA%e2 => elemB
elemB%e1 => elemA elemB%e2 => elemA
!Revers the normal to point inside the domain
elemB%normal = - elemB%normal
END IF END IF
@ -475,15 +498,15 @@ MODULE moduleMesh2DCylRead
IF (elemA%n3%n == elemB%n1%n .AND. & IF (elemA%n3%n == elemB%n1%n .AND. &
elemA%n4%n == elemB%n2%n) THEN elemA%n4%n == elemB%n2%n) THEN
elemA%e3 => elemB elemA%e3 => elemB
elemB%e2 => elemA elemB%e1 => elemA
!Revers the normal to point inside the domain
elemB%normal = - elemB%normal
ELSEIF (elemA%n3%n == elemB%n2%n .AND. & ELSEIF (elemA%n3%n == elemB%n2%n .AND. &
elemA%n4%n == elemB%n1%n) THEN elemA%n4%n == elemB%n1%n) THEN
elemA%e3 => elemB elemA%e3 => elemB
elemB%e1 => elemA elemB%e2 => elemA
!Revers the normal to point inside the domain
elemB%normal = - elemB%normal
END IF END IF
@ -494,12 +517,15 @@ MODULE moduleMesh2DCylRead
IF (elemA%n4%n == elemB%n1%n .AND. & IF (elemA%n4%n == elemB%n1%n .AND. &
elemA%n1%n == elemB%n2%n) THEN elemA%n1%n == elemB%n2%n) THEN
elemA%e4 => elemB elemA%e4 => elemB
elemB%e2 => elemA elemB%e1 => elemA
ELSEIF (elemA%n4%n == elemB%n2%n .AND. & ELSEIF (elemA%n4%n == elemB%n2%n .AND. &
elemA%n1%n == elemB%n1%n) THEN elemA%n1%n == elemB%n1%n) THEN
elemA%e4 => elemB elemA%e4 => elemB
elemB%e1 => elemA elemB%e2 => elemA
!Revers the normal to point inside the domain
elemB%normal = - elemB%normal
END IF END IF
@ -518,15 +544,15 @@ MODULE moduleMesh2DCylRead
IF (elemA%n1%n == elemB%n1%n .AND. & IF (elemA%n1%n == elemB%n1%n .AND. &
elemA%n2%n == elemB%n2%n) THEN elemA%n2%n == elemB%n2%n) THEN
elemA%e1 => elemB elemA%e1 => elemB
elemB%e2 => elemA elemB%e1 => elemA
!Revers the normal to point inside the domain
elemB%normal = - elemB%normal
ELSEIF (elemA%n1%n == elemB%n2%n .AND. & ELSEIF (elemA%n1%n == elemB%n2%n .AND. &
elemA%n2%n == elemB%n1%n) THEN elemA%n2%n == elemB%n1%n) THEN
elemA%e1 => elemB elemA%e1 => elemB
elemB%e1 => elemA elemB%e2 => elemA
!Revers the normal to point inside the domain
elemB%normal = - elemB%normal
END IF END IF
@ -537,15 +563,15 @@ MODULE moduleMesh2DCylRead
IF (elemA%n2%n == elemB%n1%n .AND. & IF (elemA%n2%n == elemB%n1%n .AND. &
elemA%n3%n == elemB%n2%n) THEN elemA%n3%n == elemB%n2%n) THEN
elemA%e2 => elemB elemA%e2 => elemB
elemB%e2 => elemA elemB%e1 => elemA
!Revers the normal to point inside the domain
elemB%normal = - elemB%normal
ELSEIF (elemA%n2%n == elemB%n2%n .AND. & ELSEIF (elemA%n2%n == elemB%n2%n .AND. &
elemA%n3%n == elemB%n1%n) THEN elemA%n3%n == elemB%n1%n) THEN
elemA%e2 => elemB elemA%e2 => elemB
elemB%e1 => elemA elemB%e2 => elemA
!Revers the normal to point inside the domain
elemB%normal = - elemB%normal
END IF END IF
@ -556,15 +582,15 @@ MODULE moduleMesh2DCylRead
IF (elemA%n3%n == elemB%n1%n .AND. & IF (elemA%n3%n == elemB%n1%n .AND. &
elemA%n1%n == elemB%n2%n) THEN elemA%n1%n == elemB%n2%n) THEN
elemA%e3 => elemB elemA%e3 => elemB
elemB%e2 => elemA elemB%e1 => elemA
!Revers the normal to point inside the domain
elemB%normal = - elemB%normal
ELSEIF (elemA%n3%n == elemB%n2%n .AND. & ELSEIF (elemA%n3%n == elemB%n2%n .AND. &
elemA%n1%n == elemB%n1%n) THEN elemA%n1%n == elemB%n1%n) THEN
elemA%e3 => elemB elemA%e3 => elemB
elemB%e1 => elemA elemB%e2 => elemA
!Revers the normal to point inside the domain
elemB%normal = - elemB%normal
END IF END IF

View file

@ -134,6 +134,7 @@ MODULE moduleMesh3DCart
USE moduleSpecies USE moduleSpecies
USE moduleBoundary USE moduleBoundary
USE moduleErrors USE moduleErrors
USE moduleMath
IMPLICIT NONE IMPLICIT NONE
CLASS(meshEdge3DCartTria), INTENT(out):: self CLASS(meshEdge3DCartTria), INTENT(out):: self
@ -142,6 +143,7 @@ MODULE moduleMesh3DCart
INTEGER, INTENT(in):: bt INTEGER, INTENT(in):: bt
INTEGER, INTENT(in):: physicalSurface INTEGER, INTENT(in):: physicalSurface
REAL(8), DIMENSION(1:3):: r1, r2, r3 REAL(8), DIMENSION(1:3):: r1, r2, r3
REAL(8), DIMENSION(1:3):: vec1, vec2
INTEGER:: s INTEGER:: s
self%n = n self%n = n
@ -156,10 +158,14 @@ MODULE moduleMesh3DCart
self%y = (/r1(2), r2(2), r3(2)/) self%y = (/r1(2), r2(2), r3(2)/)
self%z = (/r1(3), r2(3), r3(3)/) self%z = (/r1(3), r2(3), r3(3)/)
!Normal vector !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)), & vec1 = (/ self%x(2) - self%x(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%y(2) - self%y(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%z(2) - self%z(1) /)
self%normal = self%normal/NORM2(self%normal) 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 !Boundary index
self%boundary => boundary(bt) self%boundary => boundary(bt)
@ -187,20 +193,21 @@ MODULE moduleMesh3DCart
END FUNCTION getNodes3DCartTria END FUNCTION getNodes3DCartTria
PURE FUNCTION intersection3DCartTria(self, r0, v0) RESULT(r) PURE FUNCTION intersection3DCartTria(self, r0) RESULT(r)
IMPLICIT NONE IMPLICIT NONE
CLASS(meshEdge3DCartTria), INTENT(in):: self 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):: r
REAL(8), DIMENSION(1:3):: rS !base point of surface REAL(8), DIMENSION(1:3):: edge0, edgeV
REAL(8):: d 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 END FUNCTION intersection3DCartTria
@ -476,7 +483,7 @@ MODULE moduleMesh3DCart
END FUNCTION insideTetra END FUNCTION insideTetra
SUBROUTINE scatterTetra(self, part) SUBROUTINE scatterTetra(self, part)
USE moduleOutput USE moduleMath
USE moduleSpecies USE moduleSpecies
IMPLICIT NONE IMPLICIT NONE
@ -577,7 +584,7 @@ MODULE moduleMesh3DCart
INTEGER:: nextInt INTEGER:: nextInt
!TODO: Review when connectivity !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) nextInt = MINLOC(xiArray, 1)
NULLIFY(nextElement) NULLIFY(nextElement)
SELECT CASE(nextInt) SELECT CASE(nextInt)
@ -647,9 +654,11 @@ MODULE moduleMesh3DCart
invJ(2,2) = (dx(1)*dz(3) - dx(3)*dz(1)) invJ(2,2) = (dx(1)*dz(3) - dx(3)*dz(1))
invJ(2,3) = -(dx(1)*dz(2) - dx(2)*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,1) = (dx(2)*dy(3) - dx(3)*dy(2))
invJ(3,2) = (dx(1)*dy(3) - dx(3)*dy(1)) invJ(3,2) = -(dx(1)*dy(3) - dx(3)*dy(1))
invJ(3,3) = -(dx(1)*dy(2) - dx(2)*dy(1)) invJ(3,3) = (dx(1)*dy(2) - dx(2)*dy(1))
invJ = TRANSPOSE(invJ)
END FUNCTION invJ3DCart END FUNCTION invJ3DCart

View file

@ -269,25 +269,25 @@ MODULE moduleMesh3DCartRead
!Check surface 2 !Check surface 2
IF (.NOT. ASSOCIATED(elemA%e2)) THEN 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 (/elemB%n1%n, elemB%n2%n, elemB%n3%n/))) THEN
elemA%e2 => elemB elemA%e2 => elemB
elemB%e1 => elemA 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 (/elemB%n2%n, elemB%n3%n, elemB%n4%n/))) THEN
elemA%e2 => elemB elemA%e2 => elemB
elemB%e2 => elemA 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 (/elemB%n1%n, elemB%n2%n, elemB%n4%n/))) THEN
elemA%e2 => elemB elemA%e2 => elemB
elemB%e3 => elemA 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 (/elemB%n1%n, elemB%n3%n, elemB%n4%n/))) THEN
elemA%e2 => elemB elemA%e2 => elemB
@ -299,25 +299,25 @@ MODULE moduleMesh3DCartRead
!Check surface 3 !Check surface 3
IF (.NOT. ASSOCIATED(elemA%e3)) THEN 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 (/elemB%n1%n, elemB%n2%n, elemB%n3%n/))) THEN
elemA%e3 => elemB elemA%e3 => elemB
elemB%e1 => elemA 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 (/elemB%n2%n, elemB%n3%n, elemB%n4%n/))) THEN
elemA%e3 => elemB elemA%e3 => elemB
elemB%e2 => elemA 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 (/elemB%n1%n, elemB%n2%n, elemB%n4%n/))) THEN
elemA%e3 => elemB elemA%e3 => elemB
elemB%e3 => elemA 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 (/elemB%n1%n, elemB%n3%n, elemB%n4%n/))) THEN
elemA%e3 => elemB elemA%e3 => elemB
@ -328,7 +328,7 @@ MODULE moduleMesh3DCartRead
END IF END IF
!Check surface 4 !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/), & IF (coincidentNodes((/elemA%n1%n, elemA%n3%n, elemA%n4%n/), &
(/elemB%n1%n, elemB%n2%n, elemB%n3%n/))) THEN (/elemB%n1%n, elemB%n2%n, elemB%n3%n/))) THEN
@ -360,35 +360,37 @@ MODULE moduleMesh3DCartRead
END SUBROUTINE connectedTetraTetra END SUBROUTINE connectedTetraTetra
SUBROUTINE connectedTetraEdge(elemA, elemB) SUBROUTINE connectedTetraEdge(elemA, elemB)
USE moduleMath
IMPLICIT NONE IMPLICIT NONE
CLASS(meshVol3DCartTetra), INTENT(inout), TARGET:: elemA CLASS(meshVol3DCartTetra), INTENT(inout), TARGET:: elemA
CLASS(meshEdge3DCartTria), INTENT(inout), TARGET:: elemB 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 !Check surface 1
IF (.NOT. ASSOCIATED(elemA%e1)) THEN IF (.NOT. ASSOCIATED(elemA%e1)) THEN
IF ((elemA%n1%n == elemB%n1%n .AND. & IF (coincidentNodes((/elemA%n1%n, elemA%n2%n, elema%n3%n/), &
elemA%n2%n == elemB%n2%n .AND. & nodesEdge)) THEN
elemA%n3%n == elemB%n3%n) .OR. &
(elemA%n1%n == elemB%n3%n .AND. & vec1 = (/ elemA%x(2) - elemA%x(1), &
elemA%n2%n == elemB%n1%n .AND. & elemA%y(2) - elemA%y(1), &
elemA%n3%n == elemB%n2%n) .OR. & elemA%z(2) - elemA%z(1) /)
(elemA%n1%n == elemB%n2%n .AND. & vec2 = (/ elemA%x(3) - elemA%x(1), &
elemA%n2%n == elemB%n3%n .AND. & elemA%y(3) - elemA%y(1), &
elemA%n3%n == elemB%n1%n)) THEN elemA%z(3) - elemA%z(1) /)
normVol = crossProduct(vec1, vec2)
normVol = normalize(normVol)
IF (DOT_PRODUCT(elemB%normal, normVol) == -1.D0) THEN
elemA%e1 => elemB elemA%e1 => elemB
elemB%e1 => elemA elemB%e1 => elemA
ELSEIF ((elemA%n1%n == elemB%n3%n .AND. & ELSE
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
elemA%e1 => elemB elemA%e1 => elemB
elemB%e2 => elemA elemB%e2 => elemA
@ -398,33 +400,30 @@ MODULE moduleMesh3DCartRead
END IF END IF
END IF
END IF END IF
!Check surface 2 !Check surface 2
IF (.NOT. ASSOCIATED(elemA%e2)) THEN IF (.NOT. ASSOCIATED(elemA%e2)) THEN
IF ((elemA%n1%n == elemB%n1%n .AND. & IF (coincidentNodes((/elemA%n2%n, elemA%n3%n, elemA%n4%n/), &
elemA%n2%n == elemB%n2%n .AND. & nodesEdge)) THEN
elemA%n4%n == elemB%n3%n) .OR. &
(elemA%n1%n == elemB%n3%n .AND. & vec1 = (/ elemA%x(3) - elemA%x(2), &
elemA%n2%n == elemB%n1%n .AND. & elemA%y(3) - elemA%y(2), &
elemA%n4%n == elemB%n2%n) .OR. & elemA%z(3) - elemA%z(2) /)
(elemA%n1%n == elemB%n2%n .AND. & vec2 = (/ elemA%x(4) - elemA%x(2), &
elemA%n2%n == elemB%n3%n .AND. & elemA%y(4) - elemA%y(2), &
elemA%n4%n == elemB%n1%n)) THEN elemA%z(4) - elemA%z(2) /)
normVol = crossProduct(vec1, vec2)
normVol = normalize(normVol)
IF (DOT_PRODUCT(elemB%normal, normVol) == -1.D0) THEN
elemA%e2 => elemB elemA%e2 => elemB
elemB%e1 => elemA elemB%e1 => elemA
ELSEIF ((elemA%n1%n == elemB%n3%n .AND. & ELSE
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
elemA%e2 => elemB elemA%e2 => elemB
elemB%e2 => elemA elemB%e2 => elemA
@ -436,30 +435,28 @@ MODULE moduleMesh3DCartRead
END IF END IF
END IF
!Check surface 3 !Check surface 3
IF (.NOT. ASSOCIATED(elemA%e3)) THEN IF (.NOT. ASSOCIATED(elemA%e3)) THEN
IF ((elemA%n2%n == elemB%n1%n .AND. & IF (coincidentNodes((/elemA%n1%n, elemA%n2%n, elema%n4%n/), &
elemA%n3%n == elemB%n2%n .AND. & nodesEdge)) THEN
elemA%n4%n == elemB%n3%n) .OR. &
(elemA%n2%n == elemB%n3%n .AND. & vec1 = (/ elemA%x(2) - elemA%x(1), &
elemA%n3%n == elemB%n1%n .AND. & elemA%y(2) - elemA%y(1), &
elemA%n4%n == elemB%n2%n) .OR. & elemA%z(2) - elemA%z(1) /)
(elemA%n2%n == elemB%n2%n .AND. & vec2 = (/ elemA%x(4) - elemA%x(1), &
elemA%n3%n == elemB%n3%n .AND. & elemA%y(4) - elemA%y(1), &
elemA%n4%n == elemB%n1%n)) THEN elemA%z(4) - elemA%z(1) /)
normVol = crossProduct(vec1, vec2)
normVol = normalize(normVol)
IF (DOT_PRODUCT(elemB%normal, normVol) == -1.D0) THEN
elemA%e3 => elemB elemA%e3 => elemB
elemB%e1 => elemA elemB%e1 => elemA
ELSEIF ((elemA%n2%n == elemB%n3%n .AND. & ELSE
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
elemA%e3 => elemB elemA%e3 => elemB
elemB%e2 => elemA elemB%e2 => elemA
@ -471,34 +468,38 @@ MODULE moduleMesh3DCartRead
END IF END IF
END IF
!Check surface 4 !Check surface 4
IF (.NOT. ASSOCIATED(elemA%e3)) THEN IF (.NOT. ASSOCIATED(elemA%e4)) THEN
IF ((elemA%n1%n == elemB%n1%n .AND. & IF (coincidentNodes((/elemA%n1%n, elemA%n3%n, elema%n4%n/), &
elemA%n3%n == elemB%n2%n .AND. & nodesEdge)) THEN
elemA%n4%n == elemB%n3%n) .OR. &
(elemA%n1%n == elemB%n3%n .AND. & vec1 = (/ elemA%x(3) - elemA%x(1), &
elemA%n3%n == elemB%n1%n .AND. & elemA%y(3) - elemA%y(1), &
elemA%n4%n == elemB%n2%n) .OR. & elemA%z(3) - elemA%z(1) /)
(elemA%n1%n == elemB%n2%n .AND. & vec2 = (/ elemA%x(4) - elemA%x(1), &
elemA%n3%n == elemB%n3%n .AND. & elemA%y(4) - elemA%y(1), &
elemA%n4%n == elemB%n1%n)) THEN elemA%z(4) - elemA%z(1) /)
normVol = crossProduct(vec1, vec2)
normVol = normalize(normVol)
IF (DOT_PRODUCT(elemB%normal, normVol) == -1.D0) THEN
elemA%e4 => elemB elemA%e4 => elemB
elemB%e1 => elemA elemB%e1 => elemA
ELSEIF ((elemA%n1%n == elemB%n3%n .AND. &
elemA%n3%n == elemB%n2%n .AND. & ELSE
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
elemA%e4 => elemB elemA%e4 => elemB
elemB%e2 => elemA elemB%e2 => elemA
!Revers the normal to point inside the domain
elemB%normal = -elemB%normal
END IF
END IF END IF
END IF END IF

View file

@ -97,10 +97,10 @@ MODULE moduleMesh
END FUNCTION getNodesEdge_interface END FUNCTION getNodesEdge_interface
!Returns the intersecction between an edge and a line defined by point r0 and vector v0 !Returns the intersecction between an edge and a line defined by point r0 and vector v0
PURE FUNCTION intersectionEdge_interface(self, r0, v0) RESULT(r) PURE FUNCTION intersectionEdge_interface(self, r0) RESULT(r)
IMPORT:: meshEdge IMPORT:: meshEdge
CLASS(meshEdge), INTENT(in):: self CLASS(meshEdge), INTENT(in):: self
REAL(8), INTENT(in), DIMENSION(1:3):: r0, v0 REAL(8), INTENT(in), DIMENSION(1:3):: r0
REAL(8):: r(1:3) REAL(8):: r(1:3)
END FUNCTION intersectionEdge_interface END FUNCTION intersectionEdge_interface

View file

@ -13,30 +13,26 @@ MODULE moduleMeshBoundary
!rp = intersection between particle and edge !rp = intersection between particle and edge
!rpp = final position of particle !rpp = final position of particle
!vpp = final velocity of particle !vpp = final velocity of particle
REAL(8), DIMENSION(1:3):: rp, rpp, vpp REAL(8), DIMENSION(1:3):: rp, vpp
REAL(8):: tI
REAL(8):: taup !time step for reflecting process REAL(8):: taup !time step for reflecting process
!Reflect particle velocity !Reflect particle velocity
vpp = part%v - 2.D0*DOT_PRODUCT(part%v, edge%normal)*edge%normal vpp = part%v - 2.D0*DOT_PRODUCT(part%v, edge%normal)*edge%normal
!Computes the intersection between particle and surface
rp = edge%intersection(part%r, part%v)
!Computes the reflection time step
taup = NORM2(part%r - rp)*tau(part%sp)
!New position of particle
rpp = rp + vpp*taup
!assign new parameters to particle
part%r = rpp
part%v = vpp part%v = vpp
rp = edge%intersection(part%r)
part%r = 2.D0*(rp - part%r) + part%r
!particle is assumed to be inside
part%n_in = .TRUE. part%n_in = .TRUE.
END SUBROUTINE reflection END SUBROUTINE reflection
!Absoption in a surface !Absoption in a surface
SUBROUTINE absorption(edge, part) SUBROUTINE absorption(edge, part)
USE moduleCaseParam
USE moduleSpecies USE moduleSpecies
IMPLICIT NONE IMPLICIT NONE
@ -45,7 +41,7 @@ MODULE moduleMeshBoundary
REAL(8):: rpp(1:3) !Position of particle projected to the edge REAL(8):: rpp(1:3) !Position of particle projected to the edge
REAL(8):: d !Distance from particle to edge REAL(8):: d !Distance from particle to edge
rpp = edge%intersection(part%r, part%v) rpp = edge%intersection(part%r)
d = NORM2(rpp - part%r) d = NORM2(rpp - part%r)

View file

@ -200,6 +200,7 @@ MODULE moduleInject
USE moduleSolver USE moduleSolver
USE moduleMesh USE moduleMesh
USE moduleRandom USE moduleRandom
USE moduleErrors
IMPLICIT NONE IMPLICIT NONE
CLASS(injectGeneric), INTENT(in):: self CLASS(injectGeneric), INTENT(in):: self
@ -241,7 +242,7 @@ MODULE moduleInject
partInj(n)%vol = randomEdge%e2%n partInj(n)%vol = randomEdge%e2%n
ELSE ELSE
PRINT *, "ERROR NO VOL ASSOCIATED TO EDGE" CALL criticalError("No Volume associated to edge", 'addParticles')
END IF END IF

View file

@ -0,0 +1,42 @@
MODULE moduleMath
IMPLICIT NONE
CONTAINS
!Outer product of two tensors
PURE FUNCTION outerProduct(a,b) RESULT(s)
IMPLICIT NONE
REAL(8), DIMENSION(1:3), INTENT(in):: a, b
REAL(8):: s(1:3,1:3)
s = SPREAD(a, dim = 2, ncopies = 3)*SPREAD(b, dim = 1, ncopies = 3)
END FUNCTION outerProduct
!Cross product of two 3D vectors
PURE FUNCTION crossProduct(a, b) RESULT(c)
IMPLICIT NONE
REAL(8), DIMENSION(1:3), INTENT(in):: a, b
REAL(8), DIMENSION(1:3):: c
c = 0.D0
c(1) = a(2)*b(3) - a(3)*b(2)
c(2) = -(a(1)*b(3) - a(3)*b(1))
c(3) = a(1)*b(2) - a(2)*b(1)
END FUNCTION crossProduct
!Normalizes a 3D vector
PURE FUNCTION normalize(a) RESULT(b)
IMPLICIT NONE
REAL(8), DIMENSION(1:3), INTENT(in):: a
REAL(8), DIMENSION(1:3):: b
b = a / NORM2(a)
END FUNCTION normalize
END MODULE moduleMath

View file

@ -31,16 +31,6 @@ MODULE moduleOutput
LOGICAL:: emOutput = .FALSE. LOGICAL:: emOutput = .FALSE.
CONTAINS CONTAINS
FUNCTION outerProduct(a,b) RESULT(s)
IMPLICIT NONE
REAL(8), DIMENSION(1:3):: a, b
REAL(8):: s(1:3,1:3)
s = SPREAD(a, dim = 2, ncopies = 3)*SPREAD(b, dim = 1, ncopies = 3)
END FUNCTION outerProduct
FUNCTION tensorTrace(a) RESULT(t) FUNCTION tensorTrace(a) RESULT(t)
IMPLICIT NONE IMPLICIT NONE
@ -56,6 +46,7 @@ MODULE moduleOutput
USE moduleConstParam USE moduleConstParam
USE moduleRefParam USE moduleRefParam
USE moduleSpecies USE moduleSpecies
USE moduleMath
IMPLICIT NONE IMPLICIT NONE
TYPE(outputNode), INTENT(in):: rawValues TYPE(outputNode), INTENT(in):: rawValues