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

@ -46,10 +46,11 @@ MODULE moduleMesh2DCart
END TYPE meshCell2DCart
ABSTRACT INTERFACE
PURE SUBROUTINE partialDer_interface(self, dPsi, dx, dy)
PURE SUBROUTINE partialDer_interface(self, nNodes, dPsi, dx, dy)
IMPORT meshCell2DCart
CLASS(meshCell2DCart), 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:2):: dx, dy
END SUBROUTINE partialDer_interface
@ -166,6 +167,7 @@ MODULE moduleMesh2DCart
INTEGER:: s
self%n = n
self%nNodes = SIZE(p)
self%n1 => mesh%nodes(p(1))%obj
self%n2 => mesh%nodes(p(2))%obj
!Get element coordinates
@ -194,13 +196,13 @@ MODULE moduleMesh2DCart
END SUBROUTINE initEdge2DCart
!Get nodes from edge
PURE FUNCTION getNodes2DCart(self) RESULT(n)
PURE FUNCTION getNodes2DCart(self, nNodes) RESULT(n)
IMPLICIT NONE
CLASS(meshEdge2DCart), INTENT(in):: self
INTEGER, ALLOCATABLE:: n(:)
INTEGER, INTENT(in):: nNodes
INTEGER:: n(1:nNodes)
ALLOCATE(n(1:2))
n = (/self%n1%n, self%n2%n /)
END FUNCTION getNodes2DCart
@ -255,8 +257,13 @@ MODULE moduleMesh2DCart
TYPE(meshNodeCont), INTENT(in), TARGET:: nodes(:)
REAL(8), DIMENSION(1:3):: r1, r2, r3, r4
!Assign node index
self%n = n
!Assign number of nodes of cell
self%nNodes = SIZE(p)
!Assign nodes to element
self%n1 => nodes(p(1))%obj
self%n2 => nodes(p(2))%obj
self%n3 => nodes(p(3))%obj
@ -296,7 +303,7 @@ MODULE moduleMesh2DCart
self%arNodes = 0.D0
!2D 1 point Gauss Quad Integral
Xi = 0.D0
detJ = self%detJac(Xi)*4.D0 !4
detJ = self%detJac(Xi, 4)*4.D0 !4
fPsi = self%fPsi(Xi, 4)
self%volume = detJ
self%arNodes = fPsi*detJ
@ -347,11 +354,12 @@ MODULE moduleMesh2DCart
END FUNCTION dPsiQuad
!Partial derivative in global coordinates
PURE SUBROUTINE partialDerQuad(self, dPsi, dx, dy)
PURE SUBROUTINE partialDerQuad(self, nNodes, dPsi, dx, dy)
IMPLICIT NONE
CLASS(meshCell2DCartQuad), 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:2):: dx, dy
dx = (/ DOT_PRODUCT(dPsi(1,1:4),self%x(1:4)), &
@ -384,11 +392,12 @@ MODULE moduleMesh2DCart
END FUNCTION randPosCellQuad
!Computes element local stiffness matrix
PURE FUNCTION elemKQuad(self) RESULT(localK)
PURE FUNCTION elemKQuad(self, nNodes) RESULT(localK)
IMPLICIT NONE
CLASS(meshCell2DCartQuad), 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
@ -403,8 +412,8 @@ MODULE moduleMesh2DCart
Xi(1) = corQuad(m)
fPsi = self%fPsi(Xi, 4)
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)
localK = localK + MATMUL(TRANSPOSE(MATMUL(invJ,dPsi)), &
MATMUL(invJ,dPsi))* &
wQuad(l)*wQuad(m)/detJ
@ -415,12 +424,13 @@ MODULE moduleMesh2DCart
END FUNCTION elemKQuad
!Computes the local source vector for a force f
PURE FUNCTION elemFQuad(self, source) RESULT(localF)
PURE FUNCTION elemFQuad(self, nNodes, source) RESULT(localF)
IMPLICIT NONE
CLASS(meshCell2DCartQuad), 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):: Xi(1:3)
REAL(8):: fPsi(1:4)
REAL(8):: detJ, f
@ -432,7 +442,7 @@ MODULE moduleMesh2DCart
Xi(1) = corQuad(l)
DO m = 1, 3
Xi(2) = corQuad(m)
detJ = self%detJac(Xi)
detJ = self%detJac(Xi, 4)
fPsi = self%fPsi(Xi, 4)
f = DOT_PRODUCT(fPsi,source)
localF = localF + f*fPsi*wQuad(l)*wQuad(m)*detJ
@ -454,7 +464,7 @@ MODULE moduleMesh2DCart
self%n3%emData%phi, &
self%n4%emData%phi /)
array = -self%gatherDF(Xi, phi)
array = -self%gatherDF(Xi, 4, phi)
END FUNCTION gatherEFQuad
@ -480,7 +490,7 @@ MODULE moduleMesh2DCart
self%n3%emData%B(3), &
self%n4%emData%B(3) /)
array = self%gatherF(Xi, 3, B)
array = self%gatherF(Xi, 4, B)
END FUNCTION gatherMFQuad
@ -497,11 +507,12 @@ MODULE moduleMesh2DCart
END FUNCTION insideQuad
!Gets nodes from quadrilateral element
PURE FUNCTION getNodesQuad(self) RESULT(n)
PURE FUNCTION getNodesQuad(self, nNodes) RESULT(n)
IMPLICIT NONE
CLASS(meshCell2DCartQuad), 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 /)
@ -524,7 +535,7 @@ MODULE moduleMesh2DCart
DO WHILE(conv > 1.D-2)
dPsi = self%dPsi(XiO, 4)
invJ = self%invJac(XiO, dPsi)
invJ = self%invJac(XiO, 4, dPsi)
fPsi = self%fPsi(XiO, 4)
f = (/ DOT_PRODUCT(fPsi,self%x), &
DOT_PRODUCT(fPsi,self%y), &
@ -641,7 +652,7 @@ MODULE moduleMesh2DCart
self%arNodes = 0.D0
!2D 1 point Gauss Quad Integral
Xi = (/1.D0/3.D0, 1.D0/3.D0, 0.D0 /)
detJ = self%detJac(Xi)/2.D0
detJ = self%detJac(Xi, 4)/2.D0
fPsi = self%fPsi(Xi, 4)
self%volume = detJ
self%arNodes = fPsi*detJ
@ -679,11 +690,12 @@ MODULE moduleMesh2DCart
END FUNCTION dPsiTria
PURE SUBROUTINE partialDerTria(self, dPsi, dx, dy)
PURE SUBROUTINE partialDerTria(self, nNodes, dPsi, dx, dy)
IMPLICIT NONE
CLASS(meshCell2DCartTria), 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:2):: dx, dy
dx = (/ DOT_PRODUCT(dPsi(1,:),self%x), &
@ -694,11 +706,12 @@ MODULE moduleMesh2DCart
END SUBROUTINE partialDerTria
!Computes element local stiffness matrix
PURE FUNCTION elemKTria(self) RESULT(localK)
PURE FUNCTION elemKTria(self, nNodes) RESULT(localK)
IMPLICIT NONE
CLASS(meshCell2DCartTria), 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:3), dPsi(1:3,1:3)
REAL(8):: invJ(1:3,1:3), detJ
@ -710,10 +723,10 @@ MODULE moduleMesh2DCart
DO l=1, 4
Xi(1) = Xi1Tria(l)
Xi(2) = Xi2Tria(l)
dPsi = self%dPsi(Xi, 4)
detJ = self%detJac(Xi,dPsi)
invJ = self%invJac(Xi,dPsi)
fPsi = self%fPsi(Xi, 4)
dPsi = self%dPsi(Xi, 3)
detJ = self%detJac(Xi, 3, dPsi)
invJ = self%invJac(Xi, 3, dPsi)
fPsi = self%fPsi(Xi, 3)
localK = localK + MATMUL(TRANSPOSE(MATMUL(invJ,dPsi)),MATMUL(invJ,dPsi))*wTria(l)/detJ
END DO
@ -721,12 +734,13 @@ MODULE moduleMesh2DCart
END FUNCTION elemKTria
!Computes element local source vector
PURE FUNCTION elemFTria(self, source) RESULT(localF)
PURE FUNCTION elemFTria(self, nNodes, source) RESULT(localF)
IMPLICIT NONE
CLASS(meshCell2DCartTria), 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:3)
REAL(8):: Xi(1:3)
REAL(8):: detJ, f
@ -738,8 +752,8 @@ MODULE moduleMesh2DCart
DO l=1, 4
Xi(1) = Xi1Tria(l)
Xi(2) = Xi2Tria(l)
detJ = self%detJac(Xi)
fPsi = self%fPsi(Xi, 4)
detJ = self%detJac(Xi, 3)
fPsi = self%fPsi(Xi, 3)
f = DOT_PRODUCT(fPsi,source)
localF = localF + f*fPsi*wTria(l)*detJ
@ -758,7 +772,7 @@ MODULE moduleMesh2DCart
self%n2%emData%phi, &
self%n3%emData%phi /)
array = -self%gatherDF(Xi, phi)
array = -self%gatherDF(Xi, 3, phi)
END FUNCTION gatherEFTria
@ -798,11 +812,12 @@ MODULE moduleMesh2DCart
END FUNCTION insideTria
!Gets node indexes from triangular element
PURE FUNCTION getNodesTria(self) RESULT(n)
PURE FUNCTION getNodesTria(self, nNodes) RESULT(n)
IMPLICIT NONE
CLASS(meshCell2DCartTria), 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 /)
@ -822,9 +837,9 @@ MODULE moduleMesh2DCart
!Direct method to convert coordinates
Xi = 0.D0
deltaR = (/ r(1) - self%x(1), r(2) - self%y(1), 0.D0 /)
dPsi = self%dPsi(Xi, 4)
invJ = self%invJac(Xi, dPsi)
detJ = self%detJac(Xi, dPsi)
dPsi = self%dPsi(Xi, 3)
invJ = self%invJac(Xi, 3, dPsi)
detJ = self%detJac(Xi, 3, dPsi)
Xi = MATMUL(invJ,deltaR)/detJ
END FUNCTION phy2logTria
@ -854,14 +869,15 @@ MODULE moduleMesh2DCart
!COMMON FUNCTIONS FOR CARTESIAN VOLUME ELEMENTS IN 2D
!Computes element Jacobian determinant
PURE FUNCTION detJ2DCart(self, Xi, dPsi_in) RESULT(dJ)
PURE FUNCTION detJ2DCart(self, Xi, nNodes, dPsi_in) RESULT(dJ)
IMPLICIT NONE
CLASS(meshCell2DCart), 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:2), dy(1:2)
IF(PRESENT(dPsi_in)) THEN
@ -872,21 +888,22 @@ MODULE moduleMesh2DCart
END IF
CALL self%partialDer(dPsi, dx, dy)
CALL self%partialDer(nNodes, dPsi, dx, dy)
dJ = dx(1)*dy(2)-dx(2)*dy(1)
END FUNCTION detJ2DCart
!Computes element Jacobian inverse matrix (without determinant)
PURE FUNCTION invJ2DCart(self,Xi,dPsi_in) RESULT(invJ)
PURE FUNCTION invJ2DCart(self, Xi, nNodes, dPsi_in) RESULT(invJ)
IMPLICIT NONE
CLASS(meshCell2DCart), 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:2), dy(1:2)
IF(PRESENT(dPsi_in)) THEN
@ -899,7 +916,7 @@ MODULE moduleMesh2DCart
invJ = 0.D0
CALL self%partialDer(dPsi, dx, dy)
CALL self%partialDer(nNodes, dPsi, dx, dy)
invJ(1,1:2) = (/ dy(2), -dx(2) /)
invJ(2,1:2) = (/ -dy(1), dx(1) /)