- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi everyone,
I am having a problem when compiling a code, and I hope I could get some help here.
The error I am getting is:
advance_crack.f(629): error #8284: If the actual argument is scalar, the dummy argument shall be scalar unless the actual argument
is of type character or is an element of an array that is not assumed shape, pointer, or polymorphic. [RCONP]
call cut_tetra_11(elmtnr,xl,N0,fp,Ae,Ve,VepVe,Lcn,xl2d,
And here is the parts of the code which should be relevant to this issue. For the advance_crack.f file:
subroutine advance_11(tetln,ns,sflag,ndm,nen,numel,nen1, *x,xlen,ix,ixlen, hist,hlen,n1,n3,idtet,N0,fp, *pN0,pAe,pVe,pLcn,pVepVe,pXbar,pcini,pnodeflag,pcn, *pconp,pconm,pXl2d,pNold,pNelem) implicit none ... real*8 VepVe, Lcn(4,4), rconp, rconm, xl2d(2,4) ... call cut_tetra_11(elmtnr,xl,N0,fp,Ae,Ve,VepVe,Lcn,xl2d, *xn3d,idtemp, cn,rconp,rconm) ... Hist(1+(elmtnr-1)*nn+tn1+pconp) = rconp
The cut_tetra_11 subroutine looks like this:
subroutine cut_tetra_11(elmtnr,xl,N0,xbs,Ae,Ve,fact,Lcn, *node_f,xn_f,id,k_f,rconp,rconm) implicit none ... real*8 jp(8), jm(8),rconp(7),rconm(7) call array_to_real_11(conp,rconp)
Finally, the array_to_real_11 subroutine looks like this:
subroutine array_to_real_11(con,rcon) implicit none integer con(7), icon, i real*8 rcon icon = 0 do i= 1,7 icon = icon + con(8-i)*10**(i-1) enddo rcon = Dfloat(icon) end
Hope my description of the issue is clear enough. I should also add that I had a look at previous entries in this forum for error #8284. Following previous threads, I tried to changed the
call cut_tetra_11(elmtnr,xl,N0,fp,Ae,Ve,VepVe,Lcn,xl2d, *xn3d,idtemp, cn,rconp,rconm)
to
call cut_tetra_11(elmtnr,xl,N0,fp,Ae,Ve,VepVe,Lcn,xl2d, *xn3d,idtemp, cn,rconp(1),rconm(1))
That got rid of error #8284, but then I obtained the following error, instead:
advance_crack.f(654): error #6423: This name has already been used as an external function name. [RCONP]
Hist(1+(elmtnr-1)*nn+tn1+pconp) = rconp
Every help is very welcome. Thanks in advance,
Lorenzo
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Lorenzo,
you give unfortunately not enough of your code in order to fully see what is going on. Clearly in the first case, rconp and rconm are defined inside advance_11 as being scalar (real*8). Then you call subroutine cut_tetra_11 with them as last two variables, but in the subroutine cut_tetra_11 they are declared as 7-component real*8 arrays. So that can't work. In your second try you called cut_tetra_11 with final arguments rconp(1),rconm(1), and now both is wrong. Inside the calling subroutine it is still defined as a scalar (i.e. not an array, whose first component you have been taking), while still cut_tetra_11 expects an array and not a scalar. Either define both as 7-component arrays, or both as scalar, or have it 7-component array in advance_11, scalar in cut_tetra_11 and then call just rconp(1), rconm(1). Several more things: real*8 as a kind-type for real constants are not portable, i.e. they might not have the precision on all systems. It is better to either use the old-school double precision or define your own kind-type parameters using selected_real_kind. Particular in the declaration
real*8 rcon [...] rcon = Dfloat (icon)
you show that you expect rcon to be double precision using the Dfloat intrinsincs. On most systems real*8 will probably be double precision, but there is no guarantee.
Next: in your subroutine it might help tremendously to give complete argument declarations, including the complete intent, i.e. in, out, inout.
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Lorenzo,
you give unfortunately not enough of your code in order to fully see what is going on. Clearly in the first case, rconp and rconm are defined inside advance_11 as being scalar (real*8). Then you call subroutine cut_tetra_11 with them as last two variables, but in the subroutine cut_tetra_11 they are declared as 7-component real*8 arrays. So that can't work. In your second try you called cut_tetra_11 with final arguments rconp(1),rconm(1), and now both is wrong. Inside the calling subroutine it is still defined as a scalar (i.e. not an array, whose first component you have been taking), while still cut_tetra_11 expects an array and not a scalar. Either define both as 7-component arrays, or both as scalar, or have it 7-component array in advance_11, scalar in cut_tetra_11 and then call just rconp(1), rconm(1). Several more things: real*8 as a kind-type for real constants are not portable, i.e. they might not have the precision on all systems. It is better to either use the old-school double precision or define your own kind-type parameters using selected_real_kind. Particular in the declaration
real*8 rcon [...] rcon = Dfloat (icon)
you show that you expect rcon to be double precision using the Dfloat intrinsincs. On most systems real*8 will probably be double precision, but there is no guarantee.
Next: in your subroutine it might help tremendously to give complete argument declarations, including the complete intent, i.e. in, out, inout.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
You made things worse for yourself by replacing rconp by rconp(1) in the argument list to cut_tetra_11.
If the declaration of rconp in the caller does not declare it as an array, the compiler will consider rconp(1) as an expression involving a call to a function with an integer argument, instead of an element of an array as you may have wanted. For this reason, it is troublesome to be ambivalent about whether a variable is a scalar or an array.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thanks to both Juergen and Mecej4 for the help with my issue.
After reading your advice carefully and reviewing the code, I came to the conclusion that the error was in cut_tetra_11 declaring rconm and rconp as 7-component real*8 arrays. That was indeed not needed for that subroutine, and declaring rconm and rconp consistently as real*8 scalars in all subroutines solved the issue.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Juergen,
This was the first post that I have seen from you. I wish to congratulate you on the quality of your post. Keep up the good work.
Jim Dempsey
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
jimdempseyatthecove wrote:
Juergen,
This was the first post that I have seen from you. I wish to congratulate you on the quality of your post. Keep up the good work.
Jim Dempsey
Thanks for the flowers. Jim. But it isn't my first post. I'm using Fortran since almost two decades now, but still I don't understand as much of it as I would like to. But I keep trying.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
>> I'm using Fortran since almost two decades now...
Your still quite new at Fortran. I am at 48 years of Fortran....
>>but still I don't understand as much of it as I would like to. But I keep trying.
Me to.
Jim Dempsey
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page