跳转至

用户子程序扩展

FrontISTR 提供一组用户子程序,用于在不修改主体源代码的情况下扩展功能。其对象包括本构关系的用户实现以及用户自定义外部载荷的集成。本章列出可扩展的功能点,以及在分析控制文件中调用各功能点所使用的关键字。关于子程序参数的详细规范和重新构建步骤,请参阅用户子程序(编码指南)

功能总览

用户子程序的扩展点分为材料本构关系和外部载荷两类。本构关系侧有线性弹性、超弹性、弹塑性以及通用本构关系4种调用路径,分别由独立关键字启动。外部载荷侧提供从用户准备的外部文件读取载荷信息,并将其加入整体载荷向量和残差向量的路径。所有路径都需要先编辑 FrontISTR 发布物中附带的模板文件,再重新构建主体程序后才能使用。

扩展类别 分析控制关键字 主要用户子程序 编辑对象模板
用户线性弹性 !ELASTIC, TYPE=USER uElasticMatrix, uElasticUpdate fistr1/src/lib/user/uelastic.f90
用户超弹性 !HYPERELASTIC, TYPE=USER uElasticMatrix, uElasticUpdate fistr1/src/lib/user/uelastic.f90
用户弹塑性(屈服函数、返回映射) !PLASTIC, YIELD=USER uElastoPlasticMatrix, uBackwardEuler, uElastoPlasticNumStatus fistr1/src/lib/user/uyield.f90
通用用户本构关系 !USER_MATERIAL uMatlMatrix, uUpdate fistr1/src/lib/user/umat.f90
用户自定义外部载荷 !ULOAD, FILE=<fname> ureadload, uloading, uResidual fistr1/src/lib/user/uload.f90

不支持用户硬化规律(保留内置屈服函数、只将硬化曲线替换为用户实现的路径)。如果需要用户实现硬化曲线,请选择!PLASTIC, YIELD=USER,并将整个弹塑性本构关系替换为用户实现。不支持用户边界条件,也不支持重启时用户处理的扩展点。

不支持!CREEPTYPE=USER。如果要以用户方式实现时间相关本构关系,请使用!USER_MATERIAL

用户本构关系

用户本构关系是用于在外部子程序中实现内置材料模型无法表达的应力~应变关系的入口。根据对应的内置本构关系框架,有用户线性弹性、用户超弹性、用户弹塑性、通用用户本构关系4条路径。无论哪条路径,都要在分析控制数据的!MATERIAL块内,对相应关键字添加TYPE=USERYIELD=USER。最多可指定100个用户常数,并传递到子程序。

用户线性弹性

用户线性弹性是在小变形框架中由用户计算弹性矩阵的路径。在分析控制数据中指定!ELASTIC, TYPE=USER后,FrontISTR 将其作为小变形本构关系处理,并在单元刚度计算时调用uElasticMatrix(返回弹性矩阵\(D\)),在应力更新时调用uElasticUpdate(返回应力)。不要与现有超弹性模型或弹塑性模型同时使用。

用户超弹性

用户超弹性是在大变形(Total Lagrange)框架中,根据应变能函数的导数计算应力和切线刚度的路径。在分析控制数据中指定!HYPERELASTIC, TYPE=USER。调用的子程序与用户线性弹性相同,均为uElasticMatrixuElasticUpdate,模板也共用fistr1/src/lib/user/uelastic.f90。由于 FrontISTR 会根据关键字侧的指定切换为小变形处理或 Total Lagrange 处理,因此同一个模板不能同时作为小变形和大变形实现使用。应作为其中一种本构关系进行实现。

用户弹塑性

用户弹塑性是由用户实现屈服函数和返回映射(return-mapping)过程的路径。在分析控制数据中指定!PLASTIC, YIELD=USER。该路径进入与内置 Mises、Mohr-Coulomb、Drucker-Prager 各屈服函数独立的分支;在单元刚度计算时调用uElastoPlasticMatrix(返回弹塑性切线刚度\(D\)),在应力更新时调用uBackwardEuler(将试应力映射为真实应力并更新状态变量),在高斯点初始化时调用uElastoPlasticNumStatus(返回要保存的实数状态变量个数)。不支持只将硬化曲线替换为用户实现的路径。即使只需要用户实现硬化曲线,也要通过本路径将整个弹塑性本构关系替换为用户实现。

通用用户本构关系

通用用户本构关系是用于统一实现不属于弹性、超弹性、弹塑性框架的本构关系的路径。在分析控制数据中指定!USER_MATERIAL。默认按 Updated Lagrange 法框架处理;指定KIRCHHOFF时按 Total Lagrange 法处理。状态变量个数通过NSTATUS指定。在单元刚度计算时调用uMatlMatrix(返回切线刚度\(D\)),在应力更新时调用uUpdate(更新应力和状态变量)。

用户常数和状态变量的传递

对于!ELASTIC, TYPE=USER!HYPERELASTIC, TYPE=USER!USER_MATERIAL中的任一路径,写在分析控制数据数据行中的用户常数(最多100个)都会直接通过子程序的matl参数传递。对于!PLASTIC, YIELD=USER,会同时传递!ELASTIC指定的弹性常数以及通过!PLASTIC数据行给出的用户常数。

对于通用用户本构关系和!PLASTIC, YIELD=USER,可以通过状态变量fstat将前一步的历史信息(塑性应变、背应力、损伤量等)传递给用户实现,并在步骤结束时写回。状态变量的个数在通用用户本构关系中由!USER_MATERIALNSTATUS决定,在!PLASTIC, YIELD=USER中由uElastoPlasticNumStatus的返回值决定。

用户自定义外部载荷

用户自定义外部载荷是通过用户子程序定义内置集中载荷、分布载荷、体积力无法表达的外力的路径。在分析控制数据中写入!ULOAD, FILE=<fname>后,FrontISTR 会将指定的文件名传递给ureadload,用户实现所读取的信息则作为模块内数据保存。

!ULOAD的启动对应以下3个子程序。

  • ureadload: 在分析开始时,从控制文件指定的外部文件读取用户自定义载荷。用户实现负责打开文件,并将所需数据保存到模块变量中。
  • uloading: 在各步骤组装外部载荷向量时调用,将用户载荷加入整体载荷向量。当前步骤编号和载荷系数作为参数传递。
  • uResidual: 在各次迭代组装残差向量时调用,将用户载荷的贡献加入整体残差向量。从非线性迭代和平衡计算两者中都会调用。

没有提供对应用户边界条件(规定位移、接触条件的用户扩展)的扩展点。如果需要外力以外的用户扩展,请使用相应的内置关键字或用户本构关系路径。

用户子程序的实现步骤

要使用用户子程序,需要编辑 FrontISTR 源码发布物中包含的模板文件,然后重新构建 FrontISTR 主体。发布的二进制文件无法替换用户子程序,因此使用用户扩展时,需要准备可从源码构建 FrontISTR 的环境。

用户子程序模板位于fistr1/src/lib/user/下,每个扩展类别都有确定的编辑对象文件(文件名参见功能总览中的表)。所有文件在初始状态下,其子程序主体为空,或为线性弹性的示例实现,用户在其中加入自己的本构关系或载荷定义。编辑模板后,按通常方式使用 CMake 重新构建 FrontISTR 主体,并使用得到的fistr1可执行文件进行分析。

关于子程序参数的含义、状态变量数组的处理、重新构建时的注意事项等详细信息,分别见编码指南的各页面。

相关项目