You may remember that I tried to get a pointer to a piece of an array,
but reshaped with a different rank, by passing the array through a
function that returned a pointer to its argument. Kurt has pointed out
why this shouldn't be expected to work. The reason is the same as the
reason my initial attempt at getting this functionality didn't work: The
TARGET attribute doesn't "leak through" the RESHAPE intrinsic function
from its SOURCE argument to its result.
What I originally tried was something like
P2 => reshape ( T1, (/4,4/) )
There are times when one wants to view a piece of a vector as an array
having rank higher than one, and vice versa. In our application, the
vector is a "state vector" for a nonlinear least-squares problem, and
the multidimensional array views of pieces of it correspond to the
physical properties/coordinates of the data -- pressure, frequency,
chemical composition, longitude, latitude.... The vector view is used
(required!) by (large) previously-written procedures to solve nonlinear
least-squares problems, and the array view is used (required!) by
(large) previously-written procedures to evaluate a function having
(nonlinear) parameters for which we're trying to solve. Taking a copy
is undesirable, because the state vector has about 10^6 elements.
One could, of course, write a function that takes our coordinates and
produces a 1-D index, according to Fortran's rules for array element
order, but (1) that is a bit of work (that the compiler already knows how
to do), and (2) it can't take section arguments or produce a section.
It would make RESHAPE unique among intrinsic functions to specify that
its result has the TARGET attribute if and only if its first argument
does, but that's what would be useful in our case. Changing RESHAPE in
this way would not invalidate any existing program. There are other
intrinsic functions that are somewhat "irregular" from the point of
view of non-intrinsic functions -- MAX comes immediately to mind -- so
there would be some precedent to having yet another unusual one.
How do J3, WG5 and vendors feel about adding something like "It has the
TARGET attribute if and only if SOURCE has the TARGET attribute, SOURCE
is a rank-one array that is not an array section with a vector subscript,
and the PAD and ORDER arguments are absent" at the end of the "Result
Characteristics" paragraph in the definition of RESHAPE (13.14.90 in
the Fortran 95 standard)? The restrictions are intended to allow RESHAPE
to return SOURCE, not a copy of it. Maybe more restrictions are necessary,
or all of the above aren't, but you get the idea. The "rank-one" part
could be relaxed, but under difficult-to-describe conditions --
essentially that the elements of SOURCE have uniform spacing in memory.
I think it's difficult to specify this so it can be verified statically.
Consider the cases when SOURCE is a pointer, or a dummy argument with
assumed shape.
Best regards,
Van Snyder
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|