fPsi no longer allocates memory
I noticed that phy2logquad had a lot of overhead. Trying to reducing it by simplifying calls to fPsi, dPsi and such. The function for fPsi has been made so no memory is allocated and works under the assumption that the input array has the right size (1:numNodes)
This commit is contained in:
parent
c82cd50cf9
commit
0db76083ec
8 changed files with 408 additions and 409 deletions
|
|
@ -11,8 +11,8 @@ MODULE moduleMesh2DCart
|
|||
REAL(8), PARAMETER:: corQuad(1:3) = (/ -DSQRT(3.D0/5.D0), 0.D0, DSQRT(3.D0/5.D0) /)
|
||||
REAL(8), PARAMETER:: wQuad(1:3) = (/ 5.D0/9.D0, 8.D0/9.D0, 5.D0/9.D0 /)
|
||||
|
||||
REAL(8), PARAMETER:: xi1Tria(1:4) = (/ 1.D0/3.D0, 1.D0/5.D0, 3.D0/5.D0, 1.D0/5.D0 /)
|
||||
REAL(8), PARAMETER:: xi2Tria(1:4) = (/ 1.D0/3.D0, 1.D0/5.D0, 1.D0/5.D0, 3.D0/5.D0 /)
|
||||
REAL(8), PARAMETER:: Xi1Tria(1:4) = (/ 1.D0/3.D0, 1.D0/5.D0, 3.D0/5.D0, 1.D0/5.D0 /)
|
||||
REAL(8), PARAMETER:: Xi2Tria(1:4) = (/ 1.D0/3.D0, 1.D0/5.D0, 1.D0/5.D0, 3.D0/5.D0 /)
|
||||
REAL(8), PARAMETER:: wTria(1:4) = (/ -27.D0/96.D0, 25.D0/96.D0, 25.D0/96.D0, 25.D0/96.D0 /)
|
||||
|
||||
TYPE, PUBLIC, EXTENDS(meshNode):: meshNode2DCart
|
||||
|
|
@ -47,8 +47,8 @@ MODULE moduleMesh2DCart
|
|||
END TYPE meshVol2DCart
|
||||
|
||||
ABSTRACT INTERFACE
|
||||
PURE FUNCTION dPsi_interface(xi) RESULT(dPsi)
|
||||
REAL(8), INTENT(in):: xi(1:3)
|
||||
PURE FUNCTION dPsi_interface(Xi) RESULT(dPsi)
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
REAL(8), ALLOCATABLE:: dPsi(:,:)
|
||||
|
||||
END FUNCTION dPsi_interface
|
||||
|
|
@ -210,14 +210,14 @@ MODULE moduleMesh2DCart
|
|||
|
||||
CLASS(meshVol2DCartQuad), INTENT(in):: self
|
||||
REAL(8):: r(1:3)
|
||||
REAL(8):: xii(1:3)
|
||||
REAL(8):: Xi(1:3)
|
||||
REAL(8), ALLOCATABLE:: fPsi(:)
|
||||
|
||||
xii(1) = random(-1.D0, 1.D0)
|
||||
xii(2) = random(-1.D0, 1.D0)
|
||||
xii(3) = 0.D0
|
||||
Xi(1) = random(-1.D0, 1.D0)
|
||||
Xi(2) = random(-1.D0, 1.D0)
|
||||
Xi(3) = 0.D0
|
||||
|
||||
fPsi = self%fPsi(xii)
|
||||
CALL self%fPsi(Xi, fPsi)
|
||||
|
||||
r(1) = DOT_PRODUCT(fPsi, self%x)
|
||||
r(2) = DOT_PRODUCT(fPsi, self%y)
|
||||
|
|
@ -319,78 +319,77 @@ MODULE moduleMesh2DCart
|
|||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol2DCartQuad), INTENT(inout):: self
|
||||
REAL(8):: xi(1:3)
|
||||
REAL(8):: Xi(1:3)
|
||||
REAL(8):: detJ
|
||||
REAL(8):: fPsi(1:4)
|
||||
|
||||
self%volume = 0.D0
|
||||
self%arNodes = 0.D0
|
||||
!2D 1 point Gauss Quad Integral
|
||||
xi = 0.D0
|
||||
detJ = self%detJac(xi)*4.D0 !4
|
||||
fPsi = self%fPsi(xi)
|
||||
Xi = 0.D0
|
||||
detJ = self%detJac(Xi)*4.D0 !4
|
||||
CALL self%fPsi(Xi, fPsi)
|
||||
self%volume = detJ
|
||||
self%arNodes = fPsi*detJ
|
||||
|
||||
END SUBROUTINE areaQuad
|
||||
|
||||
!Computes element functions in point xi
|
||||
PURE FUNCTION fPsiQuad(xi) RESULT(fPsi)
|
||||
!Computes element functions in point Xi
|
||||
PURE SUBROUTINE fPsiQuad(Xi, fPsi)
|
||||
IMPLICIT NONE
|
||||
|
||||
REAL(8),INTENT(in):: xi(1:3)
|
||||
REAL(8), ALLOCATABLE:: fPsi(:)
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
REAL(8), INTENT(out):: fPsi(:)
|
||||
|
||||
ALLOCATE(fPsi(1:4))
|
||||
fPsi(1) = (1.D0-Xi(1)) * (1.D0-Xi(2))
|
||||
fPsi(2) = (1.D0+Xi(1)) * (1.D0-Xi(2))
|
||||
fPsi(3) = (1.D0+Xi(1)) * (1.D0+Xi(2))
|
||||
fPsi(4) = (1.D0-Xi(1)) * (1.D0+Xi(2))
|
||||
|
||||
fPsi(1) = (1.D0-xi(1))*(1.D0-xi(2))
|
||||
fPsi(2) = (1.D0+xi(1))*(1.D0-xi(2))
|
||||
fPsi(3) = (1.D0+xi(1))*(1.D0+xi(2))
|
||||
fPsi(4) = (1.D0-xi(1))*(1.D0+xi(2))
|
||||
fPsi = fPsi*0.25D0
|
||||
|
||||
END FUNCTION fPsiQuad
|
||||
END SUBROUTINE fPsiQuad
|
||||
|
||||
!Derivative element function at coordinates xi
|
||||
PURE FUNCTION dPsiQuad(xi) RESULT(dPsi)
|
||||
!Derivative element function at coordinates Xi
|
||||
PURE FUNCTION dPsiQuad(Xi) RESULT(dPsi)
|
||||
IMPLICIT NONE
|
||||
|
||||
REAL(8), INTENT(in):: xi(1:3)
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
REAL(8), ALLOCATABLE:: dPsi(:,:)
|
||||
|
||||
ALLOCATE(dPsi(1:2,1:4))
|
||||
|
||||
dPsi(1,:) = dPsiQuadXi1(xi(2))
|
||||
dPsi(2,:) = dPsiQuadXi2(xi(1))
|
||||
dPsi(1,:) = dPsiQuadXi1(Xi(2))
|
||||
dPsi(2,:) = dPsiQuadXi2(Xi(1))
|
||||
|
||||
END FUNCTION dPsiQuad
|
||||
|
||||
!Derivative element function (xi1)
|
||||
PURE FUNCTION dPsiQuadXi1(xi2) RESULT(dPsiXi1)
|
||||
!Derivative element function (Xi1)
|
||||
PURE FUNCTION dPsiQuadXi1(Xi2) RESULT(dPsiXi1)
|
||||
IMPLICIT NONE
|
||||
|
||||
REAL(8),INTENT(in):: xi2
|
||||
REAL(8),INTENT(in):: Xi2
|
||||
REAL(8):: dPsiXi1(1:4)
|
||||
|
||||
dPsiXi1(1) = -(1.D0-xi2)
|
||||
dPsiXi1(2) = (1.D0-xi2)
|
||||
dPsiXi1(3) = (1.D0+xi2)
|
||||
dPsiXi1(4) = -(1.D0+xi2)
|
||||
dPsiXi1(1) = -(1.D0-Xi2)
|
||||
dPsiXi1(2) = (1.D0-Xi2)
|
||||
dPsiXi1(3) = (1.D0+Xi2)
|
||||
dPsiXi1(4) = -(1.D0+Xi2)
|
||||
dPsiXi1 = dPsiXi1*0.25D0
|
||||
|
||||
END FUNCTION dPsiQuadXi1
|
||||
|
||||
!Derivative element function (xi2)
|
||||
PURE FUNCTION dPsiQuadXi2(xi1) RESULT(dPsiXi2)
|
||||
!Derivative element function (Xi2)
|
||||
PURE FUNCTION dPsiQuadXi2(Xi1) RESULT(dPsiXi2)
|
||||
IMPLICIT NONE
|
||||
|
||||
REAL(8),INTENT(in):: xi1
|
||||
REAL(8),INTENT(in):: Xi1
|
||||
REAL(8):: dPsiXi2(1:4)
|
||||
|
||||
dPsiXi2(1) = -(1.D0-xi1)
|
||||
dPsiXi2(2) = -(1.D0+xi1)
|
||||
dPsiXi2(3) = (1.D0+xi1)
|
||||
dPsiXi2(4) = (1.D0-xi1)
|
||||
dPsiXi2(1) = -(1.D0-Xi1)
|
||||
dPsiXi2(2) = -(1.D0+Xi1)
|
||||
dPsiXi2(3) = (1.D0+Xi1)
|
||||
dPsiXi2(4) = (1.D0-Xi1)
|
||||
dPsiXi2 = dPsiXi2*0.25D0
|
||||
|
||||
END FUNCTION dPsiQuadXi2
|
||||
|
|
@ -415,24 +414,24 @@ MODULE moduleMesh2DCart
|
|||
|
||||
CLASS(meshVol2DCartQuad), INTENT(in):: self
|
||||
REAL(8), ALLOCATABLE:: localK(:,:)
|
||||
REAL(8):: xi(1:3)
|
||||
REAL(8):: Xi(1:3)
|
||||
REAL(8):: fPsi(1:4), dPsi(1:2,1:4)
|
||||
REAL(8):: invJ(1:2,1:2), detJ
|
||||
INTEGER:: l, m
|
||||
|
||||
ALLOCATE(localK(1:4, 1:4))
|
||||
localK=0.D0
|
||||
xi=0.D0
|
||||
Xi=0.D0
|
||||
!Start 2D Gauss Quad Integral
|
||||
DO l=1, 3
|
||||
xi(2) = corQuad(l)
|
||||
dPsi(1,:) = self%dPsiXi1(xi(2))
|
||||
Xi(2) = corQuad(l)
|
||||
dPsi(1,:) = self%dPsiXi1(Xi(2))
|
||||
DO m = 1, 3
|
||||
xi(1) = corQuad(m)
|
||||
dPsi(2,:) = self%dPsiXi2(xi(1))
|
||||
fPsi = self%fPsi(xi)
|
||||
detJ = self%detJac(xi,dPsi)
|
||||
invJ = self%invJac(xi,dPsi)
|
||||
Xi(1) = corQuad(m)
|
||||
dPsi(2,:) = self%dPsiXi2(Xi(1))
|
||||
CALL self%fPsi(Xi, fPsi)
|
||||
detJ = self%detJac(Xi,dPsi)
|
||||
invJ = self%invJac(Xi,dPsi)
|
||||
localK = localK + MATMUL(TRANSPOSE(MATMUL(invJ,dPsi)),MATMUL(invJ,dPsi))*wQuad(l)*wQuad(m)/detJ
|
||||
|
||||
END DO
|
||||
|
|
@ -447,20 +446,20 @@ MODULE moduleMesh2DCart
|
|||
CLASS(meshVol2DCartQuad), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: source(1:)
|
||||
REAL(8), ALLOCATABLE:: localF(:)
|
||||
REAL(8):: xi(1:3)
|
||||
REAL(8):: Xi(1:3)
|
||||
REAL(8):: fPsi(1:4)
|
||||
REAL(8):: detJ, f
|
||||
INTEGER:: l, m
|
||||
|
||||
ALLOCATE(localF(1:4))
|
||||
localF = 0.D0
|
||||
xi = 0.D0
|
||||
Xi = 0.D0
|
||||
DO l=1, 3
|
||||
xi(1) = corQuad(l)
|
||||
Xi(1) = corQuad(l)
|
||||
DO m = 1, 3
|
||||
xi(2) = corQuad(m)
|
||||
detJ = self%detJac(xi)
|
||||
fPsi = self%fPsi(xi)
|
||||
Xi(2) = corQuad(m)
|
||||
detJ = self%detJac(Xi)
|
||||
CALL self%fPsi(Xi, fPsi)
|
||||
f = DOT_PRODUCT(fPsi,source)
|
||||
localF = localF + f*fPsi*wQuad(l)*wQuad(m)*detJ
|
||||
|
||||
|
|
@ -470,23 +469,23 @@ MODULE moduleMesh2DCart
|
|||
END FUNCTION elemFQuad
|
||||
|
||||
!Checks if a particle is inside a quad element
|
||||
PURE FUNCTION insideQuad(xi) RESULT(ins)
|
||||
PURE FUNCTION insideQuad(Xi) RESULT(ins)
|
||||
IMPLICIT NONE
|
||||
|
||||
REAL(8), INTENT(in):: xi(1:3)
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
LOGICAL:: ins
|
||||
|
||||
ins = (xi(1) >= -1.D0 .AND. xi(1) <= 1.D0) .AND. &
|
||||
(xi(2) >= -1.D0 .AND. xi(2) <= 1.D0)
|
||||
ins = (Xi(1) >= -1.D0 .AND. Xi(1) <= 1.D0) .AND. &
|
||||
(Xi(2) >= -1.D0 .AND. Xi(2) <= 1.D0)
|
||||
|
||||
END FUNCTION insideQuad
|
||||
|
||||
!Gathers the electric field at position xi
|
||||
PURE FUNCTION gatherEFQuad(self,xi) RESULT(EF)
|
||||
!Gathers the electric field at position Xi
|
||||
PURE FUNCTION gatherEFQuad(self,Xi) RESULT(EF)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol2DCartQuad), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: xi(1:3)
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
REAL(8):: dPsi(1:2,1:4)
|
||||
REAL(8):: dPsiR(1:2,1:4)!Derivative of shpae functions in global coordinates
|
||||
REAL(8):: invJ(1:2,1:2), detJ
|
||||
|
|
@ -498,9 +497,9 @@ MODULE moduleMesh2DCart
|
|||
self%n3%emData%phi, &
|
||||
self%n4%emData%phi /)
|
||||
|
||||
dPsi = self%dPsi(xi)
|
||||
detJ = self%detJac(xi,dPsi)
|
||||
invJ = self%invJac(xi,dPsi)
|
||||
dPsi = self%dPsi(Xi)
|
||||
detJ = self%detJac(Xi,dPsi)
|
||||
invJ = self%invJac(Xi,dPsi)
|
||||
dPsiR = MATMUL(invJ, dPsi)/detJ
|
||||
EF(1) = -DOT_PRODUCT(dPsiR(1,:), phi)
|
||||
EF(2) = -DOT_PRODUCT(dPsiR(2,:), phi)
|
||||
|
|
@ -508,11 +507,11 @@ MODULE moduleMesh2DCart
|
|||
|
||||
END FUNCTION gatherEFQuad
|
||||
|
||||
PURE FUNCTION gatherMFQuad(self,xi) RESULT(MF)
|
||||
PURE FUNCTION gatherMFQuad(self,Xi) RESULT(MF)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol2DCartQuad), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: xi(1:3)
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
REAL(8):: fPsi(1:4)
|
||||
REAL(8):: MF_Nodes(1:4,1:3)
|
||||
REAL(8):: MF(1:3)
|
||||
|
|
@ -530,7 +529,7 @@ MODULE moduleMesh2DCart
|
|||
self%n3%emData%B(3), &
|
||||
self%n4%emData%B(3) /)
|
||||
|
||||
fPsi = self%fPsi(xi)
|
||||
CALL self%fPsi(Xi, fPsi)
|
||||
MF = MATMUL(fPsi(:), MF_Nodes)
|
||||
|
||||
END FUNCTION gatherMFQuad
|
||||
|
|
@ -548,47 +547,47 @@ MODULE moduleMesh2DCart
|
|||
END FUNCTION getNodesQuad
|
||||
|
||||
!Transforms physical coordinates to element coordinates
|
||||
PURE FUNCTION phy2logQuad(self,r) RESULT(xN)
|
||||
PURE FUNCTION phy2logQuad(self,r) RESULT(XiN)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol2DCartQuad), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: r(1:3)
|
||||
REAL(8):: xN(1:3)
|
||||
REAL(8):: xO(1:3), detJ, invJ(1:2,1:2), f(1:2)
|
||||
REAL(8):: XiN(1:3)
|
||||
REAL(8):: XiO(1:3), detJ, invJ(1:2,1:2), f(1:2)
|
||||
REAL(8):: dPsi(1:2,1:4), fPsi(1:4)
|
||||
REAL(8):: conv
|
||||
|
||||
!Iterative newton method to transform coordinates
|
||||
conv=1.D0
|
||||
xO=0.D0
|
||||
XiO=0.D0
|
||||
|
||||
DO WHILE(conv>1.D-4)
|
||||
dPsi = self%dPsi(xO)
|
||||
invJ = self%invJac(xO, dPsi)
|
||||
fPsi = self%fPsi(xO)
|
||||
dPsi = self%dPsi(XiO)
|
||||
invJ = self%invJac(XiO, dPsi)
|
||||
CALL self%fPsi(XiO, fPsi)
|
||||
f(1) = DOT_PRODUCT(fPsi,self%x)-r(1)
|
||||
f(2) = DOT_PRODUCT(fPsi,self%y)-r(2)
|
||||
detJ = self%detJac(xO,dPsi)
|
||||
xN(1:2)=xO(1:2) - MATMUL(invJ, f)/detJ
|
||||
conv=MAXVAL(DABS(xN-xO),1)
|
||||
xO=xN
|
||||
detJ = self%detJac(XiO,dPsi)
|
||||
XiN(1:2)=XiO(1:2) - MATMUL(invJ, f)/detJ
|
||||
conv=MAXVAL(DABS(XiN-XiO),1)
|
||||
XiO=XiN
|
||||
|
||||
END DO
|
||||
|
||||
END FUNCTION phy2logQuad
|
||||
|
||||
!Gets the next element for a logical position xi
|
||||
SUBROUTINE nextElementQuad(self, xi, nextElement)
|
||||
!Gets the next element for a logical position Xi
|
||||
SUBROUTINE nextElementQuad(self, Xi, nextElement)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol2DCartQuad), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: xi(1:3)
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
CLASS(meshElement), POINTER, INTENT(out):: nextElement
|
||||
REAL(8):: xiArray(1:4)
|
||||
REAL(8):: XiArray(1:4)
|
||||
INTEGER:: nextInt
|
||||
|
||||
xiArray = (/ -xi(2), xi(1), xi(2), -xi(1) /)
|
||||
nextInt = MAXLOC(xiArray,1)
|
||||
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)
|
||||
SELECT CASE (nextInt)
|
||||
|
|
@ -649,14 +648,14 @@ MODULE moduleMesh2DCart
|
|||
|
||||
CLASS(meshVol2DCartTria), INTENT(in):: self
|
||||
REAL(8):: r(1:3)
|
||||
REAL(8):: xii(1:3)
|
||||
REAL(8), ALLOCATABLE:: fPsi(:)
|
||||
REAL(8):: Xi(1:3)
|
||||
REAL(8):: fPsi(1:3)
|
||||
|
||||
xii(1) = random( 0.D0, 1.D0)
|
||||
xii(2) = random( 0.D0, 1.D0 - xii(1))
|
||||
xii(3) = 0.D0
|
||||
Xi(1) = random( 0.D0, 1.D0)
|
||||
Xi(2) = random( 0.D0, 1.D0 - Xi(1))
|
||||
Xi(3) = 0.D0
|
||||
|
||||
fPsi = self%fPsi(xii)
|
||||
CALL self%fPsi(Xi, fPsi)
|
||||
|
||||
r(1) = DOT_PRODUCT(fPsi, self%x)
|
||||
r(2) = DOT_PRODUCT(fPsi, self%y)
|
||||
|
|
@ -669,55 +668,53 @@ MODULE moduleMesh2DCart
|
|||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol2DCartTria), INTENT(inout):: self
|
||||
REAL(8):: xi(1:3)
|
||||
REAL(8):: Xi(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 /)
|
||||
detJ = self%detJac(xi)/2.D0
|
||||
fPsi = self%fPsi(xi)
|
||||
Xi = (/1.D0/3.D0, 1.D0/3.D0, 0.D0 /)
|
||||
detJ = self%detJac(Xi)/2.D0
|
||||
CALL self%fPsi(Xi, fPsi)
|
||||
self%volume = detJ
|
||||
self%arNodes = fPsi*detJ
|
||||
|
||||
END SUBROUTINE areaTria
|
||||
|
||||
!Shape functions for triangular element
|
||||
PURE FUNCTION fPsiTria(xi) RESULT(fPsi)
|
||||
PURE SUBROUTINE fPsiTria(Xi, fPsi)
|
||||
IMPLICIT NONE
|
||||
|
||||
REAL(8), INTENT(in):: xi(1:3)
|
||||
REAL(8), ALLOCATABLE:: fPsi(:)
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
REAL(8), INTENT(out):: fPsi(:)
|
||||
|
||||
ALLOCATE(fPsi(1:3))
|
||||
fPsi(1) = 1.D0 - Xi(1) - Xi(2)
|
||||
fPsi(2) = Xi(1)
|
||||
fPsi(3) = Xi(2)
|
||||
|
||||
fPsi(1) = 1.D0 - xi(1) - xi(2)
|
||||
fPsi(2) = xi(1)
|
||||
fPsi(3) = xi(2)
|
||||
END SUBROUTINE fPsiTria
|
||||
|
||||
END FUNCTION fPsiTria
|
||||
|
||||
!Derivative element function at coordinates xi
|
||||
PURE FUNCTION dPsiTria(xi) RESULT(dPsi)
|
||||
!Derivative element function at coordinates Xi
|
||||
PURE FUNCTION dPsiTria(Xi) RESULT(dPsi)
|
||||
IMPLICIT NONE
|
||||
|
||||
REAL(8), INTENT(in):: xi(1:3)
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
REAL(8), ALLOCATABLE:: dPsi(:,:)
|
||||
|
||||
ALLOCATE(dPsi(1:2,1:3))
|
||||
|
||||
dPsi(1,:) = dPsiTriaXi1(xi(2))
|
||||
dPsi(2,:) = dPsiTriaXi2(xi(1))
|
||||
dPsi(1,:) = dPsiTriaXi1(Xi(2))
|
||||
dPsi(2,:) = dPsiTriaXi2(Xi(1))
|
||||
|
||||
END FUNCTION dPsiTria
|
||||
|
||||
!Derivative element function (xi1)
|
||||
PURE FUNCTION dPsiTriaXi1(xi2) RESULT(dPsiXi1)
|
||||
!Derivative element function (Xi1)
|
||||
PURE FUNCTION dPsiTriaXi1(Xi2) RESULT(dPsiXi1)
|
||||
IMPLICIT NONE
|
||||
|
||||
REAL(8), INTENT(in):: xi2
|
||||
REAL(8), INTENT(in):: Xi2
|
||||
REAL(8):: dPsiXi1(1:3)
|
||||
|
||||
dPsiXi1(1) = -1.D0
|
||||
|
|
@ -726,11 +723,11 @@ MODULE moduleMesh2DCart
|
|||
|
||||
END FUNCTION dPsiTriaXi1
|
||||
|
||||
!Derivative element function (xi1)
|
||||
PURE FUNCTION dPsiTriaXi2(xi1) RESULT(dPsiXi2)
|
||||
!Derivative element function (Xi1)
|
||||
PURE FUNCTION dPsiTriaXi2(Xi1) RESULT(dPsiXi2)
|
||||
IMPLICIT NONE
|
||||
|
||||
REAL(8), INTENT(in):: xi1
|
||||
REAL(8), INTENT(in):: Xi1
|
||||
REAL(8):: dPsiXi2(1:3)
|
||||
|
||||
dPsiXi2(1) = -1.D0
|
||||
|
|
@ -759,22 +756,22 @@ MODULE moduleMesh2DCart
|
|||
|
||||
CLASS(meshVol2DCartTria), INTENT(in):: self
|
||||
REAL(8), ALLOCATABLE:: localK(:,:)
|
||||
REAL(8):: xi(1:3)
|
||||
REAL(8):: Xi(1:3)
|
||||
REAL(8):: fPsi(1:3), dPsi(1:2,1:3)
|
||||
REAL(8):: invJ(1:2,1:2), detJ
|
||||
INTEGER:: l
|
||||
|
||||
ALLOCATE(localK(1:4, 1:4))
|
||||
localK=0.D0
|
||||
xi=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)
|
||||
detJ = self%detJac(xi,dPsi)
|
||||
invJ = self%invJac(xi,dPsi)
|
||||
fPsi = self%fPsi(xi)
|
||||
Xi(1) = Xi1Tria(l)
|
||||
Xi(2) = Xi2Tria(l)
|
||||
dPsi = self%dPsi(Xi)
|
||||
detJ = self%detJac(Xi,dPsi)
|
||||
invJ = self%invJac(Xi,dPsi)
|
||||
CALL self%fPsi(Xi, fPsi)
|
||||
localK = localK + MATMUL(TRANSPOSE(MATMUL(invJ,dPsi)),MATMUL(invJ,dPsi))*wTria(l)/detJ
|
||||
|
||||
END DO
|
||||
|
|
@ -789,19 +786,19 @@ MODULE moduleMesh2DCart
|
|||
REAL(8), INTENT(in):: source(1:)
|
||||
REAL(8), ALLOCATABLE:: localF(:)
|
||||
REAL(8):: fPsi(1:3)
|
||||
REAL(8):: xi(1:3)
|
||||
REAL(8):: Xi(1:3)
|
||||
REAL(8):: detJ, f
|
||||
INTEGER:: l
|
||||
|
||||
ALLOCATE(localF(1:3))
|
||||
localF = 0.D0
|
||||
xi = 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)
|
||||
fPsi = self%fPsi(xi)
|
||||
Xi(1) = Xi1Tria(l)
|
||||
Xi(2) = Xi2Tria(l)
|
||||
detJ = self%detJac(Xi)
|
||||
CALL self%fPsi(Xi, fPsi)
|
||||
f = DOT_PRODUCT(fPsi,source)
|
||||
localF = localF + f*fPsi*wTria(l)*detJ
|
||||
|
||||
|
|
@ -809,24 +806,24 @@ MODULE moduleMesh2DCart
|
|||
|
||||
END FUNCTION elemFTria
|
||||
|
||||
PURE FUNCTION insideTria(xi) RESULT(ins)
|
||||
PURE FUNCTION insideTria(Xi) RESULT(ins)
|
||||
IMPLICIT NONE
|
||||
|
||||
REAL(8), INTENT(in):: xi(1:3)
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
LOGICAL:: ins
|
||||
|
||||
ins = xi(1) >= 0.D0 .AND. &
|
||||
xi(2) >= 0.D0 .AND. &
|
||||
1.D0 - xi(1) - xi(2) >= 0.D0
|
||||
ins = Xi(1) >= 0.D0 .AND. &
|
||||
Xi(2) >= 0.D0 .AND. &
|
||||
1.D0 - Xi(1) - Xi(2) >= 0.D0
|
||||
|
||||
END FUNCTION insideTria
|
||||
|
||||
!Gathers the electric field at position xi
|
||||
PURE FUNCTION gatherEFTria(self,xi) RESULT(EF)
|
||||
!Gathers the electric field at position Xi
|
||||
PURE FUNCTION gatherEFTria(self,Xi) RESULT(EF)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol2DCartTria), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: xi(1:3)
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
REAL(8):: dPsi(1:2,1:3)
|
||||
REAL(8):: dPsiR(1:2,1:3)!Derivative of shpae functions in global coordinates
|
||||
REAL(8):: invJ(1:2,1:2), detJ
|
||||
|
|
@ -837,9 +834,9 @@ MODULE moduleMesh2DCart
|
|||
self%n2%emData%phi, &
|
||||
self%n3%emData%phi /)
|
||||
|
||||
dPsi = self%dPsi(xi)
|
||||
detJ = self%detJac(xi,dPsi)
|
||||
invJ = self%invJac(xi,dPsi)
|
||||
dPsi = self%dPsi(Xi)
|
||||
detJ = self%detJac(Xi,dPsi)
|
||||
invJ = self%invJac(Xi,dPsi)
|
||||
dPsiR = MATMUL(invJ, dPsi)/detJ
|
||||
EF(1) = -DOT_PRODUCT(dPsiR(1,:), phi)
|
||||
EF(2) = -DOT_PRODUCT(dPsiR(2,:), phi)
|
||||
|
|
@ -847,11 +844,11 @@ MODULE moduleMesh2DCart
|
|||
|
||||
END FUNCTION gatherEFTria
|
||||
|
||||
PURE FUNCTION gatherMFTria(self,xi) RESULT(MF)
|
||||
PURE FUNCTION gatherMFTria(self,Xi) RESULT(MF)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol2DCartTria), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: xi(1:3)
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
REAL(8):: fPsi(1:3)
|
||||
REAL(8):: MF_Nodes(1:3,1:3)
|
||||
REAL(8):: MF(1:3)
|
||||
|
|
@ -866,7 +863,7 @@ MODULE moduleMesh2DCart
|
|||
self%n2%emData%B(3), &
|
||||
self%n3%emData%B(3) /)
|
||||
|
||||
fPsi = self%fPsi(xi)
|
||||
CALL self%fPsi(Xi, fPsi)
|
||||
MF = MATMUL(fPsi, MF_Nodes)
|
||||
|
||||
END FUNCTION gatherMFTria
|
||||
|
|
@ -884,37 +881,37 @@ MODULE moduleMesh2DCart
|
|||
END FUNCTION getNodesTria
|
||||
|
||||
!Transforms physical coordinates to element coordinates
|
||||
PURE FUNCTION phy2logTria(self,r) RESULT(xi)
|
||||
PURE FUNCTION phy2logTria(self,r) RESULT(Xi)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol2DCartTria), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: r(1:3)
|
||||
REAL(8):: xi(1:3)
|
||||
REAL(8):: Xi(1:3)
|
||||
REAL(8):: invJ(1:2,1:2), detJ
|
||||
REAL(8):: deltaR(1:2)
|
||||
REAL(8):: dPsi(1:2,1:3)
|
||||
|
||||
!Direct method to convert coordinates
|
||||
xi = 0.D0 !Irrelevant, required for input
|
||||
Xi = 0.D0 !Irrelevant, required for input
|
||||
deltaR = (/ r(1) - self%x(1), r(2) - self%y(1) /)
|
||||
dPsi = self%dPsi(xi)
|
||||
invJ = self%invJac(xi, dPsi)
|
||||
detJ = self%detJac(xi, dPsi)
|
||||
xi(1:2) = MATMUL(invJ,deltaR)/detJ
|
||||
dPsi = self%dPsi(Xi)
|
||||
invJ = self%invJac(Xi, dPsi)
|
||||
detJ = self%detJac(Xi, dPsi)
|
||||
Xi(1:2) = MATMUL(invJ,deltaR)/detJ
|
||||
|
||||
END FUNCTION phy2logTria
|
||||
|
||||
SUBROUTINE nextElementTria(self, xi, nextElement)
|
||||
SUBROUTINE nextElementTria(self, Xi, nextElement)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol2DCartTria), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: xi(1:3)
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
CLASS(meshElement), POINTER, INTENT(out):: nextElement
|
||||
REAL(8):: xiArray(1:3)
|
||||
REAL(8):: XiArray(1:3)
|
||||
INTEGER:: nextInt
|
||||
|
||||
xiArray = (/ xi(2), 1.D0-xi(1)-xi(2), xi(1) /)
|
||||
nextInt = MINLOC(xiArray,1)
|
||||
XiArray = (/ Xi(2), 1.D0-Xi(1)-Xi(2), Xi(1) /)
|
||||
nextInt = MINLOC(XiArray,1)
|
||||
NULLIFY(nextElement)
|
||||
SELECT CASE (nextInt)
|
||||
CASE (1)
|
||||
|
|
@ -929,11 +926,11 @@ 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, dPsi_in) RESULT(dJ)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol2DCart), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: xi(1:3)
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
REAL(8), INTENT(in), OPTIONAL:: dPsi_in(1:,1:)
|
||||
REAL(8), ALLOCATABLE:: dPsi(:,:)
|
||||
REAL(8):: dJ
|
||||
|
|
@ -943,7 +940,7 @@ MODULE moduleMesh2DCart
|
|||
dPsi = dPsi_in
|
||||
|
||||
ELSE
|
||||
dPsi = self%dPsi(xi)
|
||||
dPsi = self%dPsi(Xi)
|
||||
|
||||
END IF
|
||||
|
||||
|
|
@ -953,11 +950,11 @@ MODULE moduleMesh2DCart
|
|||
END FUNCTION detJ2DCart
|
||||
|
||||
!Computes element Jacobian inverse matrix (without determinant)
|
||||
PURE FUNCTION invJ2DCart(self,xi,dPsi_in) RESULT(invJ)
|
||||
PURE FUNCTION invJ2DCart(self,Xi,dPsi_in) RESULT(invJ)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVol2DCart), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: xi(1:3)
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
REAL(8), INTENT(in), OPTIONAL:: dPsi_in(1:,1:)
|
||||
REAL(8), ALLOCATABLE:: dPsi(:,:)
|
||||
REAL(8):: dx(1:2), dy(1:2)
|
||||
|
|
@ -967,7 +964,7 @@ MODULE moduleMesh2DCart
|
|||
dPsi=dPsi_in
|
||||
|
||||
ELSE
|
||||
dPsi = self%dPsi(xi)
|
||||
dPsi = self%dPsi(Xi)
|
||||
|
||||
END IF
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue