Fortran 90 Error Please help

  • #1
Hey guys, I'm pretty new and desperate. I been trying to compile this program for a while and keep jumping from error to error.
Currently I have the following error:
Error: Rank mismatch in argument 't' at (1) (scalar and rank-1)
I have checked that my arrays are correctly. I have checked that all my arguments are correct, also, all my # of arguments during calls are correct. I don't know where else to go and check. Any suggestions?

The section of my program is here:
k1 = ODEfunction(time,y,neqn)
k2 = ODEfunction(time+c1*h, y(1:neqn)+k1*c1*h, neqn)
k3 = ODEfunction(time+c2*h, y(1:neqn)+(c3*k1+c4*k2)*h, neqn)
k4 = ODEfunction(time+c5*h, y(1:neqn)+(c6*k1-c7*k2+c8*k3)*h, neqn)
k5 = ODEfunction(time+h, y(1:neqn)+(-c9*k1+c10*k2-c11*k3+c12*k4)*h, neqn)
k6 = ODEfunction(time+c13*h, y(1:neqn)+&
&(c14*k1+c15*k2+c16*k3+c17*k4+c18*k5)*h, neqn)

the exact errors say:
RFK.f90:65.20:

k2 = ODEfunction(time+c1*h, y(1:neqn)+k1*c1*h, neqn)
1
Error: Rank mismatch in argument 't' at (1) (scalar and rank-1)
RFK.f90:66.20:

k3 = ODEfunction(time+c2*h, y(1:neqn)+(c3*k1+c4*k2)*h, neqn)
1
Error: Rank mismatch in argument 't' at (1) (scalar and rank-1)
RFK.f90:67.20:

k4 = ODEfunction(time+c5*h, y(1:neqn)+(c6*k1-c7*k2+c8*k3)*h, neqn)
1
Error: Rank mismatch in argument 't' at (1) (scalar and rank-1)
RFK.f90:69.20:

k6 = ODEfunction(time+c13*h, y(1:neqn)+&
1
Error: Rank mismatch in argument 't' at (1) (scalar and rank-1)
 

Attachments

  • a.out.zip
    30 KB · Views: 191

Answers and Replies

  • #2
Hey guys, I'm pretty new and desperate. I been trying to compile this program for a while and keep jumping from error to error.
Currently I have the following error:
Error: Rank mismatch in argument 't' at (1) (scalar and rank-1)
I have checked that my arrays are correctly. I have checked that all my arguments are correct, also, all my # of arguments during calls are correct. I don't know where else to go and check. Any suggestions?

The section of my program is here:
k1 = ODEfunction(time,y,neqn)
k2 = ODEfunction(time+c1*h, y(1:neqn)+k1*c1*h, neqn)
k3 = ODEfunction(time+c2*h, y(1:neqn)+(c3*k1+c4*k2)*h, neqn)
k4 = ODEfunction(time+c5*h, y(1:neqn)+(c6*k1-c7*k2+c8*k3)*h, neqn)
k5 = ODEfunction(time+h, y(1:neqn)+(-c9*k1+c10*k2-c11*k3+c12*k4)*h, neqn)
k6 = ODEfunction(time+c13*h, y(1:neqn)+&
&(c14*k1+c15*k2+c16*k3+c17*k4+c18*k5)*h, neqn)

the exact errors say:
RFK.f90:65.20:

k2 = ODEfunction(time+c1*h, y(1:neqn)+k1*c1*h, neqn)
1
Error: Rank mismatch in argument 't' at (1) (scalar and rank-1)
RFK.f90:66.20:

k3 = ODEfunction(time+c2*h, y(1:neqn)+(c3*k1+c4*k2)*h, neqn)
1
Error: Rank mismatch in argument 't' at (1) (scalar and rank-1)
RFK.f90:67.20:

k4 = ODEfunction(time+c5*h, y(1:neqn)+(c6*k1-c7*k2+c8*k3)*h, neqn)
1
Error: Rank mismatch in argument 't' at (1) (scalar and rank-1)
RFK.f90:69.20:

k6 = ODEfunction(time+c13*h, y(1:neqn)+&
1
Error: Rank mismatch in argument 't' at (1) (scalar and rank-1)
All of your errors seem to be related. The 2nd argument of ODEfunction is apparently an array. In the first call to ODEfunction, the 2nd argument is y, and all is good. In subsequent calls to ODEfunction, your 2nd argument is a mishmash of stuff -- part array and part scalar -- and this is what the error messages are telling you.

Are you trying to add k1 * c1 * h to each element of your array y? If so, use a DO loop to do that, and then call ODEfunction. The same advice applies to the other calls to ODEfunction that are generating error messages.
 
  • #3
It is difficult to tell what is going on without seeing ODEfunction and the type of its arguments as well as the types of the parameters that you are passing to it.

From the error message, it looks like the problem is with the very first argument, time, judging by the "argument 't' " part ..either it expects a scalar and you are passing an array or the other way around. Something like that.
 
  • #4
It is difficult to tell what is going on without seeing ODEfunction and the type of its arguments as well as the types of the parameters that you are passing to it.

From the error message, it looks like the problem is with the very first argument, time, judging by the "argument 't' " part
I don't think the problem is with the first argument, although I agree that seeming how ODEfunction is defined would be helpful. The reason I don't think it's the first argument that is wrong is that the first call to ODEfunction isn't flagged with a compiler error, but the second and following calls are flagged, all of which have what I think are hinky expressions in their 3rd arguments.
gsal said:
..either it expects a scalar and you are passing an array or the other way around. Something like that.
 
  • #5
Mark44:
If the time argument was identical in both the first call and the others, I would agree with you; but given that they are different, it cannot be ruled out.

By the way, let's recall that Fortran90 can handle arrays a-la-matlab so that adding scalars to arrays is not necessarily an illegal thing; it is only if the result then turns into an array while the argument only expects a scalar.
 
  • #6
Mark44:
If the time argument was identical in both the first call and the others, I would agree with you; but given that they are different, it cannot be ruled out.

By the way, let's recall that Fortran90 can handle arrays a-la-matlab so that adding scalars to arrays is not necessarily an illegal thing; it is only if the result then turns into an array while the argument only expects a scalar.
Good point.

Personally, I really dislike that business of adding a scalar to an array. I've been writing C and related code for so long that those shortcuts don't seem reasonable to me.
 
  • #7
The problem is this in RKF.f90:
Fortran:
REAL(dp),Dimension(27),PARAMETER ::  C1=1._dp/5._dp, &  !1
  &C2=3._dp/10._dp, &  !2
  &c3=3._dp/40._dp, &  !3
  &c4=9._dp/40._dp, &  !4
  &c5=3._dp/5._dp, &  !5
  &c6=3._dp/10._dp, &  !6
  &c7=9._dp/10._dp, &  !7
  &c8=6._dp/5._dp, &  !8
  &c9=11._dp/54._dp, &  !9
  &c10=5._dp/2._dp, &  !10
  &c11=70._dp/27._dp, &  !11
  &c12=35._DP/27._DP, &  !12
  &c13=7._DP/8._DP, &  !13
  &c14=1631._DP/55296._DP, &  !14
  &c15=175._DP/512._DP, &  !15
  &c16=575._DP/13824._DP, &  !16
  &c17=44275._DP/110592._DP, &  !17
  &c18=253._DP/4096._DP, &  !18
  &c19=37._DP/378._DP, &  !19
  &c20=250._DP/612._DP, &  !20
  &c21=125._DP/594._DP, &  !21
  &c22=512._DP/1771._DP, &  !22
  &c23=2825._DP/27648._DP, &  !23
  &c24=18575._DP/48384._DP, &  !24
  &c25=13525._DP/55296._DP, &  !25
  &c26=277._DP/14336._DP, &  !26
  &c27=1._DP/4._DP  !27
You are defining 27 variables, each one an array of length 27. Remove the "Dimension(27)".
 
  • #8
With no mention of the zip file and its contents and being named a.out, I thought it may only contain the executable...I see, now, that it has the entire project.

And, yes, DrClaude is right...and so am I with my correct interpretation of the error message. With the 'c' variables being declared arrays, the argument " time + c*h " produces an array, too...which is then of the wrong rank for the first argument in ODEfunction expecting just a scalar.

So, go ahead and remove the "dimension(27)" attribute altogether.

Also, just like you have the "double_precision" and "variable_library" modules, I would recommend creating a module with the other functions and spare yourself having to manually include all that (unnecessary) code to explicitly declare interfaces over and over...that would happen automatically if you use modules, instead.
 
  • #9
All of your errors seem to be related. The 2nd argument of ODEfunction is apparently an array. In the first call to ODEfunction, the 2nd argument is y, and all is good. In subsequent calls to ODEfunction, your 2nd argument is a mishmash of stuff -- part array and part scalar -- and this is what the error messages are telling you.

Are you trying to add k1 * c1 * h to each element of your array y? If so, use a DO loop to do that, and then call ODEfunction. The same advice applies to the other calls to ODEfunction that are generating error messages.

I will try that, however, i am confused on why the error is giving me t
The problem is this in RKF.f90:
Fortran:
REAL(dp),Dimension(27),PARAMETER ::  C1=1._dp/5._dp, &  !1
  &C2=3._dp/10._dp, &  !2
  &c3=3._dp/40._dp, &  !3
  &c4=9._dp/40._dp, &  !4
  &c5=3._dp/5._dp, &  !5
  &c6=3._dp/10._dp, &  !6
  &c7=9._dp/10._dp, &  !7
  &c8=6._dp/5._dp, &  !8
  &c9=11._dp/54._dp, &  !9
  &c10=5._dp/2._dp, &  !10
  &c11=70._dp/27._dp, &  !11
  &c12=35._DP/27._DP, &  !12
  &c13=7._DP/8._DP, &  !13
  &c14=1631._DP/55296._DP, &  !14
  &c15=175._DP/512._DP, &  !15
  &c16=575._DP/13824._DP, &  !16
  &c17=44275._DP/110592._DP, &  !17
  &c18=253._DP/4096._DP, &  !18
  &c19=37._DP/378._DP, &  !19
  &c20=250._DP/612._DP, &  !20
  &c21=125._DP/594._DP, &  !21
  &c22=512._DP/1771._DP, &  !22
  &c23=2825._DP/27648._DP, &  !23
  &c24=18575._DP/48384._DP, &  !24
  &c25=13525._DP/55296._DP, &  !25
  &c26=277._DP/14336._DP, &  !26
  &c27=1._DP/4._DP  !27
You are defining 27 variables, each one an array of length 27. Remove the "Dimension(27)".
OMG! This worked! Thank you I feel really foolish that completely went over my head
 
  • #10
Thank you all! I been working on this program for a while and its been really stressfull for me. Every time I seem to fix an error another arises.

So I ask you for one more, if I get the following error:
At line 25 of file ODEfunction.f90
'Fortran runtime error: Index '2' of dimension 1 of array 'y' above upper bound of -292737286985288951

Those this go back to me trying to give the array a scalar instead of an array as it should or am I passing an array with the wrong dimensions?
 
  • #11
With no mention of the zip file and its contents and being named a.out, I thought it may only contain the executable...I see, now, that it has the entire project.

And, yes, DrClaude is right...and so am I with my correct interpretation of the error message. With the 'c' variables being declared arrays, the argument " time + c*h " produces an array, too...which is then of the wrong rank for the first argument in ODEfunction expecting just a scalar.

So, go ahead and remove the "dimension(27)" attribute altogether.

Also, just like you have the "double_precision" and "variable_library" modules, I would recommend creating a module with the other functions and spare yourself having to manually include all that (unnecessary) code to explicitly declare interfaces over and over...that would happen automatically if you use modules, instead.
I apologize for not mentioning my zip file. It is the first time I post here and I had no idea it automatically gave it a name.
 
  • #12
Thank you all! I been working on this program for a while and its been really stressfull for me. Every time I seem to fix an error another arises.

So I ask you for one more, if I get the following error:
At line 25 of file ODEfunction.f90
'Fortran runtime error: Index '2' of dimension 1 of array 'y' above upper bound of -292737286985288951

Those this go back to me trying to give the array a scalar instead of an array as it should or am I passing an array with the wrong dimensions?
Here's the code from ODEfunction.f90.
Fortran:
Function ODEfunction(t,y,neqn)
!-------------------------------------------------------------------------------------
!
! This function holds the system of differential equations used in the numberical 
! solutions of ODEs for Engr 326 Lab. And this function will calculate the change
! in snail population and worm population in terms of time.
!
! Where,
! ODEfunction(1) = the snail population growth rate
! ODEfunction(2) = the worm population growth rate
! alpha, and beta= model coefficients given on the problem statement
! y(1) and y(2)  = snail and worm population density, respectively.
! t  = is time 
!------------------------------------------------------------------------------------

 Use Double_Precision
 Use Variable_Library
 Implicit None
 Integer,Intent(in) :: neqn
 Real(dp),Intent(in) :: t
 Real(dp),Dimension(:),Intent(in) :: y
 Real,Dimension(neqn) :: ODEfunction
  write(*,*) "y=", y
  ODEfunction(1) = (alpha1-beta1*y(2))*y(1)
  ODEfunction(2) = (alpha2-beta2*(y(2)/y(1)))*y(2)  ! <<--- Line 25

End Function ODEfunction[/quote]
ODEfunction is a function -- you are using it as if it were an array. You need to have a clearer understanding of what your ODEfunction should be returning, and you need a different variable for your array.
 

Suggested for: Fortran 90 Error Please help

Replies
4
Views
687
Replies
16
Views
866
Replies
17
Views
3K
Replies
2
Views
501
2
Replies
60
Views
594
2
Replies
37
Views
2K
Replies
8
Views
676
Replies
12
Views
1K
Replies
3
Views
822
Back
Top