**当问题的自由度和复杂程度比较小的时候,计算速度也许不是什么太大的问题,但当自由度很多,比如几百万个自由度,又有复杂的接触搜索计算时,计算速度就很重要了。我不精通计算机原理,但在百度Windows和Linux上安装使用过32位和64位ABAQUS,也在64位工作站上用Linux并行计算过,对计算速度有一点自己的心得,写出来和大家讨论下,对计算机比较精通的,希望能解释下原理和表达下自己的看法。我认为影响计算速度的因素主要有3个:
1 计算模型的大小和复杂程度
2 ABAQUS中关于内存和硬盘使用的设置
3 计算机的配置在ABAQUS帮助文件中说,一个有限元模型在分析计算中,会生成两种临时文件,第一种临时文件是必须放在内存中,第二种临时文件可以放在硬盘里也可以放在内存中。
由于内存读写速度比硬盘读写速度快,所以如果计算机配置不变的情况下,要达到最快计算速度,就要在计算时让两种临时文件都放在内存中。在计算前进行datacheck,然后在dat文件中会告诉你能使模型计算所需最小的内存量,也就是在计算中所生成的第一种文件的大小,还会告诉你最小I/O交换情况所需的内存量,也就是两种文件都放在内存中时所需要的内存量,我称这叫“全速计算”所需内存量。
在ABAQUS6.8中,有个内存使用上限设置参数,也就是你允许你的计算机中有多少内存让ABAQUS使用,如果你允许ABAQUS使用的内存上限大于“全速计算”所需内存,则ABAQUS会将两种临时文件放入内存使用。如果允许内存大于最小所需内存,小于“全速计算”计算内存,则ABAQUS会把第二种文件一部分放入内存,一部分放入硬盘。如果允许内存小于最小所需内存,则无法计算。所以如果你的模型“全速计算”所需内存量很小的时候,或者相对你的计算机物理内存很小的时候,如果不改变计算机配置,速度就已经达到最快了,再加大内存或内存上限也没用。如果你的模型无法进行“全速计算”,首先可以在可能的情况下,提高ABAQUS允许使用内存上限值来提速,如果本身物理内存的限制,那么加大物理内存也能提速。下面说说CPU和内存的使用问题。首先CPU和内存频率越高计算速度就会越快。当“全速计算”时,我看到的是CPU在分析计算时能100%使用(除了前处理,写入计算结果和两迭代计算中间隙时),多CPU计算也是如此。不是“全速计算”时,分析计算种CPU部分时间能100%使用,和部分CPU能100%使用,我想这应该和硬盘读写速度相对较慢导致的吧。如果有两个模型在某计算机中都能“全速计算”,两个“全速计算”的内存之和也不超过允许使用内存大小,如果同时计算,计算速度应该都小于分别单独计算时的速度,因为CPU要分配给两个模型用。如果两个“全速计算”的内存之和大于允许使用内存,则同时计算时就会“抢内存”,计算速度就会大打折扣,这还没考虑如果使用了虚拟内存的情况。如果你设置的ABAQUS使用的内存上限大于你实际的物理内存,这个时候好像就会用到虚拟内存,计算速度也会大打折扣。如果你用ABAQUS时还有其它程序也在大量使用内存和CPU,也会很影响速度。所以务必保证你设置的允许使用内存上限,必须是计算机物理内存实际能空闲提供给ABAQUS使用的内存。然后再是Linux和并行计算的问题,一台计算机使用多个CPU进行计算也算是一种并行计算,在“全速计算”情况下参与计算的CPU越多,计算速度越快。我用的是ABAQUS6.8,Linux用的是opensuse10.3,计算机用的是两台64位8CPU工作站。
我的计算速度经验是,同一个模型在“全速计算”情况下,用隐式计算,单机Linux计算时间是单机Windows计算时间的四分之三,两个工作站Linux并行计算的时间是单机Windows计算的二分之一。
这个问题我也是研究过:
1 计算速度在不同的ABAQUS处理阶段是不一样的,所以不同时间CPU的使用率也是不同的
2 CPU要和相应的内存相配套,例如64位的操作系统要和4G以上的电脑,我的是16G的内存,8核CPU,CPU有时候可以全部达到50%以上
3 CPU只有在显式计算中能体会到最大的使用率,可以看到所有的CPU在运行,很壮观的。
是的,前处理,写入计算结果和两迭代计算中间隙时,CPU使用率没有真正计算时高。对于显示计算,之所以CPU总能100%利用,我觉得是因为由于显示计算时,临时文件只有第一种临时文件,也就是临时文件都只能放到内存中,所以显示计算就相当于隐式计算的“全速计算”。隐式“全速计算”时,CPU全部用满的确很壮观,我用两个64位工作站进行Linux并行计算时,16个CPU的使用率都是100%时很让人兴奋啊!
既然有人把老贴顶起来了, 我就再多啰嗦两句, 望Robert_Su网开一页. 首先, I/O是指input/output,是指用于基本输入输出的交换文件大小, 如果内存了不够的话, 这个文件是放在硬盘上的, 如果内存足够大的话, 这个文件则会由ABAQUS进行任务调度放入内存以提高速度, 即设定内存使用量的百分比. 这个不是指所需的内存量, 而是作为一个控制磁盘剩余空间的参数. 其次, 关于缓存大了是不是一定好的问题, 缓存是一个磁盘文件的部分或全部镜像, CPU要得到数据首先是通过查找其内部的高速缓存, 或叫一级缓存, 如果没有, 再查找二级, 还没有再查找内存中的磁盘缓存, 还没有就查找磁盘文件, 一部级数越高, 其缓存物理速度越快, 空间也越小, 价格也高, 所以系统分级缓存是一个金字塔形的, 假如CPU在前三次都没找到, 第四次找磁盘空间才找到, 为什么不能直接找磁盘呢, 这样不是更节约时间? 问题就出在所有的缓存都是下一级缓存部分镜像上, 而且查找缓存也要用到一定的时间, 这种情况下, 磁盘文件在内存中的缓存就不是越大越好, 而是刚刚好最好, 小了会减小命中率, 大了会增加查找时间.
再次, 关于多CPU的问题, 操作系统在进行任务调度的时候会尽量安排互相之间没有资源冲突的线程分CPU进行计算, 最后再进行数据同步, 每个CPU和线程都占用独立的运行空间, 为了对公用的数据空间进行管理, 防止几个线程同时改变公共数据, 同步技术在这里被使用了, 跑得快的必须在某个点停下来等跑得慢的, 这样就造成了执行效率的下降, 但是保证了数据安全, 没有必错误的修改, 所以不可能出现一个CPU在进行每二步迭代了, 另一个CPU还是算第一步的情况, 特别是在std中很明显, 我曾经试过4CPU比2CPU计算会慢一点点的情况. 就是因为数据同步的问题.
model change 单元的钝化和激活技术在对施工工序进行模拟时是十分必要的。因此,探索ABAQUS中单元的钝化和激活具有明显的意义。在本论坛*Model change 的应用技巧初步
http://forum.simwe.com/viewthread.php?tid=842837&extra=page%3D1%26amp%3Bfilter%3Dtype%26amp%3Btypeid%3D2&page=1
经过网友们的热烈讨论,尤其是
jsnjcivil的提醒后,才发现这个该帖内容尤其是原帖的inp文件已经跟后边讨论的内容存在比较大的出入了,不便于对model change的正确把握。为了方便以后的网友更容易掌握该命令的应用,特开新贴并进行修正。
基本原理:
首先将结构分成两个独立部分,一是需要在前期需要钝化而随后需要激活的部分,另一部分就是不需要做任何处理的剩余部分。在此将其分别命名为“需要钝化”的部分和“不需要钝化”的部分。由于ABA在激活单元时是在该单元的原始位置予以激活,而实际结构分析中往往要求在变形后的位置上以无初始应变的方式激活。故需要先确定变形后的相应位置,并予以激活。为此特设置一种具有“追踪功能”的单元。此单元实际上是“需要钝化”单元的备份单元(通过elcopy命令实现),具体要求如下:
1.该单元跟“需要钝化”单元形状完全一致,共享节点,但具有不同的单元号;
2.该单元的刚度很小,它的存在不影响原有结构的计算结果;
3.该单元的自重无限小,不至于由于自重导致该单元产生过大应力和变形; 可见,该“追踪功能”的单元具有“完全弹性”性质。
因此,当添加此单元后,实际结构实际上由三部分组成,一是“需要钝化”的单元,二是“不需要钝化”的单元,三是赋予了完全弹性材料特性的 “追踪单元”。
现在,如果将原来 “需要钝化”的单元钝化掉(*model change, remove),则结构中剩下的就是“不需要钝化”的单元和“追踪单元”两部分。由于“追踪单元”的刚度很小,所以,理论上是不影响原有结构的受力的。但由于追踪单元仍在结构上,其变形位置是可以随 “不需要钝化”单元的变形而获得的。
当此时激活先前已经钝化的单元时,由于该单元与“追踪单元”共享节点,先前已经钝化的单元就自然而然的获得变形后的位置了。这就是“追踪”功能的基本原理。
如果“追踪单元”不采用完全弹性材料,则结构的刚度就会因此增大很多,这是第一个需要注意的地方。如果“追踪单元”的自重参数较大,则会因其弹性模量较小而产生很大的变形,这是第二个需要注意的地方。如果钝化单元后结构体系的约束设置不合理,则会出现结构不稳定的现象,这是第三个需要注意的地方。由于“追踪单元”的“完全弹性”和小自重特性,理论上讲,对结构的任何一部分的计算都不会有很明显的影响。
基本步骤:
建立part,结合施工顺序的要求对相关part进行partition,并将partition 后的各个独立部分设置单元集(以便在elcopy的时候调用)。此时的结构由两部分组成,一是“需要钝化”的单元集,二是剩余的“不需要钝化”的单元集。这两部分必须相互独立,不能有交集。当然,在同一个part里,允许有多个“需要钝化”的单元集存在。
在assembly阶段,将涉及“需要钝化”单元集的部分按part内同样的要求设置相应的单元集,以便model change时方便调用。 其它建模步骤先按一般方法完成。 然后对形成的inp文件进行修改。
1.在涉及“需要钝化”的单元集的instance里添加elcopy命令行
*Elcopy, Element shift=XXXX, Old set=Original_Set, New set=Trace_Set, Shiftnodes=0
此处的Element shift=XXXX是单元号的增加量,一般要求略大于该instance中原有单元数的最大值,否则会出现材料重复定义的错误提示;也不宜设置过大。Old set=Original_Set此处的Original_Set是在该instance中 “需要钝化”的单元集。New set=Trace_Set是新增的用于追踪的单元集。Shiftnodes=0即表示新增追踪单元集Trace_Set与“需要钝化”的Original_Set单元集共享节点。
2. 在assembly 中设置“需要钝化”的单元集,以便在model change进行相关操作。如果不在此处设置单元集,则在model change调用的时候需要指定part属性。
3.添加“完全弹性”材料
要求完全弹性,即相对于非钝化单元的弹性模量小,最好能小5个数量级;要求质轻,以避免自重引起变形过大,可近似取自重密度比其弹性模型模量小5个数量级。
4.在适当阶段钝化单元集
Remove all elements in element set Original_Set *MODEL CHANGE, REMOVE Original_Set
需要注意的是钝化掉的是原始单元集,而不是“追踪单元集”,否则无法实现追踪功能。
5.在需要激活的阶段激活已钝化单元集
Reactivate elements in element set Original_Set *MODEL CHANGE, ADD=STRAIN FREE Original_Set
在此步中也可以将“追踪单元集”remove掉。
附件为 jsnjcivil修改后的模型,共学习参考。该模型在model change命令中采用的是直接调用instance内部的单元集。也可以在assembly中定义单元集后直接调用单元集。