Fortunately, the rules above are far easier to apply in practice than they might appear, and typically amount simply to deciding which NDF components (or extensions) will not need any processing performed on them. These components are propagated and any that remain (and which the application chooses to support) are then processed. All others are ignored.
Propagation is performed by the routine NDF_PROP, which creates a new NDF structure via a parameter, based on a template NDF which already exists. At the same time, it will selectively copy components and extensions present in the template structure and use them to initialise the corresponding components (and extensions) in the new NDF. For example:
CALL NDF_PROP( INDF1, ' ', 'OUT', INDF2, STATUS )
will create a new output NDF, associate it with the parameter `OUT' and
return an identifier for it via the INDF2 argument.
The new NDF is based on the template structure with identifier INDF1, and
inherits its shape and the type and storage form of its components.
Subsequent changes may be applied to any of these inherited attributes if
required, e.g. by calling NDF_STYPE to change the numeric type of any
of the new NDF's array components (see §).