Я работаю над проектом, в котором результаты программы численного моделирования должны быть оптимизированы для соответствия измеряемому поведению. Я написал несколько подпрограмм произвольной формы на Фортране для извлечения определенных данных и выполнения некоторых предварительных вычислений, которые отлично работают. В целях оптимизации я планирую использовать алгоритм локального поиска, представленный здесь: http://mat.uc.pt/~zhang/software.html#bobyqa
Я передаю некоторые аргументы, такие как размеры и векторы параметров, в подпрограмму Fortran 77, и проблема в том, что переданные массивы аргументов не достигают другой стороны. Только первый элемент будет отображаться в массиве с размерностью 1.
Я нашел несколько полезных ответов в разделе Как использовать подпрограммы Fortran 77. в Fortran 90/95? и попытался поместить весь код 77 в модуль, но у меня все еще не получается. Явный интерфейс помогает получить все переменные в подпрограмме уровня 1 f77, но когда данные передаются на другой уровень (уровень 2), где должны быть построены массивы предполагаемого размера, одномерные массивы генерируются, если вообще генерируются.
Сначала я компилирую код f77, используя ifort -c -fixed (и пробовал -f77rtl), затем f90 и связываю все вместе.
Почему массивы предполагаемого размера не генерируются должным образом?? Тестовая программа от производителя работает нормально!
Как я могу передавать все необходимые данные через и обратно определенным образом, не используя явные интерфейсы? Или есть способ определить подходящие интерфейсы?
Вот пример кода:
program main_f90
use types
implicit none
real(dp) :: array(N)
interface
subroutine sub77_level1(array)
implicit real*8 (a-h,o-z)
real*8, intent(inout) :: array
dimension array(:)
end subroutine
end interface
[...fill array...]
call sub77_level1(array)
end
subroutine sub77_level1(array)
implicit real*8 (a-h,o-z)
integer i1, i2, i3, i4
dimension array(:)
[...modify array...]
call sub77_level2(array(i1), array(i2), array(i3), i4)
return
end
subroutine sub77_level2(array_1, array_2, array_3, i4)
implicit real*8 (a-h,o-z)
dimension array_1(*) array_2(*) array_3( i4, * )
[...modify...]
call sub_f90( <some other arrays, intent(in / out)> )
return
end
i4
в списке аргументовsub77_level2
. Откуда оно оттуда. У вас есть какая-то особая причина не использоватьimplicit none
? Это реальный код, который у вас есть (вы должны должны отображаться как один)? Обязательно скомпилируйте с-g -warn -check -traceback
. - person Vladimir F   schedule 26.01.2016sub77_level1
использует массивы предполагаемых форм (спецификация измерения(:)
). Это не Fortran 77 - это, по крайней мере, Fortran 90. Использование этого фиктивного аргумента предполагаемой формы - вот почему этой процедуре требуется тело интерфейса в вызывающей области. (Существует несоответствие в спецификации INTENT между телом интерфейса для этой процедуры и подпрограммой для процедуры.) - person IanH   schedule 26.01.2016sub77_level1
точкой входа в bobyqa? - person why.n0t   schedule 27.01.2016MODULE BOB ; IMPLICIT REAL*8 (A-H,O-Z) ; PRIVATE ; PUBLIC BOBYQA ; CONTAINS ; [...Subroutines...] ; END MODULE
, но возникает та же проблема, предполагаемые массивы размеров 1-d. Может быть, мой заголовок модуля неверен? Компиляция выполняется в Windows с использованиемifort -c bob_module.f -debug:full -check:all -fixed -f77rtl
. Сначала модуль, затем линковка сifort -o program.exe $(OBJECTS) bob_module.obj -debug:full -check:all
- person cclem   schedule 27.01.2016