Я работаю над взаимодействием некоторого современного кода Fortran с R и получаю следующую ошибку:
forrtl: severe (151): allocatable array is already allocated
Несмотря на то, что сообщение об ошибке такое же, я не думаю, что происхождение этой проблемы не связано напрямую с этой записью здесь
Проблема/предыстория:
Я сам скомпилировал свой код Fortran как общий объект, используя 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
. Я нашел несколько, которые не были, но это не решило проблему.
Я проверил, что код Fortran выполняется до конца, используя простой оператор WRITE (*,*) 'END'
перед END SUBROUTINE
.
Цель состоит в том, чтобы иметь возможность многократно вызывать код Fortran в R для проведения анализа чувствительности, поэтому постоянная необходимость выгружать и загружать его существенно замедлит работу.
Если вы считаете, что мне нужно предоставить больше информации, дайте мне знать.
редактировать: компиляция с -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
. Не все выделенные массивы были освобождены к концу прогона... и я просто не нашел их все (хотя это была одна из попыток устранения неполадок, которые я предпринял заранее публикации этого..) Верно ли мое предположение, что, возможно, компилятор не уловил проблему, потому что, в отличие от предыдущее сообщение о stackoverflow, (де-)распределение технически не было в цикле (пока я не превратил исполняемый файл Fortran в общий объект)? Я бы счел это удивительным, но единственная информация, которую я нашел, это то, что освобождение — это просто "хорошая практика программирования" ?
PROGRAM
иEND PROGRAM
в.so
библиотеке? Здесь есть что-то рыбное. Пожалуйста, покажите реальный код. - person Vladimir F   schedule 29.01.2018ifort
и соответствующие флаги Пожалуйста, всегда старайтесь показывать актуальную информацию, если она у вас есть. В том числе флаги. Не говорите соответствующие флаги. Вместо этого покажите реальную командуifort ...
. Скомпилируйте свои программы с помощью-g -traceback
, чтобы получить более подробную информацию, включая номера строк. - person Vladimir F   schedule 29.01.2018251 ELSE
явно бесполезен. Вы должны показать хотя бы полную подпрограмму. Но обратите внимание, что ошибка, обнаруженная-check
, все равно другая. - person Vladimir F   schedule 29.01.2018