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:
Jorge Gonzalez 2026-02-05 15:30:50 +01:00
commit fbbb0d5d13
7 changed files with 114 additions and 28 deletions

View file

@ -27,10 +27,11 @@ MODULE moduleMesh1DCart
CLASS(meshNode), POINTER:: n1 => NULL() CLASS(meshNode), POINTER:: n1 => NULL()
CONTAINS CONTAINS
!meshEdge DEFERRED PROCEDURES !meshEdge DEFERRED PROCEDURES
PROCEDURE, PASS:: init => initEdge1DCart PROCEDURE, PASS:: init => initEdge1DCart
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

View file

@ -27,10 +27,11 @@ MODULE moduleMesh1DRad
CLASS(meshNode), POINTER:: n1 => NULL() CLASS(meshNode), POINTER:: n1 => NULL()
CONTAINS CONTAINS
!meshEdge DEFERRED PROCEDURES !meshEdge DEFERRED PROCEDURES
PROCEDURE, PASS:: init => initEdge1DRad PROCEDURE, PASS:: init => initEdge1DRad
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

View file

@ -32,10 +32,11 @@ MODULE moduleMesh2DCart
CLASS(meshNode), POINTER:: n1 => NULL(), n2 => NULL() CLASS(meshNode), POINTER:: n1 => NULL(), n2 => NULL()
CONTAINS CONTAINS
!meshEdge DEFERRED PROCEDURES !meshEdge DEFERRED PROCEDURES
PROCEDURE, PASS:: init => initEdge2DCart PROCEDURE, PASS:: init => initEdge2DCart
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

View file

@ -32,10 +32,11 @@ MODULE moduleMesh2DCyl
CLASS(meshNode), POINTER:: n1 => NULL(), n2 => NULL() CLASS(meshNode), POINTER:: n1 => NULL(), n2 => NULL()
CONTAINS CONTAINS
!meshEdge DEFERRED PROCEDURES !meshEdge DEFERRED PROCEDURES
PROCEDURE, PASS:: init => initEdge2DCyl PROCEDURE, PASS:: init => initEdge2DCyl
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

View file

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

View file

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

View file

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