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
|
|
@ -67,15 +67,31 @@ MODULE moduleSolver
|
|||
REAL(8):: tau, tauSp
|
||||
|
||||
SELECT CASE(pusherType)
|
||||
!2D Cylindrical
|
||||
CASE('2DCylNeutral')
|
||||
self%pushParticle => pushCylNeutral
|
||||
self%pushParticle => push2DCylNeutral
|
||||
|
||||
CASE('2DCylCharged')
|
||||
self%pushParticle => pushCylCharged
|
||||
self%pushParticle => push2DCylCharged
|
||||
|
||||
!2D Cartesian
|
||||
CASE('2DCartNeutral')
|
||||
self%pushParticle => push2DCartNeutral
|
||||
|
||||
CASE('2DCartCharged')
|
||||
self%pushParticle => push2DCartCharged
|
||||
|
||||
!1D Cartesian
|
||||
CASE('1DCartNeutral')
|
||||
self%pushParticle => push1DCartNeutral
|
||||
|
||||
CASE('1DCartCharged')
|
||||
self%pushParticle => push1DCartCharged
|
||||
|
||||
!1D Radial
|
||||
CASE('1DRadNeutral')
|
||||
self%pushParticle => push1DRadNeutral
|
||||
|
||||
CASE('1DRadCharged')
|
||||
self%pushParticle => push1DRadCharged
|
||||
|
||||
|
|
@ -147,7 +163,7 @@ MODULE moduleSolver
|
|||
END SUBROUTINE doPushes
|
||||
|
||||
!Push one particle. Boris pusher for 2D Cyl Neutral particle
|
||||
PURE SUBROUTINE pushCylNeutral(part, tauIn)
|
||||
PURE SUBROUTINE push2DCylNeutral(part, tauIn)
|
||||
USE moduleSpecies
|
||||
IMPLICIT NONE
|
||||
|
||||
|
|
@ -181,10 +197,10 @@ MODULE moduleSolver
|
|||
!Copy temporal particle to particle
|
||||
part=part_temp
|
||||
|
||||
END SUBROUTINE pushCylNeutral
|
||||
END SUBROUTINE push2DCylNeutral
|
||||
|
||||
!Push one particle. Boris pusher for 2D Cyl Charged particle
|
||||
PURE SUBROUTINE pushCylCharged(part, tauIn)
|
||||
PURE SUBROUTINE push2DCylCharged(part, tauIn)
|
||||
USE moduleSpecies
|
||||
USE moduleEM
|
||||
IMPLICIT NONE
|
||||
|
|
@ -222,7 +238,83 @@ MODULE moduleSolver
|
|||
!Copy temporal particle to particle
|
||||
part=part_temp
|
||||
|
||||
END SUBROUTINE pushCylCharged
|
||||
END SUBROUTINE push2DCylCharged
|
||||
|
||||
!Push neutral particles in 2D cartesian coordinates
|
||||
PURE SUBROUTINE push2DCartNeutral(part, tauIn)
|
||||
USE moduleSPecies
|
||||
IMPLICIT NONE
|
||||
|
||||
TYPE(particle), INTENT(inout):: part
|
||||
REAL(8), INTENT(in):: tauIn
|
||||
TYPE(particle):: part_temp
|
||||
|
||||
part_temp = part
|
||||
|
||||
!x
|
||||
part_temp%v(1) = part%v(1)
|
||||
part_temp%r(1) = part%r(1) + part_temp%v(1)*tauIn
|
||||
|
||||
!y
|
||||
part_temp%v(2) = part%v(2)
|
||||
part_temp%r(2) = part%r(2) + part_temp%v(2)*tauIn
|
||||
|
||||
part_temp%n_in = .FALSE.
|
||||
|
||||
part = part_temp
|
||||
|
||||
END SUBROUTINE push2DCartNeutral
|
||||
|
||||
!Push charged particles in 2D cartesian coordinates
|
||||
PURE SUBROUTINE push2DCartCharged(part, tauIn)
|
||||
USE moduleSPecies
|
||||
USE moduleEM
|
||||
IMPLICIT NONE
|
||||
|
||||
TYPE(particle), INTENT(inout):: part
|
||||
REAL(8), INTENT(in):: tauIn
|
||||
TYPE(particle):: part_temp
|
||||
REAL(8):: qmEFt(1:3)
|
||||
|
||||
part_temp = part
|
||||
!Get the electric field at particle position
|
||||
qmEFt = part_temp%qm*gatherElecField(part_temp)*tauIn
|
||||
|
||||
!x
|
||||
part_temp%v(1) = part%v(1) + qmEFt(1)
|
||||
part_temp%r(1) = part%r(1) + part_temp%v(1)*tauIn
|
||||
|
||||
!y
|
||||
part_temp%v(2) = part%v(2) + qmEFt(2)
|
||||
part_temp%r(2) = part%r(2) + part_temp%v(2)*tauIn
|
||||
|
||||
part_temp%n_in = .FALSE.
|
||||
|
||||
part = part_temp
|
||||
|
||||
END SUBROUTINE push2DCartCharged
|
||||
|
||||
!Push neutral particles in 1D cartesian coordinates
|
||||
PURE SUBROUTINE push1DCartNeutral(part, tauIn)
|
||||
USE moduleSPecies
|
||||
USE moduleEM
|
||||
IMPLICIT NONE
|
||||
|
||||
TYPE(particle), INTENT(inout):: part
|
||||
REAL(8), INTENT(in):: tauIn
|
||||
TYPE(particle):: part_temp
|
||||
|
||||
part_temp = part
|
||||
|
||||
!x
|
||||
part_temp%v(1) = part%v(1)
|
||||
part_temp%r(1) = part%r(1) + part_temp%v(1)*tauIn
|
||||
|
||||
part_temp%n_in = .FALSE.
|
||||
|
||||
part = part_temp
|
||||
|
||||
END SUBROUTINE push1DCartNeutral
|
||||
|
||||
!Push charged particles in 1D cartesian coordinates
|
||||
PURE SUBROUTINE push1DCartCharged(part, tauIn)
|
||||
|
|
@ -249,6 +341,41 @@ MODULE moduleSolver
|
|||
|
||||
END SUBROUTINE push1DCartCharged
|
||||
|
||||
!Push one particle. Boris pusher for 1D Radial Neutral particle
|
||||
PURE SUBROUTINE push1DRadNeutral(part, tauIn)
|
||||
USE moduleSpecies
|
||||
USE moduleEM
|
||||
IMPLICIT NONE
|
||||
|
||||
TYPE(particle), INTENT(inout):: part
|
||||
REAL(8), INTENT(in):: tauIn
|
||||
REAL(8):: v_p_oh_star(1:2)
|
||||
TYPE(particle):: part_temp
|
||||
REAL(8):: x_new, y_new, r, sin_alpha, cos_alpha
|
||||
|
||||
part_temp = part
|
||||
!r,theta
|
||||
v_p_oh_star(1) = part%v(1)
|
||||
x_new = part%r(1) + v_p_oh_star(1)*tauIn
|
||||
v_p_oh_star(2) = part%v(2)
|
||||
y_new = v_p_oh_star(2)*tauIn
|
||||
r = DSQRT(x_new**2+y_new**2)
|
||||
part_temp%r(1) = r
|
||||
IF (r > 0.D0) THEN
|
||||
sin_alpha = y_new/r
|
||||
cos_alpha = x_new/r
|
||||
ELSE
|
||||
sin_alpha = 0.D0
|
||||
cos_alpha = 1.D0
|
||||
END IF
|
||||
part_temp%v(1) = cos_alpha*v_p_oh_star(1)+sin_alpha*v_p_oh_star(2)
|
||||
part_temp%v(2) = -sin_alpha*v_p_oh_star(1)+cos_alpha*v_p_oh_star(2)
|
||||
part_temp%n_in = .FALSE. !Assume particle is outside until cell is found
|
||||
!Copy temporal particle to particle
|
||||
part=part_temp
|
||||
|
||||
END SUBROUTINE push1DRadNeutral
|
||||
|
||||
!Push one particle. Boris pusher for 1D Radial Charged particle
|
||||
PURE SUBROUTINE push1DRadCharged(part, tauIn)
|
||||
USE moduleSpecies
|
||||
|
|
@ -263,7 +390,6 @@ MODULE moduleSolver
|
|||
REAL(8):: qmEFt(1:3)!charge*tauIn*EF/mass
|
||||
|
||||
part_temp = part
|
||||
!Time step for the species
|
||||
!Get electric field at particle position
|
||||
qmEFt = part_temp%qm*gatherElecField(part_temp)*tauMin
|
||||
!r,theta
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue