First step of performance improvement

Finalysing first step of performance improvement focusing on reducing
iteration CPU time by improving calculation of basic element functions,
which took a lot of the CPU time
This commit is contained in:
Jorge Gonzalez 2023-01-06 21:02:54 +01:00
commit 746c5bea09
13 changed files with 260 additions and 252 deletions

View file

@ -6,7 +6,8 @@ MODULE moduleConstParam
REAL(8), PARAMETER:: PI = 4.D0*DATAN(1.D0) !number pi REAL(8), PARAMETER:: PI = 4.D0*DATAN(1.D0) !number pi
REAL(8), PARAMETER:: PI2 = 2.D0*PI !2*pi REAL(8), PARAMETER:: PI2 = 2.D0*PI !2*pi
REAL(8), PARAMETER:: PI8 = 8.D0*PI !2*pi REAL(8), PARAMETER:: PI4 = 4.D0*PI !4*pi
REAL(8), PARAMETER:: PI8 = 8.D0*PI !8*pi
REAL(8), PARAMETER:: sccm2atomPerS = 4.5D17 !sccm to atom s^-1 REAL(8), PARAMETER:: sccm2atomPerS = 4.5D17 !sccm to atom s^-1
REAL(8), PARAMETER:: qe = 1.60217662D-19 !Elementary charge REAL(8), PARAMETER:: qe = 1.60217662D-19 !Elementary charge
REAL(8), PARAMETER:: kb = 1.38064852D-23 !Boltzmann constants SI REAL(8), PARAMETER:: kb = 1.38064852D-23 !Boltzmann constants SI

View file

@ -354,7 +354,7 @@ MODULE moduleInput
CALL config%get(object // '.file', spFile, found) CALL config%get(object // '.file', spFile, found)
!Reads node values at the nodes !Reads node values at the nodes
filename = path // spFile filename = path // spFile
CALL mesh%readInitial(sp, filename, density, velocity, temperature) CALL mesh%readInitial(filename, density, velocity, temperature)
!For each volume in the node, create corresponding particles !For each volume in the node, create corresponding particles
DO e = 1, mesh%numCells DO e = 1, mesh%numCells
!Scale variables !Scale variables
@ -378,9 +378,9 @@ MODULE moduleInput
ALLOCATE(partNew) ALLOCATE(partNew)
partNew%species => species(sp)%obj partNew%species => species(sp)%obj
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, nNodes) 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)
@ -645,7 +645,7 @@ MODULE moduleInput
INTEGER:: e INTEGER:: e
CLASS(meshCell), POINTER:: vol CLASS(meshCell), POINTER:: vol
!Firstly, checks if the object 'interactions' exists !Firstly, check if the object 'interactions' exists
CALL config%info('interactions', found) CALL config%info('interactions', found)
IF (found) THEN IF (found) THEN
!Checks if MC collisions have been defined !Checks if MC collisions have been defined

View file

@ -41,7 +41,6 @@ MODULE moduleMesh1DCart
CLASS(meshNode), POINTER:: n1 => NULL(), n2 => NULL() CLASS(meshNode), POINTER:: n1 => NULL(), n2 => NULL()
!Connectivity to adjacent elements !Connectivity to adjacent elements
CLASS(meshElement), POINTER:: e1 => NULL(), e2 => NULL() CLASS(meshElement), POINTER:: e1 => NULL(), e2 => NULL()
REAL(8):: arNodes(1:2)
CONTAINS CONTAINS
!meshCell DEFERRED PROCEDURES !meshCell DEFERRED PROCEDURES
PROCEDURE, PASS:: init => initCell1DCartSegm PROCEDURE, PASS:: init => initCell1DCartSegm
@ -60,7 +59,7 @@ MODULE moduleMesh1DCart
PROCEDURE, PASS:: phy2log => phy2logSegm PROCEDURE, PASS:: phy2log => phy2logSegm
PROCEDURE, PASS:: neighbourElement => neighbourElementSegm PROCEDURE, PASS:: neighbourElement => neighbourElementSegm
!PARTICLUAR PROCEDURES !PARTICLUAR PROCEDURES
PROCEDURE, PASS, PRIVATE:: area => areaSegm PROCEDURE, PASS, PRIVATE:: vol => volumeSegm
END TYPE meshCell1DCartSegm END TYPE meshCell1DCartSegm
@ -100,7 +99,7 @@ MODULE moduleMesh1DCart
END FUNCTION getCoord1DCart END FUNCTION getCoord1DCart
!EDGE FUNCTIONS !EDGE FUNCTIONS
!Inits edge element !Init edge element
SUBROUTINE initEdge1DCart(self, n, p, bt, physicalSurface) SUBROUTINE initEdge1DCart(self, n, p, bt, physicalSurface)
USE moduleSpecies USE moduleSpecies
USE moduleBoundary USE moduleBoundary
@ -133,7 +132,7 @@ MODULE moduleMesh1DCart
CALL pointBoundaryFunction(self, s) CALL pointBoundaryFunction(self, s)
END DO END DO
!Physical Surface !Physical Surface
self%physicalSurface = physicalSurface self%physicalSurface = physicalSurface
@ -162,7 +161,7 @@ MODULE moduleMesh1DCart
END FUNCTION intersection1DCart END FUNCTION intersection1DCart
!Calculates a 'random' position in edge !Calculate a 'random' position in edge
FUNCTION randPosEdge(self) RESULT(r) FUNCTION randPosEdge(self) RESULT(r)
CLASS(meshEdge1DCart), INTENT(in):: self CLASS(meshEdge1DCart), INTENT(in):: self
REAL(8):: r(1:3) REAL(8):: r(1:3)
@ -173,7 +172,7 @@ MODULE moduleMesh1DCart
!VOLUME FUNCTIONS !VOLUME FUNCTIONS
!SEGMENT FUNCTIONS !SEGMENT FUNCTIONS
!Init segment element !Init element
SUBROUTINE initCell1DCartSegm(self, n, p, nodes) SUBROUTINE initCell1DCartSegm(self, n, p, nodes)
USE moduleRefParam USE moduleRefParam
IMPLICIT NONE IMPLICIT NONE
@ -194,9 +193,7 @@ MODULE moduleMesh1DCart
self%x = (/ r1(1), r2(1) /) self%x = (/ r1(1), r2(1) /)
!Assign node volume !Assign node volume
CALL self%area() CALL self%vol()
self%n1%v = self%n1%v + self%arNodes(1)
self%n2%v = self%n2%v + self%arNodes(2)
CALL OMP_INIT_LOCK(self%lock) CALL OMP_INIT_LOCK(self%lock)
@ -237,7 +234,7 @@ MODULE moduleMesh1DCart
END FUNCTION randPos1DCartSegm END FUNCTION randPos1DCartSegm
!Computes element functions at point Xi !Compute element functions at point Xi
PURE FUNCTION fPsiSegm(Xi, nNodes) RESULT(fPsi) PURE FUNCTION fPsiSegm(Xi, nNodes) RESULT(fPsi)
IMPLICIT NONE IMPLICIT NONE
@ -317,7 +314,7 @@ MODULE moduleMesh1DCart
END FUNCTION gatherMFSegm END FUNCTION gatherMFSegm
!Computes element local stiffness matrix !Compute element local stiffness matrix
PURE FUNCTION elemKSegm(self, nNodes) RESULT(localK) PURE FUNCTION elemKSegm(self, nNodes) RESULT(localK)
IMPLICIT NONE IMPLICIT NONE
@ -348,7 +345,7 @@ MODULE moduleMesh1DCart
END FUNCTION elemKSegm END FUNCTION elemKSegm
!Computes the local source vector for a force f !Compute the local source vector for a force f
PURE FUNCTION elemFSegm(self, nNodes, source) RESULT(localF) PURE FUNCTION elemFSegm(self, nNodes, source) RESULT(localF)
IMPLICIT NONE IMPLICIT NONE
@ -422,8 +419,8 @@ MODULE moduleMesh1DCart
END SUBROUTINE neighbourElementSegm END SUBROUTINE neighbourElementSegm
!Computes element area !Compute element vol
PURE SUBROUTINE areaSegm(self) PURE SUBROUTINE volumeSegm(self)
IMPLICIT NONE IMPLICIT NONE
CLASS(meshCell1DCartSegm), INTENT(inout):: self CLASS(meshCell1DCartSegm), INTENT(inout):: self
@ -433,22 +430,22 @@ MODULE moduleMesh1DCart
REAL(8):: fPsi(1:2) REAL(8):: fPsi(1:2)
self%volume = 0.D0 self%volume = 0.D0
self%arNodes = 0.D0
!1D 1 point Gauss Quad Integral !1D 1 point Gauss Quad Integral
Xi = 0.D0 Xi = 0.D0
dPsi = self%dPsi(Xi, 2) dPsi = self%dPsi(Xi, 2)
pDer = self%partialDer(2, dPsi) pDer = self%partialDer(2, dPsi)
detJ = self%detJac(pDer) detJ = self%detJac(pDer)
fPsi = self%fPsi(Xi, 2) fPsi = self%fPsi(Xi, 2)
!Computes total volume of the cell !Compute total volume of the cell
self%volume = detJ*2.D0 self%volume = detJ*2.D0
!Computes volume per node !Compute volume per node
self%arNodes = fPsi*self%volume self%n1%v = self%n1%v + fPsi(1)*self%volume
self%n2%v = self%n2%v + fPsi(2)*self%volume
END SUBROUTINE areaSegm END SUBROUTINE volumeSegm
!COMMON FUNCTIONS FOR 1D VOLUME ELEMENTS !COMMON FUNCTIONS FOR 1D VOLUME ELEMENTS
!Computes element Jacobian determinant !Compute element Jacobian determinant
PURE FUNCTION detJ1DCart(pDer) RESULT(dJ) PURE FUNCTION detJ1DCart(pDer) RESULT(dJ)
IMPLICIT NONE IMPLICIT NONE
@ -459,7 +456,7 @@ MODULE moduleMesh1DCart
END FUNCTION detJ1DCart END FUNCTION detJ1DCart
!Computes element Jacobian inverse matrix (without determinant) !Compute element Jacobian inverse matrix (without determinant)
PURE FUNCTION invJ1DCart(pDer) RESULT(invJ) PURE FUNCTION invJ1DCart(pDer) RESULT(invJ)
IMPLICIT NONE IMPLICIT NONE
@ -575,7 +572,7 @@ MODULE moduleMesh1DCart
elemA%e1 => elemB elemA%e1 => elemB
elemB%e2 => elemA elemB%e2 => elemA
!Revers the normal to point inside the domain !Rever the normal to point inside the domain
elemB%normal = - elemB%normal elemB%normal = - elemB%normal
END IF END IF

View file

@ -41,7 +41,6 @@ MODULE moduleMesh1DRad
CLASS(meshNode), POINTER:: n1 => NULL(), n2 => NULL() CLASS(meshNode), POINTER:: n1 => NULL(), n2 => NULL()
!Connectivity to adjacent elements !Connectivity to adjacent elements
CLASS(meshElement), POINTER:: e1 => NULL(), e2 => NULL() CLASS(meshElement), POINTER:: e1 => NULL(), e2 => NULL()
REAL(8):: arNodes(1:2)
CONTAINS CONTAINS
!meshCell DEFERRED PROCEDURES !meshCell DEFERRED PROCEDURES
PROCEDURE, PASS:: init => initCell1DRadSegm PROCEDURE, PASS:: init => initCell1DRadSegm
@ -60,7 +59,7 @@ MODULE moduleMesh1DRad
PROCEDURE, PASS:: phy2log => phy2logSegm PROCEDURE, PASS:: phy2log => phy2logSegm
PROCEDURE, PASS:: neighbourElement => neighbourElementSegm PROCEDURE, PASS:: neighbourElement => neighbourElementSegm
!PARTICLUAR PROCEDURES !PARTICLUAR PROCEDURES
PROCEDURE, PASS, PRIVATE:: area => areaSegm PROCEDURE, PASS, PRIVATE:: vol => volumeSegm
END TYPE meshCell1DRadSegm END TYPE meshCell1DRadSegm
@ -82,7 +81,7 @@ MODULE moduleMesh1DRad
!Node volume, to be determined in mesh !Node volume, to be determined in mesh
self%v = 0.D0 self%v = 0.D0
!Allocates output !Allocate output
ALLOCATE(self%output(1:nSpecies)) ALLOCATE(self%output(1:nSpecies))
CALL OMP_INIT_LOCK(self%lock) CALL OMP_INIT_LOCK(self%lock)
@ -100,7 +99,7 @@ MODULE moduleMesh1DRad
END FUNCTION getCoord1DRad END FUNCTION getCoord1DRad
!EDGE FUNCTIONS !EDGE FUNCTIONS
!Inits edge element !Init edge element
SUBROUTINE initEdge1DRad(self, n, p, bt, physicalSurface) SUBROUTINE initEdge1DRad(self, n, p, bt, physicalSurface)
USE moduleSpecies USE moduleSpecies
USE moduleBoundary USE moduleBoundary
@ -162,7 +161,7 @@ MODULE moduleMesh1DRad
END FUNCTION intersection1DRad END FUNCTION intersection1DRad
!Calculates a 'random' position in edge !Calculate a 'random' position in edge
FUNCTION randPos1DRad(self) RESULT(r) FUNCTION randPos1DRad(self) RESULT(r)
CLASS(meshEdge1DRad), INTENT(in):: self CLASS(meshEdge1DRad), INTENT(in):: self
REAL(8):: r(1:3) REAL(8):: r(1:3)
@ -173,7 +172,7 @@ MODULE moduleMesh1DRad
!VOLUME FUNCTIONS !VOLUME FUNCTIONS
!SEGMENT FUNCTIONS !SEGMENT FUNCTIONS
!Init segment element !Init element
SUBROUTINE initCell1DRadSegm(self, n, p, nodes) SUBROUTINE initCell1DRadSegm(self, n, p, nodes)
USE moduleRefParam USE moduleRefParam
IMPLICIT NONE IMPLICIT NONE
@ -194,9 +193,7 @@ MODULE moduleMesh1DRad
self%r = (/ r1(1), r2(1) /) self%r = (/ r1(1), r2(1) /)
!Assign node volume !Assign node volume
CALL self%area() CALL self%vol()
self%n1%v = self%n1%v + self%arNodes(1)
self%n2%v = self%n2%v + self%arNodes(2)
CALL OMP_INIT_LOCK(self%lock) CALL OMP_INIT_LOCK(self%lock)
@ -237,7 +234,7 @@ MODULE moduleMesh1DRad
END FUNCTION randPos1DRadSegm END FUNCTION randPos1DRadSegm
!Computes element functions at point Xi !Compute element functions at point Xi
PURE FUNCTION fPsiSegm(Xi, nNodes) RESULT(fPsi) PURE FUNCTION fPsiSegm(Xi, nNodes) RESULT(fPsi)
IMPLICIT NONE IMPLICIT NONE
@ -317,7 +314,7 @@ MODULE moduleMesh1DRad
END FUNCTION gatherMFSegm END FUNCTION gatherMFSegm
!Computes element local stiffness matrix !Compute element local stiffness matrix
PURE FUNCTION elemKSegm(self, nNodes) RESULT(localK) PURE FUNCTION elemKSegm(self, nNodes) RESULT(localK)
USE moduleConstParam, ONLY: PI2 USE moduleConstParam, ONLY: PI2
IMPLICIT NONE IMPLICIT NONE
@ -352,7 +349,7 @@ MODULE moduleMesh1DRad
END FUNCTION elemKSegm END FUNCTION elemKSegm
!Computes the local source vector for a force f !Compute the local source vector for a force f
PURE FUNCTION elemFSegm(self, nNodes, source) RESULT(localF) PURE FUNCTION elemFSegm(self, nNodes, source) RESULT(localF)
USE moduleConstParam, ONLY: PI2 USE moduleConstParam, ONLY: PI2
IMPLICIT NONE IMPLICIT NONE
@ -430,9 +427,9 @@ MODULE moduleMesh1DRad
END SUBROUTINE neighbourElementSegm END SUBROUTINE neighbourElementSegm
!Computes element area !Compute element vol
PURE SUBROUTINE areaSegm(self) PURE SUBROUTINE volumeSegm(self)
USE moduleConstParam, ONLY: PI USE moduleConstParam, ONLY: PI4
IMPLICIT NONE IMPLICIT NONE
CLASS(meshCell1DRadSegm), INTENT(inout):: self CLASS(meshCell1DRadSegm), INTENT(inout):: self
@ -443,28 +440,27 @@ MODULE moduleMesh1DRad
REAL(8):: r REAL(8):: r
self%volume = 0.D0 self%volume = 0.D0
self%arNodes = 0.D0
!1D 1 point Gauss Quad Integral !1D 1 point Gauss Quad Integral
Xi = 0.D0 Xi = 0.D0
dPsi = self%dPsi(Xi, 2) dPsi = self%dPsi(Xi, 2)
pDer = self%partialDer(2, dPsi) pDer = self%partialDer(2, dPsi)
detJ = self%detJac(pDer) detJ = self%detJac(pDer)
fPsi = self%fPsi(Xi, 2) fPsi = self%fPsi(Xi, 2)
!Computes total volume of the cell
r = DOT_PRODUCT(fPsi, self%r) r = DOT_PRODUCT(fPsi, self%r)
self%volume = r*detJ*2.D0*PI !2PI !Compute total volume of the cell
!Computes volume per node self%volume = r*detJ*PI4 !2*2PI
!Compute volume per node
Xi = (/-5.D-1, 0.D0, 0.D0/) Xi = (/-5.D-1, 0.D0, 0.D0/)
r = self%gatherF(Xi, 2, self%r) r = self%gatherF(Xi, 2, self%r)
self%arNodes(1) = fPsi(1)*self%volume self%n1%v = self%n1%v + fPsi(1)*r*detJ*PI4
Xi = (/ 5.D-1, 0.D0, 0.D0/) Xi = (/ 5.D-1, 0.D0, 0.D0/)
r = self%gatherF(Xi, 2, self%r) r = self%gatherF(Xi, 2, self%r)
self%arNodes(2) = fPsi(2)*self%volume self%n2%v = self%n2%v + fPsi(2)*r*detJ*PI4
END SUBROUTINE areaSegm END SUBROUTINE volumeSegm
!COMMON FUNCTIONS FOR 1D VOLUME ELEMENTS !COMMON FUNCTIONS FOR 1D VOLUME ELEMENTS
!Computes element Jacobian determinant !Compute element Jacobian determinant
PURE FUNCTION detJ1DRad(pDer) RESULT(dJ) PURE FUNCTION detJ1DRad(pDer) RESULT(dJ)
IMPLICIT NONE IMPLICIT NONE
@ -475,7 +471,7 @@ MODULE moduleMesh1DRad
END FUNCTION detJ1DRad END FUNCTION detJ1DRad
!Computes element Jacobian inverse matrix (without determinant) !Compute element Jacobian inverse matrix (without determinant)
PURE FUNCTION invJ1DRad(pDer) RESULT(invJ) PURE FUNCTION invJ1DRad(pDer) RESULT(invJ)
IMPLICIT NONE IMPLICIT NONE
@ -591,7 +587,7 @@ MODULE moduleMesh1DRad
elemA%e1 => elemB elemA%e1 => elemB
elemB%e2 => elemA elemB%e2 => elemA
!Revers the normal to point inside the domain !Rever the normal to point inside the domain
elemB%normal = - elemB%normal elemB%normal = - elemB%normal
END IF END IF

View file

@ -47,7 +47,6 @@ MODULE moduleMesh2DCart
CLASS(meshNode), POINTER:: n1 => NULL(), n2 => NULL(), n3 => NULL(), n4 => NULL() CLASS(meshNode), POINTER:: n1 => NULL(), n2 => NULL(), n3 => NULL(), n4 => NULL()
!Connectivity to adjacent elements !Connectivity to adjacent elements
CLASS(meshElement), POINTER:: e1 => NULL(), e2 => NULL(), e3 => NULL(), e4 => NULL() CLASS(meshElement), POINTER:: e1 => NULL(), e2 => NULL(), e3 => NULL(), e4 => NULL()
REAL(8):: arNodes(1:4) = 0.D0
CONTAINS CONTAINS
!meshCell DEFERRED PROCEDURES !meshCell DEFERRED PROCEDURES
@ -67,7 +66,7 @@ MODULE moduleMesh2DCart
PROCEDURE, PASS:: phy2log => phy2logQuad PROCEDURE, PASS:: phy2log => phy2logQuad
PROCEDURE, PASS:: neighbourElement => neighbourElementQuad PROCEDURE, PASS:: neighbourElement => neighbourElementQuad
!PARTICLUAR PROCEDURES !PARTICLUAR PROCEDURES
PROCEDURE, PASS, PRIVATE:: area => areaQuad PROCEDURE, PASS, PRIVATE:: vol => volumeQuad
END TYPE meshCell2DCartQuad END TYPE meshCell2DCartQuad
@ -79,7 +78,6 @@ MODULE moduleMesh2DCart
CLASS(meshNode), POINTER:: n1 => NULL(), n2 => NULL(), n3 => NULL() CLASS(meshNode), POINTER:: n1 => NULL(), n2 => NULL(), n3 => NULL()
!Connectivity to adjacent elements !Connectivity to adjacent elements
CLASS(meshElement), POINTER:: e1 => NULL(), e2 => NULL(), e3 => NULL() CLASS(meshElement), POINTER:: e1 => NULL(), e2 => NULL(), e3 => NULL()
REAL(8):: arNodes(1:3) = 0.D0
CONTAINS CONTAINS
!meshCell DEFERRED PROCEDURES !meshCell DEFERRED PROCEDURES
@ -99,7 +97,7 @@ MODULE moduleMesh2DCart
PROCEDURE, PASS:: phy2log => phy2logTria PROCEDURE, PASS:: phy2log => phy2logTria
PROCEDURE, PASS:: neighbourElement => neighbourElementTria PROCEDURE, PASS:: neighbourElement => neighbourElementTria
!PARTICULAR PROCEDURES !PARTICULAR PROCEDURES
PROCEDURE, PASS, PRIVATE:: area => areaTria PROCEDURE, PASS, PRIVATE:: vol => volumeTria
END TYPE meshCell2DCartTria END TYPE meshCell2DCartTria
@ -141,7 +139,7 @@ MODULE moduleMesh2DCart
END FUNCTION getCoord2DCart END FUNCTION getCoord2DCart
!EDGE FUNCTIONS !EDGE FUNCTIONS
!Inits edge element !Init edge element
SUBROUTINE initEdge2DCart(self, n, p, bt, physicalSurface) SUBROUTINE initEdge2DCart(self, n, p, bt, physicalSurface)
USE moduleSpecies USE moduleSpecies
USE moduleBoundary USE moduleBoundary
@ -198,6 +196,7 @@ MODULE moduleMesh2DCart
END FUNCTION getNodes2DCart END FUNCTION getNodes2DCart
!Calculate intersection between position and edge
PURE FUNCTION intersection2DCartEdge(self, r0) RESULT(r) PURE FUNCTION intersection2DCartEdge(self, r0) RESULT(r)
IMPLICIT NONE IMPLICIT NONE
@ -216,7 +215,7 @@ MODULE moduleMesh2DCart
END FUNCTION intersection2DCartEdge END FUNCTION intersection2DCartEdge
!Calculates a random position in edge !Calculate a random position in edge
FUNCTION randPosEdge(self) RESULT(r) FUNCTION randPosEdge(self) RESULT(r)
USE moduleRandom USE moduleRandom
IMPLICIT NONE IMPLICIT NONE
@ -237,7 +236,7 @@ MODULE moduleMesh2DCart
!VOLUME FUNCTIONS !VOLUME FUNCTIONS
!QUAD FUNCTIONS !QUAD FUNCTIONS
!Inits quadrilateral element !Init element
SUBROUTINE initCellQuad2DCart(self, n, p, nodes) SUBROUTINE initCellQuad2DCart(self, n, p, nodes)
USE moduleRefParam USE moduleRefParam
IMPLICIT NONE IMPLICIT NONE
@ -268,11 +267,7 @@ MODULE moduleMesh2DCart
self%y = (/r1(2), r2(2), r3(2), r4(2)/) self%y = (/r1(2), r2(2), r3(2), r4(2)/)
!Assign node volume !Assign node volume
CALL self%area() CALL self%vol()
self%n1%v = self%n1%v + self%arNodes(1)
self%n2%v = self%n2%v + self%arNodes(2)
self%n3%v = self%n3%v + self%arNodes(3)
self%n4%v = self%n4%v + self%arNodes(4)
CALL OMP_INIT_LOCK(self%lock) CALL OMP_INIT_LOCK(self%lock)
@ -303,19 +298,19 @@ MODULE moduleMesh2DCart
REAL(8):: Xi(1:3) REAL(8):: Xi(1:3)
REAL(8):: fPsi(1:4) REAL(8):: fPsi(1:4)
Xi = 0.D0
Xi(1) = random(-1.D0, 1.D0) Xi(1) = random(-1.D0, 1.D0)
Xi(2) = random(-1.D0, 1.D0) Xi(2) = random(-1.D0, 1.D0)
Xi(3) = 0.D0
fPsi = self%fPsi(Xi, 4) fPsi = self%fPsi(Xi, 4)
r = 0.D0
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)
r(3) = 0.D0
END FUNCTION randPosCellQuad END FUNCTION randPosCellQuad
!Computes element functions in point Xi !Compute element functions in point Xi
PURE FUNCTION fPsiQuad(Xi, nNodes) RESULT(fPsi) PURE FUNCTION fPsiQuad(Xi, nNodes) RESULT(fPsi)
IMPLICIT NONE IMPLICIT NONE
@ -323,10 +318,10 @@ MODULE moduleMesh2DCart
INTEGER, INTENT(in):: nNodes INTEGER, INTENT(in):: nNodes
REAL(8):: fPsi(1:nNodes) REAL(8):: fPsi(1:nNodes)
fPsi = (/ (1.D0-Xi(1)) * (1.D0-Xi(2)), & fPsi = (/ (1.D0 - Xi(1)) * (1.D0 - Xi(2)), &
(1.D0+Xi(1)) * (1.D0-Xi(2)), & (1.D0 + Xi(1)) * (1.D0 - Xi(2)), &
(1.D0+Xi(1)) * (1.D0+Xi(2)), & (1.D0 + Xi(1)) * (1.D0 + Xi(2)), &
(1.D0-Xi(1)) * (1.D0+Xi(2)) /) (1.D0 - Xi(1)) * (1.D0 + Xi(2)) /)
fPsi = fPsi * 0.25D0 fPsi = fPsi * 0.25D0
@ -417,7 +412,7 @@ MODULE moduleMesh2DCart
END FUNCTION gatherMFQuad END FUNCTION gatherMFQuad
!Computes element local stiffness matrix !Compute element local stiffness matrix
PURE FUNCTION elemKQuad(self, nNodes) RESULT(localK) PURE FUNCTION elemKQuad(self, nNodes) RESULT(localK)
IMPLICIT NONE IMPLICIT NONE
@ -427,7 +422,6 @@ MODULE moduleMesh2DCart
REAL(8):: Xi(1:3) REAL(8):: Xi(1:3)
REAL(8):: dPsi(1:3, 1:4) REAL(8):: dPsi(1:3, 1:4)
REAL(8):: pDer(1:3, 1:3) REAL(8):: pDer(1:3, 1:3)
REAL(8):: r
REAL(8):: invJ(1:3,1:3), detJ REAL(8):: invJ(1:3,1:3), detJ
INTEGER:: l, m INTEGER:: l, m
@ -478,7 +472,7 @@ MODULE moduleMesh2DCart
pDer = self%partialDer(4, dPsi) pDer = self%partialDer(4, dPsi)
detJ = self%detJac(pDer) detJ = self%detJac(pDer)
fPsi = self%fPsi(Xi, 4) 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
END DO END DO
@ -486,7 +480,7 @@ MODULE moduleMesh2DCart
END FUNCTION elemFQuad END FUNCTION elemFQuad
!Checks if a particle is inside a quad element !Check if Xi is inside the element
PURE FUNCTION insideQuad(Xi) RESULT(ins) PURE FUNCTION insideQuad(Xi) RESULT(ins)
IMPLICIT NONE IMPLICIT NONE
@ -498,7 +492,7 @@ MODULE moduleMesh2DCart
END FUNCTION insideQuad END FUNCTION insideQuad
!Transforms physical coordinates to element coordinates !Transform physical coordinates to element coordinates
PURE FUNCTION phy2logQuad(self,r) RESULT(Xi) PURE FUNCTION phy2logQuad(self,r) RESULT(Xi)
IMPLICIT NONE IMPLICIT NONE
@ -532,7 +526,7 @@ MODULE moduleMesh2DCart
END FUNCTION phy2logQuad END FUNCTION phy2logQuad
!Gets the next element for a logical position Xi !Get the neighbour element for a logical position Xi
SUBROUTINE neighbourElementQuad(self, Xi, neighbourElement) SUBROUTINE neighbourElementQuad(self, Xi, neighbourElement)
IMPLICIT NONE IMPLICIT NONE
@ -544,7 +538,7 @@ MODULE moduleMesh2DCart
XiArray = (/ -Xi(2), Xi(1), Xi(2), -Xi(1) /) XiArray = (/ -Xi(2), Xi(1), Xi(2), -Xi(1) /)
nextInt = MAXLOC(XiArray,1) nextInt = MAXLOC(XiArray,1)
!Selects the higher value of directions and searches in that direction !Select the higher value of directions and searches in that direction
NULLIFY(neighbourElement) NULLIFY(neighbourElement)
SELECT CASE (nextInt) SELECT CASE (nextInt)
CASE (1) CASE (1)
@ -559,8 +553,8 @@ MODULE moduleMesh2DCart
END SUBROUTINE neighbourElementQuad END SUBROUTINE neighbourElementQuad
!Computes element area !Compute element volume
PURE SUBROUTINE areaQuad(self) PURE SUBROUTINE volumeQuad(self)
IMPLICIT NONE IMPLICIT NONE
CLASS(meshCell2DCartQuad), INTENT(inout):: self CLASS(meshCell2DCartQuad), INTENT(inout):: self
@ -570,22 +564,24 @@ MODULE moduleMesh2DCart
REAL(8):: dPsi(1:3, 1:4), pDer(1:3, 1:3) REAL(8):: dPsi(1:3, 1:4), pDer(1:3, 1:3)
self%volume = 0.D0 self%volume = 0.D0
self%arNodes = 0.D0
!2D 1 point Gauss Quad Integral !2D 1 point Gauss Quad Integral
Xi = 0.D0 Xi = 0.D0
dPsi = self%dPsi(Xi, 4) dPsi = self%dPsi(Xi, 4)
pDer = self%partialDer(4, dPsi) pDer = self%partialDer(4, dPsi)
detJ = self%detJac(pDer) detJ = self%detJac(pDer)
fPsi = self%fPsi(Xi, 4) fPsi = self%fPsi(Xi, 4)
!Computes total volume of the cell !Compute total volume of the cell
self%volume = detJ self%volume = detJ*4.D0
!Computes volume per node !Compute volume per node
self%arNodes = fPsi*detJ self%n1%v = self%n1%v + fPsi(1)*self%volume
self%n2%v = self%n2%v + fPsi(2)*self%volume
self%n3%v = self%n3%v + fPsi(3)*self%volume
self%n4%v = self%n4%v + fPsi(4)*self%volume
END SUBROUTINE areaQuad END SUBROUTINE volumeQuad
!TRIA ELEMENT !TRIA FUNCTIONS
!Init tria element !Init element
SUBROUTINE initCellTria2DCart(self, n, p, nodes) SUBROUTINE initCellTria2DCart(self, n, p, nodes)
USE moduleRefParam USE moduleRefParam
IMPLICIT NONE IMPLICIT NONE
@ -613,10 +609,7 @@ MODULE moduleMesh2DCart
self%x = (/r1(1), r2(1), r3(1)/) self%x = (/r1(1), r2(1), r3(1)/)
self%y = (/r1(2), r2(2), r3(2)/) self%y = (/r1(2), r2(2), r3(2)/)
!Assign node volume !Assign node volume
CALL self%area() CALL self%vol()
self%n1%v = self%n1%v + self%arNodes(1)
self%n2%v = self%n2%v + self%arNodes(2)
self%n3%v = self%n3%v + self%arNodes(3)
CALL OMP_INIT_LOCK(self%lock) CALL OMP_INIT_LOCK(self%lock)
@ -625,7 +618,7 @@ MODULE moduleMesh2DCart
END SUBROUTINE initCellTria2DCart END SUBROUTINE initCellTria2DCart
!Gets node indexes from triangular element !Random position in cell
PURE FUNCTION getNodesTria(self, nNodes) RESULT(n) PURE FUNCTION getNodesTria(self, nNodes) RESULT(n)
IMPLICIT NONE IMPLICIT NONE
@ -637,7 +630,7 @@ MODULE moduleMesh2DCart
END FUNCTION getNodesTria END FUNCTION getNodesTria
!Random position in quadrilateral volume !Random position in cell
FUNCTION randPosCellTria(self) RESULT(r) FUNCTION randPosCellTria(self) RESULT(r)
USE moduleRandom USE moduleRandom
IMPLICIT NONE IMPLICIT NONE
@ -659,7 +652,7 @@ MODULE moduleMesh2DCart
END FUNCTION randPosCellTria END FUNCTION randPosCellTria
!Shape functions for triangular element !Compute element functions in point Xi
PURE FUNCTION fPsiTria(Xi, nNodes) RESULT(fPsi) PURE FUNCTION fPsiTria(Xi, nNodes) RESULT(fPsi)
IMPLICIT NONE IMPLICIT NONE
@ -673,7 +666,7 @@ MODULE moduleMesh2DCart
END FUNCTION fPsiTria END FUNCTION fPsiTria
!Derivative element function at coordinates Xi !Compute element derivative functions in point Xi
PURE FUNCTION dPsiTria(Xi, nNodes) RESULT(dPsi) PURE FUNCTION dPsiTria(Xi, nNodes) RESULT(dPsi)
IMPLICIT NONE IMPLICIT NONE
@ -688,6 +681,7 @@ MODULE moduleMesh2DCart
END FUNCTION dPsiTria END FUNCTION dPsiTria
!Compute the derivatives in global coordinates
PURE FUNCTION partialDerTria(self, nNodes, dPsi) RESULT(pDer) PURE FUNCTION partialDerTria(self, nNodes, dPsi) RESULT(pDer)
IMPLICIT NONE IMPLICIT NONE
@ -705,6 +699,7 @@ MODULE moduleMesh2DCart
END FUNCTION partialDerTria END FUNCTION partialDerTria
!Gather electric field at position Xi
PURE FUNCTION gatherEFTria(self, Xi) RESULT(array) PURE FUNCTION gatherEFTria(self, Xi) RESULT(array)
IMPLICIT NONE IMPLICIT NONE
CLASS(meshCell2DCartTria), INTENT(in):: self CLASS(meshCell2DCartTria), INTENT(in):: self
@ -720,6 +715,7 @@ MODULE moduleMesh2DCart
END FUNCTION gatherEFTria END FUNCTION gatherEFTria
!Gather magnetic field at position Xi
PURE FUNCTION gatherMFTria(self, Xi) RESULT(array) PURE FUNCTION gatherMFTria(self, Xi) RESULT(array)
IMPLICIT NONE IMPLICIT NONE
CLASS(meshCell2DCartTria), INTENT(in):: self CLASS(meshCell2DCartTria), INTENT(in):: self
@ -743,7 +739,7 @@ MODULE moduleMesh2DCart
END FUNCTION gatherMFTria END FUNCTION gatherMFTria
!Computes element local stiffness matrix !Compute cell local stiffness matrix
PURE FUNCTION elemKTria(self, nNodes) RESULT(localK) PURE FUNCTION elemKTria(self, nNodes) RESULT(localK)
IMPLICIT NONE IMPLICIT NONE
@ -756,7 +752,8 @@ MODULE moduleMesh2DCart
REAL(8):: invJ(1:3,1:3), detJ REAL(8):: invJ(1:3,1:3), detJ
INTEGER:: l INTEGER:: l
localK=0.D0 localK = 0.D0
Xi=0.D0 Xi=0.D0
!Start 2D Gauss Quad Integral !Start 2D Gauss Quad Integral
DO l=1, 4 DO l=1, 4
@ -772,7 +769,7 @@ MODULE moduleMesh2DCart
END FUNCTION elemKTria END FUNCTION elemKTria
!Computes element local source vector !Compute element local source vector
PURE FUNCTION elemFTria(self, nNodes, source) RESULT(localF) PURE FUNCTION elemFTria(self, nNodes, source) RESULT(localF)
IMPLICIT NONE IMPLICIT NONE
@ -787,22 +784,24 @@ MODULE moduleMesh2DCart
INTEGER:: l INTEGER:: l
localF = 0.D0 localF = 0.D0
Xi = 0.D0
Xi = 0.D0
!Start 2D Gauss Quad Integral !Start 2D Gauss Quad Integral
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, 3) dPsi = self%dPsi(Xi, 3)
pDer = self%partialDer(3, dPsi) pDer = self%partialDer(3, dPsi)
detJ = self%detJac(pDer) detJ = self%detJac(pDer)
fPsi = self%fPsi(Xi, 3) fPsi = self%fPsi(Xi, 3)
f = DOT_PRODUCT(fPsi,source) f = DOT_PRODUCT(fPsi, source)
localF = localF + f*fPsi*wTria(l)*detJ localF = localF + f*fPsi*wTria(l)*detJ
END DO END DO
END FUNCTION elemFTria END FUNCTION elemFTria
!Check if Xi is inside the element
PURE FUNCTION insideTria(Xi) RESULT(ins) PURE FUNCTION insideTria(Xi) RESULT(ins)
IMPLICIT NONE IMPLICIT NONE
@ -815,7 +814,7 @@ MODULE moduleMesh2DCart
END FUNCTION insideTria END FUNCTION insideTria
!Transforms physical coordinates to element coordinates !Transform physical coordinates to element coordinates
PURE FUNCTION phy2logTria(self,r) RESULT(Xi) PURE FUNCTION phy2logTria(self,r) RESULT(Xi)
IMPLICIT NONE IMPLICIT NONE
@ -838,6 +837,7 @@ MODULE moduleMesh2DCart
END FUNCTION phy2logTria END FUNCTION phy2logTria
!Get the neighbour cell for a logical position Xi
SUBROUTINE neighbourElementTria(self, Xi, neighbourElement) SUBROUTINE neighbourElementTria(self, Xi, neighbourElement)
IMPLICIT NONE IMPLICIT NONE
@ -861,8 +861,8 @@ MODULE moduleMesh2DCart
END SUBROUTINE neighbourElementTria END SUBROUTINE neighbourElementTria
!Calculates area for triangular element !Calculate volume for triangular element
PURE SUBROUTINE areaTria(self) PURE SUBROUTINE volumeTria(self)
IMPLICIT NONE IMPLICIT NONE
CLASS(meshCell2DCartTria), INTENT(inout):: self CLASS(meshCell2DCartTria), INTENT(inout):: self
@ -872,22 +872,23 @@ MODULE moduleMesh2DCart
REAL(8):: fPsi(1:3) REAL(8):: fPsi(1:3)
self%volume = 0.D0 self%volume = 0.D0
self%arNodes = 0.D0
!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 /)
dPsi = self%dPsi(Xi, 3) dPsi = self%dPsi(Xi, 3)
pDer = self%partialDer(3, dPsi) pDer = self%partialDer(3, dPsi)
detJ = self%detJac(pDer) detJ = self%detJac(pDer)
fPsi = self%fPsi(Xi, 4) fPsi = self%fPsi(Xi, 3)
!Computes total volume of the cell !Computes total volume of the cell
self%volume = detJ self%volume = detJ
!Computes volume per node !Computes volume per node
self%arNodes = fPsi*detJ self%n1%v = self%n1%v + fPsi(1)*self%volume
self%n2%v = self%n2%v + fPsi(2)*self%volume
self%n3%v = self%n3%v + fPsi(3)*self%volume
END SUBROUTINE areaTria END SUBROUTINE volumeTria
!COMMON FUNCTIONS FOR CARTESIAN VOLUME ELEMENTS IN 2D !COMMON FUNCTIONS FOR CARTESIAN VOLUME ELEMENTS IN 2D
!Computes element Jacobian determinant !Compute element Jacobian determinant
PURE FUNCTION detJ2DCart(pDer) RESULT(dJ) PURE FUNCTION detJ2DCart(pDer) RESULT(dJ)
IMPLICIT NONE IMPLICIT NONE
@ -898,7 +899,7 @@ MODULE moduleMesh2DCart
END FUNCTION detJ2DCart END FUNCTION detJ2DCart
!Computes element Jacobian inverse matrix (without determinant) !Compute element Jacobian inverse matrix (without determinant)
PURE FUNCTION invJ2DCart(pDer) RESULT(invJ) PURE FUNCTION invJ2DCart(pDer) RESULT(invJ)
IMPLICIT NONE IMPLICIT NONE

View file

@ -47,7 +47,6 @@ MODULE moduleMesh2DCyl
CLASS(meshNode), POINTER:: n1 => NULL(), n2 => NULL(), n3 => NULL(), n4 => NULL() CLASS(meshNode), POINTER:: n1 => NULL(), n2 => NULL(), n3 => NULL(), n4 => NULL()
!Connectivity to adjacent elements !Connectivity to adjacent elements
CLASS(meshElement), POINTER:: e1 => NULL(), e2 => NULL(), e3 => NULL(), e4 => NULL() CLASS(meshElement), POINTER:: e1 => NULL(), e2 => NULL(), e3 => NULL(), e4 => NULL()
REAL(8):: arNodes(1:4) = 0.D0
CONTAINS CONTAINS
!meshCell DEFERRED PROCEDURES !meshCell DEFERRED PROCEDURES
@ -67,7 +66,7 @@ MODULE moduleMesh2DCyl
PROCEDURE, PASS:: phy2log => phy2logQuad PROCEDURE, PASS:: phy2log => phy2logQuad
PROCEDURE, PASS:: neighbourElement => neighbourElementQuad PROCEDURE, PASS:: neighbourElement => neighbourElementQuad
!PARTICLUAR PROCEDURES !PARTICLUAR PROCEDURES
PROCEDURE, PASS, PRIVATE:: area => areaQuad PROCEDURE, PASS, PRIVATE:: vol => volumeQuad
END TYPE meshCell2DCylQuad END TYPE meshCell2DCylQuad
@ -79,7 +78,6 @@ MODULE moduleMesh2DCyl
CLASS(meshNode), POINTER:: n1 => NULL(), n2 => NULL(), n3 => NULL() CLASS(meshNode), POINTER:: n1 => NULL(), n2 => NULL(), n3 => NULL()
!Connectivity to adjacent elements !Connectivity to adjacent elements
CLASS(meshElement), POINTER:: e1 => NULL(), e2 => NULL(), e3 => NULL() CLASS(meshElement), POINTER:: e1 => NULL(), e2 => NULL(), e3 => NULL()
REAL(8):: arNodes(1:3) = 0.D0
CONTAINS CONTAINS
!meshCell DEFERRED PROCEDURES !meshCell DEFERRED PROCEDURES
@ -99,13 +97,13 @@ MODULE moduleMesh2DCyl
PROCEDURE, PASS:: phy2log => phy2logTria PROCEDURE, PASS:: phy2log => phy2logTria
PROCEDURE, PASS:: neighbourElement => neighbourElementTria PROCEDURE, PASS:: neighbourElement => neighbourElementTria
!PARTICULAR PROCEDURES !PARTICULAR PROCEDURES
PROCEDURE, PASS, PRIVATE:: area => areaTria PROCEDURE, PASS, PRIVATE:: vol => volumeTria
END TYPE meshCell2DCylTria END TYPE meshCell2DCylTria
CONTAINS CONTAINS
!NODE FUNCTIONS !NODE FUNCTIONS
!Inits node element !Init node element
SUBROUTINE initNode2DCyl(self, n, r) SUBROUTINE initNode2DCyl(self, n, r)
USE moduleSpecies USE moduleSpecies
USE moduleRefParam USE moduleRefParam
@ -141,7 +139,7 @@ MODULE moduleMesh2DCyl
END FUNCTION getCoord2DCyl END FUNCTION getCoord2DCyl
!EDGE FUNCTIONS !EDGE FUNCTIONS
!Inits edge element !Init edge element
SUBROUTINE initEdge2DCyl(self, n, p, bt, physicalSurface) SUBROUTINE initEdge2DCyl(self, n, p, bt, physicalSurface)
USE moduleSpecies USE moduleSpecies
USE moduleBoundary USE moduleBoundary
@ -198,6 +196,7 @@ MODULE moduleMesh2DCyl
END FUNCTION getNodes2DCyl END FUNCTION getNodes2DCyl
!Calculate intersection between position and edge
PURE FUNCTION intersection2DCylEdge(self, r0) RESULT(r) PURE FUNCTION intersection2DCylEdge(self, r0) RESULT(r)
IMPLICIT NONE IMPLICIT NONE
@ -216,15 +215,15 @@ MODULE moduleMesh2DCyl
END FUNCTION intersection2DCylEdge END FUNCTION intersection2DCylEdge
!Calculates a random position in edge !Calculate a random position in edge
FUNCTION randPosEdge(self) RESULT(r) FUNCTION randPosEdge(self) RESULT(r)
USE moduleRandom USE moduleRandom
IMPLICIT NONE IMPLICIT NONE
CLASS(meshEdge2DCyl), INTENT(in):: self CLASS(meshEdge2DCyl), INTENT(in):: self
REAL(8):: rnd REAL(8):: rnd
REAL(8):: dr, dz
REAL(8):: r(1:3) REAL(8):: r(1:3)
REAL(8):: dr, dz
rnd = random() rnd = random()
dr = self%r(2) - self%r(1) dr = self%r(2) - self%r(1)
@ -245,7 +244,7 @@ MODULE moduleMesh2DCyl
!VOLUME FUNCTIONS !VOLUME FUNCTIONS
!QUAD FUNCTIONS !QUAD FUNCTIONS
!Inits quadrilateral element !Init element
SUBROUTINE initCellQuad2DCyl(self, n, p, nodes) SUBROUTINE initCellQuad2DCyl(self, n, p, nodes)
USE moduleRefParam USE moduleRefParam
IMPLICIT NONE IMPLICIT NONE
@ -276,11 +275,7 @@ MODULE moduleMesh2DCyl
self%r = (/r1(2), r2(2), r3(2), r4(2)/) self%r = (/r1(2), r2(2), r3(2), r4(2)/)
!Assign node volume !Assign node volume
CALL self%area() CALL self%vol()
self%n1%v = self%n1%v + self%arNodes(1)
self%n2%v = self%n2%v + self%arNodes(2)
self%n3%v = self%n3%v + self%arNodes(3)
self%n4%v = self%n4%v + self%arNodes(4)
CALL OMP_INIT_LOCK(self%lock) CALL OMP_INIT_LOCK(self%lock)
@ -289,7 +284,7 @@ MODULE moduleMesh2DCyl
END SUBROUTINE initCellQuad2DCyl END SUBROUTINE initCellQuad2DCyl
!Gets nodes from quadrilateral element !Get nodes from quadrilateral element
PURE FUNCTION getNodesQuad(self, nNodes) RESULT(n) PURE FUNCTION getNodesQuad(self, nNodes) RESULT(n)
IMPLICIT NONE IMPLICIT NONE
@ -297,7 +292,7 @@ MODULE moduleMesh2DCyl
INTEGER, INTENT(in):: nNodes INTEGER, INTENT(in):: nNodes
INTEGER:: n(1:nNodes) INTEGER:: n(1:nNodes)
n = (/self%n1%n, self%n2%n, self%n3%n, self%n4%n /) n = (/ self%n1%n, self%n2%n, self%n3%n, self%n4%n /)
END FUNCTION getNodesQuad END FUNCTION getNodesQuad
@ -331,12 +326,12 @@ MODULE moduleMesh2DCyl
INTEGER, INTENT(in):: nNodes INTEGER, INTENT(in):: nNodes
REAL(8):: fPsi(1:nNodes) REAL(8):: fPsi(1:nNodes)
fPsi = (/ (1.D0-Xi(1)) * (1.D0-Xi(2)), & fPsi = (/ (1.D0 - Xi(1)) * (1.D0 - Xi(2)), &
(1.D0+Xi(1)) * (1.D0-Xi(2)), & (1.D0 + Xi(1)) * (1.D0 - Xi(2)), &
(1.D0+Xi(1)) * (1.D0+Xi(2)), & (1.D0 + Xi(1)) * (1.D0 + Xi(2)), &
(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
@ -350,15 +345,15 @@ MODULE moduleMesh2DCyl
dPsi = 0.D0 dPsi = 0.D0
dPsi(1,:) = (/ -(1.D0 - Xi(2)), & dPsi(1, 1:4) = (/ -(1.D0 - Xi(2)), &
(1.D0 - Xi(2)), & (1.D0 - Xi(2)), &
(1.D0 + Xi(2)), & (1.D0 + Xi(2)), &
-(1.D0 + Xi(2)) /) -(1.D0 + Xi(2)) /)
dPsi(2,:) = (/ -(1.D0 - Xi(1)), & dPsi(2, 1:4) = (/ -(1.D0 - Xi(1)), &
-(1.D0 + Xi(1)), & -(1.D0 + Xi(1)), &
(1.D0 + Xi(1)), & (1.D0 + Xi(1)), &
(1.D0 - Xi(1)) /) (1.D0 - Xi(1)) /)
dPsi = dPsi * 0.25D0 dPsi = dPsi * 0.25D0
@ -379,6 +374,7 @@ MODULE moduleMesh2DCyl
DOT_PRODUCT(dPsi(2,1:4),self%z(1:4)) /) DOT_PRODUCT(dPsi(2,1:4),self%z(1:4)) /)
pDer(2, 1:2) = (/ DOT_PRODUCT(dPsi(1,1:4),self%r(1:4)), & pDer(2, 1:2) = (/ DOT_PRODUCT(dPsi(1,1:4),self%r(1:4)), &
DOT_PRODUCT(dPsi(2,1:4),self%r(1:4)) /) DOT_PRODUCT(dPsi(2,1:4),self%r(1:4)) /)
pDer(3,3) = 1.D0
END FUNCTION partialDerQuad END FUNCTION partialDerQuad
@ -439,10 +435,11 @@ MODULE moduleMesh2DCyl
REAL(8):: invJ(1:3,1:3), detJ REAL(8):: invJ(1:3,1:3), detJ
INTEGER:: l, m INTEGER:: l, m
localK=0.D0 localK = 0.D0
Xi=0.D0
Xi = 0.D0
!Start 2D Gauss Quad Integral !Start 2D Gauss Quad Integral
DO l=1, 3 DO l = 1, 3
Xi(2) = corQuad(l) Xi(2) = corQuad(l)
DO m = 1, 3 DO m = 1, 3
Xi(1) = corQuad(m) Xi(1) = corQuad(m)
@ -479,8 +476,9 @@ MODULE moduleMesh2DCyl
INTEGER:: l, m INTEGER:: l, m
localF = 0.D0 localF = 0.D0
Xi = 0.D0
DO l=1, 3 Xi = 0.D0
DO l = 1, 3
Xi(1) = corQuad(l) Xi(1) = corQuad(l)
DO m = 1, 3 DO m = 1, 3
Xi(2) = corQuad(m) Xi(2) = corQuad(m)
@ -489,7 +487,7 @@ MODULE moduleMesh2DCyl
detJ = self%detJac(pDer) detJ = self%detJac(pDer)
fPsi = self%fPsi(Xi, 4) 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
END DO END DO
@ -498,7 +496,7 @@ MODULE moduleMesh2DCyl
END FUNCTION elemFQuad END FUNCTION elemFQuad
!Checks if a particle is inside a quad element !Checks if Xi is inside the element
PURE FUNCTION insideQuad(Xi) RESULT(ins) PURE FUNCTION insideQuad(Xi) RESULT(ins)
IMPLICIT NONE IMPLICIT NONE
@ -510,7 +508,7 @@ MODULE moduleMesh2DCyl
END FUNCTION insideQuad END FUNCTION insideQuad
!Transforms physical coordinates to element coordinates !Transform physical coordinates to element coordinates
PURE FUNCTION phy2logQuad(self,r) RESULT(Xi) PURE FUNCTION phy2logQuad(self,r) RESULT(Xi)
IMPLICIT NONE IMPLICIT NONE
@ -544,7 +542,7 @@ MODULE moduleMesh2DCyl
END FUNCTION phy2logQuad END FUNCTION phy2logQuad
!Get the next element for a logical position Xi !Get the neighbour element for a logical position Xi
SUBROUTINE neighbourElementQuad(self, Xi, neighbourElement) SUBROUTINE neighbourElementQuad(self, Xi, neighbourElement)
IMPLICIT NONE IMPLICIT NONE
@ -571,8 +569,8 @@ MODULE moduleMesh2DCyl
END SUBROUTINE neighbourElementQuad END SUBROUTINE neighbourElementQuad
!Computes element area !Compute element volume
PURE SUBROUTINE areaQuad(self) PURE SUBROUTINE volumeQuad(self)
USE moduleConstParam, ONLY: PI8 USE moduleConstParam, ONLY: PI8
IMPLICIT NONE IMPLICIT NONE
@ -584,34 +582,33 @@ MODULE moduleMesh2DCyl
REAL(8):: dPsi(1:3, 1:4), pDer(1:3, 1:3) REAL(8):: dPsi(1:3, 1:4), pDer(1:3, 1:3)
self%volume = 0.D0 self%volume = 0.D0
self%arNodes = 0.D0
!2D 1 point Gauss Quad Integral !2D 1 point Gauss Quad Integral
Xi = 0.D0 Xi = 0.D0
dPsi = self%dPsi(Xi, 4) dPsi = self%dPsi(Xi, 4)
pDer = self%partialDer(4, dPsi) pDer = self%partialDer(4, dPsi)
detJ = self%detJac(pDer) detJ = self%detJac(pDer)
fPsi = self%fPsi(Xi, 4) fPsi = self%fPsi(Xi, 4)
!Computes total volume of the cell
r = DOT_PRODUCT(fPsi,self%r) r = DOT_PRODUCT(fPsi,self%r)
!Computes total volume of the cell
self%volume = r*detJ*PI8 !4*2*pi self%volume = r*detJ*PI8 !4*2*pi
!Computes volume per node !Computes volume per node
Xi = (/-5.D-1, -5.D-1, 0.D0/) Xi = (/-5.D-1, -5.D-1, 0.D0/)
r = self%gatherF(Xi, 4, self%r) r = self%gatherF(Xi, 4, self%r)
self%arNodes(1) = fPsi(1)*self%volume self%n1%v = self%n1%v + fPsi(1)*r*detJ*PI8
Xi = (/ 5.D-1, -5.D-1, 0.D0/) Xi = (/ 5.D-1, -5.D-1, 0.D0/)
r = self%gatherF(Xi, 4, self%r) r = self%gatherF(Xi, 4, self%r)
self%arNodes(2) = fPsi(2)*self%volume self%n2%v = self%n2%v + fPsi(2)*r*detJ*PI8
Xi = (/ 5.D-1, 5.D-1, 0.D0/) Xi = (/ 5.D-1, 5.D-1, 0.D0/)
r = self%gatherF(Xi, 4, self%r) r = self%gatherF(Xi, 4, self%r)
self%arNodes(3) = fPsi(3)*self%volume self%n3%v = self%n3%v + fPsi(3)*r*detJ*PI8
Xi = (/-5.D-1, 5.D-1, 0.D0/) Xi = (/-5.D-1, 5.D-1, 0.D0/)
r = self%gatherF(Xi, 4, self%r) r = self%gatherF(Xi, 4, self%r)
self%arNodes(4) = fPsi(4)*self%volume self%n4%v = self%n4%v + fPsi(4)*r*detJ*PI8
END SUBROUTINE areaQuad END SUBROUTINE volumeQuad
!TRIA ELEMENT !TRIA FUNCTIONS
!Init tria element !Init element
SUBROUTINE initCellTria2DCyl(self, n, p, nodes) SUBROUTINE initCellTria2DCyl(self, n, p, nodes)
USE moduleRefParam USE moduleRefParam
IMPLICIT NONE IMPLICIT NONE
@ -639,10 +636,7 @@ MODULE moduleMesh2DCyl
self%z = (/r1(1), r2(1), r3(1)/) self%z = (/r1(1), r2(1), r3(1)/)
self%r = (/r1(2), r2(2), r3(2)/) self%r = (/r1(2), r2(2), r3(2)/)
!Assign node volume !Assign node volume
CALL self%area() CALL self%vol()
self%n1%v = self%n1%v + self%arNodes(1)
self%n2%v = self%n2%v + self%arNodes(2)
self%n3%v = self%n3%v + self%arNodes(3)
CALL OMP_INIT_LOCK(self%lock) CALL OMP_INIT_LOCK(self%lock)
@ -651,7 +645,7 @@ MODULE moduleMesh2DCyl
END SUBROUTINE initCellTria2DCyl END SUBROUTINE initCellTria2DCyl
!Gets node indexes from triangular element !Random position in cell
PURE FUNCTION getNodesTria(self, nNodes) RESULT(n) PURE FUNCTION getNodesTria(self, nNodes) RESULT(n)
IMPLICIT NONE IMPLICIT NONE
@ -663,7 +657,7 @@ MODULE moduleMesh2DCyl
END FUNCTION getNodesTria END FUNCTION getNodesTria
!Random position in quadrilateral volume !Random position in cell
FUNCTION randPosCellTria(self) RESULT(r) FUNCTION randPosCellTria(self) RESULT(r)
USE moduleRandom USE moduleRandom
IMPLICIT NONE IMPLICIT NONE
@ -685,7 +679,7 @@ MODULE moduleMesh2DCyl
END FUNCTION randPosCellTria END FUNCTION randPosCellTria
!Shape functions for triangular element !Compute element functions in point Xi
PURE FUNCTION fPsiTria(Xi, nNodes) RESULT(fPsi) PURE FUNCTION fPsiTria(Xi, nNodes) RESULT(fPsi)
IMPLICIT NONE IMPLICIT NONE
@ -699,7 +693,7 @@ MODULE moduleMesh2DCyl
END FUNCTION fPsiTria END FUNCTION fPsiTria
!Derivative element function at coordinates Xi !Compute element derivative functions in point Xi
PURE FUNCTION dPsiTria(Xi, nNodes) RESULT(dPsi) PURE FUNCTION dPsiTria(Xi, nNodes) RESULT(dPsi)
IMPLICIT NONE IMPLICIT NONE
@ -714,6 +708,7 @@ MODULE moduleMesh2DCyl
END FUNCTION dPsiTria END FUNCTION dPsiTria
!Compute the derivatives in global coordinates
PURE FUNCTION partialDerTria(self, nNodes, dPsi) RESULT(pDer) PURE FUNCTION partialDerTria(self, nNodes, dPsi) RESULT(pDer)
IMPLICIT NONE IMPLICIT NONE
@ -731,6 +726,7 @@ MODULE moduleMesh2DCyl
END FUNCTION partialDerTria END FUNCTION partialDerTria
!Gather electric field at position Xi
PURE FUNCTION gatherEFTria(self, Xi) RESULT(array) PURE FUNCTION gatherEFTria(self, Xi) RESULT(array)
IMPLICIT NONE IMPLICIT NONE
CLASS(meshCell2DCylTria), INTENT(in):: self CLASS(meshCell2DCylTria), INTENT(in):: self
@ -746,6 +742,7 @@ MODULE moduleMesh2DCyl
END FUNCTION gatherEFTria END FUNCTION gatherEFTria
!Gather magnetic field at position Xi
PURE FUNCTION gatherMFTria(self, Xi) RESULT(array) PURE FUNCTION gatherMFTria(self, Xi) RESULT(array)
IMPLICIT NONE IMPLICIT NONE
CLASS(meshCell2DCylTria), INTENT(in):: self CLASS(meshCell2DCylTria), INTENT(in):: self
@ -769,7 +766,7 @@ MODULE moduleMesh2DCyl
END FUNCTION gatherMFTria END FUNCTION gatherMFTria
!Computes element local stiffness matrix !Compute cell local stiffness matrix
PURE FUNCTION elemKTria(self, nNodes) RESULT(localK) PURE FUNCTION elemKTria(self, nNodes) RESULT(localK)
USE moduleConstParam, ONLY: PI2 USE moduleConstParam, ONLY: PI2
IMPLICIT NONE IMPLICIT NONE
@ -784,7 +781,8 @@ MODULE moduleMesh2DCyl
REAL(8):: invJ(1:3,1:3), detJ REAL(8):: invJ(1:3,1:3), detJ
INTEGER:: l INTEGER:: l
localK=0.D0 localK = 0.D0
Xi=0.D0 Xi=0.D0
!Start 2D Gauss Quad Integral !Start 2D Gauss Quad Integral
DO l=1, 4 DO l=1, 4
@ -802,7 +800,7 @@ MODULE moduleMesh2DCyl
END FUNCTION elemKTria END FUNCTION elemKTria
!Computes element local source vector !Compute element local source vector
PURE FUNCTION elemFTria(self, nNodes, source) RESULT(localF) PURE FUNCTION elemFTria(self, nNodes, source) RESULT(localF)
USE moduleConstParam, ONLY: PI2 USE moduleConstParam, ONLY: PI2
IMPLICIT NONE IMPLICIT NONE
@ -838,6 +836,7 @@ MODULE moduleMesh2DCyl
END FUNCTION elemFTria END FUNCTION elemFTria
!Check if Xi is inside the element
PURE FUNCTION insideTria(Xi) RESULT(ins) PURE FUNCTION insideTria(Xi) RESULT(ins)
IMPLICIT NONE IMPLICIT NONE
@ -850,7 +849,7 @@ MODULE moduleMesh2DCyl
END FUNCTION insideTria END FUNCTION insideTria
!Transforms physical coordinates to element coordinates !Transform physical coordinates to element coordinates
PURE FUNCTION phy2logTria(self,r) RESULT(Xi) PURE FUNCTION phy2logTria(self,r) RESULT(Xi)
IMPLICIT NONE IMPLICIT NONE
@ -873,6 +872,7 @@ MODULE moduleMesh2DCyl
END FUNCTION phy2logTria END FUNCTION phy2logTria
!Get the neighbour cell for a logical position Xi
SUBROUTINE neighbourElementTria(self, Xi, neighbourElement) SUBROUTINE neighbourElementTria(self, Xi, neighbourElement)
IMPLICIT NONE IMPLICIT NONE
@ -896,8 +896,8 @@ MODULE moduleMesh2DCyl
END SUBROUTINE neighbourElementTria END SUBROUTINE neighbourElementTria
!Calculates area for triangular element !Calculate volume for triangular element
PURE SUBROUTINE areaTria(self) PURE SUBROUTINE volumeTria(self)
USE moduleConstParam, ONLY: PI USE moduleConstParam, ONLY: PI
IMPLICIT NONE IMPLICIT NONE
@ -909,23 +909,24 @@ MODULE moduleMesh2DCyl
REAL(8):: r REAL(8):: r
self%volume = 0.D0 self%volume = 0.D0
self%arNodes = 0.D0
!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 /)
dPsi = self%dPsi(Xi, 3) dPsi = self%dPsi(Xi, 3)
pDer = self%partialDer(3, dPsi) pDer = self%partialDer(3, dPsi)
detJ = self%detJac(pDer) detJ = self%detJac(pDer)
fPsi = self%fPsi(Xi, 3) fPsi = self%fPsi(Xi, 3)
!Computes total volume of the cell
r = DOT_PRODUCT(fPsi, self%r) r = DOT_PRODUCT(fPsi, self%r)
!Computes total volume of the cell
self%volume = r*detJ*PI !2PI*1/2 self%volume = r*detJ*PI !2PI*1/2
!Computes volume per node !Computes volume per node
self%arNodes = fPsi*self%volume self%n1%v = self%n1%v + fPsi(1)*self%volume
self%n2%v = self%n2%v + fPsi(2)*self%volume
self%n3%v = self%n3%v + fPsi(3)*self%volume
END SUBROUTINE areaTria END SUBROUTINE volumeTria
!COMMON FUNCTIONS FOR CYLINDRICAL VOLUME ELEMENTS !COMMON FUNCTIONS FOR CYLINDRICAL VOLUME ELEMENTS
!Computes element Jacobian determinant !Compute element Jacobian determinant
PURE FUNCTION detJ2DCyl(pDer) RESULT(dJ) PURE FUNCTION detJ2DCyl(pDer) RESULT(dJ)
IMPLICIT NONE IMPLICIT NONE
@ -936,7 +937,7 @@ MODULE moduleMesh2DCyl
END FUNCTION detJ2DCyl END FUNCTION detJ2DCyl
!Computes element Jacobian inverse matrix (without determinant) !Compute element Jacobian inverse matrix (without determinant)
PURE FUNCTION invJ2DCyl(pDer) RESULT(invJ) PURE FUNCTION invJ2DCyl(pDer) RESULT(invJ)
IMPLICIT NONE IMPLICIT NONE

View file

@ -60,13 +60,13 @@ MODULE moduleMesh3DCart
PROCEDURE, PASS:: phy2log => phy2logTetra PROCEDURE, PASS:: phy2log => phy2logTetra
PROCEDURE, PASS:: neighbourElement => neighbourElementTetra PROCEDURE, PASS:: neighbourElement => neighbourElementTetra
!PARTICULAR PROCEDURES !PARTICULAR PROCEDURES
PROCEDURE, PASS, PRIVATE:: calcVol => volumeTetra PROCEDURE, PASS, PRIVATE:: vol => volumeTetra
END TYPE meshCell3DCartTetra END TYPE meshCell3DCartTetra
CONTAINS CONTAINS
!NODE FUNCTIONS !NODE FUNCTIONS
!Inits node element !Init node element
SUBROUTINE initNode3DCart(self, n, r) SUBROUTINE initNode3DCart(self, n, r)
USE moduleSpecies USE moduleSpecies
USE moduleRefParam USE moduleRefParam
@ -102,8 +102,8 @@ MODULE moduleMesh3DCart
END FUNCTION getCoord3DCart END FUNCTION getCoord3DCart
!SURFACE FUNCTIONS !EDGE FUNCTIONS
!Inits surface element !Init surface element
SUBROUTINE initEdge3DCartTria(self, n, p, bt, physicalSurface) SUBROUTINE initEdge3DCartTria(self, n, p, bt, physicalSurface)
USE moduleSpecies USE moduleSpecies
USE moduleBoundary USE moduleBoundary
@ -168,6 +168,7 @@ MODULE moduleMesh3DCart
END FUNCTION getNodes3DCartTria END FUNCTION getNodes3DCartTria
!Calculate intersection between position and edge
PURE FUNCTION intersection3DCartTria(self, r0) RESULT(r) PURE FUNCTION intersection3DCartTria(self, r0) RESULT(r)
IMPLICIT NONE IMPLICIT NONE
@ -186,7 +187,7 @@ MODULE moduleMesh3DCart
END FUNCTION intersection3DCartTria END FUNCTION intersection3DCartTria
!Calculates a random position in the surface !Calculate a random position in the surface
FUNCTION randPosEdgeTria(self) RESULT(r) FUNCTION randPosEdgeTria(self) RESULT(r)
USE moduleRandom USE moduleRandom
IMPLICIT NONE IMPLICIT NONE
@ -222,7 +223,7 @@ MODULE moduleMesh3DCart
!VOLUME FUNCTIONS !VOLUME FUNCTIONS
!TETRA FUNCTIONS !TETRA FUNCTIONS
!Inits tetrahedron element !Init element
SUBROUTINE initCellTetra(self, n, p, nodes) SUBROUTINE initCellTetra(self, n, p, nodes)
USE moduleRefParam USE moduleRefParam
IMPLICIT NONE IMPLICIT NONE
@ -232,11 +233,14 @@ MODULE moduleMesh3DCart
INTEGER, INTENT(in):: p(:) INTEGER, INTENT(in):: p(:)
TYPE(meshNodeCont), INTENT(in), TARGET:: nodes(:) TYPE(meshNodeCont), INTENT(in), TARGET:: nodes(:)
REAL(8), DIMENSION(1:3):: r1, r2, r3, r4 !Positions of each node REAL(8), DIMENSION(1:3):: r1, r2, r3, r4 !Positions of each node
REAL(8):: Xi(1:3), fPsi(1:4)
REAL(8):: volNodes(1:4) !Cellume of each node
!Assign node index
self%n = n self%n = n
!Assign number of nodes of cell
self%nNodes = SIZE(p) self%nNodes = SIZE(p)
!Assign nodes to element
self%n1 => nodes(p(1))%obj self%n1 => nodes(p(1))%obj
self%n2 => nodes(p(2))%obj self%n2 => nodes(p(2))%obj
self%n3 => nodes(p(3))%obj self%n3 => nodes(p(3))%obj
@ -251,16 +255,7 @@ MODULE moduleMesh3DCart
self%z = (/r1(3), r2(3), r3(3), r4(3)/) self%z = (/r1(3), r2(3), r3(3), r4(3)/)
!Computes the element volume !Computes the element volume
CALL self%calcVol() CALL self%vol()
!Assign proportional volume to each node
Xi = (/0.25D0, 0.25D0, 0.25D0/)
fPsi = self%fPsi(Xi, 4)
volNodes = fPsi*self%volume
self%n1%v = self%n1%v + volNodes(1)
self%n2%v = self%n2%v + volNodes(2)
self%n3%v = self%n3%v + volNodes(3)
self%n4%v = self%n4%v + volNodes(4)
CALL OMP_INIT_LOCK(self%lock) CALL OMP_INIT_LOCK(self%lock)
@ -269,6 +264,7 @@ MODULE moduleMesh3DCart
END SUBROUTINE initCellTetra END SUBROUTINE initCellTetra
!Gets node indexes from cell
PURE FUNCTION getNodesTetra(self, nNodes) RESULT(n) PURE FUNCTION getNodesTetra(self, nNodes) RESULT(n)
IMPLICIT NONE IMPLICIT NONE
@ -280,7 +276,7 @@ MODULE moduleMesh3DCart
END FUNCTION getNodesTetra END FUNCTION getNodesTetra
!Random position in volume tetrahedron !Random position in cell
FUNCTION randPosCellTetra(self) RESULT(r) FUNCTION randPosCellTetra(self) RESULT(r)
USE moduleRandom USE moduleRandom
IMPLICIT NONE IMPLICIT NONE
@ -302,7 +298,7 @@ MODULE moduleMesh3DCart
END FUNCTION randPosCellTetra END FUNCTION randPosCellTetra
!Computes element functions in point Xi !Compute element functions in point Xi
PURE FUNCTION fPsiTetra(Xi, nNodes) RESULT(fPsi) PURE FUNCTION fPsiTetra(Xi, nNodes) RESULT(fPsi)
IMPLICIT NONE IMPLICIT NONE
@ -317,7 +313,7 @@ MODULE moduleMesh3DCart
END FUNCTION fPsiTetra END FUNCTION fPsiTetra
!Derivative element function at coordinates Xi !Compute element derivative functions in point Xi
PURE FUNCTION dPsiTetra(Xi, nNodes) RESULT(dPsi) PURE FUNCTION dPsiTetra(Xi, nNodes) RESULT(dPsi)
IMPLICIT NONE IMPLICIT NONE
@ -333,7 +329,7 @@ MODULE moduleMesh3DCart
END FUNCTION dPsiTetra END FUNCTION dPsiTetra
!Computes the derivatives in global coordinates !Compute the derivatives in global coordinates
PURE FUNCTION partialDerTetra(self, nNodes, dPsi) RESULT(pDer) PURE FUNCTION partialDerTetra(self, nNodes, dPsi) RESULT(pDer)
IMPLICIT NONE IMPLICIT NONE
@ -358,6 +354,7 @@ MODULE moduleMesh3DCart
END FUNCTION partialDerTetra END FUNCTION partialDerTetra
!Gather electric field at position Xi
PURE FUNCTION gatherEFTetra(self, Xi) RESULT(array) PURE FUNCTION gatherEFTetra(self, Xi) RESULT(array)
IMPLICIT NONE IMPLICIT NONE
CLASS(meshCell3DCartTetra), INTENT(in):: self CLASS(meshCell3DCartTetra), INTENT(in):: self
@ -374,6 +371,7 @@ MODULE moduleMesh3DCart
END FUNCTION gatherEFTetra END FUNCTION gatherEFTetra
!Gather magnetic field at position Xi
PURE FUNCTION gatherMFTetra(self, Xi) RESULT(array) PURE FUNCTION gatherMFTetra(self, Xi) RESULT(array)
IMPLICIT NONE IMPLICIT NONE
CLASS(meshCell3DCartTetra), INTENT(in):: self CLASS(meshCell3DCartTetra), INTENT(in):: self
@ -400,6 +398,7 @@ MODULE moduleMesh3DCart
END FUNCTION gatherMFTetra END FUNCTION gatherMFTetra
!Compute cell local stiffness matrix
PURE FUNCTION elemKTetra(self, nNodes) RESULT(localK) PURE FUNCTION elemKTetra(self, nNodes) RESULT(localK)
IMPLICIT NONE IMPLICIT NONE
@ -424,6 +423,7 @@ MODULE moduleMesh3DCart
END FUNCTION elemKTetra END FUNCTION elemKTetra
!Compute element local source vector
PURE FUNCTION elemFTetra(self, nNodes, source) RESULT(localF) PURE FUNCTION elemFTetra(self, nNodes, source) RESULT(localF)
IMPLICIT NONE IMPLICIT NONE
@ -448,6 +448,7 @@ MODULE moduleMesh3DCart
END FUNCTION elemFTetra END FUNCTION elemFTetra
!Check if Xi is inside the element
PURE FUNCTION insideTetra(Xi) RESULT(ins) PURE FUNCTION insideTetra(Xi) RESULT(ins)
IMPLICIT NONE IMPLICIT NONE
@ -461,6 +462,7 @@ MODULE moduleMesh3DCart
END FUNCTION insideTetra END FUNCTION insideTetra
!Transform physical coordinates to element coordinates
PURE FUNCTION phy2logTetra(self,r) RESULT(Xi) PURE FUNCTION phy2logTetra(self,r) RESULT(Xi)
IMPLICIT NONE IMPLICIT NONE
@ -472,6 +474,7 @@ MODULE moduleMesh3DCart
REAL(8):: invJ(1:3, 1:3), detJ REAL(8):: invJ(1:3, 1:3), detJ
REAL(8):: deltaR(1:3) REAL(8):: deltaR(1:3)
!Direct method to convert coordinates
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, 4) dPsi = self%dPsi(Xi, 4)
@ -482,6 +485,7 @@ MODULE moduleMesh3DCart
END FUNCTION phy2logTetra END FUNCTION phy2logTetra
!Get the neighbour cell for a logical position Xi
SUBROUTINE neighbourElementTetra(self, Xi, neighbourElement) SUBROUTINE neighbourElementTetra(self, Xi, neighbourElement)
IMPLICIT NONE IMPLICIT NONE
@ -508,25 +512,35 @@ MODULE moduleMesh3DCart
END SUBROUTINE neighbourElementTetra END SUBROUTINE neighbourElementTetra
!Computes the element volume !Calculate volume for triangular element
PURE SUBROUTINE volumeTetra(self) PURE SUBROUTINE volumeTetra(self)
IMPLICIT NONE IMPLICIT NONE
CLASS(meshCell3DCartTetra), INTENT(inout):: self CLASS(meshCell3DCartTetra), INTENT(inout):: self
REAL(8):: Xi(1:3) REAL(8):: Xi(1:3)
REAL(8):: dPsi(1:3, 1:4) REAL(8):: detJ
REAL(8):: pDer(1:3, 1:3) REAL(8):: fPsi(1:4)
REAL(8):: dPsi(1:3, 1:4), pDer(1:3, 1:3)
self%volume = 0.D0 self%volume = 0.D0
!2D 1 point Gauss Quad Integral
Xi = (/0.25D0, 0.25D0, 0.25D0/) Xi = (/0.25D0, 0.25D0, 0.25D0/)
dPsi = self%dPsi(Xi, 4) dPsi = self%dPsi(Xi, 4)
pDer = self%partialDer(4, dPsi) pDer = self%partialDer(4, dPsi)
self%volume = self%detJac(pDer) detJ = self%detJac(pDer)
!Computes total volume of the cell
self%volume = detJ
!Computes volume per node
fPsi = self%fPsi(Xi, 4)
self%n1%v = self%n1%v + fPsi(1)*self%volume
self%n2%v = self%n2%v + fPsi(2)*self%volume
self%n3%v = self%n3%v + fPsi(3)*self%volume
self%n4%v = self%n4%v + fPsi(4)*self%volume
END SUBROUTINE volumeTetra END SUBROUTINE volumeTetra
!COMMON FUNCTIONS FOR CARTESIAN VOLUME ELEMENTS IN 3D !COMMON FUNCTIONS FOR CARTESIAN VOLUME ELEMENTS IN 3D
!Computes element Jacobian determinant !Compute element Jacobian determinant
PURE FUNCTION detJ3DCart(pDer) RESULT(dJ) PURE FUNCTION detJ3DCart(pDer) RESULT(dJ)
IMPLICIT NONE IMPLICIT NONE
@ -539,6 +553,7 @@ MODULE moduleMesh3DCart
END FUNCTION detJ3DCart END FUNCTION detJ3DCart
!Compute element Jacobian inverse matrix (without determinant)
PURE FUNCTION invJ3DCart(pDer) RESULT(invJ) PURE FUNCTION invJ3DCart(pDer) RESULT(invJ)
IMPLICIT NONE IMPLICIT NONE
@ -561,7 +576,37 @@ MODULE moduleMesh3DCart
END FUNCTION invJ3DCart END FUNCTION invJ3DCart
!Selects type of elements to build connection SUBROUTINE connectMesh3DCart(self)
IMPLICIT NONE
CLASS(meshGeneric), INTENT(inout):: self
INTEGER:: e, et
DO e = 1, self%numCells
!Connect Cell-Cell
DO et = 1, self%numCells
IF (e /= et) THEN
CALL connectCellCell(self%cells(e)%obj, self%cells(et)%obj)
END IF
END DO
SELECT TYPE(self)
TYPE IS(meshParticles)
!Connect Cell-Edge
DO et = 1, self%numEdges
CALL connectCellEdge(self%cells(e)%obj, self%edges(et)%obj)
END DO
END SELECT
END DO
END SUBROUTINE connectMesh3DCart
!Select type of elements to build connection
SUBROUTINE connectCellCell(elemA, elemB) SUBROUTINE connectCellCell(elemA, elemB)
IMPLICIT NONE IMPLICIT NONE
@ -601,36 +646,6 @@ MODULE moduleMesh3DCart
END SUBROUTINE connectCellEdge END SUBROUTINE connectCellEdge
SUBROUTINE connectMesh3DCart(self)
IMPLICIT NONE
CLASS(meshGeneric), INTENT(inout):: self
INTEGER:: e, et
DO e = 1, self%numCells
!Connect Cell-Cell
DO et = 1, self%numCells
IF (e /= et) THEN
CALL connectCellCell(self%cells(e)%obj, self%cells(et)%obj)
END IF
END DO
SELECT TYPE(self)
TYPE IS(meshParticles)
!Connect Cell-Edge
DO et = 1, self%numEdges
CALL connectCellEdge(self%cells(e)%obj, self%edges(et)%obj)
END DO
END SELECT
END DO
END SUBROUTINE connectMesh3DCart
!Checks if two sets of nodes are coincidend in any order !Checks if two sets of nodes are coincidend in any order
PURE FUNCTION coincidentNodes(nodesA, nodesB) RESULT(coincident) PURE FUNCTION coincidentNodes(nodesA, nodesB) RESULT(coincident)
IMPLICIT NONE IMPLICIT NONE

View file

@ -64,10 +64,9 @@ MODULE moduleMeshInput0D
END SUBROUTINE read0D END SUBROUTINE read0D
SUBROUTINE readInitial0D(sp, filename, density, velocity, temperature) SUBROUTINE readInitial0D(filename, density, velocity, temperature)
IMPLICIT NONE IMPLICIT NONE
INTEGER, INTENT(in):: sp
CHARACTER(:), ALLOCATABLE, INTENT(in):: filename CHARACTER(:), ALLOCATABLE, INTENT(in):: filename
REAL(8), ALLOCATABLE, INTENT(out), DIMENSION(:):: density REAL(8), ALLOCATABLE, INTENT(out), DIMENSION(:):: density
REAL(8), ALLOCATABLE, INTENT(out), DIMENSION(:,:):: velocity REAL(8), ALLOCATABLE, INTENT(out), DIMENSION(:,:):: velocity

View file

@ -321,10 +321,9 @@ MODULE moduleMeshInputGmsh2
END SUBROUTINE readGmsh2 END SUBROUTINE readGmsh2
!Reads the initial information from an output file for an species !Reads the initial information from an output file for an species
SUBROUTINE readInitialGmsh2(sp, filename, density, velocity, temperature) SUBROUTINE readInitialGmsh2(filename, density, velocity, temperature)
IMPLICIT NONE IMPLICIT NONE
INTEGER, INTENT(in):: sp
CHARACTER(:), ALLOCATABLE, INTENT(in):: filename CHARACTER(:), ALLOCATABLE, INTENT(in):: filename
REAL(8), ALLOCATABLE, INTENT(out), DIMENSION(:):: density REAL(8), ALLOCATABLE, INTENT(out), DIMENSION(:):: density
REAL(8), ALLOCATABLE, INTENT(out), DIMENSION(:,:):: velocity REAL(8), ALLOCATABLE, INTENT(out), DIMENSION(:,:):: velocity

View file

@ -356,8 +356,7 @@ MODULE moduleMesh
END SUBROUTINE readMesh_interface END SUBROUTINE readMesh_interface
SUBROUTINE readInitial_interface(sp, filename, density, velocity, temperature) SUBROUTINE readInitial_interface(filename, density, velocity, temperature)
INTEGER, INTENT(in):: sp
CHARACTER(:), ALLOCATABLE, INTENT(in):: filename CHARACTER(:), ALLOCATABLE, INTENT(in):: filename
REAL(8), ALLOCATABLE, INTENT(out), DIMENSION(:):: density REAL(8), ALLOCATABLE, INTENT(out), DIMENSION(:):: density
REAL(8), ALLOCATABLE, INTENT(out), DIMENSION(:,:):: velocity REAL(8), ALLOCATABLE, INTENT(out), DIMENSION(:,:):: velocity

View file

@ -159,8 +159,8 @@ MODULE moduleMeshBoundary
newElectron%vol = part%vol newElectron%vol = part%vol
newIon%vol = part%vol newIon%vol = part%vol
newElectron%xi = mesh%cells(part%vol)%obj%phy2log(newElectron%r) newElectron%Xi = mesh%cells(part%vol)%obj%phy2log(newElectron%r)
newIon%xi = newElectron%xi newIon%Xi = newElectron%Xi
newElectron%weight = part%weight newElectron%weight = part%weight
newIon%weight = newElectron%weight newIon%weight = newElectron%weight

View file

@ -111,13 +111,13 @@ MODULE moduleCollisions
IMPLICIT NONE IMPLICIT NONE
REAL(8):: n(1:3) REAL(8):: n(1:3)
REAL(8):: cosXii, sinXii, eps REAL(8):: cosXi, sinXi, eps
cosXii = random(-1.D0, 1.D0) cosXi = random(-1.D0, 1.D0)
sinXii = DSQRT(1.D0 - cosXii**2) sinXi = DSQRT(1.D0 - cosXi**2)
eps = random(0.D0, PI2) eps = random(0.D0, PI2)
n = (/ cosXii, sinXii*DCOS(eps), sinXii*DSIN(eps) /) n = (/ cosXi, sinXi*DCOS(eps), sinXi*DSIN(eps) /)
END FUNCTION randomDirectionVHS END FUNCTION randomDirectionVHS

View file

@ -40,7 +40,7 @@ MODULE moduleSpecies
CLASS(speciesGeneric), POINTER:: species !Pointer to species associated with this particle CLASS(speciesGeneric), POINTER:: species !Pointer to species associated with this particle
INTEGER:: vol !Index of element in which the particle is located INTEGER:: vol !Index of element in which the particle is located
INTEGER:: volColl !Index of element in which the particle is located in the Collision Mesh INTEGER:: volColl !Index of element in which the particle is located in the Collision Mesh
REAL(8):: xi(1:3) !Logical coordinates of particle in element e_p. REAL(8):: Xi(1:3) !Logical coordinates of particle in element e_p.
LOGICAL:: n_in !Flag that indicates if a particle is in the domain LOGICAL:: n_in !Flag that indicates if a particle is in the domain
REAL(8):: weight=0.D0 !weight of particle REAL(8):: weight=0.D0 !weight of particle