<br><font size=2 face="sans-serif">Craig</font>
<br>
<br><font size=2 face="sans-serif">If your message is a contiguous assumed-shape,
then you can solve the problem without Fortran committee's help by using
a conversion function as follows</font>
<br>
<br><font size=2 face="sans-serif">function convertToRank1 (x, n) result
(res)</font>
<br><font size=2 face="sans-serif">   real, target, intent(inout)
:: x(n)</font>
<br><font size=2 face="sans-serif">   integer, intent(in) ::
n</font>
<br>
<br><font size=2 face="sans-serif">   real, pointer :: res(:)</font>
<br>
<br><font size=2 face="sans-serif">   res => x</font>
<br><font size=2 face="sans-serif">end function</font>
<br>
<br><font size=2 face="sans-serif">The your subroutine can be rewritten
as follows</font>
<br>
<br><font size=2 face="sans-serif">subroutine test_recv (message)</font>
<br><font size=2 face="sans-serif">    real, target :: message(:,:)
 !<-- assume it is contiguous</font>
<br>
<br><font size=2 face="sans-serif">    real, pointer :: remappedArray(:)</font>
<br>
<br><font size=2 face="sans-serif">   remappedArray => convertToRank1(message,
size(message))</font>
<br>
<br><font size=2 face="sans-serif">   call MP_Recv (remappedArray,
</font><font size=3>2, MPI_INTEGER, 1, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE)</font>
<br>
<br><font size=2 face="sans-serif">end subroutine</font>
<br>
<br>
<br><font size=2 face="sans-serif">That only solves the problem if the
assumed-shape is contiguous.  In F03 we have bounds-remapping for
pointers that converts (maps) rank one target to multi-dimension arrays.
 I think that can be used if your test_recv() always expects a rank-one
array assumed-shape dummy. You can map that array into a rank-n array using
data pointer assignment to match the interface of MPI_Recv_wrapper, then
you don't have the problems with generic resolution issues.</font>
<br>
<br>
<br><font size=2 face="sans-serif">Cheers,</font>
<br>
<br><font size=2 face="sans-serif">Jim Xia<br>
<br>
RL Fortran Compiler Test<br>
IBM Toronto Lab at 8200 Warden Ave, Markham, On, L6G 1C7<br>
Phone (905) 413-3444  Tie-line 313-3444<br>
email: jimxia@ca.ibm.com<br>
D2/YF7/8200 /MKM</font>
<br>
<br>
<br>
<table width=100%>
<tr valign=top>
<td><font size=1 color=#5f5f5f face="sans-serif">From:</font>
<td><font size=1 face="sans-serif">Craig Rasmussen <crasmussen@lanl.gov></font>
<tr valign=top>
<td><font size=1 color=#5f5f5f face="sans-serif">To:</font>
<td><font size=1 face="sans-serif">MPI-3 Fortran working group <mpi3-fortran@lists.mpi-forum.org></font>
<tr>
<td valign=top><font size=1 color=#5f5f5f face="sans-serif">Cc:</font>
<td><font size=1 face="sans-serif">WG5 <sc22wg5@open-std.org></font>
<tr valign=top>
<td><font size=1 color=#5f5f5f face="sans-serif">Date:</font>
<td><font size=1 face="sans-serif">12/17/2008 10:45 AM</font>
<tr valign=top>
<td><font size=1 color=#5f5f5f face="sans-serif">Subject:</font>
<td><font size=1 face="sans-serif">(j3.2006) (SC22WG5.3823) Please tell
me I'm wrong</font></table>
<br>
<hr noshade>
<br>
<br>
<br><font size=3>Without help from the Fortran standard, I don't think
there is anyway to avoid a combinatorial explosion of interfaces (made
worse by the F2008 with 15 dimensions).  Consider the simple example
code snippet:<br>
<br>
---------<br>
<br>
subroutine test_recv(message)<br>
 real :: message(:,:)<br>
<br>
 call MPI_Recv(message, 2, MPI_INTEGER, 1, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE)<br>
<br>
end subroutine<br>
<br>
---------<br>
<br>
For interface declaration:<br>
<br>
subroutine MPI_Recv_wrapper(buf, count, datatype, source, tag, comm, status,
err)<br>
 real, dimension(*), intent(out)  :: buf<br>
<br>
or:<br>
<br>
subroutine MPI_Recv_wrapper(buf, count, datatype, source, tag, comm, status,
err)<br>
 real, dimension(1,1,1,1,1,1,*), intent(out)  :: buf<br>
<br>
This give the following error with the Intel compiler:<br>
<br>
fortcom: Error: test_recv_call.f90, line 15: There is no matching specific
subroutine for this generic subroutine call.   [MPI_RECV]<br>
 call MPI_Recv(message, 2, MPI_INTEGER, dest, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE)<br>
--------^<br>
<br>
On the other hand, if we use the interface:<br>
<br>
subroutine MPI_Recv_wrapper(buf, count, datatype, source, tag, comm, status,
err)<br>
 type(C_PTR) :: buf<br>
<br>
There is still a problem as assumed shape arrays are not interoperable.
 From gfortran:<br>
<br>
 call MPI_Recv(C_LOC(message), 2, MPI_INTEGER, dest, 1, MPI_COMM_WORLD,
requ<br>
                    
                     1<br>
Error: Assumed-shape array 'message' at (1) cannot be an argument to the
procedure 'c_loc because it is not C interoperable<br>
<br>
<br>
So there doesn't seem to be anyway to currently do multi-dimensional interfaces
for assumed-shape actuals without a combinatorial explosion of interfaces.
 This also seems to be the case for assumed-size actuals as well.<br>
<br>
Comments?<br>
<br>
Cheers,<br>
Craig<br>
<br>
</font><tt><font size=2>_______________________________________________<br>
J3 mailing list<br>
J3@j3-fortran.org<br>
</font></tt><a href="http://j3-fortran.org/mailman/listinfo/j3"><tt><font size=2>http://j3-fortran.org/mailman/listinfo/j3</font></tt></a><tt><font size=2><br>
</font></tt>
<br>
<br>