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