Reduction in pushing
Reduction in 10-20% of time spend in pushing in 2DCyl thanks to rewriting fPsi and dPsi.
This commit is contained in:
parent
0db76083ec
commit
2486ef6316
18 changed files with 1289 additions and 1280 deletions
|
|
@ -31,26 +31,19 @@ MODULE moduleMesh3DCart
|
|||
|
||||
END TYPE meshEdge3DCartTria
|
||||
|
||||
TYPE, PUBLIC, ABSTRACT, EXTENDS(meshVol):: meshVol3DCart
|
||||
TYPE, PUBLIC, ABSTRACT, EXTENDS(meshCell):: meshCell3DCart
|
||||
CONTAINS
|
||||
PROCEDURE, PASS:: detJac => detJ3DCart
|
||||
PROCEDURE, PASS:: invJac => invJ3DCart
|
||||
PROCEDURE(dPsi_interface), DEFERRED, NOPASS:: dPsi
|
||||
PROCEDURE(partialDer_interface), DEFERRED, PASS:: partialDer
|
||||
|
||||
END TYPE meshVol3DCart
|
||||
END TYPE meshCell3DCart
|
||||
|
||||
ABSTRACT INTERFACE
|
||||
PURE FUNCTION dPsi_interface(Xi) RESULT(dPsi)
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
REAL(8), ALLOCATABLE:: dPsi(:,:)
|
||||
|
||||
END FUNCTION dPsi_interface
|
||||
|
||||
PURE SUBROUTINE partialDer_interface(self, dPsi, dx, dy, dz)
|
||||
IMPORT meshVol3DCart
|
||||
CLASS(meshVol3DCart), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: dPsi(1:,1:)
|
||||
IMPORT meshCell3DCart
|
||||
CLASS(meshCell3DCart), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: dPsi(1:3,1:self%nNodes)
|
||||
REAL(8), INTENT(out), DIMENSION(1:3):: dx, dy, dz
|
||||
|
||||
END SUBROUTINE partialDer_interface
|
||||
|
|
@ -58,7 +51,7 @@ MODULE moduleMesh3DCart
|
|||
END INTERFACE
|
||||
|
||||
!Tetrahedron volume element
|
||||
TYPE, PUBLIC, EXTENDS(meshVol3DCart):: meshVol3DCartTetra
|
||||
TYPE, PUBLIC, EXTENDS(meshCell3DCart):: meshCell3DCartTetra
|
||||
!Element Coordinates
|
||||
REAL(8):: x(1:4) = 0.D0, y(1:4) = 0.D0, z(1:4) = 0.D0
|
||||
!Connectivity to nodes
|
||||
|
|
@ -66,24 +59,24 @@ MODULE moduleMesh3DCart
|
|||
!Connectivity to adjacent elements
|
||||
CLASS(meshElement), POINTER:: e1 => NULL(), e2 => NULL(), e3 => NULL(), e4 => NULL()
|
||||
CONTAINS
|
||||
PROCEDURE, PASS:: init => initVolTetra3DCart
|
||||
PROCEDURE, PASS:: randPos => randPosVolTetra
|
||||
PROCEDURE, PASS:: calcVol => volumeTetra
|
||||
PROCEDURE, NOPASS:: fPsi => fPsiTetra
|
||||
PROCEDURE, NOPASS:: dPsi => dPsiTetra
|
||||
PROCEDURE, NOPASS:: dPsiXi1 => dPsiTetraXi1
|
||||
PROCEDURE, NOPASS:: dPsiXi2 => dPsiTetraXi2
|
||||
PROCEDURE, PASS:: init => initCellTetra3DCart
|
||||
PROCEDURE, PASS:: randPos => randPosCellTetra
|
||||
PROCEDURE, PASS:: calcCell => volumeTetra
|
||||
PROCEDURE, PASS:: fPsi => fPsiTetra
|
||||
PROCEDURE, PASS:: dPsi => dPsiTetra
|
||||
PROCEDURE, NOPASS, PRIVATE:: dPsiXi1 => dPsiTetraXi1
|
||||
PROCEDURE, NOPASS, PRIVATE:: dPsiXi2 => dPsiTetraXi2
|
||||
PROCEDURE, PASS:: partialDer => partialDerTetra
|
||||
PROCEDURE, PASS:: elemK => elemKTetra
|
||||
PROCEDURE, PASS:: elemF => elemFTetra
|
||||
PROCEDURE, PASS:: gatherElectricField => gatherEFTetra
|
||||
PROCEDURE, PASS:: gatherMagneticField => gatherMFTetra
|
||||
PROCEDURE, NOPASS:: inside => insideTetra
|
||||
PROCEDURE, PASS:: gatherEF => gatherEFTetra
|
||||
PROCEDURE, PASS:: gatherMF => gatherMFTetra
|
||||
PROCEDURE, PASS:: getNodes => getNodesTetra
|
||||
PROCEDURE, PASS:: phy2log => phy2logTetra
|
||||
PROCEDURE, PASS:: nextElement => nextElementTetra
|
||||
|
||||
END TYPE meshVol3DCartTetra
|
||||
END TYPE meshCell3DCartTetra
|
||||
|
||||
CONTAINS
|
||||
!NODE FUNCTIONS
|
||||
|
|
@ -245,19 +238,20 @@ MODULE moduleMesh3DCart
|
|||
!VOLUME FUNCTIONS
|
||||
!TETRA FUNCTIONS
|
||||
!Inits tetrahedron element
|
||||
SUBROUTINE initVolTetra3DCart(self, n, p, nodes)
|
||||
SUBROUTINE initCellTetra3DCart(self, n, p, nodes)
|
||||
USE moduleRefParam
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol3DCartTetra), INTENT(out):: self
|
||||
CLASS(meshCell3DCartTetra), INTENT(out):: self
|
||||
INTEGER, INTENT(in):: n
|
||||
INTEGER, INTENT(in):: p(:)
|
||||
TYPE(meshNodeCont), INTENT(in), TARGET:: nodes(:)
|
||||
REAL(8), DIMENSION(1:3):: r1, r2, r3, r4 !Positions of each node
|
||||
REAL(8):: Xi(1:3), fPsi(1:4)
|
||||
REAL(8):: volNodes(1:4) !Volume of each node
|
||||
REAL(8):: volNodes(1:4) !Cellume of each node
|
||||
|
||||
self%n = n
|
||||
self%nNodes = SIZE(p)
|
||||
self%n1 => nodes(p(1))%obj
|
||||
self%n2 => nodes(p(2))%obj
|
||||
self%n3 => nodes(p(3))%obj
|
||||
|
|
@ -272,11 +266,11 @@ MODULE moduleMesh3DCart
|
|||
self%z = (/r1(3), r2(3), r3(3), r4(3)/)
|
||||
|
||||
!Computes the element volume
|
||||
CALL self%calcVol()
|
||||
CALL self%calcCell()
|
||||
|
||||
!Assign proportional volume to each node
|
||||
Xi = (/0.25D0, 0.25D0, 0.25D0/)
|
||||
CALL self%fPsi(Xi, fPsi)
|
||||
fPsi = self%fPsi(Xi)
|
||||
volNodes = fPsi*self%volume
|
||||
self%n1%v = self%n1%v + volNodes(1)
|
||||
self%n2%v = self%n2%v + volNodes(2)
|
||||
|
|
@ -288,14 +282,14 @@ MODULE moduleMesh3DCart
|
|||
ALLOCATE(self%listPart_in(1:nSpecies))
|
||||
ALLOCATE(self%totalWeight(1:nSpecies))
|
||||
|
||||
END SUBROUTINE initVolTetra3DCart
|
||||
END SUBROUTINE initCellTetra3DCart
|
||||
|
||||
!Random position in volume tetrahedron
|
||||
FUNCTION randPosVolTetra(self) RESULT(r)
|
||||
FUNCTION randPosCellTetra(self) RESULT(r)
|
||||
USE moduleRandom
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol3DCartTetra), INTENT(in):: self
|
||||
CLASS(meshCell3DCartTetra), INTENT(in):: self
|
||||
REAL(8):: r(1:3)
|
||||
REAL(8):: Xi(1:3)
|
||||
REAL(8):: fPsi(1:4)
|
||||
|
|
@ -304,19 +298,19 @@ MODULE moduleMesh3DCart
|
|||
Xi(2) = random( 0.D0, 1.D0 - Xi(1))
|
||||
Xi(3) = random( 0.D0, 1.D0 - Xi(1) - Xi(2))
|
||||
|
||||
CALL self%fPsi(Xi, fPsi)
|
||||
fPsi = self%fPsi(Xi)
|
||||
|
||||
r = (/ DOT_PRODUCT(fPsi, self%x), &
|
||||
DOT_PRODUCT(fPsi, self%y), &
|
||||
DOT_PRODUCT(fPsi, self%z) /)
|
||||
|
||||
END FUNCTION randPosVolTetra
|
||||
END FUNCTION randPosCellTetra
|
||||
|
||||
!Computes the element volume
|
||||
PURE SUBROUTINE volumeTetra(self)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol3DCartTetra), INTENT(inout):: self
|
||||
CLASS(meshCell3DCartTetra), INTENT(inout):: self
|
||||
REAL(8):: Xi(1:3)
|
||||
|
||||
self%volume = 0.D0
|
||||
|
|
@ -326,27 +320,29 @@ MODULE moduleMesh3DCart
|
|||
END SUBROUTINE volumeTetra
|
||||
|
||||
!Computes element functions in point Xi
|
||||
PURE SUBROUTINE fPsiTetra(Xi, fPsi)
|
||||
PURE FUNCTION fPsiTetra(self, Xi) RESULT(fPsi)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell3DCartTetra), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
REAL(8), INTENT(out):: fPsi(:)
|
||||
REAL(8):: fPsi(1:self%nNodes)
|
||||
|
||||
fPsi(1) = 1.D0 - Xi(1) - Xi(2) - Xi(3)
|
||||
fPsi(2) = Xi(1)
|
||||
fPsi(3) = Xi(2)
|
||||
fPsi(4) = Xi(3)
|
||||
|
||||
END SUBROUTINE fPsiTetra
|
||||
END FUNCTION fPsiTetra
|
||||
|
||||
!Derivative element function at coordinates Xi
|
||||
PURE FUNCTION dPsiTetra(Xi) RESULT(dPsi)
|
||||
PURE FUNCTION dPsiTetra(self, Xi) RESULT(dPsi)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell3DCartTetra), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
REAL(8), ALLOCATABLE:: dPsi(:,:)
|
||||
REAL(8):: dPsi(1:3, 1:self%nNodes)
|
||||
|
||||
ALLOCATE(dPsi(1:3,1:4))
|
||||
dPsi = 0.D0
|
||||
|
||||
dPsi(1,:) = dPsiTetraXi1(Xi(2), Xi(3))
|
||||
dPsi(2,:) = dPsiTetraXi2(Xi(1), Xi(3))
|
||||
|
|
@ -397,8 +393,8 @@ MODULE moduleMesh3DCart
|
|||
PURE SUBROUTINE partialDerTetra(self, dPsi, dx, dy, dz)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol3DCartTetra), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: dPsi(1:, 1:)
|
||||
CLASS(meshCell3DCartTetra), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: dPsi(1:3, 1:self%nNodes)
|
||||
REAL(8), INTENT(out), DIMENSION(1:3):: dx, dy, dz
|
||||
|
||||
dx(1) = DOT_PRODUCT(dPsi(1,:), self%x)
|
||||
|
|
@ -418,13 +414,12 @@ MODULE moduleMesh3DCart
|
|||
PURE FUNCTION elemKTetra(self) RESULT(localK)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol3DCartTetra), INTENT(in):: self
|
||||
REAL(8), ALLOCATABLE:: localK(:,:)
|
||||
CLASS(meshCell3DCartTetra), INTENT(in):: self
|
||||
REAL(8):: localK(1:self%nNodes,1:self%nNodes)
|
||||
REAL(8):: Xi(1:3)
|
||||
REAL(8):: fPsi(1:4), dPsi(1:3, 1:4)
|
||||
REAL(8):: invJ(1:3,1:3), detJ
|
||||
|
||||
ALLOCATE(localK(1:4,1:4))
|
||||
localK = 0.D0
|
||||
Xi = 0.D0
|
||||
!TODO: One point Gauss integral. Upgrade when possible
|
||||
|
|
@ -432,7 +427,7 @@ MODULE moduleMesh3DCart
|
|||
dPsi = self%dPsi(Xi)
|
||||
detJ = self%detJac(Xi, dPsi)
|
||||
invJ = self%invJac(Xi, dPsi)
|
||||
CALL self%fPsi(Xi, fPsi)
|
||||
fPsi = self%fPsi(Xi)
|
||||
localK = MATMUL(TRANSPOSE(MATMUL(invJ,dPsi)),MATMUL(invJ,dPsi))*1.D0/detJ
|
||||
|
||||
END FUNCTION elemKTetra
|
||||
|
|
@ -440,26 +435,66 @@ MODULE moduleMesh3DCart
|
|||
PURE FUNCTION elemFTetra(self, source) RESULT(localF)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol3DCartTetra), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: source(1:)
|
||||
REAL(8), ALLOCATABLE:: localF(:)
|
||||
CLASS(meshCell3DCartTetra), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: source(1:self%nNodes)
|
||||
REAL(8):: localF(1:self%nNodes)
|
||||
REAL(8):: fPsi(1:4), dPsi(1:3, 1:4)
|
||||
REAL(8):: Xi(1:3)
|
||||
REAL(8):: detJ, f
|
||||
|
||||
ALLOCATE(localF(1:4))
|
||||
|
||||
localF = 0.D0
|
||||
Xi = 0.D0
|
||||
Xi = (/ 0.25D0, 0.25D0, 0.25D0 /)
|
||||
dPsi = self%dPsi(Xi)
|
||||
detJ = self%detJac(Xi, dPsi)
|
||||
CALL self%fPsi(Xi, fPsi)
|
||||
fPsi = self%fPsi(Xi)
|
||||
f = DOT_PRODUCT(fPsi, source)
|
||||
localF = f*fPsi*1.D0*detJ
|
||||
|
||||
END FUNCTION elemFTetra
|
||||
|
||||
PURE FUNCTION gatherEFTetra(self, Xi) RESULT(array)
|
||||
IMPLICIT NONE
|
||||
CLASS(meshCell3DCartTetra), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
REAL(8):: array(1:3)
|
||||
REAL(8):: phi(1:4)
|
||||
|
||||
phi = (/ self%n1%emData%phi, &
|
||||
self%n2%emData%phi, &
|
||||
self%n3%emData%phi, &
|
||||
self%n4%emData%phi /)
|
||||
|
||||
array = -self%gatherDF(Xi, phi)
|
||||
|
||||
END FUNCTION gatherEFTetra
|
||||
|
||||
PURE FUNCTION gatherMFTetra(self, Xi) RESULT(array)
|
||||
IMPLICIT NONE
|
||||
CLASS(meshCell3DCartTetra), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
REAL(8):: array(1:3)
|
||||
REAL(8):: B(1:4,1:3)
|
||||
|
||||
B(:,1) = (/ self%n1%emData%B(1), &
|
||||
self%n2%emData%B(1), &
|
||||
self%n3%emData%B(1), &
|
||||
self%n4%emData%B(1) /)
|
||||
|
||||
B(:,2) = (/ self%n1%emData%B(2), &
|
||||
self%n2%emData%B(2), &
|
||||
self%n3%emData%B(2), &
|
||||
self%n4%emData%B(2) /)
|
||||
|
||||
B(:,3) = (/ self%n1%emData%B(3), &
|
||||
self%n2%emData%B(3), &
|
||||
self%n3%emData%B(3), &
|
||||
self%n4%emData%B(3) /)
|
||||
|
||||
array = self%gatherF(Xi, 3, B)
|
||||
|
||||
END FUNCTION gatherMFTetra
|
||||
|
||||
PURE FUNCTION insideTetra(Xi) RESULT(ins)
|
||||
IMPLICIT NONE
|
||||
|
||||
|
|
@ -473,66 +508,12 @@ MODULE moduleMesh3DCart
|
|||
|
||||
END FUNCTION insideTetra
|
||||
|
||||
PURE FUNCTION gatherEFTetra(self, Xi) RESULT(EF)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol3DCartTetra), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
REAL(8):: dPsi(1:3, 1:4)
|
||||
REAL(8):: dPsiR(1:3, 1:4)
|
||||
REAL(8):: invJ(1:3, 1:3), detJ
|
||||
REAL(8):: phi(1:4)
|
||||
REAL(8):: EF(1:3)
|
||||
|
||||
phi = (/self%n1%emData%phi, &
|
||||
self%n2%emData%phi, &
|
||||
self%n3%emData%phi, &
|
||||
self%n4%emData%phi /)
|
||||
|
||||
dPsi = self%dPsi(Xi)
|
||||
detJ = self%detJac(Xi, dPsi)
|
||||
invJ = self%invJac(Xi, dPsi)
|
||||
dPsiR = MATMUL(invJ, dPsi)/detJ
|
||||
EF(1) = -DOT_PRODUCT(dPsiR(1,:), phi)
|
||||
EF(2) = -DOT_PRODUCT(dPsiR(2,:), phi)
|
||||
EF(3) = -DOT_PRODUCT(dPsiR(3,:), phi)
|
||||
|
||||
END FUNCTION gatherEFTetra
|
||||
|
||||
PURE FUNCTION gatherMFTetra(self, Xi) RESULT(MF)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol3DCartTetra), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
REAL(8):: fPsi(1:4)
|
||||
REAL(8):: MF_Nodes(1:4,1:3)
|
||||
REAL(8):: MF(1:3)
|
||||
|
||||
MF_Nodes(1:4,1) = (/self%n1%emData%B(1), &
|
||||
self%n2%emData%B(1), &
|
||||
self%n3%emData%B(1), &
|
||||
self%n4%emData%B(1) /)
|
||||
MF_Nodes(1:4,2) = (/self%n1%emData%B(2), &
|
||||
self%n2%emData%B(2), &
|
||||
self%n3%emData%B(2), &
|
||||
self%n4%emData%B(2) /)
|
||||
MF_Nodes(1:4,3) = (/self%n1%emData%B(3), &
|
||||
self%n2%emData%B(3), &
|
||||
self%n3%emData%B(3), &
|
||||
self%n4%emData%B(3) /)
|
||||
|
||||
CALL self%fPsi(Xi, fPsi)
|
||||
MF = MATMUL(fPsi, MF_Nodes)
|
||||
|
||||
END FUNCTION gatherMFTetra
|
||||
|
||||
PURE FUNCTION getNodesTetra(self) RESULT(n)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol3DCartTetra), INTENT(in):: self
|
||||
INTEGER, ALLOCATABLE:: n(:)
|
||||
CLASS(meshCell3DCartTetra), INTENT(in):: self
|
||||
INTEGER:: n(1:self%nnodes)
|
||||
|
||||
ALLOCATE(n(1:4))
|
||||
n = (/self%n1%n, self%n2%n, self%n3%n, self%n4%n /)
|
||||
|
||||
END FUNCTION getNodesTetra
|
||||
|
|
@ -540,7 +521,7 @@ MODULE moduleMesh3DCart
|
|||
PURE FUNCTION phy2logTetra(self,r) RESULT(Xi)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol3DCartTetra), INTENT(in):: self
|
||||
CLASS(meshCell3DCartTetra), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: r(1:3)
|
||||
REAL(8):: Xi(1:3)
|
||||
REAL(8):: invJ(1:3, 1:3), detJ
|
||||
|
|
@ -559,7 +540,7 @@ MODULE moduleMesh3DCart
|
|||
SUBROUTINE nextElementTetra(self, Xi, nextElement)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol3DCartTetra), INTENT(in):: self
|
||||
CLASS(meshCell3DCartTetra), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
CLASS(meshElement), POINTER, INTENT(out):: nextElement
|
||||
REAL(8):: XiArray(1:4)
|
||||
|
|
@ -587,11 +568,11 @@ MODULE moduleMesh3DCart
|
|||
PURE FUNCTION detJ3DCart(self, Xi, dPsi_in) RESULT(dJ)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol3DCart), INTENT(in)::self
|
||||
CLASS(meshCell3DCart), INTENT(in)::self
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
REAL(8), INTENT(in), OPTIONAL:: dPsi_in(1:, 1:)
|
||||
REAL(8), INTENT(in), OPTIONAL:: dPsi_in(1:3, 1:self%nNodes)
|
||||
REAL(8):: dJ
|
||||
REAL(8), ALLOCATABLE:: dPsi(:,:)
|
||||
REAL(8):: dPsi(1:3, 1:self%nNodes)
|
||||
REAL(8):: dx(1:3), dy(1:3), dz(1:3)
|
||||
|
||||
IF (PRESENT(dPsi_in)) THEN
|
||||
|
|
@ -612,10 +593,10 @@ MODULE moduleMesh3DCart
|
|||
PURE FUNCTION invJ3DCart(self,Xi,dPsi_in) RESULT(invJ)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol3DCart), INTENT(in):: self
|
||||
CLASS(meshCell3DCart), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
REAL(8), INTENT(in), OPTIONAL:: dPsi_in(1:,1:)
|
||||
REAL(8), ALLOCATABLE:: dPsi(:,:)
|
||||
REAL(8), INTENT(in), OPTIONAL:: dPsi_in(1:3, 1:self%nNodes)
|
||||
REAL(8):: dPsi(1:3, 1:self%nNodes)
|
||||
REAL(8), DIMENSION(1:3):: dx, dy, dz
|
||||
REAL(8):: invJ(1:3,1:3)
|
||||
|
||||
|
|
@ -645,17 +626,17 @@ MODULE moduleMesh3DCart
|
|||
END FUNCTION invJ3DCart
|
||||
|
||||
!Selects type of elements to build connection
|
||||
SUBROUTINE connectVolVol(elemA, elemB)
|
||||
SUBROUTINE connectCellCell(elemA, elemB)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol), INTENT(inout):: elemA
|
||||
CLASS(meshVol), INTENT(inout):: elemB
|
||||
CLASS(meshCell), INTENT(inout):: elemA
|
||||
CLASS(meshCell), INTENT(inout):: elemB
|
||||
|
||||
SELECT TYPE(elemA)
|
||||
TYPE IS(meshVol3DCartTetra)
|
||||
TYPE IS(meshCell3DCartTetra)
|
||||
!Element A is a tetrahedron
|
||||
SELECT TYPE(elemB)
|
||||
TYPE IS(meshVol3DCartTetra)
|
||||
TYPE IS(meshCell3DCartTetra)
|
||||
!Element B is a tetrahedron
|
||||
CALL connectTetraTetra(elemA, elemB)
|
||||
|
||||
|
|
@ -663,18 +644,18 @@ MODULE moduleMesh3DCart
|
|||
|
||||
END SELECT
|
||||
|
||||
END SUBROUTINE connectVolVol
|
||||
END SUBROUTINE connectCellCell
|
||||
|
||||
SUBROUTINE connectVolEdge(elemA, elemB)
|
||||
SUBROUTINE connectCellEdge(elemA, elemB)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol), INTENT(inout):: elemA
|
||||
CLASS(meshCell), INTENT(inout):: elemA
|
||||
CLASS(meshEdge), INTENT(inout):: elemB
|
||||
|
||||
SELECT TYPE(elemB)
|
||||
CLASS IS(meshEdge3DCartTria)
|
||||
SELECT TYPE(elemA)
|
||||
TYPE IS(meshVol3DCartTetra)
|
||||
TYPE IS(meshCell3DCartTetra)
|
||||
!Element A is a tetrahedron
|
||||
CALL connectTetraEdge(elemA, elemB)
|
||||
|
||||
|
|
@ -682,7 +663,7 @@ MODULE moduleMesh3DCart
|
|||
|
||||
END SELECT
|
||||
|
||||
END SUBROUTINE connectVolEdge
|
||||
END SUBROUTINE connectCellEdge
|
||||
|
||||
SUBROUTINE connectMesh3DCart(self)
|
||||
IMPLICIT NONE
|
||||
|
|
@ -690,11 +671,11 @@ MODULE moduleMesh3DCart
|
|||
CLASS(meshGeneric), INTENT(inout):: self
|
||||
INTEGER:: e, et
|
||||
|
||||
DO e = 1, self%numVols
|
||||
!Connect Vol-Vol
|
||||
DO et = 1, self%numVols
|
||||
DO e = 1, self%numCells
|
||||
!Connect Cell-Cell
|
||||
DO et = 1, self%numCells
|
||||
IF (e /= et) THEN
|
||||
CALL connectVolVol(self%vols(e)%obj, self%vols(et)%obj)
|
||||
CALL connectCellCell(self%cells(e)%obj, self%cells(et)%obj)
|
||||
|
||||
END IF
|
||||
|
||||
|
|
@ -702,9 +683,9 @@ MODULE moduleMesh3DCart
|
|||
|
||||
SELECT TYPE(self)
|
||||
TYPE IS(meshParticles)
|
||||
!Connect Vol-Edge
|
||||
!Connect Cell-Edge
|
||||
DO et = 1, self%numEdges
|
||||
CALL connectVolEdge(self%vols(e)%obj, self%edges(et)%obj)
|
||||
CALL connectCellEdge(self%cells(e)%obj, self%edges(et)%obj)
|
||||
|
||||
END DO
|
||||
|
||||
|
|
@ -740,8 +721,8 @@ MODULE moduleMesh3DCart
|
|||
SUBROUTINE connectTetraTetra(elemA, elemB)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol3DCartTetra), INTENT(inout), TARGET:: elemA
|
||||
CLASS(meshVol3DCartTetra), INTENT(inout), TARGET:: elemB
|
||||
CLASS(meshCell3DCartTetra), INTENT(inout), TARGET:: elemA
|
||||
CLASS(meshCell3DCartTetra), INTENT(inout), TARGET:: elemB
|
||||
|
||||
!Check surface 1
|
||||
IF (.NOT. ASSOCIATED(elemA%e1)) THEN
|
||||
|
|
@ -869,11 +850,11 @@ MODULE moduleMesh3DCart
|
|||
USE moduleMath
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol3DCartTetra), INTENT(inout), TARGET:: elemA
|
||||
CLASS(meshCell3DCartTetra), 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)
|
||||
REAL(8):: normCell(1:3)
|
||||
|
||||
nodesEdge = (/ elemB%n1%n, elemB%n2%n, elemB%n3%n /)
|
||||
|
||||
|
|
@ -888,10 +869,10 @@ MODULE moduleMesh3DCart
|
|||
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)
|
||||
normCell = crossProduct(vec1, vec2)
|
||||
normCell = normalize(normCell)
|
||||
|
||||
IF (DOT_PRODUCT(elemB%normal, normVol) == -1.D0) THEN
|
||||
IF (DOT_PRODUCT(elemB%normal, normCell) == -1.D0) THEN
|
||||
|
||||
elemA%e1 => elemB
|
||||
elemB%e1 => elemA
|
||||
|
|
@ -921,10 +902,10 @@ MODULE moduleMesh3DCart
|
|||
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)
|
||||
normCell = crossProduct(vec1, vec2)
|
||||
normCell = normalize(normCell)
|
||||
|
||||
IF (DOT_PRODUCT(elemB%normal, normVol) == -1.D0) THEN
|
||||
IF (DOT_PRODUCT(elemB%normal, normCell) == -1.D0) THEN
|
||||
|
||||
elemA%e2 => elemB
|
||||
elemB%e1 => elemA
|
||||
|
|
@ -954,10 +935,10 @@ MODULE moduleMesh3DCart
|
|||
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)
|
||||
normCell = crossProduct(vec1, vec2)
|
||||
normCell = normalize(normCell)
|
||||
|
||||
IF (DOT_PRODUCT(elemB%normal, normVol) == -1.D0) THEN
|
||||
IF (DOT_PRODUCT(elemB%normal, normCell) == -1.D0) THEN
|
||||
|
||||
elemA%e3 => elemB
|
||||
elemB%e1 => elemA
|
||||
|
|
@ -987,10 +968,10 @@ MODULE moduleMesh3DCart
|
|||
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)
|
||||
normCell = crossProduct(vec1, vec2)
|
||||
normCell = normalize(normCell)
|
||||
|
||||
IF (DOT_PRODUCT(elemB%normal, normVol) == -1.D0) THEN
|
||||
IF (DOT_PRODUCT(elemB%normal, normCell) == -1.D0) THEN
|
||||
|
||||
elemA%e4 => elemB
|
||||
elemB%e1 => elemA
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue