Implementation of different time steps per species.

This commit is contained in:
Jorge Gonzalez 2020-12-01 17:37:22 +01:00
commit a5d5ceb53d
8 changed files with 80 additions and 38 deletions

View file

@ -74,7 +74,7 @@ MODULE moduleSolver
END SELECT
self%pushSpecies = .FALSE.
self%every = INT(tau/tauSp)
self%every = INT(tauSp/tau)
END SUBROUTINE initPusher
@ -123,10 +123,14 @@ MODULE moduleSolver
DO n=1, nPartOld
!Select species type
sp = partOld(n)%sp
!Push particle
CALL solver%pusher(sp)%pushParticle(partOld(n))
!Find cell in wich particle reside
CALL solver%updateParticleCell(partOld(n))
!Checks if the species sp is update this iteration
IF (solver%pusher(sp)%pushSpecies) THEN
!Push particle
CALL solver%pusher(sp)%pushParticle(partOld(n))
!Find cell in wich particle reside
CALL solver%updateParticleCell(partOld(n))
END IF
END DO
!$OMP END DO
@ -139,19 +143,22 @@ MODULE moduleSolver
IMPLICIT NONE
TYPE(particle), INTENT(inout):: part
REAL(8):: v_p_oh_star(2:3)
TYPE(particle):: part_temp
REAL(8):: tauSp
REAL(8):: x_new, y_new, r, sin_alpha, cos_alpha
REAL(8):: v_p_oh_star(2:3)
part_temp = part
!Time step for the species
tauSp = tau(part_temp%sp)
!z
part_temp%v(1) = part%v(1)
part_temp%r(1) = part%r(1) + part_temp%v(1)*tau
part_temp%r(1) = part%r(1) + part_temp%v(1)*tauSp
!r,theta
v_p_oh_star(2) = part%v(2)
x_new = part%r(2) + v_p_oh_star(2)*tau
x_new = part%r(2) + v_p_oh_star(2)*tauSp
v_p_oh_star(3) = part%v(3)
y_new = v_p_oh_star(3)*tau
y_new = v_p_oh_star(3)*tauSp
r = DSQRT(x_new**2+y_new**2)
part_temp%r(2) = r
IF (r > 0.D0) THEN
@ -181,19 +188,22 @@ MODULE moduleSolver
REAL(8):: v_p_oh_star(2:3)
TYPE(particle):: part_temp
REAL(8):: x_new, y_new, r, sin_alpha, cos_alpha
REAL(8):: qmEFt(1:3)!charge*tau*EF/mass
REAL(8):: tauSp
REAL(8):: qmEFt(1:3)!charge*tauSp*EF/mass
part_temp = part
!Time step for the species
tauSp = tau(part_temp%sp)
!Get electric field at particle position
qmEFt = part_temp%qm*gatherElecField(part_temp)*tau
qmEFt = part_temp%qm*gatherElecField(part_temp)*tauSp
!z
part_temp%v(1) = part%v(1) + qmEFt(1)
part_temp%r(1) = part%r(1) + part_temp%v(1)*tau
part_temp%r(1) = part%r(1) + part_temp%v(1)*tauSp
!r,theta
v_p_oh_star(2) = part%v(2) + qmEFt(2)
x_new = part%r(2) + v_p_oh_star(2)*tau
x_new = part%r(2) + v_p_oh_star(2)*tauSp
v_p_oh_star(3) = part%v(3) + qmEFt(3)
y_new = v_p_oh_star(3)*tau
y_new = v_p_oh_star(3)*tauSp
r = DSQRT(x_new**2+y_new**2)
part_temp%r(2) = r
IF (r > 0.D0) THEN