Fortran 95 random_seed() -help

  • Fortran
  • Thread starter Apollion
  • Start date
  • #1
1
0
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!!! :)
 
Last edited:

Answers and Replies

  • #2
34,688
6,394
Please put [noparse]
Code:
 and
[/noparse] 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:
Code:
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 :
Code:
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:

Code:
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:
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.
 
  • #3
24
0
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>
 
  • #4
24
0
What are you trying to do with this code:
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.
 

Related Threads on Fortran 95 random_seed() -help

Replies
3
Views
9K
  • Last Post
Replies
1
Views
1K
  • Last Post
Replies
12
Views
7K
Replies
1
Views
3K
  • Last Post
Replies
4
Views
2K
Replies
8
Views
2K
  • Last Post
Replies
3
Views
1K
  • Last Post
Replies
1
Views
2K
  • Last Post
Replies
13
Views
6K
Replies
7
Views
2K
Top