Passing nNodes as argument
It seems that this improves results as passing the size of the arrays as an argument is better than getting it from self.
This commit is contained in:
parent
6f24b5f1f6
commit
15d64f3e68
8 changed files with 159 additions and 143 deletions
|
|
@ -297,19 +297,20 @@ MODULE moduleMesh2DCart
|
|||
!2D 1 point Gauss Quad Integral
|
||||
Xi = 0.D0
|
||||
detJ = self%detJac(Xi)*4.D0 !4
|
||||
fPsi = self%fPsi(Xi)
|
||||
fPsi = self%fPsi(Xi, 4)
|
||||
self%volume = detJ
|
||||
self%arNodes = fPsi*detJ
|
||||
|
||||
END SUBROUTINE areaQuad
|
||||
|
||||
!Computes element functions in point Xi
|
||||
PURE FUNCTION fPsiQuad(self, Xi) RESULT(fPsi)
|
||||
PURE FUNCTION fPsiQuad(self, Xi, nNodes) RESULT(fPsi)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCartQuad), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
REAL(8):: fPsi(1:self%nNodes)
|
||||
INTEGER, INTENT(in):: nNodes
|
||||
REAL(8):: fPsi(1:nNodes)
|
||||
|
||||
fPsi(1) = (1.D0-Xi(1)) * (1.D0-Xi(2))
|
||||
fPsi(2) = (1.D0+Xi(1)) * (1.D0-Xi(2))
|
||||
|
|
@ -321,12 +322,13 @@ MODULE moduleMesh2DCart
|
|||
END FUNCTION fPsiQuad
|
||||
|
||||
!Derivative element function at coordinates Xi
|
||||
PURE FUNCTION dPsiQuad(self, Xi) RESULT(dPsi)
|
||||
PURE FUNCTION dPsiQuad(self, Xi, nNodes) RESULT(dPsi)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCartQuad), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
REAL(8):: dPsi(1:3,1:self%nNodes)
|
||||
INTEGER, INTENT(in):: nNodes
|
||||
REAL(8):: dPsi(1:3,1:nNodes)
|
||||
|
||||
dPsi = 0.D0
|
||||
|
||||
|
|
@ -373,7 +375,7 @@ MODULE moduleMesh2DCart
|
|||
Xi(2) = random(-1.D0, 1.D0)
|
||||
Xi(3) = 0.D0
|
||||
|
||||
fPsi = self%fPsi(Xi)
|
||||
fPsi = self%fPsi(Xi, 4)
|
||||
|
||||
r(1) = DOT_PRODUCT(fPsi, self%x)
|
||||
r(2) = DOT_PRODUCT(fPsi, self%y)
|
||||
|
|
@ -399,8 +401,8 @@ MODULE moduleMesh2DCart
|
|||
Xi(2) = corQuad(l)
|
||||
DO m = 1, 3
|
||||
Xi(1) = corQuad(m)
|
||||
fPsi = self%fPsi(Xi)
|
||||
dPsi = self%dPsi(Xi)
|
||||
fPsi = self%fPsi(Xi, 4)
|
||||
dPsi = self%dPsi(Xi, 4)
|
||||
detJ = self%detJac(Xi,dPsi)
|
||||
invJ = self%invJac(Xi,dPsi)
|
||||
localK = localK + MATMUL(TRANSPOSE(MATMUL(invJ,dPsi)), &
|
||||
|
|
@ -431,7 +433,7 @@ MODULE moduleMesh2DCart
|
|||
DO m = 1, 3
|
||||
Xi(2) = corQuad(m)
|
||||
detJ = self%detJac(Xi)
|
||||
fPsi = self%fPsi(Xi)
|
||||
fPsi = self%fPsi(Xi, 4)
|
||||
f = DOT_PRODUCT(fPsi,source)
|
||||
localF = localF + f*fPsi*wQuad(l)*wQuad(m)*detJ
|
||||
|
||||
|
|
@ -521,9 +523,9 @@ MODULE moduleMesh2DCart
|
|||
XiO = 0.D0
|
||||
|
||||
DO WHILE(conv > 1.D-2)
|
||||
dPsi = self%dPsi(XiO)
|
||||
dPsi = self%dPsi(XiO, 4)
|
||||
invJ = self%invJac(XiO, dPsi)
|
||||
fPsi = self%fPsi(XiO)
|
||||
fPsi = self%fPsi(XiO, 4)
|
||||
f = (/ DOT_PRODUCT(fPsi,self%x), &
|
||||
DOT_PRODUCT(fPsi,self%y), &
|
||||
0.D0 /)
|
||||
|
|
@ -618,7 +620,7 @@ MODULE moduleMesh2DCart
|
|||
Xi(2) = random( 0.D0, 1.D0 - Xi(1))
|
||||
Xi(3) = 0.D0
|
||||
|
||||
fPsi = self%fPsi(Xi)
|
||||
fPsi = self%fPsi(Xi, 4)
|
||||
|
||||
r(1) = DOT_PRODUCT(fPsi, self%x)
|
||||
r(2) = DOT_PRODUCT(fPsi, self%y)
|
||||
|
|
@ -640,19 +642,20 @@ MODULE moduleMesh2DCart
|
|||
!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)
|
||||
fPsi = self%fPsi(Xi, 4)
|
||||
self%volume = detJ
|
||||
self%arNodes = fPsi*detJ
|
||||
|
||||
END SUBROUTINE areaTria
|
||||
|
||||
!Shape functions for triangular element
|
||||
PURE FUNCTION fPsiTria(self, Xi) RESULT(fPsi)
|
||||
PURE FUNCTION fPsiTria(self, Xi, nNodes) RESULT(fPsi)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCartTria), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
REAL(8):: fPsi(1:self%nNodes)
|
||||
INTEGER, INTENT(in):: nNodes
|
||||
REAL(8):: fPsi(1:nNodes)
|
||||
|
||||
fPsi(1) = 1.D0 - Xi(1) - Xi(2)
|
||||
fPsi(2) = Xi(1)
|
||||
|
|
@ -661,12 +664,13 @@ MODULE moduleMesh2DCart
|
|||
END FUNCTION fPsiTria
|
||||
|
||||
!Derivative element function at coordinates Xi
|
||||
PURE FUNCTION dPsiTria(self, Xi) RESULT(dPsi)
|
||||
PURE FUNCTION dPsiTria(self, Xi, nNodes) RESULT(dPsi)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCell2DCartTria), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: Xi(1:3)
|
||||
REAL(8):: dPsi(1:3,1:self%nNodes)
|
||||
INTEGER, INTENT(in):: nNodes
|
||||
REAL(8):: dPsi(1:3,1:nNodes)
|
||||
|
||||
dPsi = 0.D0
|
||||
|
||||
|
|
@ -706,10 +710,10 @@ MODULE moduleMesh2DCart
|
|||
DO l=1, 4
|
||||
Xi(1) = Xi1Tria(l)
|
||||
Xi(2) = Xi2Tria(l)
|
||||
dPsi = self%dPsi(Xi)
|
||||
dPsi = self%dPsi(Xi, 4)
|
||||
detJ = self%detJac(Xi,dPsi)
|
||||
invJ = self%invJac(Xi,dPsi)
|
||||
fPsi = self%fPsi(Xi)
|
||||
fPsi = self%fPsi(Xi, 4)
|
||||
localK = localK + MATMUL(TRANSPOSE(MATMUL(invJ,dPsi)),MATMUL(invJ,dPsi))*wTria(l)/detJ
|
||||
|
||||
END DO
|
||||
|
|
@ -735,7 +739,7 @@ MODULE moduleMesh2DCart
|
|||
Xi(1) = Xi1Tria(l)
|
||||
Xi(2) = Xi2Tria(l)
|
||||
detJ = self%detJac(Xi)
|
||||
fPsi = self%fPsi(Xi)
|
||||
fPsi = self%fPsi(Xi, 4)
|
||||
f = DOT_PRODUCT(fPsi,source)
|
||||
localF = localF + f*fPsi*wTria(l)*detJ
|
||||
|
||||
|
|
@ -818,7 +822,7 @@ 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)
|
||||
dPsi = self%dPsi(Xi, 4)
|
||||
invJ = self%invJac(Xi, dPsi)
|
||||
detJ = self%detJac(Xi, dPsi)
|
||||
Xi = MATMUL(invJ,deltaR)/detJ
|
||||
|
|
@ -864,7 +868,7 @@ MODULE moduleMesh2DCart
|
|||
dPsi = dPsi_in
|
||||
|
||||
ELSE
|
||||
dPsi = self%dPsi(Xi)
|
||||
dPsi = self%dPsi(Xi, 4)
|
||||
|
||||
END IF
|
||||
|
||||
|
|
@ -889,7 +893,7 @@ MODULE moduleMesh2DCart
|
|||
dPsi=dPsi_in
|
||||
|
||||
ELSE
|
||||
dPsi = self%dPsi(Xi)
|
||||
dPsi = self%dPsi(Xi, 4)
|
||||
|
||||
END IF
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue