Выделенный массив уже выделен при взаимодействии Фортрана с R
Я работаю над интерфейсом некоторого современного кода на Фортране с R и получаю следующую ошибку:
forrtl: severe (151): allocatable array is already allocated
Несмотря на то, что сообщение об ошибке одинаково, я не думаю, что происхождение этой проблемы не связано напрямую с этой записью здесь
Проблема / фон:
Я сам скомпилировал свой код на Фортране как общий объект, используя ifort
и соответствующие флаги
Я могу вызвать общий объект, используя .Fortran
однажды в R. Тогда я должен сделать dyn.unload("HX.so")
чтобы потом перезагрузить его (dyn.load("HX.so"
) и запустите его снова.
Просто работает и перезапускает R-скрипт, который завершает R-сессию между ними.
Во время однократного запуска и после загрузки и выгрузки в R ожидаемый результат - содержимое, которое передается мне обратно в моем сеансе R или печатается во время выполнения сценария R.
Вот что еще отображается после сообщения об ошибке:
forrtl: severe (151): allocatable array is already allocated
Image PC Routine Line Source
libifcoremt.so.5 00007FF6276E7432 for_alloc_allocat Unknown Unknown
HX.so 00007FF628464F3F init_ Unknown Unknown
HX.so 00007FF62845F2D1 hx_ Unknown Unknown
libR.so 00007FF637316E76 Unknown Unknown Unknown
libR.so 00007FF63734EC8B Rf_eval Unknown Unknown
libR.so 00007FF63735213E Unknown Unknown Unknown
libR.so 00007FF63734EA93 Rf_eval Unknown Unknown
libR.so 00007FF637351060 Unknown Unknown Unknown
libR.so 00007FF63734EA93 Rf_eval Unknown Unknown
libR.so 00007FF6373500C7 Rf_applyClosure Unknown Unknown
libR.so 00007FF63734E86F Rf_eval Unknown Unknown
libR.so 00007FF63735213E Unknown Unknown Unknown
libR.so 00007FF63734EA93 Rf_eval Unknown Unknown
libR.so 00007FF637376102 Rf_ReplIteration Unknown Unknown
libR.so 00007FF637376451 Unknown Unknown Unknown
libR.so 00007FF63737650F run_Rmainloop Unknown Unknown
R 000000000040080B main Unknown Unknown
libc-2.17.so 00007FF633E77C05 __libc_start_main Unknown Unknown
R 000000000040083B Unknown Unknown Unknown
Что я уже пробовал:
Как следует из сообщения об ошибке, я определил все ALLOCATED
ALLOCATABLES
и посмотрел, все ли они DEALLOCATED
также. Я нашел несколько, которые не были, но это не решило проблему.
Я проверил, что код Фортрана работает до конца, используя простой WRITE (*,*) 'END'
заявление перед END SUBROUTINE
,
Цель состоит в том, чтобы иметь возможность многократно вызывать код на Фортране в R, чтобы выполнить анализ чувствительности, поэтому, всегда иметь необходимость выгружать и загружать его, что существенно замедлит процесс.
Если вы считаете, что мне нужно предоставить больше информации, дайте мне знать.
edit: компиляция с -g -traceback ничего не перехватывает во время выполнения или компиляции.
Компиляция с -g -traceback -check обнаруживает следующую ошибку во время выполнения:
forrtl: severe (151): allocatable array is already allocated
Image PC Routine Line Source
libifcoremt.so.5 00007F52C1432432 for_alloc_allocat Unknown Unknown
HX.so 00007F52C21D890F init_ 27 INIT.f90
HX.so 00007F52C21B685B hx_ 278 HX.f90
libR.so 00007F52D1095E76 Unknown Unknown Unknown
libR.so 00007F52D10CDC8B Rf_eval Unknown Unknown
..see above.
строка 278 в "основной" подпрограмме (HX) вызывает подпрограмму INIT, которая затем в строке 27 показывает ALLOCATABLE
, Делая grep, я не нашел, чтобы это было выделено где-то еще. ПРИМЕЧАНИЕ: но он также нигде не был освобожден..
все используемые флаги:
F90 = ifort
FFLAGS = -O3 -fpic -r8 -g -check -traceback # double-precision now run in Fortran , -fpic for creating shared object file
LDFLAGS = -lnetcdff -lnetcdf -shared #-shared, for creating a shared object file
Мой R-код:
dyn.load("HX.so")
years<-c(2007,2008,2009)
n_years<-as.integer(length(years))
y<-array(0,dim=c(14,6,n_years))
run_model <- function(pa=params) {
out<-.Fortran('HX',pa,n_years,array(as.numeric(0),dim=c(14,6,n_years)))
return(out)
}
out<-run_model(c(30,2))
out
ПРИМЕЧАНИЕ - решение: это было на самом деле DEALLOCATE
проблема.. Не все выделенные массивы были освобождены к концу пробега.. и я просто не нашел их всех (хотя это была одна из самых неприятных попыток стрельбы, которые я предпринял до публикации этого сообщения). Это мое предположение правильно, что, возможно, компилятор не уловил проблему, потому что, в отличие от предыдущего поста по stackru, (de) распределение не было технически в цикле (пока я не превратил исполняемый файл Fortran в общий объект)? Я нахожу это удивительным, но единственная информация, которую я нашел, - то, что освобождение - просто "хорошая практика программирования"?