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
|
|
@ -362,7 +362,7 @@ MODULE moduleInput
|
||||||
nodes = mesh%cells(e)%obj%getNodes()
|
nodes = mesh%cells(e)%obj%getNodes()
|
||||||
nNodes = mesh%cells(e)%obj%nNodes
|
nNodes = mesh%cells(e)%obj%nNodes
|
||||||
ALLOCATE(fPsi(1:nNodes))
|
ALLOCATE(fPsi(1:nNodes))
|
||||||
fPsi = mesh%cells(e)%obj%fPsi((/0.D0, 0.D0, 0.D0/))
|
fPsi = mesh%cells(e)%obj%fPsi((/0.D0, 0.D0, 0.D0/), nNodes)
|
||||||
ALLOCATE(source(1:nNodes))
|
ALLOCATE(source(1:nNodes))
|
||||||
DO j = 1, nNodes
|
DO j = 1, nNodes
|
||||||
source(j) = density(nodes(j))
|
source(j) = density(nodes(j))
|
||||||
|
|
@ -380,7 +380,7 @@ MODULE moduleInput
|
||||||
partNew%r = mesh%cells(e)%obj%randPos()
|
partNew%r = mesh%cells(e)%obj%randPos()
|
||||||
partNew%xi = mesh%cells(e)%obj%phy2log(partNew%r)
|
partNew%xi = mesh%cells(e)%obj%phy2log(partNew%r)
|
||||||
!Get mean velocity at particle position
|
!Get mean velocity at particle position
|
||||||
fPsi = mesh%cells(e)%obj%fPsi(partNew%xi)
|
fPsi = mesh%cells(e)%obj%fPsi(partNew%xi, nNodes)
|
||||||
DO j = 1, nNodes
|
DO j = 1, nNodes
|
||||||
source(j) = velocity(nodes(j), 1)
|
source(j) = velocity(nodes(j), 1)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -109,23 +109,25 @@ MODULE moduleMesh0D
|
||||||
|
|
||||||
END FUNCTION randPos0D
|
END FUNCTION randPos0D
|
||||||
|
|
||||||
PURE FUNCTION fPsi0D(self, Xi) RESULT(fPsi)
|
PURE FUNCTION fPsi0D(self, Xi, nNodes) RESULT(fPsi)
|
||||||
IMPLICIT NONE
|
IMPLICIT NONE
|
||||||
|
|
||||||
CLASS(meshCell0D), INTENT(in):: self
|
CLASS(meshCell0D), INTENT(in):: self
|
||||||
REAL(8), INTENT(in):: Xi(1:3)
|
REAL(8), INTENT(in):: Xi(1:3)
|
||||||
REAL(8):: fPsi(1:self%nNodes)
|
INTEGER, INTENT(in):: nNodes
|
||||||
|
REAL(8):: fPsi(1:nNodes)
|
||||||
|
|
||||||
fPsi = 1.D0
|
fPsi = 1.D0
|
||||||
|
|
||||||
END FUNCTION fPsi0D
|
END FUNCTION fPsi0D
|
||||||
|
|
||||||
PURE FUNCTION dPsi0D(self, Xi) RESULT(dPsi)
|
PURE FUNCTION dPsi0D(self, Xi, nNodes) RESULT(dPsi)
|
||||||
IMPLICIT NONE
|
IMPLICIT NONE
|
||||||
|
|
||||||
CLASS(meshCell0D), INTENT(in):: self
|
CLASS(meshCell0D), INTENT(in):: self
|
||||||
REAL(8), INTENT(in):: Xi(1:3)
|
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
|
dPsi = 0.D0
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -230,7 +230,7 @@ MODULE moduleMesh1DCart
|
||||||
Xi(1) = random(-1.D0, 1.D0)
|
Xi(1) = random(-1.D0, 1.D0)
|
||||||
Xi(2:3) = 0.D0
|
Xi(2:3) = 0.D0
|
||||||
|
|
||||||
fPsi = self%fPsi(Xi)
|
fPsi = self%fPsi(Xi, 2)
|
||||||
r(1) = DOT_PRODUCT(fPsi, self%x)
|
r(1) = DOT_PRODUCT(fPsi, self%x)
|
||||||
|
|
||||||
END FUNCTION randPos1DCartSegm
|
END FUNCTION randPos1DCartSegm
|
||||||
|
|
@ -249,7 +249,7 @@ MODULE moduleMesh1DCart
|
||||||
self%arNodes = 0.D0
|
self%arNodes = 0.D0
|
||||||
!1 point Gauss integral
|
!1 point Gauss integral
|
||||||
Xi = 0.D0
|
Xi = 0.D0
|
||||||
fPsi = self%fPsi(Xi)
|
fPsi = self%fPsi(Xi, 2)
|
||||||
detJ = self%detJac(Xi)
|
detJ = self%detJac(Xi)
|
||||||
l = 2.D0*detJ
|
l = 2.D0*detJ
|
||||||
self%volume = l
|
self%volume = l
|
||||||
|
|
@ -258,27 +258,29 @@ MODULE moduleMesh1DCart
|
||||||
END SUBROUTINE areaSegm
|
END SUBROUTINE areaSegm
|
||||||
|
|
||||||
!Computes element functions at point Xi
|
!Computes element functions at point Xi
|
||||||
PURE FUNCTION fPsiSegm(self, xi) RESULT(fPsi)
|
PURE FUNCTION fPsiSegm(self, Xi, nNodes) RESULT(fPsi)
|
||||||
IMPLICIT NONE
|
IMPLICIT NONE
|
||||||
|
|
||||||
CLASS(meshCell1DCartSegm), INTENT(in):: self
|
CLASS(meshCell1DCartSegm), INTENT(in):: self
|
||||||
REAL(8), INTENT(in):: xi(1:3)
|
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)
|
fPsi(1) = 1.D0 - Xi(1)
|
||||||
fPsi(2) = 1.D0 + xi(1)
|
fPsi(2) = 1.D0 + Xi(1)
|
||||||
|
|
||||||
fPsi = fPsi * 5.D-1
|
fPsi = fPsi * 5.D-1
|
||||||
|
|
||||||
END FUNCTION fPsiSegm
|
END FUNCTION fPsiSegm
|
||||||
|
|
||||||
!Computes element derivative shape function at Xi
|
!Computes element derivative shape function at Xi
|
||||||
PURE FUNCTION dPsiSegm(self, xi) RESULT(dPsi)
|
PURE FUNCTION dPsiSegm(self, Xi, nNodes) RESULT(dPsi)
|
||||||
IMPLICIT NONE
|
IMPLICIT NONE
|
||||||
|
|
||||||
CLASS(meshCell1DCartSegm), INTENT(in):: self
|
CLASS(meshCell1DCartSegm), INTENT(in):: self
|
||||||
REAL(8), INTENT(in):: xi(1:3)
|
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
|
dPsi = 0.D0
|
||||||
|
|
||||||
|
|
@ -314,7 +316,7 @@ MODULE moduleMesh1DCart
|
||||||
Xi = 0.D0
|
Xi = 0.D0
|
||||||
DO l = 1, 3
|
DO l = 1, 3
|
||||||
Xi(1) = corSeg(l)
|
Xi(1) = corSeg(l)
|
||||||
dPsi = self%dPsi(Xi)
|
dPsi = self%dPsi(Xi, 2)
|
||||||
detJ = self%detJac(Xi, dPsi)
|
detJ = self%detJac(Xi, dPsi)
|
||||||
invJ = self%invJac(Xi, dPsi)
|
invJ = self%invJac(Xi, dPsi)
|
||||||
localK = localK + MATMUL(RESHAPE(MATMUL(invJ,dPsi), (/ 2, 1/)), &
|
localK = localK + MATMUL(RESHAPE(MATMUL(invJ,dPsi), (/ 2, 1/)), &
|
||||||
|
|
@ -342,7 +344,7 @@ MODULE moduleMesh1DCart
|
||||||
DO l = 1, 3
|
DO l = 1, 3
|
||||||
Xi(1) = corSeg(l)
|
Xi(1) = corSeg(l)
|
||||||
detJ = self%detJac(Xi)
|
detJ = self%detJac(Xi)
|
||||||
fPsi = self%fPsi(Xi)
|
fPsi = self%fPsi(Xi, 2)
|
||||||
f = DOT_PRODUCT(fPsi, source)
|
f = DOT_PRODUCT(fPsi, source)
|
||||||
localF = localF + f*fPsi*wSeg(l)*detJ
|
localF = localF + f*fPsi*wSeg(l)*detJ
|
||||||
|
|
||||||
|
|
@ -384,14 +386,14 @@ MODULE moduleMesh1DCart
|
||||||
|
|
||||||
END FUNCTION gatherMFSegm
|
END FUNCTION gatherMFSegm
|
||||||
|
|
||||||
PURE FUNCTION insideSegm(xi) RESULT(ins)
|
PURE FUNCTION insideSegm(Xi) RESULT(ins)
|
||||||
IMPLICIT NONE
|
IMPLICIT NONE
|
||||||
|
|
||||||
REAL(8), INTENT(in):: xi(1:3)
|
REAL(8), INTENT(in):: Xi(1:3)
|
||||||
LOGICAL:: ins
|
LOGICAL:: ins
|
||||||
|
|
||||||
ins = xi(1) >=-1.D0 .AND. &
|
ins = Xi(1) >=-1.D0 .AND. &
|
||||||
xi(1) <= 1.D0
|
Xi(1) <= 1.D0
|
||||||
|
|
||||||
END FUNCTION insideSegm
|
END FUNCTION insideSegm
|
||||||
|
|
||||||
|
|
@ -418,19 +420,19 @@ MODULE moduleMesh1DCart
|
||||||
|
|
||||||
END FUNCTION phy2logSegm
|
END FUNCTION phy2logSegm
|
||||||
|
|
||||||
!Get next element for a logical position xi
|
!Get next element for a logical position Xi
|
||||||
SUBROUTINE nextElementSegm(self, xi, nextElement)
|
SUBROUTINE nextElementSegm(self, Xi, nextElement)
|
||||||
IMPLICIT NONE
|
IMPLICIT NONE
|
||||||
|
|
||||||
CLASS(meshCell1DCartSegm), INTENT(in):: self
|
CLASS(meshCell1DCartSegm), INTENT(in):: self
|
||||||
REAL(8), INTENT(in):: xi(1:3)
|
REAL(8), INTENT(in):: Xi(1:3)
|
||||||
CLASS(meshElement), POINTER, INTENT(out):: nextElement
|
CLASS(meshElement), POINTER, INTENT(out):: nextElement
|
||||||
|
|
||||||
NULLIFY(nextElement)
|
NULLIFY(nextElement)
|
||||||
IF (xi(1) < -1.D0) THEN
|
IF (Xi(1) < -1.D0) THEN
|
||||||
nextElement => self%e2
|
nextElement => self%e2
|
||||||
|
|
||||||
ELSEIF (xi(1) > 1.D0) THEN
|
ELSEIF (Xi(1) > 1.D0) THEN
|
||||||
nextElement => self%e1
|
nextElement => self%e1
|
||||||
|
|
||||||
END IF
|
END IF
|
||||||
|
|
@ -440,11 +442,11 @@ MODULE moduleMesh1DCart
|
||||||
!COMMON FUNCTIONS FOR 1D VOLUME ELEMENTS
|
!COMMON FUNCTIONS FOR 1D VOLUME ELEMENTS
|
||||||
!Calculates a random position in 1D volume
|
!Calculates a random position in 1D volume
|
||||||
!Computes the element Jacobian determinant
|
!Computes the element Jacobian determinant
|
||||||
PURE FUNCTION detJ1DCart(self, xi, dPsi_in) RESULT(dJ)
|
PURE FUNCTION detJ1DCart(self, Xi, dPsi_in) RESULT(dJ)
|
||||||
IMPLICIT NONE
|
IMPLICIT NONE
|
||||||
|
|
||||||
CLASS(meshCell1DCart), INTENT(in):: self
|
CLASS(meshCell1DCart), 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), INTENT(in), OPTIONAL:: dPsi_in(1:3,1:self%nNodes)
|
||||||
REAL(8):: dPsi(1:3,1:self%nNodes)
|
REAL(8):: dPsi(1:3,1:self%nNodes)
|
||||||
REAL(8):: dJ
|
REAL(8):: dJ
|
||||||
|
|
@ -454,7 +456,7 @@ MODULE moduleMesh1DCart
|
||||||
dPsi = dPsi_in
|
dPsi = dPsi_in
|
||||||
|
|
||||||
ELSE
|
ELSE
|
||||||
dPsi = self%dPsi(xi)
|
dPsi = self%dPsi(Xi, 2)
|
||||||
|
|
||||||
END IF
|
END IF
|
||||||
|
|
||||||
|
|
@ -464,11 +466,11 @@ MODULE moduleMesh1DCart
|
||||||
END FUNCTION detJ1DCart
|
END FUNCTION detJ1DCart
|
||||||
|
|
||||||
!Computes the invers Jacobian
|
!Computes the invers Jacobian
|
||||||
PURE FUNCTION invJ1DCart(self, xi, dPsi_in) RESULT(invJ)
|
PURE FUNCTION invJ1DCart(self, Xi, dPsi_in) RESULT(invJ)
|
||||||
IMPLICIT NONE
|
IMPLICIT NONE
|
||||||
|
|
||||||
CLASS(meshCell1DCart), INTENT(in):: self
|
CLASS(meshCell1DCart), 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), INTENT(in), OPTIONAL:: dPsi_in(1:3,1:self%nNodes)
|
||||||
REAL(8):: invJ(1:3,1:3)
|
REAL(8):: invJ(1:3,1:3)
|
||||||
REAL(8):: dPsi(1:3,1:self%nNodes)
|
REAL(8):: dPsi(1:3,1:self%nNodes)
|
||||||
|
|
@ -478,7 +480,7 @@ MODULE moduleMesh1DCart
|
||||||
dPsi = dPsi_in
|
dPsi = dPsi_in
|
||||||
|
|
||||||
ELSE
|
ELSE
|
||||||
dPsi = self%dPsi(xi)
|
dPsi = self%dPsi(Xi, 2)
|
||||||
|
|
||||||
END IF
|
END IF
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -232,7 +232,7 @@ MODULE moduleMesh1DRad
|
||||||
Xi(1) = random(-1.D0, 1.D0)
|
Xi(1) = random(-1.D0, 1.D0)
|
||||||
Xi(2:3) = 0.D0
|
Xi(2:3) = 0.D0
|
||||||
|
|
||||||
fPsi = self%fPsi(Xi)
|
fPsi = self%fPsi(Xi, 2)
|
||||||
r(1) = DOT_PRODUCT(fPsi, self%r)
|
r(1) = DOT_PRODUCT(fPsi, self%r)
|
||||||
|
|
||||||
END FUNCTION randPos1DRadSeg
|
END FUNCTION randPos1DRadSeg
|
||||||
|
|
@ -252,7 +252,7 @@ MODULE moduleMesh1DRad
|
||||||
self%arNodes = 0.D0
|
self%arNodes = 0.D0
|
||||||
!1 point Gauss integral
|
!1 point Gauss integral
|
||||||
Xi = 0.D0
|
Xi = 0.D0
|
||||||
fPsi = self%fPsi(Xi)
|
fPsi = self%fPsi(Xi, 2)
|
||||||
detJ = self%detJac(Xi)
|
detJ = self%detJac(Xi)
|
||||||
!Computes total volume of the cell
|
!Computes total volume of the cell
|
||||||
r = DOT_PRODUCT(fPsi, self%r)
|
r = DOT_PRODUCT(fPsi, self%r)
|
||||||
|
|
@ -260,38 +260,38 @@ MODULE moduleMesh1DRad
|
||||||
self%volume = r*l
|
self%volume = r*l
|
||||||
!Computes volume per node
|
!Computes volume per node
|
||||||
Xi = (/-5.D-1, 0.D0, 0.D0/)
|
Xi = (/-5.D-1, 0.D0, 0.D0/)
|
||||||
fPsi_node = self%fPsi(Xi)
|
r = self%gatherF(Xi, self%r)
|
||||||
r = DOT_PRODUCT(fPsi_node,self%r)
|
|
||||||
self%arNodes(1) = fPsi(1)*r*l
|
self%arNodes(1) = fPsi(1)*r*l
|
||||||
Xi = (/ 5.D-1, 0.D0, 0.D0/)
|
Xi = (/ 5.D-1, 0.D0, 0.D0/)
|
||||||
fPsi_node = self%fPsi(Xi)
|
r = self%gatherF(Xi, self%r)
|
||||||
r = DOT_PRODUCT(fPsi_node,self%r)
|
|
||||||
self%arNodes(2) = fPsi(2)*r*l
|
self%arNodes(2) = fPsi(2)*r*l
|
||||||
|
|
||||||
END SUBROUTINE areaRad
|
END SUBROUTINE areaRad
|
||||||
|
|
||||||
!Computes element functions at point Xi
|
!Computes element functions at point Xi
|
||||||
PURE FUNCTION fPsiRad(self, xi) RESULT(fPsi)
|
PURE FUNCTION fPsiRad(self, Xi, nNodes) RESULT(fPsi)
|
||||||
IMPLICIT NONE
|
IMPLICIT NONE
|
||||||
|
|
||||||
CLASS(meshCell1DRadSegm), INTENT(in):: self
|
CLASS(meshCell1DRadSegm), INTENT(in):: self
|
||||||
REAL(8), INTENT(in):: xi(1:3)
|
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)
|
fPsi(1) = 1.D0 - Xi(1)
|
||||||
fPsi(2) = 1.D0 + xi(1)
|
fPsi(2) = 1.D0 + Xi(1)
|
||||||
|
|
||||||
fPsi = fPsi * 5.D-1
|
fPsi = fPsi * 5.D-1
|
||||||
|
|
||||||
END FUNCTION fPsiRad
|
END FUNCTION fPsiRad
|
||||||
|
|
||||||
!Computes element derivative shape function at Xi
|
!Computes element derivative shape function at Xi
|
||||||
PURE FUNCTION dPsiRad(self, xi) RESULT(dPsi)
|
PURE FUNCTION dPsiRad(self, Xi, nNodes) RESULT(dPsi)
|
||||||
IMPLICIT NONE
|
IMPLICIT NONE
|
||||||
|
|
||||||
CLASS(meshCell1DRadSegm), INTENT(in):: self
|
CLASS(meshCell1DRadSegm), INTENT(in):: self
|
||||||
REAL(8), INTENT(in):: xi(1:3)
|
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
|
dPsi = 0.D0
|
||||||
|
|
||||||
|
|
@ -328,15 +328,15 @@ MODULE moduleMesh1DRad
|
||||||
localK = 0.D0
|
localK = 0.D0
|
||||||
Xi = 0.D0
|
Xi = 0.D0
|
||||||
DO l = 1, 3
|
DO l = 1, 3
|
||||||
Xi(1) = corSeg(l)
|
Xi(1) = corSeg(l)
|
||||||
dPsi = self%dPsi(Xi)
|
dPsi = self%dPsi(Xi, 2)
|
||||||
detJ = self%detJac(Xi, dPsi)
|
detJ = self%detJac(Xi, dPsi)
|
||||||
invJ = self%invJac(Xi, dPsi)
|
invJ = self%invJac(Xi, dPsi)
|
||||||
fPsi = self%fPsi(Xi)
|
fPsi = self%fPsi(Xi, 2)
|
||||||
r = DOT_PRODUCT(fPsi, self%r)
|
r = DOT_PRODUCT(fPsi, self%r)
|
||||||
localK = localK + MATMUL(RESHAPE(MATMUL(invJ,dPsi), (/ 2, 1/)), &
|
localK = localK + MATMUL(RESHAPE(MATMUL(invJ,dPsi), (/ 2, 1/)), &
|
||||||
RESHAPE(MATMUL(invJ,dPsi), (/ 1, 2/)))* &
|
RESHAPE(MATMUL(invJ,dPsi), (/ 1, 2/)))* &
|
||||||
r*wSeg(l)/detJ
|
r*wSeg(l)/detJ
|
||||||
|
|
||||||
END DO
|
END DO
|
||||||
|
|
||||||
|
|
@ -362,7 +362,7 @@ MODULE moduleMesh1DRad
|
||||||
DO l = 1, 3
|
DO l = 1, 3
|
||||||
Xi(1) = corSeg(l)
|
Xi(1) = corSeg(l)
|
||||||
detJ = self%detJac(Xi)
|
detJ = self%detJac(Xi)
|
||||||
fPsi = self%fPsi(Xi)
|
fPsi = self%fPsi(Xi, 2)
|
||||||
r = DOT_PRODUCT(fPsi, self%r)
|
r = DOT_PRODUCT(fPsi, self%r)
|
||||||
f = DOT_PRODUCT(fPsi, source)
|
f = DOT_PRODUCT(fPsi, source)
|
||||||
localF = localF + f*fPsi*r*wSeg(l)*detJ
|
localF = localF + f*fPsi*r*wSeg(l)*detJ
|
||||||
|
|
@ -405,14 +405,14 @@ MODULE moduleMesh1DRad
|
||||||
|
|
||||||
END FUNCTION gatherMFRad
|
END FUNCTION gatherMFRad
|
||||||
|
|
||||||
PURE FUNCTION insideRad(xi) RESULT(ins)
|
PURE FUNCTION insideRad(Xi) RESULT(ins)
|
||||||
IMPLICIT NONE
|
IMPLICIT NONE
|
||||||
|
|
||||||
REAL(8), INTENT(in):: xi(1:3)
|
REAL(8), INTENT(in):: Xi(1:3)
|
||||||
LOGICAL:: ins
|
LOGICAL:: ins
|
||||||
|
|
||||||
ins = xi(1) >=-1.D0 .AND. &
|
ins = Xi(1) >=-1.D0 .AND. &
|
||||||
xi(1) <= 1.D0
|
Xi(1) <= 1.D0
|
||||||
|
|
||||||
END FUNCTION insideRad
|
END FUNCTION insideRad
|
||||||
|
|
||||||
|
|
@ -439,19 +439,19 @@ MODULE moduleMesh1DRad
|
||||||
|
|
||||||
END FUNCTION phy2logRad
|
END FUNCTION phy2logRad
|
||||||
|
|
||||||
!Get next element for a logical position xi
|
!Get next element for a logical position Xi
|
||||||
SUBROUTINE nextElementRad(self, xi, nextElement)
|
SUBROUTINE nextElementRad(self, Xi, nextElement)
|
||||||
IMPLICIT NONE
|
IMPLICIT NONE
|
||||||
|
|
||||||
CLASS(meshCell1DRadSegm), INTENT(in):: self
|
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
|
CLASS(meshElement), POINTER, INTENT(out):: nextElement
|
||||||
|
|
||||||
NULLIFY(nextElement)
|
NULLIFY(nextElement)
|
||||||
IF (xi(1) < -1.D0) THEN
|
IF (Xi(1) < -1.D0) THEN
|
||||||
nextElement => self%e2
|
nextElement => self%e2
|
||||||
|
|
||||||
ELSEIF (xi(1) > 1.D0) THEN
|
ELSEIF (Xi(1) > 1.D0) THEN
|
||||||
nextElement => self%e1
|
nextElement => self%e1
|
||||||
|
|
||||||
END IF
|
END IF
|
||||||
|
|
@ -460,11 +460,11 @@ MODULE moduleMesh1DRad
|
||||||
|
|
||||||
!COMMON FUNCTIONS FOR 1D VOLUME ELEMENTS
|
!COMMON FUNCTIONS FOR 1D VOLUME ELEMENTS
|
||||||
!Computes the element Jacobian determinant
|
!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
|
IMPLICIT NONE
|
||||||
|
|
||||||
CLASS(meshCell1DRad), INTENT(in):: self
|
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), INTENT(in), OPTIONAL:: dPsi_in(1:3,1:self%nNodes)
|
||||||
REAL(8):: dPsi(1:3,1:self%nNodes)
|
REAL(8):: dPsi(1:3,1:self%nNodes)
|
||||||
REAL(8):: dJ
|
REAL(8):: dJ
|
||||||
|
|
@ -474,7 +474,7 @@ MODULE moduleMesh1DRad
|
||||||
dPsi = dPsi_in
|
dPsi = dPsi_in
|
||||||
|
|
||||||
ELSE
|
ELSE
|
||||||
dPsi = self%dPsi(xi)
|
dPsi = self%dPsi(Xi, 2)
|
||||||
|
|
||||||
END IF
|
END IF
|
||||||
|
|
||||||
|
|
@ -484,11 +484,11 @@ MODULE moduleMesh1DRad
|
||||||
END FUNCTION detJ1DRad
|
END FUNCTION detJ1DRad
|
||||||
|
|
||||||
!Computes the invers Jacobian
|
!Computes the invers Jacobian
|
||||||
PURE FUNCTION invJ1DRad(self, xi, dPsi_in) RESULT(invJ)
|
PURE FUNCTION invJ1DRad(self, Xi, dPsi_in) RESULT(invJ)
|
||||||
IMPLICIT NONE
|
IMPLICIT NONE
|
||||||
|
|
||||||
CLASS(meshCell1DRad), INTENT(in):: self
|
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), INTENT(in), OPTIONAL:: dPsi_in(1:3,1:self%nNodes)
|
||||||
REAL(8):: dPsi(1:3,1:self%nNodes)
|
REAL(8):: dPsi(1:3,1:self%nNodes)
|
||||||
REAL(8):: dx(1)
|
REAL(8):: dx(1)
|
||||||
|
|
@ -498,7 +498,7 @@ MODULE moduleMesh1DRad
|
||||||
dPsi = dPsi_in
|
dPsi = dPsi_in
|
||||||
|
|
||||||
ELSE
|
ELSE
|
||||||
dPsi = self%dPsi(xi)
|
dPsi = self%dPsi(Xi, 2)
|
||||||
|
|
||||||
END IF
|
END IF
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -297,19 +297,20 @@ MODULE moduleMesh2DCart
|
||||||
!2D 1 point Gauss Quad Integral
|
!2D 1 point Gauss Quad Integral
|
||||||
Xi = 0.D0
|
Xi = 0.D0
|
||||||
detJ = self%detJac(Xi)*4.D0 !4
|
detJ = self%detJac(Xi)*4.D0 !4
|
||||||
fPsi = self%fPsi(Xi)
|
fPsi = self%fPsi(Xi, 4)
|
||||||
self%volume = detJ
|
self%volume = detJ
|
||||||
self%arNodes = fPsi*detJ
|
self%arNodes = fPsi*detJ
|
||||||
|
|
||||||
END SUBROUTINE areaQuad
|
END SUBROUTINE areaQuad
|
||||||
|
|
||||||
!Computes element functions in point Xi
|
!Computes element functions in point Xi
|
||||||
PURE FUNCTION fPsiQuad(self, Xi) RESULT(fPsi)
|
PURE FUNCTION fPsiQuad(self, Xi, nNodes) RESULT(fPsi)
|
||||||
IMPLICIT NONE
|
IMPLICIT NONE
|
||||||
|
|
||||||
CLASS(meshCell2DCartQuad), INTENT(in):: self
|
CLASS(meshCell2DCartQuad), INTENT(in):: self
|
||||||
REAL(8), INTENT(in):: Xi(1:3)
|
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(1) = (1.D0-Xi(1)) * (1.D0-Xi(2))
|
||||||
fPsi(2) = (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
|
END FUNCTION fPsiQuad
|
||||||
|
|
||||||
!Derivative element function at coordinates Xi
|
!Derivative element function at coordinates Xi
|
||||||
PURE FUNCTION dPsiQuad(self, Xi) RESULT(dPsi)
|
PURE FUNCTION dPsiQuad(self, Xi, nNodes) RESULT(dPsi)
|
||||||
IMPLICIT NONE
|
IMPLICIT NONE
|
||||||
|
|
||||||
CLASS(meshCell2DCartQuad), INTENT(in):: self
|
CLASS(meshCell2DCartQuad), INTENT(in):: self
|
||||||
REAL(8), INTENT(in):: Xi(1:3)
|
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
|
dPsi = 0.D0
|
||||||
|
|
||||||
|
|
@ -373,7 +375,7 @@ MODULE moduleMesh2DCart
|
||||||
Xi(2) = random(-1.D0, 1.D0)
|
Xi(2) = random(-1.D0, 1.D0)
|
||||||
Xi(3) = 0.D0
|
Xi(3) = 0.D0
|
||||||
|
|
||||||
fPsi = self%fPsi(Xi)
|
fPsi = self%fPsi(Xi, 4)
|
||||||
|
|
||||||
r(1) = DOT_PRODUCT(fPsi, self%x)
|
r(1) = DOT_PRODUCT(fPsi, self%x)
|
||||||
r(2) = DOT_PRODUCT(fPsi, self%y)
|
r(2) = DOT_PRODUCT(fPsi, self%y)
|
||||||
|
|
@ -399,8 +401,8 @@ MODULE moduleMesh2DCart
|
||||||
Xi(2) = corQuad(l)
|
Xi(2) = corQuad(l)
|
||||||
DO m = 1, 3
|
DO m = 1, 3
|
||||||
Xi(1) = corQuad(m)
|
Xi(1) = corQuad(m)
|
||||||
fPsi = self%fPsi(Xi)
|
fPsi = self%fPsi(Xi, 4)
|
||||||
dPsi = self%dPsi(Xi)
|
dPsi = self%dPsi(Xi, 4)
|
||||||
detJ = self%detJac(Xi,dPsi)
|
detJ = self%detJac(Xi,dPsi)
|
||||||
invJ = self%invJac(Xi,dPsi)
|
invJ = self%invJac(Xi,dPsi)
|
||||||
localK = localK + MATMUL(TRANSPOSE(MATMUL(invJ,dPsi)), &
|
localK = localK + MATMUL(TRANSPOSE(MATMUL(invJ,dPsi)), &
|
||||||
|
|
@ -431,7 +433,7 @@ MODULE moduleMesh2DCart
|
||||||
DO m = 1, 3
|
DO m = 1, 3
|
||||||
Xi(2) = corQuad(m)
|
Xi(2) = corQuad(m)
|
||||||
detJ = self%detJac(Xi)
|
detJ = self%detJac(Xi)
|
||||||
fPsi = self%fPsi(Xi)
|
fPsi = self%fPsi(Xi, 4)
|
||||||
f = DOT_PRODUCT(fPsi,source)
|
f = DOT_PRODUCT(fPsi,source)
|
||||||
localF = localF + f*fPsi*wQuad(l)*wQuad(m)*detJ
|
localF = localF + f*fPsi*wQuad(l)*wQuad(m)*detJ
|
||||||
|
|
||||||
|
|
@ -521,9 +523,9 @@ MODULE moduleMesh2DCart
|
||||||
XiO = 0.D0
|
XiO = 0.D0
|
||||||
|
|
||||||
DO WHILE(conv > 1.D-2)
|
DO WHILE(conv > 1.D-2)
|
||||||
dPsi = self%dPsi(XiO)
|
dPsi = self%dPsi(XiO, 4)
|
||||||
invJ = self%invJac(XiO, dPsi)
|
invJ = self%invJac(XiO, dPsi)
|
||||||
fPsi = self%fPsi(XiO)
|
fPsi = self%fPsi(XiO, 4)
|
||||||
f = (/ DOT_PRODUCT(fPsi,self%x), &
|
f = (/ DOT_PRODUCT(fPsi,self%x), &
|
||||||
DOT_PRODUCT(fPsi,self%y), &
|
DOT_PRODUCT(fPsi,self%y), &
|
||||||
0.D0 /)
|
0.D0 /)
|
||||||
|
|
@ -618,7 +620,7 @@ MODULE moduleMesh2DCart
|
||||||
Xi(2) = random( 0.D0, 1.D0 - Xi(1))
|
Xi(2) = random( 0.D0, 1.D0 - Xi(1))
|
||||||
Xi(3) = 0.D0
|
Xi(3) = 0.D0
|
||||||
|
|
||||||
fPsi = self%fPsi(Xi)
|
fPsi = self%fPsi(Xi, 4)
|
||||||
|
|
||||||
r(1) = DOT_PRODUCT(fPsi, self%x)
|
r(1) = DOT_PRODUCT(fPsi, self%x)
|
||||||
r(2) = DOT_PRODUCT(fPsi, self%y)
|
r(2) = DOT_PRODUCT(fPsi, self%y)
|
||||||
|
|
@ -640,19 +642,20 @@ MODULE moduleMesh2DCart
|
||||||
!2D 1 point Gauss Quad Integral
|
!2D 1 point Gauss Quad Integral
|
||||||
Xi = (/1.D0/3.D0, 1.D0/3.D0, 0.D0 /)
|
Xi = (/1.D0/3.D0, 1.D0/3.D0, 0.D0 /)
|
||||||
detJ = self%detJac(Xi)/2.D0
|
detJ = self%detJac(Xi)/2.D0
|
||||||
fPsi = self%fPsi(Xi)
|
fPsi = self%fPsi(Xi, 4)
|
||||||
self%volume = detJ
|
self%volume = detJ
|
||||||
self%arNodes = fPsi*detJ
|
self%arNodes = fPsi*detJ
|
||||||
|
|
||||||
END SUBROUTINE areaTria
|
END SUBROUTINE areaTria
|
||||||
|
|
||||||
!Shape functions for triangular element
|
!Shape functions for triangular element
|
||||||
PURE FUNCTION fPsiTria(self, Xi) RESULT(fPsi)
|
PURE FUNCTION fPsiTria(self, Xi, nNodes) RESULT(fPsi)
|
||||||
IMPLICIT NONE
|
IMPLICIT NONE
|
||||||
|
|
||||||
CLASS(meshCell2DCartTria), INTENT(in):: self
|
CLASS(meshCell2DCartTria), INTENT(in):: self
|
||||||
REAL(8), INTENT(in):: Xi(1:3)
|
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(1) = 1.D0 - Xi(1) - Xi(2)
|
||||||
fPsi(2) = Xi(1)
|
fPsi(2) = Xi(1)
|
||||||
|
|
@ -661,12 +664,13 @@ MODULE moduleMesh2DCart
|
||||||
END FUNCTION fPsiTria
|
END FUNCTION fPsiTria
|
||||||
|
|
||||||
!Derivative element function at coordinates Xi
|
!Derivative element function at coordinates Xi
|
||||||
PURE FUNCTION dPsiTria(self, Xi) RESULT(dPsi)
|
PURE FUNCTION dPsiTria(self, Xi, nNodes) RESULT(dPsi)
|
||||||
IMPLICIT NONE
|
IMPLICIT NONE
|
||||||
|
|
||||||
CLASS(meshCell2DCartTria), INTENT(in):: self
|
CLASS(meshCell2DCartTria), INTENT(in):: self
|
||||||
REAL(8), INTENT(in):: Xi(1:3)
|
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
|
dPsi = 0.D0
|
||||||
|
|
||||||
|
|
@ -706,10 +710,10 @@ MODULE moduleMesh2DCart
|
||||||
DO l=1, 4
|
DO l=1, 4
|
||||||
Xi(1) = Xi1Tria(l)
|
Xi(1) = Xi1Tria(l)
|
||||||
Xi(2) = Xi2Tria(l)
|
Xi(2) = Xi2Tria(l)
|
||||||
dPsi = self%dPsi(Xi)
|
dPsi = self%dPsi(Xi, 4)
|
||||||
detJ = self%detJac(Xi,dPsi)
|
detJ = self%detJac(Xi,dPsi)
|
||||||
invJ = self%invJac(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
|
localK = localK + MATMUL(TRANSPOSE(MATMUL(invJ,dPsi)),MATMUL(invJ,dPsi))*wTria(l)/detJ
|
||||||
|
|
||||||
END DO
|
END DO
|
||||||
|
|
@ -735,7 +739,7 @@ MODULE moduleMesh2DCart
|
||||||
Xi(1) = Xi1Tria(l)
|
Xi(1) = Xi1Tria(l)
|
||||||
Xi(2) = Xi2Tria(l)
|
Xi(2) = Xi2Tria(l)
|
||||||
detJ = self%detJac(Xi)
|
detJ = self%detJac(Xi)
|
||||||
fPsi = self%fPsi(Xi)
|
fPsi = self%fPsi(Xi, 4)
|
||||||
f = DOT_PRODUCT(fPsi,source)
|
f = DOT_PRODUCT(fPsi,source)
|
||||||
localF = localF + f*fPsi*wTria(l)*detJ
|
localF = localF + f*fPsi*wTria(l)*detJ
|
||||||
|
|
||||||
|
|
@ -818,7 +822,7 @@ MODULE moduleMesh2DCart
|
||||||
!Direct method to convert coordinates
|
!Direct method to convert coordinates
|
||||||
Xi = 0.D0
|
Xi = 0.D0
|
||||||
deltaR = (/ r(1) - self%x(1), r(2) - self%y(1), 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)
|
invJ = self%invJac(Xi, dPsi)
|
||||||
detJ = self%detJac(Xi, dPsi)
|
detJ = self%detJac(Xi, dPsi)
|
||||||
Xi = MATMUL(invJ,deltaR)/detJ
|
Xi = MATMUL(invJ,deltaR)/detJ
|
||||||
|
|
@ -864,7 +868,7 @@ MODULE moduleMesh2DCart
|
||||||
dPsi = dPsi_in
|
dPsi = dPsi_in
|
||||||
|
|
||||||
ELSE
|
ELSE
|
||||||
dPsi = self%dPsi(Xi)
|
dPsi = self%dPsi(Xi, 4)
|
||||||
|
|
||||||
END IF
|
END IF
|
||||||
|
|
||||||
|
|
@ -889,7 +893,7 @@ MODULE moduleMesh2DCart
|
||||||
dPsi=dPsi_in
|
dPsi=dPsi_in
|
||||||
|
|
||||||
ELSE
|
ELSE
|
||||||
dPsi = self%dPsi(Xi)
|
dPsi = self%dPsi(Xi, 4)
|
||||||
|
|
||||||
END IF
|
END IF
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -307,7 +307,7 @@ MODULE moduleMesh2DCyl
|
||||||
!2D 1 point Gauss Quad Integral
|
!2D 1 point Gauss Quad Integral
|
||||||
Xi = 0.D0
|
Xi = 0.D0
|
||||||
detJ = self%detJac(Xi)*PI8 !4*2*pi
|
detJ = self%detJac(Xi)*PI8 !4*2*pi
|
||||||
fPsi = self%fPsi(Xi)
|
fPsi = self%fPsi(Xi, 4)
|
||||||
!Computes total volume of the cell
|
!Computes total volume of the cell
|
||||||
r = DOT_PRODUCT(fPsi,self%r)
|
r = DOT_PRODUCT(fPsi,self%r)
|
||||||
self%volume = r*detJ
|
self%volume = r*detJ
|
||||||
|
|
@ -328,29 +328,31 @@ MODULE moduleMesh2DCyl
|
||||||
END SUBROUTINE areaQuad
|
END SUBROUTINE areaQuad
|
||||||
|
|
||||||
!Computes element functions in point Xi
|
!Computes element functions in point Xi
|
||||||
PURE FUNCTION fPsiQuad(self, Xi) RESULT(fPsi)
|
PURE FUNCTION fPsiQuad(self, Xi, nNodes) RESULT(fPsi)
|
||||||
IMPLICIT NONE
|
IMPLICIT NONE
|
||||||
|
|
||||||
CLASS(meshCell2DCylQuad), INTENT(in):: self
|
CLASS(meshCell2DCylQuad), INTENT(in):: self
|
||||||
REAL(8), INTENT(in):: Xi(1:3)
|
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 = (/ (1.D0-Xi(1)) * (1.D0-Xi(2)), &
|
||||||
fPsi(2) = (1.D0+Xi(1)) * (1.D0-Xi(2))
|
(1.D0+Xi(1)) * (1.D0-Xi(2)), &
|
||||||
fPsi(3) = (1.D0+Xi(1)) * (1.D0+Xi(2))
|
(1.D0+Xi(1)) * (1.D0+Xi(2)), &
|
||||||
fPsi(4) = (1.D0-Xi(1)) * (1.D0+Xi(2))
|
(1.D0-Xi(1)) * (1.D0+Xi(2)) /)
|
||||||
|
|
||||||
fPsi = fPsi*0.25D0
|
fPsi = fPsi*0.25D0
|
||||||
|
|
||||||
END FUNCTION fPsiQuad
|
END FUNCTION fPsiQuad
|
||||||
|
|
||||||
!Derivative element function at coordinates Xi
|
!Derivative element function at coordinates Xi
|
||||||
PURE FUNCTION dPsiQuad(self, Xi) RESULT(dPsi)
|
PURE FUNCTION dPsiQuad(self, Xi, nNodes) RESULT(dPsi)
|
||||||
IMPLICIT NONE
|
IMPLICIT NONE
|
||||||
|
|
||||||
CLASS(meshCell2DCylQuad), INTENT(in):: self
|
CLASS(meshCell2DCylQuad), INTENT(in):: self
|
||||||
REAL(8), INTENT(in):: Xi(1:3)
|
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
|
dPsi = 0.D0
|
||||||
|
|
||||||
|
|
@ -397,7 +399,7 @@ MODULE moduleMesh2DCyl
|
||||||
Xi(2) = random(-1.D0, 1.D0)
|
Xi(2) = random(-1.D0, 1.D0)
|
||||||
Xi(3) = 0.D0
|
Xi(3) = 0.D0
|
||||||
|
|
||||||
fPsi = self%fPsi(Xi)
|
fPsi = self%fPsi(Xi, 4)
|
||||||
|
|
||||||
r(1) = DOT_PRODUCT(fPsi, self%z)
|
r(1) = DOT_PRODUCT(fPsi, self%z)
|
||||||
r(2) = DOT_PRODUCT(fPsi, self%r)
|
r(2) = DOT_PRODUCT(fPsi, self%r)
|
||||||
|
|
@ -425,8 +427,8 @@ MODULE moduleMesh2DCyl
|
||||||
Xi(2) = corQuad(l)
|
Xi(2) = corQuad(l)
|
||||||
DO m = 1, 3
|
DO m = 1, 3
|
||||||
Xi(1) = corQuad(m)
|
Xi(1) = corQuad(m)
|
||||||
fPsi = self%fPsi(Xi)
|
fPsi = self%fPsi(Xi, 4)
|
||||||
dPsi = self%dPsi(Xi)
|
dPsi = self%dPsi(Xi, 4)
|
||||||
detJ = self%detJac(Xi,dPsi)
|
detJ = self%detJac(Xi,dPsi)
|
||||||
invJ = self%invJac(Xi,dPsi)
|
invJ = self%invJac(Xi,dPsi)
|
||||||
r = DOT_PRODUCT(fPsi,self%r)
|
r = DOT_PRODUCT(fPsi,self%r)
|
||||||
|
|
@ -461,7 +463,7 @@ MODULE moduleMesh2DCyl
|
||||||
DO m = 1, 3
|
DO m = 1, 3
|
||||||
Xi(2) = corQuad(m)
|
Xi(2) = corQuad(m)
|
||||||
detJ = self%detJac(Xi)
|
detJ = self%detJac(Xi)
|
||||||
fPsi = self%fPsi(Xi)
|
fPsi = self%fPsi(Xi, 4)
|
||||||
r = DOT_PRODUCT(fPsi,self%r)
|
r = DOT_PRODUCT(fPsi,self%r)
|
||||||
f = DOT_PRODUCT(fPsi,source)
|
f = DOT_PRODUCT(fPsi,source)
|
||||||
localF = localF + r*f*fPsi*wQuad(l)*wQuad(m)*detJ
|
localF = localF + r*f*fPsi*wQuad(l)*wQuad(m)*detJ
|
||||||
|
|
@ -553,10 +555,10 @@ MODULE moduleMesh2DCyl
|
||||||
XiO = 0.D0
|
XiO = 0.D0
|
||||||
|
|
||||||
DO WHILE(conv > 1.D-2)
|
DO WHILE(conv > 1.D-2)
|
||||||
dPsi = self%dPsi(XiO)
|
dPsi = self%dPsi(XiO, 4)
|
||||||
invJ = self%invJac(XiO, dPsi)
|
invJ = self%invJac(XiO, dPsi)
|
||||||
detJ = self%detJac(XiO, dPsi)
|
detJ = self%detJac(XiO, dPsi)
|
||||||
fPsi = self%fPsi(XiO)
|
fPsi = self%fPsi(XiO, 4)
|
||||||
f = (/ DOT_PRODUCT(fPsi,self%z), &
|
f = (/ DOT_PRODUCT(fPsi,self%z), &
|
||||||
DOT_PRODUCT(fPsi,self%r), &
|
DOT_PRODUCT(fPsi,self%r), &
|
||||||
0.D0 /)
|
0.D0 /)
|
||||||
|
|
@ -651,7 +653,7 @@ MODULE moduleMesh2DCyl
|
||||||
Xi(2) = random( 0.D0, 1.D0 - Xi(1))
|
Xi(2) = random( 0.D0, 1.D0 - Xi(1))
|
||||||
Xi(3) = 0.D0
|
Xi(3) = 0.D0
|
||||||
|
|
||||||
fPsi = self%fPsi(Xi)
|
fPsi = self%fPsi(Xi, 4)
|
||||||
|
|
||||||
r(1) = DOT_PRODUCT(fPsi, self%z)
|
r(1) = DOT_PRODUCT(fPsi, self%z)
|
||||||
r(2) = DOT_PRODUCT(fPsi, self%r)
|
r(2) = DOT_PRODUCT(fPsi, self%r)
|
||||||
|
|
@ -675,7 +677,7 @@ MODULE moduleMesh2DCyl
|
||||||
!2D 1 point Gauss Quad Integral
|
!2D 1 point Gauss Quad Integral
|
||||||
Xi = (/1.D0/3.D0, 1.D0/3.D0, 0.D0 /)
|
Xi = (/1.D0/3.D0, 1.D0/3.D0, 0.D0 /)
|
||||||
detJ = self%detJac(Xi)*PI !2PI*1/2
|
detJ = self%detJac(Xi)*PI !2PI*1/2
|
||||||
fPsi = self%fPsi(Xi)
|
fPsi = self%fPsi(Xi, 4)
|
||||||
!Computes total volume of the cell
|
!Computes total volume of the cell
|
||||||
r = DOT_PRODUCT(fPsi,self%r)
|
r = DOT_PRODUCT(fPsi,self%r)
|
||||||
self%volume = r*detJ
|
self%volume = r*detJ
|
||||||
|
|
@ -685,12 +687,13 @@ MODULE moduleMesh2DCyl
|
||||||
END SUBROUTINE areaTria
|
END SUBROUTINE areaTria
|
||||||
|
|
||||||
!Shape functions for triangular element
|
!Shape functions for triangular element
|
||||||
PURE FUNCTION fPsiTria(self, Xi) RESULT(fPsi)
|
PURE FUNCTION fPsiTria(self, Xi, nNodes) RESULT(fPsi)
|
||||||
IMPLICIT NONE
|
IMPLICIT NONE
|
||||||
|
|
||||||
CLASS(meshCell2DCylTria), INTENT(in):: self
|
CLASS(meshCell2DCylTria), INTENT(in):: self
|
||||||
REAL(8), INTENT(in):: Xi(1:3)
|
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(1) = 1.D0 - Xi(1) - Xi(2)
|
||||||
fPsi(2) = Xi(1)
|
fPsi(2) = Xi(1)
|
||||||
|
|
@ -699,12 +702,13 @@ MODULE moduleMesh2DCyl
|
||||||
END FUNCTION fPsiTria
|
END FUNCTION fPsiTria
|
||||||
|
|
||||||
!Derivative element function at coordinates Xi
|
!Derivative element function at coordinates Xi
|
||||||
PURE FUNCTION dPsiTria(self, Xi) RESULT(dPsi)
|
PURE FUNCTION dPsiTria(self, Xi, nNodes) RESULT(dPsi)
|
||||||
IMPLICIT NONE
|
IMPLICIT NONE
|
||||||
|
|
||||||
CLASS(meshCell2DCylTria), INTENT(in):: self
|
CLASS(meshCell2DCylTria), INTENT(in):: self
|
||||||
REAL(8), INTENT(in):: Xi(1:3)
|
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
|
dPsi = 0.D0
|
||||||
|
|
||||||
|
|
@ -746,10 +750,10 @@ MODULE moduleMesh2DCyl
|
||||||
DO l=1, 4
|
DO l=1, 4
|
||||||
Xi(1) = Xi1Tria(l)
|
Xi(1) = Xi1Tria(l)
|
||||||
Xi(2) = Xi2Tria(l)
|
Xi(2) = Xi2Tria(l)
|
||||||
dPsi = self%dPsi(Xi)
|
dPsi = self%dPsi(Xi, 4)
|
||||||
detJ = self%detJac(Xi,dPsi)
|
detJ = self%detJac(Xi,dPsi)
|
||||||
invJ = self%invJac(Xi,dPsi)
|
invJ = self%invJac(Xi,dPsi)
|
||||||
fPsi = self%fPsi(Xi)
|
fPsi = self%fPsi(Xi, 4)
|
||||||
r = DOT_PRODUCT(fPsi,self%r)
|
r = DOT_PRODUCT(fPsi,self%r)
|
||||||
localK = localK + MATMUL(TRANSPOSE(MATMUL(invJ,dPsi)),MATMUL(invJ,dPsi))*r*wTria(l)/detJ
|
localK = localK + MATMUL(TRANSPOSE(MATMUL(invJ,dPsi)),MATMUL(invJ,dPsi))*r*wTria(l)/detJ
|
||||||
|
|
||||||
|
|
@ -779,7 +783,7 @@ MODULE moduleMesh2DCyl
|
||||||
Xi(1) = Xi1Tria(l)
|
Xi(1) = Xi1Tria(l)
|
||||||
Xi(2) = Xi2Tria(l)
|
Xi(2) = Xi2Tria(l)
|
||||||
detJ = self%detJac(Xi)
|
detJ = self%detJac(Xi)
|
||||||
fPsi = self%fPsi(Xi)
|
fPsi = self%fPsi(Xi, 4)
|
||||||
r = DOT_PRODUCT(fPsi,self%r)
|
r = DOT_PRODUCT(fPsi,self%r)
|
||||||
f = DOT_PRODUCT(fPsi,source)
|
f = DOT_PRODUCT(fPsi,source)
|
||||||
localF = localF + r*f*fPsi*wTria(l)*detJ
|
localF = localF + r*f*fPsi*wTria(l)*detJ
|
||||||
|
|
@ -864,7 +868,7 @@ MODULE moduleMesh2DCyl
|
||||||
!Direct method to convert coordinates
|
!Direct method to convert coordinates
|
||||||
Xi = 0.D0
|
Xi = 0.D0
|
||||||
deltaR = (/ r(1) - self%z(1), r(2) - self%r(1), 0.D0 /)
|
deltaR = (/ r(1) - self%z(1), r(2) - self%r(1), 0.D0 /)
|
||||||
dPsi = self%dPsi(Xi)
|
dPsi = self%dPsi(Xi, 4)
|
||||||
invJ = self%invJac(Xi, dPsi)
|
invJ = self%invJac(Xi, dPsi)
|
||||||
detJ = self%detJac(Xi, dPsi)
|
detJ = self%detJac(Xi, dPsi)
|
||||||
Xi = MATMUL(invJ,deltaR)/detJ
|
Xi = MATMUL(invJ,deltaR)/detJ
|
||||||
|
|
@ -910,7 +914,7 @@ MODULE moduleMesh2DCyl
|
||||||
dPsi = dPsi_in
|
dPsi = dPsi_in
|
||||||
|
|
||||||
ELSE
|
ELSE
|
||||||
dPsi = self%dPsi(Xi)
|
dPsi = self%dPsi(Xi, 4)
|
||||||
|
|
||||||
END IF
|
END IF
|
||||||
|
|
||||||
|
|
@ -935,7 +939,7 @@ MODULE moduleMesh2DCyl
|
||||||
dPsi=dPsi_in
|
dPsi=dPsi_in
|
||||||
|
|
||||||
ELSE
|
ELSE
|
||||||
dPsi = self%dPsi(Xi)
|
dPsi = self%dPsi(Xi, 4)
|
||||||
|
|
||||||
END IF
|
END IF
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -270,7 +270,7 @@ MODULE moduleMesh3DCart
|
||||||
|
|
||||||
!Assign proportional volume to each node
|
!Assign proportional volume to each node
|
||||||
Xi = (/0.25D0, 0.25D0, 0.25D0/)
|
Xi = (/0.25D0, 0.25D0, 0.25D0/)
|
||||||
fPsi = self%fPsi(Xi)
|
fPsi = self%fPsi(Xi, 4)
|
||||||
volNodes = fPsi*self%volume
|
volNodes = fPsi*self%volume
|
||||||
self%n1%v = self%n1%v + volNodes(1)
|
self%n1%v = self%n1%v + volNodes(1)
|
||||||
self%n2%v = self%n2%v + volNodes(2)
|
self%n2%v = self%n2%v + volNodes(2)
|
||||||
|
|
@ -298,7 +298,7 @@ MODULE moduleMesh3DCart
|
||||||
Xi(2) = random( 0.D0, 1.D0 - Xi(1))
|
Xi(2) = random( 0.D0, 1.D0 - Xi(1))
|
||||||
Xi(3) = random( 0.D0, 1.D0 - Xi(1) - Xi(2))
|
Xi(3) = random( 0.D0, 1.D0 - Xi(1) - Xi(2))
|
||||||
|
|
||||||
fPsi = self%fPsi(Xi)
|
fPsi = self%fPsi(Xi, 4)
|
||||||
|
|
||||||
r = (/ DOT_PRODUCT(fPsi, self%x), &
|
r = (/ DOT_PRODUCT(fPsi, self%x), &
|
||||||
DOT_PRODUCT(fPsi, self%y), &
|
DOT_PRODUCT(fPsi, self%y), &
|
||||||
|
|
@ -320,12 +320,13 @@ MODULE moduleMesh3DCart
|
||||||
END SUBROUTINE volumeTetra
|
END SUBROUTINE volumeTetra
|
||||||
|
|
||||||
!Computes element functions in point Xi
|
!Computes element functions in point Xi
|
||||||
PURE FUNCTION fPsiTetra(self, Xi) RESULT(fPsi)
|
PURE FUNCTION fPsiTetra(self, Xi, nNodes) RESULT(fPsi)
|
||||||
IMPLICIT NONE
|
IMPLICIT NONE
|
||||||
|
|
||||||
CLASS(meshCell3DCartTetra), INTENT(in):: self
|
CLASS(meshCell3DCartTetra), INTENT(in):: self
|
||||||
REAL(8), INTENT(in):: Xi(1:3)
|
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) - Xi(3)
|
fPsi(1) = 1.D0 - Xi(1) - Xi(2) - Xi(3)
|
||||||
fPsi(2) = Xi(1)
|
fPsi(2) = Xi(1)
|
||||||
|
|
@ -335,12 +336,13 @@ MODULE moduleMesh3DCart
|
||||||
END FUNCTION fPsiTetra
|
END FUNCTION fPsiTetra
|
||||||
|
|
||||||
!Derivative element function at coordinates Xi
|
!Derivative element function at coordinates Xi
|
||||||
PURE FUNCTION dPsiTetra(self, Xi) RESULT(dPsi)
|
PURE FUNCTION dPsiTetra(self, Xi, nNodes) RESULT(dPsi)
|
||||||
IMPLICIT NONE
|
IMPLICIT NONE
|
||||||
|
|
||||||
CLASS(meshCell3DCartTetra), INTENT(in):: self
|
CLASS(meshCell3DCartTetra), INTENT(in):: self
|
||||||
REAL(8), INTENT(in):: Xi(1:3)
|
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
|
dPsi = 0.D0
|
||||||
|
|
||||||
|
|
@ -424,10 +426,10 @@ MODULE moduleMesh3DCart
|
||||||
Xi = 0.D0
|
Xi = 0.D0
|
||||||
!TODO: One point Gauss integral. Upgrade when possible
|
!TODO: One point Gauss integral. Upgrade when possible
|
||||||
Xi = (/ 0.25D0, 0.25D0, 0.25D0 /)
|
Xi = (/ 0.25D0, 0.25D0, 0.25D0 /)
|
||||||
dPsi = self%dPsi(Xi)
|
dPsi = self%dPsi(Xi, 4)
|
||||||
detJ = self%detJac(Xi, dPsi)
|
detJ = self%detJac(Xi, dPsi)
|
||||||
invJ = self%invJac(Xi, dPsi)
|
invJ = self%invJac(Xi, dPsi)
|
||||||
fPsi = self%fPsi(Xi)
|
fPsi = self%fPsi(Xi, 4)
|
||||||
localK = MATMUL(TRANSPOSE(MATMUL(invJ,dPsi)),MATMUL(invJ,dPsi))*1.D0/detJ
|
localK = MATMUL(TRANSPOSE(MATMUL(invJ,dPsi)),MATMUL(invJ,dPsi))*1.D0/detJ
|
||||||
|
|
||||||
END FUNCTION elemKTetra
|
END FUNCTION elemKTetra
|
||||||
|
|
@ -445,9 +447,9 @@ MODULE moduleMesh3DCart
|
||||||
localF = 0.D0
|
localF = 0.D0
|
||||||
Xi = 0.D0
|
Xi = 0.D0
|
||||||
Xi = (/ 0.25D0, 0.25D0, 0.25D0 /)
|
Xi = (/ 0.25D0, 0.25D0, 0.25D0 /)
|
||||||
dPsi = self%dPsi(Xi)
|
dPsi = self%dPsi(Xi, 4)
|
||||||
detJ = self%detJac(Xi, dPsi)
|
detJ = self%detJac(Xi, dPsi)
|
||||||
fPsi = self%fPsi(Xi)
|
fPsi = self%fPsi(Xi, 4)
|
||||||
f = DOT_PRODUCT(fPsi, source)
|
f = DOT_PRODUCT(fPsi, source)
|
||||||
localF = f*fPsi*1.D0*detJ
|
localF = f*fPsi*1.D0*detJ
|
||||||
|
|
||||||
|
|
@ -530,7 +532,7 @@ MODULE moduleMesh3DCart
|
||||||
|
|
||||||
Xi = 0.D0
|
Xi = 0.D0
|
||||||
deltaR = (/r(1) - self%x(1), r(2) - self%y(1), r(3) - self%z(1) /)
|
deltaR = (/r(1) - self%x(1), r(2) - self%y(1), r(3) - self%z(1) /)
|
||||||
dPsi = self%dPsi(Xi)
|
dPsi = self%dPsi(Xi, 4)
|
||||||
invJ = self%invJac(Xi, dPsi)
|
invJ = self%invJac(Xi, dPsi)
|
||||||
detJ = self%detJac(Xi, dPsi)
|
detJ = self%detJac(Xi, dPsi)
|
||||||
Xi = MATMUL(invJ, deltaR)/detJ
|
Xi = MATMUL(invJ, deltaR)/detJ
|
||||||
|
|
@ -579,7 +581,7 @@ MODULE moduleMesh3DCart
|
||||||
dPsi = dPsi_in
|
dPsi = dPsi_in
|
||||||
|
|
||||||
ELSE
|
ELSE
|
||||||
dPsi = self%dPsi(Xi)
|
dPsi = self%dPsi(Xi, 4)
|
||||||
|
|
||||||
END IF
|
END IF
|
||||||
|
|
||||||
|
|
@ -604,7 +606,7 @@ MODULE moduleMesh3DCart
|
||||||
dPsi=dPsi_in
|
dPsi=dPsi_in
|
||||||
|
|
||||||
ELSE
|
ELSE
|
||||||
dPsi = self%dPsi(Xi)
|
dPsi = self%dPsi(Xi, 4)
|
||||||
|
|
||||||
END IF
|
END IF
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -215,19 +215,21 @@ MODULE moduleMesh
|
||||||
|
|
||||||
END FUNCTION getNodesVol_interface
|
END FUNCTION getNodesVol_interface
|
||||||
|
|
||||||
PURE FUNCTION fPsi_interface(self, Xi) RESULT(fPsi)
|
PURE FUNCTION fPsi_interface(self, Xi, nNodes) RESULT(fPsi)
|
||||||
IMPORT:: meshCell
|
IMPORT:: meshCell
|
||||||
CLASS(meshCell), INTENT(in):: self
|
CLASS(meshCell), INTENT(in):: self
|
||||||
REAL(8), INTENT(in):: Xi(1:3)
|
REAL(8), INTENT(in):: Xi(1:3)
|
||||||
REAL(8):: fPsi(1:self%nNodes)
|
INTEGER, INTENT(in):: nNodes
|
||||||
|
REAL(8):: fPsi(1:nNodes)
|
||||||
|
|
||||||
END FUNCTION fPsi_interface
|
END FUNCTION fPsi_interface
|
||||||
|
|
||||||
PURE FUNCTION dPsi_interface(self, Xi) RESULT(dPsi)
|
PURE FUNCTION dPsi_interface(self, Xi, nNodes) RESULT(dPsi)
|
||||||
IMPORT:: meshCell
|
IMPORT:: meshCell
|
||||||
CLASS(meshCell), INTENT(in):: self
|
CLASS(meshCell), INTENT(in):: self
|
||||||
REAL(8), INTENT(in):: Xi(1:3)
|
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)
|
||||||
|
|
||||||
END FUNCTION dPsi_interface
|
END FUNCTION dPsi_interface
|
||||||
|
|
||||||
|
|
@ -530,7 +532,7 @@ MODULE moduleMesh
|
||||||
REAL(8):: f
|
REAL(8):: f
|
||||||
REAL(8):: fPsi(1:self%nNodes)
|
REAL(8):: fPsi(1:self%nNodes)
|
||||||
|
|
||||||
fPsi = self%fPsi(Xi)
|
fPsi = self%fPsi(Xi, self%nNodes)
|
||||||
f = DOT_PRODUCT(fPsi, valNodes)
|
f = DOT_PRODUCT(fPsi, valNodes)
|
||||||
|
|
||||||
END FUNCTION gatherF_scalar
|
END FUNCTION gatherF_scalar
|
||||||
|
|
@ -546,7 +548,7 @@ MODULE moduleMesh
|
||||||
REAL(8):: f(1:n)
|
REAL(8):: f(1:n)
|
||||||
REAL(8):: fPsi(1:self%nNodes)
|
REAL(8):: fPsi(1:self%nNodes)
|
||||||
|
|
||||||
fPsi = self%fPsi(Xi)
|
fPsi = self%fPsi(Xi, self%nNodes)
|
||||||
f = MATMUL(fPsi, valNodes)
|
f = MATMUL(fPsi, valNodes)
|
||||||
|
|
||||||
END FUNCTION gatherF_array
|
END FUNCTION gatherF_array
|
||||||
|
|
@ -563,7 +565,7 @@ MODULE moduleMesh
|
||||||
REAL(8):: dPsiR(1:3, 1:self%nNodes)
|
REAL(8):: dPsiR(1:3, 1:self%nNodes)
|
||||||
REAL(8):: invJ(1:3, 1:3), detJ
|
REAL(8):: invJ(1:3, 1:3), detJ
|
||||||
|
|
||||||
dPsi = self%dPsi(Xi)
|
dPsi = self%dPsi(Xi, self%nNodes)
|
||||||
detJ = self%detJac(Xi, dPsi)
|
detJ = self%detJac(Xi, dPsi)
|
||||||
invJ = self%invJac(Xi, dPsi)
|
invJ = self%invJac(Xi, dPsi)
|
||||||
dPsiR = MATMUL(invJ, dPsi)/detJ
|
dPsiR = MATMUL(invJ, dPsi)/detJ
|
||||||
|
|
@ -590,7 +592,7 @@ MODULE moduleMesh
|
||||||
CLASS(meshNode), POINTER:: node
|
CLASS(meshNode), POINTER:: node
|
||||||
|
|
||||||
cellNodes = self%getNodes()
|
cellNodes = self%getNodes()
|
||||||
fPsi = self%fPsi(part%Xi)
|
fPsi = self%fPsi(part%Xi, self%nNodes)
|
||||||
|
|
||||||
tensorS = outerProduct(part%v, part%v)
|
tensorS = outerProduct(part%v, part%v)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue