Выделяемый массив уже выделен при взаимодействии Fortran с R

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


person Annemarie Eckes    schedule 29.01.2018    source источник
comment
Добро пожаловать. Где твой код? См. минимальный воспроизводимый пример и Как спросить.   -  person Vladimir F    schedule 29.01.2018
comment
Как вы можете иметь PROGRAM и END PROGRAM в .so библиотеке? Здесь есть что-то рыбное. Пожалуйста, покажите реальный код.   -  person Vladimir F    schedule 29.01.2018
comment
используя ifort и соответствующие флаги Пожалуйста, всегда старайтесь показывать актуальную информацию, если она у вас есть. В том числе флаги. Не говорите соответствующие флаги. Вместо этого покажите реальную команду ifort .... Скомпилируйте свои программы с помощью -g -traceback, чтобы получить более подробную информацию, включая номера строк.   -  person Vladimir F    schedule 29.01.2018
comment
Извини за это. ПРОГРАММА, конечно же, ПОДПРОГРАММА, которая также есть в моем коде. Теперь я показываю все соответствующие флаги. Код огромен. Я постараюсь разбить его на важные части. Но я могу не знать, что такое важные биты, и случайно их пропустить):   -  person Annemarie Eckes    schedule 29.01.2018
comment
251 ELSE явно бесполезен. Вы должны показать хотя бы полную подпрограмму. Но обратите внимание, что ошибка, обнаруженная -check, все равно другая.   -  person Vladimir F    schedule 29.01.2018
comment
извините, я думал, что это сообщение об ошибке просто показывает, что оно имеет какое-то отношение к приведенному ниже, где условия теперь адекватны и код работает. Да. Я заметил это и пока закомментировал запись этого файла. Таким образом, я вернулся к предыдущему сообщению об ошибке выделяемого массива. Будет редактировать выше   -  person Annemarie Eckes    schedule 29.01.2018