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

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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