Mark_1
First thing that I am kinda happy with. Still some things to improve but at least push is good.
This commit is contained in:
parent
15d64f3e68
commit
7f6afd6a87
11 changed files with 336 additions and 258 deletions
|
|
@ -46,10 +46,11 @@ MODULE moduleMesh2DCyl
|
|||
END TYPE meshCell2DCyl
|
||||
|
||||
ABSTRACT INTERFACE
|
||||
PURE SUBROUTINE partialDer_interface(self, dPsi, dz, dr)
|
||||
PURE SUBROUTINE partialDer_interface(self, nNodes, dPsi, dz, dr)
|
||||
IMPORT meshCell2DCyl
|
||||
CLASS(meshCell2DCyl), 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):: dz, dr
|
||||
|
||||
END SUBROUTINE partialDer_interface
|
||||
|
|
@ -166,6 +167,7 @@ MODULE moduleMesh2DCyl
|
|||
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
|
||||
|
|
@ -195,13 +197,13 @@ MODULE moduleMesh2DCyl
|
|||
END SUBROUTINE initEdge2DCyl
|
||||
|
||||
!Get nodes from edge
|
||||
PURE FUNCTION getNodes2DCyl(self) RESULT(n)
|
||||
PURE FUNCTION getNodes2DCyl(self, nNodes) RESULT(n)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshEdge2DCyl), 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 getNodes2DCyl
|
||||
|
|
@ -306,23 +308,23 @@ MODULE moduleMesh2DCyl
|
|||
self%arNodes = 0.D0
|
||||
!2D 1 point Gauss Quad Integral
|
||||
Xi = 0.D0
|
||||
detJ = self%detJac(Xi)*PI8 !4*2*pi
|
||||
detJ = self%detJac(Xi, 4)*PI8 !4*2*pi
|
||||
fPsi = self%fPsi(Xi, 4)
|
||||
!Computes total volume of the cell
|
||||
r = DOT_PRODUCT(fPsi,self%r)
|
||||
self%volume = r*detJ
|
||||
!Computes volume per node
|
||||
Xi = (/-5.D-1, -5.D-1, 0.D0/)
|
||||
r = self%gatherF(Xi, self%r)
|
||||
r = self%gatherF(Xi, 4, self%r)
|
||||
self%arNodes(1) = fPsi(1)*r*detJ
|
||||
Xi = (/ 5.D-1, -5.D-1, 0.D0/)
|
||||
r = self%gatherF(Xi, self%r)
|
||||
r = self%gatherF(Xi, 4, self%r)
|
||||
self%arNodes(2) = fPsi(2)*r*detJ
|
||||
Xi = (/ 5.D-1, 5.D-1, 0.D0/)
|
||||
r = self%gatherF(Xi, self%r)
|
||||
r = self%gatherF(Xi, 4, self%r)
|
||||
self%arNodes(3) = fPsi(3)*r*detJ
|
||||
Xi = (/-5.D-1, 5.D-1, 0.D0/)
|
||||
r = self%gatherF(Xi, self%r)
|
||||
r = self%gatherF(Xi, 4, self%r)
|
||||
self%arNodes(4) = fPsi(4)*r*detJ
|
||||
|
||||
END SUBROUTINE areaQuad
|
||||
|
|
@ -371,11 +373,12 @@ MODULE moduleMesh2DCyl
|
|||
END FUNCTION dPsiQuad
|
||||
|
||||
!Partial derivative in global coordinates
|
||||
PURE SUBROUTINE partialDerQuad(self, dPsi, dz, dr)
|
||||
PURE SUBROUTINE partialDerQuad(self, nNodes, dPsi, dz, dr)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCylQuad), 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):: dz, dr
|
||||
|
||||
dz = (/ DOT_PRODUCT(dPsi(1,1:4),self%z(1:4)), &
|
||||
|
|
@ -408,12 +411,13 @@ MODULE moduleMesh2DCyl
|
|||
END FUNCTION randPosCellQuad
|
||||
|
||||
!Computes element local stiffness matrix
|
||||
PURE FUNCTION elemKQuad(self) RESULT(localK)
|
||||
PURE FUNCTION elemKQuad(self, nNodes) RESULT(localK)
|
||||
USE moduleConstParam, ONLY: PI2
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCylQuad), 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):: r
|
||||
|
|
@ -429,8 +433,8 @@ MODULE moduleMesh2DCyl
|
|||
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)
|
||||
r = DOT_PRODUCT(fPsi,self%r)
|
||||
localK = localK + MATMUL(TRANSPOSE(MATMUL(invJ,dPsi)), &
|
||||
MATMUL(invJ,dPsi))* &
|
||||
|
|
@ -443,13 +447,14 @@ MODULE moduleMesh2DCyl
|
|||
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)
|
||||
USE moduleConstParam, ONLY: PI2
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCylQuad), 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):: r
|
||||
|
|
@ -462,7 +467,7 @@ MODULE moduleMesh2DCyl
|
|||
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)
|
||||
r = DOT_PRODUCT(fPsi,self%r)
|
||||
f = DOT_PRODUCT(fPsi,source)
|
||||
|
|
@ -486,7 +491,7 @@ MODULE moduleMesh2DCyl
|
|||
self%n3%emData%phi, &
|
||||
self%n4%emData%phi /)
|
||||
|
||||
array = -self%gatherDF(Xi, phi)
|
||||
array = -self%gatherDF(Xi, 4, phi)
|
||||
|
||||
END FUNCTION gatherEFQuad
|
||||
|
||||
|
|
@ -512,7 +517,7 @@ MODULE moduleMesh2DCyl
|
|||
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
|
||||
|
||||
|
|
@ -529,11 +534,12 @@ MODULE moduleMesh2DCyl
|
|||
END FUNCTION insideQuad
|
||||
|
||||
!Gets nodes from quadrilateral element
|
||||
PURE FUNCTION getNodesQuad(self) RESULT(n)
|
||||
PURE FUNCTION getNodesQuad(self, nNodes) RESULT(n)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCylQuad), 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 /)
|
||||
|
||||
|
|
@ -556,8 +562,8 @@ MODULE moduleMesh2DCyl
|
|||
|
||||
DO WHILE(conv > 1.D-2)
|
||||
dPsi = self%dPsi(XiO, 4)
|
||||
invJ = self%invJac(XiO, dPsi)
|
||||
detJ = self%detJac(XiO, dPsi)
|
||||
invJ = self%invJac(XiO, 4, dPsi)
|
||||
detJ = self%detJac(XiO, 4, dPsi)
|
||||
fPsi = self%fPsi(XiO, 4)
|
||||
f = (/ DOT_PRODUCT(fPsi,self%z), &
|
||||
DOT_PRODUCT(fPsi,self%r), &
|
||||
|
|
@ -676,7 +682,7 @@ MODULE moduleMesh2DCyl
|
|||
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)*PI !2PI*1/2
|
||||
detJ = self%detJac(Xi, 3)*PI !2PI*1/2
|
||||
fPsi = self%fPsi(Xi, 4)
|
||||
!Computes total volume of the cell
|
||||
r = DOT_PRODUCT(fPsi,self%r)
|
||||
|
|
@ -717,11 +723,12 @@ MODULE moduleMesh2DCyl
|
|||
|
||||
END FUNCTION dPsiTria
|
||||
|
||||
PURE SUBROUTINE partialDerTria(self, dPsi, dz, dr)
|
||||
PURE SUBROUTINE partialDerTria(self, nNodes, dPsi, dz, dr)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCylTria), 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):: dz, dr
|
||||
|
||||
dz = (/ DOT_PRODUCT(dPsi(1,:),self%z), &
|
||||
|
|
@ -732,12 +739,13 @@ MODULE moduleMesh2DCyl
|
|||
END SUBROUTINE partialDerTria
|
||||
|
||||
!Computes element local stiffness matrix
|
||||
PURE FUNCTION elemKTria(self) RESULT(localK)
|
||||
PURE FUNCTION elemKTria(self, nNodes) RESULT(localK)
|
||||
USE moduleConstParam, ONLY: PI2
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCylTria), 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):: r
|
||||
REAL(8):: fPsi(1:3), dPsi(1:3,1:3)
|
||||
|
|
@ -751,8 +759,8 @@ MODULE moduleMesh2DCyl
|
|||
Xi(1) = Xi1Tria(l)
|
||||
Xi(2) = Xi2Tria(l)
|
||||
dPsi = self%dPsi(Xi, 4)
|
||||
detJ = self%detJac(Xi,dPsi)
|
||||
invJ = self%invJac(Xi,dPsi)
|
||||
detJ = self%detJac(Xi, 3, dPsi)
|
||||
invJ = self%invJac(Xi, 3, dPsi)
|
||||
fPsi = self%fPsi(Xi, 4)
|
||||
r = DOT_PRODUCT(fPsi,self%r)
|
||||
localK = localK + MATMUL(TRANSPOSE(MATMUL(invJ,dPsi)),MATMUL(invJ,dPsi))*r*wTria(l)/detJ
|
||||
|
|
@ -763,13 +771,14 @@ MODULE moduleMesh2DCyl
|
|||
END FUNCTION elemKTria
|
||||
|
||||
!Computes element local source vector
|
||||
PURE FUNCTION elemFTria(self, source) RESULT(localF)
|
||||
PURE FUNCTION elemFTria(self, nNodes, source) RESULT(localF)
|
||||
USE moduleConstParam, ONLY: PI2
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCylTria), 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):: r
|
||||
|
|
@ -782,8 +791,8 @@ MODULE moduleMesh2DCyl
|
|||
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)
|
||||
r = DOT_PRODUCT(fPsi,self%r)
|
||||
f = DOT_PRODUCT(fPsi,source)
|
||||
localF = localF + r*f*fPsi*wTria(l)*detJ
|
||||
|
|
@ -804,7 +813,7 @@ MODULE moduleMesh2DCyl
|
|||
self%n2%emData%phi, &
|
||||
self%n3%emData%phi /)
|
||||
|
||||
array = -self%gatherDF(Xi, phi)
|
||||
array = -self%gatherDF(Xi, 4, phi)
|
||||
|
||||
END FUNCTION gatherEFTria
|
||||
|
||||
|
|
@ -844,11 +853,12 @@ MODULE moduleMesh2DCyl
|
|||
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(meshCell2DCylTria), 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 /)
|
||||
|
||||
|
|
@ -868,9 +878,9 @@ MODULE moduleMesh2DCyl
|
|||
!Direct method to convert coordinates
|
||||
Xi = 0.D0
|
||||
deltaR = (/ r(1) - self%z(1), r(2) - self%r(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
|
||||
|
|
@ -900,39 +910,41 @@ MODULE moduleMesh2DCyl
|
|||
|
||||
!COMMON FUNCTIONS FOR CYLINDRICAL VOLUME ELEMENTS
|
||||
!Computes element Jacobian determinant
|
||||
PURE FUNCTION detJ2DCyl(self, Xi, dPsi_in) RESULT(dJ)
|
||||
PURE FUNCTION detJ2DCyl(self, Xi, nNodes, dPsi_in) RESULT(dJ)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCyl), 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):: dz(1:2), dr(1:2)
|
||||
|
||||
IF(PRESENT(dPsi_in)) THEN
|
||||
dPsi = dPsi_in
|
||||
|
||||
ELSE
|
||||
dPsi = self%dPsi(Xi, 4)
|
||||
dPsi = self%dPsi(Xi, nNodes)
|
||||
|
||||
END IF
|
||||
|
||||
CALL self%partialDer(dPsi, dz, dr)
|
||||
CALL self%partialDer(nNodes, dPsi, dz, dr)
|
||||
|
||||
dJ = dz(1)*dr(2)-dz(2)*dr(1)
|
||||
|
||||
END FUNCTION detJ2DCyl
|
||||
|
||||
!Computes element Jacobian inverse matrix (without determinant)
|
||||
PURE FUNCTION invJ2DCyl(self,Xi,dPsi_in) RESULT(invJ)
|
||||
PURE FUNCTION invJ2DCyl(self, Xi, nNodes, dPsi_in) RESULT(invJ)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCyl), 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):: dz(1:2), dr(1:2)
|
||||
|
||||
IF(PRESENT(dPsi_in)) THEN
|
||||
|
|
@ -945,7 +957,7 @@ MODULE moduleMesh2DCyl
|
|||
|
||||
invJ = 0.D0
|
||||
|
||||
CALL self%partialDer(dPsi, dz, dr)
|
||||
CALL self%partialDer(nNodes, dPsi, dz, dr)
|
||||
|
||||
invJ(1,1:2) = (/ dr(2), -dz(2) /)
|
||||
invJ(2,1:2) = (/ -dr(1), dz(1) /)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue