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

@ -41,10 +41,11 @@ MODULE moduleMesh1DCart
END TYPE meshCell1DCart
ABSTRACT INTERFACE
PURE SUBROUTINE partialDer_interface(self, dPsi, dx)
PURE SUBROUTINE partialDer_interface(self, nNodes, dPsi, dx)
IMPORT meshCell1DCart
CLASS(meshCell1DCart), 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):: dx
END SUBROUTINE partialDer_interface
@ -129,6 +130,7 @@ MODULE moduleMesh1DCart
INTEGER:: s
self%n = n
self%nNodes = SIZE(p)
self%n1 => mesh%nodes(p(1))%obj
!Get element coordinates
r1 = self%n1%getCoordinates()
@ -152,13 +154,13 @@ MODULE moduleMesh1DCart
END SUBROUTINE initEdge1DCart
!Get nodes from edge
PURE FUNCTION getNodes1DCart(self) RESULT(n)
PURE FUNCTION getNodes1DCart(self, nNodes) RESULT(n)
IMPLICIT NONE
CLASS(meshEdge1DCart), INTENT(in):: self
INTEGER, ALLOCATABLE:: n(:)
INTEGER, INTENT(in):: nNodes
INTEGER:: n(1:nNodes)
ALLOCATE(n(1))
n = (/ self%n1%n /)
END FUNCTION getNodes1DCart
@ -250,7 +252,7 @@ MODULE moduleMesh1DCart
!1 point Gauss integral
Xi = 0.D0
fPsi = self%fPsi(Xi, 2)
detJ = self%detJac(Xi)
detJ = self%detJac(Xi, 2)
l = 2.D0*detJ
self%volume = l
self%arNodes = fPsi*l
@ -290,11 +292,12 @@ MODULE moduleMesh1DCart
END FUNCTION dPsiSegm
!Computes partial derivatives of coordinates
PURE SUBROUTINE partialDerSegm(self, dPsi, dx)
PURE SUBROUTINE partialDerSegm(self, nNodes, dPsi, dx)
IMPLICIT NONE
CLASS(meshCell1DCartSegm), 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):: dx
dx(1) = DOT_PRODUCT(dPsi(1,:), self%x)
@ -302,11 +305,12 @@ MODULE moduleMesh1DCart
END SUBROUTINE partialDerSegm
!Computes local stiffness matrix
PURE FUNCTION elemKSegm(self) RESULT(localK)
PURE FUNCTION elemKSegm(self, nNodes) RESULT(localK)
IMPLICIT NONE
CLASS(meshCell1DCartSegm), 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):: dPsi(1:3, 1:2)
REAL(8):: invJ(1:3,1:3), detJ
@ -317,8 +321,8 @@ MODULE moduleMesh1DCart
DO l = 1, 3
Xi(1) = corSeg(l)
dPsi = self%dPsi(Xi, 2)
detJ = self%detJac(Xi, dPsi)
invJ = self%invJac(Xi, dPsi)
detJ = self%detJac(Xi, 2, dPsi)
invJ = self%invJac(Xi, 2, dPsi)
localK = localK + MATMUL(RESHAPE(MATMUL(invJ,dPsi), (/ 2, 1/)), &
RESHAPE(MATMUL(invJ,dPsi), (/ 1, 2/)))* &
wSeg(l)/detJ
@ -327,12 +331,13 @@ MODULE moduleMesh1DCart
END FUNCTION elemKSegm
PURE FUNCTION elemFSegm(self, source) RESULT(localF)
PURE FUNCTION elemFSegm(self, nNodes, source) RESULT(localF)
IMPLICIT NONE
CLASS(meshCell1DCartSegm), 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:2)
REAL(8):: detJ, f
REAL(8):: Xi(1:3)
@ -343,7 +348,7 @@ MODULE moduleMesh1DCart
DO l = 1, 3
Xi(1) = corSeg(l)
detJ = self%detJac(Xi)
detJ = self%detJac(Xi, 2)
fPsi = self%fPsi(Xi, 2)
f = DOT_PRODUCT(fPsi, source)
localF = localF + f*fPsi*wSeg(l)*detJ
@ -362,7 +367,7 @@ MODULE moduleMesh1DCart
phi = (/ self%n1%emData%phi, &
self%n2%emData%phi /)
array = -self%gatherDF(Xi, phi)
array = -self%gatherDF(Xi, 2, phi)
END FUNCTION gatherEFSegm
@ -382,7 +387,7 @@ MODULE moduleMesh1DCart
B(:,3) = (/ self%n1%emData%B(3), &
self%n2%emData%B(3) /)
array = self%gatherF(Xi, 3, B)
array = self%gatherF(Xi, 2, B)
END FUNCTION gatherMFSegm
@ -398,11 +403,12 @@ MODULE moduleMesh1DCart
END FUNCTION insideSegm
!Get nodes from 1D volume
PURE FUNCTION getNodesSegm(self) RESULT(n)
PURE FUNCTION getNodesSegm(self, nNodes) RESULT(n)
IMPLICIT NONE
CLASS(meshCell1DCartSegm), INTENT(in):: self
INTEGER:: n(1:self%nNodes)
INTEGER, INTENT(in):: nNodes
INTEGER:: n(1:nNodes)
n = (/ self%n1%n, self%n2%n /)
@ -442,13 +448,14 @@ MODULE moduleMesh1DCart
!COMMON FUNCTIONS FOR 1D VOLUME ELEMENTS
!Calculates a random position in 1D volume
!Computes the element Jacobian determinant
PURE FUNCTION detJ1DCart(self, Xi, dPsi_in) RESULT(dJ)
PURE FUNCTION detJ1DCart(self, Xi, nNodes, dPsi_in) RESULT(dJ)
IMPLICIT NONE
CLASS(meshCell1DCart), 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):: dJ
REAL(8):: dx(1)
@ -460,20 +467,21 @@ MODULE moduleMesh1DCart
END IF
CALL self%partialDer(dPsi, dx)
CALL self%partialDer(2, dPsi, dx)
dJ = dx(1)
END FUNCTION detJ1DCart
!Computes the invers Jacobian
PURE FUNCTION invJ1DCart(self, Xi, dPsi_in) RESULT(invJ)
PURE FUNCTION invJ1DCart(self, Xi, nNodes, dPsi_in) RESULT(invJ)
IMPLICIT NONE
CLASS(meshCell1DCart), 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):: invJ(1:3,1:3)
REAL(8):: dPsi(1:3,1:self%nNodes)
REAL(8):: dPsi(1:3,1:nNodes)
REAL(8):: dx(1)
IF (PRESENT(dPsi_in)) THEN
@ -486,7 +494,7 @@ MODULE moduleMesh1DCart
invJ = 0.D0
CALL self%partialDer(dPsi, dx)
CALL self%partialDer(2, dPsi, dx)
invJ(1,1) = 1.D0/dx(1)