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
|
|
@ -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 \
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
42
src/modules/moduleMath.f90
Normal file
42
src/modules/moduleMath.f90
Normal 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
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue