Random vector on a sphere: Difference between revisions

From SklogWiki
Jump to navigation Jump to search
m (Typo.)
m (Clarified a reference)
 
(4 intermediate revisions by the same user not shown)
Line 2: Line 2:
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 Refs. <ref>[http://molsim.chem.uva.nl/frenkel_smit Daan Frenkel and Berend Smit "Understanding Molecular Simulation: From Algorithms to Applications", Second Edition (2002)] Algorithm 42 (p. 578)</ref> and <ref>[http://www.oup.com/uk/catalogue/?ci=9780198556459 M. P. Allen and D. J. Tildesley "Computer Simulation of Liquids", Oxford University Press (1989)] Appendix G.5 (p. 349) </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 40: 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)
==External links==
# M. P. Allen  and D. J. Tildesley "Computer Simulation of Liquids", p. 349 Clarendon Press (1989)
*[http://mathworld.wolfram.com/SpherePointPicking.html Sphere Point Picking] from Wolfram MathWorld
 
{{Source}}
[[category: random numbers]]
[[category: random numbers]]
[[category: computer simulation techniques]]
[[category: computer simulation techniques]]

Latest revision as of 14:55, 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[edit]

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[edit]

This Fortran 90 implementation is adapted from Refs. [2] and [3]. 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[edit]

External links[edit]

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.