Random vector on a sphere: Difference between revisions
		
		
		
		Jump to navigation
		Jump to search
		
| No edit summary | Carl McBride (talk | contribs)   (Added description of Marsaglia algorithm) | ||
| Line 1: | Line 1: | ||
| Fortran 90 implementation from Ref. 2. ran()  | 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 (Ref. 1): | |||
| *Independently generate V<sub>1</sub> and V<sub>2</sub>, taken from a unifor distribution on (-1,1) such that  | |||
| :<math>S=(V_1^2+V_2^2) < 1</math> | |||
| *The random vector is then (Ref. 1 Eq. 4): | |||
| :<math>\left(2V_1 \sqrt{1-S},~ 2V_2 \sqrt{1-S},~ 1-2S\right)</math> | |||
| ==Fortran 90 implementation== | |||
| This Fortran 90 implementation is adapted from Ref. 2. 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 32: | Line 41: | ||
| ==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)] | #[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)] | ||
| #Daan Frenkel and Berend Smit "Understanding Molecular Simulation: From Algorithms to Applications" p. 410 Academic Press (1996) | #Daan Frenkel and Berend Smit "Understanding Molecular Simulation: From Algorithms to Applications" p. 410 Academic Press (1996) | ||
| # M.P. Allen  | # M. P. Allen  and D. J. Tildesley "Computer Simulation of Liquids", p. 349 Clarendon Press (1989) | ||
| [[category: random numbers]] | [[category: random numbers]] | ||
| [[category: computer simulation techniques]] | [[category: computer simulation techniques]] | ||
Revision as of 13:43, 30 October 2007
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 (Ref. 1):
- Independently generate V1 and V2, taken from a unifor distribution on (-1,1) such that
- The random vector is then (Ref. 1 Eq. 4):
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
- George Marsaglia "Choosing a Point from the Surface of a Sphere", The Annals of Mathematical Statistics 43 pp. 645-646 (1972)
- Daan Frenkel and Berend Smit "Understanding Molecular Simulation: From Algorithms to Applications" p. 410 Academic Press (1996)
- M. P. Allen and D. J. Tildesley "Computer Simulation of Liquids", p. 349 Clarendon Press (1989)