Random vector on a sphere: Difference between revisions

From SklogWiki
Jump to navigation Jump to search
No edit summary
m (Slight tidy)
Line 1: Line 1:
{{Source}}
The ability to generate a randomly orientated vector is very useful in [[Monte Carlo]] simulations of anisotropic [[models]]
The ability to generate a randomly orientated vector is very useful in [[Monte Carlo]] simulations of anisotropic [[models]]
or molecular systems.
or molecular systems.
==Marsaglia algorithm==  
==Marsaglia algorithm==  
This is the algorithm proposed by George Marsaglia (Ref. 1):
This is the algorithm proposed by George Marsaglia <ref name="Marsaglia">[http://dx.doi.org/10.1214/aoms/1177692644 George Marsaglia "Choosing a Point from the Surface of a Sphere", The Annals of Mathematical Statistics '''43''' pp. 645-646 (1972)]</ref>
*Independently generate V<sub>1</sub> and V<sub>2</sub>, taken from a uniform distribution on (-1,1) such that  
*Independently generate V<sub>1</sub> and V<sub>2</sub>, taken from a uniform distribution on (-1,1) such that  
:<math>S=(V_1^2+V_2^2) < 1</math>
:<math>S=(V_1^2+V_2^2) < 1</math>
*The random vector is then (Ref. 1 Eq. 4):
*The random vector is then (Eq. 4 in <ref name="Marsaglia"> </ref> ):
:<math>\left(2V_1 \sqrt{1-S},~ 2V_2 \sqrt{1-S},~ 1-2S\right)</math>
:<math>\left(2V_1 \sqrt{1-S},~ 2V_2 \sqrt{1-S},~ 1-2S\right)</math>
==Fortran 90 implementation==
==Fortran 90 implementation==
This Fortran 90 implementation is adapted from Ref. 2. The function '''ran()''' calls a  [[Random_numbers | randon number generator]]:
This Fortran 90 implementation is adapted from Ref. <ref>Daan Frenkel and Berend Smit "Understanding Molecular Simulation: From Algorithms to Applications" p. 410 Academic Press (1996)</ref> The function '''ran()''' calls a  [[Random_numbers | randon number generator]]:
<small><pre>
<small><pre>
!    The following is taken from Allen & Tildesley, p. 349
!    The following is taken from Allen & Tildesley, p. 349
Line 41: Line 40:


==References==
==References==
#[http://links.jstor.org/sici?sici=0003-4851%28197204%2943%3A2%3C645%3ACAPFTS%3E2.0.CO%3B2-%23 George Marsaglia "Choosing a Point from the Surface of a Sphere", The Annals of Mathematical Statistics '''43''' pp. 645-646 (1972)]
<references/>
#Daan Frenkel and Berend Smit "Understanding Molecular Simulation: From Algorithms to Applications" p. 410 Academic Press (1996)
'''Related reading'''
# M. P. Allen  and D. J. Tildesley "Computer Simulation of Liquids", p. 349 Clarendon Press (1989)
* M. P. Allen  and D. J. Tildesley "Computer Simulation of Liquids", p. 349 Clarendon Press (1989)
 
{{Source}}
[[category: random numbers]]
[[category: random numbers]]
[[category: computer simulation techniques]]
[[category: computer simulation techniques]]

Revision as of 12:54, 21 October 2010

The ability to generate a randomly orientated vector is very useful in Monte Carlo simulations of anisotropic models or molecular systems.

Marsaglia algorithm

This is the algorithm proposed by George Marsaglia [1]

  • Independently generate V1 and V2, taken from a uniform distribution on (-1,1) such that
  • The random vector is then (Eq. 4 in [1] ):

Fortran 90 implementation

This Fortran 90 implementation is adapted from Ref. [2] The function ran() calls a randon number generator:

!    The following is taken from Allen & Tildesley, p. 349
!    Generate a random vector towards a point in the unit sphere
!    Daniel Duque 2004

subroutine random_vector(vctr)

  implicit none

  real, dimension(3) :: vctr

  real:: ran1,ran2,ransq,ranh
  real:: ran

  do
     ran1=1.0-2.0*ran()
     ran2=1.0-2.0*ran()
     ransq=ran1**2+ran2**2
     if(ransq.le.1.0) exit
  enddo

  ranh=2.0*sqrt(1.0-ransq)

  vctr(1)=ran1*ranh
  vctr(2)=ran2*ranh
  vctr(3)=(1.0-2.0*ransq)

end subroutine random_vector

References

  1. 1.0 1.1 George Marsaglia "Choosing a Point from the Surface of a Sphere", The Annals of Mathematical Statistics 43 pp. 645-646 (1972)
  2. Daan Frenkel and Berend Smit "Understanding Molecular Simulation: From Algorithms to Applications" p. 410 Academic Press (1996)

Related reading

  • M. P. Allen and D. J. Tildesley "Computer Simulation of Liquids", p. 349 Clarendon Press (1989)
This page contains computer source code. If you intend to compile and use this code you must check for yourself the validity of the code. Please read the SklogWiki disclaimer.