我正在努力将一些现代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"?