TA的每日心情 | 奋斗 2016-2-26 13:48 |
---|
签到天数: 508 天 [LV.9]以坛为家II
|
马上注册,下载丰富资料,享用更多功能,让你轻松玩转阳光石油论坛。
您需要 登录 才可以下载或查看,没有账号?欢迎注册
x
本帖最后由 joylin 于 2018-11-22 02:47 编辑
原帖地址:http://www.sunpetro.cn/forum.php ... 1&extra=#pid1939311
问题如下:
我在用Petrel跑拟合的时候,报了个错,错误描述如下:
“ UNABLE TO ALLOCATE MEMORY FOR ARRAY GRID OF TYPE DOUBLE , LENGTH 333601241, AND REQUIRING 2545 MBYTES. THE SYSTEM ERROR RETURNED WAS 41 3369 MBYTES PREVIOUSLY ALLOCATED THIS IS AN OUT-OF-MEMORY CONDITION. ”
怀疑提问的朋友直接拿了精细地质模型输入了模拟器,未经过粗化,3亿的网格规模,需要规模集群或者大型工作站了。
好吧,其实这是个简单的问题,但还是值得思考下,因为目前精细模拟又被提出来了,动辄宣传几亿的网格规模,但是使用界限大家还是要明确的。
这个模型网格规模达到了3亿!其实,模拟器的提示已经很全面了,就是模拟器的表达太死板。
这里来解释下,网格的属性数据,比如渗透率,在模拟器里是已一个双浮点数类型(double)的数组(或者叫一维矩阵),
一个333601241规模的双浮点数数组,在64位系统下的内存占用约为2.5GB。用python来验证下:
但是,你要知道模拟器还需要很多的属性数组,比如三个方向的渗透率、孔隙度等,在模型计算中还有很多结果也是保存在同样规模的双浮点数数组中,比如饱和度、压力等。
因为模拟器通常使用牛顿迭代,所以要保留前几次迭代的结果,这就导致储存矩阵的数量在增多。所以模拟器的线性迭代一般都是使用稀疏矩阵,因为内存占用小。
模拟器使用的内存,除了属性,还跟流体相数目有关,比如3相肯定大于2相。tnavigrator模拟器里明确说了,最小内存范围:一个3相活网格需要3kb,一个2相活网格需要2kb。为什么,因为相态数据也是要储存为数组矩阵的。所以组分模型需要的内存就更多了。
ECLIPSE中的NSTACK 关键字,可能大家经常用来改善线性迭代收敛性,其实这个关键字就是增大了线性迭代结果的储存栈的深度,用来储存前几步的结果,更好的为以后的线性迭代做参考值。所以增大这个数,也会增大内存使用。我见过有人设置1000,额~~~
还有,并行、非邻链接NNCs、LGR啊,都会增大内存使用哦,当然网格规模还是最重要因素。
就这个模型而言,实际过程就不是一个2.5GB可以满足了,你瞧,模拟器告诉你了,他需要404GB,但是恐怕你没有那么多内存。其实这也是模拟器的预估计,实际计算过程中可能需求更多。
内存不够的问题,在10几年前,计算机内存不大的时候,做模拟还时有发生,但是后来内存都大了,大家反而忽视了内存使用的优化。
如何解决也简单,第一种:控制网格规模,对照自己的内存大小,选择合适的网格规模;第二种:购买足够的内存,你的公司是王思聪开的话,可以考虑这一条^_^
有人可能说,为什么不把这些数据保存到本地硬盘,这要内存使用就少了。其实就目前的硬件条件不可行,因为数据量太大,本地的读写也太慢。
有人可能又说,现在的模拟器不都是动态内存分配吗,其实动态内存分配是在初始化阶段完成,内存检测也是,主要根据的就是你输入的数据维度大小。也就是说,动态分配只是不需要你指定数据DIMS了,但是最低的要求还是有的。像tnavigrator,cmg全都是动态分配,所以不需要你输入dims设置和预分配内存设置。
额,ECLIPSE的runspec部分的welldims等DIMS设置,这应该是遗留的兼容问题。明确的是目前的ECLIPSE是动态内存分配。所以MEMORY这个关键字也是遗留而已,不起作用的哦。
如何查看目前模拟的内存分配呢?ECLIPSE为例,PRT文件,搜索MEMORY:
其他的,大家有兴趣的话,自己研究下吧。
最后说一句,要做精细模拟,大规模模型,你的软硬件、人工、时间成本都会增加不少,至于目前的油价环境,玩得起的,想要玩的,都是土豪!
|
|