2014-10-28 3 views
3

Я относительно новичок в том, чтобы разные языки программирования обменивались данными друг с другом и оценил бы какую-то помощь. В основном у меня есть код Fortran и код Matlab. Оба кода сначала инициализируются, а затем запускаются последовательно. Каждый код требует ввода от другого. Когда этот процесс повторяется достаточно часто, достигаются некоторые критерии конвергенции, и итерация прекращается. Чтобы усложнить ситуацию, Fortran-код требует не только ввода от Matlab, но и его собственной предыдущей итерации. То же самое справедливо и для Matlab. Поэтому, насколько я вижу, лучше всего обе программы открывать в процессе итерации, поскольку у меня много переменных, и поэтому я могу просто написать их в текстовом файле, чтобы передать их другой программе и сохранить их для следующая итерация.Связь между Fortran и Matlab

Поэтому в основном я пытаюсь сделать что-то вроде этого:

переменная Initialise устанавливает A, B, C и D

Fortran:

Input: A and B 
Calculations … 
Output: A (variables have now new values) and D 

Matlab:

Input: C and D 
Calculations … 
Output: C (variables have now new values) and B 

Повторить Fortran и Matlab до тех пор, пока не будут достигнуты критерии конвергенции.

Итак, мои вопросы: Как заставить Matlab и Fortran взаимодействовать друг с другом и передавать переменные в одно и то же? И как каждый код запускает другой, а затем ждет, пока другой код завершит свой расчет первым, прежде чем продолжить?

+0

Я не знаю, насколько сложны вычисления, выполненные в среде Fortran или Matlab, но существуют и языки, ориентированные на вычисления (не столько для взаимодействия), поэтому может быть гораздо меньше хлопот, чтобы «переписать» меньше сложную часть кода с одного языка на другой и использовать только один язык (возможно, быстрее выполнить тоже). – Hoki

+0

Что вы подразумеваете под кодом Matlab? Функции MEX Level-2? – Peter

+0

@Hoki, к сожалению, переписывание m-файлов или среды Fortran не является вариантом, так как они оба очень сложны. Файл верхнего уровня .f вызывает множество подпрограмм, аналогично, файл .m-файла верхнего уровня вызывает много других m-файлов. – Dorit

ответ

0

Ключевыми словами для вашей любимой поисковой системы являются fortran mex. MATLAB имеет очень хорошую документацию/учебник, вы можете начать here:

MEX-файлы позволяют вызвать Fortran подпрограмму из MATLAB

Но я считаю, что это работает только, если вы звоните Fortran подпрограммы из Matlab. Вы не можете легко вызвать функцию Matlab .m из кода Fortran. Таким образом, ваша «основная» программа должна быть скриптом Matlab .m, который вызывает подпрограммы Fortran, определенные в файле MEX (который фактически является динамической библиотекой).

+0

Если я вызову подпрограммы Fortran из Matlab, что произойдет с фортран-переменными после завершения вызова? Я имею в виду, как я могу убедиться, что переменная set A (из исходного сообщения) будет доступна в следующем вызове Fortran? Я предполагаю, что одним из способов сделать это было бы перенос всех переменных из Fortran в Matlab, а затем снова из Matlab в Fortran, но у меня есть много переменных, которые нужно было бы передавать туда и обратно. Есть ли более элегантный способ сделать это? – Dorit

+0

http: // stackoverflow.com/a/2893604/2838364 – Peter

+0

@ Dorit: я не знаю много о Fortran, но с MEX-файлами C/C++ вы можете объявлять переменные глобальными, и они останутся доступными при следующем вызове функции MEX (также см. ['mexMakeMemoryPersistent'] (http://www.mathworks.com/help/matlab/apiref/mexmakememorypersistent.html)), если вы не очистите его из памяти (' clear mex' или 'clear all' будет выгрузите разделяемую библиотеку из памяти). Есть способы заблокировать MEX-функцию, чтобы предотвратить ее сильную очистку, вызывая утечку памяти (см. ['MexLock'] (http://www.mathworks.com/help/matlab/apiref/mexlock.html)) – Amro

Смежные вопросы