Одна вещь, которую вы не хотите делать, это что-то вроде:
INTEGER :: X(1:1000,1:1000,1:1000)
CALL myRoutine(X(2:999,2:999,2:999))
, где myRoutine по какой-то причине не может работать с границами массива. Он не может передать ссылку на фрагмент массива, поскольку он не является непрерывным в памяти. Таким образом, он создает временный массив и копирует значения из X. Нет необходимости говорить, что это очень медленно. Но у вас не должно быть этой проблемы с одномерным массивом, даже при указании срезов, так как они все еще находятся в памяти.