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

@ -232,7 +232,7 @@ MODULE moduleMesh1DRad
Xi(1) = random(-1.D0, 1.D0)
Xi(2:3) = 0.D0
fPsi = self%fPsi(Xi)
fPsi = self%fPsi(Xi, 2)
r(1) = DOT_PRODUCT(fPsi, self%r)
END FUNCTION randPos1DRadSeg
@ -252,7 +252,7 @@ MODULE moduleMesh1DRad
self%arNodes = 0.D0
!1 point Gauss integral
Xi = 0.D0
fPsi = self%fPsi(Xi)
fPsi = self%fPsi(Xi, 2)
detJ = self%detJac(Xi)
!Computes total volume of the cell
r = DOT_PRODUCT(fPsi, self%r)
@ -260,38 +260,38 @@ MODULE moduleMesh1DRad
self%volume = r*l
!Computes volume per node
Xi = (/-5.D-1, 0.D0, 0.D0/)
fPsi_node = self%fPsi(Xi)
r = DOT_PRODUCT(fPsi_node,self%r)
r = self%gatherF(Xi, self%r)
self%arNodes(1) = fPsi(1)*r*l
Xi = (/ 5.D-1, 0.D0, 0.D0/)
fPsi_node = self%fPsi(Xi)
r = DOT_PRODUCT(fPsi_node,self%r)
r = self%gatherF(Xi, self%r)
self%arNodes(2) = fPsi(2)*r*l
END SUBROUTINE areaRad
!Computes element functions at point Xi
PURE FUNCTION fPsiRad(self, xi) RESULT(fPsi)
PURE FUNCTION fPsiRad(self, Xi, nNodes) RESULT(fPsi)
IMPLICIT NONE
CLASS(meshCell1DRadSegm), INTENT(in):: self
REAL(8), INTENT(in):: xi(1:3)
REAL(8):: fPsi(1:self%nNodes)
REAL(8), INTENT(in):: Xi(1:3)
INTEGER, INTENT(in):: nNodes
REAL(8):: fPsi(1:nNodes)
fPsi(1) = 1.D0 - xi(1)
fPsi(2) = 1.D0 + xi(1)
fPsi(1) = 1.D0 - Xi(1)
fPsi(2) = 1.D0 + Xi(1)
fPsi = fPsi * 5.D-1
END FUNCTION fPsiRad
!Computes element derivative shape function at Xi
PURE FUNCTION dPsiRad(self, xi) RESULT(dPsi)
PURE FUNCTION dPsiRad(self, Xi, nNodes) RESULT(dPsi)
IMPLICIT NONE
CLASS(meshCell1DRadSegm), INTENT(in):: self
REAL(8), INTENT(in):: xi(1:3)
REAL(8):: dPsi(1:3,1:self%nNodes)
REAL(8), INTENT(in):: Xi(1:3)
INTEGER, INTENT(in):: nNodes
REAL(8):: dPsi(1:3,1:nNodes)
dPsi = 0.D0
@ -328,15 +328,15 @@ MODULE moduleMesh1DRad
localK = 0.D0
Xi = 0.D0
DO l = 1, 3
Xi(1) = corSeg(l)
dPsi = self%dPsi(Xi)
detJ = self%detJac(Xi, dPsi)
invJ = self%invJac(Xi, dPsi)
fPsi = self%fPsi(Xi)
r = DOT_PRODUCT(fPsi, self%r)
localK = localK + MATMUL(RESHAPE(MATMUL(invJ,dPsi), (/ 2, 1/)), &
RESHAPE(MATMUL(invJ,dPsi), (/ 1, 2/)))* &
r*wSeg(l)/detJ
Xi(1) = corSeg(l)
dPsi = self%dPsi(Xi, 2)
detJ = self%detJac(Xi, dPsi)
invJ = self%invJac(Xi, dPsi)
fPsi = self%fPsi(Xi, 2)
r = DOT_PRODUCT(fPsi, self%r)
localK = localK + MATMUL(RESHAPE(MATMUL(invJ,dPsi), (/ 2, 1/)), &
RESHAPE(MATMUL(invJ,dPsi), (/ 1, 2/)))* &
r*wSeg(l)/detJ
END DO
@ -362,7 +362,7 @@ MODULE moduleMesh1DRad
DO l = 1, 3
Xi(1) = corSeg(l)
detJ = self%detJac(Xi)
fPsi = self%fPsi(Xi)
fPsi = self%fPsi(Xi, 2)
r = DOT_PRODUCT(fPsi, self%r)
f = DOT_PRODUCT(fPsi, source)
localF = localF + f*fPsi*r*wSeg(l)*detJ
@ -405,14 +405,14 @@ MODULE moduleMesh1DRad
END FUNCTION gatherMFRad
PURE FUNCTION insideRad(xi) RESULT(ins)
PURE FUNCTION insideRad(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
ins = Xi(1) >=-1.D0 .AND. &
Xi(1) <= 1.D0
END FUNCTION insideRad
@ -439,19 +439,19 @@ MODULE moduleMesh1DRad
END FUNCTION phy2logRad
!Get next element for a logical position xi
SUBROUTINE nextElementRad(self, xi, nextElement)
!Get next element for a logical position Xi
SUBROUTINE nextElementRad(self, Xi, nextElement)
IMPLICIT NONE
CLASS(meshCell1DRadSegm), INTENT(in):: self
REAL(8), INTENT(in):: xi(1:3)
REAL(8), INTENT(in):: Xi(1:3)
CLASS(meshElement), POINTER, INTENT(out):: nextElement
NULLIFY(nextElement)
IF (xi(1) < -1.D0) THEN
IF (Xi(1) < -1.D0) THEN
nextElement => self%e2
ELSEIF (xi(1) > 1.D0) THEN
ELSEIF (Xi(1) > 1.D0) THEN
nextElement => self%e1
END IF
@ -460,11 +460,11 @@ MODULE moduleMesh1DRad
!COMMON FUNCTIONS FOR 1D VOLUME ELEMENTS
!Computes the element Jacobian determinant
PURE FUNCTION detJ1DRad(self, xi, dPsi_in) RESULT(dJ)
PURE FUNCTION detJ1DRad(self, Xi, dPsi_in) RESULT(dJ)
IMPLICIT NONE
CLASS(meshCell1DRad), 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:3,1:self%nNodes)
REAL(8):: dPsi(1:3,1:self%nNodes)
REAL(8):: dJ
@ -474,7 +474,7 @@ MODULE moduleMesh1DRad
dPsi = dPsi_in
ELSE
dPsi = self%dPsi(xi)
dPsi = self%dPsi(Xi, 2)
END IF
@ -484,11 +484,11 @@ MODULE moduleMesh1DRad
END FUNCTION detJ1DRad
!Computes the invers Jacobian
PURE FUNCTION invJ1DRad(self, xi, dPsi_in) RESULT(invJ)
PURE FUNCTION invJ1DRad(self, Xi, dPsi_in) RESULT(invJ)
IMPLICIT NONE
CLASS(meshCell1DRad), 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:3,1:self%nNodes)
REAL(8):: dPsi(1:3,1:self%nNodes)
REAL(8):: dx(1)
@ -498,7 +498,7 @@ MODULE moduleMesh1DRad
dPsi = dPsi_in
ELSE
dPsi = self%dPsi(xi)
dPsi = self%dPsi(Xi, 2)
END IF