First thing that I am kinda happy with.

Still some things to improve but at least push is good.
This commit is contained in:
Jorge Gonzalez 2023-01-05 22:43:51 +01:00
commit 7f6afd6a87
11 changed files with 336 additions and 258 deletions

View file

@ -40,10 +40,11 @@ MODULE moduleMesh3DCart
END TYPE meshCell3DCart
ABSTRACT INTERFACE
PURE SUBROUTINE partialDer_interface(self, dPsi, dx, dy, dz)
PURE SUBROUTINE partialDer_interface(self, nNodes, dPsi, dx, dy, dz)
IMPORT meshCell3DCart
CLASS(meshCell3DCart), INTENT(in):: self
REAL(8), INTENT(in):: dPsi(1:3,1:self%nNodes)
INTEGER, INTENT(in):: nNodes
REAL(8), INTENT(in):: dPsi(1:3,1:nNodes)
REAL(8), INTENT(out), DIMENSION(1:3):: dx, dy, dz
END SUBROUTINE partialDer_interface
@ -59,7 +60,7 @@ MODULE moduleMesh3DCart
!Connectivity to adjacent elements
CLASS(meshElement), POINTER:: e1 => NULL(), e2 => NULL(), e3 => NULL(), e4 => NULL()
CONTAINS
PROCEDURE, PASS:: init => initCellTetra3DCart
PROCEDURE, PASS:: init => initCellTetra
PROCEDURE, PASS:: randPos => randPosCellTetra
PROCEDURE, PASS:: calcCell => volumeTetra
PROCEDURE, PASS:: fPsi => fPsiTetra
@ -135,6 +136,7 @@ MODULE moduleMesh3DCart
INTEGER:: s
self%n = n
self%nNodes = SIZE(p)
self%n1 => mesh%nodes(p(1))%obj
self%n2 => mesh%nodes(p(2))%obj
self%n3 => mesh%nodes(p(3))%obj
@ -170,13 +172,13 @@ MODULE moduleMesh3DCart
END SUBROUTINE initEdge3DCartTria
!Get nodes from surface
PURE FUNCTION getNodes3DCartTria(self) RESULT(n)
PURE FUNCTION getNodes3DCartTria(self, nNodes) RESULT(n)
IMPLICIT NONE
CLASS(meshEdge3DCartTria), INTENT(in):: self
INTEGER, ALLOCATABLE:: n(:)
INTEGER, INTENT(in):: nNodes
INTEGER:: n(1:nNodes)
ALLOCATE(n(1:3))
n = (/self%n1%n, self%n2%n, self%n3%n/)
END FUNCTION getNodes3DCartTria
@ -238,7 +240,7 @@ MODULE moduleMesh3DCart
!VOLUME FUNCTIONS
!TETRA FUNCTIONS
!Inits tetrahedron element
SUBROUTINE initCellTetra3DCart(self, n, p, nodes)
SUBROUTINE initCellTetra(self, n, p, nodes)
USE moduleRefParam
IMPLICIT NONE
@ -282,7 +284,7 @@ MODULE moduleMesh3DCart
ALLOCATE(self%listPart_in(1:nSpecies))
ALLOCATE(self%totalWeight(1:nSpecies))
END SUBROUTINE initCellTetra3DCart
END SUBROUTINE initCellTetra
!Random position in volume tetrahedron
FUNCTION randPosCellTetra(self) RESULT(r)
@ -315,7 +317,7 @@ MODULE moduleMesh3DCart
self%volume = 0.D0
Xi = (/0.25D0, 0.25D0, 0.25D0/)
self%volume = self%detJac(Xi)
self%volume = self%detJac(Xi, 4)
END SUBROUTINE volumeTetra
@ -392,11 +394,12 @@ MODULE moduleMesh3DCart
END FUNCTION dPsiTetraXi3
!Computes the derivatives in global coordinates
PURE SUBROUTINE partialDerTetra(self, dPsi, dx, dy, dz)
PURE SUBROUTINE partialDerTetra(self, nNodes, dPsi, dx, dy, dz)
IMPLICIT NONE
CLASS(meshCell3DCartTetra), INTENT(in):: self
REAL(8), INTENT(in):: dPsi(1:3, 1:self%nNodes)
INTEGER, INTENT(in):: nNodes
REAL(8), INTENT(in):: dPsi(1:3, 1:nNodes)
REAL(8), INTENT(out), DIMENSION(1:3):: dx, dy, dz
dx(1) = DOT_PRODUCT(dPsi(1,:), self%x)
@ -413,11 +416,12 @@ MODULE moduleMesh3DCart
END SUBROUTINE partialDerTetra
PURE FUNCTION elemKTetra(self) RESULT(localK)
PURE FUNCTION elemKTetra(self, nNodes) RESULT(localK)
IMPLICIT NONE
CLASS(meshCell3DCartTetra), INTENT(in):: self
REAL(8):: localK(1:self%nNodes,1:self%nNodes)
INTEGER, INTENT(in):: nNodes
REAL(8):: localK(1:nNodes,1:nNodes)
REAL(8):: Xi(1:3)
REAL(8):: fPsi(1:4), dPsi(1:3, 1:4)
REAL(8):: invJ(1:3,1:3), detJ
@ -427,19 +431,20 @@ MODULE moduleMesh3DCart
!TODO: One point Gauss integral. Upgrade when possible
Xi = (/ 0.25D0, 0.25D0, 0.25D0 /)
dPsi = self%dPsi(Xi, 4)
detJ = self%detJac(Xi, dPsi)
invJ = self%invJac(Xi, dPsi)
detJ = self%detJac(Xi, 4, dPsi)
invJ = self%invJac(Xi, 4, dPsi)
fPsi = self%fPsi(Xi, 4)
localK = MATMUL(TRANSPOSE(MATMUL(invJ,dPsi)),MATMUL(invJ,dPsi))*1.D0/detJ
END FUNCTION elemKTetra
PURE FUNCTION elemFTetra(self, source) RESULT(localF)
PURE FUNCTION elemFTetra(self, nNodes, source) RESULT(localF)
IMPLICIT NONE
CLASS(meshCell3DCartTetra), INTENT(in):: self
REAL(8), INTENT(in):: source(1:self%nNodes)
REAL(8):: localF(1:self%nNodes)
INTEGER, INTENT(in):: nNodes
REAL(8), INTENT(in):: source(1:nNodes)
REAL(8):: localF(1:nNodes)
REAL(8):: fPsi(1:4), dPsi(1:3, 1:4)
REAL(8):: Xi(1:3)
REAL(8):: detJ, f
@ -448,7 +453,7 @@ MODULE moduleMesh3DCart
Xi = 0.D0
Xi = (/ 0.25D0, 0.25D0, 0.25D0 /)
dPsi = self%dPsi(Xi, 4)
detJ = self%detJac(Xi, dPsi)
detJ = self%detJac(Xi, 4, dPsi)
fPsi = self%fPsi(Xi, 4)
f = DOT_PRODUCT(fPsi, source)
localF = f*fPsi*1.D0*detJ
@ -467,7 +472,7 @@ MODULE moduleMesh3DCart
self%n3%emData%phi, &
self%n4%emData%phi /)
array = -self%gatherDF(Xi, phi)
array = -self%gatherDF(Xi, 4, phi)
END FUNCTION gatherEFTetra
@ -493,7 +498,7 @@ MODULE moduleMesh3DCart
self%n3%emData%B(3), &
self%n4%emData%B(3) /)
array = self%gatherF(Xi, 3, B)
array = self%gatherF(Xi, 4, B)
END FUNCTION gatherMFTetra
@ -510,11 +515,12 @@ MODULE moduleMesh3DCart
END FUNCTION insideTetra
PURE FUNCTION getNodesTetra(self) RESULT(n)
PURE FUNCTION getNodesTetra(self, nNodes) RESULT(n)
IMPLICIT NONE
CLASS(meshCell3DCartTetra), INTENT(in):: self
INTEGER:: n(1:self%nnodes)
INTEGER, INTENT(in):: nNodes
INTEGER:: n(1:nNodes)
n = (/self%n1%n, self%n2%n, self%n3%n, self%n4%n /)
@ -533,8 +539,8 @@ MODULE moduleMesh3DCart
Xi = 0.D0
deltaR = (/r(1) - self%x(1), r(2) - self%y(1), r(3) - self%z(1) /)
dPsi = self%dPsi(Xi, 4)
invJ = self%invJac(Xi, dPsi)
detJ = self%detJac(Xi, dPsi)
invJ = self%invJac(Xi, 4, dPsi)
detJ = self%detJac(Xi, 4, dPsi)
Xi = MATMUL(invJ, deltaR)/detJ
END FUNCTION phy2logTetra
@ -567,14 +573,15 @@ MODULE moduleMesh3DCart
!COMMON FUNCTIONS FOR CARTESIAN VOLUME ELEMENTS IN 3D
!Computes element Jacobian determinant
PURE FUNCTION detJ3DCart(self, Xi, dPsi_in) RESULT(dJ)
PURE FUNCTION detJ3DCart(self, Xi, nNodes, dPsi_in) RESULT(dJ)
IMPLICIT NONE
CLASS(meshCell3DCart), INTENT(in)::self
REAL(8), INTENT(in):: Xi(1:3)
REAL(8), INTENT(in), OPTIONAL:: dPsi_in(1:3, 1:self%nNodes)
INTEGER, INTENT(in):: nNodes
REAL(8), INTENT(in), OPTIONAL:: dPsi_in(1:3, 1:nNodes)
REAL(8):: dJ
REAL(8):: dPsi(1:3, 1:self%nNodes)
REAL(8):: dPsi(1:3, 1:nNodes)
REAL(8):: dx(1:3), dy(1:3), dz(1:3)
IF (PRESENT(dPsi_in)) THEN
@ -585,20 +592,21 @@ MODULE moduleMesh3DCart
END IF
CALL self%partialDer(dPsi, dx, dy, dz)
CALL self%partialDer(nNodes, dPsi, dx, dy, dz)
dJ = dx(1)*(dy(2)*dz(3) - dy(3)*dz(2)) &
- dx(2)*(dy(1)*dz(3) - dy(3)*dz(1)) &
+ dx(3)*(dy(1)*dz(2) - dy(2)*dz(1))
END FUNCTION detJ3DCart
PURE FUNCTION invJ3DCart(self,Xi,dPsi_in) RESULT(invJ)
PURE FUNCTION invJ3DCart(self, Xi, nNodes, dPsi_in) RESULT(invJ)
IMPLICIT NONE
CLASS(meshCell3DCart), INTENT(in):: self
REAL(8), INTENT(in):: Xi(1:3)
REAL(8), INTENT(in), OPTIONAL:: dPsi_in(1:3, 1:self%nNodes)
REAL(8):: dPsi(1:3, 1:self%nNodes)
INTEGER, INTENT(in):: nNodes
REAL(8), INTENT(in), OPTIONAL:: dPsi_in(1:3, 1:nNodes)
REAL(8):: dPsi(1:3, 1:nNodes)
REAL(8), DIMENSION(1:3):: dx, dy, dz
REAL(8):: invJ(1:3,1:3)
@ -610,7 +618,7 @@ MODULE moduleMesh3DCart
END IF
CALL self%partialDer(dPsi, dx, dy, dz)
CALL self%partialDer(nNodes, dPsi, dx, dy, dz)
invJ(1,1) = (dy(2)*dz(3) - dy(3)*dz(2))
invJ(1,2) = -(dy(1)*dz(3) - dy(3)*dz(1))
invJ(1,3) = (dy(1)*dz(2) - dy(2)*dz(1))