forums.silverfrost.com Forum Index forums.silverfrost.com
Welcome to the Silverfrost forums
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Error Real(kind=2) when real(kind=1) is required

 
Post new topic   Reply to topic    forums.silverfrost.com Forum Index -> Support
View previous topic :: View next topic  
Author Message
Miriam



Joined: 17 Nov 2011
Posts: 15

PostPosted: Mon Nov 28, 2011 4:26 pm    Post subject: Error Real(kind=2) when real(kind=1) is required Reply with quote

Hello,
I think I spent a long time in front of the computer that I can´t see anymore. May be someone can help me find the mistake. here is the summarized code:
Code:

module common_var
  implicit none
  save
  integer         :: L,IMAX,K,KP
  double precision   :: Pe
  double precision   :: EW(200),EWP(200),R(1000),E(1000),VZ(1000)
end module common_var

Program Temperature
use common_var
implicit none
double precision                :: C_coef,D_coef,WHF,WT
integer                             :: I,L1,L2
!!!!!!!!!!!!!!Load Data!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
open(20, FILE = 'Velocity.asc', STATUS = 'UNKNOWN')
read(20,*)IMAX
read(20,*)(R(I),VZ(I),E(I),I=1,IMAX)
close(20)
write(*,*)'Data loaded'
do I=1,200
EW(I)=0.0
EWP(I)=0.0
end do

call SDEW(E,R,VZ,EW,EWP,K,KP)

End Program Temperature
!-----------------------------
subroutine SDEW(E,R,VZ,EW,EWP,K,KP)
use common_var
write(*,*)  'Unterprogramm: '
end subroutine SDEW



The error is like following: attempt to call routine with argument number one as a real(kind=2) when real(kind=1) was required.

I dont see my mistake , can anyone help please!!
Miriam
Back to top
View user's profile Send private message
Wilfried Linder



Joined: 14 Nov 2007
Posts: 314
Location: Düsseldorf, Germany

PostPosted: Mon Nov 28, 2011 6:30 pm    Post subject: Reply with quote

If you use a module to pass your variables, you cannot pass them a second time in a parameter list. Therefore, simply write

call sdew()

and

subroutine sdew()

... and it works.

Regards - Wilfried
Back to top
View user's profile Send private message
LitusSaxonicum



Joined: 23 Aug 2005
Posts: 2388
Location: Yateley, Hants, UK

PostPosted: Mon Nov 28, 2011 9:37 pm    Post subject: Reply with quote

Wilfried,

I learnt something here! Miriam is treating these declarations as you would an "INCLUDE" file in Fortran-77. In fact, the declarations are more like a COMMON block.

Eddie
Back to top
View user's profile Send private message
Miriam



Joined: 17 Nov 2011
Posts: 15

PostPosted: Tue Nov 29, 2011 8:48 am    Post subject: Reply with quote

Thanx!!! It is working.
It worked also with the "traditional" call of the subroutine, but with the variable declaration as real instead of double precision in the module common_var.

Miriam
Back to top
View user's profile Send private message
Wilfried Linder



Joined: 14 Nov 2007
Posts: 314
Location: Düsseldorf, Germany

PostPosted: Tue Nov 29, 2011 9:45 am    Post subject: Reply with quote

Hi Eddie and Miriam,

I found a lot of good information about modules in the FTN95 user's guide, chapter 10, "Using modules". For instance, they write "Modules provide an alternative method to using COMMON blocks for sharing data between different program units without passing such data as arguments."

These PDF documentation dates from the Salford era but is very useful until today. I don't know whether it is available here for download.

To be true, usually I still prefer the traditional common blocks Wink

Regards - Wilfried
Back to top
View user's profile Send private message
Miriam



Joined: 17 Nov 2011
Posts: 15

PostPosted: Tue Nov 29, 2011 2:54 pm    Post subject: Reply with quote

I really dont get the meaning of the whole thing. With the "real"- declaration, it works, with "double precision" it is not.
If I use with double precision this way to call the subroutine sdew() it works.
I don´t get the logic behind all of this.
Moreover my program is expanding (will be approximately by 5000 lines with a lot of functions and subroutines). And now with the next implemented function I have again the same error.
I really don´t see how to solve the problem for once, so that I dont have to find tricks for every function and by the end the program won´t run.
Back to top
View user's profile Send private message
LitusSaxonicum



Joined: 23 Aug 2005
Posts: 2388
Location: Yateley, Hants, UK

PostPosted: Tue Nov 29, 2011 4:20 pm    Post subject: Reply with quote

1. This works because X is available in the main program and in the subroutine via the Common block

Code:
      Program Eddie
      Double Precision X(50)
      Common / A /  X
      Call B
      END
      Subroutine B
      Double Precision X(50)
      Common / A /  X
      Return
      END


2. This works because X is available in the main program and then in the subroutine via the subprogram argument list

Code:
      Program Eddie
      Double Precision X(50)
      Common / A /  X
      Call B (X)
      END
      Subroutine B (X)
      Double Precision X(50)
      Return
      END 


3. This doesn't work because you aren't allowed to make X available in 2 completely different ways: through the Common block and via the subprogram argument list

Code:
      Program Eddie
      Double Precision X(50)
      Common / A /  X
      Call B (X)
      END
      Subroutine B (X)
      Double Precision X(50)
      Common / A /  X
      Return
      END


4. This works because X is made available to routine B through the subprogram argument list

Code:
      Module C
      Double Precision X(50)
      End Module
      Program Eddie
      Uses C
      Call B (X)
      END
      Subroutine B (X)
      Double Precision X(50)
      Return
      END


5. This works because the scope of X covers the program and the subroutine because they both Use C

Code:
      Module C
      Double Precision X(50)
      End Module
      Program Eddie
      Uses C
      Call B
      END
      Subroutine B
      Uses C
      Return
      END



6. This doesn't work because you aren't allowed to make X available to subroutine B in 2 different ways: via the subprogram argument list AND because the scope of X covers the program and the subroutine as they both Use C

Code:
      Module C
      Double Precision X(50)
      End Module
      Program Eddie
      Uses C
      Call B (X)
      END
      Subroutine B (X)
      Uses C
      Return
      END


Somewhere in every routine you need to declare that X is Double Precision.

Eddie
Back to top
View user's profile Send private message
Wilfried Linder



Joined: 14 Nov 2007
Posts: 314
Location: Düsseldorf, Germany

PostPosted: Tue Nov 29, 2011 5:25 pm    Post subject: Reply with quote

Just an additonal remark:

You should never use declarations like "real x" but specify all times what kind of real you mean. In most cases, a declaration like "double precision x" or "real*8 x" or "real(kind=2) x" will be useful, meaning 8 bits of memory for x. Sometimes, "real*4 x" or "real(kind=1) x" may be used (4 bits). This in conjunction with "implicite none" in all main programmes, subroutines and functions will help to minimise problems resulting from inconsistant variable declarations. It is also a good idea to note the warning messages from compiler + linker Wink

In the same way write "integer*4 j" instead of "integer j", "logical*2 t" instead of "logical t" and so on. It is my experience that exact declarations are better than the use of respective compiler options (like /intl).

Regards - Wilfried
Back to top
View user's profile Send private message
JohnCampbell



Joined: 16 Feb 2006
Posts: 2554
Location: Sydney

PostPosted: Wed Nov 30, 2011 12:45 am    Post subject: Reply with quote

Your problem is that the arrays used in subroutine SDEW are transferred both via the argument list and the module. This should not be done.
Where you transfer array E by both argument list and module, the compiler considers them as different, and so the E in the argument list is implied to be a real*4 variable, not a real*8 array. compiling with /xref should show this. (not sure why the compiler allows this ?)
( My recommendation is that you replace "double precision" by "real*8" as it more clearly defines the precision being used )
The use of double precision is not the source of your problem.

Try this change, where the module use is removed from subroutine SDEW
Code:
module common_var
  implicit none
  save
  integer         :: L,IMAX,K,KP
  double precision   :: Pe
  double precision   :: EW(200),EWP(200),R(1000),E(1000),VZ(1000)
end module common_var

Program Temperature
use common_var
implicit none
double precision                :: C_coef,D_coef,WHF,WT
integer                             :: I,L1,L2
!!!!!!!!!!!!!!Load Data!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
open(20, FILE = 'Velocity.asc', STATUS = 'UNKNOWN')
read(20,*)IMAX
read(20,*)(R(I),VZ(I),E(I),I=1,IMAX)
close(20)
write(*,*)'Data loaded'
do I=1,200
 EW(I)=0.0
 EWP(I)=0.0
end do

call SDEW(E,R,VZ,EW,EWP,K,KP)

End Program Temperature
!-----------------------------
subroutine SDEW(E,R,VZ,EW,EWP,K,KP)
!
  double precision :: E(1000), R(1000), VZ(1000), EW(200), EWP(200)
  integer :: K, KP
!
write(*,*)  'Unterprogramm: '
end subroutine SDEW



or as Wilfred recomended :

Code:
module common_var
  implicit none
  save
  integer         :: L,IMAX,K,KP
  double precision   :: Pe
  double precision   :: EW(200),EWP(200),R(1000),E(1000),VZ(1000)
end module common_var

Program Temperature
use common_var
double precision                :: C_coef,D_coef,WHF,WT
integer                             :: I,L1,L2
!!!!!!!!!!!!!!Load Data!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
open(20, FILE = 'Velocity.asc', STATUS = 'UNKNOWN')
read(20,*)IMAX
read(20,*)(R(I),VZ(I),E(I),I=1,IMAX)
close(20)
write(*,*)'Data loaded'
do I=1,200
 EW(I)=0.0
 EWP(I)=0.0
end do

call SDEW

End Program Temperature
!-----------------------------
subroutine SDEW
use common_var
!
write(*,*)  'Unterprogramm: '
end subroutine SDEW
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    forums.silverfrost.com Forum Index -> Support All times are GMT + 1 Hour
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group