rand_int64 Subroutine

private subroutine rand_int64(irand)

Arguments

Type IntentOptional AttributesName
integer(kind=8), intent(out), optional :: irand

Called by

proc~~rand_int64~~CalledByGraph proc~rand_int64 rand_int64 proc~rand_real rand_real proc~rand_real->proc~rand_int64 interface~u_random u_random interface~u_random->proc~rand_int64 interface~u_random->proc~rand_real proc~rand_int32 rand_int32 interface~u_random->proc~rand_int32 proc~rand_real_array rand_real_array interface~u_random->proc~rand_real_array proc~rand_int32->proc~rand_int64 proc~init_u_random init_u_random proc~init_u_random->proc~rand_int64 proc~rand_real_array->proc~rand_int64 proc~disk disk proc~disk->proc~init_u_random proc~gaussian_torus gaussian_torus proc~gaussian_torus->proc~init_u_random proc~elliptic_torus elliptic_torus proc~elliptic_torus->proc~init_u_random proc~exponential_elliptic_torus exponential_elliptic_torus proc~exponential_elliptic_torus->proc~init_u_random proc~gaussian_elliptic_torus gaussian_elliptic_torus proc~gaussian_elliptic_torus->proc~init_u_random proc~exponential_torus exponential_torus proc~exponential_torus->proc~init_u_random

Contents

Source Code


Source Code

subroutine rand_int64(irand)
	INTEGER(8), OPTIONAL, INTENT(OUT)  :: irand
	INTEGER(8)                         :: x


	urand_vars%u = urand_vars%u*d + e !u=u* 2862933555777941757LL + 7046029254386353087LL;

	urand_vars%v = IEOR(urand_vars%v,ISHFT(urand_vars%v,-17)) ! v^=v>>17;
	urand_vars%v = IEOR(urand_vars%v,ISHFT(urand_vars%v,31)) ! v^=v<<31;
	urand_vars%v = IEOR(urand_vars%v,ISHFT(urand_vars%v,-8)) ! v^=v>>8;

	urand_vars%w = a*IAND(urand_vars%w,b) + ISHFT(urand_vars%w,-32) ! w = 4294957665U*(w & 0xffffffff) + (w >> 32);

	x = IEOR(urand_vars%u,ISHFT(urand_vars%u,21)) ! Ullong x=u^(u<< 21);
	x = IEOR(x,ISHFT(x,-35)) ! x ^= x >> 35;
	x = IEOR(x,ISHFT(x,4)) ! x ^= x << 4;

	if (PRESENT(irand)) then
		irand = IEOR(x + urand_vars%v,urand_vars%w)
	end if
end subroutine rand_int64