计算机的物理内存(real
memory)对ansys程序来讲,主要用于两部分:一部分用于维持ansys程序在系统内的运行(ansys
excutable),另一部分用于ansys的工作空间(workspace)。对于32位系统来说,ansys默认的工作空间是512MB,64位系统来说,ansys默认的工作空间是1GB。一旦程序要求的内存大于计算机的物理内存(real
memory),那么程序会占用一部分磁盘空间将其作为内存使用,即通常所说的虚拟内存(system
virtual memory),用作虚拟内存的这部分磁盘空间称之为交换空间(swap
space),文件称之为交换文件(swap file)或页面文件(page file)。这是基本概念
因此,交换空间大小和计算机的物理内存大小、工作空间大小、ansys本身运行所需要的内存有关。
ansys工作空间又分为两部分,一部分称之为数据库空间(database
space),主要存储ansys几何模型,载荷,材料属性等数据,另一部分称之为暂存空间(scratch
space),主要用于内部计算,如布尔运算,单元矩阵生成,方程求解等。32位系统中,512MB的默认工作空间中256MB用于database
space,256MB用于scratch space。64位系统同样被平均分成两部分。
一旦模型太大,数据库空间盛不下,将会调用虚拟内存,虚拟内存使用系统函数来实现内存和硬盘之间的数据交换,而物理内存使用ansys指令来实现内存和硬盘的数据交换。用于ansys虚拟内存的文件称之为页面文件(page
file),文件名为:jobname.page其大小取决于模型大小,不建议使用页面文件,因为其处理数据比较低效。因此,要给database
space分配足够的物理内存,防止使用页面文件(page
file)实现内存和硬盘之间的数据交换。
如果暂存空间不足以满足内部运算的话,ansys会分配额外的内存来满足程序要求。
{zh0}有足够的物理内存来运行ansys任务,划分网格或者是方程重新排序过程中物理内存不足而暂时性的使用虚拟内存对运算速度影响还不是很大,但是如果求解过程中物理内存不足,会使运算过程慢上十倍。
上面这部分是基本术语。下面是内存分配问题。
通常情况下不需要手动配置内存,ansys内存管理器会自动分配额外的内存。通过-m命令设置初始内存块的大小,这个命令分配的内存存在于两个连续的块内。例如:-m
1800 -db 300,即首先分配300MB的连续内存块给database space,然后分配1500MB的连续内存块给scratch space.理想情况下,ansys从初始内存块内部分配内存,使得在各个仿真阶段可以有效的重新利用内存块。一旦ansys需要更多内存,它就会向系统伸手要,新的内存块为scratch
space一半大小或分配的新的内存块的大小。当出现分片内存引起的内存不足导致的计算失败的情况时需要改变默认内存分配设置。(关于连续内存块和分片不连续内存的问题还需要和各位大虾讨论)
下面这个例子可能对内存分配有所启发:(指南的原话)
For example, if a large model requires a contiguous block of 800 MB
for the sparse solver, the default memory allocation will be
insufficient (-m 1024 MB minus-db 512 MB = 512 MB contiguous
memory). ANSYS would try to allocate an additional 800 MB block of
contiguous memory to satisfy the sparse solver requirement,
bringing the total memory requirement to 1800 MB (1024 default plus
800 additional). This memory requirement may fail on smaller
systems, especially 32-bit Windows systems(这个内存要求可能会失败,特别是32位windows系统). To accomodate this model within
the default memory availability, specify a-db 100, resulting in an
initial memory block of 924 MB, which is sufficient to satisfy the
sparse solver requirement of 800 MB.
什么意思呢?一个大的模型需要800MB的连续内存块用于稀疏矩阵求解,默认的内存分配显然不够,采用-m
1800的设置可能失败(特别是32位windows系统),但是如果设成-db 100就行
具体原因需要和大家继续讨论
32位windows系统,{zd0}寻址空间为2GB或3GB(这还是在3GB开关打开的情况下才能使用)。当Ansys启动时,不同的进程,包括Ansys本身以及保证Ansys正常运行的各种动态链接库和保证操作系统正常运行的动态链接库,来争夺这点有限的空间。所有这些程序必须常驻在分配给ansys程序的进程空间中。如果分配给ansys实际寻址空间中存在一个或多个上述进程,这些进程会将内存分割成不连续的小块,这是ansys对内存不连续块的理解.上述文字也解释了不连续内存块的形成原因。
可以使用以下方式来确定一个特定的操作系统所容许的分配给Ansys的{zd0}工作空间(即-m命令后面指定的数字),用不同的-m命令和固定的-db命令启动ansys,这样就可以确定出极限-m的大小。一般来说,32位的操作系统-m设定(即工作空间设定)不能超过1200MB,-db(数据库空间设定)不能超过256MB。
写到这里,楼主的问题似乎也就迎刃而解了,我们可以得到以下几条启发:
1. 不是计算机的物理内存越大,ansys就一定越块,这要看使用的是64位系统还是32位系统,32位系统{zd0}只支持
3G的内存(有些说是3.25GB,32位XP系统),并且默认的工作空间是-m 512MB,其中database space和Scratch space各占去一半
2 尽量使ansys的运算使用系统的物理内存,因为物理内存使用ansys自带的函数实现内存和硬盘的数据交换,而虚拟内存使用的是系统函数实现数据交换。如果不想让ansys慢的跟蜗牛似的就尽量调大scratch
space吧
3 ansys似乎只能使用连续的内存块,即-m的设定只能是连续内存(这可能是为什么32位系统的-m{zd0}不能超过1800MB的原因)
对于32位Windows操作系统来说,最有效的办法是指定一个小的初始内存块(比数据库空间大50MB),然后让ansys根据需要生长出更小块的内存,这是ansysworkbench默认的内存分配方式,对于使用PCG求解器的任务能够有效的工作。但这种内存分配方式对需要大块内存的求解器不适用。这种情况下,通常需要指定一个大的初始内存分配,同时减小模型数据库的初始内存分配。
-m指令在程序启动时分配命令指定的虚拟内存(是不是可以理解为在计算机物理内存不足的情况下才分配额外要求的虚拟内存?)
修改工作空间(workspace)的大小(-m命令),其实是在修改暂存空间(scratch space)的大小,因为32位系统默认的数据库空间(data
space)256MB一直保持不变。
现在已经解决方法如下:
1. 把工作空间开到{zd0},把数据库空间尽量调小,可以一点一点的试,(设置成ansys能够运行的极限值),虚拟内存{zd0}值喝醉小值都开到{zd0},c盘,工作目录所在的盘符都设(先别管能不能用得上)
2. 如果上述方法,还不能计算,又不想提高计算机配置,只能通过简化你的模型了,逐步降低模型的节点数(不要看单元数,节点数较准),降到能计算的程度。
3. 选择适当的求解计算器,一般数据量较大的模型,都推荐pcg。