阅读指导
本文将会涉及到以下内容:阅读方式阅读时长input 文件对于 ABAQUS 来讲是 native 的,因为在最初是没有 CAE 界面的,分析人员就只能把 input 提交给ABQ。这一历史就导致了目前一个比较常见的问题——某些关键字在 CAE 中无法使用。当然了,这只是部分原因,还有其他因素决定了 CAE 界面无法完全代替 inp 文件。
input 文件顾名思义就是用来输入 信息 的,是向 abaqus 的求解器提交信息的,提交 input 然后得到 output (通常是 .odb 文件)。不管我们使用什么方式来建立模型(也就是通常所说的前处理),最后要计算的时候都是使用一个叫做求解器的模块来进行的。通常我们对一款有限元软件的评价很重要的一方面就是求解器,我们大家都知道 ABAQUS 的非线性能力很强,其实就是他的非线性求解器很霸气。有点远了,回过来继续说 inp 文件。
inp 文件是我们向 ABAQUS 提交 job 的直接对象,无论通过什么方式进行提交都是直接把 inp 文件呈递给 ABQ (ABQ 在收到 job 任务之后会对 inp 进行预处理,本文不会涉及此部分内容)
input 文件包含了 几乎 所有的模型信息[^nealy all],包括模型的定义和求解以及输出要求。
[^nealy all]: 有时候我们还需要到用户子程序,那么 inp 就不是完整的
尽管 inp 如此重要,但是一般来讲我们是没有必要了解它的。因为对于很多工作,我们压根不需要碰这个文件,而且实际的情况是很多不了解它的人也能够做有限元分析。就像我们使用计算机却不必掌握计算机工作原理一样;但是当我们知道的足够多的时候很多东西变得简单明了。试想某一天你的电脑无法进入系统了,那么当你了解的足够多的时候你就可以清楚的知道是内存掉了,还是主板坏了,还是系统引导失败了。。。。。。
input 的重要还远不止于此,本文开篇就提到 input 对 Abaqus 来讲是 native 的,并且 CAE 中某些关键字是不能够使用的,而这些都只能交给 input 来做。
可以毫不含糊地讲,不会写 input 的厨师长都不是好司机。
对于那些没有清楚的编程概念的读者,我需要声明并且强调一下:写 inp 不是编程,也不是在写脚本。inp 只是为 ABQ 的求解器提供输入数据,我们写程序的时候经常需要读入外部文件,inp 就是这个角色——输入文件而已。
我在前面也提到了“ABQ 的预处理”,在这里稍微解释一下:将 input 中的数据结构(关键字 + 数据行)进行一些整理(按照 ABQ 事先约定的套路进行解释)然后传递给求解器(求解器就是解方程组用的),inp 就是一个传话的,我们想要让求解器干什么写在 inp 里面就行了(当然,远不止于此)。有一个非常明显的现象表明这个过程是确实会发生的,看一下面这个图,是不是很熟悉(或许你从来没有关注过这一部分的信息)。
这两个界面你熟悉吗?

Abaqus 的 doc 做的很好,至少有两个地方是可以参考的[1]
An analysis in Abaqus is defined by an input file, which contains keyword lines and data lines; and is divided into model data and history data.
预处理器读取 inp 文件时候,总需要一些规则吧,我们自己写程序进行 I/O 操作的时候不同样要指定一些规则吗?正所谓“无规矩不成方圆”,inp 必须遵守 ABAQUS 制定的规则。
这个地方没什么好解释的,接着往下看吧。
input 文件是 ASCII 纯文本格式的,可以使用任意的文本编辑器打开。当我们打开一个 inp 文件的时候会看到有三种不同的行。而这三种行分别从 功能 上对应着:
另外 需要注意的是 input 文件中不允许出现空行(文件最后有一个空行,但是这个不影响,因为这个不会被读取到)从 内容 上来讲,如我们上面所说,分为 model 和 history。
上面对两个部分必须包含的内容(在手册中以 required 进行标识)进行了加粗显示,也就是说一个完整的、正确的、可以被预处理器所接受的 inp 文件至少是应该包括这些信息的[2]。至于具体某一个关键字是属于 model 还是 history,要参考 Abaqus Keywords Reference Guide 的具体的条目,这些条目都以首字母排序出现在手册中。
参考 Abaqus Analysis User's Guide >> 1.2.1 Input syntax rules
关键字行的基本规则:
额外注意事项:
首先声明,数据不一定是数字,也可以是字符串、内部变量等
基本规则:
数据行到底怎么写,这要看他的关键字(及其参数)。因为 没有独立的数据行
这个关键字特殊就特殊在每一个完整的 input 文件几乎都是以他开始的,这个关键字没有任何参数,他的数据行没有固定的格式,你可以写任意多行的数据,但是只有第一行的前 80 个字符起作用,这些字符将会显示在 OBD 的“Title Block”(默认位置在窗口下方,以左对齐方式显示)中,其他的只能自己看看。这个其实对应着 CAE 中的 job 编辑器的 description 栏。此处我们将展示出文本的第一个实例,该例题来自于 Abaqus Example Problems Guide >> 3.1.1 Symmetric results transfer for a static tire analysis。注意: title block 的第二行太长而特意拆分成了多行显示

*heading 关键字和 ODB 的 title
我们可以看到*heading 和 *restart(即第二个关键字行)之间的部分全部为 *heading 的数据。而且只有第一行被写入了 ODB 的 title。
对这个关键字想要说明的是,你可以在这里写一些注释性的东西,就像这个例子一样,当我们时隔多日在看到这个文件的时候能够看一眼就知道他是干什么的。本例中 heading 区的内容包含:
好了,这个关键字不再解释了。
先放上一个 inp 文件,这个是一个顶点在 (0,0,0) 的立方体,楞长是20 mm,划分了1个 3D 8 节点单元,并且使用了减缩积分。定义了一个静力分析步,所有设置均为默认。定义了一个固定约束的边界条件。
*Heading** Job name: demo Model name: Model-1** Generated by: Abaqus/CAE 6.13-4*Preprint, echo=NO, model=NO, history=NO, contact=NO** PARTS*Part, name=Part-1*Node 1, 20., 20., 20. 2, 20., 0., 20. 3, 20., 20., 0. 4, 20., 0., 0. 5, 0., 20., 20. 6, 0., 0., 20. 7, 0., 20., 0. 8, 0., 0., 0.*Element, type=C3D8R1, 5, 6, 8, 7, 1, 2, 4, 3*Nset, nset=Set-1, generate 1, 8, 1*Elset, elset=Set-1 1,** Section: Section-1*Solid Section, elset=Set-1, material=Material-1,*End Part** ASSEMBLY*Assembly, name=Assembly*Instance, name=Part-1-1, part=Part-1*End Instance*Nset, nset=Set-1, instance=Part-1-1 1, 2, 3, 10, 11, 12, 19, 20, 21*Elset, elset=Set-1, instance=Part-1-1 1, 2, 5, 6*End Assembly** MATERIALS*Material, name=Material-1*Density 7.8e-09,*Elastic210000., 0.3******************************************************************** STEP: Step-1*Step, name=Step-1, nlgeom=NO*Static1., 1., 1e-05, 1.** BOUNDARY CONDITIONS** Name: BC-1 Type: Symmetry/Antisymmetry/Encastre*BoundarySet-1, ENCASTRE** OUTPUT REQUESTS*Restart, write, frequency=0** FIELD OUTPUT: F-Output-1*Output, field, variable=PRESELECT** HISTORY OUTPUT: H-Output-1*Output, history, variable=PRESELECT*End Step把上面这个 input 文件的结构列一下就是这样的(为了显示嵌套关系进行了缩进处理),这个结构很清晰了吧。
inp 文件结构解析
对新手来讲可能这个还有点看不明白,那我就用下面这个图解释一下吧。
inp 文件结构解释
然而细心的你可能已经发现 history 部分漏掉了一个 *restart 以及一个 *output,不过事实是“并没有这么简单”。这两个关键字都是有意略掉的。
明白了 input 文件的结构之后我们来抽取出几个关键字仔细分析。
在这一部分,还会细致地简讲解如何使用 keywords manual查阅 manual 是编写 inp 文件必不可少的步骤,而且 manual 是最权威的
3.2.1. model 部分的** *elset **
打开关键字手册,直接查找到 *elset,由于都是按照首字母进行排序的,非常好定位。
关键字 *elset
parameter.PNG
dataline.PNG
教你看懂 manual
接下来针对每一个参数进行解释:
*elset 后面必须要跟这个参数,另外这个关键字是有值的(必须赋值)。说如果我们想要定义一个叫做 demo 的单元集,那么 关键字行就是 *elset, elset = demo数据行和参数(及其值 )是紧密联系的,后者的设置往往直接决定了数据行怎么写。来看看此处的数据行(图 dataline.PNG)吧。
此处的数据行分了两种情况:
不妨先看后者吧,比较简单一点。就是一个等差数列,第一行必须是三个数据,如果有需要就重复第一行的格式接着写,而数据行的行数没有限制。例如的 单元集 demo 要包含 58~175, 200350(仅取偶数标号),500550(每10位取一个) 号单元,那么
*elset, elset = demo, generate58, 175, 1200, 350, 2500, 550, 10提示一下:根据关键字及其参数的规则,generate 完全可以写成 gen。
再来看一下 使用 generate 参数时候对应的数据行。
第一行 把单元标号列出来就可以了,最多16个,但是你的单元集可能往往多余16个,没关系,重复第一行的格式跟着写。除了直接写单元标号之外也可以写 子单元集 的名字,也就说说我们前面 已经定义过的 单元集可以包含进来(原先的单元集仍保持不变)。假设我们要建立单元集 demo 中包含 subelset1 和 subelset2 两个单元集
*elset, elset = demosubelset1, subelset2DEMO-elset
注意事项:
3.2.2. history 部分的 *boundary
该关键字内容太多,不可能向前面一个关键字一样讲得那么完整。另一方面,doc 中涉及的方方面面我们能用到的太少了,所以也没有完全了解的必要。实用主义该关键字包含 三大类参数(包含 空参数)和五大类 dataline(大类里面还有小类。。。。。。)。
keyword--*boundary
我们来看一下如何通过 inp 修改边界条件。回到第一个案例(立方体模型),我们原先设置的是
固定约束条件,现在想改为仅仅约束2~3两个自由度,而第一个自由度为指定位移 1 mm。(由于是实体应力单元没有更多的 DOF)。
** ------------------------------------ original*BoundarySet-1, ENCASTRE** ------------------------------------ modified*boundary, type = displacementset-1, 1, 1, 1set-1, 2, 3, 0在改写的版本中
数据行第一行表示 DOF1~1,即 DOF1,1 个单位的 displacement(单位需要全局统一,本例为 mm)
数据行第二行表示 DOF2~3施加值为0的位移,也就是限制了y/z方向的位移。
而这两行数据他们的作用对象都是 set-1(这是一个节点集)
此部分改写依据的参数和数据行如图:
info for BC
至于如何从众多的参数和数据行类型中选取,没有什么好方法,这个需要一定的软件使用经验。
继续来看这个关键字的其他部分,在图 keyword--*boundary (我的每个图下方都是有标题的)中左下角分页的顶部看到 Optional, mutually exclusive parameters 这些就是互斥参数,在脚注10中已经解释过。 在上方第二个分页上存在 参数user,这是使用子程序时候用的。接下来的一节中就会讲到 inp 引用外部文件。
3.3.1. 子程序
inp 引用外部文件的第一种情形在上一节结束时提到了——子程序,关于子程序的知识请参考 doc。
需要强调一下目前很多人对 fortran 程序的一些基本概念不清楚,例如 f77和固定格式你真的了解吗?(不管你是编写 fortran 程序的高手还是打算学习但未入门的新手,请移步 FAQ之 基本概念。)
3.3.2. 单元/节点 数据
在第一个例子中,我仅仅给整个模型划分了1个网格,而这一个网格拥有8个节点。如果模型中的网格数量巨大,inp 文件将会变得非常大,行数可能达到上百万行。这时候别说是编写或者查看 inp 了,就是打开一下可能对于某些机器上的某些编辑器(比如 Windows 上的记事本)就是非常艰巨的任务。ABQ 提供了这样一种机制就是允许使用 *include 关键字或者 inp 参数引入外部文件。doc 中的例题多数会采用这样的方式,将数量众多的单元和节点放入一个单独的文件中。
有两种方法可以使用:
inp 参数后面的 inp 文件里面仅仅包括 *node 的数据行(节点编号及其坐标)
这个 inp 文件是这么写的:
1, 20., 20., 20.2, 20., 10., 20....最后允许出现空行*include 关键字后面的参数是 input,他后面的 inp 文件是完整的节点定义(带有关键字行)
这个 inp 文件是这么写的:
*node1, 20., 20., 20.2, 20., 10., 20....把 *include 理解为复制粘贴比较简单一些,而其作用也正是如此。而 inp 参数就不一样了,他的作用不仅仅是复制粘贴,他所复制过来的内容要作为当前关键字的数据行。
对于很多仅仅使用 CAE 的用户,他们可能根本没注意过 inp 的存在。实际上 inp 是非常方便和快捷的建模手段,而且很灵活。另一方面 inp 是纯文本,纯文本的好处就是走哪带哪,基本上没有什么限制,不必使用专用软件打开(想想 docx,xlsx,pptx,psd,eps ...)【题外话,又绕远了】。另一方面 inp 的体积比较小的(尽管有时候高达上百MB),各个版本之间的兼容性(其实涉及到关键字)很好,而 cae 文件这方面不具有优势的。我们平常使用 CAE 来进行的那些操作怎么用 inp 来代替呢? 或者说 inp 还能提供哪些我们在 CAE 下所不能完成的任务呢? 我们一起来看看吧。
abaqus job=fileBaseName int cpus=40, 不过我喜欢直接指明版本号,例如我用的是 v6.13-4,那么 abq6134 job=fileBaseName int cpus=40。这两个命令的意思就是 提交名称为 fileBaseName 的 inp 文件进行计算,并且使用40个cpu以交互模式来运行。所谓交互模式就是在命令行会反馈一些信息,例如 隐式分析中的日志文件会带印在窗口上,显式分析的 日志文件和状态文件 会打印在窗口上。关于命令行中各个选项的使用,参考:分析手册 3.2.2. Command summary但是需要知道的是,每一个被导入的 inp 文件都会创建一个 新的 Model。因此 你所导入的材料或者界面并没有导入你正在操作的模型。如果要把这些信息导入你当前工作模型,那么使用 model copy 功能即可,可以从模型树上 model 节点操作,或者菜单 model 操作。
