(j3.2006) I think this is possible, but....
Clune, Thomas L. GSFC-6101
thomas.l.clune
Tue Jan 23 17:07:34 EST 2018
Van,
Note - I?ve not read this carefully, but this my immediate response is that this is _not_ something you should be able to do with type extension. Instead, it appears to be a classic example of the need for generic programming.
> On Jan 23, 2018, at 5:00 PM, Van Snyder <Van.Snyder at jpl.nasa.gov> wrote:
>
> I think this is possible, but it might have high overhead, be difficult
> to explain in the standard, or difficult to implement.
>
> I have a derived type that has a component that's an allocatable array
> of derived type. Alternatively, its bounds could depend upon length
> parameters.
>
> In an extension of the type, I'd like that component to be an extension
> of its type. That is, I'd like to be able to override components, not
> just procedure bindings.
>
> Here's a concrete example.
>
> I developed a sparse matrix representation. One component is a rank-one
> array of the nonzero matrix elements. Each element has five components:
> its row, its column, the index of the next element in the same row, the
> index of the next element in the same column, and the value. Each row
> or column is a circular list.
>
> Another component is an array of indices of the last element in each
> row. Another component is an array of indices of the last element in
> each column.
>
> I'm using this type to represent interpolation coefficients from state
> vectors that represent the temperature and composition of the
> atmosphere. Each row of the matrix corresponds to a point on the path
> of integration through the atmosphere.
>
> There is a lot of other path-related information that is unrelated to
> the low-level sparse-matrix abstraction. For example, the temperature
> at a point on the path, or the mixing ratio of the species, for which
> the matrix is a representation of the interpolation coefficients.
>
> In the base type, I'd like the object that contains the index of the
> last element in each row to be an array of a derived type that has one
> integer component. In an extension of the type, I'd like to extend that
> object to include, for example, the temperature or mixing ratio. I'd
> like to do something similar for the array that contains the index of
> the last element in each column, for example to include a logical
> variable that indicates whether I need derivatives with respect to the
> corresponding element of the state vector. I'd like to do something
> similar to the component that represents the array elements. In
> addition to an interpolation coefficient, I want to record a quantity
> related to a derivative with respect to the corresponding element of the
> state vector.
>
> I can work around this by adding components in an extension of the type,
> but then those components need to be allocated (either explicitly, or
> under the covers if their extents are specified by length parameters).
> The quantities related to a particular point on the path of integration
> would not be near each other, so cache locality would suffer.
>
> There would probably be usage overhead because each extensible component
> would need to be accessed by way of a descriptor. For example, if all
> you want is the array of temperatures along the path, you don't know the
> stride betweem them at compile time if the component that represents
> that is component of a component of extensible type.
>
> As I said, this might be difficult to explain, might be difficult to
> implement, and might be expensive to use. But it is sort of clean, and
> it generalizes the idea of procedure-binding overriding to overriding
> components.
>
> Is it worth pondering?
>
>
> _______________________________________________
> J3 mailing list
> J3 at mailman.j3-fortran.org
> http://mailman.j3-fortran.org/mailman/listinfo/j3
More information about the J3
mailing list