Fortran Why Does My Fortran 95 Program Show Random_seed(): PUT Array Too Small?

  • Thread starter Thread starter Apollion
  • Start date Start date
  • Tags Tags
    Fortran
AI Thread Summary
The discussion revolves around a coding issue related to generating random numbers in Fortran, specifically an error message stating "Random_seed(): PUT array too small." The problem originates in the seed subroutine, where the code attempts to assign a scalar value from the `floor(1000*secnds(0.0))` function to a two-element array `seed`. The function `secnds` is not defined, leading to confusion. Additionally, the line of code is trying to add a scalar to an array, which is not directly compatible without proper handling. Participants in the discussion point out that the program compiles but fails during execution due to this seed assignment issue. They suggest ensuring that all variables are correctly defined and that the program compiles cleanly before running. There are also mentions of other potential errors, such as a misplaced comma in the `write` statement. Overall, the focus is on correcting the seed initialization and ensuring all functions used are properly defined to resolve the execution error.
Apollion
Messages
1
Reaction score
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:
Technology news on Phys.org
Please put [noparse]
Code:
 and
[/noparse] tags around your code. I have done that for you.
Apollion said:
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.
 
Apollion said:
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>
 
Mark44 said:
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.
 
Dear Peeps I have posted a few questions about programing on this sectio of the PF forum. I want to ask you veterans how you folks learn program in assembly and about computer architecture for the x86 family. In addition to finish learning C, I am also reading the book From bits to Gates to C and Beyond. In the book, it uses the mini LC3 assembly language. I also have books on assembly programming and computer architecture. The few famous ones i have are Computer Organization and...
I have a quick questions. I am going through a book on C programming on my own. Afterwards, I plan to go through something call data structures and algorithms on my own also in C. I also need to learn C++, Matlab and for personal interest Haskell. For the two topic of data structures and algorithms, I understand there are standard ones across all programming languages. After learning it through C, what would be the biggest issue when trying to implement the same data...

Similar threads

Replies
4
Views
2K
Replies
2
Views
2K
Replies
11
Views
2K
Replies
25
Views
8K
Replies
6
Views
3K
Replies
11
Views
3K
Replies
6
Views
2K
Back
Top