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:
Jorge Gonzalez 2023-01-05 21:22:13 +01:00
commit 15d64f3e68
8 changed files with 159 additions and 143 deletions

View file

@ -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