Указатель Fortran для переупорядоченного массива для передачи в процедуру - PullRequest
1 голос
/ 10 июня 2011

Я пытаюсь интегрировать два кода Fortran 9x, которые содержат массивы данных с обратным порядком расположения массивов. Один код (я назову его старым кодом) имеет установленную библиотеку подпрограмм, и я пытаюсь использовать их с другим (новым) кодом настолько эффективно, насколько это возможно (т. Е. Не нужно создавать временные массивы только для переупорядочения массив и передать его в подпрограмму, а затем придется заменить старый массив на новый переупорядоченный результат). Например,

Старый код:
oldarray (1: n, 1) -> переменная 1 для n элементов
oldarray (1: n, 2) -> переменная 2 для n элементов
.. и так далее

новый код:
newarray (1,1: n) -> переменная 1 для n элементов
newarray (1,1: n) -> переменная 2 для n элементов
.. и так далее

Переменные индексы не обязательно связаны между двумя кодами. Если мне нужна только одна переменная для передачи в процедуру, я просто передаю newarray (1,1: n), и процедура не знает разницы. Однако если для процедуры из старого кода требуются переменные 1-6 oldarray, которые могут соответствовать переменным 2,6,8,1,4,3 (я только что выбрал произвольные числа) newarray, возможно ли создать указатель, который Я мог бы перейти на процедуру? Проще говоря, возможно ли будет просто создать указатель для транспонирования нового массива? Например, указатель (1000,6) указывает на новый массив (6,1000).

Примечание. Невозможно переписать новый код для использования одного и того же порядка массивов, поскольку оба кода используют порядок массивов, который лучше всего подходит для его структур цикла, которые нельзя изменить.

Кроме того, у меня очень мало опыта работы с указателями. Я знаю, что могу создать производный тип данных, который состоит из массива указателей, но я не думаю, что смогу передать это процедуре требуемым образом (я могу ошибаться, так как у меня очень мало опыта работы с производными типами данных ). Справочник, который у меня есть (Fortran 95/2003 для ученых и инженеров), рассматривает только расширенные приложения указателей в терминах связанных списков и деревьев. Я также нашел в Интернете небольшую информацию об указателях на Фортране, помимо того, что описано в этой книге.

Спасибо за вашу помощь.

1 Ответ

1 голос
/ 10 июня 2011

Я думаю, что ответ - нет, вы не можете сделать это, и это не помогло бы в любом случае.

Вы можете делать всякие супер-крутые вещи с указателями массивов, с переходами по массивам и т. Д., Но я не вижу, как вы можете изменить порядок данных.

Так что я могу ошибаться, и это возможно, но тогда возникает вопрос: как бы это вам помогло?Предположительно, вы хотите, чтобы пользовательские указатели переупорядочивали данные без копирования;но когда вы обмениваетесь такими вещами, компилятору разрешено выполнять копирование-в-копирование;например, создать временный массив, скопировать данные, передать их в подпрограмму и скопировать данные по возвращении.И на самом деле это почти наверняка будет правильным решением в этом случае с точки зрения производительности;таким образом, старый код мог бы обращаться к памяти в быстром порядке, а транспонирование-копирование могло бы также быть выполнено быстрым способом.

Так что я подозреваю, что правильный способ решения этой проблемы - этоКопировать / копировать подходить к себе явно.

...