Выделенный массив уже выделен при взаимодействии Фортрана с 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

Что я уже пробовал:

Как следует из сообщения об ошибке, я определил все ALLOCATEDALLOCATABLES и посмотрел, все ли они 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 в общий объект)? Я нахожу это удивительным, но единственная информация, которую я нашел, - то, что освобождение - просто "хорошая практика программирования"?

0 ответов

Другие вопросы по тегам