Structure for 3D Cartesian Grid created.
Unification of boundary conditions into one file. Some changes to input file for reference cases. This should have been done in another branch but I wanto to commit to save progress and I don't want to deal with tswitching branches right now, I'm very busy watching Futurama.
This commit is contained in:
parent
eb6b045734
commit
ac2965621a
29 changed files with 1549 additions and 40455 deletions
|
|
@ -1,11 +1,8 @@
|
|||
all : moduleMesh2DCart.o moduleMesh2DCartBoundary.o moduleMesh2DCartRead.o
|
||||
all : moduleMesh2DCart.o moduleMesh2DCartRead.o
|
||||
|
||||
moduleMesh2DCart.o: moduleMesh2DCart.f90
|
||||
$(FC) $(FCFLAGS) -c $(subst .o,.f90,$@) -o $(OBJDIR)/$@
|
||||
|
||||
moduleMesh2DCartBoundary.o: moduleMesh2DCart.o moduleMesh2DCartBoundary.f90
|
||||
$(FC) $(FCFLAGS) -c $(subst .o,.f90,$@) -o $(OBJDIR)/$@
|
||||
|
||||
moduleMesh2DCartRead.o: moduleMesh2DCart.o moduleMesh2DCartBoundary.o moduleMesh2DCartRead.f90
|
||||
moduleMesh2DCartRead.o: moduleMesh2DCart.o moduleMesh2DCartRead.f90
|
||||
$(FC) $(FCFLAGS) -c $(subst .o,.f90,$@) -o $(OBJDIR)/$@
|
||||
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
! z == unused
|
||||
MODULE moduleMesh2DCart
|
||||
USE moduleMesh
|
||||
USE moduleMeshBoundary
|
||||
IMPLICIT NONE
|
||||
|
||||
!Values for Gauss integral
|
||||
|
|
@ -31,50 +32,11 @@ MODULE moduleMesh2DCart
|
|||
CONTAINS
|
||||
PROCEDURE, PASS:: init => initEdge2DCart
|
||||
PROCEDURE, PASS:: getNodes => getNodes2DCart
|
||||
PROCEDURE, PASS:: intersection => intersection2DCartEdge
|
||||
PROCEDURE, PASS:: randPos => randPosEdge
|
||||
|
||||
END TYPE meshEdge2DCart
|
||||
|
||||
!Boundary functions defined in the submodule Boundary
|
||||
INTERFACE
|
||||
MODULE SUBROUTINE reflection(edge, part)
|
||||
USE moduleSpecies
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshEdge), INTENT(inout):: edge
|
||||
CLASS(particle), INTENT(inout):: part
|
||||
|
||||
END SUBROUTINE reflection
|
||||
|
||||
MODULE SUBROUTINE absorption(edge, part)
|
||||
USE moduleSpecies
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshEdge), INTENT(inout):: edge
|
||||
CLASS(particle), INTENT(inout):: part
|
||||
|
||||
END SUBROUTINE absorption
|
||||
|
||||
MODULE SUBROUTINE wallTemperature(edge, part)
|
||||
USE moduleSpecies
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshEdge), INTENT(inout):: edge
|
||||
CLASS(particle), INTENT(inout):: part
|
||||
|
||||
END SUBROUTINE wallTemperature
|
||||
|
||||
MODULE SUBROUTINE transparent(edge, part)
|
||||
USE moduleSpecies
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshEdge), INTENT(inout):: edge
|
||||
CLASS(particle), INTENT(inout):: part
|
||||
|
||||
END SUBROUTINE transparent
|
||||
|
||||
END INTERFACE
|
||||
|
||||
TYPE, PUBLIC, ABSTRACT, EXTENDS(meshVol):: meshVol2DCart
|
||||
CONTAINS
|
||||
PROCEDURE, PASS:: detJac => detJ2DCart
|
||||
|
|
@ -295,6 +257,23 @@ MODULE moduleMesh2DCart
|
|||
|
||||
END FUNCTION getNodes2DCart
|
||||
|
||||
PURE FUNCTION intersection2DCartEdge(self, r0, v0) RESULT(r)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshEdge2DCart), INTENT(in):: self
|
||||
REAL(8), DIMENSION(1:3), INTENT(in):: r0, v0
|
||||
REAL(8), DIMENSION(1:3):: r
|
||||
REAL(8), DIMENSION(1:3):: rS !base point of surface
|
||||
REAL(8):: d
|
||||
|
||||
rS = (/ self%x(1), self%y(1), 0.D0 /)
|
||||
|
||||
d = DOT_PRODUCT((rS - r0), self%normal)/DOT_PRODUCT(v0, self%normal)
|
||||
|
||||
r = r0 + v0*d
|
||||
|
||||
END FUNCTION intersection2DCartEdge
|
||||
|
||||
!Calculates a random position in edge
|
||||
FUNCTION randPosEdge(self) RESULT(r)
|
||||
USE moduleRandom
|
||||
|
|
@ -365,7 +344,7 @@ MODULE moduleMesh2DCart
|
|||
self%arNodes = 0.D0
|
||||
!2D 1 point Gauss Quad Integral
|
||||
xi = 0.D0
|
||||
detJ = self%detJac(xi)*4.D0 !4*2*pi
|
||||
detJ = self%detJac(xi)*4.D0 !4
|
||||
fPsi = self%fPsi(xi)
|
||||
self%volume = detJ
|
||||
self%arNodes = fPsi*detJ
|
||||
|
|
@ -930,7 +909,6 @@ MODULE moduleMesh2DCart
|
|||
REAL(8):: dPsiR(1:2,1:3)!Derivative of shpae functions in global coordinates
|
||||
REAL(8):: invJ(1:2,1:2), detJ
|
||||
REAL(8):: phi(1:3)
|
||||
REAL(8):: dummy
|
||||
REAL(8):: EF(1:3)
|
||||
|
||||
phi = (/self%n1%emData%phi, &
|
||||
|
|
|
|||
|
|
@ -1,154 +0,0 @@
|
|||
!moduleMesh2DCartBoundary: Boundary functions for cylindrical coordinates
|
||||
SUBMODULE (moduleMesh2DCart) moduleMesh2DCartBoundary
|
||||
USE moduleMesh2DCart
|
||||
|
||||
CONTAINS
|
||||
SUBROUTINE reflection(edge, part)
|
||||
USE moduleSpecies
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshEdge), INTENT(inout):: edge
|
||||
CLASS(particle), INTENT(inout):: part
|
||||
REAL(8):: edgeNorm, cosT, sinT, rp(1:2), rpp(1:2), vpp(1:2)
|
||||
|
||||
!TODO: Try to do this without select
|
||||
SELECT TYPE(edge)
|
||||
TYPE IS(meshEdge2DCart)
|
||||
edgeNorm = DSQRT((edge%y(2)-edge%y(1))**2 + (edge%x(2)-edge%x(1))**2)
|
||||
cosT = (edge%x(2)-edge%x(1))/edgeNorm
|
||||
sinT = DSQRT(1-cosT**2)
|
||||
|
||||
rp(1) = part%r(1) - edge%x(1);
|
||||
rp(2) = part%r(2) - edge%y(1);
|
||||
|
||||
rpp(1) = cosT*rp(1) - sinT*rp(2)
|
||||
rpp(2) = sinT*rp(1) + cosT*rp(2)
|
||||
rpp(2) = -rpp(2)
|
||||
|
||||
vpp(1) = cosT*part%v(1) - sinT*part%v(2)
|
||||
vpp(2) = sinT*part%v(1) + cosT*part%v(2)
|
||||
vpp(2) = -vpp(2)
|
||||
|
||||
part%r(1) = cosT*rpp(1) + sinT*rpp(2) + edge%x(1);
|
||||
part%r(2) = -sinT*rpp(1) + cosT*rpp(2) + edge%y(1);
|
||||
part%v(1) = cosT*vpp(1) + sinT*vpp(2)
|
||||
part%v(2) = -sinT*vpp(1) + cosT*vpp(2)
|
||||
|
||||
END SELECT
|
||||
|
||||
part%n_in = .TRUE.
|
||||
|
||||
END SUBROUTINE reflection
|
||||
|
||||
!Absoption in a surface
|
||||
SUBROUTINE absorption(edge, part)
|
||||
USE moduleSpecies
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshEdge), INTENT(inout):: edge
|
||||
CLASS(particle), INTENT(inout):: part
|
||||
REAL(8):: rEdge(1:2) !Position of particle projected to the edge
|
||||
REAL(8):: a, b, c
|
||||
REAL(8):: a2b2
|
||||
REAL(8):: d !Distance from particle to edge
|
||||
|
||||
SELECT TYPE(edge)
|
||||
TYPE IS(meshEdge2DCart)
|
||||
a = (edge%x(1) - edge%x(2))
|
||||
b = (edge%y(1) - edge%y(2))
|
||||
c = edge%x(1)*edge%y(2) - edge%x(2)*edge%y(1)
|
||||
|
||||
a2b2 = a**2 + b**2
|
||||
|
||||
rEdge(1) = (b*( b*part%r(1) - a*part%r(2)) - a*c)/a2b2
|
||||
rEdge(2) = (a*(-b*part%r(1) + a*part%r(2)) - b*c)/a2b2
|
||||
|
||||
d = NORM2(rEdge - part%r(1:2))
|
||||
!Reduce weight of particle by the distance to the edge and move it to the edge
|
||||
IF (d > 0.D0) THEN
|
||||
part%weight = part%weight / d
|
||||
part%r(1:2) = rEdge
|
||||
|
||||
END IF
|
||||
|
||||
!Scatter particle in associated volume
|
||||
IF (ASSOCIATED(edge%e1)) THEN
|
||||
CALL edge%e1%scatter(part)
|
||||
|
||||
ELSE
|
||||
CALL edge%e2%scatter(part)
|
||||
|
||||
END IF
|
||||
|
||||
END SELECT
|
||||
|
||||
!Remove particle from the domain
|
||||
part%n_in = .FALSE.
|
||||
|
||||
END SUBROUTINE absorption
|
||||
|
||||
!Transparent boundary condition
|
||||
SUBROUTINE transparent(edge, part)
|
||||
USE moduleSpecies
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshEdge), INTENT(inout):: edge
|
||||
CLASS(particle), INTENT(inout):: part
|
||||
|
||||
!Removes particle from domain
|
||||
part%n_in = .FALSE.
|
||||
|
||||
END SUBROUTINE transparent
|
||||
|
||||
!Wall with temperature
|
||||
SUBROUTINE wallTemperature(edge, part)
|
||||
USE moduleSpecies
|
||||
USE moduleBoundary
|
||||
USE moduleRandom
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(meshEdge), INTENT(inout):: edge
|
||||
CLASS(particle), INTENT(inout):: part
|
||||
REAL(8):: edgeNorm, cosT, sinT, rp(1:2), rpp(1:2), vpp(1:2)
|
||||
INTEGER:: i
|
||||
|
||||
!Modifies particle velocity according to wall temperature
|
||||
SELECT TYPE(bound => edge%boundary%bTypes(part%sp)%obj)
|
||||
TYPE IS(boundaryWallTemperature)
|
||||
DO i = 1, 3
|
||||
part%v(i) = part%v(i) + bound%vTh*randomMaxwellian()
|
||||
|
||||
END DO
|
||||
|
||||
END SELECT
|
||||
|
||||
!Reflects particle in the edge
|
||||
SELECT TYPE(edge)
|
||||
TYPE IS(meshEdge2DCart)
|
||||
edgeNorm = DSQRT((edge%y(2)-edge%y(1))**2 + (edge%x(2)-edge%x(1))**2)
|
||||
cosT = (edge%x(2)-edge%x(1))/edgeNorm
|
||||
sinT = DSQRT(1-cosT**2)
|
||||
|
||||
rp(1) = part%r(1) - edge%x(1);
|
||||
rp(2) = part%r(2) - edge%y(1);
|
||||
|
||||
rpp(1) = cosT*rp(1) - sinT*rp(2)
|
||||
rpp(2) = sinT*rp(1) + cosT*rp(2)
|
||||
rpp(2) = -rpp(2)
|
||||
|
||||
vpp(1) = cosT*part%v(1) - sinT*part%v(2)
|
||||
vpp(2) = sinT*part%v(1) + cosT*part%v(2)
|
||||
vpp(2) = -vpp(2)
|
||||
|
||||
part%r(1) = cosT*rpp(1) + sinT*rpp(2) + edge%x(1);
|
||||
part%r(2) = -sinT*rpp(1) + cosT*rpp(2) + edge%y(1);
|
||||
part%v(1) = cosT*vpp(1) + sinT*vpp(2)
|
||||
part%v(2) = -sinT*vpp(1) + cosT*vpp(2)
|
||||
|
||||
END SELECT
|
||||
|
||||
part%n_in = .TRUE.
|
||||
|
||||
END SUBROUTINE wallTemperature
|
||||
|
||||
END SUBMODULE moduleMesh2DCartBoundary
|
||||
|
|
@ -65,7 +65,7 @@ MODULE moduleMesh2DCartRead
|
|||
ALLOCATE(self%IPIV(1:self%numNodes,1:self%numNodes))
|
||||
self%K = 0.D0
|
||||
self%IPIV = 0
|
||||
!Read nodes cartesian coordinates (x=x, y=y, z=null)
|
||||
!Read node cartesian coordinates (x=x, y=y, z=null)
|
||||
DO e=1, self%numNodes
|
||||
READ(10, *) n, x, y
|
||||
ALLOCATE(meshNode2DCart:: self%nodes(n)%obj)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue