DOES NOT COMPILE: Break
Small break of changing functions. Still some geometries to change.
This commit is contained in:
parent
7f6afd6a87
commit
ba272de4e3
3 changed files with 589 additions and 680 deletions
|
|
@ -19,7 +19,8 @@ MODULE moduleMesh2DCyl
|
|||
!Element coordinates
|
||||
REAL(8):: r = 0.D0, z = 0.D0
|
||||
CONTAINS
|
||||
PROCEDURE, PASS:: init => initNode2DCyl
|
||||
!meshNode DEFERRED PROCEDURES
|
||||
PROCEDURE, PASS:: init => initNode2DCyl
|
||||
PROCEDURE, PASS:: getCoordinates => getCoord2DCyl
|
||||
|
||||
END TYPE meshNode2DCyl
|
||||
|
|
@ -30,35 +31,16 @@ MODULE moduleMesh2DCyl
|
|||
!Connectivity to nodes
|
||||
CLASS(meshNode), POINTER:: n1 => NULL(), n2 => NULL()
|
||||
CONTAINS
|
||||
PROCEDURE, PASS:: init => initEdge2DCyl
|
||||
PROCEDURE, PASS:: getNodes => getNodes2DCyl
|
||||
!meshEdge DEFERRED PROCEDURES
|
||||
PROCEDURE, PASS:: init => initEdge2DCyl
|
||||
PROCEDURE, PASS:: getNodes => getNodes2DCyl
|
||||
PROCEDURE, PASS:: intersection => intersection2DCylEdge
|
||||
PROCEDURE, PASS:: randPos => randPosEdge
|
||||
PROCEDURE, PASS:: randPos => randPosEdge
|
||||
|
||||
END TYPE meshEdge2DCyl
|
||||
|
||||
TYPE, PUBLIC, ABSTRACT, EXTENDS(meshCell):: meshCell2DCyl
|
||||
CONTAINS
|
||||
PROCEDURE, PASS:: detJac => detJ2DCyl
|
||||
PROCEDURE, PASS:: invJac => invJ2DCyl
|
||||
PROCEDURE(partialDer_interface), DEFERRED, PASS, PRIVATE:: partialDer
|
||||
|
||||
END TYPE meshCell2DCyl
|
||||
|
||||
ABSTRACT INTERFACE
|
||||
PURE SUBROUTINE partialDer_interface(self, nNodes, dPsi, dz, dr)
|
||||
IMPORT meshCell2DCyl
|
||||
CLASS(meshCell2DCyl), INTENT(in):: self
|
||||
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
|
||||
|
||||
END INTERFACE
|
||||
|
||||
!Quadrilateral volume element
|
||||
TYPE, PUBLIC, EXTENDS(meshCell2DCyl):: meshCell2DCylQuad
|
||||
TYPE, PUBLIC, EXTENDS(meshCell):: meshCell2DCylQuad
|
||||
!Element coordinates
|
||||
REAL(8):: r(1:4) = 0.D0, z(1:4) = 0.D0
|
||||
!Connectivity to nodes
|
||||
|
|
@ -68,25 +50,29 @@ MODULE moduleMesh2DCyl
|
|||
REAL(8):: arNodes(1:4) = 0.D0
|
||||
|
||||
CONTAINS
|
||||
PROCEDURE, PASS:: init => initCellQuad2DCyl
|
||||
PROCEDURE, PASS:: randPos => randPosCellQuad
|
||||
PROCEDURE, PASS:: area => areaQuad
|
||||
PROCEDURE, PASS:: fPsi => fPsiQuad
|
||||
PROCEDURE, PASS:: dPsi => dPsiQuad
|
||||
PROCEDURE, PASS, PRIVATE:: partialDer => partialDerQuad
|
||||
PROCEDURE, PASS:: elemK => elemKQuad
|
||||
PROCEDURE, PASS:: elemF => elemFQuad
|
||||
PROCEDURE, PASS:: gatherElectricField => gatherEFQuad
|
||||
PROCEDURE, PASS:: gatherMagneticField => gatherMFQuad
|
||||
PROCEDURE, NOPASS:: inside => insideQuad
|
||||
PROCEDURE, PASS:: getNodes => getNodesQuad
|
||||
PROCEDURE, PASS:: phy2log => phy2logQuad
|
||||
PROCEDURE, PASS:: nextElement => nextElementQuad
|
||||
!meshCell DEFERRED PROCEDURES
|
||||
PROCEDURE, PASS:: init => initCellQuad2DCyl
|
||||
PROCEDURE, PASS:: getNodes => getNodesQuad
|
||||
PROCEDURE, PASS:: randPos => randPosCellQuad
|
||||
PROCEDURE, NOPASS:: fPsi => fPsiQuad
|
||||
PROCEDURE, NOPASS:: dPsi => dPsiQuad
|
||||
PROCEDURE, PASS:: partialDer => partialDerQuad
|
||||
PROCEDURE, NOPASS:: detJac => detJ2DCyl
|
||||
PROCEDURE, NOPASS:: invJac => invJ2DCyl
|
||||
PROCEDURE, PASS:: gatherElectricField => gatherEFQuad
|
||||
PROCEDURE, PASS:: gatherMagneticField => gatherMFQuad
|
||||
PROCEDURE, PASS:: elemK => elemKQuad
|
||||
PROCEDURE, PASS:: elemF => elemFQuad
|
||||
PROCEDURE, NOPASS:: inside => insideQuad
|
||||
PROCEDURE, PASS:: phy2log => phy2logQuad
|
||||
PROCEDURE, PASS:: neighbourElement => neighbourElementQuad
|
||||
!PARTICLUAR PROCEDURES
|
||||
PROCEDURE, PASS:: area => areaQuad
|
||||
|
||||
END TYPE meshCell2DCylQuad
|
||||
|
||||
!Triangular volume element
|
||||
TYPE, PUBLIC, EXTENDS(meshCell2DCyl):: meshCell2DCylTria
|
||||
TYPE, PUBLIC, EXTENDS(meshCell):: meshCell2DCylTria
|
||||
!Element coordinates
|
||||
REAL(8):: r(1:3) = 0.D0, z(1:3) = 0.D0
|
||||
!Connectivity to nodes
|
||||
|
|
@ -96,20 +82,24 @@ MODULE moduleMesh2DCyl
|
|||
REAL(8):: arNodes(1:3) = 0.D0
|
||||
|
||||
CONTAINS
|
||||
PROCEDURE, PASS:: init => initCellTria2DCyl
|
||||
PROCEDURE, PASS:: randPos => randPosCellTria
|
||||
PROCEDURE, PASS:: area => areaTria
|
||||
PROCEDURE, PASS:: fPsi => fPsiTria
|
||||
PROCEDURE, PASS:: dPsi => dPsiTria
|
||||
PROCEDURE, PASS, PRIVATE:: partialDer => partialDerTria
|
||||
PROCEDURE, PASS:: elemK => elemKTria
|
||||
PROCEDURE, PASS:: elemF => elemFTria
|
||||
PROCEDURE, PASS:: gatherElectricField => gatherEFTria
|
||||
PROCEDURE, PASS:: gatherMagneticField => gatherMFTria
|
||||
PROCEDURE, NOPASS:: inside => insideTria
|
||||
PROCEDURE, PASS:: getNodes => getNodesTria
|
||||
PROCEDURE, PASS:: phy2log => phy2logTria
|
||||
PROCEDURE, PASS:: nextElement => nextElementTria
|
||||
!meshCell DEFERRED PROCEDURES
|
||||
PROCEDURE, PASS:: init => initCellTria2DCyl
|
||||
PROCEDURE, PASS:: getNodes => getNodesTria
|
||||
PROCEDURE, PASS:: randPos => randPosCellTria
|
||||
PROCEDURE, NOPASS:: fPsi => fPsiTria
|
||||
PROCEDURE, NOPASS:: dPsi => dPsiTria
|
||||
PROCEDURE, PASS:: partialDer => partialDerTria
|
||||
PROCEDURE, NOPASS:: detJac => detJ2DCyl
|
||||
PROCEDURE, NOPASS:: invJac => invJ2DCyl
|
||||
PROCEDURE, PASS:: gatherElectricField => gatherEFTria
|
||||
PROCEDURE, PASS:: gatherMagneticField => gatherMFTria
|
||||
PROCEDURE, PASS:: elemK => elemKTria
|
||||
PROCEDURE, PASS:: elemF => elemFTria
|
||||
PROCEDURE, NOPASS:: inside => insideTria
|
||||
PROCEDURE, PASS:: phy2log => phy2logTria
|
||||
PROCEDURE, PASS:: neighbourElement => neighbourElementTria
|
||||
!PARTICULAR PROCEDURES
|
||||
PROCEDURE, PASS:: area => areaTria
|
||||
|
||||
END TYPE meshCell2DCylTria
|
||||
|
||||
|
|
@ -294,99 +284,17 @@ MODULE moduleMesh2DCyl
|
|||
|
||||
END SUBROUTINE initCellQuad2DCyl
|
||||
|
||||
!Computes element area
|
||||
PURE SUBROUTINE areaQuad(self)
|
||||
USE moduleConstParam, ONLY: PI8
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCylQuad), INTENT(inout):: self
|
||||
REAL(8):: r, Xi(1:3)
|
||||
REAL(8):: detJ
|
||||
REAL(8):: fPsi(1:4), fPsi_node(1:4)
|
||||
|
||||
self%volume = 0.D0
|
||||
self%arNodes = 0.D0
|
||||
!2D 1 point Gauss Quad Integral
|
||||
Xi = 0.D0
|
||||
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, 4, self%r)
|
||||
self%arNodes(1) = fPsi(1)*r*detJ
|
||||
Xi = (/ 5.D-1, -5.D-1, 0.D0/)
|
||||
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, 4, self%r)
|
||||
self%arNodes(3) = fPsi(3)*r*detJ
|
||||
Xi = (/-5.D-1, 5.D-1, 0.D0/)
|
||||
r = self%gatherF(Xi, 4, self%r)
|
||||
self%arNodes(4) = fPsi(4)*r*detJ
|
||||
|
||||
END SUBROUTINE areaQuad
|
||||
|
||||
!Computes element functions in point Xi
|
||||
PURE FUNCTION fPsiQuad(self, Xi, nNodes) RESULT(fPsi)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCylQuad), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
INTEGER, INTENT(in):: nNodes
|
||||
REAL(8):: fPsi(1:nNodes)
|
||||
|
||||
fPsi = (/ (1.D0-Xi(1)) * (1.D0-Xi(2)), &
|
||||
(1.D0+Xi(1)) * (1.D0-Xi(2)), &
|
||||
(1.D0+Xi(1)) * (1.D0+Xi(2)), &
|
||||
(1.D0-Xi(1)) * (1.D0+Xi(2)) /)
|
||||
|
||||
fPsi = fPsi*0.25D0
|
||||
|
||||
END FUNCTION fPsiQuad
|
||||
|
||||
!Derivative element function at coordinates Xi
|
||||
PURE FUNCTION dPsiQuad(self, Xi, nNodes) RESULT(dPsi)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCylQuad), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
INTEGER, INTENT(in):: nNodes
|
||||
REAL(8):: dPsi(1:3,1:nNodes)
|
||||
|
||||
dPsi = 0.D0
|
||||
|
||||
dPsi(1,:) = (/ -(1.D0 - Xi(2)), &
|
||||
(1.D0 - Xi(2)), &
|
||||
(1.D0 + Xi(2)), &
|
||||
-(1.D0 + Xi(2)) /)
|
||||
|
||||
dPsi(2,:) = (/ -(1.D0 - Xi(1)), &
|
||||
-(1.D0 + Xi(1)), &
|
||||
(1.D0 + Xi(1)), &
|
||||
(1.D0 - Xi(1)) /)
|
||||
|
||||
dPsi = dPsi * 0.25D0
|
||||
|
||||
END FUNCTION dPsiQuad
|
||||
|
||||
!Partial derivative in global coordinates
|
||||
PURE SUBROUTINE partialDerQuad(self, nNodes, dPsi, dz, dr)
|
||||
!Gets nodes from quadrilateral element
|
||||
PURE FUNCTION getNodesQuad(self, nNodes) RESULT(n)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCylQuad), INTENT(in):: self
|
||||
INTEGER, INTENT(in):: nNodes
|
||||
REAL(8), INTENT(in):: dPsi(1:3,1:nNodes)
|
||||
REAL(8), INTENT(out), DIMENSION(1:2):: dz, dr
|
||||
INTEGER:: n(1:nNodes)
|
||||
|
||||
dz = (/ DOT_PRODUCT(dPsi(1,1:4),self%z(1:4)), &
|
||||
DOT_PRODUCT(dPsi(2,1:4),self%z(1:4)) /)
|
||||
dr = (/ DOT_PRODUCT(dPsi(1,1:4),self%r(1:4)), &
|
||||
DOT_PRODUCT(dPsi(2,1:4),self%r(1:4)) /)
|
||||
n = (/self%n1%n, self%n2%n, self%n3%n, self%n4%n /)
|
||||
|
||||
END SUBROUTINE partialDerQuad
|
||||
END FUNCTION getNodesQuad
|
||||
|
||||
!Random position in quadrilateral volume
|
||||
FUNCTION randPosCellQuad(self) RESULT(r)
|
||||
|
|
@ -410,74 +318,64 @@ MODULE moduleMesh2DCyl
|
|||
|
||||
END FUNCTION randPosCellQuad
|
||||
|
||||
!Computes element local stiffness matrix
|
||||
PURE FUNCTION elemKQuad(self, nNodes) RESULT(localK)
|
||||
USE moduleConstParam, ONLY: PI2
|
||||
!Computes element functions in point Xi
|
||||
PURE FUNCTION fPsiQuad(Xi, nNodes) RESULT(fPsi)
|
||||
IMPLICIT NONE
|
||||
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
INTEGER, INTENT(in):: nNodes
|
||||
REAL(8):: fPsi(1:nNodes)
|
||||
|
||||
fPsi = (/ (1.D0-Xi(1)) * (1.D0-Xi(2)), &
|
||||
(1.D0+Xi(1)) * (1.D0-Xi(2)), &
|
||||
(1.D0+Xi(1)) * (1.D0+Xi(2)), &
|
||||
(1.D0-Xi(1)) * (1.D0+Xi(2)) /)
|
||||
|
||||
fPsi = fPsi*0.25D0
|
||||
|
||||
END FUNCTION fPsiQuad
|
||||
|
||||
!Derivative element function at coordinates Xi
|
||||
PURE FUNCTION dPsiQuad(Xi, nNodes) RESULT(dPsi)
|
||||
IMPLICIT NONE
|
||||
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
INTEGER, INTENT(in):: nNodes
|
||||
REAL(8):: dPsi(1:3,1:nNodes)
|
||||
|
||||
dPsi = 0.D0
|
||||
|
||||
dPsi(1,:) = (/ -(1.D0 - Xi(2)), &
|
||||
(1.D0 - Xi(2)), &
|
||||
(1.D0 + Xi(2)), &
|
||||
-(1.D0 + Xi(2)) /)
|
||||
|
||||
dPsi(2,:) = (/ -(1.D0 - Xi(1)), &
|
||||
-(1.D0 + Xi(1)), &
|
||||
(1.D0 + Xi(1)), &
|
||||
(1.D0 - Xi(1)) /)
|
||||
|
||||
dPsi = dPsi * 0.25D0
|
||||
|
||||
END FUNCTION dPsiQuad
|
||||
|
||||
!Partial derivative in global coordinates
|
||||
PURE FUNCTION partialDerQuad(self, nNodes, dPsi) RESULT(pDer)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCylQuad), INTENT(in):: self
|
||||
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
|
||||
REAL(8):: invJ(1:3,1:3), detJ
|
||||
INTEGER:: l, m
|
||||
REAL(8), INTENT(in):: dPsi(1:3,1:nNodes)
|
||||
REAL(8):: pDer(1:3, 1:3)
|
||||
|
||||
localK=0.D0
|
||||
Xi=0.D0
|
||||
!Start 2D Gauss Quad Integral
|
||||
DO l=1, 3
|
||||
Xi(2) = corQuad(l)
|
||||
DO m = 1, 3
|
||||
Xi(1) = corQuad(m)
|
||||
fPsi = self%fPsi(Xi, 4)
|
||||
dPsi = self%dPsi(Xi, 4)
|
||||
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))* &
|
||||
r*wQuad(l)*wQuad(m)/detJ
|
||||
pDer = 0.D0
|
||||
|
||||
END DO
|
||||
END DO
|
||||
localK = localK*PI2
|
||||
pDer(1, 1:2) = (/ DOT_PRODUCT(dPsi(1,1:4),self%z(1:4)), &
|
||||
DOT_PRODUCT(dPsi(2,1:4),self%z(1:4)) /)
|
||||
pDer(2, 1:2) = (/ DOT_PRODUCT(dPsi(1,1:4),self%r(1:4)), &
|
||||
DOT_PRODUCT(dPsi(2,1:4),self%r(1:4)) /)
|
||||
|
||||
END FUNCTION elemKQuad
|
||||
|
||||
!Computes the local source vector for a force f
|
||||
PURE FUNCTION elemFQuad(self, nNodes, source) RESULT(localF)
|
||||
USE moduleConstParam, ONLY: PI2
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCylQuad), INTENT(in):: self
|
||||
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
|
||||
REAL(8):: detJ, f
|
||||
INTEGER:: l, m
|
||||
|
||||
localF = 0.D0
|
||||
Xi = 0.D0
|
||||
DO l=1, 3
|
||||
Xi(1) = corQuad(l)
|
||||
DO m = 1, 3
|
||||
Xi(2) = corQuad(m)
|
||||
detJ = self%detJac(Xi, 4)
|
||||
fPsi = self%fPsi(Xi, 4)
|
||||
r = DOT_PRODUCT(fPsi,self%r)
|
||||
f = DOT_PRODUCT(fPsi,source)
|
||||
localF = localF + r*f*fPsi*wQuad(l)*wQuad(m)*detJ
|
||||
|
||||
END DO
|
||||
END DO
|
||||
localF = localF*PI2
|
||||
|
||||
END FUNCTION elemFQuad
|
||||
END FUNCTION partialDerQuad
|
||||
|
||||
PURE FUNCTION gatherEFQuad(self, Xi) RESULT(array)
|
||||
IMPLICIT NONE
|
||||
|
|
@ -521,6 +419,80 @@ MODULE moduleMesh2DCyl
|
|||
|
||||
END FUNCTION gatherMFQuad
|
||||
|
||||
!Computes element local stiffness matrix
|
||||
PURE FUNCTION elemKQuad(self, nNodes) RESULT(localK)
|
||||
USE moduleConstParam, ONLY: PI2
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCylQuad), INTENT(in):: self
|
||||
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):: pDer(1:3, 1:3)
|
||||
REAL(8):: r
|
||||
REAL(8):: invJ(1:3,1:3), detJ
|
||||
INTEGER:: l, m
|
||||
|
||||
localK=0.D0
|
||||
Xi=0.D0
|
||||
!Start 2D Gauss Quad Integral
|
||||
DO l=1, 3
|
||||
Xi(2) = corQuad(l)
|
||||
DO m = 1, 3
|
||||
Xi(1) = corQuad(m)
|
||||
dPsi = self%dPsi(Xi, 4)
|
||||
pDer = self%partialDer(4, dPsi)
|
||||
detJ = self%detJac(pDer)
|
||||
invJ = self%invJac(pDer)
|
||||
fPsi = self%fPsi(Xi, 4)
|
||||
r = DOT_PRODUCT(fPsi,self%r)
|
||||
localK = localK + MATMUL(TRANSPOSE(MATMUL(invJ,dPsi)), &
|
||||
MATMUL(invJ,dPsi))* &
|
||||
r*wQuad(l)*wQuad(m)/detJ
|
||||
|
||||
END DO
|
||||
END DO
|
||||
localK = localK*PI2
|
||||
|
||||
END FUNCTION elemKQuad
|
||||
|
||||
!Computes the local source vector for a force f
|
||||
PURE FUNCTION elemFQuad(self, nNodes, source) RESULT(localF)
|
||||
USE moduleConstParam, ONLY: PI2
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCylQuad), INTENT(in):: self
|
||||
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), dPsi(1:3, 1:4)
|
||||
REAL(8):: pDer(1:3, 1:3)
|
||||
REAL(8):: r
|
||||
REAL(8):: detJ, f
|
||||
INTEGER:: l, m
|
||||
|
||||
localF = 0.D0
|
||||
Xi = 0.D0
|
||||
DO l=1, 3
|
||||
Xi(1) = corQuad(l)
|
||||
DO m = 1, 3
|
||||
Xi(2) = corQuad(m)
|
||||
dPsi = self%dPsi(Xi, 4)
|
||||
pDer = self%partialDer(4, dPsi)
|
||||
detJ = self%detJac(pDer)
|
||||
fPsi = self%fPsi(Xi, 4)
|
||||
r = DOT_PRODUCT(fPsi,self%r)
|
||||
f = DOT_PRODUCT(fPsi,source)
|
||||
localF = localF + r*f*fPsi*wQuad(l)*wQuad(m)*detJ
|
||||
|
||||
END DO
|
||||
END DO
|
||||
localF = localF*PI2
|
||||
|
||||
END FUNCTION elemFQuad
|
||||
|
||||
!Checks if a particle is inside a quad element
|
||||
PURE FUNCTION insideQuad(Xi) RESULT(ins)
|
||||
IMPLICIT NONE
|
||||
|
|
@ -533,18 +505,6 @@ MODULE moduleMesh2DCyl
|
|||
|
||||
END FUNCTION insideQuad
|
||||
|
||||
!Gets nodes from quadrilateral element
|
||||
PURE FUNCTION getNodesQuad(self, nNodes) RESULT(n)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCylQuad), INTENT(in):: self
|
||||
INTEGER, INTENT(in):: nNodes
|
||||
INTEGER:: n(1:nNodes)
|
||||
|
||||
n = (/self%n1%n, self%n2%n, self%n3%n, self%n4%n /)
|
||||
|
||||
END FUNCTION getNodesQuad
|
||||
|
||||
!Transforms physical coordinates to element coordinates
|
||||
PURE FUNCTION phy2logQuad(self,r) RESULT(Xi)
|
||||
IMPLICIT NONE
|
||||
|
|
@ -554,6 +514,7 @@ MODULE moduleMesh2DCyl
|
|||
REAL(8):: Xi(1:3)
|
||||
REAL(8):: XiO(1:3), detJ, invJ(1:3,1:3), f(1:3)
|
||||
REAL(8):: dPsi(1:3,1:4), fPsi(1:4)
|
||||
REAL(8):: pDer(1:3, 1:3)
|
||||
REAL(8):: conv
|
||||
|
||||
!Iterative newton method to transform coordinates
|
||||
|
|
@ -562,8 +523,9 @@ MODULE moduleMesh2DCyl
|
|||
|
||||
DO WHILE(conv > 1.D-2)
|
||||
dPsi = self%dPsi(XiO, 4)
|
||||
invJ = self%invJac(XiO, 4, dPsi)
|
||||
detJ = self%detJac(XiO, 4, dPsi)
|
||||
pDer = self%partialDer(4, dPsi)
|
||||
detJ = self%detJac(pDer)
|
||||
invJ = self%invJac(pDer)
|
||||
fPsi = self%fPsi(XiO, 4)
|
||||
f = (/ DOT_PRODUCT(fPsi,self%z), &
|
||||
DOT_PRODUCT(fPsi,self%r), &
|
||||
|
|
@ -578,31 +540,69 @@ MODULE moduleMesh2DCyl
|
|||
END FUNCTION phy2logQuad
|
||||
|
||||
!Gets the next element for a logical position Xi
|
||||
SUBROUTINE nextElementQuad(self, Xi, nextElement)
|
||||
SUBROUTINE neighbourElementQuad(self, Xi, neighbourElement)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCylQuad), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
CLASS(meshElement), POINTER, INTENT(out):: nextElement
|
||||
CLASS(meshElement), POINTER, INTENT(out):: neighbourElement
|
||||
REAL(8):: XiArray(1:4)
|
||||
INTEGER:: nextInt
|
||||
|
||||
XiArray = (/ -Xi(2), Xi(1), Xi(2), -Xi(1) /)
|
||||
nextInt = MAXLOC(XiArray,1)
|
||||
!Selects the higher value of directions and searches in that direction
|
||||
NULLIFY(nextElement)
|
||||
NULLIFY(neighbourElement)
|
||||
SELECT CASE (nextInt)
|
||||
CASE (1)
|
||||
nextElement => self%e1
|
||||
neighbourElement => self%e1
|
||||
CASE (2)
|
||||
nextElement => self%e2
|
||||
neighbourElement => self%e2
|
||||
CASE (3)
|
||||
nextElement => self%e3
|
||||
neighbourElement => self%e3
|
||||
CASE (4)
|
||||
nextElement => self%e4
|
||||
neighbourElement => self%e4
|
||||
END SELECT
|
||||
|
||||
END SUBROUTINE nextElementQuad
|
||||
END SUBROUTINE neighbourElementQuad
|
||||
|
||||
!Computes element area
|
||||
PURE SUBROUTINE areaQuad(self)
|
||||
USE moduleConstParam, ONLY: PI8
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCylQuad), INTENT(inout):: self
|
||||
REAL(8):: r, Xi(1:3)
|
||||
REAL(8):: detJ
|
||||
REAL(8):: fPsi(1:4)
|
||||
REAL(8):: dPsi(1:3, 1:4), pDer(1:3, 1:3)
|
||||
|
||||
self%volume = 0.D0
|
||||
self%arNodes = 0.D0
|
||||
!2D 1 point Gauss Quad Integral
|
||||
Xi = 0.D0
|
||||
dPsi = self%dPsi(Xi, 4)
|
||||
pDer = self%partialDer(4, dPsi)
|
||||
detJ = self%detJac(pDer)*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, 4, self%r)
|
||||
self%arNodes(1) = fPsi(1)*r*detJ
|
||||
Xi = (/ 5.D-1, -5.D-1, 0.D0/)
|
||||
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, 4, self%r)
|
||||
self%arNodes(3) = fPsi(3)*r*detJ
|
||||
Xi = (/-5.D-1, 5.D-1, 0.D0/)
|
||||
r = self%gatherF(Xi, 4, self%r)
|
||||
self%arNodes(4) = fPsi(4)*r*detJ
|
||||
|
||||
END SUBROUTINE areaQuad
|
||||
|
||||
!TRIA ELEMENT
|
||||
!Init tria element
|
||||
|
|
@ -645,6 +645,18 @@ MODULE moduleMesh2DCyl
|
|||
|
||||
END SUBROUTINE initCellTria2DCyl
|
||||
|
||||
!Gets node indexes from triangular element
|
||||
PURE FUNCTION getNodesTria(self, nNodes) RESULT(n)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCylTria), INTENT(in):: self
|
||||
INTEGER, INTENT(in):: nNodes
|
||||
INTEGER:: n(1:nNodes)
|
||||
|
||||
n = (/self%n1%n, self%n2%n, self%n3%n /)
|
||||
|
||||
END FUNCTION getNodesTria
|
||||
|
||||
!Random position in quadrilateral volume
|
||||
FUNCTION randPosCellTria(self) RESULT(r)
|
||||
USE moduleRandom
|
||||
|
|
@ -667,36 +679,10 @@ MODULE moduleMesh2DCyl
|
|||
|
||||
END FUNCTION randPosCellTria
|
||||
|
||||
!Calculates area for triangular element
|
||||
PURE SUBROUTINE areaTria(self)
|
||||
USE moduleConstParam, ONLY: PI
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCylTria), INTENT(inout):: self
|
||||
REAL(8):: Xi(1:3)
|
||||
REAL(8):: r
|
||||
REAL(8):: detJ
|
||||
REAL(8):: fPsi(1:3)
|
||||
|
||||
self%volume = 0.D0
|
||||
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, 3)*PI !2PI*1/2
|
||||
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
|
||||
self%arNodes = fPsi*r*detJ
|
||||
|
||||
END SUBROUTINE areaTria
|
||||
|
||||
!Shape functions for triangular element
|
||||
PURE FUNCTION fPsiTria(self, Xi, nNodes) RESULT(fPsi)
|
||||
PURE FUNCTION fPsiTria(Xi, nNodes) RESULT(fPsi)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCylTria), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
INTEGER, INTENT(in):: nNodes
|
||||
REAL(8):: fPsi(1:nNodes)
|
||||
|
|
@ -708,10 +694,9 @@ MODULE moduleMesh2DCyl
|
|||
END FUNCTION fPsiTria
|
||||
|
||||
!Derivative element function at coordinates Xi
|
||||
PURE FUNCTION dPsiTria(self, Xi, nNodes) RESULT(dPsi)
|
||||
PURE FUNCTION dPsiTria(Xi, nNodes) RESULT(dPsi)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCylTria), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
INTEGER, INTENT(in):: nNodes
|
||||
REAL(8):: dPsi(1:3,1:nNodes)
|
||||
|
|
@ -723,84 +708,22 @@ MODULE moduleMesh2DCyl
|
|||
|
||||
END FUNCTION dPsiTria
|
||||
|
||||
PURE SUBROUTINE partialDerTria(self, nNodes, dPsi, dz, dr)
|
||||
PURE FUNCTION partialDerTria(self, nNodes, dPsi) RESULT(pDer)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCylTria), INTENT(in):: self
|
||||
INTEGER, INTENT(in):: nNodes
|
||||
REAL(8), INTENT(in):: dPsi(1:3,1:nNodes)
|
||||
REAL(8), INTENT(out), DIMENSION(1:2):: dz, dr
|
||||
REAL(8):: pDer(1:3, 1:3)
|
||||
|
||||
dz = (/ DOT_PRODUCT(dPsi(1,:),self%z), &
|
||||
DOT_PRODUCT(dPsi(2,:),self%z) /)
|
||||
dr = (/ DOT_PRODUCT(dPsi(1,:),self%r), &
|
||||
DOT_PRODUCT(dPsi(2,:),self%r) /)
|
||||
pDer = 0.D0
|
||||
|
||||
END SUBROUTINE partialDerTria
|
||||
pDer(1, 1:2) = (/ DOT_PRODUCT(dPsi(1,1:3),self%z(1:3)), &
|
||||
DOT_PRODUCT(dPsi(2,1:3),self%z(1:3)) /)
|
||||
pDer(2, 1:2) = (/ DOT_PRODUCT(dPsi(1,1:3),self%r(1:3)), &
|
||||
DOT_PRODUCT(dPsi(2,1:3),self%r(1:3)) /)
|
||||
|
||||
!Computes element local stiffness matrix
|
||||
PURE FUNCTION elemKTria(self, nNodes) RESULT(localK)
|
||||
USE moduleConstParam, ONLY: PI2
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCylTria), INTENT(in):: self
|
||||
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)
|
||||
REAL(8):: invJ(1:3,1:3), detJ
|
||||
INTEGER:: l
|
||||
|
||||
localK=0.D0
|
||||
Xi=0.D0
|
||||
!Start 2D Gauss Quad Integral
|
||||
DO l=1, 4
|
||||
Xi(1) = Xi1Tria(l)
|
||||
Xi(2) = Xi2Tria(l)
|
||||
dPsi = self%dPsi(Xi, 4)
|
||||
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
|
||||
|
||||
END DO
|
||||
localK = localK*PI2
|
||||
|
||||
END FUNCTION elemKTria
|
||||
|
||||
!Computes element local source vector
|
||||
PURE FUNCTION elemFTria(self, nNodes, source) RESULT(localF)
|
||||
USE moduleConstParam, ONLY: PI2
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCylTria), INTENT(in):: self
|
||||
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
|
||||
REAL(8):: detJ, f
|
||||
INTEGER:: l
|
||||
|
||||
localF = 0.D0
|
||||
Xi = 0.D0
|
||||
!Start 2D Gauss Quad Integral
|
||||
DO l=1, 4
|
||||
Xi(1) = Xi1Tria(l)
|
||||
Xi(2) = Xi2Tria(l)
|
||||
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
|
||||
|
||||
END DO
|
||||
localF = localF*PI2
|
||||
|
||||
END FUNCTION elemFTria
|
||||
END FUNCTION partialDerTria
|
||||
|
||||
PURE FUNCTION gatherEFTria(self, Xi) RESULT(array)
|
||||
IMPLICIT NONE
|
||||
|
|
@ -840,6 +763,75 @@ MODULE moduleMesh2DCyl
|
|||
|
||||
END FUNCTION gatherMFTria
|
||||
|
||||
!Computes element local stiffness matrix
|
||||
PURE FUNCTION elemKTria(self, nNodes) RESULT(localK)
|
||||
USE moduleConstParam, ONLY: PI2
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCylTria), INTENT(in):: self
|
||||
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)
|
||||
REAL(8):: pDer(1:3, 1:3)
|
||||
REAL(8):: invJ(1:3,1:3), detJ
|
||||
INTEGER:: l
|
||||
|
||||
localK=0.D0
|
||||
Xi=0.D0
|
||||
!Start 2D Gauss Quad Integral
|
||||
DO l=1, 4
|
||||
Xi(1) = Xi1Tria(l)
|
||||
Xi(2) = Xi2Tria(l)
|
||||
dPsi = self%dPsi(Xi, 3)
|
||||
pDer = self%partialDer(3, dPsi)
|
||||
detJ = self%detJac(pDer)
|
||||
invJ = self%invJac(pDer)
|
||||
fPsi = self%fPsi(Xi, 3)
|
||||
r = DOT_PRODUCT(fPsi,self%r)
|
||||
localK = localK + MATMUL(TRANSPOSE(MATMUL(invJ,dPsi)),MATMUL(invJ,dPsi))*r*wTria(l)/detJ
|
||||
|
||||
END DO
|
||||
localK = localK*PI2
|
||||
|
||||
END FUNCTION elemKTria
|
||||
|
||||
!Computes element local source vector
|
||||
PURE FUNCTION elemFTria(self, nNodes, source) RESULT(localF)
|
||||
USE moduleConstParam, ONLY: PI2
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCylTria), INTENT(in):: self
|
||||
INTEGER, INTENT(in):: nNodes
|
||||
REAL(8), INTENT(in):: source(1:nNodes)
|
||||
REAL(8):: localF(1:nNodes)
|
||||
REAL(8):: fPsi(1:3)
|
||||
REAL(8):: dPsi(1:3, 1:3), pDer(1:3, 1:3)
|
||||
REAL(8):: Xi(1:3)
|
||||
REAL(8):: r
|
||||
REAL(8):: detJ, f
|
||||
INTEGER:: l
|
||||
|
||||
localF = 0.D0
|
||||
Xi = 0.D0
|
||||
!Start 2D Gauss Quad Integral
|
||||
DO l=1, 4
|
||||
Xi(1) = Xi1Tria(l)
|
||||
Xi(2) = Xi2Tria(l)
|
||||
dPsi = self%dPsi(Xi, 3)
|
||||
pDer = self%partialDer(3, dPsi)
|
||||
detJ = self%detJac(pDer)
|
||||
fPsi = self%fPsi(Xi, 3)
|
||||
r = DOT_PRODUCT(fPsi,self%r)
|
||||
f = DOT_PRODUCT(fPsi,source)
|
||||
localF = localF + r*f*fPsi*wTria(l)*detJ
|
||||
|
||||
END DO
|
||||
localF = localF*PI2
|
||||
|
||||
END FUNCTION elemFTria
|
||||
|
||||
PURE FUNCTION insideTria(Xi) RESULT(ins)
|
||||
IMPLICIT NONE
|
||||
|
||||
|
|
@ -852,18 +844,6 @@ MODULE moduleMesh2DCyl
|
|||
|
||||
END FUNCTION insideTria
|
||||
|
||||
!Gets node indexes from triangular element
|
||||
PURE FUNCTION getNodesTria(self, nNodes) RESULT(n)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCylTria), INTENT(in):: self
|
||||
INTEGER, INTENT(in):: nNodes
|
||||
INTEGER:: n(1:nNodes)
|
||||
|
||||
n = (/self%n1%n, self%n2%n, self%n3%n /)
|
||||
|
||||
END FUNCTION getNodesTria
|
||||
|
||||
!Transforms physical coordinates to element coordinates
|
||||
PURE FUNCTION phy2logTria(self,r) RESULT(Xi)
|
||||
IMPLICIT NONE
|
||||
|
|
@ -871,96 +851,97 @@ MODULE moduleMesh2DCyl
|
|||
CLASS(meshCell2DCylTria), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: r(1:3)
|
||||
REAL(8):: Xi(1:3)
|
||||
REAL(8):: invJ(1:3,1:3), detJ
|
||||
REAL(8):: deltaR(1:3)
|
||||
REAL(8):: dPsi(1:3,1:3)
|
||||
REAL(8):: dPsi(1:3, 1:3)
|
||||
REAL(8):: pDer(1:3, 1:3)
|
||||
REAL(8):: invJ(1:3, 1:3), detJ
|
||||
|
||||
!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, 3)
|
||||
invJ = self%invJac(Xi, 3, dPsi)
|
||||
detJ = self%detJac(Xi, 3, dPsi)
|
||||
pDer = self%partialDer(3, dPsi)
|
||||
invJ = self%invJac(pDer)
|
||||
detJ = self%detJac(pDer)
|
||||
Xi = MATMUL(invJ,deltaR)/detJ
|
||||
|
||||
END FUNCTION phy2logTria
|
||||
|
||||
SUBROUTINE nextElementTria(self, Xi, nextElement)
|
||||
SUBROUTINE neighbourElementTria(self, Xi, neighbourElement)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCylTria), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
CLASS(meshElement), POINTER, INTENT(out):: nextElement
|
||||
CLASS(meshElement), POINTER, INTENT(out):: neighbourElement
|
||||
REAL(8):: XiArray(1:3)
|
||||
INTEGER:: nextInt
|
||||
|
||||
XiArray = (/ Xi(2), 1.D0-Xi(1)-Xi(2), Xi(1) /)
|
||||
nextInt = MINLOC(XiArray,1)
|
||||
NULLIFY(nextElement)
|
||||
NULLIFY(neighbourElement)
|
||||
SELECT CASE (nextInt)
|
||||
CASE (1)
|
||||
nextElement => self%e1
|
||||
neighbourElement => self%e1
|
||||
CASE (2)
|
||||
nextElement => self%e2
|
||||
neighbourElement => self%e2
|
||||
CASE (3)
|
||||
nextElement => self%e3
|
||||
neighbourElement => self%e3
|
||||
END SELECT
|
||||
|
||||
END SUBROUTINE nextElementTria
|
||||
END SUBROUTINE neighbourElementTria
|
||||
|
||||
!Calculates area for triangular element
|
||||
PURE SUBROUTINE areaTria(self)
|
||||
USE moduleConstParam, ONLY: PI
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCylTria), INTENT(inout):: self
|
||||
REAL(8):: Xi(1:3)
|
||||
REAL(8):: r
|
||||
REAL(8):: dPsi(1:3, 1:3), pDer(1:3, 1:3)
|
||||
REAL(8):: detJ
|
||||
REAL(8):: fPsi(1:3)
|
||||
|
||||
self%volume = 0.D0
|
||||
self%arNodes = 0.D0
|
||||
!2D 1 point Gauss Quad Integral
|
||||
Xi = (/ 1.D0/3.D0, 1.D0/3.D0, 0.D0 /)
|
||||
dPsi = self%dPsi(Xi, 3)
|
||||
pDer = self%partialDer(3, dPsi)
|
||||
detJ = self%detJac(pDer)*PI !2PI*1/2
|
||||
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
|
||||
self%arNodes = fPsi*r*detJ
|
||||
|
||||
END SUBROUTINE areaTria
|
||||
|
||||
!COMMON FUNCTIONS FOR CYLINDRICAL VOLUME ELEMENTS
|
||||
!Computes element Jacobian determinant
|
||||
PURE FUNCTION detJ2DCyl(self, Xi, nNodes, dPsi_in) RESULT(dJ)
|
||||
PURE FUNCTION detJ2DCyl(pDer) RESULT(dJ)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCyl), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
INTEGER, INTENT(in):: nNodes
|
||||
REAL(8), INTENT(in), OPTIONAL:: dPsi_in(1:3,1:nNodes)
|
||||
REAL(8), INTENT(in):: pDer(1:3, 1:3)
|
||||
REAL(8):: dJ
|
||||
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, nNodes)
|
||||
|
||||
END IF
|
||||
|
||||
CALL self%partialDer(nNodes, dPsi, dz, dr)
|
||||
|
||||
dJ = dz(1)*dr(2)-dz(2)*dr(1)
|
||||
dJ = pDer(1,1)*pDer(2,2)-pDer(1,2)*pDer(2,1)
|
||||
|
||||
END FUNCTION detJ2DCyl
|
||||
|
||||
!Computes element Jacobian inverse matrix (without determinant)
|
||||
PURE FUNCTION invJ2DCyl(self, Xi, nNodes, dPsi_in) RESULT(invJ)
|
||||
PURE FUNCTION invJ2DCyl(pDer) RESULT(invJ)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCyl), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
INTEGER, INTENT(in):: nNodes
|
||||
REAL(8), INTENT(in), OPTIONAL:: dPsi_in(1:3,1:nNodes)
|
||||
REAL(8), INTENT(in):: pDer(1:3, 1:3)
|
||||
REAL(8):: invJ(1:3,1:3)
|
||||
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)
|
||||
|
||||
END IF
|
||||
|
||||
invJ = 0.D0
|
||||
|
||||
CALL self%partialDer(nNodes, dPsi, dz, dr)
|
||||
|
||||
invJ(1,1:2) = (/ dr(2), -dz(2) /)
|
||||
invJ(2,1:2) = (/ -dr(1), dz(1) /)
|
||||
invJ(1,1:2) = (/ pDer(2,2), -pDer(1,2) /)
|
||||
invJ(2,1:2) = (/ -pDer(2,1), pDer(1,1) /)
|
||||
invJ(3,3) = 1.D0
|
||||
|
||||
END FUNCTION invJ2DCyl
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue