本帖最后由 shifang157300 于 2019-7-27 21:20 编辑
ANSYS UPFs二次开发教程(原创,持续更新) 发布日期:2012年2月11日,最后更新日期:2019年7月27日 QQ - 1549221758
本贴第十八部分更新了Win10 + ANSYS 19.1二次开发环境搭建方法(2019年7月27日)
引言: 各位对UPFs感兴趣的朋友们,ANSYS UPFs二次开发教程回来了,我原来发过一个帖子——“基于ANSYS 12.0 UPFs 教程 (原创) 持续发布”,但由于种种原因现已不能访问,故在此再开一贴,希望能够为那些奋斗在ANSYS二次开发战线上的新手提供一点帮助。关于ANSYS二次开发的详细内容可关注新书——由中国水利水电出版社出版的《ANSYS二次开发及应用实例详解》(说明:本书的销量和我没有任何利益关系,卖的多少和我无关)。感兴趣的朋友可以关注一下。关于本贴及上述新书,或者你有什么问题,都可发邮件或者加qq向我咨询:师访(中国矿业大学博士毕业,中国科学技术大学近代力学系博士后,2017年7月已至淮阴工学院工作),pomato157300@126.com,我会为您提供必要帮助。
您的回贴,是对我最好的支持,是我更新的动力! 首先简单介绍ANSYS二次开发的工具。ANSYS二次开发工具大致有4个,分别是APDL、UPFs、UIDL及Tcl/Tk,其中后面两个用于ANSYS交互界面开发。APDL(ANSYS Parametric Design Language)大家都熟悉,ANSYS参数化设计语言,及俗称的命令流。它由类似于FORTRAN的语言部分和1000多条ANSYS命令组成。APDL是一种解释性文本语言,有顺序、选择、循环及宏等结构。利用APDL将ANSYS命令组织起来,编写出参数化的用户程序,从而实现有限元分析的全过程,即建立参数化的实体模型、参数化的网格划分与控制、参数化的材料定义、参数化的载荷和边界条件定义、参数化的分析控制和求解以及参数化的后处理。这里向大家介绍两个APDL二次开发的常用简单命令,/COM和/SYS。/COM命令可以用于在ANSYS Output窗口中输出相关信息,比如当前计算时间,塑性应变等等,这一点非常方便。/SYS用于暂停当前运算并调用外部程序,例如/SYS,D:/1.exe则会调用D盘下的1.exe可执行文件,利用这个功能,可以大大扩展APDL的分析能力。市面上APDL书籍很多,这里不再过多介绍。 UPFs是本贴的介绍对象。UPFs(User Programmable Features),即用户可编程特性,它是源代码层次的ANSYS二次开发,用户可以根据需要利用UPFs重新编译连接生成用户定制版本的ANSYS软件,例如创建新单元、定义新的材料属性、定义用户失效准则等等。使用UPFs需要安装Fortran编译器,并设置编译环境(主要是系统环境变量设置),后面以ANSYS 12.0,32位xp系统为例详细介绍安装方法。利用UPFs可以完成很多APDL很难完成的工作,比如复杂材料本构模型的开发,单元的开发,优化算法的定义,接触准则的定义等等。
一、一个简单的例子,线弹性材料模型usermat开发 材料的本构行为体现为应力-应变关系,usermat子程序的主要任务是定义材料的应力-应变关系,具体分为两个方面。首先由给定的应变增量计算得到应力增量 ,从而得到新的应力 ,称做应力更新过程。其次还要求usermat给出雅可比矩阵,学名是一致切线算子矩阵。usermat用户子程序仅用于最新技术单元,不支持传统单元。 (1)usermat fortran用户子程序的结构如下: *deck,usermat USERDISTRIB parallel gal subroutine usermat( & matId, elemId,kDomIntPt, kLayer, kSectPt, & ldstep,isubst,keycut, & nDirect,nShear,ncomp,nStatev,nProp, & Time,dTime,Temp,dTemp, & stress,statev,dsdePl,sedEl,sedPl,epseq, & Strain,dStrain, epsPl, prop, coords, & var0, defGrad_t, defGrad, & tsstif, epsZZ, & var1, var2, var3, var4, var5, & var6, var7, var8) c************************************************************************* #include "impcom.inc" c INTEGER & matId, elemId, & kDomIntPt, kLayer, kSectPt, & ldstep,isubst,keycut, & nDirect,nShear,ncomp,nStatev,nProp DOUBLE PRECISION & Time, dTime, Temp, dTemp, & sedEl, sedPl, epseq, epsZZ DOUBLE PRECISION & stress (ncomp ), statev (nStatev), & dsdePl (ncomp,ncomp), & Strain (ncomp ), dStrain (ncomp ), & epsPl (ncomp ), prop (nProp ), & coords (3), rotateM (3,3), & defGrad (3,3), defGrad_t(3,3), & tsstif (2) c c***************** 用户定义部分************************************* c* * c* * c***************** 用户定义部分************************************* return end (2)其输入输出变量说明如下: 1、usermat输入变量及其数据类型: ● matId:材料号;整型。 ● elemId:单元号;整型。 ● kDomIntPt:材料积分点号;整型。 ● kLayer:单元层号,仅用于分层单元,用于usermat的18x族单元中仅SHELL181有分层功能;整型。 ● kSectPt:单元截面号;整型。 ● ldstep:载荷步数;整型。 ● isubst:载荷子步数;整型。 ● nDirect:正应力或正应变分量的个数,与单元类型有关;整型。 ● nShear:剪应力或剪应变分量的个数,与单元类型有关;整型。 ● ncomp:应力分量或应变分量个数,ncomp= nDirect + nShear;整型。 ● nStatev:状态变量个数,通过TB,STATE命令定义;整型。 ● nProp:材料常数个数,通过TB,USER命令定义;整型。 ● Temp:增量步开始时的温度;双精度。 ● dTemp:增量步内的温度增量;双精度。 ● Time:增量步开始时的时间,但并非真正的时间,仅仅是计算过程的标记;双精度。 ● dTime:增量步内的时间增量;双精度。 ● Strain(ncomp):增量步开始时的应变分量,包括机械应变及温度应变两部分;双精度数组。 ● dStrain(ncomp):应变增量,仅包含机械应变,温度应变成分已被去除;双精度数组。 ● prop(nProp):材料常数数组,由TB,USER及TB,DATA命令定义,可定义不同温度下的材料常数;双精度数组。 ● coords(3):当前材料积分点的坐标;双精度数组。 ● rotateM(3,3):大变形分析(NLGEOM,ON)时考虑刚体转动用到的增量型旋转矩阵,小变形分析时为单位矩阵;双精度矩阵。该矩阵老版本中存在,现已被废除(本贴第七部分提供了计算转动矩阵R的代码)。 ● defGrad_t(3,3):增量步开始时的变形梯度矩阵;双精度矩阵。 ● defGrad(3,3):增量步结束时的变形梯度矩阵;双精度矩阵。 2、usermat输出变量及其数据类型: ● keycut:载荷切分控制参数,0—不切分,1—切分,默认情况下不进行载荷切分,当ANSYS主程序检测到收敛困难时进行载荷切分,并输出keycut=1;整型。 ● epsZZ:平面应力状态时垂直于平面方向的应变,仅在平面单元或壳单元考虑厚度变化时使用;双精度。 ● tsstif (2):横观剪切刚度,tssif(1)-GXZ,tssif(2)-GYZ;双精度数组。 ● dsdePl(ncomp,ncomp):一致切线算子矩阵,dsdePl(i,j)表示增量步结束时由第j个应变分量的改变引起的第i个应力分量的变化。ANSYS默认一致切线算子矩阵是对称的,若要使用非对称的一致切线算子矩阵(对于采用非关联流动法则的塑性材料模型,一致切线算子矩阵往往是非对称的),需要使用NROP,UNSYM命令打开非对称求解器;双精度矩阵。 3、usermat输入输出变量及其数据类型: ● stress(ncomp):应力分量,增量步开始时由ANSYS主程序传入,需要在usermat中更新为增量步结束时的值;双精度数组。 ● statev(nStatev):状态变量,用于存储与材料模型有关的变量,如塑性因子、强化参数、损伤变量等,增量步开始时由ANSYS主程序传入,需要在usermat中更新为增量步结束时的值;双精度数组。 ● epsPl(ncomp):塑性应变分量,增量步开始时由ANSYS主程序传入,需要在usermat中更新为增量步结束时的值;双精度数组。 ● sedEl:弹性区标记,仅用于后处理,对计算过程无影响;双精度。 ● sedPl:塑性区标记,仅用于后处理,对计算过程无影响;双精度。 (3)通过APDL命令很容易使用自定义材料模型。 只需在前处理部分使用下列语句即可: TB, USER, matId, NTEMPS, NPTS 关键字USER表示使用用户定义材料模型;关键字matId表示材料号;NTEMPS为温度点的个数,即可定义不同温度下的多组材料常数;NPTS表示每一温度下材料常数个数。 (4)线弹性本构usermat
附件是线弹性本构usermat源代码及测试用的命令流: 二、UPFs二次开发安装及环境变量设置(以ANSYS12.0,32位xp 系统为例) (1)安装 Visual Studio 2005 professional,安装在C盘,默认安装。 若提示链接不存在,则尝试将上述网盘地址复制到浏览器地址栏打开。
(2)安装 Intel Visual Fortan 11.1.038,安装在C盘,默认安装 安装时要选中“ANSYS Customization Files”,如下图所示: (4)下面最重要的一步,设置系统环境变量:需要修改系统path环境变量,新建lib和include环境变量。环境变量的作用是让系统方便迅速的获得相关文件。 三、UPFs几乎所有子程序的简单介绍 首先做一点说明,这里所说的子程序大致分为两类:一类是用户子程序,即可以被用户修改的、多以User或u开头的、可以在安装文件夹下找到(如下图所示)的、需要重新编译连接的Fortran子程序;另一类是一般的子程序,ANSYS提供给用户方便ansys二次开发的,包括子程序(subroutine,无返回值,使用时需要external声明语句)和函数(Function,有返回值,使用时不需要External声明语句)。
1、材料本构模型开发用户子程序
(1)usermat:在所有用于本构模型开发的子程序中,usermat是使用范围最广的子程序,单元的每个积分点在每个载荷子步的每次迭代均会调用usermat。usermat支持所有最新技术单元(Current-technology Elements),最新技术单元区别于传统单元。 (2)UserHyper:虽然usermat功能强大,但其无法用于开发超弹性材料,若想实现超弹性材料本构的开发,必须利用UserHyper用户子程序。 (3)usercreep及usercr:ANSYS提供了两个用户子程序usercreep及usercr来定义用户蠕变方程,这两个用户子程序可用来模拟材料的时间相关粘塑性/蠕变行为。usercreep利用隐式时间积分算法,而usercr利用的是显示时间积分算法。usercreep用于较长时间段的蠕变分析,如岩石及金属的长期蠕变分析;usercr用于瞬态蠕变分析。 (4)user_tbelastic:用来定义线弹性材料特征,允许将弹性材料参数定义成温度或坐标的函数,支持大多数最新技术单元。 user_tbelastic仅仅用于定义弹性阶段的材料本构,它可用来与许多非线性材料模型联合使用,例如BISO、BKIN、MISO、KINH、NLSIO、PLASTIC、CHABOCHE、CAST IRON、CREEP、EDP(Drucker-Prager模型)、SMA(形状记忆合金)、PRONY及GURSON等。 (5)userpl:如果用户想利用传统单元定义塑性或粘塑性本构关系,则可以使用userpl。适用于LINK1、LINK8、PIPE20、BEAM23、BEAM24、PLANE42、SOLID45、PIPE60、SOLID62、SOLID65、PLANE82、SOLID92及SOLID95。 (6)usersw:用户膨胀子程序usersw用于编写用户自定义的膨胀律,其调用方式是设置C72=10。 (7)UserVisLaw:定义粘性模型,仅用于FLUID141及FLUID142单元。 (8)userfic:用于定义用户摩擦模型,用于接触单元:CONTA171、CONTA172、CONTA173、CONTA174、CONTA175、CONTA176、CONTA177、CONTA178。 (9)userfc:定义层合板类材料的破坏准则。 2、单元开发用户子程序 开发单元有两种方法:用户子程序(1)和(2)联合使用是一种方法,通过UserElem用户子程序可以方便的建立新单元,ElemGetMat为新单元处理材料本构部分,难度适中;(3)和(4)联合使用是另外一种方法,该方法直接访问ANSYS单元相关数据库和文件,难度较大。 (1)UserElem:从ANSYS 11.0开始新增的。使用该子程序创建单元无需直接访问ANSYS数据库。 (2)ElemGetMat:用于调用ANSYS标准结构材料库,与UserElem结合使用。 (3)uec100-uec105:在通过直接访问单元相关数据库和文件的方式创建单元时,用于定义单元特征参数。 (4)uel100-uel105:在通过直接访问单元相关数据库和文件的方式创建单元时,用于计算各种单元矩阵(刚度矩阵、比热矩阵等)、单元载荷向量(力载荷、热流载荷等)以及所有单元输出变量。此外还要完成单元输出过程,计算需要保存的各个变量并储存在结果文件中。 3、单元开发支持子程序 以下子程序(注意不是用户子程序)用于单元开发: (1)nminfo:给单元特征向量定义单元名称,输入变量为单元特征向量ielc(见\ANSYS Inc\v120\ansys\customize\include文件夹下的echprm.inc),单元参考名称,输出变量为加入了单元参考名称的单元特征向量。 (2)svgidx:获得保存的变量的索引。 (3)svrget:获得单元保存的变量。 (4)mreuse:决定在迭代过程中哪些单元矩阵及向量可被重复使用,哪些单元矩阵及向量需要重新计算。 (5)rvrget:获得单元实常数。 (6)propev:计算一组材料特性参数。 (7)prope1:计算某一个材料特性参数,若要计算多个材料参数,可使用propev子程序。 (8)pstev1:计算1维单元的材料特性参数。 (9)plast1:更新单元塑性历史,用于具有一个应力(应变)分量的单元,包括LINK1、LINK8、BEAM23、BEAM24和SOLID65(增强型)单元。 (10)plast3:更新单元塑性历史,用于具有4或6应力(应变)分量的单元,包括PLANE02、PLANE13、PIPE20、SHELL43、SHELL51、PIPE60、SOLID62、SOLID65、SHELL91、SHELL93、SHELL143、SOLID191。 (11)creep1:更新单元蠕变历史,用于1维单元,包括LINK1、LINK8、BEAM23、BEAM24和SOLID65单元。 (12)creep3:更新单元蠕变历史,用于3维单元,包括PLANE02、PLANE13、PIPE20、PLANE42、SHELL43、SOLID45、SHELL51、PIPE60、SOLID62、SOLID65、PLANE82、SHELL91、SOLID92、SHELL93、SOLID95、SHELL143及SOLID191。 (13)swell1:更新单元的膨胀历史,用于1维单元,包括LINK1、LINK8、BEAM23、BEAM24。 (14)swell3:更新单元的膨胀历史,用于3维单元,包括PLANE02、PLANE13、PIPE20、PLANE42、SHELL43、SOLID45、SHELL51、PIPE60、SOLID62、PLANE82、SHELL91、SOLID92、SHELL93、SOLID95、SHELL143和SOLID191。 (15)usereo:在不可累加杂项数据(NMISC)中存储数据。 (16)eldwrtL:将单元数据写入文件。 (17)eldwrnL:将单元不可累加杂项数据写入结果文件。 (18)tmpget:子程序temget用于定义当前温度载荷。 (19)prsget:定义当前压力载荷。 (20)cnvget:定义当前对流载荷。 (21)prinst:可用于计算主应力和应力强度。其输入输出输出变量只有一个s(长度为11的数组),s(1)、s(2)、s(3)、s(4)、s(5)和s(6)分别存放σx 、σy 、σz 、σxy 、σyz 和 σzx,经子程序计算后输出主应力σ1、σ2 和σ3 保存在s(7)、s(8)和s(9)内,应力强度保存在s(10)内,s(11)内输出的是Mises等效应力。也可用来计算主应变(ε1 、ε2 和ε3 )的大小。提醒大家,这是一个很重要的子程序。 4、修改和监视已存在单元的用户子程序 (1)userou:用于存储用户提供的单元输出,对于需要将单元数据存入nmisc记录的所有单元,都要调用该用户子程序。该子程序通过USRCAL命令激活:USRCAL,USEROU (2)useran:单元坐标系控制,修改shell43、shell63、shell91、shell93、shell99,以及solid46、solid64、solid191单元材料性能参数和应力的方向,可通过单元关键选项调用。 (3)userrc:对COMBIN7和COMBIN37单元的参数进行操作。当设置单元的keyopt(9) = 1时调用该子程序,且C1或C3必须为非零值。 (4)UElMatx:访问单元矩阵和载荷向量,如频域分析的载荷向量等。主要目的是监视(或修改)单元矩阵和载荷向量。 (5)UTHICK:定义SHELL181、SHELL208、SHELL209以及SHELL281单元的初始厚度。 (6)Us_Surf_Str:获取PLANE2、PLANE42、PLANE82以及SOLID45、SOLID92和SOLOD95单元的单元面应力。 (7)uflex:计算单元PIPE288和PIPE289的柔性系数。当输入单元的轴向柔性系数为-10时调用该用户子程序。 (8)usflex:计算单元PIPE16、PIPE17、PIPE18和PIPE60的柔性系数。当输入单元的轴向柔性系数为负数时调用该用户子程序。 5、载荷用户子程序 以下用户子程序用于定义载荷: (1)usrefl:可将一些标量表示的载荷(如温度、流量、热生成量、含水量等)修改成用户定义的值,该子程序在每个使用标量场载荷的载荷步及载荷子步内、每次平衡迭代过程中均会被调用,在进入该子程序之前,已获得ANSYS输入的单元或节点值信息。 (2)userpr:用于改变单元压力,该子程序在每个使用单元压力的载荷步及载荷子步内、每次平衡迭代过程中均会被调用,每个单元调用一次。在进入该子程序之前,已获得ANSYS输入的单元或节点值信息。 (3)usercv:用于改变单元面对流信息,该子程序在每个载荷步及载荷子步内的每次平衡迭代过程中均会被调用,每个单元调用一次。在进入该子程序之前,已获得标准ANSYS输入的对流面信息,因此利用这些信息可以随意按照用户意愿修改对流信息。 (4)userfx:用于改变单元面热流信息,该子程序在每个载荷步及载荷子步内的每次平衡迭代过程中均会被调用,每个单元调用一次。仅在热流载荷形成阶段调用,热流计算阶段不调用。 6、计算干预用户子程序 用户子程序 | 对应的情况 | UAnBeg | ANSYS启动时执行 | USolBeg | 求解开始前执行 | ULdBeg | 载荷步开始前执行 | USsBeg | 载荷子步开始前执行 | UItBeg | 迭代步开始前执行 | UItFin | 迭代步结束后执行 | USsFin | 载荷子步结束后执行 | ULdFin | 载荷步结束后执行 | USolFin | 求解结束后执行 | UAnFin | ANSYS结束前执行 |
7、用户自定义命令子程序 user01到user10,用户可以利用这10个子程序来定义用户ANSYS命令。利用/UCMD命令为调用相关子程序(user01到user10)的用户命令命名。 8、支持子程序 (1)GetRForce:该函数用于获得节点反力值(返回对应指针)。 (2)GetStackDisp:该函数用于获得当前位移值(存储在快速访问数据中,返回对应指针)。 (3)ElResultStrt:该子程序用于从分析结果中获得载荷数据。 (4)ElResultGet:获得选择的坐标点的结果。 (5)ElInterp:给定坐标点的xyz坐标及相应容差,获得包含该坐标点单元号。 9、访问ANSYS数据库的子程序 这部分内容包括选择或获得节点及单元的子程序、节点信息相关子程序、单元特征相关子程序、耦合及约束相关子程序、节点载荷子程序、单元载荷子程序、结果信息子程序,由于内容较多,参见附件: 10、方便用户开发的子程序 内容包括通用子程序、向量操作子程序和矩阵操作子程序,见附件:
四、关于usermat与初始应力场inistate命令的矛盾(2012.02.23更新)
单独把这一个小问题拿出来说明是有原因的。ANSYS的inistate命令用于定义初始应力场(或初始应变场),在岩土工程中应用十分广泛(初始地应力平衡,类似于ABAQUS的geostatic载荷步),但是,本构开发子程序usermat.f不能直接和inistate命令联合使用,经过摸索,发现可以在usermat中使用 call get_ElmData('ISIG',elemId,kDomIntPt,i,sigi(1))来解决这个困扰我近半年的问题!希望这点经验可以帮助到你。:)
五、关于ANSYS 14.0的二次开发环境设置(2012.03.07更新)
类似于ANSYS 12.0,只需用Visual Studio 2008替换Visual Studio 2005即可,即Intel Fortran 11.1+Visual Studio 2008,环境变量设置参考ANSYS 12.0设置。
六、关于Programmer's Manual for Mechanical APDL的第一部分Ⅰ:Guide to interfacing with ANSYS(2012.05.06更新)
细心的朋友会注意到,与ANSYS UPFs帮助文档(Ⅱ:Guide to ANSYS User Programmable Features)并列的是Ⅰ:Guide to interfacing with ANSYS。
该手册主要介绍的ANSYS数据结构,绝大多数情况下不会用到,用户若想获得ANSYS数据可以通过*vget、*vwrite、*vput等命令获取。但有时,详细了解ANSYS数据结构及其相关操作程序还是十分必要的。
该手册共分为4部分:
(1)Format of Binary Data Files
主要介绍ANSYS分析过程中产生的二进制文件的数据结构,这些二进制文件在下一次迭代计算时还会用到,也就是说它们是随着计算的进行不断更新的。常见二进制文件有:结构分析及耦合场分析*.RST文件,热分析*.RTH文件,磁场分析*.RMG文件,流场分析*.RFL文件,此外还有*.EMAT单元矩阵文件,*.SUB子结构矩阵文件,*.FULL刚度质量矩阵文件等。
每种ANSYS二进制文件都由很多个记录(Record)组成。而且都有一个标准文件头,由100个整型数据组成,紧接着是具体文件的文件头,如*.RST文件的文件头,其中以ptr开头的表示指针,指向某一LOC号,LOC所在位置即为具体数据。需要注意的是LOC所在位置的数据可能仍是指针,继续指向下一层数据。
利用/AUX2命令可以将二进制文件(以RST文件为例)转换成ASCII格式文本文件:
/AUX2
FILE, , RST
FORM, LONG
DUMP, ALL
执行以上命令后可得文本文件。打开该文本文件,参照手册中对RST文件的详细数据结构说明,即可找到相关数据。
(2)Accessing Binary Data Files
主要介绍用于读、写、修改ANSYS二进制文件的程序。其中两个演示性的Fortran程序:ResRdDemo.f用于将ANSYS二进制文件输出到ANSYS Output窗口中;ResWrDemo.f说明如何写ANSYS二进制文件。其他程序大家可参考帮助手册。
(3)The CDWRITE (CDB) File Format
介绍CDB文件格式及相关命令。CDB文件是模型文件,用于与其他软件互导,该文件包含节点、单元、载荷等信息。
(4)ANSYS Graphics File Format
介绍图形文件格式。
七. 邓肯-张本构usermat程序(2013.3.5更新)
邓肯-张本构模型是一种非线性弹性本构模型,广泛应用于土石坝工程及地基工程,有E-ν模型和E-B模型两种,参数可由常规三轴试验获得,应用方便。
附件:usermat程序:,命令流:
第十五部分更新了:正交各向异性材料usermat!(Updated on 2014.1.1)
第十六部分更新了:ANSYS15.0+Win7 64位UPFs二次开发环境设置方法(Updated on 2014.3.6)
第十七部分更新了:再论usermat,通过Newton-Raphson迭代解析usermat执行过程(Updated on 2015.4.20)
|