Mark_1
First thing that I am kinda happy with. Still some things to improve but at least push is good.
This commit is contained in:
parent
15d64f3e68
commit
7f6afd6a87
11 changed files with 336 additions and 258 deletions
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue