First thing that I am kinda happy with.

Still some things to improve but at least push is good.
This commit is contained in:
Jorge Gonzalez 2023-01-05 22:43:51 +01:00
commit 7f6afd6a87
11 changed files with 336 additions and 258 deletions

View file

@ -66,6 +66,8 @@ MODULE moduleMesh
!Parent of Edge element
TYPE, PUBLIC, ABSTRACT, EXTENDS(meshElement):: meshEdge
!Nomber of nodes in the edge
INTEGER:: nNodes
!Connectivity to cells
CLASS(meshCell), POINTER:: e1 => NULL(), e2 => NULL()
!Connectivity to cells in meshColl
@ -102,10 +104,11 @@ MODULE moduleMesh
END SUBROUTINE initEdge_interface
!Get nodes index from node
PURE FUNCTION getNodesEdge_interface(self) RESULT(n)
PURE FUNCTION getNodesEdge_interface(self, nNodes) RESULT(n)
IMPORT:: meshEdge
CLASS(meshEdge), INTENT(in):: self
INTEGER, ALLOCATABLE:: n(:)
INTEGER, INTENT(in):: nNodes
INTEGER:: n(1:nNodes)
END FUNCTION getNodesEdge_interface
@ -166,7 +169,7 @@ MODULE moduleMesh
!Init the cell
PROCEDURE(initCell_interface), DEFERRED, PASS:: init
!Get the index of the nodes
PROCEDURE(getNodesVol_interface), DEFERRED, PASS:: getNodes
PROCEDURE(getNodesCell_interface), DEFERRED, PASS:: getNodes
!Calculate random position on the cell
PROCEDURE(randPosVol_interface), DEFERRED, PASS:: randPos
!Obtain functions and values of cell natural functions
@ -208,12 +211,13 @@ MODULE moduleMesh
END SUBROUTINE initCell_interface
PURE FUNCTION getNodesVol_interface(self) RESULT(n)
PURE FUNCTION getNodesCell_interface(self, nNodes) RESULT(n)
IMPORT:: meshCell
CLASS(meshCell), INTENT(in):: self
INTEGER:: n(1:self%nNodes)
INTEGER, INTENT(in):: nNodes
INTEGER:: n(1:nNodes)
END FUNCTION getNodesVol_interface
END FUNCTION getNodesCell_interface
PURE FUNCTION fPsi_interface(self, Xi, nNodes) RESULT(fPsi)
IMPORT:: meshCell
@ -233,20 +237,22 @@ MODULE moduleMesh
END FUNCTION dPsi_interface
PURE FUNCTION detJac_interface(self, Xi, dPsi_in) RESULT(dJ)
PURE FUNCTION detJac_interface(self, Xi, nNodes, dPsi_in) RESULT(dJ)
IMPORT:: meshCell
CLASS(meshCell), INTENT(in):: self
REAL(8), INTENT(in):: Xi(1:3)
REAL(8), INTENT(in), OPTIONAL:: dPsi_in(1:3,1:self%nNodes)
INTEGER, INTENT(in):: nNodes
REAL(8), INTENT(in), OPTIONAL:: dPsi_in(1:3,1:nNodes)
REAL(8):: dJ
END FUNCTION detJac_interface
PURE FUNCTION invJac_interface(self, Xi, dPsi_in) RESULT(invJ)
PURE FUNCTION invJac_interface(self, Xi, nNodes, dPsi_in) RESULT(invJ)
IMPORT:: meshCell
CLASS(meshCell), INTENT(in):: self
REAL(8), INTENT(in):: Xi(1:3)
REAL(8), INTENT(in), OPTIONAL:: dPsi_in(1:3,1:self%nNodes)
INTEGER, INTENT(in):: nNodes
REAL(8), INTENT(in), OPTIONAL:: dPsi_in(1:3,1:nNodes)
REAL(8):: invJ(1:3,1:3)
END FUNCTION invJac_interface
@ -259,18 +265,20 @@ MODULE moduleMesh
END FUNCTION gatherArray_interface
PURE FUNCTION elemK_interface(self) RESULT(localK)
PURE FUNCTION elemK_interface(self, nNodes) RESULT(localK)
IMPORT:: meshCell
CLASS(meshCell), INTENT(in):: self
REAL(8):: localK(1:self%nNodes,1:self%nNodes)
INTEGER, INTENT(in):: nNodes
REAL(8):: localK(1:nNodes,1:nNodes)
END FUNCTION elemK_interface
PURE FUNCTION elemF_interface(self, source) RESULT(localF)
PURE FUNCTION elemF_interface(self, nNodes, source) RESULT(localF)
IMPORT:: meshCell
CLASS(meshCell), INTENT(in):: self
REAL(8), INTENT(in):: source(1:self%nNodes)
REAL(8):: localF(1:self%nNodes)
INTEGER, INTENT(in):: nNodes
REAL(8), INTENT(in):: source(1:nNodes)
REAL(8):: localF(1:nNodes)
END FUNCTION elemF_interface
@ -478,19 +486,22 @@ MODULE moduleMesh
CONTAINS
!Constructs the global K matrix
SUBROUTINE constructGlobalK(self)
PURE SUBROUTINE constructGlobalK(self)
IMPLICIT NONE
CLASS(meshParticles), INTENT(inout):: self
INTEGER:: e
INTEGER:: nNodes
INTEGER, ALLOCATABLE:: n(:)
REAL(8), ALLOCATABLE:: localK(:,:)
INTEGER:: nNodes, i, j
INTEGER:: i, j
DO e = 1, self%numCells
n = self%cells(e)%obj%getNodes()
localK = self%cells(e)%obj%elemK()
nNodes = SIZE(n)
nNodes = self%cells(e)%obj%nNodes
ALLOCATE(n(1:nNodes))
ALLOCATE(localK(1:nNodes, 1:nNodes))
n = self%cells(e)%obj%getNodes(nNodes)
localK = self%cells(e)%obj%elemK(nNodes)
DO i = 1, nNodes
DO j = 1, nNodes
@ -499,6 +510,8 @@ MODULE moduleMesh
END DO
END DO
DEALLOCATE(n, localK)
END DO
@ -523,51 +536,53 @@ MODULE moduleMesh
END SUBROUTINE resetOutput
!Gather the value of valNodes (scalar) at position Xi
PURE FUNCTION gatherF_scalar(self, Xi, valNodes) RESULT(f)
PURE FUNCTION gatherF_scalar(self, Xi, nNodes, valNodes) RESULT(f)
IMPLICIT NONE
CLASS(meshCell), INTENT(in):: self
REAL(8), INTENT(in):: Xi(1:3)
REAL(8), INTENT(in):: valNodes(1:self%nNodes)
INTEGER, INTENT(in):: nNodes
REAL(8), INTENT(in):: valNodes(1:nNodes)
REAL(8):: f
REAL(8):: fPsi(1:self%nNodes)
REAL(8):: fPsi(1:nNodes)
fPsi = self%fPsi(Xi, self%nNodes)
fPsi = self%fPsi(Xi, nNodes)
f = DOT_PRODUCT(fPsi, valNodes)
END FUNCTION gatherF_scalar
!Gather the value of valNodes (array) at position Xi
PURE FUNCTION gatherF_array(self, Xi, n, valNodes) RESULT(f)
PURE FUNCTION gatherF_array(self, Xi, nNodes, valNodes) RESULT(f)
IMPLICIT NONE
CLASS(meshCell), INTENT(in):: self
REAL(8), INTENT(in):: Xi(1:3)
INTEGER, INTENT(in):: n
REAL(8), INTENT(in):: valNodes(1:self%nNodes, 1:n)
REAL(8):: f(1:n)
REAL(8):: fPsi(1:self%nNodes)
INTEGER, INTENT(in):: nNodes
REAL(8), INTENT(in):: valNodes(1:nNodes, 1:3)
REAL(8):: f(1:3)
REAL(8):: fPsi(1:nNodes)
fPsi = self%fPsi(Xi, self%nNodes)
fPsi = self%fPsi(Xi, nNodes)
f = MATMUL(fPsi, valNodes)
END FUNCTION gatherF_array
!Gather the spatial derivative of valNodes (scalar) at position Xi
PURE FUNCTION gatherDF_scalar(self, Xi, valNodes) RESULT(df)
PURE FUNCTION gatherDF_scalar(self, Xi, nNodes, valNodes) RESULT(df)
IMPLICIT NONE
CLASS(meshCell), INTENT(in):: self
REAL(8), INTENT(in):: Xi(1:3)
REAL(8), INTENT(in):: valNodes(1:self%nNodes)
INTEGER, INTENT(in):: nNodes
REAL(8), INTENT(in):: valNodes(1:nNodes)
REAL(8):: df(1:3)
REAL(8):: dPsi(1:3, 1:self%nNodes)
REAL(8):: dPsiR(1:3, 1:self%nNodes)
REAL(8):: dPsi(1:3, 1:nNodes)
REAL(8):: dPsiR(1:3, 1:nNodes)
REAL(8):: invJ(1:3, 1:3), detJ
dPsi = self%dPsi(Xi, self%nNodes)
detJ = self%detJac(Xi, dPsi)
invJ = self%invJac(Xi, dPsi)
dPsi = self%dPsi(Xi, nNodes)
detJ = self%detJac(Xi, nNodes, dPsi)
invJ = self%invJac(Xi, nNodes, dPsi)
dPsiR = MATMUL(invJ, dPsi)/detJ
df = (/ DOT_PRODUCT(dPsiR(1,:), valNodes), &
DOT_PRODUCT(dPsiR(2,:), valNodes), &
@ -576,29 +591,30 @@ MODULE moduleMesh
END FUNCTION gatherDF_scalar
!Scatters particle properties into cell nodes
SUBROUTINE scatter(self, part)
SUBROUTINE scatter(self, nNodes, part)
USE moduleMath
USE moduleSpecies
USE OMP_LIB
IMPLICIT NONE
CLASS(meshCell), INTENT(inout):: self
INTEGER, INTENT(in):: nNodes
CLASS(particle), INTENT(in):: part
REAL(8):: fPsi(1:self%nNodes)
INTEGER:: cellNodes(1:self%nNodes)
REAL(8):: fPsi(1:nNodes)
INTEGER:: cellNodes(1:nNodes)
REAL(8):: tensorS(1:3, 1:3)
INTEGER:: sp
INTEGER:: i
CLASS(meshNode), POINTER:: node
cellNodes = self%getNodes()
fPsi = self%fPsi(part%Xi, self%nNodes)
cellNodes = self%getNodes(nNodes)
fPsi = self%fPsi(part%Xi, nNodes)
tensorS = outerProduct(part%v, part%v)
sp = part%species%n
DO i = 1, self%nNodes
DO i = 1, nNodes
node => mesh%nodes(cellNodes(i))%obj
CALL OMP_SET_LOCK(node%lock)
node%output(sp)%den = node%output(sp)%den + part%weight*fPsi(i)