SUBROUTINE sub5(npts,seed,output) C SUB5 generates gaussian deviates in OUTPUT. C independent C zero mean C unity variance INTEGER npts,seed REAL output(npts) INTEGER j DOUBLE PRECISION midpoint,scale,v1,v2,sumsq,squirt DOUBLE PRECISION dmagio1,dmagio2,dj1,dj2 dmagio1 = DBLE(7*7*7*7*7) dmagio2 = DBLE(1 + 2*(2**30 - 1)) dj2 = DBLE(seed) midpoint = DBLE(dmagio2)/2.0D0 scale = 2.0D0/(DBLE(dmagio2) - 1.0D0) DO j = 2,npts,2 111 dj1 = MOD(dmagio1*dj2,dmagio2) dj2 = MOD(dmagio1*dj1,dmagio2) C dj1 and dj2 cycle irregularly through the C integers 1 through (dmagio2 - 1) v1 = scale*(dj1 - midpoint) v2 = scale*(dj2 - midpoint) C v1 and v2 are the dj's scaled and shifted so that C they are uniformly distributed between -1 and 1 sumsq = v1**2 + v2**2 IF(sumsq.GE.1.0D0) THEN GO TO 111 ELSE END IF C this IF tosses out all points {v1,v2} not inside C the unit circle squirt = SQRT((-2.0D0*LOG(sumsq))/sumsq) output(j - 1) = SNGL(v1*squirt) output(j) = SNGL(v2*squirt) END DO RETURN END