diff --git a/src/modules/common/moduleRandom.f90 b/src/modules/common/moduleRandom.f90 index 1b8ec67..156f5e4 100644 --- a/src/modules/common/moduleRandom.f90 +++ b/src/modules/common/moduleRandom.f90 @@ -48,23 +48,24 @@ MODULE moduleRandom END FUNCTION randomIntAB !Returns a random number in a Maxwellian distribution of mean 0 and width 1 with the Box-Muller Method - function randomMaxwellian() result(rnd) - USE moduleConstParam, only: pi - implicit none + FUNCTION randomMaxwellian() RESULT(rnd) + USE moduleConstParam, ONLY: PI + IMPLICIT NONE - real(8):: rnd - real(8):: v1, v2, Rsquare + REAL(8):: rnd + REAL(8):: v1, v2, Rsquare - v1 = 0.d0 - do while (v1 <= 0.d0) - v1 = random() + Rsquare = 1.D0 + do while (Rsquare >= 1.D0 .and. Rsquare > 0.D0) + v1 = 2.D0 * random() - 1.D0 + v2 = 2.D0 * random() - 1.D0 + Rsquare = v1**2 + v2**2 end do - v2 = random() - rnd = sqrt(-2.d0*log(v1))*cos(2*pi*v2) + rnd = v2 * sqrt(-2.D0 * log(Rsquare) / Rsquare) - end function randomMaxwellian + END FUNCTION randomMaxwellian !Returns a random number in a Maxwellian distribution of mean 0 and width 1 FUNCTION randomHalfMaxwellian() RESULT(rnd) diff --git a/src/modules/moduleInject.f90 b/src/modules/moduleInject.f90 index 099f4a7..0d761ea 100644 --- a/src/modules/moduleInject.f90 +++ b/src/modules/moduleInject.f90 @@ -257,7 +257,7 @@ MODULE moduleInject CLASS(velDistGeneric), ALLOCATABLE, INTENT(out):: velDist REAL(8), INTENT(in):: temperature, m - velDist = velDistMaxwellian(vTh = DSQRT(2.d0*temperature/m)) + velDist = velDistMaxwellian(vTh = DSQRT(temperature/m)) END SUBROUTINE initVelDistMaxwellian @@ -267,7 +267,7 @@ MODULE moduleInject CLASS(velDistGeneric), ALLOCATABLE, INTENT(out):: velDist REAL(8), INTENT(in):: temperature, m - velDist = velDistHalfMaxwellian(vTh = DSQRT(2.d0*temperature/m)) + velDist = velDistHalfMaxwellian(vTh = DSQRT(temperature/m)) END SUBROUTINE initVelDistHalfMaxwellian @@ -289,7 +289,7 @@ MODULE moduleInject REAL(8):: v v = 0.D0 - v = self%vTh*randomMaxwellian()/sqrt(2.d0) + v = sqrt(2.0)*self%vTh*randomMaxwellian() END FUNCTION randomVelMaxwellian @@ -302,7 +302,7 @@ MODULE moduleInject REAL(8):: v v = 0.D0 - v = self%vTh*randomHalfMaxwellian()/sqrt(2.d0) + v = sqrt(2.0)*self%vTh*randomHalfMaxwellian() END FUNCTION randomVelHalfMaxwellian