在将Fortran与R连接时已经分配了可分配数组

时间:2018-01-29 14:53:46

标签: r fortran allocation interfacing

我正在努力将一些现代Fortran代码与R连接并得到以下错误:

forrtl: severe (151): allocatable array is already allocated

即使错误消息相同,我也不认为此问题的根源与此条目没有直接关系 here

问题/背景:

我自己编译了我的Fortran代码作为共享对象,使用ifort和相关的标志

我可以在R中使用.Fortran调用共享对象一次。然后我必须这样做     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语句检查了Fortran代码是否一直运行到最后。

目的是能够在R中多次调用Fortran代码进行灵敏度分析 - 因此,总是必须卸载并加载它会大大减慢速度。

如果您认为我需要提供更多信息,请与我们联系。

编辑: 使用-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.
子程序(HX)中的第278行调用子程序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问题。并非所有分配的数组都在运行结束时被释放了...而我根本没有找到它们(尽管这是我提前做出的一次尝试发布此... ..) 我的猜测是正确的,也许编译器没有解决这个问题,因为与the previous post on stackoverflow不同,(de-)分配在技术上并不是在循环中(直到我将Fortran可执行文件转换为共享对象)? 我会发现这很令人惊讶,但我发现的唯一信息是释放只是"good programming practice"

0 个答案:

没有答案