MODULE gauss IMPLICIT NONE CONTAINS SUBROUTINE gasdev(q) IMPLICIT NONE REAL(8),INTENT(out)::q REAL(8)::rsq,q1,q2 REAL(8),save::g logical,save::gaus_stored=.false. IF(gaus_stored) THEN q=g gaus_stored=.false. ELSE DO CALL random_number(q1) CALL random_number(q2) q1=2.0_8*q1-1.0_8 q2=2.0_8*q2-1.0_8 rsq=q1**2+q2**2 IF(rsq>0.0.and.rsq<1.0)EXIT END DO rsq=SQRT(-2.0_8*log(rsq)/rsq) q=q1*rsq g=q2*rsq gaus_stored=.true. END IF END SUBROUTINE gasdev END MODULE gauss