First implementation of 2D Cartesian space.
Files and types with 'Cyl' have been changed to '2DCyl' to better
differentiate between the two types of 2D geometry.
Solvers for charged and neutral particles in 2D Cartesian space.
Added solveds for 1D neutral particles (this branch is not the place to
do it, but it was a minor change).
User Manual updated with the new accepted options.
This commit is contained in:
parent
c378f8c3a2
commit
2ae4a6c785
14 changed files with 2110 additions and 162 deletions
|
|
@ -1,11 +1,11 @@
|
|||
all : moduleMeshCyl.o moduleMeshCylBoundary.o moduleMeshCylRead.o
|
||||
all : moduleMesh2DCyl.o moduleMesh2DCylBoundary.o moduleMesh2DCylRead.o
|
||||
|
||||
moduleMeshCyl.o: moduleMeshCyl.f90
|
||||
moduleMesh2DCyl.o: moduleMesh2DCyl.f90
|
||||
$(FC) $(FCFLAGS) -c $(subst .o,.f90,$@) -o $(OBJDIR)/$@
|
||||
|
||||
moduleMeshCylBoundary.o: moduleMeshCyl.o moduleMeshCylBoundary.f90
|
||||
moduleMesh2DCylBoundary.o: moduleMesh2DCyl.o moduleMesh2DCylBoundary.f90
|
||||
$(FC) $(FCFLAGS) -c $(subst .o,.f90,$@) -o $(OBJDIR)/$@
|
||||
|
||||
moduleMeshCylRead.o: moduleMeshCyl.o moduleMeshCylBoundary.o moduleMeshCylRead.f90
|
||||
moduleMesh2DCylRead.o: moduleMesh2DCyl.o moduleMesh2DCylBoundary.o moduleMesh2DCylRead.f90
|
||||
$(FC) $(FCFLAGS) -c $(subst .o,.f90,$@) -o $(OBJDIR)/$@
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
!moduleMeshCyl: 2D axial symmetric extension of generic mesh from GMSH format.
|
||||
!moduleMesh2DCyl: 2D axial symmetric extension of generic mesh from GMSH format.
|
||||
! x == z
|
||||
! y == r
|
||||
! z == theta (unused)
|
||||
MODULE moduleMeshCyl
|
||||
MODULE moduleMesh2DCyl
|
||||
USE moduleMesh
|
||||
IMPLICIT NONE
|
||||
|
||||
|
|
@ -14,26 +14,26 @@ MODULE moduleMeshCyl
|
|||
REAL(8), PARAMETER:: xi2Tria(1:4) = (/ 1.D0/3.D0, 1.D0/5.D0, 1.D0/5.D0, 3.D0/5.D0 /)
|
||||
REAL(8), PARAMETER:: wTria(1:4) = (/ -27.D0/96.D0, 25.D0/96.D0, 25.D0/96.D0, 25.D0/96.D0 /)
|
||||
|
||||
TYPE, PUBLIC, EXTENDS(meshNode):: meshNodeCyl
|
||||
TYPE, PUBLIC, EXTENDS(meshNode):: meshNode2DCyl
|
||||
!Element coordinates
|
||||
REAL(8):: r = 0.D0, z = 0.D0
|
||||
CONTAINS
|
||||
PROCEDURE, PASS:: init => initNodeCyl
|
||||
PROCEDURE, PASS:: getCoordinates => getCoordCyl
|
||||
PROCEDURE, PASS:: init => initNode2DCyl
|
||||
PROCEDURE, PASS:: getCoordinates => getCoord2DCyl
|
||||
|
||||
END TYPE meshNodeCyl
|
||||
END TYPE meshNode2DCyl
|
||||
|
||||
TYPE, PUBLIC, EXTENDS(meshEdge):: meshEdgeCyl
|
||||
TYPE, PUBLIC, EXTENDS(meshEdge):: meshEdge2DCyl
|
||||
!Element coordinates
|
||||
REAL(8):: r(1:2) = 0.D0, z(1:2) = 0.D0
|
||||
!Connectivity to nodes
|
||||
CLASS(meshNode), POINTER:: n1 => NULL(), n2 => NULL()
|
||||
CONTAINS
|
||||
PROCEDURE, PASS:: init => initEdgeCyl
|
||||
PROCEDURE, PASS:: getNodes => getNodesCyl
|
||||
PROCEDURE, PASS:: init => initEdge2DCyl
|
||||
PROCEDURE, PASS:: getNodes => getNodes2DCyl
|
||||
PROCEDURE, PASS:: randPos => randPosEdge
|
||||
|
||||
END TYPE meshEdgeCyl
|
||||
END TYPE meshEdge2DCyl
|
||||
|
||||
!Boundary functions defined in the submodule Boundary
|
||||
INTERFACE
|
||||
|
|
@ -84,15 +84,15 @@ MODULE moduleMeshCyl
|
|||
|
||||
END INTERFACE
|
||||
|
||||
TYPE, PUBLIC, ABSTRACT, EXTENDS(meshVol):: meshVolCyl
|
||||
TYPE, PUBLIC, ABSTRACT, EXTENDS(meshVol):: meshVol2DCyl
|
||||
CONTAINS
|
||||
PROCEDURE, PASS:: detJac => detJCyl
|
||||
PROCEDURE, PASS:: invJac => invJCyl
|
||||
PROCEDURE, PASS:: detJac => detJ2DCyl
|
||||
PROCEDURE, PASS:: invJac => invJ2DCyl
|
||||
PROCEDURE(fPsi_interface), DEFERRED, NOPASS:: fPsi
|
||||
PROCEDURE(dPsi_interface), DEFERRED, NOPASS:: dPsi
|
||||
PROCEDURE(partialDer_interface), DEFERRED, PASS:: partialDer
|
||||
|
||||
END TYPE meshVolCyl
|
||||
END TYPE meshVol2DCyl
|
||||
|
||||
ABSTRACT INTERFACE
|
||||
PURE FUNCTION fPsi_interface(xi) RESULT(fPsi)
|
||||
|
|
@ -108,8 +108,8 @@ MODULE moduleMeshCyl
|
|||
END FUNCTION dPsi_interface
|
||||
|
||||
PURE SUBROUTINE partialDer_interface(self, dPsi, dz, dr)
|
||||
IMPORT meshVolCyl
|
||||
CLASS(meshVolCyl), INTENT(in):: self
|
||||
IMPORT meshVol2DCyl
|
||||
CLASS(meshVol2DCyl), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: dPsi(1:,1:)
|
||||
REAL(8), INTENT(out), DIMENSION(1:2):: dz, dr
|
||||
|
||||
|
|
@ -118,7 +118,7 @@ MODULE moduleMeshCyl
|
|||
END INTERFACE
|
||||
|
||||
!Quadrilateral volume element
|
||||
TYPE, PUBLIC, EXTENDS(meshVolCyl):: meshVolCylQuad
|
||||
TYPE, PUBLIC, EXTENDS(meshVol2DCyl):: meshVol2DCylQuad
|
||||
!Element coordinates
|
||||
REAL(8):: r(1:4) = 0.D0, z(1:4) = 0.D0
|
||||
!Connectivity to nodes
|
||||
|
|
@ -128,7 +128,7 @@ MODULE moduleMeshCyl
|
|||
REAL(8):: arNodes(1:4) = 0.D0
|
||||
|
||||
CONTAINS
|
||||
PROCEDURE, PASS:: init => initVolQuadCyl
|
||||
PROCEDURE, PASS:: init => initVolQuad2DCyl
|
||||
PROCEDURE, PASS:: randPos => randPosVolQuad
|
||||
PROCEDURE, PASS:: area => areaQuad
|
||||
PROCEDURE, NOPASS:: fPsi => fPsiQuad
|
||||
|
|
@ -146,10 +146,10 @@ MODULE moduleMeshCyl
|
|||
PROCEDURE, PASS:: phy2log => phy2logQuad
|
||||
PROCEDURE, PASS:: nextElement => nextElementQuad
|
||||
|
||||
END TYPE meshVolCylQuad
|
||||
END TYPE meshVol2DCylQuad
|
||||
|
||||
!Triangular volume element
|
||||
TYPE, PUBLIC, EXTENDS(meshVolCyl):: meshVolCylTria
|
||||
TYPE, PUBLIC, EXTENDS(meshVol2DCyl):: meshVol2DCylTria
|
||||
!Element coordinates
|
||||
REAL(8):: r(1:3) = 0.D0, z(1:3) = 0.D0
|
||||
!Connectivity to nodes
|
||||
|
|
@ -157,11 +157,9 @@ MODULE moduleMeshCyl
|
|||
!Connectivity to adjacent elements
|
||||
CLASS(*), POINTER:: e1 => NULL(), e2 => NULL(), e3 => NULL()
|
||||
REAL(8):: arNodes(1:3) = 0.D0
|
||||
!Derivatives in z,r real space
|
||||
REAL(8), DIMENSION(1:3):: dPsiZ, dPsiR
|
||||
|
||||
CONTAINS
|
||||
PROCEDURE, PASS:: init => initVolTriaCyl
|
||||
PROCEDURE, PASS:: init => initVolTria2DCyl
|
||||
PROCEDURE, PASS:: randPos => randPosVolTria
|
||||
PROCEDURE, PASS:: area => areaTria
|
||||
PROCEDURE, NOPASS:: fPsi => fPsiTria
|
||||
|
|
@ -179,51 +177,51 @@ MODULE moduleMeshCyl
|
|||
PROCEDURE, PASS:: phy2log => phy2logTria
|
||||
PROCEDURE, PASS:: nextElement => nextElementTria
|
||||
|
||||
END TYPE meshVolCylTria
|
||||
END TYPE meshVol2DCylTria
|
||||
|
||||
CONTAINS
|
||||
!NODE FUNCTIONS
|
||||
!Inits node element
|
||||
SUBROUTINE initNodeCyl(self, n, r)
|
||||
SUBROUTINE initNode2DCyl(self, n, r)
|
||||
USE moduleSpecies
|
||||
USE moduleRefParam
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshNodeCyl), INTENT(out):: self
|
||||
CLASS(meshNode2DCyl), INTENT(out):: self
|
||||
INTEGER, INTENT(in):: n
|
||||
REAL(8), INTENT(in):: r(1:3)
|
||||
|
||||
self%n = n
|
||||
self%z = r(2)/L_ref
|
||||
self%r = r(1)/L_ref
|
||||
self%z = r(1)/L_ref
|
||||
self%r = r(2)/L_ref
|
||||
!Node volume, to be determined in mesh
|
||||
self%v = 0.D0
|
||||
|
||||
!Allocates output:
|
||||
ALLOCATE(self%output(1:nSpecies))
|
||||
|
||||
END SUBROUTINE initNodeCyl
|
||||
END SUBROUTINE initNode2DCyl
|
||||
|
||||
!Get coordinates from node
|
||||
PURE FUNCTION getCoordCyl(self) RESULT(r)
|
||||
PURE FUNCTION getCoord2DCyl(self) RESULT(r)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshNodeCyl), INTENT(in):: self
|
||||
CLASS(meshNode2DCyl), INTENT(in):: self
|
||||
REAL(8):: r(1:3)
|
||||
|
||||
r = (/self%z, self%r, 0.D0/)
|
||||
|
||||
END FUNCTION getCoordCyl
|
||||
END FUNCTION getCoord2DCyl
|
||||
|
||||
!EDGE FUNCTIONS
|
||||
!Inits edge element
|
||||
SUBROUTINE initEdgeCyl(self, n, p, bt, physicalSurface)
|
||||
SUBROUTINE initEdge2DCyl(self, n, p, bt, physicalSurface)
|
||||
USE moduleSpecies
|
||||
USE moduleBoundary
|
||||
USE moduleErrors
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshEdgeCyl), INTENT(out):: self
|
||||
CLASS(meshEdge2DCyl), INTENT(out):: self
|
||||
INTEGER, INTENT(in):: n
|
||||
INTEGER, INTENT(in):: p(:)
|
||||
INTEGER, INTENT(in):: bt
|
||||
|
|
@ -265,7 +263,7 @@ MODULE moduleMeshCyl
|
|||
self%fBoundary(s)%apply => symmetryAxis
|
||||
|
||||
CLASS DEFAULT
|
||||
CALL criticalError("Boundary type not defined in this geometry", 'initEdgeCyl')
|
||||
CALL criticalError("Boundary type not defined in this geometry", 'initEdge2DCyl')
|
||||
|
||||
END SELECT
|
||||
|
||||
|
|
@ -274,14 +272,14 @@ MODULE moduleMeshCyl
|
|||
!Physical surface
|
||||
self%physicalSurface = physicalSurface
|
||||
|
||||
END SUBROUTINE initEdgeCyl
|
||||
END SUBROUTINE initEdge2DCyl
|
||||
|
||||
!Random position in quadrilateral volume
|
||||
FUNCTION randPosVolQuad(self) RESULT(r)
|
||||
USE moduleRandom
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylQuad), INTENT(in):: self
|
||||
CLASS(meshVol2DCylQuad), INTENT(in):: self
|
||||
REAL(8):: r(1:3)
|
||||
REAL(8):: xii(1:3)
|
||||
REAL(8), ALLOCATABLE:: fPsi(:)
|
||||
|
|
@ -299,23 +297,23 @@ MODULE moduleMeshCyl
|
|||
END FUNCTION randposVolQuad
|
||||
|
||||
!Get nodes from edge
|
||||
PURE FUNCTION getNodesCyl(self) RESULT(n)
|
||||
PURE FUNCTION getNodes2DCyl(self) RESULT(n)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshEdgeCyl), INTENT(in):: self
|
||||
CLASS(meshEdge2DCyl), INTENT(in):: self
|
||||
INTEGER, ALLOCATABLE:: n(:)
|
||||
|
||||
ALLOCATE(n(1:2))
|
||||
n = (/self%n1%n, self%n2%n /)
|
||||
|
||||
END FUNCTION getNodesCyl
|
||||
END FUNCTION getNodes2DCyl
|
||||
|
||||
!Calculates a random position in edge
|
||||
FUNCTION randPosEdge(self) RESULT(r)
|
||||
USE moduleRandom
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshEdgeCyl), INTENT(in):: self
|
||||
CLASS(meshEdge2DCyl), INTENT(in):: self
|
||||
REAL(8):: rnd
|
||||
REAL(8):: r(1:3)
|
||||
REAL(8):: p1(1:2), p2(1:2)
|
||||
|
|
@ -332,11 +330,11 @@ MODULE moduleMeshCyl
|
|||
!VOLUME FUNCTIONS
|
||||
!QUAD FUNCTIONS
|
||||
!Inits quadrilateral element
|
||||
SUBROUTINE initVolQuadCyl(self, n, p)
|
||||
SUBROUTINE initVolQuad2DCyl(self, n, p)
|
||||
USE moduleRefParam
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylQuad), INTENT(out):: self
|
||||
CLASS(meshVol2DCylQuad), INTENT(out):: self
|
||||
INTEGER, INTENT(in):: n
|
||||
INTEGER, INTENT(in):: p(:)
|
||||
REAL(8), DIMENSION(1:3):: r1, r2, r3, r4
|
||||
|
|
@ -365,14 +363,14 @@ MODULE moduleMeshCyl
|
|||
|
||||
CALL OMP_INIT_LOCK(self%lock)
|
||||
|
||||
END SUBROUTINE initVolQuadCyl
|
||||
END SUBROUTINE initVolQuad2DCyl
|
||||
|
||||
!Computes element area
|
||||
PURE SUBROUTINE areaQuad(self)
|
||||
USE moduleConstParam, ONLY: PI8
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylQuad), INTENT(inout):: self
|
||||
CLASS(meshVol2DCylQuad), INTENT(inout):: self
|
||||
REAL(8):: r, xi(1:3)
|
||||
REAL(8):: detJ
|
||||
REAL(8):: fPsi(1:4)
|
||||
|
|
@ -453,7 +451,7 @@ MODULE moduleMeshCyl
|
|||
PURE SUBROUTINE partialDerQuad(self, dPsi, dz, dr)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylQuad), INTENT(in):: self
|
||||
CLASS(meshVol2DCylQuad), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: dPsi(1:,1:)
|
||||
REAL(8), INTENT(out), DIMENSION(1:2):: dz, dr
|
||||
|
||||
|
|
@ -469,7 +467,7 @@ MODULE moduleMeshCyl
|
|||
USE moduleConstParam, ONLY: PI2
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylQuad), INTENT(in):: self
|
||||
CLASS(meshVol2DCylQuad), INTENT(in):: self
|
||||
REAL(8):: r, xi(1:3)
|
||||
REAL(8):: fPsi(1:4), dPsi(1:2,1:4)
|
||||
REAL(8):: ke(1:4,1:4)
|
||||
|
|
@ -502,7 +500,7 @@ MODULE moduleMeshCyl
|
|||
USE moduleConstParam, ONLY: PI2
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylQuad), INTENT(in):: self
|
||||
CLASS(meshVol2DCylQuad), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: source(1:)
|
||||
REAL(8), ALLOCATABLE:: localF(:)
|
||||
REAL(8):: r, xi(1:3)
|
||||
|
|
@ -558,7 +556,7 @@ MODULE moduleMeshCyl
|
|||
USE moduleSpecies
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylQuad), INTENT(in):: self
|
||||
CLASS(meshVol2DCylQuad), INTENT(in):: self
|
||||
CLASS(particle), INTENT(in):: part
|
||||
TYPE(outputNode), POINTER:: vertex
|
||||
REAL(8):: w_p(1:4)
|
||||
|
|
@ -593,7 +591,7 @@ MODULE moduleMeshCyl
|
|||
PURE FUNCTION gatherEFQuad(self,xi) RESULT(EF)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylQuad), INTENT(in):: self
|
||||
CLASS(meshVol2DCylQuad), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: xi(1:3)
|
||||
REAL(8):: dPsi(1:2,1:4)
|
||||
REAL(8):: dPsiR(1:2,1:4)!Derivative of shpae functions in global coordinates
|
||||
|
|
@ -620,7 +618,7 @@ MODULE moduleMeshCyl
|
|||
PURE FUNCTION getNodesQuad(self) RESULT(n)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylQuad), INTENT(in):: self
|
||||
CLASS(meshVol2DCylQuad), INTENT(in):: self
|
||||
INTEGER, ALLOCATABLE:: n(:)
|
||||
|
||||
ALLOCATE(n(1:4))
|
||||
|
|
@ -632,7 +630,7 @@ MODULE moduleMeshCyl
|
|||
PURE FUNCTION phy2logQuad(self,r) RESULT(xN)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylQuad), INTENT(in):: self
|
||||
CLASS(meshVol2DCylQuad), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: r(1:3)
|
||||
REAL(8):: xN(1:3)
|
||||
REAL(8):: xO(1:3), detJ, invJ(1:2,1:2), f(1:2)
|
||||
|
|
@ -662,7 +660,7 @@ MODULE moduleMeshCyl
|
|||
SUBROUTINE nextElementQuad(self, xi, nextElement)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylQuad), INTENT(in):: self
|
||||
CLASS(meshVol2DCylQuad), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: xi(1:3)
|
||||
CLASS(*), POINTER, INTENT(out):: nextElement
|
||||
REAL(8):: xiArray(1:4)
|
||||
|
|
@ -687,15 +685,14 @@ MODULE moduleMeshCyl
|
|||
|
||||
!TRIA ELEMENT
|
||||
!Init tria element
|
||||
SUBROUTINE initVolTriaCyl(self, n, p)
|
||||
SUBROUTINE initVolTria2DCyl(self, n, p)
|
||||
USE moduleRefParam
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylTria), INTENT(out):: self
|
||||
CLASS(meshVol2DCylTria), INTENT(out):: self
|
||||
INTEGER, INTENT(in):: n
|
||||
INTEGER, INTENT(in):: p(:)
|
||||
REAL(8), DIMENSION(1:3):: r1, r2, r3
|
||||
REAL(8):: A
|
||||
|
||||
!Assign node index
|
||||
self%n = n
|
||||
|
|
@ -716,31 +713,18 @@ MODULE moduleMeshCyl
|
|||
self%n2%v = self%n2%v + self%arNodes(2)
|
||||
self%n3%v = self%n3%v + self%arNodes(3)
|
||||
|
||||
!Derivatives in z/r for shape functions (node independent)
|
||||
A = self%z(2)*self%r(3) - self%z(3)*self%r(2) + &
|
||||
self%z(3)*self%r(1) - self%z(1)*self%r(3) + &
|
||||
self%z(1)*self%r(2) - self%z(2)*self%r(1)
|
||||
|
||||
self%dPsiZ = (/ self%r(2)-self%r(3), &
|
||||
self%r(3)-self%r(1), &
|
||||
self%r(1)-self%r(2) /)/A
|
||||
|
||||
self%dPsiR = (/ self%z(3)-self%z(2), &
|
||||
self%z(1)-self%z(3), &
|
||||
self%z(2)-self%z(1) /)/A
|
||||
|
||||
self%sigmaVrelMax = sigma_ref/L_ref**2
|
||||
|
||||
CALL OMP_INIT_LOCK(self%lock)
|
||||
|
||||
END SUBROUTINE initVolTriaCyl
|
||||
END SUBROUTINE initVolTria2DCyl
|
||||
|
||||
!Random position in quadrilateral volume
|
||||
FUNCTION randPosVolTria(self) RESULT(r)
|
||||
USE moduleRandom
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylTria), INTENT(in):: self
|
||||
CLASS(meshVol2DCylTria), INTENT(in):: self
|
||||
REAL(8):: r(1:3)
|
||||
REAL(8):: xii(1:3)
|
||||
REAL(8), ALLOCATABLE:: fPsi(:)
|
||||
|
|
@ -762,7 +746,7 @@ MODULE moduleMeshCyl
|
|||
USE moduleConstParam, ONLY: PI
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylTria), INTENT(inout):: self
|
||||
CLASS(meshVol2DCylTria), INTENT(inout):: self
|
||||
REAL(8):: r, xi(1:3)
|
||||
REAL(8):: detJ
|
||||
REAL(8):: fPsi(1:3)
|
||||
|
|
@ -837,7 +821,7 @@ MODULE moduleMeshCyl
|
|||
PURE SUBROUTINE partialDerTria(self, dPsi, dz, dr)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylTria), INTENT(in):: self
|
||||
CLASS(meshVol2DCylTria), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: dPsi(1:,1:)
|
||||
REAL(8), INTENT(out), DIMENSION(1:2):: dz, dr
|
||||
|
||||
|
|
@ -853,7 +837,7 @@ MODULE moduleMeshCyl
|
|||
USE moduleConstParam, ONLY: PI2
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylTria), INTENT(in):: self
|
||||
CLASS(meshVol2DCylTria), INTENT(in):: self
|
||||
REAL(8):: r, xi(1:3)
|
||||
REAL(8):: fPsi(1:3), dPsi(1:2,1:3)
|
||||
REAL(8):: ke(1:3,1:3)
|
||||
|
|
@ -883,7 +867,7 @@ MODULE moduleMeshCyl
|
|||
USE moduleConstParam, ONLY: PI2
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylTria), INTENT(in):: self
|
||||
CLASS(meshVol2DCylTria), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: source(1:)
|
||||
REAL(8), ALLOCATABLE:: localF(:)
|
||||
REAL(8):: fPsi(1:3)
|
||||
|
|
@ -938,7 +922,7 @@ MODULE moduleMeshCyl
|
|||
USE moduleSpecies
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylTria), INTENT(in):: self
|
||||
CLASS(meshVol2DCylTria), INTENT(in):: self
|
||||
CLASS(particle), INTENT(in):: part
|
||||
TYPE(outputNode), POINTER:: vertex
|
||||
REAL(8):: w_p(1:3)
|
||||
|
|
@ -968,7 +952,7 @@ MODULE moduleMeshCyl
|
|||
PURE FUNCTION gatherEFTria(self,xi) RESULT(EF)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylTria), INTENT(in):: self
|
||||
CLASS(meshVol2DCylTria), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: xi(1:3)
|
||||
REAL(8):: dPsi(1:2,1:3)
|
||||
REAL(8):: dPsiR(1:2,1:3)!Derivative of shpae functions in global coordinates
|
||||
|
|
@ -995,7 +979,7 @@ MODULE moduleMeshCyl
|
|||
PURE FUNCTION getNodesTria(self) RESULT(n)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylTria), INTENT(in):: self
|
||||
CLASS(meshVol2DCylTria), INTENT(in):: self
|
||||
INTEGER, ALLOCATABLE:: n(:)
|
||||
|
||||
ALLOCATE(n(1:3))
|
||||
|
|
@ -1007,7 +991,7 @@ MODULE moduleMeshCyl
|
|||
PURE FUNCTION phy2logTria(self,r) RESULT(xi)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylTria), INTENT(in):: self
|
||||
CLASS(meshVol2DCylTria), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: r(1:3)
|
||||
REAL(8):: xi(1:3)
|
||||
REAL(8):: invJ(1:2,1:2), detJ
|
||||
|
|
@ -1027,7 +1011,7 @@ MODULE moduleMeshCyl
|
|||
SUBROUTINE nextElementTria(self, xi, nextElement)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylTria), INTENT(in):: self
|
||||
CLASS(meshVol2DCylTria), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: xi(1:3)
|
||||
CLASS(*), POINTER, INTENT(out):: nextElement
|
||||
REAL(8):: xiArray(1:3)
|
||||
|
|
@ -1049,10 +1033,10 @@ MODULE moduleMeshCyl
|
|||
|
||||
!COMMON FUNCTIONS FOR CYLINDRICAL VOLUME ELEMENTS
|
||||
!Computes element Jacobian determinant
|
||||
PURE FUNCTION detJCyl(self, xi, dPsi_in) RESULT(dJ)
|
||||
PURE FUNCTION detJ2DCyl(self, xi, dPsi_in) RESULT(dJ)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCyl), INTENT(in):: self
|
||||
CLASS(meshVol2DCyl), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: xi(1:3)
|
||||
REAL(8), INTENT(in), OPTIONAL:: dPsi_in(1:,1:)
|
||||
REAL(8), ALLOCATABLE:: dPsi(:,:)
|
||||
|
|
@ -1070,13 +1054,13 @@ MODULE moduleMeshCyl
|
|||
CALL self%partialDer(dPsi, dz, dr)
|
||||
dJ = dz(1)*dr(2)-dz(2)*dr(1)
|
||||
|
||||
END FUNCTION detJCyl
|
||||
END FUNCTION detJ2DCyl
|
||||
|
||||
!Computes element Jacobian inverse matrix (without determinant)
|
||||
PURE FUNCTION invJCyl(self,xi,dPsi_in) RESULT(invJ)
|
||||
PURE FUNCTION invJ2DCyl(self,xi,dPsi_in) RESULT(invJ)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCyl), INTENT(in):: self
|
||||
CLASS(meshVol2DCyl), INTENT(in):: self
|
||||
REAL(8), INTENT(in):: xi(1:3)
|
||||
REAL(8), INTENT(in), OPTIONAL:: dPsi_in(1:,1:)
|
||||
REAL(8), ALLOCATABLE:: dPsi(:,:)
|
||||
|
|
@ -1095,6 +1079,6 @@ MODULE moduleMeshCyl
|
|||
invJ(1,:) = (/ dr(2), -dz(2) /)
|
||||
invJ(2,:) = (/ -dr(1), dz(1) /)
|
||||
|
||||
END FUNCTION invJCyl
|
||||
END FUNCTION invJ2DCyl
|
||||
|
||||
END MODULE moduleMeshCyl
|
||||
END MODULE moduleMesh2DCyl
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
!moduleMeshCylBoundary: Boundary functions for cylindrical coordinates
|
||||
SUBMODULE (moduleMeshCyl) moduleMeshCylBoundary
|
||||
USE moduleMeshCyl
|
||||
!moduleMesh2DCylBoundary: Boundary functions for cylindrical coordinates
|
||||
SUBMODULE (moduleMesh2DCyl) moduleMesh2DCylBoundary
|
||||
USE moduleMesh2DCyl
|
||||
|
||||
CONTAINS
|
||||
SUBROUTINE reflection(edge, part)
|
||||
|
|
@ -13,7 +13,7 @@ SUBMODULE (moduleMeshCyl) moduleMeshCylBoundary
|
|||
|
||||
!TODO: Try to do this without select
|
||||
SELECT TYPE(edge)
|
||||
TYPE IS(meshEdgeCyl)
|
||||
TYPE IS(meshEdge2DCyl)
|
||||
edgeNorm = DSQRT((edge%r(2)-edge%r(1))**2 + (edge%z(2)-edge%z(1))**2)
|
||||
cosT = (edge%z(2)-edge%z(1))/edgeNorm
|
||||
sinT = DSQRT(1-cosT**2)
|
||||
|
|
@ -53,7 +53,7 @@ SUBMODULE (moduleMeshCyl) moduleMeshCylBoundary
|
|||
REAL(8):: d !Distance from particle to edge
|
||||
|
||||
SELECT TYPE(edge)
|
||||
TYPE IS(meshEdgeCyl)
|
||||
TYPE IS(meshEdge2DCyl)
|
||||
a = (edge%z(1) - edge%z(2))
|
||||
b = (edge%r(1) - edge%r(2))
|
||||
c = edge%z(1)*edge%r(2) - edge%z(2)*edge%r(1)
|
||||
|
|
@ -124,7 +124,7 @@ SUBMODULE (moduleMeshCyl) moduleMeshCylBoundary
|
|||
|
||||
!Reflects particle in the edge
|
||||
SELECT TYPE(edge)
|
||||
TYPE IS(meshEdgeCyl)
|
||||
TYPE IS(meshEdge2DCyl)
|
||||
edgeNorm = DSQRT((edge%r(2)-edge%r(1))**2 + (edge%z(2)-edge%z(1))**2)
|
||||
cosT = (edge%z(2)-edge%z(1))/edgeNorm
|
||||
sinT = DSQRT(1-cosT**2)
|
||||
|
|
@ -161,4 +161,4 @@ SUBMODULE (moduleMeshCyl) moduleMeshCylBoundary
|
|||
|
||||
END SUBROUTINE symmetryAxis
|
||||
|
||||
END SUBMODULE moduleMeshCylBoundary
|
||||
END SUBMODULE moduleMesh2DCylBoundary
|
||||
|
|
@ -1,11 +1,11 @@
|
|||
MODULE moduleMeshCylRead
|
||||
MODULE moduleMesh2DCylRead
|
||||
USE moduleMesh
|
||||
USE moduleMeshCyl
|
||||
USE moduleMesh2DCyl
|
||||
|
||||
TYPE, EXTENDS(meshGeneric):: meshCylGeneric
|
||||
TYPE, EXTENDS(meshGeneric):: mesh2DCylGeneric
|
||||
CONTAINS
|
||||
PROCEDURE, PASS:: init => initCylMesh
|
||||
PROCEDURE, PASS:: readMesh => readMeshCylGmsh
|
||||
PROCEDURE, PASS:: init => init2DCylMesh
|
||||
PROCEDURE, PASS:: readMesh => readMesh2DCylGmsh
|
||||
|
||||
END TYPE
|
||||
|
||||
|
|
@ -16,12 +16,12 @@ MODULE moduleMeshCylRead
|
|||
|
||||
CONTAINS
|
||||
!Init mesh
|
||||
SUBROUTINE initCylMesh(self, meshFormat)
|
||||
SUBROUTINE init2DCylMesh(self, meshFormat)
|
||||
USE moduleMesh
|
||||
USE moduleErrors
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCylGeneric), INTENT(out):: self
|
||||
CLASS(mesh2DCylGeneric), INTENT(out):: self
|
||||
CHARACTER(:), ALLOCATABLE, INTENT(in):: meshFormat
|
||||
|
||||
SELECT CASE(meshFormat)
|
||||
|
|
@ -31,18 +31,18 @@ MODULE moduleMeshCylRead
|
|||
self%printEM => printEMGmsh
|
||||
|
||||
CASE DEFAULT
|
||||
CALL criticalError("Mesh type " // meshFormat // " not supported.", "initCylMesh")
|
||||
CALL criticalError("Mesh type " // meshFormat // " not supported.", "init2DCylMesh")
|
||||
|
||||
END SELECT
|
||||
|
||||
END SUBROUTINE initCylMesh
|
||||
END SUBROUTINE init2DCylMesh
|
||||
|
||||
!Read mesh from gmsh file
|
||||
SUBROUTINE readMeshCylGmsh(self, filename)
|
||||
SUBROUTINE readMesh2DCylGmsh(self, filename)
|
||||
USE moduleBoundary
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshCylGeneric), INTENT(inout):: self
|
||||
CLASS(mesh2DCylGeneric), INTENT(inout):: self
|
||||
CHARACTER(:), ALLOCATABLE, INTENT(in):: filename
|
||||
REAL(8):: r, z
|
||||
INTEGER:: p(1:4)
|
||||
|
|
@ -68,8 +68,8 @@ MODULE moduleMeshCylRead
|
|||
!Read nodes cartesian coordinates (x=z, y=r, z=null)
|
||||
DO e=1, self%numNodes
|
||||
READ(10, *) n, z, r
|
||||
ALLOCATE(meshNodeCyl:: self%nodes(n)%obj)
|
||||
CALL self%nodes(n)%obj%init(n, (/r, z, 0.D0 /))
|
||||
ALLOCATE(meshNode2DCyl:: self%nodes(n)%obj)
|
||||
CALL self%nodes(n)%obj%init(n, (/z, r, 0.D0 /))
|
||||
|
||||
END DO
|
||||
!Skips comments
|
||||
|
|
@ -103,7 +103,7 @@ MODULE moduleMeshCylRead
|
|||
!Associate boundary condition procedure.
|
||||
bt = getBoundaryId(boundaryType)
|
||||
|
||||
ALLOCATE(meshEdgeCyl:: self%edges(e)%obj)
|
||||
ALLOCATE(meshEdge2DCyl:: self%edges(e)%obj)
|
||||
|
||||
CALL self%edges(e)%obj%init(n, p(1:2), bt, boundaryType)
|
||||
|
||||
|
|
@ -118,13 +118,13 @@ MODULE moduleMeshCylRead
|
|||
CASE (2)
|
||||
!Triangular element
|
||||
READ(10,*) n, elemType, eTemp, eTemp, eTemp, p(1:3)
|
||||
ALLOCATE(meshVolCylTria:: self%vols(e)%obj)
|
||||
ALLOCATE(meshVol2DCylTria:: self%vols(e)%obj)
|
||||
CALL self%vols(e)%obj%init(n - self%numEdges, p(1:3))
|
||||
|
||||
CASE (3)
|
||||
!Quadrilateral element
|
||||
READ(10,*) n, elemType, eTemp, eTemp, eTemp, p(1:4)
|
||||
ALLOCATE(meshVolCylQuad:: self%vols(e)%obj)
|
||||
ALLOCATE(meshVol2DCylQuad:: self%vols(e)%obj)
|
||||
CALL self%vols(e)%obj%init(n - self%numEdges, p(1:4))
|
||||
|
||||
END SELECT
|
||||
|
|
@ -154,7 +154,7 @@ MODULE moduleMeshCylRead
|
|||
|
||||
END DO
|
||||
|
||||
END SUBROUTINE readMeshCylGmsh
|
||||
END SUBROUTINE readMesh2DCylGmsh
|
||||
|
||||
!Selects type of elements to build connection
|
||||
SUBROUTINE connectedVolVol(elemA, elemB)
|
||||
|
|
@ -164,27 +164,27 @@ MODULE moduleMeshCylRead
|
|||
CLASS(meshVol), INTENT(inout):: elemB
|
||||
|
||||
SELECT TYPE(elemA)
|
||||
TYPE IS(meshVolCylQuad)
|
||||
TYPE IS(meshVol2DCylQuad)
|
||||
!Element A is a quadrilateral
|
||||
SELECT TYPE(elemB)
|
||||
TYPE IS(meshVolCylQuad)
|
||||
TYPE IS(meshVol2DCylQuad)
|
||||
!Element B is a quadrilateral
|
||||
CALL connectedQuadQuad(elemA, elemB)
|
||||
|
||||
TYPE IS(meshVolCylTria)
|
||||
TYPE IS(meshVol2DCylTria)
|
||||
!Element B is a triangle
|
||||
CALL connectedQuadTria(elemA, elemB)
|
||||
|
||||
END SELECT
|
||||
|
||||
TYPE IS(meshVolCylTria)
|
||||
TYPE IS(meshVol2DCylTria)
|
||||
!Element A is a Triangle
|
||||
SELECT TYPE(elemB)
|
||||
TYPE IS(meshVolCylQuad)
|
||||
TYPE IS(meshVol2DCylQuad)
|
||||
!Element B is a quadrilateral
|
||||
CALL connectedQuadTria(elemB, elemA)
|
||||
|
||||
TYPE IS(meshVolCylTria)
|
||||
TYPE IS(meshVol2DCylTria)
|
||||
!Element B is a triangle
|
||||
CALL connectedTriaTria(elemA, elemB)
|
||||
|
||||
|
|
@ -201,13 +201,13 @@ MODULE moduleMeshCylRead
|
|||
CLASS(meshEdge), INTENT(inout):: elemB
|
||||
|
||||
SELECT TYPE(elemB)
|
||||
CLASS IS(meshEdgeCyl)
|
||||
CLASS IS(meshEdge2DCyl)
|
||||
SELECT TYPE(elemA)
|
||||
TYPE IS(meshVolCylQuad)
|
||||
TYPE IS(meshVol2DCylQuad)
|
||||
!Element A is a quadrilateral
|
||||
CALL connectedQuadEdge(elemA, elemB)
|
||||
|
||||
TYPE IS(meshVolCylTria)
|
||||
TYPE IS(meshVol2DCylTria)
|
||||
!Element A is a triangle
|
||||
CALL connectedTriaEdge(elemA, elemB)
|
||||
|
||||
|
|
@ -220,8 +220,8 @@ MODULE moduleMeshCylRead
|
|||
SUBROUTINE connectedQuadQuad(elemA, elemB)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylQuad), INTENT(inout), TARGET:: elemA
|
||||
CLASS(meshVolCylQuad), INTENT(inout), TARGET:: elemB
|
||||
CLASS(meshVol2DCylQuad), INTENT(inout), TARGET:: elemA
|
||||
CLASS(meshVol2DCylQuad), INTENT(inout), TARGET:: elemB
|
||||
|
||||
!Check direction 1
|
||||
IF (.NOT. ASSOCIATED(elemA%e1) .AND. &
|
||||
|
|
@ -264,8 +264,8 @@ MODULE moduleMeshCylRead
|
|||
SUBROUTINE connectedQuadTria(elemA, elemB)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylQuad), INTENT(inout), TARGET:: elemA
|
||||
CLASS(meshVolCylTria), INTENT(inout), TARGET:: elemB
|
||||
CLASS(meshVol2DCylQuad), INTENT(inout), TARGET:: elemA
|
||||
CLASS(meshVol2DCylTria), INTENT(inout), TARGET:: elemB
|
||||
|
||||
!Check direction 1
|
||||
IF (.NOT. ASSOCIATED(elemA%e1)) THEN
|
||||
|
|
@ -356,8 +356,8 @@ MODULE moduleMeshCylRead
|
|||
SUBROUTINE connectedTriaTria(elemA, elemB)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylTria), INTENT(inout), TARGET:: elemA
|
||||
CLASS(meshVolCylTria), INTENT(inout), TARGET:: elemB
|
||||
CLASS(meshVol2DCylTria), INTENT(inout), TARGET:: elemA
|
||||
CLASS(meshVol2DCylTria), INTENT(inout), TARGET:: elemB
|
||||
|
||||
!Check direction 1
|
||||
IF (.NOT. ASSOCIATED(elemA%e1)) THEN
|
||||
|
|
@ -429,8 +429,8 @@ MODULE moduleMeshCylRead
|
|||
SUBROUTINE connectedQuadEdge(elemA, elemB)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylQuad), INTENT(inout), TARGET:: elemA
|
||||
CLASS(meshEdgeCyl), INTENT(inout), TARGET:: elemB
|
||||
CLASS(meshVol2DCylQuad), INTENT(inout), TARGET:: elemA
|
||||
CLASS(meshEdge2DCyl), INTENT(inout), TARGET:: elemB
|
||||
|
||||
!Check direction 1
|
||||
IF (.NOT. ASSOCIATED(elemA%e1)) THEN
|
||||
|
|
@ -501,8 +501,8 @@ MODULE moduleMeshCylRead
|
|||
SUBROUTINE connectedTriaEdge(elemA, elemB)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshVolCylTria), INTENT(inout), TARGET:: elemA
|
||||
CLASS(meshEdgeCyl), INTENT(inout), TARGET:: elemB
|
||||
CLASS(meshVol2DCylTria), INTENT(inout), TARGET:: elemA
|
||||
CLASS(meshEdge2DCyl), INTENT(inout), TARGET:: elemB
|
||||
|
||||
!Check direction 1
|
||||
IF (.NOT. ASSOCIATED(elemA%e1)) THEN
|
||||
|
|
@ -564,7 +564,7 @@ MODULE moduleMeshCylRead
|
|||
INTEGER, ALLOCATABLE:: n(:)
|
||||
|
||||
SELECT TYPE(elem)
|
||||
TYPE IS(meshVolCylQuad)
|
||||
TYPE IS(meshVol2DCylQuad)
|
||||
nNodes = 4
|
||||
ALLOCATE(localK(1:nNodes,1:nNodes))
|
||||
localK = elem%elemK()
|
||||
|
|
@ -572,7 +572,7 @@ MODULE moduleMeshCylRead
|
|||
n = (/ elem%n1%n, elem%n2%n, &
|
||||
elem%n3%n, elem%n4%n /)
|
||||
|
||||
TYPE IS(meshVolCylTria)
|
||||
TYPE IS(meshVol2DCylTria)
|
||||
nNodes = 3
|
||||
ALLOCATE(localK(1:nNodes,1:nNodes))
|
||||
localK = elem%elemK()
|
||||
|
|
@ -596,4 +596,4 @@ MODULE moduleMeshCylRead
|
|||
|
||||
END SUBROUTINE constructGlobalK
|
||||
|
||||
END MODULE moduleMeshCylRead
|
||||
END MODULE moduleMesh2DCylRead
|
||||
Loading…
Add table
Add a link
Reference in a new issue