PDA

View Full Version : fortran 95 random_seed() -help


Apollion
Nov11-11, 12:39 AM
Hello everone!So i am writing this code where I am producoing random numbers from a generator through a subroutine.Then I call the subroutine and pass them through a Gaussian distribution.I have problem with my seed subroutine: my program compiles but when i try to execute it complain that "Random_seed(): PUT array too small" i have no idea what does this means!

Here is my subroutine:
subroutine setSEED (seed)
implicit none

real*8:: x
integer, dimension(2), intent(inout):: seed
if (seed(1) == 0.0) &
this where
it complains --> seed = floor(1000*secnds(0.0)) +(/0, 37 /)
--> call random_seed(put=seed)

end subroutine setSEED

and my gaussian distribution :

Real*8 Function gasdev(idum)
implicit none
integer, intent(inout) :: idum
integer, save::iset
real*8:: fac,rsq,v1,v2
real*8, dimension(2) :: x
real*8, save :: gset
!data iset/0/
if (idum.lt.0) iset=0
if (iset.eq.0) then
rsq = 0.0
do while (rsq > 1.0.or.rsq==0)
call random_number(x)
v1=2.*x(1)-1
v2=2.*x(2)-1
rsq=v1**2+v2**2

end do

fac=sqrt(-2.*log(rsq)/rsq)
gset=v1*fac
gasdev=v2*fac
iset=1
else
gasdev=gset
iset=0
endif

return

end Function gasdev

....AND MY MAIN PROGRAM:

program mainprog

implicit none

real*8::angle,gasdev,number
integer::i
integer, dimension(2) :: seed = 0

open(299,FILE='gauss.dat',STATUS='REPLACE')

call setSEED(seed)

Do i=1,10,1


angle=gasdev(seed)
print*,"angle=gasdev =",angle
write(299,*),angle


end do

close(299,STATUS="KEEP")
end program mainprog


Do you guys think can help me?its so frustrating!!!thank you all!!! :)

Mark44
Nov14-11, 12:50 PM
Please put and tags around your code. I have done that for you.Hello everone!So i am writing this code where I am producoing random numbers from a generator through a subroutine.Then I call the subroutine and pass them through a Gaussian distribution.I have problem with my seed subroutine: my program compiles but when i try to execute it complain that "Random_seed(): PUT array too small" i have no idea what does this means!

Here is my subroutine:

subroutine setSEED (seed)
implicit none

real*8:: x
integer, dimension(2), intent(inout):: seed
if (seed(1) == 0.0) &
' this where
' it complains
seed = floor(1000*secnds(0.0)) +(/0, 37 /)
call random_seed(put=seed)
end subroutine setSEED

and my gaussian distribution :

Real*8 Function gasdev(idum)
implicit none
integer, intent(inout) :: idum
integer, save::iset
real*8:: fac,rsq,v1,v2
real*8, dimension(2) :: x
real*8, save :: gset
!data iset/0/
if (idum.lt.0) iset=0
if (iset.eq.0) then
rsq = 0.0
do while (rsq > 1.0.or.rsq==0)
call random_number(x)
v1=2.*x(1)-1
v2=2.*x(2)-1
rsq=v1**2+v2**2
end do

fac=sqrt(-2.*log(rsq)/rsq)
gset=v1*fac
gasdev=v2*fac
iset=1
else
gasdev=gset
iset=0
endif
return
end Function gasdev

....AND MY MAIN PROGRAM:


program mainprog

implicit none

real*8::angle,gasdev,number
integer::i
integer, dimension(2) :: seed = 0

open(299,FILE='gauss.dat',STATUS='REPLACE')

call setSEED(seed)

Do i=1,10,1
angle=gasdev(seed)
print*,"angle=gasdev =",angle
write(299,*),angle
end do

close(299,STATUS="KEEP")
end program mainprog


Do you guys think can help me?its so frustrating!!!thank you all!!! :)

What are you trying to do with this code:
seed = floor(1000*secnds(0.0)) +(/0, 37 /)
call random_seed(put=seed)

In the first line, floor returns a single value, so it looks like you are trying to add a scalar to a vector - you can't do that.

Louisa
Mar15-12, 07:46 AM
[QUOTE=Apollion;3609959]Hello everone!So i am writing this code where I am producoing random numbers from a generator through a subroutine.Then I call the subroutine and pass them through a Gaussian distribution.I have problem with my seed subroutine: my program compiles
</QUOTE>

Are you sure? There appear to be at least two errors in it.
It is necessary to get a clean compilation before attempting to execute
the program.
1. "secnds" is not a known Fortran name. Nor it it defined. What is it?
2. The statement:
write(299,*),angle
in the main program has a useless comma in it.

To get useful advice, you need to post ALL and EVERY error message(s).

<quote>
but when i try to execute it complain that "Random_seed(): PUT array too small" i have no idea what does this means!

Here is my subroutine:
subroutine setSEED (seed)
implicit none

real*8:: x
integer, dimension(2), intent(inout):: seed
if (seed(1) == 0.0) &
this where
it complains --> seed = floor(1000*secnds(0.0)) +(/0, 37 /)
--> call random_seed(put=seed)

end subroutine setSEED

and my gaussian distribution :

Real*8 Function gasdev(idum)
implicit none
integer, intent(inout) :: idum
integer, save::iset
real*8:: fac,rsq,v1,v2
real*8, dimension(2) :: x
real*8, save :: gset
!data iset/0/
if (idum.lt.0) iset=0
if (iset.eq.0) then
rsq = 0.0
do while (rsq > 1.0.or.rsq==0)
call random_number(x)
v1=2.*x(1)-1
v2=2.*x(2)-1
rsq=v1**2+v2**2

end do

fac=sqrt(-2.*log(rsq)/rsq)
gset=v1*fac
gasdev=v2*fac
iset=1
else
gasdev=gset
iset=0
endif

return

end Function gasdev

....AND MY MAIN PROGRAM:

program mainprog

implicit none

real*8::angle,gasdev,number
integer::i
integer, dimension(2) :: seed = 0

open(299,FILE='gauss.dat',STATUS='REPLACE')

call setSEED(seed)

Do i=1,10,1


angle=gasdev(seed)
print*,"angle=gasdev =",angle
write(299,*),angle


end do

close(299,STATUS="KEEP")
end program mainprog
</quote>

Louisa
Mar15-12, 07:53 AM
What are you trying to do with this code:
seed = floor(1000*secnds(0.0)) +(/0, 37 /)
call random_seed(put=seed)

In the first line, floor returns a single value, so it looks like you are trying to add a scalar to a vector - you can't do that.

It's perfectly legal to add a scalar to a vector.
Thus,
seed = 5 + (/ 0, 37 /)
is OK too.
The problem with the line is that "secnds" has not been defined.