Correction with conservation
Now the method is much better in conserving total energy. However, still there is an issue with collisions between species of dispaprate mass.
This commit is contained in:
parent
601103105f
commit
6113ac3305
2 changed files with 59 additions and 47 deletions
|
|
@ -966,7 +966,6 @@ MODULE moduleMesh
|
|||
INTEGER:: i, j
|
||||
INTEGER:: n
|
||||
TYPE(lNode), POINTER:: partTemp
|
||||
REAL(8):: W(3), dW(2) !Relative velocity between particle and species and its increment
|
||||
INTEGER(8), ALLOCATABLE:: cellNodes(:)
|
||||
CLASS(meshNode), POINTER:: node
|
||||
TYPE(outputFormat):: output
|
||||
|
|
@ -974,7 +973,8 @@ MODULE moduleMesh
|
|||
REAL(8):: density, velocity(1:3), temperature!values at particle position
|
||||
REAL(8), DIMENSION(1:3):: e1, e2, e3
|
||||
REAL(8):: delta_par, delta_par_square, delta_per, delta_per_square
|
||||
REAL(8):: l, lW, AW
|
||||
REAL(8):: W(3), dW(2), normW !Relative velocity between particle and species and its increment
|
||||
REAL(8):: l2, l, lW, AW
|
||||
REAL(8):: rnd
|
||||
|
||||
|
||||
|
|
@ -1007,12 +1007,25 @@ MODULE moduleMesh
|
|||
density = cell%gatherF(partTemp%part%Xi, cell%nNodes, densityNodes)
|
||||
velocity = cell%gatherF(partTemp%part%Xi, cell%nNodes, velocityNodes)
|
||||
temperature = cell%gatherF(partTemp%part%Xi, cell%nNodes, temperatureNodes)
|
||||
l = coulombMatrix(k)%l_j/SQRT(temperature)
|
||||
|
||||
l2 = coulombMatrix(k)%l2_j/temperature
|
||||
l = SQRT(l2)
|
||||
|
||||
W = partTemp%part%v - velocity
|
||||
lW = l * NORM2(W)
|
||||
AW = coulombMatrix(k)%A_ij/NORM2(W)
|
||||
!Axis of the relative velocity
|
||||
normW = NORM2(W)
|
||||
lW = l * normW
|
||||
AW = coulombMatrix(k)%A_i/normW
|
||||
|
||||
delta_par = -coulombMatrix(k)%A_i*coulombMatrix(k)%one_plus_massRatio_ij*density*l2*G(lW)
|
||||
|
||||
delta_par_square = AW*density*G(lW)
|
||||
|
||||
delta_per_square = AW*density*H(lW)
|
||||
|
||||
dW(1) = delta_par*tauMin + randomMaxwellian()*SQRT(delta_par_square*tauMin)
|
||||
dW(2) = ABS(randomMaxwellian()*SQRT(delta_per_square*tauMin))
|
||||
|
||||
!System of reference for the velocity change
|
||||
!First one is parallel to the relative velocity
|
||||
e1 = normalize(W)
|
||||
!Second one is perpendicular to it
|
||||
|
|
@ -1024,18 +1037,12 @@ MODULE moduleMesh
|
|||
e3 = crossProduct(e2, e1)
|
||||
e3 = normalize(e3)
|
||||
|
||||
delta_par = -coulombMatrix(k)%A_ij*coulombMatrix(k)%one_plus_massRatio_ij*density*l**2*G(lW)
|
||||
!Random number for direction
|
||||
rnd = PI2*random()
|
||||
|
||||
delta_par_square = AW*density*G(lW)
|
||||
|
||||
delta_per_square = AW*density*H(lW)
|
||||
|
||||
dW(1) = delta_par*tauMin + randomMaxwellian()*SQRT(delta_par_square*tauMin)
|
||||
dW(2) = DABS(randomMaxwellian()*SQRT(delta_per_square*tauMin))
|
||||
|
||||
rnd = random()
|
||||
partTemp%part%v = partTemp%part%v + dW(1)*e1 + dW(2)*(COS(PI2*rnd)*e2 + &
|
||||
SIN(PI2*rnd)*e3)
|
||||
!Change particle velocity
|
||||
partTemp%part%v = partTemp%part%v + dW(1)*e1 + dW(2)*(COS(rnd)*e2 + &
|
||||
SIN(rnd)*e3)
|
||||
|
||||
partTemp => partTemp%next
|
||||
|
||||
|
|
@ -1049,20 +1056,33 @@ MODULE moduleMesh
|
|||
densityNodes(n) = output%density/n_ref
|
||||
velocityNodes(n,1:3) = output%velocity(1:3)/v_ref
|
||||
temperatureNodes(n) = output%temperature/T_ref
|
||||
|
||||
|
||||
END DO
|
||||
|
||||
|
||||
partTemp => cell%listPart_in(j)%head
|
||||
DO WHILE(ASSOCIATED(partTemp))
|
||||
density = cell%gatherF(partTemp%part%Xi, cell%nNodes, densityNodes)
|
||||
velocity = cell%gatherF(partTemp%part%Xi, cell%nNodes, velocityNodes)
|
||||
temperature = cell%gatherF(partTemp%part%Xi, cell%nNodes, temperatureNodes)
|
||||
l = coulombMatrix(k)%l_i/SQRT(temperature)
|
||||
|
||||
|
||||
l2 = coulombMatrix(k)%l2_i/temperature
|
||||
l = SQRT(l2)
|
||||
|
||||
W = partTemp%part%v - velocity
|
||||
lW = l * NORM2(W)
|
||||
AW = coulombMatrix(k)%A_ji/NORM2(W)
|
||||
!Axis of the relative velocity
|
||||
normW = NORM2(W)
|
||||
lW = l * normW
|
||||
AW = coulombMatrix(k)%A_j/normW
|
||||
|
||||
delta_par = -coulombMatrix(k)%A_j*coulombMatrix(k)%one_plus_massRatio_ji*density*l2*G(lW)
|
||||
|
||||
delta_par_square = AW*density*G(lW)
|
||||
|
||||
delta_per_square = AW*density*H(lW)
|
||||
|
||||
dW(1) = delta_par*tauMin + randomMaxwellian()*SQRT(delta_par_square*tauMin)
|
||||
dW(2) = ABS(randomMaxwellian()*SQRT(delta_per_square*tauMin))
|
||||
|
||||
!System of reference for the velocity change
|
||||
!First one is parallel to the relative velocity
|
||||
e1 = normalize(W)
|
||||
!Second one is perpendicular to it
|
||||
|
|
@ -1073,24 +1093,15 @@ MODULE moduleMesh
|
|||
!Third one is perpendicular to the other two
|
||||
e3 = crossProduct(e2, e1)
|
||||
e3 = normalize(e3)
|
||||
|
||||
delta_par = -coulombMatrix(k)%A_ji*coulombMatrix(k)%one_plus_massRatio_ji*density*l**2*G(lW)
|
||||
|
||||
delta_par_square = AW*density*G(lW)
|
||||
|
||||
delta_per_square = AW*density*H(lW)
|
||||
|
||||
dW(1) = delta_par*tauMin + randomMaxwellian()*SQRT(delta_par_square*tauMin)
|
||||
dW(2) = DABS(randomMaxwellian()*SQRT(delta_per_square*tauMin))
|
||||
|
||||
rnd = random()
|
||||
partTemp%part%v = partTemp%part%v + dW(1)*e1 + dW(2)*(COS(PI2*rnd)*e2 + &
|
||||
SIN(PI2*rnd)*e3)
|
||||
|
||||
|
||||
rnd = PI2*random()
|
||||
partTemp%part%v = partTemp%part%v + dW(1)*e1 + dW(2)*(COS(rnd)*e2 + &
|
||||
SIN(rnd)*e3)
|
||||
|
||||
partTemp => partTemp%next
|
||||
|
||||
|
||||
END DO
|
||||
|
||||
|
||||
END IF
|
||||
|
||||
END DO
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue