fPsi functions for edges
I need to make a common module for mesh, many functions for elements are shared. Also, try to reduce the 'select type' statements, but I don't know enough Fortran for it.
This commit is contained in:
parent
e7e6e1bece
commit
fbbb0d5d13
7 changed files with 114 additions and 28 deletions
|
|
@ -31,6 +31,7 @@ MODULE moduleMesh1DCart
|
||||||
PROCEDURE, PASS:: getNodes => getNodes1DCart
|
PROCEDURE, PASS:: getNodes => getNodes1DCart
|
||||||
PROCEDURE, PASS:: intersection => intersection1DCart
|
PROCEDURE, PASS:: intersection => intersection1DCart
|
||||||
PROCEDURE, PASS:: randPos => randPosEdge
|
PROCEDURE, PASS:: randPos => randPosEdge
|
||||||
|
procedure, nopass:: fPsi => fPsiPoint
|
||||||
|
|
||||||
END TYPE meshEdge1DCart
|
END TYPE meshEdge1DCart
|
||||||
|
|
||||||
|
|
@ -172,7 +173,19 @@ MODULE moduleMesh1DCart
|
||||||
|
|
||||||
END FUNCTION randPosEdge
|
END FUNCTION randPosEdge
|
||||||
|
|
||||||
!VOLUME FUNCTIONS
|
!Compute element functions at point Xi
|
||||||
|
pure function fPsiPoint(Xi, nNodes) RESULT(fPsi)
|
||||||
|
implicit none
|
||||||
|
|
||||||
|
real(8), intent(in):: Xi(1:3)
|
||||||
|
integer, intent(in):: nNodes
|
||||||
|
real(8):: fPsi(1:nNodes)
|
||||||
|
|
||||||
|
fPsi = (/ 1.D0 /)
|
||||||
|
|
||||||
|
end function fPsiPoint
|
||||||
|
|
||||||
|
!CELL FUNCTIONS
|
||||||
!SEGMENT FUNCTIONS
|
!SEGMENT FUNCTIONS
|
||||||
!Init element
|
!Init element
|
||||||
SUBROUTINE initCell1DCartSegm(self, n, p, nodes)
|
SUBROUTINE initCell1DCartSegm(self, n, p, nodes)
|
||||||
|
|
@ -446,7 +459,7 @@ MODULE moduleMesh1DCart
|
||||||
|
|
||||||
END SUBROUTINE volumeSegm
|
END SUBROUTINE volumeSegm
|
||||||
|
|
||||||
!COMMON FUNCTIONS FOR 1D VOLUME ELEMENTS
|
!COMMON FUNCTIONS FOR 1D CELL ELEMENTS
|
||||||
!Compute element Jacobian determinant
|
!Compute element Jacobian determinant
|
||||||
PURE FUNCTION detJ1DCart(pDer) RESULT(dJ)
|
PURE FUNCTION detJ1DCart(pDer) RESULT(dJ)
|
||||||
IMPLICIT NONE
|
IMPLICIT NONE
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@ MODULE moduleMesh1DRad
|
||||||
PROCEDURE, PASS:: getNodes => getNodes1DRad
|
PROCEDURE, PASS:: getNodes => getNodes1DRad
|
||||||
PROCEDURE, PASS:: intersection => intersection1DRad
|
PROCEDURE, PASS:: intersection => intersection1DRad
|
||||||
PROCEDURE, PASS:: randPos => randPos1DRad
|
PROCEDURE, PASS:: randPos => randPos1DRad
|
||||||
|
procedure, nopass:: fPsi => fPsiPoint
|
||||||
|
|
||||||
END TYPE meshEdge1DRad
|
END TYPE meshEdge1DRad
|
||||||
|
|
||||||
|
|
@ -172,7 +173,19 @@ MODULE moduleMesh1DRad
|
||||||
|
|
||||||
END FUNCTION randPos1DRad
|
END FUNCTION randPos1DRad
|
||||||
|
|
||||||
!VOLUME FUNCTIONS
|
!Compute element functions at point Xi
|
||||||
|
pure function fPsiPoint(Xi, nNodes) RESULT(fPsi)
|
||||||
|
implicit none
|
||||||
|
|
||||||
|
real(8), intent(in):: Xi(1:3)
|
||||||
|
integer, intent(in):: nNodes
|
||||||
|
real(8):: fPsi(1:nNodes)
|
||||||
|
|
||||||
|
fPsi = (/ 1.D0 /)
|
||||||
|
|
||||||
|
end function fPsiPoint
|
||||||
|
|
||||||
|
!CELL FUNCTIONS
|
||||||
!SEGMENT FUNCTIONS
|
!SEGMENT FUNCTIONS
|
||||||
!Init element
|
!Init element
|
||||||
SUBROUTINE initCell1DRadSegm(self, n, p, nodes)
|
SUBROUTINE initCell1DRadSegm(self, n, p, nodes)
|
||||||
|
|
@ -461,7 +474,7 @@ MODULE moduleMesh1DRad
|
||||||
|
|
||||||
END SUBROUTINE volumeSegm
|
END SUBROUTINE volumeSegm
|
||||||
|
|
||||||
!COMMON FUNCTIONS FOR 1D VOLUME ELEMENTS
|
!COMMON FUNCTIONS FOR 1D CELL ELEMENTS
|
||||||
!Compute element Jacobian determinant
|
!Compute element Jacobian determinant
|
||||||
PURE FUNCTION detJ1DRad(pDer) RESULT(dJ)
|
PURE FUNCTION detJ1DRad(pDer) RESULT(dJ)
|
||||||
IMPLICIT NONE
|
IMPLICIT NONE
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,7 @@ MODULE moduleMesh2DCart
|
||||||
PROCEDURE, PASS:: getNodes => getNodes2DCart
|
PROCEDURE, PASS:: getNodes => getNodes2DCart
|
||||||
PROCEDURE, PASS:: intersection => intersection2DCartEdge
|
PROCEDURE, PASS:: intersection => intersection2DCartEdge
|
||||||
PROCEDURE, PASS:: randPos => randPosEdge
|
PROCEDURE, PASS:: randPos => randPosEdge
|
||||||
|
procedure, nopass:: fPsi => fPsiSegm
|
||||||
|
|
||||||
END TYPE meshEdge2DCart
|
END TYPE meshEdge2DCart
|
||||||
|
|
||||||
|
|
@ -234,6 +235,21 @@ MODULE moduleMesh2DCart
|
||||||
|
|
||||||
END FUNCTION randPosEdge
|
END FUNCTION randPosEdge
|
||||||
|
|
||||||
|
!Compute element functions at point Xi
|
||||||
|
pure function fPsiSegm(Xi, nNodes) RESULT(fPsi)
|
||||||
|
implicit none
|
||||||
|
|
||||||
|
real(8), intent(in):: Xi(1:3)
|
||||||
|
integer, intent(in):: nNodes
|
||||||
|
real(8):: fPsi(1:nNodes)
|
||||||
|
|
||||||
|
fPsi = (/ 1.D0 - Xi(1), &
|
||||||
|
1.D0 + Xi(1) /)
|
||||||
|
|
||||||
|
fPsi = fPsi * 0.50D0
|
||||||
|
|
||||||
|
end function fPsiSegm
|
||||||
|
|
||||||
!VOLUME FUNCTIONS
|
!VOLUME FUNCTIONS
|
||||||
!QUAD FUNCTIONS
|
!QUAD FUNCTIONS
|
||||||
!Init element
|
!Init element
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,7 @@ MODULE moduleMesh2DCyl
|
||||||
PROCEDURE, PASS:: getNodes => getNodes2DCyl
|
PROCEDURE, PASS:: getNodes => getNodes2DCyl
|
||||||
PROCEDURE, PASS:: intersection => intersection2DCylEdge
|
PROCEDURE, PASS:: intersection => intersection2DCylEdge
|
||||||
PROCEDURE, PASS:: randPos => randPosEdge
|
PROCEDURE, PASS:: randPos => randPosEdge
|
||||||
|
procedure, nopass:: fPsi => fPsiSegm
|
||||||
|
|
||||||
END TYPE meshEdge2DCyl
|
END TYPE meshEdge2DCyl
|
||||||
|
|
||||||
|
|
@ -243,7 +244,22 @@ MODULE moduleMesh2DCyl
|
||||||
|
|
||||||
END FUNCTION randPosEdge
|
END FUNCTION randPosEdge
|
||||||
|
|
||||||
!VOLUME FUNCTIONS
|
!Compute element functions at point Xi
|
||||||
|
pure function fPsiSegm(Xi, nNodes) RESULT(fPsi)
|
||||||
|
implicit none
|
||||||
|
|
||||||
|
real(8), intent(in):: Xi(1:3)
|
||||||
|
integer, intent(in):: nNodes
|
||||||
|
real(8):: fPsi(1:nNodes)
|
||||||
|
|
||||||
|
fPsi = (/ 1.D0 - Xi(1), &
|
||||||
|
1.D0 + Xi(1) /)
|
||||||
|
|
||||||
|
fPsi = fPsi * 0.50D0
|
||||||
|
|
||||||
|
end function fPsiSegm
|
||||||
|
|
||||||
|
!CELL FUNCTIONS
|
||||||
!QUAD FUNCTIONS
|
!QUAD FUNCTIONS
|
||||||
!Init element
|
!Init element
|
||||||
SUBROUTINE initCellQuad2DCyl(self, n, p, nodes)
|
SUBROUTINE initCellQuad2DCyl(self, n, p, nodes)
|
||||||
|
|
@ -929,7 +945,7 @@ MODULE moduleMesh2DCyl
|
||||||
|
|
||||||
END SUBROUTINE volumeTria
|
END SUBROUTINE volumeTria
|
||||||
|
|
||||||
!COMMON FUNCTIONS FOR CYLINDRICAL VOLUME ELEMENTS
|
!COMMON FUNCTIONS FOR CYLINDRICAL CELL ELEMENTS
|
||||||
!Compute element Jacobian determinant
|
!Compute element Jacobian determinant
|
||||||
PURE FUNCTION detJ2DCyl(pDer) RESULT(dJ)
|
PURE FUNCTION detJ2DCyl(pDer) RESULT(dJ)
|
||||||
IMPLICIT NONE
|
IMPLICIT NONE
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ MODULE moduleMesh3DCart
|
||||||
PROCEDURE, PASS:: intersection => intersection3DCartTria
|
PROCEDURE, PASS:: intersection => intersection3DCartTria
|
||||||
PROCEDURE, PASS:: randPos => randPosEdgeTria
|
PROCEDURE, PASS:: randPos => randPosEdgeTria
|
||||||
!PARTICULAR PROCEDURES
|
!PARTICULAR PROCEDURES
|
||||||
PROCEDURE, NOPASS, PRIVATE:: fPsi => fPsiEdgeTria
|
PROCEDURE, NOPASS:: fPsi => fPsiTria
|
||||||
|
|
||||||
END TYPE meshEdge3DCartTria
|
END TYPE meshEdge3DCartTria
|
||||||
|
|
||||||
|
|
@ -204,7 +204,7 @@ MODULE moduleMesh3DCart
|
||||||
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, 3)
|
||||||
r = (/DOT_PRODUCT(fPsi, self%x), &
|
r = (/DOT_PRODUCT(fPsi, self%x), &
|
||||||
DOT_PRODUCT(fPsi, self%y), &
|
DOT_PRODUCT(fPsi, self%y), &
|
||||||
DOT_PRODUCT(fPsi, self%z)/)
|
DOT_PRODUCT(fPsi, self%z)/)
|
||||||
|
|
@ -212,17 +212,18 @@ MODULE moduleMesh3DCart
|
||||||
END FUNCTION randPosEdgeTria
|
END FUNCTION randPosEdgeTria
|
||||||
|
|
||||||
!Shape functions for triangular surface
|
!Shape functions for triangular surface
|
||||||
PURE FUNCTION fPsiEdgeTria(Xi) RESULT(fPsi)
|
PURE FUNCTION fPsiTria(Xi, nNodes) RESULT(fPsi)
|
||||||
IMPLICIT NONE
|
IMPLICIT NONE
|
||||||
|
|
||||||
REAL(8), INTENT(in):: Xi(1:3)
|
REAL(8), INTENT(in):: Xi(1:3)
|
||||||
REAL(8):: fPsi(1:3)
|
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)
|
||||||
fPsi(3) = Xi(2)
|
fPsi(3) = Xi(2)
|
||||||
|
|
||||||
END FUNCTION fPsiEdgeTria
|
END FUNCTION fPsiTria
|
||||||
|
|
||||||
!VOLUME FUNCTIONS
|
!VOLUME FUNCTIONS
|
||||||
!TETRA FUNCTIONS
|
!TETRA FUNCTIONS
|
||||||
|
|
|
||||||
|
|
@ -97,6 +97,10 @@ MODULE moduleMesh
|
||||||
PROCEDURE(getNodesEdge_interface), DEFERRED, PASS:: getNodes
|
PROCEDURE(getNodesEdge_interface), DEFERRED, PASS:: getNodes
|
||||||
PROCEDURE(intersectionEdge_interface), DEFERRED, PASS:: intersection
|
PROCEDURE(intersectionEdge_interface), DEFERRED, PASS:: intersection
|
||||||
PROCEDURE(randPosEdge_interface), DEFERRED, PASS:: randPos
|
PROCEDURE(randPosEdge_interface), DEFERRED, PASS:: randPos
|
||||||
|
PROCEDURE(fPsi_interface), DEFERRED, NOPASS:: fPsi
|
||||||
|
!Gather value and spatial derivative on the nodes at position Xi
|
||||||
|
PROCEDURE, PASS, PRIVATE:: gatherF_edge_scalar
|
||||||
|
GENERIC:: gatherF => gatherF_edge_scalar
|
||||||
|
|
||||||
END TYPE meshEdge
|
END TYPE meshEdge
|
||||||
|
|
||||||
|
|
@ -561,6 +565,22 @@ MODULE moduleMesh
|
||||||
|
|
||||||
END FUNCTION gatherF_cell_scalar
|
END FUNCTION gatherF_cell_scalar
|
||||||
|
|
||||||
|
! Gather the value of valNodes at position Xi of an edge
|
||||||
|
pure function gatherF_edge_scalar(self, Xi, nNodes, valNodes) RESULT(f)
|
||||||
|
implicit none
|
||||||
|
|
||||||
|
class(meshEdge), intent(in):: self
|
||||||
|
real(8), intent(in):: Xi(1:3)
|
||||||
|
integer, intent(in):: nNodes
|
||||||
|
real(8), intent(in):: valNodes(1:nNodes)
|
||||||
|
real(8):: f
|
||||||
|
real(8):: fPsi(1:nNodes)
|
||||||
|
|
||||||
|
fPsi = self%fPsi(Xi, nNodes)
|
||||||
|
f = dot_product(fPsi, valNodes)
|
||||||
|
|
||||||
|
end function gatherF_edge_scalar
|
||||||
|
|
||||||
!Gather the value of valNodes (array) at position Xi
|
!Gather the value of valNodes (array) at position Xi
|
||||||
PURE FUNCTION gatherF_cell_array(self, Xi, nNodes, valNodes) RESULT(f)
|
PURE FUNCTION gatherF_cell_array(self, Xi, nNodes, valNodes) RESULT(f)
|
||||||
IMPLICIT NONE
|
IMPLICIT NONE
|
||||||
|
|
|
||||||
|
|
@ -223,12 +223,19 @@ MODULE moduleMeshBoundary
|
||||||
|
|
||||||
class(meshEdge), intent(inout):: edge
|
class(meshEdge), intent(inout):: edge
|
||||||
class(particle), intent(inout):: part
|
class(particle), intent(inout):: part
|
||||||
|
real(8), allocatable:: density(:)
|
||||||
|
integer:: nNodes
|
||||||
|
integer, allocatable:: nodes(:)
|
||||||
|
|
||||||
|
|
||||||
select type(bound => edge%boundary%bTypes(part%species%n)%obj)
|
select type(bound => edge%boundary%bTypes(part%species%n)%obj)
|
||||||
type is(boundaryQuasiNeutrality)
|
type is(boundaryQuasiNeutrality)
|
||||||
|
nNodes = edge%nNodes
|
||||||
|
nodes = edge%getNodes(nNodes)
|
||||||
|
|
||||||
bound%alpha = 1.0d-1
|
bound%alpha = 1.0d-1
|
||||||
|
|
||||||
if (random() < bound%alpha) then
|
if (random() <= bound%alpha) then
|
||||||
call reflection(edge, part)
|
call reflection(edge, part)
|
||||||
|
|
||||||
else
|
else
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue