pyfem 帮助文档

pyfem是一个完全基于python语言实现的极简有限元求解器。依赖的第三方库包括numpy、scipy和meshio等,主要用于有限元方法的学习、有限元算法验证和快速建立材料本构模型的程序原型。

https://app.codacy.com/project/badge/Grade/ab5bca55d85d45d4aa4336ccae058316

Created by Jingyu Sun: sunjingyu@imech.ac.cn

Installation 安装

支持的操作系统包括:Windows,Linux和MacOS。

Recommend 推荐

Use the package manager pip to install pyfem:

使用pip命令安装:

pip install -U pyfem

If you have no root access on Linux/MacOS, please try:

如果您在Linux/MacOS上没有root访问权限,请尝试以下操作:

python -m pip install -U pyfem

Users in China can install pyfem from mirrors such as:

中国用户可以使用以下镜像:

From Source 基于源代码

git clone https://github.com/sunwhale/pyfem.git
cd pyfem
pip install .

or 或者

git clone https://github.com/sunwhale/pyfem.git
cd pyfem
python install.py

采用第二种方法需要将可执行文件或批处理文件写入环境变量。

Quickstart 快速开始

Run in command line 在命令行运行

pyfem --help

Run the first example 执行第一个算例

当前算例文件存储目录 examples/tutorial ,该算例定义了一个二维平面应变模型,材料为塑性随动强化,载荷为y方向的循环拉伸-压缩。

cd examples/tutorial
pyfem -i Job-1.toml

算例配置文件 Job-1.toml

title = "Job-1"

[mesh] # 前处理网格文件
type = "gmsh"
file = 'mesh.msh'

[dof] # 自由度
names = ["u1", "u2"]
order = 1
family = "LAGRANGE"

[[amplitudes]] # 幅值列表
name = "Amp-1"
type = "TabularAmplitude"
start = 0.0
data = [
    [0.0, 0.0],
    [0.5, 1.0],
    [1.0, 0.0],
    [1.5, -1.0],
    [2.0, 0.0],
    [2.5, 1.0],
    [3.0, 0.0],
    [3.5, -1.0],
    [4.0, 0.0],
    [4.5, 1.0],
    [5.0, 0.0],
]

[[bcs]] # 边界条件列表
name = "BC-1"
category = "DirichletBC"
type = ""
dof = ["u2"]
node_sets = ['bottom']
element_sets = []
value = 0.0

[[bcs]] # 边界条件列表
name = "BC-2"
category = "DirichletBC"
type = ""
dof = ["u1"]
node_sets = ['left']
element_sets = []
value = 0.0

[[bcs]] # 边界条件列表
name = "BC-3"
category = "DirichletBC"
type = ""
dof = ["u2"]
node_sets = ['top']
element_sets = []
value = 0.01
amplitude_name = "Amp-1"

[solver] # 求解器属性
type = "NonlinearSolver"
option = "NewtonRaphson"
total_time = 5.0
start_time = 0.0
max_increment = 1000000
initial_dtime = 0.05
max_dtime = 0.05
min_dtime = 0.001

[[materials]] # 材料列表
name = "Material-1"
category = "Plastic"
type = "KinematicHardening"
data = [100000.0, 0.25, 400.0, 1000.0]

[[sections]] # 截面列表
name = "Section-1"
category = "Solid"
type = "PlaneStrain"
option = "SmallStrain"
element_sets = ["rectangle"]
material_names = ["Material-1"]
data = []

[[outputs]] # 输出列表
type = "vtk"
field_outputs = ['S11', 'S22', 'S12', 'E11', 'E22', 'E12']
is_save = true

gmsh格式的网格文件 mesh.msh

$MeshFormat
4.1 0 8
$EndMeshFormat
$PhysicalNames
5
1 5 "left"
1 6 "right"
1 7 "top"
1 8 "bottom"
2 9 "rectangle"
$EndPhysicalNames
$Entities
4 4 1 0
1 0 0 0 0
2 1 0 0 0
3 1 1 0 0
4 0 1 0 0
1 0 0 0 1 0 0 1 8 2 1 -2
2 1 0 0 1 1 0 1 6 2 2 -3
3 0 1 0 1 1 0 1 7 2 3 -4
4 0 0 0 0 1 0 1 5 2 4 -1
1 0 0 0 1 1 0 1 9 4 3 4 1 2
$EndEntities
$Nodes
9 9 1 9
0 1 0 1
1
0 0 0
0 2 0 1
2
1 -0 0
0 3 0 1
3
1 1 0
0 4 0 1
4
0 1 0
1 1 0 1
5
0.4999999999986921 0 0
1 2 0 1
6
1 0.4999999999986921 0
1 3 0 1
7
0.5000000000020595 1 0
1 4 0 1
8
0 0.5000000000020595 0
2 1 0 1
9
0.5000000000003758 0.5000000000003758 0
$EndNodes
$Elements
5 12 1 12
1 1 1 2
1 1 5
2 5 2
1 2 1 2
3 2 6
4 6 3
1 3 1 2
5 3 7
6 7 4
1 4 1 2
7 4 8
8 8 1
2 1 3 4
9 3 7 9 6
10 6 9 5 2
11 7 4 8 9
12 9 8 1 5
$EndElements

Postprocess 后处理

算例计算完成后将在配置文件所在目录下生成 .pvd.vtu 文件,可以使用开源可视化软件 paraview 进行查看。

Preprocess 前处理

本项目暂不提供前处理模块,基于 meshio 库,可以识别gmsh、abaqus 和 ansys等有限元软件的网格文件。

最小势能原理

一个小变形线弹性体静力学问题,共有 \(\sigma_{ij}\)\(\varepsilon_{ij}\)\(u_{i}\) 等15个待定函数,它们在域\(V\)中必须满足弹性力学的15个基本方程和6个边界条件。现在,我们尝试将上述问题等效为泛函的驻值问题,建立最小势能原理。

最小势能原理:在满足几何方程\({\varepsilon _{ij}} = \frac{1}{2}\left( {{u_{i,j}} + {u_{j,i}}} \right)\)和位移边界条件\(u_{i}=\overline {u}_{i}\)的所有允许位移函数中,实际的位移\(u_i\)必定可以使弹性体的总势能

()\[\begin{equation} \Pi = \iiint\limits_V {A\left( {{\varepsilon _{ij}}} \right){\text{d}}V} - \iiint\limits_V {{f_i}{u_i}{\text{d}}V - \iint\limits_{{S_p}} {{{\bar p}_i}{u_i}{\text{d}}S}} \label{eq:Pi_1} \end{equation}\]

为最小。

为了证明最小位能原理,先求\(\Pi\)的一阶变分:

()\[\begin{equation} \delta \Pi = \iiint\limits_V {\frac{{\partial A}}{{\partial {\varepsilon _{ij}}}}\delta {\varepsilon _{ij}}{\text{d}}V} - \iiint\limits_V {{f_i}\delta {u_i}{\text{d}}V - \iint\limits_{{S_p}} {{{\bar p}_i}\delta {u_i}{\text{d}}S}} \label{eq:delta_Pi} \end{equation}\]

由于几何方程事先要满足,同时基于应力的对称性\(\sigma_{ij}=\sigma_{ji}\),有

()\[\begin{equation} \frac{{\partial A}}{{\partial {\varepsilon _{ij}}}}\delta {\varepsilon _{ij}} = \frac{{\partial A}}{{\partial {\varepsilon _{ij}}}}\frac{1}{2}\delta \left( {{u_{i,j}} + {u_{j,i}}} \right) = \frac{1}{2}{\sigma _{ij}}\delta {u_{i,j}} + \frac{1}{2}{\sigma _{ij}}\delta {u_{j,i}} = {\sigma _{ij}}\delta {u_{i,j}} = \frac{{\partial A}}{{\partial {\varepsilon _{ij}}}}\delta {u_{i,j}} \end{equation}\]

根据求导的链式法则有

()\[\begin{equation} {\left( {\frac{{\partial A}}{{\partial {\varepsilon _{ij}}}}\delta {u_i}} \right)_{,j}} = {\left( {\frac{{\partial A}}{{\partial {\varepsilon _{ij}}}}} \right)_{,j}}\delta {u_i} + \frac{{\partial A}}{{\partial {\varepsilon _{ij}}}}\delta {u_{i,j}} \end{equation}\]

同时根据高斯散度定理可知

()\[\begin{equation} \iiint\limits_V {{{\left( {\frac{{\partial A}}{{\partial {\varepsilon _{ij}}}}\delta {u_i}} \right)}_{,j}}{\text{d}}V} = \iint\limits_S {\frac{{\partial A}}{{\partial {\varepsilon _{ij}}}}\delta {u_i}{n_j}{\text{d}}S} \end{equation}\]

因此式(1.2)的右边第一项

()\[\begin{split}\begin{equation} \begin{array}{*{20}{l}} {\iiint\limits_V {\frac{{\partial A}}{{\partial {\varepsilon _{ij}}}}\delta {\varepsilon _{ij}}{\text{d}}V}}&{ = \iiint\limits_V {\frac{{\partial A}}{{\partial {\varepsilon _{ij}}}}\delta {u_{i,j}}{\text{d}}V}} \\ {\text{ }}&{ = \iiint\limits_V {\left[ {{{\left( {\frac{{\partial A}}{{\partial {\varepsilon _{ij}}}}\delta {u_i}} \right)}_{,j}} - {{\left( {\frac{{\partial A}}{{\partial {\varepsilon _{ij}}}}} \right)}_{,j}}\delta {u_i}} \right]{\text{d}}V}} \\ {\text{ }}&{ = \iint\limits_S {\frac{{\partial A}}{{\partial {\varepsilon _{ij}}}}\delta {u_i}{n_j}{\text{d}}S} - \iiint\limits_V {{{\left( {\frac{{\partial A}}{{\partial {\varepsilon _{ij}}}}} \right)}_{,j}}\delta {u_i}{\text{d}}V}} \\ {\text{ }}&{ = \iint\limits_{{S_p}} {\frac{{\partial A}}{{\partial {\varepsilon _{ij}}}}{n_j}\delta {u_i}{\text{d}}S} - \iiint\limits_V {{{\left( {\frac{{\partial A}}{{\partial {\varepsilon _{ij}}}}} \right)}_{,j}}\delta {u_i}{\text{d}}V}} \end{array} \end{equation}\end{split}\]

上式中我们应用了条件,在\(S_u\)边界上\(\delta u_i=0\)。带入式(1.2)

()\[\begin{equation} \delta \Pi = \iint\limits_{{S_p}} {\frac{{\partial A}}{{\partial {\varepsilon _{ij}}}}{n_j}\delta {u_i}{\text{d}}S} - \iiint\limits_V {{{\left( {\frac{{\partial A}}{{\partial {\varepsilon _{ij}}}}} \right)}_{,j}}\delta {u_i}{\text{d}}V} - \iiint\limits_V {{f_i}\delta {u_i}{\text{d}}V - \iint\limits_{{S_p}} {{{\bar p}_i}\delta {u_i}{\text{d}}S}} \end{equation}\]

整理可得

()\[\begin{equation} \delta \Pi = - \iiint\limits_V {\left[ {{{\left( {\frac{{\partial A}}{{\partial {\varepsilon _{ij}}}}} \right)}_{,j}} + {f_i}} \right]\delta {u_i}{\text{d}}V} + \iint\limits_{{S_p}} {\left( {\frac{{\partial A}}{{\partial {\varepsilon _{ij}}}}{n_j} - {{\bar p}_i}} \right)\delta {u_i}{\text{d}}S} \end{equation}\]

弹性体的总势能\(\Pi\)取极值的条件是\(\delta \Pi=0\),因此必须有

()\[\begin{equation} {\left( {\frac{{\partial A}}{{\partial {\varepsilon _{ij}}}}} \right)_{,j}} + {f_i} = 0 \quad \left( \text { 在 } V \text { 内 } \right) \end{equation}\]
()\[\begin{equation} \frac{{\partial A}}{{\partial {\varepsilon _{ij}}}}{n_j} - {{\bar p}_i} = 0 \quad \left( \text { 在 } S_p \text { 上 } \right) \end{equation}\]

应用物理方程\(\frac{{\partial A}}{{\partial {\varepsilon _{ij}}}} = {\sigma _{ij}}\),可得

()\[\begin{equation} {\sigma _{ij,j}} + {f_i} = 0 \quad \left( \text { 在 } V \text { 内 } \right) \end{equation}\]
()\[\begin{equation} {\sigma _{ij}}{n_j} - {{\bar p}_i} = 0 \quad \left( \text { 在 } S_p \text { 上 } \right) \end{equation}\]

以上两式就是平衡方程和力边界条件,即满足了\(\delta \Pi=0\),就等于满足了以上两个条件。因此,使泛函\(\Pi\)取极值的的位移\(u_i\)就是真实的解。进一步我们可以证明该极值为最小值。

位移协调元的最小势能原理

根据式(1.1),弹性体最小势能原理的泛函可以表示为

()\[\begin{equation} \Pi = \iiint\limits_V {\left[ {A\left( {{\varepsilon _{ij}}} \right){\text{ - }}{f_i}{u_i}} \right]{\text{d}}V} - \iint\limits_{{S_p}} {{{\bar p}_i}{u_i}{\text{d}}S} \end{equation}\]

其中应变和位移满足几何方程,位移边界条件为变分约束条件,物理方程为非变分约束条件。 首先对求解域进行离散,把求解域\(V\)分割为\(N\)个有限单元,其中\(m\)号有限单元子域为\({{V^{\left( m \right)}}}\),外表面为\({{S^{\left( m \right)}}}\)。设在相邻有限元之间的交界面上位移函数\(u_{i}\) 是连续的,这种有限元称为位移协调元。位移协调元要求单元位移函数满足下列条件:

(1)在每个单元中是连续的和单值的;

(2)在单元的交界面上是协调的,即\(u_{i}^{(m)}=u_{i}^{\left(m^{\prime}\right)} \quad\left(\text { 在 } S^{\left(m m^{\prime}\right)} \text { 上 }\right)\)

(3)所有含有 \(S_{u}\) 的单元,都要满足位移边界条件\(u_{i}=\bar{u}_{i} \quad\left(\text { 在 } S_{u} \text { 上 }\right)\)

如果位移函数的选择满足以上三个条件,则基于位移协调元的最小势能原理的泛函可以改写成:

()\[\begin{equation} {\Pi ^*} = \sum\limits_{m = 1}^N {\left\{ {\iiint\limits_{{V^{\left( m \right)}}} {\left[ {{A^{\left( m \right)}}\left( {{\varepsilon _{ij}}} \right) - {f_i}u_i^{\left( m \right)}} \right]{\text{d}}V} - \iint\limits_{S_p^{\left( m \right)}} {{{\bar p}_i}u_i^{\left( m \right)}{\text{d}}S}} \right\}} \label{eq:Pi*_1} \end{equation}\]

对上式求一阶变分, 得

()\[\begin{equation} \delta {\Pi ^*} = \sum\limits_{m = 1}^N {\left\{ {\iiint\limits_{{V^{\left( m \right)}}} {\left[ {\frac{{\partial {A^{\left( m \right)}}}}{{\partial \varepsilon _{ij}^{\left( m \right)}}}\delta \varepsilon _{ij}^{\left( m \right)} - {f_i}\delta u_i^{\left( m \right)}} \right]{\text{d}}V} - \iint\limits_{S_p^{\left( m \right)}} {{{\bar p}_i}\delta u_i^{\left( m \right)}{\text{d}}S}} \right\}} \label{eq:delta_Pi*_1} \end{equation}\]

对于第\(m\)个单元有

()\[\begin{equation} \frac{{\partial {A^{\left( m \right)}}}}{{\partial \varepsilon _{ij}^{\left( m \right)}}}\delta \varepsilon _{ij}^{\left( m \right)} = \frac{{\partial {A^{\left( m \right)}}}}{{\partial \varepsilon _{ij}^{\left( m \right)}}}\delta u_{i,j}^{\left( m \right)} \end{equation}\]
()\[\begin{equation} {\left( {\frac{{\partial {A^{\left( m \right)}}}}{{\partial \varepsilon _{ij}^{\left( m \right)}}}\delta u_i^{\left( m \right)}} \right)_{,j}} = \frac{{\partial {A^{\left( m \right)}}}}{{\partial \varepsilon _{ij}^{\left( m \right)}}}\delta u_{i,j}^{\left( m \right)} + {\left( {\frac{{\partial {A^{\left( m \right)}}}}{{\partial \varepsilon _{ij}^{\left( m \right)}}}} \right)_{,j}}\delta u_i^{\left( m \right)} \end{equation}\]

\(m\)个单元上应用高斯散度定理得

()\[\begin{equation} \iiint\limits_V {{{\left( {\frac{{\partial {A^{\left( m \right)}}}}{{\partial \varepsilon _{ij}^{\left( m \right)}}}\delta u_i^{\left( m \right)}} \right)}_{,j}}{\text{d}}V} = \iint\limits_{{S^{\left( m \right)}}} {\frac{{\partial {A^{\left( m \right)}}}}{{\partial \varepsilon _{ij}^{\left( m \right)}}}n_j^{\left( m \right)}\delta u_i^{\left( m \right)}{\text{d}}S} \end{equation}\]

因此式(2.3)右边第一项

()\[\begin{split}\begin{equation} \begin{array}{*{20}{l}} {\iiint\limits_{{V^{\left( m \right)}}} {\frac{{\partial {A^{\left( m \right)}}}}{{\partial \varepsilon _{ij}^{\left( m \right)}}}\delta \varepsilon _{ij}^{\left( m \right)}{\text{d}}V}}&{ = \iiint\limits_{{V^{\left( m \right)}}} {\frac{{\partial {A^{\left( m \right)}}}}{{\partial \varepsilon _{ij}^{\left( m \right)}}}\delta u_{i,j}^{\left( m \right)}{\text{d}}V}} \\ {\text{ }}&{ = \iiint\limits_{{V^{\left( m \right)}}} {\left[ {{{\left( {\frac{{\partial {A^{\left( m \right)}}}}{{\partial \varepsilon _{ij}^{\left( m \right)}}}\delta u_i^{\left( m \right)}} \right)}_{,j}} - {{\left( {\frac{{\partial {A^{\left( m \right)}}}}{{\partial \varepsilon _{ij}^{\left( m \right)}}}} \right)}_{,j}}\delta u_i^{\left( m \right)}} \right]{\text{d}}V}} \\ {\text{ }}&{ = \iint\limits_{{S^{\left( m \right)}}} {\frac{{\partial {A^{\left( m \right)}}}}{{\partial \varepsilon _{ij}^{\left( m \right)}}}n_j^{\left( m \right)}\delta u_i^{\left( m \right)}{\text{d}}S} - \iiint\limits_{{V^{\left( m \right)}}} {{{\left( {\frac{{\partial {A^{\left( m \right)}}}}{{\partial \varepsilon _{ij}^{\left( m \right)}}}} \right)}_{,j}}\delta u_i^{\left( m \right)}{\text{d}}V}} \\ {\text{ }}&{ = \iint\limits_{S_p^{\left( m \right)}} {\frac{{\partial {A^{\left( m \right)}}}}{{\partial \varepsilon _{ij}^{\left( m \right)}}}n_j^{\left( m \right)}\delta u_i^{\left( m \right)}{\text{d}}S} + \iint\limits_{{S^{\left( {m{m^\prime }} \right)}}} {\frac{{\partial {A^{\left( m \right)}}}}{{\partial \varepsilon _{ij}^{\left( m \right)}}}n_j^{\left( m \right)}\delta u_i^{\left( m \right)}{\text{d}}S} - \iiint\limits_{{V^{\left( m \right)}}} {{{\left( {\frac{{\partial {A^{\left( m \right)}}}}{{\partial \varepsilon _{ij}^{\left( m \right)}}}} \right)}_{,j}}\delta u_i^{\left( m \right)}{\text{d}}V}} \end{array} \end{equation}\end{split}\]

其中,\({{S^{\left( m \right)}}}\)由三部分组成

()\[\begin{equation} {S^{(m)}} = S_p^{(m)} + S_u^{(m)} + {S^{\left( {m{m^\prime }} \right)}} \end{equation}\]

\({S^{\left( {m{m^\prime }} \right)}}\)是相邻有限单元 \(m\)\(m^{\prime}\) 之间的交界面。根据位移协调的条件,在单元交界面\({S^{\left( {m{m^\prime }} \right)}}\) 上有

()\[\begin{equation} u_i^{\left( m \right)} = u_i^{\left( {{m^\prime }} \right)} = u_i^{\left( {m{m^\prime }} \right)} \quad\left(\text { 在 } S^{\left(m m^{\prime}\right)} \text { 上 }\right) \end{equation}\]

()\[\begin{equation} \delta u_i^{\left( m \right)} = \delta u_i^{\left( {{m^\prime }} \right)} = \delta u_i^{\left( {m{m^\prime }} \right)} \quad\left(\text { 在 } S^{\left(m m^{\prime}\right)} \text { 上 }\right) \end{equation}\]

因此,式(2.3)可写成

()\[\begin{split}\begin{equation} \begin{array}{*{20}{l}} {\delta {\Pi ^*}}&{ = \sum\limits_{m = 1}^N {\left\{ { - \iiint\limits_{{V^{\left( m \right)}}} {\left[ {{{\left( {\frac{{\partial {A^{\left( m \right)}}}}{{\partial \varepsilon _{ij}^{\left( m \right)}}}} \right)}_{,j}} + {f_i}} \right]\delta u_i^{\left( m \right)}{\text{d}}V} + \iint\limits_{S_p^{\left( m \right)}} {\left( {\frac{{\partial {A^{\left( m \right)}}}}{{\partial \varepsilon _{ij}^{\left( m \right)}}}n_j^{\left( m \right)} - {{\bar p}_i}} \right)\delta u_i^{\left( m \right)}{\text{d}}S}} \right\}} } \\ {\text{ }}&{ + \sum\limits_{\left( {m{m^\prime }} \right)} {\iint\limits_{{S^{\left( {m{m^\prime }} \right)}}} {\left( {\frac{{\partial {A^{\left( m \right)}}}}{{\partial \varepsilon _{ij}^{\left( m \right)}}}n_j^{\left( m \right)} + \frac{{\partial {A^{\left( {{m^\prime }} \right)}}}}{{\partial \varepsilon _{ij}^{\left( {{m^\prime }} \right)}}}n_j^{\left( {{m^\prime }} \right)}} \right)\delta u_i^{\left( {m{m^\prime }} \right)}{\text{d}}S}} } \end{array} \end{equation}\end{split}\]

由于 \(\delta u_{i}^{(m)}\)\({{V^{\left( m \right)}}}\) 中和在 \(S_p^{\left( m \right)}\) 上,\(\delta u_{i}^{\left(m m^{\prime}\right)}\) 在相邻有限元之间的交界面上,都是独立的变量,所以 \(\delta \Pi^{*}=0\) 给出了下列关系

()\[\begin{equation} {\left( {\frac{{\partial {A^{\left( m \right)}}}}{{\partial \varepsilon _{ij}^{\left( m \right)}}}} \right)_{,j}} + {f_i} = 0 \quad \left( \text { 在 } V^{\left( m \right)} \text { 内 } \right) \end{equation}\]
()\[\begin{equation} \frac{{\partial {A^{\left( m \right)}}}}{{\partial \varepsilon _{ij}^{\left( m \right)}}}n_j^{\left( m \right)} - {{\bar p}_i} = 0 \quad \left( \text { 在 } S_p^{\left( m \right)} \text { 上 } \right) \end{equation}\]
()\[\begin{equation} \frac{{\partial {A^{\left( m \right)}}}}{{\partial \varepsilon _{ij}^{\left( m \right)}}}n_j^{\left( m \right)} + \frac{{\partial {A^{\left( {{m^\prime }} \right)}}}}{{\partial \varepsilon _{ij}^{\left( {{m^\prime }} \right)}}}n_j^{\left( {{m^\prime }} \right)} = 0 \quad \left( \text { 在 } S^{\left(m m^{\prime}\right)} \text { 上 } \right) \end{equation}\]

应用物理方程\(\frac{{\partial {A^{\left( m \right)}}}}{{\partial \varepsilon _{ij}^{\left( m \right)}}} = \sigma _{ij}^{\left( m \right)}\),可得

()\[\begin{equation} \sigma _{ij,j}^{\left( m \right)} + {f_i} = 0 \quad \left( \text { 在 } V^{\left( m \right)} \text { 内 } \right) \label{eq:equilibrium_element_1} \end{equation}\]
()\[\begin{equation} \sigma _{ij}^{\left( m \right)} n_j - {{\bar p}_i} = 0 \quad \left( \text { 在 } S_p^{\left( m \right)} \text { 上 } \right) \label{eq:sp_element_1} \end{equation}\]
()\[\begin{equation} \sigma _{ij}^{\left( m \right)}n_j^{\left( m \right)} + \sigma _{ij}^{\left( m^{\prime} \right)}n_j^{\left( {{m^\prime }} \right)} = 0 \quad \left( \text { 在 } S^{\left(m m^{\prime}\right)} \text { 上 } \right) \label{eq:stress_continuity_1} \end{equation}\]

这就是位移协调元的最小势能原理,以上各式表明,\(\Pi^{*}\) 取极值等效于弹性体各单元的平衡方程(式(2.15))和单元边界上的力边界条件(式(2.16)),而且给出了相邻单元交界面上应力矢量的连续条件(式(2.17))。值得指出的是,“在相邻单元的交界面上应力矢量是连续的”这一结论,它的前提是假定所选择的单元位移函数,不仅在单元交界面上是协调的,而且要使它满足有限元平衡方程(式(2.15))和外力已知边界条件(式(2.16)),也就是有限元平衡方程和外力已知边界条件不致遭到破坏。

基于位移协调元最小势能原理的有限元方程

通过最小势能原理,我们把微分方程边值问题化为泛函极值问题,本节将通过该泛函极值问题近似解法,推导出基于位移协调元的最小势能原理的有限元方程。

根据变分法,系统的总势能\(\Pi\),是关于状态变量\(u_i\)的泛函;\(u_i\)是未知的场函数,它的解一定使得总势能\(\Pi\)最小,即\(\Pi\)的变分\(\delta \Pi=0\)(最小势能原理)。这似乎给我们提供了一个求解的思路:只要我们从众多的函数中,找到一个函数\(u_i\)使\(\delta \Pi=0\),那么\(u_i\)就是问题的解。但不幸的是:我们不可能把所有可能的函数罗列出来,从中找到满足\(\delta \Pi=0\)的解。因为,可能的函数有无限多个而且毫无规律,从中找到答案可能比“大海捞针”更加困难。

里兹法的提出,让变分法的求解思路得以实现。里兹法的核心思想是:放弃寻找准确解,而从一簇特定的函数中找到最接近准确解的近似解。这一簇“特定的函数”通常称为“近似函数”或者“试函数”(trial functions)。采用里兹法求近似解时,我们可以自由地选择一类便于处理的函数(通常是多项式函数)作为试函数,然后从这些试函数中找到最佳的近似解。同时考虑到对于位移协调元,在单元交界面\({S^{\left( {m{m^\prime }} \right)}}\)上有

()\[\begin{equation} u_i^{\left( m \right)} = u_i^{\left( {{m^\prime }} \right)} = u_i^{\left( {m{m^\prime }} \right)} \quad\left(\text { 在 } S^{\left(m m^{\prime}\right)} \text { 上 }\right) \label{eq:displacement_coordination_1} \end{equation}\]

因此我们通过节点插值的方法来选取单元试函数,假设其形式为

()\[\begin{equation} u_i^{\left( m \right)} \approx \hat u_i^{\left( m \right)} = N_k^{\left( m \right)}q_{ik}^{\left( m \right)} \end{equation}\]

其中,\(N_k^{\left( m \right)}\)是单元试函数的基函数,在有限元中通常称为形函数,需要注意的是\(N_k^{\left( m \right)}\)只是坐标\(x_i\)的函数,\(q_{ik}^{\left( m \right)}\)是待定系数,也是单元的节点位移,其中下标\(k\)代表单元的节点数目,\(i\)为坐标维度。选择合适的基函数\(N_k^{\left( m \right)}\),使试函数满足直接(位移)边界条件(无需满足自然(力)边界条件,因为自然边界条件隐含在泛函总势能中)。此时如果相邻单元选取相同的节点位移插值基函数\(N_k^{\left( m \right)}\),则在单元交界面\({S^{\left( {m{m^\prime }} \right)}}\)上自然满足式(3.1)所要求的位移协调条件。对于线弹性小变形为题,我们将所有单元试函数\(\hat u_i^{\left( m \right)}\)带入式(2.2)可得

()\[\begin{equation} {{\hat \Pi }^*} = \sum\limits_{m = 1}^N {\left\{ {\iiint\limits_{{V^{\left( m \right)}}} {\left[ {\frac{1}{2}{E_{ijkl}}\varepsilon _{ij}^{\left( m \right)}\varepsilon _{kl}^{\left( m \right)} - {f_i}N_k^{\left( m \right)}q_{ik}^{\left( m \right)}} \right]{\text{d}}V} - \iint\limits_{S_p^{\left( m \right)}} {{{\bar p}_i}N_k^{\left( m \right)}q_{ik}^{\left( m \right)}{\text{d}}S}} \right\}} \label{eq:hat_Pi*_1} \end{equation}\]

现在,原问题变为:找到一组合适的节点位移\(q_{in}\)\(n\)为系统离散后的节点总数),代入所有单元试函数\(\hat u_i^{\left( m \right)}\),使得总势能\({\hat \Pi }^*\)取最小值。需要注意的是此时泛函\({\Pi }^*\)的极值问题转变为了函数\({{\hat \Pi }^*}\)的极值问题,此时\({{\hat \Pi }^*}\)只是节点坐标\(q_{in}\)的函数,对于三维问题共有\(3\times i \times n\)个未知数。用数学语言来描述,即:

()\[\begin{equation} \frac{{\partial {{\hat \Pi }^*}\left( {{q_{in}}} \right)}}{{\partial {q_{in}}}} = 0 \end{equation}\]

可以得到\(3\times i \times n\)个代数方程。联立方程组,可以求出这些节点位移\(q_{in}\);代入单元试函数\(\hat u_i^{\left( m \right)}\),即可得到近似解。

在有限元方法中,根据应力和应变张量的对称性,采用Voigt标记将张量符号表示为矩阵乘法,其中\(\sigma_{ij}\)\(\varepsilon_{ij}\)分别表示为列向量:

()\[\begin{split}\begin{equation} {\mathbf{\varepsilon }} = \left\{ {\begin{array}{*{20}{c}} {{\varepsilon _{11}}} \\ {{\varepsilon _{22}}} \\ {{\varepsilon _{33}}} \\ {{\varepsilon _{12}}} \\ {{\varepsilon _{23}}} \\ {{\varepsilon _{31}}} \end{array}} \right\}, \quad {\mathbf{\sigma }} = \left\{ {\begin{array}{*{20}{c}} {{\sigma _{11}}} \\ {{\sigma _{22}}} \\ {{\sigma _{33}}} \\ {{\sigma _{12}}} \\ {{\sigma _{23}}} \\ {{\sigma _{31}}} \end{array}} \right\} \end{equation}\end{split}\]

线弹性的物理方程\({\sigma _{ij}} = {E_{ijkl}}{\varepsilon _{ij}}\)的矩阵形式为:

()\[\begin{equation} {\mathbf{\sigma }} = {\mathbf{D\varepsilon }} \end{equation}\]

其中\({\mathbf{D}}\)为弹性矩阵。 单元位移函数\(u_i\)表示为列向量:

()\[\begin{split}\begin{equation} {\mathbf{u}} = \left\{ {\begin{array}{*{20}{c}} {{u_1}} \\ {{u_2}} \\ {{u_3}} \end{array}} \right\} \end{equation}\end{split}\]

定义微分算子矩阵

()\[\begin{split}\begin{equation} {\mathbf{L}} = \left[ {\begin{array}{*{20}{c}} {\frac{\partial }{{\partial {x_1}}}}&0&0 \\ 0&{\frac{\partial }{{\partial {x_2}}}}&0 \\ 0&0&{\frac{\partial }{{\partial {x_3}}}} \\ {\frac{1}{2}\frac{\partial }{{\partial {x_2}}}}&{\frac{1}{2}\frac{\partial }{{\partial {x_1}}}}&0 \\ 0&{\frac{1}{2}\frac{\partial }{{\partial {x_3}}}}&{\frac{1}{2}\frac{\partial }{{\partial {x_2}}}} \\ {\frac{1}{2}\frac{\partial }{{\partial {x_3}}}}&0&{\frac{1}{2}\frac{\partial }{{\partial {x_1}}}} \end{array}} \right] \end{equation}\end{split}\]

则几何方程\({\varepsilon _{ij}} = \frac{1}{2}\left( {{u_{i,j}} + {u_{j,i}}} \right)\)可以表示为矩阵乘法形式:

()\[\begin{split}\begin{equation} \left\{ {\begin{array}{*{20}{c}} {{\varepsilon _{11}}} \\ {{\varepsilon _{22}}} \\ {{\varepsilon _{33}}} \\ {{\varepsilon _{12}}} \\ {{\varepsilon _{23}}} \\ {{\varepsilon _{31}}} \end{array}} \right\} = \left[ {\begin{array}{*{20}{c}} {\frac{\partial }{{\partial {x_1}}}}&0&0 \\ 0&{\frac{\partial }{{\partial {x_2}}}}&0 \\ 0&0&{\frac{\partial }{{\partial {x_3}}}} \\ {\frac{1}{2}\frac{\partial }{{\partial {x_2}}}}&{\frac{1}{2}\frac{\partial }{{\partial {x_1}}}}&0 \\ 0&{\frac{1}{2}\frac{\partial }{{\partial {x_3}}}}&{\frac{1}{2}\frac{\partial }{{\partial {x_2}}}} \\ {\frac{1}{2}\frac{\partial }{{\partial {x_3}}}}&0&{\frac{1}{2}\frac{\partial }{{\partial {x_1}}}} \end{array}} \right]\left\{ {\begin{array}{*{20}{c}} {{u_1}} \\ {{u_2}} \\ {{u_3}} \end{array}} \right\} \end{equation}\end{split}\]

记为

()\[\begin{equation} {\mathbf{\varepsilon }} = {\mathbf{Lu}} \label{eq:epsilon_Lu} \end{equation}\]

将节点位移矢量\(q_{ik}\)表示为列向量:

()\[\begin{split}\begin{equation} {\mathbf{q}} = \left\{ {\begin{array}{*{20}{c}} {{q_{11}}} \\ {{q_{21}}} \\ {{q_{31}}} \\ {{q_{12}}} \\ {{q_{22}}} \\ {{q_{32}}} \\ \vdots \\ {{q_{1k}}} \\ {{q_{2k}}} \\ {{q_{3k}}} \end{array}} \right\} \end{equation}\end{split}\]

插值基函数\(N_k\)表示为矩阵形式:

()\[\begin{split}\begin{equation} {\mathbf{N}} = \left[ {\begin{array}{*{20}{c}} {{N_1}}&0&0&{{N_2}}&0&0& \cdots &{{N_k}}&0&0 \\ 0&{{N_1}}&0&0&{{N_2}}&0& \cdots &0&{{N_k}}&0 \\ 0&0&{{N_1}}&0&0&{{N_2}}& \cdots &0&0&{{N_k}} \end{array}} \right] = \left[ {\begin{array}{*{20}{c}} {{\mathbf{I}}{N_1}}&{{\mathbf{I}}{N_2}}&{{\mathbf{I}}{N_3}}& \cdots &{{\mathbf{I}}{N_k}} \end{array}} \right] \end{equation}\end{split}\]

则可以得到

()\[\begin{split}\begin{equation} \left\{ {\begin{array}{*{20}{c}} {{u_1}} \\ {{u_2}} \\ {{u_3}} \end{array}} \right\} = \left[ {\begin{array}{*{20}{c}} {{N_1}}&0&0&{{N_2}}&0&0& \cdots &{{N_k}}&0&0 \\ 0&{{N_1}}&0&0&{{N_2}}&0& \cdots &0&{{N_k}}&0 \\ 0&0&{{N_1}}&0&0&{{N_2}}& \cdots &0&0&{{N_k}} \end{array}} \right]\left\{ {\begin{array}{*{20}{c}} {{q_{11}}} \\ {{q_{21}}} \\ {{q_{31}}} \\ {{q_{12}}} \\ {{q_{22}}} \\ {{q_{32}}} \\ \vdots \\ {{q_{1k}}} \\ {{q_{2k}}} \\ {{q_{3k}}} \end{array}} \right\} \end{equation}\end{split}\]

记为

()\[\begin{equation} {\mathbf{u}} = {\mathbf{Nq}} \label{eq:u_Nq} \end{equation}\]

因此我们可以得到以下关系

()\[\begin{equation} {\mathbf{\varepsilon }} = {\mathbf{Lu}} = {\mathbf{LNq}} = {\mathbf{Bq}} \label{eq:epsilon_Bq} \end{equation}\]

其中

()\[\begin{split}{\mathbf{B}} = {\mathbf{LN}} = \left[ {\begin{array}{*{20}{c}} {\frac{\partial }{{\partial {x_1}}}}&0&0 \\ 0&{\frac{\partial }{{\partial {x_2}}}}&0 \\ 0&0&{\frac{\partial }{{\partial {x_3}}}} \\ {\frac{1}{2}\frac{\partial }{{\partial {x_2}}}}&{\frac{1}{2}\frac{\partial }{{\partial {x_1}}}}&0 \\ 0&{\frac{1}{2}\frac{\partial }{{\partial {x_3}}}}&{\frac{1}{2}\frac{\partial }{{\partial {x_2}}}} \\ {\frac{1}{2}\frac{\partial }{{\partial {x_3}}}}&0&{\frac{1}{2}\frac{\partial }{{\partial {x_1}}}} \end{array}} \right]\left[ {\begin{array}{*{20}{c}} {{N_1}}&0&0&{{N_2}}&0&0& \cdots &{{N_k}}&0&0 \\ 0&{{N_1}}&0&0&{{N_2}}&0& \cdots &0&{{N_k}}&0 \\ 0&0&{{N_1}}&0&0&{{N_2}}& \cdots &0&0&{{N_k}} \end{array}} \right]\end{split}\]
()\[\begin{split}\begin{equation} = \left[ {\begin{array}{*{20}{c}} {\frac{{\partial {N_1}}}{{\partial {x_1}}}}&0&0&{\frac{{\partial {N_2}}}{{\partial {x_1}}}}&0&0& \cdots &{\frac{{\partial {N_k}}}{{\partial {x_1}}}}&0&0 \\ 0&{\frac{{\partial {N_1}}}{{\partial {x_2}}}}&0&0&{\frac{{\partial {N_2}}}{{\partial {x_2}}}}&0& \cdots &0&{\frac{{\partial {N_k}}}{{\partial {x_2}}}}&0 \\ 0&0&{\frac{{\partial {N_1}}}{{\partial {x_3}}}}&0&0&{\frac{{\partial {N_2}}}{{\partial {x_3}}}}& \cdots &0&0&{\frac{{\partial {N_k}}}{{\partial {x_3}}}} \\ {\frac{1}{2}\frac{{\partial {N_1}}}{{\partial {x_2}}}}&{\frac{1}{2}\frac{{\partial {N_1}}}{{\partial {x_1}}}}&0&{\frac{1}{2}\frac{{\partial {N_2}}}{{\partial {x_2}}}}&{\frac{1}{2}\frac{{\partial {N_2}}}{{\partial {x_1}}}}&0& \cdots &{\frac{1}{2}\frac{{\partial {N_k}}}{{\partial {x_2}}}}&{\frac{1}{2}\frac{{\partial {N_k}}}{{\partial {x_1}}}}&0 \\ 0&{\frac{1}{2}\frac{{\partial {N_1}}}{{\partial {x_3}}}}&{\frac{1}{2}\frac{{\partial {N_1}}}{{\partial {x_2}}}}&0&{\frac{1}{2}\frac{{\partial {N_2}}}{{\partial {x_3}}}}&{\frac{1}{2}\frac{{\partial {N_2}}}{{\partial {x_2}}}}& \cdots &0&{\frac{1}{2}\frac{{\partial {N_k}}}{{\partial {x_3}}}}&{\frac{1}{2}\frac{{\partial {N_k}}}{{\partial {x_2}}}} \\ {\frac{1}{2}\frac{{\partial {N_1}}}{{\partial {x_3}}}}&0&{\frac{1}{2}\frac{{\partial {N_1}}}{{\partial {x_1}}}}&{\frac{1}{2}\frac{{\partial {N_2}}}{{\partial {x_3}}}}&0&{\frac{1}{2}\frac{{\partial {N_2}}}{{\partial {x_1}}}}& \cdots &{\frac{1}{2}\frac{{\partial {N_k}}}{{\partial {x_3}}}}&0&{\frac{1}{2}\frac{{\partial {N_k}}}{{\partial {x_1}}}} \end{array}} \right] \end{equation}\end{split}\]

单元的体力函数\(f_i\)和力边界条件\({{{\bar p}_i}}\)分别表示成列向量

()\[\begin{split}\begin{equation} {\mathbf{f}} = \left\{ {\begin{array}{*{20}{c}} {{f_1}} \\ {{f_2}} \\ {{f_3}} \end{array}} \right\}, \quad {\mathbf{\bar p}} = \left\{ {\begin{array}{*{20}{c}} {{{\bar p}_1}} \\ {{{\bar p}_2}} \\ {{{\bar p}_3}} \end{array}} \right\} \end{equation}\end{split}\]

则式(3.3)中第\(m\)号单元对应的势能函数可以表示为

()\[\begin{equation} {{\hat \Pi }^{*\left( {\text{m}} \right)}} = \iiint\limits_{{V^{\left( m \right)}}} {\left[ {\frac{1}{2}{{\left( {{{\mathbf{\varepsilon }}^{\left( m \right)}}} \right)}^{\text{T}}}{\mathbf{D}}{{\mathbf{\varepsilon }}^{\left( m \right)}} - {{\left( {{{\mathbf{q}}^{\left( m \right)}}} \right)}^{\text{T}}}{{\left( {{{\mathbf{N}}^{\left( m \right)}}} \right)}^{\text{T}}}{\mathbf{f}}} \right]{\text{d}}V} - \iint\limits_{S_p^{\left( m \right)}} {{{\left( {{{\mathbf{q}}^{\left( m \right)}}} \right)}^{\text{T}}}{{\left( {{{\mathbf{N}}^{\left( m \right)}}} \right)}^{\text{T}}}{{{\mathbf{\bar p}}}^{\text{T}}}{\text{d}}S} \end{equation}\]

带入式(3.10)(3.14),和(3.15)

()\[\begin{equation} {{\hat \Pi }^{*\left( {\text{m}} \right)}} = \iiint\limits_{{V^{\left( m \right)}}} {\left[ {\frac{1}{2}{{\left( {{{\mathbf{q}}^{\left( m \right)}}} \right)}^{\text{T}}}{{\left( {{{\mathbf{B}}^{\left( m \right)}}} \right)}^{\text{T}}}{\mathbf{D}}{{\mathbf{B}}^{\left( m \right)}}{{\mathbf{q}}^{\left( m \right)}} - {{\left( {{{\mathbf{q}}^{\left( m \right)}}} \right)}^{\text{T}}}{{\left( {{{\mathbf{N}}^{\left( m \right)}}} \right)}^{\text{T}}}{\mathbf{f}}} \right]{\text{d}}V} - \iint\limits_{S_p^{\left( m \right)}} {{{\left( {{{\mathbf{q}}^{\left( m \right)}}} \right)}^{\text{T}}}{{\left( {{{\mathbf{N}}^{\left( m \right)}}} \right)}^{\text{T}}}{{{\mathbf{\bar p}}}^{\text{T}}}{\text{d}}S} \end{equation}\]

因为\({{{\mathbf{q}}^{\left( m \right)}}}\)是单元对应节点坐标,与积分运算无关,整理可得

()\[\begin{equation} {{\hat \Pi }^{*\left( {\text{m}} \right)}} = \frac{1}{2}{\left( {{{\mathbf{q}}^{\left( m \right)}}} \right)^{\text{T}}}\left[ {\iiint\limits_{{V^{\left( m \right)}}} {{{\left( {{{\mathbf{B}}^{\left( m \right)}}} \right)}^{\text{T}}}{\mathbf{D}}{{\mathbf{B}}^{\left( m \right)}}{\text{d}}V}} \right]{{\mathbf{q}}^{\left( m \right)}} - {\left( {{{\mathbf{q}}^{\left( m \right)}}} \right)^{\text{T}}}\left[ {\iiint\limits_{{V^{\left( m \right)}}} {{{\left( {{{\mathbf{N}}^{\left( m \right)}}} \right)}^{\text{T}}}{\mathbf{f}}{\text{d}}V + \iint\limits_{S_p^{\left( m \right)}} {{{\left( {{{\mathbf{N}}^{\left( m \right)}}} \right)}^{\text{T}}}{{{\mathbf{\bar p}}}^{\text{T}}}{\text{d}}S}}} \right] \end{equation}\]

记为

()\[\begin{equation} {{\hat \Pi }^{*\left( {\text{m}} \right)}} = \frac{1}{2}{\left( {{{\mathbf{q}}^{\left( m \right)}}} \right)^{\text{T}}}{{\mathbf{K}}^{\left( m \right)}}{{\mathbf{q}}^{\left( m \right)}} - {\left( {{{\mathbf{q}}^{\left( m \right)}}} \right)^{\text{T}}}{{\mathbf{R}}^{\left( m \right)}} \end{equation}\]

其中

()\[\begin{equation} {{\mathbf{K}}^{\left( m \right)}} = \iiint\limits_{{V^{\left( m \right)}}} {{{\mathbf{B}}^{\left( m \right)}}^{\text{T}}{\mathbf{D}}{{\mathbf{B}}^{\left( m \right)}}{\text{d}}V} \end{equation}\]
()\[\begin{equation} {{\mathbf{R}}^{\left( m \right)}} = \iiint\limits_{{V^{\left( m \right)}}} {{{\left( {{{\mathbf{N}}^{\left( m \right)}}} \right)}^{\text{T}}}{\mathbf{f}}{\text{d}}V + \iint\limits_{S_p^{\left( m \right)}} {{{\left( {{{\mathbf{N}}^{\left( m \right)}}} \right)}^{\text{T}}}{{{\mathbf{\bar p}}}^{\text{T}}}{\text{d}}S}} \end{equation}\]

不难得知\({{\mathbf{K}}^{\left( m \right)}}\)就单元的刚度矩阵,\(\frac{1}{2}{\left( {{{\mathbf{q}}^{\left( m \right)}}} \right)^{\text{T}}}{{\mathbf{K}}^{\left( m \right)}}{{\mathbf{q}}^{\left( m \right)}}\)为单元的应变能,\({{\mathbf{R}}^{\left( m \right)}}\)为单元的节点外力矢量。 式(3.3)代表的系统总势能可以表示为

()\[\begin{equation} {{\hat \Pi }^*} = \sum\limits_{m = 1}^N {\left\{ {\frac{1}{2}{{\left( {{{\mathbf{q}}^{\left( m \right)}}} \right)}^{\text{T}}}{{\mathbf{K}}^{\left( m \right)}}{{\mathbf{q}}^{\left( m \right)}} - {{\left( {{{\mathbf{q}}^{\left( m \right)}}} \right)}^{\text{T}}}{{\mathbf{R}}^{\left( m \right)}}} \right\}} \end{equation}\]

采用有限元中的组集方法,将不同单元的相同节点位移进行合并,可以得到总体的矩阵方程

()\[\begin{equation} {{\hat \Pi }^*} = \frac{1}{2}{{\mathbf{q}}^{\text{T}}}{\mathbf{Kq}} - {{\mathbf{q}}^{\text{T}}}{\mathbf{R}} \end{equation}\]

其中,\(\mathbf{q}\)\(\mathbf{K}\)\(\mathbf{R}\)分别为整体的节点位移矢量,刚度矩阵和外力矢量。根据函数的极值条件\(\frac{{\partial {{\hat \Pi }^*}}}{{\partial {\mathbf{q}}}} = 0\)可得

()\[\begin{equation} {\mathbf{Kq}} - {\mathbf{R}} = 0 \end{equation}\]

测试

引用图片 图 4.1

pyfem

pyfem package

Subpackages

pyfem.amplitude package
Submodules
pyfem.amplitude.BaseAmplitude module
class pyfem.amplitude.BaseAmplitude.BaseAmplitude[源代码]

基类:object

幅值基类。

变量:
  • start (float) – 初值

  • f_amplitude (Callable) – 幅值函数

f_amplitude: Callable
get_amplitude(time: float) float[源代码]
set_f_amplitude(time: list[float], value: list[float]) None[源代码]
show() None[源代码]
start: float
to_string(level: int = 1) str[源代码]
pyfem.amplitude.TabularAmplitude module
class pyfem.amplitude.TabularAmplitude.TabularAmplitude(amplitude: Amplitude)[源代码]

基类:BaseAmplitude

通过x-y数据表格定义的幅值。

变量:

table (ndarray) – x-y数据表格

f_amplitude: Callable
get_amplitude(time: float) float[源代码]
start: float
table: ndarray
pyfem.amplitude.get_amplitude_data module
pyfem.amplitude.get_amplitude_data.get_amplitude_data(amplitude: Amplitude) BaseAmplitude | TabularAmplitude[源代码]

工厂函数,用于根据幅值属性生产不同的幅值对象。

参数:

amplitude (Amplitude) – 幅值属性

返回:

幅值对象

返回类型:

AmplitudeData

Module contents
pyfem.assembly package
Submodules
pyfem.assembly.Assembly module
class pyfem.assembly.Assembly.Assembly(props: Properties)[源代码]

基类:object

定义装配体。

变量:
  • total_dof_number (int) – 总自由度数量

  • props (Properties) – 作业属性对象

  • timer (Timer) – 计时器对象

  • materials_dict (dict[str, Material]) – 材料字典:材料名称->材料属性对象

  • sections_dict (dict[str, Section]) – 截面字典:截面名称->截面属性对象

  • amplitudes_dict (dict[str, Amplitude]) – 幅值字典:幅值名称->幅值属性对象

  • section_of_element_set (dict[str, Section]) – 单元集合截面字典:单元集合名称->截面属性对象

  • element_data_list (list[ElementData]) – 单元数据对象列表

  • bc_data_list (list[BCData]) – 边界条件数据对象列表

  • global_stiffness (csc_matrix(total_dof_number, total_dof_number)) – 全局刚度矩阵

  • A (petsc4py.PETSc.Mat(total_dof_number, total_dof_number)) – 全局刚度矩阵

  • fext (ndarray(total_dof_number,)) – 等式右边外力向量

  • fint (ndarray(total_dof_number,)) – 内力向量

  • ftime (ndarray(total_dof_number,)) – 时间离散导致的等式右边外力向量

  • dof_solution (ndarray(total_dof_number,)) – 全局自由度的值

  • ddof_solution (ndarray(total_dof_number,)) – 全局自由度增量的值

  • bc_dof_ids (ndarray) – 边界自由度列表

  • field_variables (dict[str, ndarray]) – 常变量字典

A: Mat
amplitudes_dict: dict[str, Amplitude]
assembly_field_variables() None[源代码]
assembly_fint() None[源代码]
assembly_ftime() None[源代码]
assembly_global_stiffness() None[源代码]
bc_data_list: list[BCData]
bc_dof_ids: ndarray
ddof_solution: ndarray
dof_solution: ndarray
element_data_list: list[ElementData]
fext: ndarray
field_variables: dict[str, ndarray]
fint: ndarray
ftime: ndarray
global_stiffness: csc_matrix
goback_element_state_variables() None[源代码]
init(**kwargs)
materials_dict: dict[str, Material]
props: Properties
section_of_element_set: dict[str, Section]
sections_dict: dict[str, Section]
show() None[源代码]
timer: Timer
to_string(level: int = 1) str[源代码]
total_dof_number: int
update_element_data() None[源代码]
update_element_data_without_stiffness() None[源代码]
update_element_field_variables() None[源代码]
update_element_state_variables() None[源代码]
Module contents
pyfem.bc package
Submodules
pyfem.bc.BaseBC module
class pyfem.bc.BaseBC.BaseBC(bc: BC, dof: Dof, mesh_data: MeshData, solver: Solver, amplitude: Amplitude | None)[源代码]

基类:object

边界条件对象基类

其子类将基于边界条件的属性、自由度属性、网格对象、求解器属性和幅值属性获取系统线性方程组 \({\mathbf{K u}} = {\mathbf{f}}\) 中对应自由度 \({\mathbf{u}}\) 或等式右边项 \({\mathbf{f}}\) 的约束信息。

当前支持的边界条件类型为Dirichlet边界和Neumann边界(Robin边界暂不支持)。

变量:
  • bc (BC) – 边界条件属性

  • dof (Dof) – 自由度属性

  • mesh_data (MeshData) – 网格对象

  • solver (Solver) – 求解器属性

  • amplitude (Optional[Amplitude]) – 幅值属性

  • amplitude_data (BaseAmplitude) – 幅值对象

  • get_amplitude (Callable) – 获取给定数值所对应的幅值

  • bc_node_ids (ndarray) – 边界节点编号列表

  • bc_element_ids (ndarray) – 边界单元编号列表

  • bc_dof_ids (ndarray) – 自由度编号列表

  • bc_surface (list[tuple[int, str]]) – 边界表面

  • bc_dof_values (ndarray) – 自由度数值列表

  • bc_fext (ndarray) – 等效节点力列表

amplitude: Amplitude | None
amplitude_data: BaseAmplitude | TabularAmplitude
bc: BC
bc_dof_ids: ndarray
bc_dof_values: ndarray
bc_element_ids: ndarray
bc_fext: ndarray
bc_node_ids: ndarray
bc_surface: list[tuple[int, str]]
dof: Dof
get_amplitude: Callable
mesh_data: MeshData
show() None[源代码]
solver: Solver
to_string(level: int = 1) str[源代码]
pyfem.bc.DirichletBC module
class pyfem.bc.DirichletBC.DirichletBC(bc: BC, dof: Dof, mesh_data: MeshData, solver: Solver, amplitude: Amplitude | None)[源代码]

基类:BaseBC

Dirichlet边界条件

基于边界条件的属性、自由度属性、网格对象、求解器属性和幅值属性计算系统线性方程组 \({\mathbf{K u}} = {\mathbf{f}}\) 中对应自由度 \({\mathbf{u}}\) 的约束信息。

Dirichlet边界条件只能施加于边界条件属性中的节点集合 pyfem.io.BC.BC.node_sets

对象创建时更新自由度序号列表 bc_node_ids 和对应自由度取值列表 bc_dof_values

amplitude: Amplitude | None
amplitude_data: AmplitudeData
bc: BC
bc_dof_ids: ndarray
bc_dof_values: ndarray
bc_element_ids: ndarray
bc_fext: ndarray
bc_node_ids: ndarray
bc_surface: list[tuple[int, str]]
create_dof_values() None[源代码]
dof: Dof
get_amplitude: Callable
mesh_data: MeshData
solver: Solver
pyfem.bc.NeumannBCConcentrated module
class pyfem.bc.NeumannBCConcentrated.NeumannBCConcentrated(bc: BC, dof: Dof, mesh_data: MeshData, solver: Solver, amplitude: Amplitude | None)[源代码]

基类:BaseBC

Neumann边界条件:集中力

基于边界条件的属性、自由度属性、网格对象、求解器属性和幅值属性获取系统线性方程组 \({\mathbf{K u}} = {\mathbf{f}}\) 中对应等式右边项 \({\mathbf{f}}\) 的约束信息。

Neumann集中力边界条件只能施加于边界条件属性中的节点集合 pyfem.io.BC.BC.node_sets

对象创建时更新自由度序号列表 bc_node_ids 和对应等式右边项取值列表 bc_fext

amplitude: Amplitude | None
amplitude_data: AmplitudeData
bc: BC
bc_dof_ids: ndarray
bc_dof_values: ndarray
bc_element_ids: ndarray
bc_fext: ndarray
bc_node_ids: ndarray
bc_surface: list[tuple[int, str]]
create_dof_values() None[源代码]
dof: Dof
get_amplitude: Callable
mesh_data: MeshData
solver: Solver
pyfem.bc.NeumannBCDistributed module
class pyfem.bc.NeumannBCDistributed.NeumannBCDistributed(bc: BC, dof: Dof, mesh_data: MeshData, solver: Solver, amplitude: Amplitude | None)[源代码]

基类:BaseBC

Neumann边界条件:分布载荷

基于边界条件的属性、自由度属性、网格对象、求解器属性和幅值属性获取系统线性方程组 \({\mathbf{K u}} = {\mathbf{f}}\) 中对应等式右边项 \({\mathbf{f}}\) 的约束信息。

Neumann分布载荷边界条件只能施加于边界表面列表 bc_surface,其中边界表面列表是由元组(单元编号,单元面名称)对象组成的列表。

边界表面列表 bc_surface 可以由边界条件属性中的节点集合 pyfem.io.BC.BC.node_sets 和单元集合 pyfem.io.BC.BC.element_sets 通过函数 get_surface_from_elements_nodes() 确定,也可以由边界条件属性中的边界单元集合 pyfem.io.BC.BC.bc_element_sets 通过函数 get_surface_from_bc_element() 确定。

对象创建时更新自由度序号列表 bc_node_ids 和对应等式右边项取值列表 bc_fext

理论-基于等参元的计算方法
1. 基于变分法的基本公式

考虑在单元边界上施加某个分布载荷的情况,对于二维问题,面力 \(\mathbf{\bar p}\)\(\left( m \right)\) 号单元所产生的等效节点载荷为:

()\[{{\mathbf{R}}^{\left( m \right)}} = \int\limits_{s_p^{\left( m \right)}} {{{\left( {{{\mathbf{N}}^{\left( m \right)}}} \right)}^{\text{T}}}{\mathbf{\bar p}}{\text{d}}s}\]

对于三维问题,面力 \(\mathbf{\bar p}\)\(\left( m \right)\) 号单元所产生的等效节点载荷为:

()\[{{\mathbf{R}}^{\left( m \right)}} = \iint\limits_{S_p^{\left( m \right)}} {{{\left( {{{\mathbf{N}}^{\left( m \right)}}} \right)}^{\text{T}}}{\mathbf{\bar p}}{\text{d}}S}\]

因此,对于边界上的分布载荷,我们需要处理单元边界上的第一类曲线积分和第一类曲面积分。

2. 二维单元边界的第一类曲线积分

通过坐标变换,我们可以建立全局坐标和局部坐标的关系,二维下的弧微分可以表示为:

()\[{\text{d}}s = \sqrt {{{\left( {{\text{d}}x} \right)}^2} + {{\left( {{\text{d}}y} \right)}^2}} = \sqrt {{{\left( {\frac{{\partial x}}{{\partial \xi }}{\text{d}}\xi + \frac{{\partial x}}{{\partial \eta }}{\text{d}}\eta } \right)}^2} + {{\left( {\frac{{\partial y}}{{\partial \xi }}{\text{d}}\xi + \frac{{\partial y}}{{\partial \eta }}{\text{d}}\eta } \right)}^2}}\]

2.1 以四节点四边形等参元为例子

(-1,1)           (1,1)
  3---------------2
  |       η       |
  |       |       |
  |       o--ξ    |
  |               |
  |               |
  0---------------1
(-1,-1)          (1,-1)

边界上的第一类曲线积分可以表示为:

()\[{\left. {{{\mathbf{R}}^{\left( m \right)}}} \right|_{\xi = \pm 1}} = \int_{ - 1}^1 {{{\left( {{{\mathbf{N}}^{\left( m \right)}}} \right)}^{\text{T}}}{\mathbf{\bar p}}\sqrt {{{\left( {\frac{{\partial x}}{{\partial \eta }}} \right)}^2} + {{\left( {\frac{{\partial y}}{{\partial \eta }}} \right)}^2}} {\text{d}}\eta }\]
()\[{\left. {{{\mathbf{R}}^{\left( m \right)}}} \right|_{\eta = \pm 1}} = \int_{ - 1}^1 {{{\left( {{{\mathbf{N}}^{\left( m \right)}}} \right)}^{\text{T}}}{\mathbf{\bar p}}\sqrt {{{\left( {\frac{{\partial x}}{{\partial \xi }}} \right)}^2} + {{\left( {\frac{{\partial y}}{{\partial \xi }}} \right)}^2}} {\text{d}}\xi }\]

2.2 以三节点三角形等参元为例子

(0,1)
 2
 * *
 *   *
 *     *
 η       *
 |         *
 0---ξ * * * 1
(0,0)       (1,0)

边界上的第一类曲线积分可以表示为:

()\[ \begin{align}\begin{aligned}{\left. {{{\mathbf{R}}^{\left( m \right)}}} \right|_{\xi = 0}} = \int_0^1 {{{\left( {{{\mathbf{N}}^{\left( m \right)}}} \right)}^{\text{T}}}{\mathbf{\bar p}}\sqrt {{{\left( {\frac{{\partial x}}{{\partial \eta }}} \right)}^2} + {{\left( {\frac{{\partial y}}{{\partial \eta }}} \right)}^2}} {\text{d}}\eta }\\{\left. {{{\mathbf{R}}^{\left( m \right)}}} \right|_{\eta = 0}} = \int_0^1 {{{\left( {{{\mathbf{N}}^{\left( m \right)}}} \right)}^{\text{T}}}{\mathbf{\bar p}}\sqrt {{{\left( {\frac{{\partial x}}{{\partial \xi }}} \right)}^2} + {{\left( {\frac{{\partial y}}{{\partial \xi }}} \right)}^2}} {\text{d}}\xi }\end{aligned}\end{align} \]

注意,对于斜边 1-2,我们有直线方程 \(\eta = 1 - \xi\) ,此时 \({\text{d}}\eta = -{\text{d}}\xi\)

()\[{\left. {{{\mathbf{R}}^{\left( m \right)}}} \right|_{\eta = 1 - \xi }} = \int_0^1 {{{\left( {{{\mathbf{N}}^{\left( m \right)}}} \right)}^{\text{T}}}{\mathbf{\bar p}}\sqrt {{{\left( {\frac{{\partial x}}{{\partial \xi }} - \frac{{\partial x}}{{\partial \eta }}} \right)}^2} + {{\left( {\frac{{\partial y}}{{\partial \xi }} - \frac{{\partial y}}{{\partial \eta }}} \right)}^2}} {\text{d}}\xi }\]

但是这种表达形式难以用于三维问题,因此我们对考虑将斜边 1-2 投影到其他坐标轴方向,由于斜边 1-2 的直线方程是已知的,因此有:

()\[{\left. {{{\mathbf{R}}^{\left( m \right)}}} \right|_{\eta = 1 - \xi }} = \int_0^1 {{{\left( {{{\mathbf{N}}^{\left( m \right)}}} \right)}^{\text{T}}}{\mathbf{\bar p}}\sqrt {{{\left( {\frac{{\partial x}}{{\partial \xi }}} \right)}^2} + {{\left( {\frac{{\partial y}}{{\partial \xi }}} \right)}^2}} \sqrt {1 + {{\left( {\frac{{\partial \eta }}{{\partial \xi }}} \right)}^2}} {\text{d}}\xi } = \int_0^1 {{{\left( {{{\mathbf{N}}^{\left( m \right)}}} \right)}^{\text{T}}}{\mathbf{\bar p}}\sqrt {{{\left( {\frac{{\partial x}}{{\partial \xi }}} \right)}^2} + {{\left( {\frac{{\partial y}}{{\partial \xi }}} \right)}^2}} \sqrt 2 {\text{d}}\xi }\]

通过选取合适的积分点,采用数值积分即可求得积分值。

3. 三维单元边界的第一类曲面积分

对于三维问题,我们有:

()\[ \begin{align}\begin{aligned}{\text{d}}\vec \xi = \frac{{\partial x}}{{\partial \xi }}{\text{d}}\xi \vec i + \frac{{\partial y}}{{\partial \xi }}{\text{d}}\xi \vec j + \frac{{\partial z}}{{\partial \xi }}{\text{d}}\xi \vec k\\{\text{d}}\vec \eta = \frac{{\partial x}}{{\partial \eta }}{\text{d}}\eta \vec i + \frac{{\partial y}}{{\partial \eta }}{\text{d}}\eta \vec j + \frac{{\partial z}}{{\partial \eta }}{\text{d}}\eta \vec k\\{\text{d}}\vec \zeta = \frac{{\partial x}}{{\partial \zeta }}{\text{d}}\zeta \vec i + \frac{{\partial y}}{{\partial \zeta }}{\text{d}}\zeta \vec j + \frac{{\partial z}}{{\partial \zeta }}{\text{d}}\zeta \vec k\end{aligned}\end{align} \]

此时体积微元的变换可以表示为:

()\[{\text{d}}V = \left( {{\text{d}}\vec \xi \times {\text{d}}\vec \eta } \right) \cdot {\text{d}}\vec \zeta = \det \left( {\mathbf{J}} \right){\text{d}}\xi {\text{d}}\eta {\text{d}}\zeta\]

\({\text{d}}\vec \xi\)\({\text{d}}\vec \eta\) 组成的面积微元矢量 \({\text{d}}\vec S\) 可以表示为:

()\[\begin{split}{\text{d}}\vec S = {\text{d}}\vec \xi \times {\text{d}}\vec \eta = \det \left( {\begin{array}{*{20}{c}} {\vec i}&{\vec j}&{\vec k} \\ {\frac{{\partial x}}{{\partial \xi }}}&{\frac{{\partial y}}{{\partial \xi }}}&{\frac{{\partial z}}{{\partial \xi }}} \\ {\frac{{\partial x}}{{\partial \eta }}}&{\frac{{\partial y}}{{\partial \eta }}}&{\frac{{\partial z}}{{\partial \eta }}} \end{array}} \right){\text{d}}\xi {\text{d}}\eta\end{split}\]

此时面积微元的变换可以表示为:

()\[\begin{split}{\text{d}}S = \left\| {{\text{d}}\vec S} \right\| = \sqrt {\det {{\left( {\begin{array}{*{20}{c}} {\frac{{\partial x}}{{\partial \xi }}}&{\frac{{\partial y}}{{\partial \xi }}} \\ {\frac{{\partial x}}{{\partial \eta }}}&{\frac{{\partial y}}{{\partial \eta }}} \end{array}} \right)}^2} + \det {{\left( {\begin{array}{*{20}{c}} {\frac{{\partial x}}{{\partial \xi }}}&{\frac{{\partial z}}{{\partial \xi }}} \\ {\frac{{\partial x}}{{\partial \eta }}}&{\frac{{\partial z}}{{\partial \eta }}} \end{array}} \right)}^2} + \det {{\left( {\begin{array}{*{20}{c}} {\frac{{\partial y}}{{\partial \xi }}}&{\frac{{\partial z}}{{\partial \xi }}} \\ {\frac{{\partial y}}{{\partial \eta }}}&{\frac{{\partial z}}{{\partial \eta }}} \end{array}} \right)}^2}} {\text{d}}\xi {\text{d}}\eta\end{split}\]

整理可得:

()\[{\text{d}}S = \sqrt {{{\left( {\frac{{\partial x}}{{\partial \xi }}\frac{{\partial y}}{{\partial \eta }} - \frac{{\partial x}}{{\partial \eta }}\frac{{\partial y}}{{\partial \xi }}} \right)}^2} + {{\left( {\frac{{\partial z}}{{\partial \xi }}\frac{{\partial x}}{{\partial \eta }} - \frac{{\partial z\partial x}}{{\partial \eta \partial \xi }}} \right)}^2} + {{\left( {\frac{{\partial y}}{{\partial \xi }}\frac{{\partial z}}{{\partial \eta }} - \frac{{\partial y}}{{\partial \eta }}\frac{{\partial z}}{{\partial \xi }}} \right)}^2}} {\text{d}}\xi {\text{d}}\eta\]

同理:

()\[ \begin{align}\begin{aligned}{\text{d}}S = \sqrt {{{\left( {\frac{{\partial x}}{{\partial \xi }}\frac{{\partial y}}{{\partial \zeta }} - \frac{{\partial x}}{{\partial \zeta }}\frac{{\partial y}}{{\partial \xi }}} \right)}^2} + {{\left( {\frac{{\partial z}}{{\partial \xi }}\frac{{\partial x}}{{\partial \zeta }} - \frac{{\partial z\partial x}}{{\partial \zeta \partial \xi }}} \right)}^2} + {{\left( {\frac{{\partial y}}{{\partial \xi }}\frac{{\partial z}}{{\partial \zeta }} - \frac{{\partial y}}{{\partial \zeta }}\frac{{\partial z}}{{\partial \xi }}} \right)}^2}} {\text{d}}\xi {\text{d}}\zeta\\{\text{d}}S = \sqrt {{{\left( {\frac{{\partial x}}{{\partial \zeta }}\frac{{\partial y}}{{\partial \eta }} - \frac{{\partial x}}{{\partial \eta }}\frac{{\partial y}}{{\partial \zeta }}} \right)}^2} + {{\left( {\frac{{\partial z}}{{\partial \zeta }}\frac{{\partial x}}{{\partial \eta }} - \frac{{\partial z\partial x}}{{\partial \eta \partial \zeta }}} \right)}^2} + {{\left( {\frac{{\partial y}}{{\partial \zeta }}\frac{{\partial z}}{{\partial \eta }} - \frac{{\partial y}}{{\partial \eta }}\frac{{\partial z}}{{\partial \zeta }}} \right)}^2}} {\text{d}}\zeta {\text{d}}\eta\end{aligned}\end{align} \]

3.1 以八节点六面体等参元为例子

             (-1,1,1)        (1,1,1)
              7---------------6
             /|              /|
            / |     ζ  η    / |
           /  |     | /    /  |
(-1,-1,1) 4---+-----|/----5 (1,-1,1)
          |   |     o--ξ  |   |
          |   3-----------+---2 (1,1,-1)
          |  /(-1,1,-1)   |  /
          | /             | /
          |/              |/
          0---------------1
         (-1,-1,-1)      (1,-1,-1)

边界上的第一类曲面积分可以表示为:

()\[ \begin{align}\begin{aligned}{\left. {{{\mathbf{R}}^{\left( m \right)}}} \right|_{\xi = \pm 1}} = \int_{ - 1}^1 {\int_{ - 1}^1 {{{\left( {{{\mathbf{N}}^{\left( m \right)}}} \right)}^{\text{T}}}{\mathbf{\bar p}}} } \sqrt {{{\left( {\frac{{\partial x}}{{\partial \zeta }}\frac{{\partial y}}{{\partial \eta }} - \frac{{\partial x}}{{\partial \eta }}\frac{{\partial y}}{{\partial \zeta }}} \right)}^2} + {{\left( {\frac{{\partial z}}{{\partial \zeta }}\frac{{\partial x}}{{\partial \eta }} - \frac{{\partial z\partial x}}{{\partial \eta \partial \zeta }}} \right)}^2} + {{\left( {\frac{{\partial y}}{{\partial \zeta }}\frac{{\partial z}}{{\partial \eta }} - \frac{{\partial y}}{{\partial \eta }}\frac{{\partial z}}{{\partial \zeta }}} \right)}^2}} {\text{d}}\zeta {\text{d}}\eta\\{\left. {{{\mathbf{R}}^{\left( m \right)}}} \right|_{\eta = \pm 1}} = \int_{ - 1}^1 {\int_{ - 1}^1 {{{\left( {{{\mathbf{N}}^{\left( m \right)}}} \right)}^{\text{T}}}{\mathbf{\bar p}}} } \sqrt {{{\left( {\frac{{\partial x}}{{\partial \xi }}\frac{{\partial y}}{{\partial \zeta }} - \frac{{\partial x}}{{\partial \zeta }}\frac{{\partial y}}{{\partial \xi }}} \right)}^2} + {{\left( {\frac{{\partial z}}{{\partial \xi }}\frac{{\partial x}}{{\partial \zeta }} - \frac{{\partial z\partial x}}{{\partial \zeta \partial \xi }}} \right)}^2} + {{\left( {\frac{{\partial y}}{{\partial \xi }}\frac{{\partial z}}{{\partial \zeta }} - \frac{{\partial y}}{{\partial \zeta }}\frac{{\partial z}}{{\partial \xi }}} \right)}^2}} {\text{d}}\xi {\text{d}}\zeta\\{\left. {{{\mathbf{R}}^{\left( m \right)}}} \right|_{\zeta = \pm 1}} = \int_{ - 1}^1 {\int_{ - 1}^1 {{{\left( {{{\mathbf{N}}^{\left( m \right)}}} \right)}^{\text{T}}}{\mathbf{\bar p}}} } \sqrt {{{\left( {\frac{{\partial x}}{{\partial \xi }}\frac{{\partial y}}{{\partial \eta }} - \frac{{\partial x}}{{\partial \eta }}\frac{{\partial y}}{{\partial \xi }}} \right)}^2} + {{\left( {\frac{{\partial z}}{{\partial \xi }}\frac{{\partial x}}{{\partial \eta }} - \frac{{\partial z\partial x}}{{\partial \eta \partial \xi }}} \right)}^2} + {{\left( {\frac{{\partial y}}{{\partial \xi }}\frac{{\partial z}}{{\partial \eta }} - \frac{{\partial y}}{{\partial \eta }}\frac{{\partial z}}{{\partial \xi }}} \right)}^2}} {\text{d}}\xi {\text{d}}\eta\end{aligned}\end{align} \]

通过选取合适的积分点,采用数值积分即可求得积分值。

3.2 以四节点四面体等参元为例子

(0,0,1)
 3
 * **
 *   * *
 *     *  *
 *       *   2 (0,1,0)
 *        **  *
 ζ     *     * *
 |  η          **
 0---ξ * * * * * 1
(0,0,0)         (1,0,0)

边界上的第一类曲面积分可以表示为:

()\[ \begin{align}\begin{aligned}{\left. {{{\mathbf{R}}^{\left( m \right)}}} \right|_{\xi = 0}} = \int_0^1 {\int_0^1 {{{\left( {{{\mathbf{N}}^{\left( m \right)}}} \right)}^{\text{T}}}{\mathbf{\bar p}}} } \sqrt {{{\left( {\frac{{\partial x}}{{\partial \zeta }}\frac{{\partial y}}{{\partial \eta }} - \frac{{\partial x}}{{\partial \eta }}\frac{{\partial y}}{{\partial \zeta }}} \right)}^2} + {{\left( {\frac{{\partial z}}{{\partial \zeta }}\frac{{\partial x}}{{\partial \eta }} - \frac{{\partial z\partial x}}{{\partial \eta \partial \zeta }}} \right)}^2} + {{\left( {\frac{{\partial y}}{{\partial \zeta }}\frac{{\partial z}}{{\partial \eta }} - \frac{{\partial y}}{{\partial \eta }}\frac{{\partial z}}{{\partial \zeta }}} \right)}^2}} {\text{d}}\zeta {\text{d}}\eta\\{\left. {{{\mathbf{R}}^{\left( m \right)}}} \right|_{\eta = 0}} = \int_0^1 {\int_0^1 {{{\left( {{{\mathbf{N}}^{\left( m \right)}}} \right)}^{\text{T}}}{\mathbf{\bar p}}} } \sqrt {{{\left( {\frac{{\partial x}}{{\partial \xi }}\frac{{\partial y}}{{\partial \zeta }} - \frac{{\partial x}}{{\partial \zeta }}\frac{{\partial y}}{{\partial \xi }}} \right)}^2} + {{\left( {\frac{{\partial z}}{{\partial \xi }}\frac{{\partial x}}{{\partial \zeta }} - \frac{{\partial z\partial x}}{{\partial \zeta \partial \xi }}} \right)}^2} + {{\left( {\frac{{\partial y}}{{\partial \xi }}\frac{{\partial z}}{{\partial \zeta }} - \frac{{\partial y}}{{\partial \zeta }}\frac{{\partial z}}{{\partial \xi }}} \right)}^2}} {\text{d}}\xi {\text{d}}\zeta\\{\left. {{{\mathbf{R}}^{\left( m \right)}}} \right|_{\zeta = 0}} = \int_0^1 {\int_0^1 {{{\left( {{{\mathbf{N}}^{\left( m \right)}}} \right)}^{\text{T}}}{\mathbf{\bar p}}} } \sqrt {{{\left( {\frac{{\partial x}}{{\partial \xi }}\frac{{\partial y}}{{\partial \eta }} - \frac{{\partial x}}{{\partial \eta }}\frac{{\partial y}}{{\partial \xi }}} \right)}^2} + {{\left( {\frac{{\partial z}}{{\partial \xi }}\frac{{\partial x}}{{\partial \eta }} - \frac{{\partial z\partial x}}{{\partial \eta \partial \xi }}} \right)}^2} + {{\left( {\frac{{\partial y}}{{\partial \xi }}\frac{{\partial z}}{{\partial \eta }} - \frac{{\partial y}}{{\partial \eta }}\frac{{\partial z}}{{\partial \xi }}} \right)}^2}} {\text{d}}\xi {\text{d}}\eta\end{aligned}\end{align} \]

对于斜面 1-2-3,我们有平面方程 \(\zeta = 1 - \xi - \eta\)

()\[{\left. {{{\mathbf{R}}^{\left( m \right)}}} \right|_{\zeta = 1 - \xi - \eta }} = \int_0^1 {\int_0^1 {{{\left( {{{\mathbf{N}}^{\left( m \right)}}} \right)}^{\text{T}}}{\mathbf{\bar p}}} } \sqrt {{{\left( {\frac{{\partial x}}{{\partial \xi }}\frac{{\partial y}}{{\partial \eta }} - \frac{{\partial x}}{{\partial \eta }}\frac{{\partial y}}{{\partial \xi }}} \right)}^2} + {{\left( {\frac{{\partial z}}{{\partial \xi }}\frac{{\partial x}}{{\partial \eta }} - \frac{{\partial z\partial x}}{{\partial \eta \partial \xi }}} \right)}^2} + {{\left( {\frac{{\partial y}}{{\partial \xi }}\frac{{\partial z}}{{\partial \eta }} - \frac{{\partial y}}{{\partial \eta }}\frac{{\partial z}}{{\partial \xi }}} \right)}^2}} \sqrt {1 + {{\left( {\frac{{\partial \zeta }}{{\partial \xi }}} \right)}^2} + {{\left( {\frac{{\partial \zeta }}{{\partial \eta }}} \right)}^2}} {\text{d}}\xi {\text{d}}\eta\]

所以有:

()\[{\left. {{{\mathbf{R}}^{\left( m \right)}}} \right|_{\zeta = 1 - \xi - \eta }} = \int_0^1 {\int_0^1 {{{\left( {{{\mathbf{N}}^{\left( m \right)}}} \right)}^{\text{T}}}{\mathbf{\bar p}}} } \sqrt {{{\left( {\frac{{\partial x}}{{\partial \xi }}\frac{{\partial y}}{{\partial \eta }} - \frac{{\partial x}}{{\partial \eta }}\frac{{\partial y}}{{\partial \xi }}} \right)}^2} + {{\left( {\frac{{\partial z}}{{\partial \xi }}\frac{{\partial x}}{{\partial \eta }} - \frac{{\partial z\partial x}}{{\partial \eta \partial \xi }}} \right)}^2} + {{\left( {\frac{{\partial y}}{{\partial \xi }}\frac{{\partial z}}{{\partial \eta }} - \frac{{\partial y}}{{\partial \eta }}\frac{{\partial z}}{{\partial \xi }}} \right)}^2}} \sqrt 3 {\text{d}}\xi {\text{d}}\eta\]

通过选取合适的积分点,采用数值积分即可求得积分值。

amplitude: Amplitude | None
amplitude_data: AmplitudeData
bc: BC
bc_dof_ids: ndarray
bc_dof_values: ndarray
bc_element_ids: ndarray
bc_fext: ndarray
bc_node_ids: ndarray
bc_surface: list[tuple[int, str]]
create_dof_values() None[源代码]
dof: Dof
get_amplitude: Callable
get_surface_from_bc_element(bc_element_id: int, bc_element: ndarray) list[tuple[int, str]][源代码]
get_surface_from_elements_nodes(element_id: int, node_ids: list[int]) list[tuple[int, str]][源代码]
mesh_data: MeshData
solver: Solver
pyfem.bc.NeumannBCPressure module
class pyfem.bc.NeumannBCPressure.NeumannBCPressure(bc: BC, dof: Dof, mesh_data: MeshData, solver: Solver, amplitude: Amplitude | None)[源代码]

基类:BaseBC

Neumann边界条件:压力

基于边界条件的属性、自由度属性、网格对象、求解器属性和幅值属性获取系统线性方程组 \({\mathbf{K u}} = {\mathbf{f}}\) 中对应等式右边项 \({\mathbf{f}}\) 的约束信息。

Neumann压力边界条件只能施加于边界表面列表 bc_surface,其中边界表面列表是由元组(单元编号,单元面名称)对象组成的列表。

边界表面列表 bc_surface 可以由边界条件属性中的节点集合 pyfem.io.BC.BC.node_sets 和单元集合 pyfem.io.BC.BC.element_sets 通过函数 get_surface_from_elements_nodes() 确定,也可以由边界条件属性中的边界单元集合 pyfem.io.BC.BC.bc_element_sets 通过函数 get_surface_from_bc_element() 确定。

对象创建时更新自由度序号列表 bc_node_ids 和对应等式右边项取值列表 bc_fext

理论-基于等参元的计算方法
1. 基于变分法的基本公式

考虑在单元边界上施加某个分布载荷的情况,对于二维问题,面力 \(\mathbf{\bar p}\)\(\left( m \right)\) 号单元所产生的等效节点载荷为:

()\[{{\mathbf{R}}^{\left( m \right)}} = \int\limits_{s_p^{\left( m \right)}} {{{\left( {{{\mathbf{N}}^{\left( m \right)}}} \right)}^{\text{T}}}{\mathbf{\bar p}}{\text{d}}s}\]

对于三维问题,面力 \(\mathbf{\bar p}\)\(\left( m \right)\) 号单元所产生的等效节点载荷为:

()\[{{\mathbf{R}}^{\left( m \right)}} = \iint\limits_{S_p^{\left( m \right)}} {{{\left( {{{\mathbf{N}}^{\left( m \right)}}} \right)}^{\text{T}}}{\mathbf{\bar p}}{\text{d}}S}\]

若单元的某个面上只作用着沿外法线方向的法向载荷

amplitude: Amplitude | None
amplitude_data: AmplitudeData
bc: BC
bc_dof_ids: ndarray
bc_dof_values: ndarray
bc_element_ids: ndarray
bc_fext: ndarray
bc_node_ids: ndarray
bc_surface: list[tuple[int, str]]
create_dof_values() None[源代码]
dof: Dof
get_amplitude: Callable
get_surface_from_bc_element(bc_element_id: int, bc_element: ndarray) list[tuple[int, str]][源代码]
get_surface_from_elements_nodes(element_id: int, node_ids: list[int]) list[tuple[int, str]][源代码]
mesh_data: MeshData
solver: Solver
pyfem.bc.derive_surface_integral module
pyfem.bc.get_bc_data module
pyfem.bc.get_bc_data.get_bc_data(bc: BC, dof: Dof, mesh_data: MeshData, solver: Solver, amplitude: Amplitude | None) BaseBC | DirichletBC | NeumannBCConcentrated | NeumannBCDistributed | NeumannBCPressure[源代码]

工厂函数,用于根据边界条件属性生产不同的边界条件对象。

参数:
  • bc (BC) – 边界条件属性

  • dof (Dof) – 自由度属性

  • mesh_data (MeshData) – 网格数据对象

  • solver (Solver) – 求解器属性

  • amplitude (Optional[Amplitude]) – 幅值属性

返回:

边界条件对象

返回类型:

BCData

Module contents
pyfem.elements package
Submodules
pyfem.elements.BaseElement module
class pyfem.elements.BaseElement.BaseElement(element_id: int, iso_element_shape: IsoElementShape, connectivity: ndarray, node_coords: ndarray)[源代码]

基类:object

单元数据实体的基类。

变量:
  • element_id (int) – 单元序号

  • iso_element_shape (IsoElementShape) – 等参元对象

  • dimension (int) – 单元空间维度

  • topological_dimension (int) – 单元拓扑维度

  • connectivity (ndarray) – 单元节点序号列表

  • node_coords (ndarray) – 单元节点坐标列表

  • assembly_conn (ndarray) – 全局单元节点序号列表

  • dof (Dof) – io.Dof的自由度对象

  • materials (list[Material]) – io.Material的材料对象列表

  • section (list[Section]) – io.Section的截面对象列表

  • material_data_list (list[MaterialData]) – 材料数据对象列表

  • timer (Timer) – 计时器对象

  • dof_names (list[str]) – 自由度名称列表

  • qp_number (int) – 积分点个数

  • qp_dhdxes (ndarray(qp_number, 空间维度, 单元节点数)) – 积分点处的全局坐标形函数梯度

  • qp_jacobis (ndarray(qp_number, 空间维度, 空间维度)) – 积分点处的雅克比矩阵列表

  • qp_jacobi_invs (ndarray(qp_number,)) – 积分点处的雅克比矩阵逆矩阵列表

  • qp_jacobi_dets (ndarray(qp_number,)) – 积分点处的雅克比矩阵行列式列表

  • qp_weight_times_jacobi_dets (ndarray(qp_number,)) – 积分点处的雅克比矩阵行列式乘以积分权重列表

  • qp_ddsddes (ndarray) – 积分点处的材料刚度矩阵列表

  • qp_state_variables (list[dict[str, ndarray]]) – 积分点处的状态变量列表

  • qp_state_variables_new (list[dict[str, ndarray]]) – 积分点处局部增量时刻的状态变量列表

  • qp_field_variables (dict[str, ndarray]) – 积分点处场变量字典

  • element_dof_number (int) – 单元自由度总数

  • element_dof_ids (list[int]) – 单元全局自由度编号列表

  • element_dof_values (ndarray(element_dof_number,)) – 单元全局自由度数值列表

  • element_ddof_values (ndarray(element_dof_number,)) – 单元全局自由度数值增量列表

  • element_fint (ndarray(element_dof_number,)) – 单元内力列表

  • element_ftime (ndarray(element_dof_number,)) – 单元时间离散外力列表

  • element_stiffness (ndarray(element_dof_number, element_dof_number)) – 单元刚度矩阵

  • element_average_field_variables (dict[str, ndarray]) – 单元磨平后的场变量字典

  • allowed_material_data_list (list[Tuple]) – 许可的单元材料数据类名列表

  • allowed_material_number (int) – 许可的单元材料数量

allowed_material_data_list: list[tuple]
allowed_material_number: int
assembly_conn: ndarray
cal_jacobi() None[源代码]

计算单元所有积分点处的雅克比矩阵qp_jacobis,雅克比矩阵的逆矩阵qp_jacobi_invs,雅克比矩阵行列式qp_jacobi_dets和雅克比矩阵行列式乘以积分点权重qp_weight_times_jacobi_dets。

全局坐标系 \(\left( {{x_1},{x_2},{x_3}} \right)\) 和局部坐标系 \(\left( {{\xi _1},{\xi _2},{\xi _3}} \right)\) 之间的雅克比矩阵如下:

()\[\begin{split}\left\{ {\begin{array}{*{20}{c}} {{\text{d}}{x_1}} \\ {{\text{d}}{x_2}} \\ {{\text{d}}{x_3}} \end{array}} \right\} = \left[ {\begin{array}{*{20}{c}} {\frac{{\partial {x_1}}}{{\partial {\xi _1}}}}&{\frac{{\partial {x_1}}}{{\partial {\xi _2}}}}&{\frac{{\partial {x_1}}}{{\partial {\xi _3}}}} \\ {\frac{{\partial {x_2}}}{{\partial {\xi _1}}}}&{\frac{{\partial {x_2}}}{{\partial {\xi _2}}}}&{\frac{{\partial {x_2}}}{{\partial {\xi _3}}}} \\ {\frac{{\partial {x_3}}}{{\partial {\xi _1}}}}&{\frac{{\partial {x_3}}}{{\partial {\xi _2}}}}&{\frac{{\partial {x_3}}}{{\partial {\xi _3}}}} \end{array}} \right]\left\{ {\begin{array}{*{20}{c}} {{\text{d}}{\xi _1}} \\ {{\text{d}}{\xi _2}} \\ {{\text{d}}{\xi _3}} \end{array}} \right\}\end{split}\]
()\[\begin{split}\left[ J \right] = \left[ {\begin{array}{*{20}{c}} {\frac{{\partial {x_1}}}{{\partial {\xi _1}}}}&{\frac{{\partial {x_1}}}{{\partial {\xi _2}}}}&{\frac{{\partial {x_1}}}{{\partial {\xi _3}}}} \\ {\frac{{\partial {x_2}}}{{\partial {\xi _1}}}}&{\frac{{\partial {x_2}}}{{\partial {\xi _2}}}}&{\frac{{\partial {x_2}}}{{\partial {\xi _3}}}} \\ {\frac{{\partial {x_3}}}{{\partial {\xi _1}}}}&{\frac{{\partial {x_3}}}{{\partial {\xi _2}}}}&{\frac{{\partial {x_3}}}{{\partial {\xi _3}}}} \end{array}} \right]\end{split}\]

笛卡尔全局坐标系 \(\left( x,y,z \right)\) 和局部坐标系 \(\left( {\xi ,\eta ,\zeta } \right)\) 之间雅克比矩阵可以表示为:

()\[\begin{split}\left\{ {\begin{array}{*{20}{c}} {{\text{d}}x} \\ {{\text{d}}y} \\ {{\text{d}}z} \end{array}} \right\} = \left[ {\begin{array}{*{20}{c}} {\frac{{\partial x}}{{\partial \xi }}}&{\frac{{\partial x}}{{\partial \eta }}}&{\frac{{\partial x}}{{\partial \zeta }}} \\ {\frac{{\partial y}}{{\partial \xi }}}&{\frac{{\partial y}}{{\partial \eta }}}&{\frac{{\partial y}}{{\partial \zeta }}} \\ {\frac{{\partial z}}{{\partial \xi }}}&{\frac{{\partial z}}{{\partial \eta }}}&{\frac{{\partial z}}{{\partial \zeta }}} \end{array}} \right]\left\{ {\begin{array}{*{20}{c}} {{\text{d}}\xi } \\ {{\text{d}}\eta } \\ {{\text{d}}\zeta } \end{array}} \right\}\end{split}\]
()\[\begin{split}\left[ J \right] = \left[ {\begin{array}{*{20}{c}} {\frac{{\partial x}}{{\partial \xi }}}&{\frac{{\partial x}}{{\partial \eta }}}&{\frac{{\partial x}}{{\partial \zeta }}} \\ {\frac{{\partial y}}{{\partial \xi }}}&{\frac{{\partial y}}{{\partial \eta }}}&{\frac{{\partial y}}{{\partial \zeta }}} \\ {\frac{{\partial z}}{{\partial \xi }}}&{\frac{{\partial z}}{{\partial \eta }}}&{\frac{{\partial z}}{{\partial \zeta }}} \end{array}} \right]\end{split}\]

采用形函数和单元节点坐标表示:

()\[\begin{split}\left[ J \right] = \left[ {\begin{array}{*{20}{c}} {\sum\limits_{i = 1}^n {\frac{{\partial {N_i}}}{{\partial \xi }}} {x_i}}&{\sum\limits_{i = 1}^n {\frac{{\partial {N_i}}}{{\partial \eta }}} {x_i}}&{\sum\limits_{i = 1}^n {\frac{{\partial {N_i}}}{{\partial \zeta }}} {x_i}} \\ {\sum\limits_{i = 1}^n {\frac{{\partial {N_i}}}{{\partial \xi }}} {y_i}}&{\sum\limits_{i = 1}^n {\frac{{\partial {N_i}}}{{\partial \eta }}} {y_i}}&{\sum\limits_{i = 1}^n {\frac{{\partial {N_i}}}{{\partial \zeta }}} {y_i}} \\ {\sum\limits_{i = 1}^n {\frac{{\partial {N_i}}}{{\partial \xi }}} {z_i}}&{\sum\limits_{i = 1}^n {\frac{{\partial {N_i}}}{{\partial \eta }}} {z_i}}&{\sum\limits_{i = 1}^n {\frac{{\partial {N_i}}}{{\partial \zeta }}} {z_i}} \end{array}} \right] = {\left( {\underbrace {\left[ {\begin{array}{*{20}{c}} {\frac{{\partial {N_1}}}{{\partial \xi }}}& \cdots &{\frac{{\partial {N_n}}}{{\partial \xi }}} \\ {\frac{{\partial {N_1}}}{{\partial \eta }}}& \cdots &{\frac{{\partial {N_n}}}{{\partial \eta }}} \\ {\frac{{\partial {N_1}}}{{\partial \zeta }}}& \cdots &{\frac{{\partial {N_n}}}{{\partial \zeta }}} \end{array}} \right]}_{{\text{qp_shape_gradient}}}\underbrace {\left[ {\begin{array}{*{20}{c}} {{x_1}}&{{y_1}}&{{z_1}} \\ \vdots & \vdots & \vdots \\ {{x_n}}&{{y_n}}&{{z_n}} \end{array}} \right]}_{{\text{node_coords}}}} \right)^T}\end{split}\]
check_materials() None[源代码]
connectivity: ndarray
create_element_dof_ids() None[源代码]
create_qp_b_matrices() None[源代码]
dimension: int
dof: Dof
dof_names: list[str]
element_average_field_variables: dict[str, ndarray]
element_ddof_values: ndarray
element_dof_ids: list[int]
element_dof_number: int
element_dof_values: ndarray
element_fint: ndarray
element_ftime: ndarray
element_id: int
element_stiffness: ndarray
goback_element_state_variables() None[源代码]
iso_element_shape: IsoElementShape
material_data_list: list[BaseMaterial | MechanicalThermalExpansion | PhaseFieldDamage | PlasticKinematicHardening | ThermalIsotropic | ViscoElasticMaxwell | ElasticIsotropic | DiffusionIsotropic]
materials: list[Material]
node_coords: ndarray
qp_ddsddes: list[ndarray]
qp_dhdxes: ndarray
qp_field_variables: dict[str, ndarray]
qp_jacobi_dets: ndarray
qp_jacobi_invs: ndarray
qp_jacobis: ndarray
qp_number: int
qp_state_variables: list[dict[str, ndarray]]
qp_state_variables_new: list[dict[str, ndarray]]
qp_weight_times_jacobi_dets: ndarray
section: Section
show() None[源代码]
timer: Timer
to_string(level: int = 1) str[源代码]
topological_dimension: int
update_element_ddof_values(global_ddof_values: ndarray) None[源代码]
update_element_dof_values(global_dof_values: ndarray) None[源代码]
update_element_field_variables() None[源代码]
update_element_material_stiffness_fint(is_update_material: bool = True, is_update_stiffness: bool = True, is_update_fint: bool = True) None[源代码]
update_element_state_variables() None[源代码]
pyfem.elements.Diffusion module
class pyfem.elements.Diffusion.Diffusion(element_id: int, iso_element_shape: IsoElementShape, connectivity: ndarray, node_coords: ndarray, dof: Dof, materials: list[Material], section: Section, material_data_list: list[BaseMaterial | MechanicalThermalExpansion | PhaseFieldDamage | PlasticKinematicHardening | ThermalIsotropic | ViscoElasticMaxwell | ElasticIsotropic | DiffusionIsotropic], timer: Timer)[源代码]

基类:BaseElement

温度单元。

变量:
  • qp_temperatures (ndarray) – 积分点处的温度列表

  • qp_heat_fluxes (ndarray) – 积分点处的热流密度列表

  • qp_ddsddts (list[ndarray]) – 积分点处的材料热传导系数矩阵列表

  • ntens (int) – 总应力数量

  • ndi (int) – 轴向应力数量

  • nshr (int) – 剪切应力数量

allowed_material_data_list: list[tuple]
allowed_material_number: int
assembly_conn: ndarray
connectivity: ndarray
dimension: int
dof: Dof
dof_names: list[str]
element_average_field_variables: dict[str, ndarray]
element_ddof_values: ndarray
element_dof_ids: list[int]
element_dof_number: int
element_dof_values: ndarray
element_fint: ndarray
element_ftime: ndarray
element_id: int
element_stiffness: ndarray
iso_element_shape: IsoElementShape
material_data_list: list[BaseMaterial | MechanicalThermalExpansion | PhaseFieldDamage | PlasticKinematicHardening | ThermalIsotropic | ViscoElasticMaxwell | ElasticIsotropic | DiffusionIsotropic]
materials: list[Material]
ndi
node_coords: ndarray
nshr
ntens
qp_concentration_fluxes: list[ndarray]
qp_concentrations: list[ndarray]
qp_dconcentrations: list[ndarray]
qp_ddsddcs: list[ndarray]
qp_ddsddes: list[ndarray]
qp_dhdxes: ndarray
qp_field_variables: dict[str, ndarray]
qp_jacobi_dets: ndarray
qp_jacobi_invs: ndarray
qp_jacobis: ndarray
qp_number: int
qp_state_variables: list[dict[str, ndarray]]
qp_state_variables_new: list[dict[str, ndarray]]
qp_weight_times_jacobi_dets: ndarray
section: Section
timer: Timer
topological_dimension: int
update_element_field_variables() None[源代码]
update_element_material_stiffness_fint(is_update_material: bool = True, is_update_stiffness: bool = True, is_update_fint: bool = True) None[源代码]
pyfem.elements.SolidFiniteStrain module
class pyfem.elements.SolidFiniteStrain.SolidFiniteStrain(element_id: int, iso_element_shape: IsoElementShape, connectivity: ndarray, node_coords: ndarray, dof: Dof, materials: list[Material], section: Section, material_data_list: list[BaseMaterial | MechanicalThermalExpansion | PhaseFieldDamage | PlasticKinematicHardening | ThermalIsotropic | ViscoElasticMaxwell | ElasticIsotropic | DiffusionIsotropic], timer: Timer)[源代码]

基类:BaseElement

固体有限变形单元

变量:
  • qp_b_matrices (ndarray) – 积分点处的B矩阵列表

  • qp_b_matrices_transpose (ndarray) – 积分点处的B矩阵转置列表

  • qp_strains (list[ndarray]) – 积分点处的应变列表

  • qp_stresses (list[ndarray]) – 积分点处的应力列表

  • ntens (int) – 总应力数量

  • ndi (int) – 轴向应力数量

  • nshr (int) – 剪切应力数量

测试:比较当前代码和商业有限元软件 ABAQUS 的刚度矩阵,可以通过修改 ABAQUS inp文件,添加以下代码,将单元刚度矩阵输出到 ELEMENTSTIFFNESS.mtx 文件中:

*Output, history, variable=PRESELECT
*Element Matrix Output, Elset=Part-1-1.Set-All, File Name=ElementStiffness, Output File=User Defined, stiffness=yes

我们可以发现 ABAQUS 使用的单元刚度矩阵和当前代码计算的刚度矩阵有一定的差别,这是由于 ABAQUS 采用了 B-Bar 方法对 B 矩阵进行了修正。

注意:当前单元均为原始形式,存在剪切自锁,体积自锁,沙漏模式和零能模式等误差模式。几种误差模式的描述可以参考 https://blog.csdn.net/YORU_NO_KUNI/article/details/130370094

allowed_material_data_list: list[tuple]
allowed_material_number: int
assembly_conn: ndarray
cal_jacobi_t() None[源代码]

计算t时刻雅克比矩阵

采用 Updated Lagrangian 方法需要计算 \(X^t\) 构型下,单元积分点处的雅克比矩阵 qp_jacobis_t,雅克比矩阵的逆矩阵 qp_jacobi_invs_t, 雅克比矩阵行列式 qp_jacobi_dets_t 和雅克比矩阵行列式乘以积分点权重 qp_weight_times_jacobi_dets_t

全局坐标系 \(\left( {{x_1},{x_2},{x_3}} \right)\) 和局部坐标系 \(\left( {{\xi _1},{\xi _2},{\xi _3}} \right)\) 之间的雅克比矩阵如下:

()\[\begin{split}\left\{ {\begin{array}{*{20}{c}} {{\text{d}}{x_1}} \\ {{\text{d}}{x_2}} \\ {{\text{d}}{x_3}} \end{array}} \right\} = \left[ {\begin{array}{*{20}{c}} {\frac{{\partial {x_1}}}{{\partial {\xi _1}}}}&{\frac{{\partial {x_1}}}{{\partial {\xi _2}}}}&{\frac{{\partial {x_1}}}{{\partial {\xi _3}}}} \\ {\frac{{\partial {x_2}}}{{\partial {\xi _1}}}}&{\frac{{\partial {x_2}}}{{\partial {\xi _2}}}}&{\frac{{\partial {x_2}}}{{\partial {\xi _3}}}} \\ {\frac{{\partial {x_3}}}{{\partial {\xi _1}}}}&{\frac{{\partial {x_3}}}{{\partial {\xi _2}}}}&{\frac{{\partial {x_3}}}{{\partial {\xi _3}}}} \end{array}} \right]\left\{ {\begin{array}{*{20}{c}} {{\text{d}}{\xi _1}} \\ {{\text{d}}{\xi _2}} \\ {{\text{d}}{\xi _3}} \end{array}} \right\}\end{split}\]
()\[\begin{split}\left[ J \right] = \left[ {\begin{array}{*{20}{c}} {\frac{{\partial {x_1}}}{{\partial {\xi _1}}}}&{\frac{{\partial {x_1}}}{{\partial {\xi _2}}}}&{\frac{{\partial {x_1}}}{{\partial {\xi _3}}}} \\ {\frac{{\partial {x_2}}}{{\partial {\xi _1}}}}&{\frac{{\partial {x_2}}}{{\partial {\xi _2}}}}&{\frac{{\partial {x_2}}}{{\partial {\xi _3}}}} \\ {\frac{{\partial {x_3}}}{{\partial {\xi _1}}}}&{\frac{{\partial {x_3}}}{{\partial {\xi _2}}}}&{\frac{{\partial {x_3}}}{{\partial {\xi _3}}}} \end{array}} \right]\end{split}\]

笛卡尔全局坐标系 \(\left( x,y,z \right)\) 和局部坐标系 \(\left( {\xi ,\eta ,\zeta } \right)\) 之间雅克比矩阵可以表示为:

()\[\begin{split}\left\{ {\begin{array}{*{20}{c}} {{\text{d}}x} \\ {{\text{d}}y} \\ {{\text{d}}z} \end{array}} \right\} = \left[ {\begin{array}{*{20}{c}} {\frac{{\partial x}}{{\partial \xi }}}&{\frac{{\partial x}}{{\partial \eta }}}&{\frac{{\partial x}}{{\partial \zeta }}} \\ {\frac{{\partial y}}{{\partial \xi }}}&{\frac{{\partial y}}{{\partial \eta }}}&{\frac{{\partial y}}{{\partial \zeta }}} \\ {\frac{{\partial z}}{{\partial \xi }}}&{\frac{{\partial z}}{{\partial \eta }}}&{\frac{{\partial z}}{{\partial \zeta }}} \end{array}} \right]\left\{ {\begin{array}{*{20}{c}} {{\text{d}}\xi } \\ {{\text{d}}\eta } \\ {{\text{d}}\zeta } \end{array}} \right\}\end{split}\]
()\[\begin{split}\left[ J \right] = \left[ {\begin{array}{*{20}{c}} {\frac{{\partial x}}{{\partial \xi }}}&{\frac{{\partial x}}{{\partial \eta }}}&{\frac{{\partial x}}{{\partial \zeta }}} \\ {\frac{{\partial y}}{{\partial \xi }}}&{\frac{{\partial y}}{{\partial \eta }}}&{\frac{{\partial y}}{{\partial \zeta }}} \\ {\frac{{\partial z}}{{\partial \xi }}}&{\frac{{\partial z}}{{\partial \eta }}}&{\frac{{\partial z}}{{\partial \zeta }}} \end{array}} \right]\end{split}\]

\(X^t\) 时刻构型单元节点坐标表示:

()\[\begin{split}\left\{ {\begin{array}{*{20}{c}} {{\text{d}}{x^t}} \\ {{\text{d}}{y^t}} \\ {{\text{d}}{z^t}} \end{array}} \right\} = \left[ {\begin{array}{*{20}{c}} {\frac{{\partial {x^t}}}{{\partial \xi }}}&{\frac{{\partial {x^t}}}{{\partial \eta }}}&{\frac{{\partial {x^t}}}{{\partial \zeta }}} \\ {\frac{{\partial {y^t}}}{{\partial \xi }}}&{\frac{{\partial {y^t}}}{{\partial \eta }}}&{\frac{{\partial {y^t}}}{{\partial \zeta }}} \\ {\frac{{\partial {z^t}}}{{\partial \xi }}}&{\frac{{\partial {z^t}}}{{\partial \eta }}}&{\frac{{\partial {z^t}}}{{\partial \zeta }}} \end{array}} \right]\left\{ {\begin{array}{*{20}{c}} {{\text{d}}\xi } \\ {{\text{d}}\eta } \\ {{\text{d}}\zeta } \end{array}} \right\}\end{split}\]

根据单元形函数的性质有,

()\[\begin{split}{x^t} = \sum\limits_{k = 1}^n {{N_k}} x_k^t \\ {y^t} = \sum\limits_{k = 1}^n {{N_k}} y_k^t \\ {z^t} = \sum\limits_{k = 1}^n {{N_k}} z_k^t \\\end{split}\]

其中 \(n\) 为单元节点总数,可以得到:

()\[\begin{split}\left[ J \right] = \left[ {\begin{array}{*{20}{c}} {\sum\limits_{i = 1}^n {\frac{{\partial {N_i}}}{{\partial \xi }}} x_i^t}&{\sum\limits_{i = 1}^n {\frac{{\partial {N_i}}}{{\partial \eta }}} x_i^t}&{\sum\limits_{i = 1}^n {\frac{{\partial {N_i}}}{{\partial \zeta }}} x_i^t} \\ {\sum\limits_{i = 1}^n {\frac{{\partial {N_i}}}{{\partial \xi }}} y_i^t}&{\sum\limits_{i = 1}^n {\frac{{\partial {N_i}}}{{\partial \eta }}} y_i^t}&{\sum\limits_{i = 1}^n {\frac{{\partial {N_i}}}{{\partial \zeta }}} y_i^t} \\ {\sum\limits_{i = 1}^n {\frac{{\partial {N_i}}}{{\partial \xi }}} z_i^t}&{\sum\limits_{i = 1}^n {\frac{{\partial {N_i}}}{{\partial \eta }}} z_i^t}&{\sum\limits_{i = 1}^n {\frac{{\partial {N_i}}}{{\partial \zeta }}} z_i^t} \end{array}} \right] = {\left( {\underbrace {\left[ {\begin{array}{*{20}{c}} {\frac{{\partial {N_1}}}{{\partial \xi }}}& \cdots &{\frac{{\partial {N_n}}}{{\partial \xi }}} \\ {\frac{{\partial {N_1}}}{{\partial \eta }}}& \cdots &{\frac{{\partial {N_n}}}{{\partial \eta }}} \\ {\frac{{\partial {N_1}}}{{\partial \zeta }}}& \cdots &{\frac{{\partial {N_n}}}{{\partial \zeta }}} \end{array}} \right] \cdot }_{{\text{qp_shape_gradient}}}\underbrace {\left[ {\begin{array}{*{20}{c}} {x_1^t}&{y_1^t}&{z_1^t} \\ \vdots & \vdots & \vdots \\ {x_n^t}&{x_n^t}&{x_n^t} \end{array}} \right]}_{{\text{node_coords}}}} \right)^T}\end{split}\]
connectivity: ndarray
create_qp_b_matrices() None[源代码]

获得 Lagrangian 网格的线性应变-位移矩阵

Lagrangian网格
1. 引言

在 Lagrangian网格中,节点和单元随着材料移动。边界和接触面与单元的边缘保持一致,因此它们的处理较为简单。积分点也随着材料移动,因此本构方程总是在相同材料点处赋值,这对于历史相关材料是有利的。 基于这些原因,在固体力学中广泛地应用Lagrangian网格。应用Lagrangian网格的有限元离散通常划分为更新的Lagrangian格式(U.L.)和完全的Lagrangian格式(T.L.)。这两种格式都采用了Lagrangian描述,即相关变量是材料(Lagrangian)坐标和时间的函数。 在更新的Lagrangian格式中,导数是相对于空间(Eulerian)坐标的,弱形式包括在整个变形(或当前)构形上的积分。 在完全的Lagrangian格式中,弱形式包括在初始(参考)构形上的积分,导数是相对于材料坐标的[1]。

单元使用的节点坐标和位移插值是:

()\[{}^0{x_i} = \sum\limits_{k = 1}^n {{N_k}} {\;^0}x_i^k,\; {{}^t}{x_i} = \sum\limits_{k = 1}^n {{N_k}} {\;^t}x_i^k \;\;(i = 1,2,3)\]
()\[{}^t{u_i} = \sum\limits_{k = 1}^n {{N_k}} {\;^t}u_i^k,\; \Delta {u_i} = \sum\limits_{k = 1}^n {{N_k}} \;\Delta u_i^k \;\;(i = 1,2,3)\]

这里, \(N_{k}\) 是单元插值函数, \(k\) 是节点个数。现推导 T. L. 和 U. L. 公式中有关单元的矩阵。

说明:方程变量分量形式的左下标代表构形,左上标代表时刻,右上标代表哑标,右下标是变量分量指标。 如 \({}_t^{t + \Delta t}\Delta e_{ij}^{\left( {k - 1} \right)}\) 代表 \(t\) 时刻(当前)构形下 \(t + \Delta t\) 时刻 \(\Delta e_{ij}\) 变量的第:math:k-1 个分量。

2. 完全的Lagrangian格式有限元方程

说明:方程变量分量形式的左下标代表构形,左上标代表时刻,右上标代表哑标,右下标是变量分量指标。 如 \({}_t^{t + \Delta t}\Delta e_{ij}^{\left( {k - 1} \right)}\) 代表 \(t\) 时刻(当前)构形下 \(t + \Delta t\) 时刻 \(\Delta e_{ij}\) 变量的第:math:k-1 个分量。

(1)增量形式的 T.L. 方程:

()\[\int_{{}^0 V} { }_{0} \mathrm{C}_{i j r s} \ { }_{0} \Delta e_{r s} \delta \ { }_{0} \Delta e_{i j} {}^{0} \mathrm{~d} V + \int_{{}^0 V} { }_{0}^{t} S_{i j} \delta \Delta \ { }_{0} \eta_{i j} { }^{0} \mathrm{~d} V ={ }^{t+\Delta t} R - \int_{{}^0 V} { }_{0}^{t} S_{i j} \delta \ { }_{0} \Delta e_{i j} { }^{0} \mathrm{~d} V\]

(2)采用修正的牛顿迭代求解格式为:

()\[\int_{{}^0 V} { }_{0} \mathrm{C}_{i j r s} \ {}_{0}\Delta e_{r s}^\left(k \right) \delta \ {}_{0}\Delta e_{i j} \ {}^{0} \! \mathrm{~d} V + \int_{{}^0 V} { }_{0}^{t} S_{i j} \delta \ {}_{0} \Delta \eta_{i j}^\left(k \right) \ { }^{0} \! \mathrm{~d} V ={ }^{t+\Delta t} R - \int_{{}^0 V} { }_{0}^{t+\Delta t} S_{i j}^\left(k-1 \right) \delta \ {}_{0}^{t+\Delta t} \Delta e_{i j}^\left(k-1 \right) \ { }^{0} \! \mathrm{~d} V\]

其中

()\[{}^{t + \Delta t}R = \int_{{}_0V} {{}_0^{t + \Delta t}} {f_i}\delta {u_i}{\;^0}\;{\text{d}}V + \int_{{}_0S} {{}_0^{t + \Delta t}} {t_i}\delta {u_i}{\;^0}\;{\text{d}}S\]

(3)T.L. 方程的增量应变记为:

()\[{ }_{0} \Delta \varepsilon_{i j} = \frac{1}{2}\left({ }_{0} \Delta u_{i,j} + \ { }_{0} \Delta u_{j,i} \right) + \frac{1}{2} \left( { }_{0}^{t} u_{k,i} \ { }_{0} \Delta u_{k,j}+ \ { }_{0} \Delta u_{k,i} \ { }_{0}^{t} u_{k,j} \right) + \frac{1}{2} \left( { }_{0} \Delta u_{k,i} \ { }_{0} \Delta u_{k,j}\right) \;\; (i = 1,2,3,j = 1,2,3,k = 1,2,3)\]

(4)相应的计算矩阵有限元离散格式:

静力分析:

()\[\left({}_{0}^{t}\left[K_{L}\right]+{ }_{0}^{t}\left[K_{N L}\right] \right) \Delta\{U\}^{(i)} = {}^{t+\Delta t}\{R\} - { }_0^{t+\Delta t}\{F\}^{(i-1)}\]

动力分析隐式积分:

()\[[M] \ {}^{t+\Delta t}\left\{\ddot{U}\right\}^{(i)} + \left({}_{0}^{t}\left[K_{L}\right]+{ }_{0}^{t}\left[K_{N L}\right]\right) \Delta\{U\}^{(i)} = {}^{t+\Delta t}\{R\} - \ { }^{t+\Delta t}\{F\}^{(i-1)}\]

动力分析显式积分:

()\[[M] \ {}^{t}\{\ddot U\} = {}^{t}\{R\} - \ {}_0^{t}\{F\}\]

其中, \({ }_{0}^{t}\left[K_{L}\right]=\int_{{}^0 V}{ }_{0}^{t}\left[B_{\mathrm{L}}\right]^{\mathrm{T}} \ { }_{0}[C] \ {}_{0}^{t}\left[B_{\mathrm{L}}\right] \ {}^{0} \mathrm{~d} V\) 为线性应变增量刚度矩阵; \({ }_{0}[\mathrm{C}]\) 为增量应力一应变材料特性矩阵; \({ }_{0}^{t}\left[B_{\mathrm{L}}\right]\) 为线性应变一位移变换矩阵。

线性应变一位移变换矩阵,使用:

()\[{ }_{0}\{e\}={ }_{0}^{t}\left[B_{L}\right]\{\bar{u}\}\]

其中

()\[_{0}\{e\}^{T}=\left[\begin{array}{llllll} { }_{0} e_{11} & { }_{0} e_{22} & { }_{0} e_{33} & 2_{0} e_{12} & 2_{0} e_{13} & 2_{0} e_{23} \end{array}\right]\]
()\[\{\bar{u}\}^{T}=\left[\begin{array}{llllllllll} u_{1}^{1} & u_{2}^{1} & u_{3}^{1} & u_{1}^{2} & u_{2}^{2} & u_{3}^{2} & \cdot \cdot \cdot & u_{1}^{n} & u_{2}^{n} & u_{3}^{n} \end{array}\right]\]

对于T.L. 方程,线性应变一位移变换矩阵 \({ }_{0}^{t}\left[B_{\mathrm{L}}\right]\) 可写为:

()\[{ }_{0}^{t}\left[B_{\mathrm{L}}\right] = { }_{0}^{t}\left[B_{\mathrm{L}_{0}}\right]+{ }_{0}^{t}\left[B_{\mathrm{L}_{1}}\right]\]

其中, \({ }_{0}^{t}\left[B_{\mathrm{L}_{0}}\right]\) 与一般的线性应变-位移矩阵相同,对应 \(\frac{1}{2}\left({ }_{0} \Delta u_{i,j} + { }_{0} \Delta u_{j,i} \right)\) 线性应变增量部分

()\[\begin{split}{ }_{0}^{t} \left[B_{L_{0}}\right]=\left(\begin{array}{cccccccc} { }_{0} N_{1,1} & 0 & 0 & { }_{0} N_{2,1} & \cdot & \cdot & \cdot & 0 \\ 0 & { }_{0} N_{1,2} & 0 & 0 & \cdot & \cdot & \cdot & 0 \\ 0 & 0 & { }_{0} N_{1,3} & 0 & \cdot & \cdot & \cdot & { }_{0} N_{n, 3} \\ { }_{0} N_{1,2} & { }_{0} N_{1,1} & 0 & { }_{0} N_{2,2} & \cdot & \cdot & \cdot & 0 \\ { }_{0} N_{1,3} & 0 & { }_{0} N_{1,1} & { }_{0} N_{2,3} & \cdot & \cdot & \cdot & { }_{0} N_{n, 1} \\ 0 & { }_{0} N_{1,3} & { }_{0} N_{1,2} & 0 & \cdot & \cdot & \cdot & { }_{0} N_{n, 2} \end{array}\right)\end{split}\]

其中,

()\[{ }_{0} N_{k, j}=\frac{\partial N_{k}}{\partial^{0} x_{j}}, \; \Delta u_{i}^{k}={ }^{t+\Delta t} u_{i}^{k}- \ { }^{t} u_{i}^{k}\]

由初始位移效应引起的应变-位移矩阵 \({ }_{0}^{t}\left[B_{\mathrm{L}_{1}}\right]\) ,对应 \(\frac{1}{2} \left( { }_{0}^{t} u_{k,i} \ { }_{0} \Delta u_{k,j}+ { }_{0} \Delta u_{k,i} \ { }_{0}^{t} u_{k,j} \right)\) 线性应变增量部分:

()\[\begin{split}{ }_{0}^{t} \left[B_{L_{1}}\right]=\left(\begin{array}{ccccccccc} l_{11} \ { }_{0} N_{1,1} & l_{21} \ { }_{0} N_{1,1} & l_{31} \ { }_{0} N_{1,1} & l_{11} \ { }_{0} N_{2,1} & \cdot & \cdot & \cdot & \cdot & l_{31} \ { }_{0} N_{n,1} \\ l_{12} \ { }_{0} N_{1,2} & l_{22} \ { }_{0} N_{1,2} & l_{32} \ { }_{0} N_{1,2} & l_{12} \ { }_{0} N_{2,2} & \cdot & \cdot & \cdot & \cdot & l_{32} \ { }_{0} N_{n,2} \\ l_{13} \ { }_{0} N_{1,3} & l_{23} \ { }_{0} N_{1,3} & l_{33} \ { }_{0} N_{1,3} & l_{13} \ { }_{0} N_{2,3} & \cdot & \cdot & \cdot & \cdot & l_{33} \ { }_{0} N_{n,3} \\ a_{11}^{1} & a_{12}^{1} & a_{13}^{1} & a_{11}^{2} & \cdot & \cdot & \cdot & \cdot & a_{13}^{n} \\ a_{31}^{1} & a_{32}^{1} & a_{33}^{1} & a_{31}^{2} & \cdot & \cdot & \cdot & \cdot & a_{33}^{n} \\ a_{21}^{1} & a_{22}^{1} & a_{23}^{1} & a_{21}^{2} & \cdot & \cdot & \cdot & \cdot & a_{23}^{n} \end{array}\right)\end{split}\]

其中,

()\[l_{i j}=\sum_{k=1}^{n} { }_{0} N_{k, j} { }^{t} u_{i}^{k} = \frac{\partial \ { }^{t} u_i}{\partial {}^{0} x_{j}}\]
()\[a_{11}^{1}=\left(l_{11} \ { }_{0} N_{1, 2}+l_{12} \ { }_{0} N_{1, 1}\right) \quad a_{21}^{1}=\left(l_{12} \ { }_{0} N_{1, 3}+l_{13} \ { }_{0} N_{1, 2}\right) \quad a_{31}^{1}=\left(l_{11} \ { }_{0} N_{1, 3}+l_{13} \ { }_{0} N_{1, 1}\right)\]
()\[a_{12}^{1}=\left(l_{21} \ { }_{0} N_{1, 2}+l_{22} \ { }_{0} N_{1, 1}\right) \quad a_{22}^{1}=\left(l_{22} \ { }_{0} N_{1, 3}+l_{23} \ { }_{0} N_{1, 2}\right) \quad a_{32}^{1}=\left(l_{21} \ { }_{0} N_{1, 3}+l_{23} \ { }_{0} N_{1, 1}\right)\]
()\[a_{13}^{1}=\left(l_{31} \ { }_{0} N_{1, 2}+l_{32} \ { }_{0} N_{1, 1}\right) \quad a_{23}^{1}=\left(l_{32} \ { }_{0} N_{1, 3}+l_{33} \ { }_{0} N_{1, 2}\right) \quad a_{33}^{1}=\left(l_{31} \ { }_{0} N_{1, 2}+l_{33} \ { }_{0} N_{1, 1}\right)\]
()\[a_{11}^{2}=\left(l_{11} \ { }_{0} N_{2, 2}+l_{12} \ { }_{0} N_{2, 1}\right) \quad a_{21}^{2}=\left(l_{12} \ { }_{0} N_{2, 3}+l_{13} \ { }_{0} N_{2, 2}\right) \quad a_{31}^{2}=\left(l_{11} \ { }_{0} N_{2, 3}+l_{13} \ { }_{0} N_{2, 1}\right)\]
()\[a_{13}^{n}=\left(l_{31} \ { }_{0} N_{n, 2}+l_{32} \ { }_{0} N_{n, 1}\right) \quad a_{23}^{n}=\left(l_{32} \ { }_{0} N_{n, 3}+l_{33} \ { }_{0} N_{n, 2}\right) \quad a_{33}^{n}=\left(l_{31} \ { }_{0} N_{n, 2}+l_{33} \ { }_{0} N_{n, 1}\right)\]

整个线性应变一位移变换矩阵 \({ }_{0}^{t}\left[B_{\mathrm{L}}\right]={ }_{0}^{t}\left[B_{\mathrm{L}_{0}}\right]+{ }_{0}^{t}\left[B_{\mathrm{L}_{1}}\right]\) 整理为:

()\[\begin{split}{ }_{0}^{t} \left[B_{L}\right]=\left(\begin{array}{ccccccccc} { }_{0} N_{1,1} + l_{11} \ { }_{0} N_{1,1} & l_{21} \ { }_{0} N_{1,1} & l_{31} \ { }_{0} N_{1,1} & { }_{0} N_{2,1} + l_{11} \ { }_{0} N_{2,1} & \cdot & \cdot & \cdot & \cdot & l_{31} \ { }_{0} N_{n,1} \\ l_{12} \ { }_{0} N_{1,2} & { }_{0} N_{1,2} + l_{22} \ { }_{0} N_{1,2} & l_{32} \ { }_{0} N_{1,2} & l_{12} \ { }_{0} N_{2,2} & \cdot & \cdot & \cdot & \cdot & l_{32} \ { }_{0} N_{n,2} \\ l_{13} \ { }_{0} N_{1,3} & l_{23} \ { }_{0} N_{1,3} & { }_{0} N_{1,3} + l_{33} \ { }_{0} N_{1,3} & l_{13} \ { }_{0} N_{2,3} & \cdot & \cdot & \cdot & \cdot & { }_{0} N_{n,3} + l_{33} \ { }_{0} N_{n,3} \\ { }_{0} N_{1,2} + \left(l_{11} \ { }_{0} N_{1, 2}+l_{12} \ { }_{0} N_{1, 1}\right) & { }_{0} N_{1,1} + \left(l_{21} \ { }_{0} N_{1, 2}+l_{22} \ { }_{0} N_{1, 1}\right) & \left(l_{31} \ { }_{0} N_{1, 2}+l_{32} \ { }_{0} N_{1, 1}\right) &{ }_{0} N_{1,2} + \left(l_{11} \ { }_{0} N_{2, 2}+l_{12} \ { }_{0} N_{2, 1}\right) & \cdot & \cdot & \cdot & \cdot & \left(l_{31} \ { }_{0} N_{n, 2}+l_{32} \ { }_{0} N_{n, 1}\right) \\ { }_{0} N_{1,3} + \left(l_{11} \ { }_{0} N_{1, 3}+l_{13} \ { }_{0} N_{1, 1}\right) & \left(l_{21} \ { }_{0} N_{1, 3}+l_{23} \ { }_{0} N_{1, 1}\right) &{ }_{0} N_{1,1} + \left(l_{31} \ { }_{0} N_{1, 2}+l_{33} \ { }_{0} N_{1, 1}\right) &{ }_{0} N_{2,3} + \left(l_{11} \ { }_{0} N_{2, 3}+l_{13} \ { }_{0} N_{2, 1}\right) & \cdot & \cdot & \cdot & \cdot &{ }_{0} N_{n,1} + \left(l_{31} \ { }_{0} N_{n, 2}+l_{33} \ { }_{0} N_{n, 1}\right) \\ \left(l_{12} \ { }_{0} N_{1, 3}+l_{13} \ { }_{0} N_{1, 2}\right) &{ }_{0} N_{1,3} + \left(l_{22} \ { }_{0} N_{1, 3}+l_{23} \ { }_{0} N_{1, 2}\right) &{ }_{0} N_{1,2} + \left(l_{32} \ { }_{0} N_{1, 3}+l_{33} \ { }_{0} N_{1, 2}\right) & \left(l_{12} \ { }_{0} N_{2, 3}+l_{13} \ { }_{0} N_{2, 2}\right) & \cdot & \cdot & \cdot & \cdot &{ }_{0} N_{n,2} + \left(l_{32} \ { }_{0} N_{n, 3}+l_{33} \ { }_{0} N_{n, 2}\right) \end{array}\right)\end{split}\]

化简得到:

()\[\begin{split}{ }_{0}^{t} \left[B_{L}\right]=\left(\begin{array}{ccccccccc} F_{11} \ { }_{0} N_{1,1} & F_{21} \ { }_{0} N_{1,1} & F_{31} \ { }_{0} N_{1,1} & F_{11} \ { }_{0} N_{2,1} & \cdot & \cdot & \cdot & F_{31} \ { }_{0} N_{n,1} \\ F_{12} \ { }_{0} N_{1,2} & F_{22} \ { }_{0} N_{1,2} & F_{32} \ { }_{0} N_{1,2} & F_{12} \ { }_{0} N_{2,2} & \cdot & \cdot & \cdot & F_{32} \ { }_{0} N_{n,2} \\ F_{13} \ { }_{0} N_{1,3} & F_{23} \ { }_{0} N_{1,3} & F_{33} \ { }_{0} N_{1,3} & l_{13} \ { }_{0} N_{2,3} & \cdot & \cdot & \cdot & F_{33} \ { }_{0} N_{n,3} \\ F_{11} \ { }_{0} N_{1, 2}+F_{12} \ { }_{0} N_{1, 1} & F_{21} \ { }_{0} N_{1, 2}+F_{22} \ { }_{0} N_{1, 1} & F_{31} \ { }_{0} N_{1, 2}+F_{32} \ { }_{0} N_{1, 1} & F_{11} \ { }_{0} N_{2, 2}+F_{12} \ { }_{0} N_{2, 1} & \cdot & \cdot & \cdot & F_{31} \ { }_{0} N_{n, 2}+F_{32} \ { }_{0} N_{n, 1} \\ F_{11} \ { }_{0} N_{1, 3}+F_{13} \ { }_{0} N_{1, 1} & F_{21} \ { }_{0} N_{1, 3}+F_{23} \ { }_{0} N_{1, 1} & F_{31} \ { }_{0} N_{1, 2}+F_{33} \ { }_{0} N_{1, 1} & F_{11} \ { }_{0} N_{2, 3}+F_{13} \ { }_{0} N_{2, 1} & \cdot & \cdot & \cdot & F_{31} \ { }_{0} N_{n, 2}+F_{33} \ { }_{0} N_{n, 1} \\ F_{12} \ { }_{0} N_{1, 3}+F_{13} \ { }_{0} N_{1, 2} & F_{22} \ { }_{0} N_{1, 3}+F_{23} \ { }_{0} N_{1, 2} & F_{32} \ { }_{0} N_{1, 3}+F_{33} \ { }_{0} N_{1, 2} & F_{12} \ { }_{0} N_{2, 3}+F_{13} \ { }_{0} N_{2, 2} & \cdot & \cdot & \cdot & F_{32} \ { }_{0} N_{n, 3}+F_{33} \ { }_{0} N_{n, 2} \end{array}\right)\end{split}\]

这里, \({ }_{0}^t[S]\) 为第二Kirchhoff应力矩阵;

()\[\begin{split}{ }_{0}^{t}[S]=\left(\begin{array}{ccc} { }_{0}^{t}[\bar{S}] & {[\bar{O}]} & {[\bar{O}]} \\ {[\bar{O}]} & { }_{0}^{t}[\bar{S}] & {[\bar{O}]} \\ {[\bar{O}]} & {[\bar{O}]} & { }_{0}^{t} [\bar{S}] \end{array}\right), \quad[\bar{O}]=\left(\begin{array}{lll} 0 & 0 & 0 \\ 0 & 0 & 0 \\ 0 & 0 & 0 \end{array}\right)\end{split}\]

其中,

()\[\begin{split}{ }_{0}^{t}[\bar S]=\left(\begin{array}{ccc} { }_{0}^{t} S_{11} & { }_{0}^{t} S_{12} & { }_{0}^{t} S_{13} \\ { }_{0}^{t} S_{21} & { }_{0}^{t} S_{22} & { }_{0}^{t} S_{23} \\ { }_{0}^{t} S_{31} & { }_{0}^{t} S_{32} & { }_{0}^{t} S_{33} \end{array}\right)\end{split}\]

其中, \({ }_{0}^{t}\{F\} = \int_{{}^0 V}{ }_{0}^{t}\left[B_{\mathrm{L}}\right]^{\mathrm{T}} \ { }_{0}^{t}[\bar S] \ {}^{0} \mathrm{~d} V\)\(t\) 时刻的单元应力的等效结点力矢量。

其中, \({}^{t}\left\{\ddot{U}\right\}\)\(t\) 时刻的结点加速度矢量。

其中, \([M]=\int_{{}^0 V}[N]^{T}[N] \ {}^{0} \mathrm{~d} V\) 为与时间无关的质量矩阵。

其中, \({}^{t+\Delta t}\left\{\ddot{U}\right\}^{(i)}\)\(t+\Delta t\) 时刻对应于第 \(i\) 次迭代的结点加速度矢量。

3. 更新的 Lagrangian 格式有限元方程

(1)增量形式的 U.L. 方程:

()\[\int_{{}^t V} {{}_t} {C_{ijrs}}\Delta {e_{rs}}\delta \;\Delta {e_{ij}}^t\;{\text{d}}V + \int_{{}^t V} {{}^t} {\sigma_{ij}}\delta \;\Delta {\eta_{ij}}^t\;{\text{d}}V{ = {}^{t + \Delta t}}R - \int_{{}^t V} {{}^t} {\sigma _{ij}}\delta \;\Delta {e_{ij}}^t\;{\text{d}}V\]

(2)采用修正的牛顿迭代求解格式为:

()\[\int_{{}^t V} {{}_t} {{\text{C}}_{ijrs}}{{}_t}\Delta e_{rs}^{\left( k \right)}\delta {{}_t}\Delta {e_{ij}} {{}^t}\;{\text{d}}V + \int_{{}^t V} {{}^t} {\sigma _{ij}}\delta {{}_t}\Delta \eta_{ij}^{\left( k \right)} {{}^t}{\text{d}}V{ = {}^{t + \Delta t}}R - \int_{{}^t V} {{}^{t + \Delta t}} \sigma _{ij}^{\left( {k - 1} \right)}\delta {}_t^{t + \Delta t}\Delta e_{ij}^{\left( {k - 1} \right)}{{}^{t + \Delta t}}\;{\text{d}}V\]

其中

()\[{}^{t + \Delta t}R = \int_{{}_0V} {{}_0^{t + \Delta t}} {f_i}\delta {u_i}{{}^0}\;{\text{d}}V + \int_{{}_0 S} {{}_0^{t + \Delta t}} {t_i}\delta {u_i}{{}^0}\;{\text{d}}S\]

(3)U.L. 方程的增量应变记为:

()\[{}_t\Delta {\varepsilon_{ij}} = \frac{1}{2}\left( {{}_t\Delta {u_{i,j}}+ \ {}_t \Delta {u_{j,i}}} \right) + + \frac{1}{2}{\;_t}\Delta {u_{k,i}}{\;_t}\Delta {u_{k,j}}\;\;\;(i = 1,2,3,j = 1,2,3,k = 1,2,3)\]

(4)相应的计算矩阵有限元离散格式:

静力分析:

()\[\left( {{}_t^t\left[ {{K_L}} \right] + {}_t^t\left[ {{K_{NL}}} \right]} \right)\Delta {\{ U\}^{(i)}} = {}^{t + \Delta t}\{ R\} - {}_t^{t + \Delta t}{\{ F\} ^{(i - 1)}}\]

动力分析隐式积分:

()\[[M]{{}^{t + \Delta t}}{\left\{ {\ddot U} \right\}^{(i)}} + \left( {{}_t^t\left[ {{K_L}} \right] + {}_t^t\left[ {{K_{NL}}} \right]} \right)\Delta {\{ U\}^{(i)}}{ = {}^{t + \Delta t}}\{ R\} - {}_t^{t + \Delta t}{\{ F\} ^{(i - 1)}}\]

动力分析显式积分:

()\[[M]{{}^t}\{ \ddot U\} { = {}^t}\{ R\} - {}_t^t\{ F\}\]

其中, \({ }_{t}^{t}\left[K_{L}\right]=\int_{{}^t V}{ }_{t}^{t}\left[B_{\mathrm{L}}\right]^{\mathrm{T}} \ { }_{t}[C] \ {}_{t}^{t}\left[B_{\mathrm{L}}\right] \ {}^{t} \mathrm{~d} V\) 为线性应变增量刚度矩阵; \({ }_{t}[\mathrm{C}]\) 为增量应力一应变材料特性矩阵; \({ }_{t}^{t}\left[B_{\mathrm{L}}\right]\) 为线性应变一位移变换矩阵。

线性应变一位移变换矩阵,使用:

()\[{ }_{t}\{e\}={ }_{t}^{t}\left[B_{L}\right]\{\bar{u}\}\]

其中

()\[{ }_{t}\{e\}^{T}=\left[\begin{array}{llllll} { }_{t} e_{11} & { }_{t} e_{22} & { }_{t} e_{33} & 2 \ { }_{t} e_{12} & 2 \ { }_{t} e_{13} & 2 \ { }_{t} e_{23} \end{array}\right]\]
()\[\{\bar{u}\}^{T}=\left[\begin{array}{llllllllll} u_{1}^{1} & u_{2}^{1} & u_{3}^{1} & u_{1}^{2} & u_{2}^{2} & u_{3}^{2} & \cdot \cdot \cdot & u_{1}^{n} & u_{2}^{n} & u_{3}^{n} \end{array}\right]\]

对于 U.L. 方程, \({ }_{t}^{t}\left[B_{\mathrm{L}}\right]\) 与一般的线性应变-位移矩阵相同,对应 \(\frac{1}{2}\left({ }_{t} \Delta u_{i,j} + { }_{t} \Delta u_{j,i} \right)\) 线性应变增量部分

()\[\begin{split}{ }_{t}^{t} \left[B_{L}\right]=\left(\begin{array}{cccccccc} { }_{t} N_{1,1} & 0 & 0 & { }_{t} N_{2,1} & \cdot & \cdot & \cdot & 0 \\ 0 & { }_{t} N_{1,2} & 0 & 0 & \cdot & \cdot & \cdot & 0 \\ 0 & 0 & { }_{t} N_{1,3} & 0 & \cdot & \cdot & \cdot & { }_{t} N_{n, 3} \\ { }_{t} N_{1,2} & { }_{t} N_{1,1} & 0 & { }_{t} N_{2,2} & \cdot & \cdot & \cdot & 0 \\ { }_{t} N_{1,3} & 0 & { }_{t} N_{1,1} & { }_{t} N_{2,3} & \cdot & \cdot & \cdot & { }_{t} N_{n, 1} \\ 0 & { }_{t} N_{1,3} & { }_{t} N_{1,2} & 0 & \cdot & \cdot & \cdot & { }_{t} N_{n, 2} \end{array}\right)\end{split}\]

其中,

()\[{ }_{t} N_{k, j}=\frac{\partial N_{k}}{\partial^{t} x_{j}}, \; \Delta u_{i}^{k}= \ { }^{t+\Delta t} u_{i}^{k}- \ { }^{t} u_{i}^{k}\]

这里,Cauchy 应力矩阵 \({ }^t[\sigma]\) 表示为:

()\[\begin{split}{ }^{t}[\sigma]=\left(\begin{array}{ccc} { }^{t}[\bar{\sigma}] & {[\bar{O}]} & {[\bar{O}]} \\ {[\bar{O}]} & { }^{t}[\bar{\sigma}] & {[\bar{O}]} \\ {[\bar{O}]} & {[\bar{O}]} & { }^{t} [\bar{\sigma}] \end{array}\right), \quad[\bar{O}]=\left(\begin{array}{lll} 0 & 0 & 0 \\ 0 & 0 & 0 \\ 0 & 0 & 0 \end{array}\right)\end{split}\]

其中,

()\[\begin{split}{ }^{t}[\bar \sigma]=\left(\begin{array}{ccc} { }^{t} \sigma_{11} & { }^{t} \sigma_{12} & { }^{t} \sigma_{13} \\ { }^{t} \sigma_{21} & { }^{t} \sigma_{22} & { }^{t} \sigma_{23} \\ { }^{t} \sigma_{31} & { }^{t} \sigma_{32} & { }^{t} \sigma_{33} \end{array}\right)\end{split}\]

其中, \({ }_{t}^{t}\{F\} = \int_{{}^t V}{ }_{t}^{t}\left[B_{\mathrm{L}}\right]^{\mathrm{T}} \ { }^t [\sigma] \ {}^{t} \mathrm{~d} V\)\(t\) 时刻的单元应力的等效结点力矢量。

其中, \({}^{t}\left\{\ddot{U}\right\}\)\(t\) 时刻的结点加速度矢量。

其中, \([M]=\int_{{}^0 V}[N]^{T}[N] \ {}^{0} \mathrm{~d} V\) 为与时间无关的质量矩阵。

其中, \({}^{t+\Delta t}\left\{\ddot{U}\right\}^{(i)}\)\(t+\Delta t\) 时刻对应于第 \(i\) 次迭代的结点加速度矢量。

注意:本程序中使用的应力矢量Vogit记法为:

()\[{ }_{0}^{t} \{ \bar \sigma \}= [{ }_{0}^{t} \sigma_{11} \ { }_{0}^{t} \sigma_{22} \ { }_{0}^{t} \sigma_{33} \ { }_{0}^{t} \sigma_{12} \ { }_{0}^{t} \sigma_{13} \ { }_{0}^{t} \sigma_{23}]^{T}\]

因此,对于三维问题,上述推导中的线性应变矩阵与非线性应变矩阵的最后两行已经进行了交换,得到本程序计算出的结果。

参考文献:

[1] 连续体和结构的非线性有限元_Ted Belytschko等著 庄茁译_2002 [2] 非线性有限元分析-张汝清-1990 [3] Non-linear finite element analysis of solids and structures. 2012.

create_qp_bnl_matrices() None[源代码]

获得 Lagrangian 网格的非线性应变-位移矩阵

单元使用的节点坐标和位移插值是:

()\[{}^0{x_i} = \sum\limits_{k = 1}^n {{N_k}} {\;^0}x_i^k,\; {{}^t}{x_i} = \sum\limits_{k = 1}^n {{N_k}} {\;^t}x_i^k \;\;(i = 1,2,3)\]
()\[{}^t{u_i} = \sum\limits_{k = 1}^n {{N_k}} {\;^t}u_i^k,\; \Delta {u_i} = \sum\limits_{k = 1}^n {{N_k}} \;\Delta u_i^k \;\;(i = 1,2,3)\]

这里, \(N_{k}\) 是单元插值函数, \(k\) 是节点个数。现推导 T. L. 和 U. L. 公式中有关单元的矩阵。

1. 完全的Lagrangian格式有限元方程

说明:方程变量分量形式的左下标代表构形,左上标代表时刻,右上标代表哑标,右下标是变量分量指标。 如 \({}_t^{t + \Delta t}\Delta e_{ij}^{\left( {k - 1} \right)}\) 代表 \(t\) 时刻(当前)构形下 \(t + \Delta t\) 时刻 \(\Delta e_{ij}\) 变量的第:math:k-1 个分量。

(1)增量形式的 T.L. 方程:

()\[\int_{{}^0 V} { }_{0} \mathrm{C}_{i j r s} \ { }_{0} \Delta e_{r s} \delta \ { }_{0} \Delta e_{i j} {}^{0} \mathrm{~d} V + \int_{{}^0 V} { }_{0}^{t} S_{i j} \delta \Delta \ { }_{0} \eta_{i j} { }^{0} \mathrm{~d} V ={ }^{t+\Delta t} R - \int_{{}^0 V} { }_{0}^{t} S_{i j} \delta \ { }_{0} \Delta e_{i j} { }^{0} \mathrm{~d} V\]

(2)采用修正的牛顿迭代求解格式为:

()\[\int_{{}^0 V} { }_{0} \mathrm{C}_{i j r s} \ {}_{0}\Delta e_{r s}^\left(k \right) \delta \ {}_{0}\Delta e_{i j} \ {}^{0} \! \mathrm{~d} V + \int_{{}^0 V} { }_{0}^{t} S_{i j} \delta \ {}_{0} \Delta \eta_{i j}^\left(k \right) \ { }^{0} \! \mathrm{~d} V ={ }^{t+\Delta t} R - \int_{{}^0 V} { }_{0}^{t+\Delta t} S_{i j}^\left(k-1 \right) \delta \ {}_{0}^{t+\Delta t} \Delta e_{i j}^\left(k-1 \right) \ { }^{0} \! \mathrm{~d} V\]

其中

()\[{}^{t + \Delta t}R = \int_{{}_0V} {{}_0^{t + \Delta t}} {f_i}\delta {u_i}{\;^0}\;{\text{d}}V + \int_{{}_0S} {{}_0^{t + \Delta t}} {t_i}\delta {u_i}{\;^0}\;{\text{d}}S\]

(3)T.L. 方程的增量应变记为:

()\[{ }_{0} \Delta \varepsilon_{i j} = \frac{1}{2}\left({ }_{0} \Delta u_{i,j} + \ { }_{0} \Delta u_{j,i} \right) + \frac{1}{2} \left( { }_{0}^{t} u_{k,i} \ { }_{0} \Delta u_{k,j}+ \ { }_{0} \Delta u_{k,i} \ { }_{0}^{t} u_{k,j} \right) + \frac{1}{2} \left( { }_{0} \Delta u_{k,i} \ { }_{0} \Delta u_{k,j}\right) \;\; (i = 1,2,3,j = 1,2,3,k = 1,2,3)\]

(4)相应的计算矩阵有限元离散格式:

静力分析:

()\[\left({}_{0}^{t}\left[K_{L}\right]+{ }_{0}^{t}\left[K_{N L}\right] \right) \Delta\{U\}^{(i)} = {}^{t+\Delta t}\{R\} - { }_0^{t+\Delta t}\{F\}^{(i-1)}\]

动力分析隐式积分:

()\[[M] \ {}^{t+\Delta t}\left\{\ddot{U}\right\}^{(i)} + \left({}_{0}^{t}\left[K_{L}\right]+{ }_{0}^{t}\left[K_{N L}\right]\right) \Delta\{U\}^{(i)} = {}^{t+\Delta t}\{R\} - \ { }^{t+\Delta t}\{F\}^{(i-1)}\]

动力分析显式积分:

()\[[M] \ {}^{t}\{\ddot U\} = {}^{t}\{R\} - \ {}_0^{t}\{F\}\]

其中, \({ }_{0}^{t}\left[K_{NL}\right]=\int_{{}^0 V}{ }_{0}^{t}\left[B_{\mathrm{NL}}\right]^{\mathrm{T}} \ { }_{0}^t[S] \ {}_{0}^{t}\left[B_{\mathrm{NL}}\right] \ {}^{0} \mathrm{~d} V\) 为非线性应变(几何或初始应力) 增量刚度矩阵; \({ }_{0}^{t} \left[B_{\mathrm{N} L}\right]\) 为非线性应变一位移变换矩阵。

()\[\begin{split}{ }_{0}^{t}\left[B_{N L}\right]=\left(\begin{array}{ccc} { }_{0}^{t}\left[\bar{B}_{N L}\right] & {[\bar{O}]} & {[\bar{O}]} \\ {[\bar{O}]} & { }_{0}^{t}\left[\bar{B}_{N L}\right] & {[\bar{O}]} \\ {[\bar{O}]} & {[\bar{O}]} & { }_{0}^{t} \left[\bar{B}_{N L}\right] \end{array}\right), \quad[\bar {O}]=\left(\begin{array}{c} 0 \\ 0 \\ 0 \end{array}\right)\end{split}\]

其中,

()\[\begin{split}{ }_{0}^{t}\left[\bar{B}_{N L}\right]=\left(\begin{array}{cccccccc} { }_{0} N_{1,1} & 0 & 0 & { }_{0} N_{2,1} & \cdot & \cdot & \cdot & { }_{0} N_{n, 1} \\ { }_{0} N_{1,2} & 0 & 0 & { }_{0} N_{2,2} & \cdot & \cdot & \cdot & { }_{0} N_{n, 2} \\ { }_{0} N_{1,3} & 0 & 0 & { }_{0} N_{2,3} & \cdot & \cdot & \cdot & { }_{0} N_{n, 3} \end{array}\right)\end{split}\]

这里, \({ }_{0}^t[S]\) 为第二Kirchhoff应力矩阵;

()\[\begin{split}{ }_{0}^{t}[S]=\left(\begin{array}{ccc} { }_{0}^{t}[\bar{S}] & {[\bar{O}]} & {[\bar{O}]} \\ {[\bar{O}]} & { }_{0}^{t}[\bar{S}] & {[\bar{O}]} \\ {[\bar{O}]} & {[\bar{O}]} & { }_{0}^{t} [\bar{S}] \end{array}\right), \quad[\bar{O}]=\left(\begin{array}{lll} 0 & 0 & 0 \\ 0 & 0 & 0 \\ 0 & 0 & 0 \end{array}\right)\end{split}\]

其中,

()\[\begin{split}{ }_{0}^{t}[\bar S]=\left(\begin{array}{ccc} { }_{0}^{t} S_{11} & { }_{0}^{t} S_{12} & { }_{0}^{t} S_{13} \\ { }_{0}^{t} S_{21} & { }_{0}^{t} S_{22} & { }_{0}^{t} S_{23} \\ { }_{0}^{t} S_{31} & { }_{0}^{t} S_{32} & { }_{0}^{t} S_{33} \end{array}\right)\end{split}\]

其中, \({ }_{0}^{t}\{F\} = \int_{{}^0 V}{ }_{0}^{t}\left[B_{\mathrm{L}}\right]^{\mathrm{T}} \ { }_{0}^{t}[\bar S] \ {}^{0} \mathrm{~d} V\)\(t\) 时刻的单元应力的等效结点力矢量。

其中, \({}^{t}\left\{\ddot{U}\right\}\)\(t\) 时刻的结点加速度矢量。

其中, \([M]=\int_{{}^0 V}[N]^{T}[N] \ {}^{0} \mathrm{~d} V\) 为与时间无关的质量矩阵。

其中, \({}^{t+\Delta t}\left\{\ddot{U}\right\}^{(i)}\)\(t+\Delta t\) 时刻对应于第 \(i\) 次迭代的结点加速度矢量。

2. 更新的 Lagrangian 格式有限元方程

(1)增量形式的 U.L. 方程:

()\[\int_{{}^t V} {{}_t} {C_{ijrs}}\Delta {e_{rs}}\delta \;\Delta {e_{ij}}^t\;{\text{d}}V + \int_{{}^t V} {{}^t} {\sigma_{ij}}\delta \;\Delta {\eta_{ij}}^t\;{\text{d}}V{ = {}^{t + \Delta t}}R - \int_{{}^t V} {{}^t} {\sigma _{ij}}\delta \;\Delta {e_{ij}}^t\;{\text{d}}V\]

(2)采用修正的牛顿迭代求解格式为:

()\[\int_{{}^t V} {{}_t} {{\text{C}}_{ijrs}}{{}_t}\Delta e_{rs}^{\left( k \right)}\delta {{}_t}\Delta {e_{ij}} {{}^t}\;{\text{d}}V + \int_{{}^t V} {{}^t} {\sigma _{ij}}\delta {{}_t}\Delta \eta_{ij}^{\left( k \right)} {{}^t}{\text{d}}V{ = {}^{t + \Delta t}}R - \int_{{}^t V} {{}^{t + \Delta t}} \sigma _{ij}^{\left( {k - 1} \right)}\delta {}_t^{t + \Delta t}\Delta e_{ij}^{\left( {k - 1} \right)}{{}^{t + \Delta t}}\;{\text{d}}V\]

其中

()\[{}^{t + \Delta t}R = \int_{{}_0V} {{}_0^{t + \Delta t}} {f_i}\delta {u_i}{{}^0}\;{\text{d}}V + \int_{{}_0 S} {{}_0^{t + \Delta t}} {t_i}\delta {u_i}{{}^0}\;{\text{d}}S\]

(3)U.L. 方程的增量应变记为:

()\[{}_t\Delta {\varepsilon_{ij}} = \frac{1}{2}\left( {{}_t\Delta {u_{i,j}}+ \ {}_t \Delta {u_{j,i}}} \right) + + \frac{1}{2}{\;_t}\Delta {u_{k,i}}{\;_t}\Delta {u_{k,j}}\;\;\;(i = 1,2,3,j = 1,2,3,k = 1,2,3)\]

(4)相应的计算矩阵有限元离散格式:

静力分析:

()\[\left( {{}_t^t\left[ {{K_L}} \right] + {}_t^t\left[ {{K_{NL}}} \right]} \right)\Delta {\{ U\}^{(i)}} = {}^{t + \Delta t}\{ R\} - {}_t^{t + \Delta t}{\{ F\} ^{(i - 1)}}\]

动力分析隐式积分:

()\[[M]{{}^{t + \Delta t}}{\left\{ {\ddot U} \right\}^{(i)}} + \left( {{}_t^t\left[ {{K_L}} \right] + {}_t^t\left[ {{K_{NL}}} \right]} \right)\Delta {\{ U\}^{(i)}}{ = {}^{t + \Delta t}}\{ R\} - {}_t^{t + \Delta t}{\{ F\} ^{(i - 1)}}\]

动力分析显式积分:

()\[[M]{{}^t}\{ \ddot U\} { = {}^t}\{ R\} - {}_t^t\{ F\}\]

其中, \({ }_{t}^{t}\left[K_{NL}\right]=\int_{{}^t V}{ }_{t}^{t}\left[B_{\mathrm{NL}}\right]^{\mathrm{T}} \ { }^t[\sigma] \ {}_{t}^{t}\left[B_{\mathrm{NL}}\right] \ {}^{t} \mathrm{~d} V\) 为非线性应变(几何或初始应力) 增量刚度矩阵; \({ }^t[\sigma]\) 为 Cauchy 应力矩阵; \({ }_{t}^{t} \left[B_{\mathrm{N} L}\right]\) 为非线性应变一位移变换矩阵。

()\[\begin{split}{ }_{t}^{t}\left[B_{N L}\right]=\left(\begin{array}{ccc} { }_{t}^{t}\left[\bar{B}_{N L}\right] & {[\bar{O}]} & {[\bar{O}]} \\ {[\bar{O}]} & { }_{t}^{t}\left[\bar{B}_{N L}\right] & {[\bar{O}]} \\ {[\bar{O}]} & {[\bar{O}]} & { }_{t}^{t} \left[\bar{B}_{N L}\right] \end{array}\right), \quad[\bar {O}]=\left(\begin{array}{c} 0 \\ 0 \\ 0 \end{array}\right)\end{split}\]

其中,

()\[\begin{split}{ }_{t}^{t}\left[\bar{B}_{N L}\right]=\left(\begin{array}{cccccccc} { }_{t} N_{1,1} & 0 & 0 & { }_{t} N_{2,1} & \cdot & \cdot & \cdot & { }_{t} N_{n, 1} \\ { }_{t} N_{1,2} & 0 & 0 & { }_{t} N_{2,2} & \cdot & \cdot & \cdot & { }_{t} N_{n, 2} \\ { }_{t} N_{1,3} & 0 & 0 & { }_{t} N_{2,3} & \cdot & \cdot & \cdot & { }_{t} N_{n, 3} \end{array}\right)\end{split}\]

这里,Cauchy 应力矩阵 \({ }^t[\sigma]\) 表示为:

()\[\begin{split}{ }^{t}[\sigma]=\left(\begin{array}{ccc} { }^{t}[\bar{\sigma}] & {[\bar{O}]} & {[\bar{O}]} \\ {[\bar{O}]} & { }^{t}[\bar{\sigma}] & {[\bar{O}]} \\ {[\bar{O}]} & {[\bar{O}]} & { }^{t} [\bar{\sigma}] \end{array}\right), \quad[\bar{O}]=\left(\begin{array}{lll} 0 & 0 & 0 \\ 0 & 0 & 0 \\ 0 & 0 & 0 \end{array}\right)\end{split}\]

其中,

()\[\begin{split}{ }^{t}[\bar \sigma]=\left(\begin{array}{ccc} { }^{t} \sigma_{11} & { }^{t} \sigma_{12} & { }^{t} \sigma_{13} \\ { }^{t} \sigma_{21} & { }^{t} \sigma_{22} & { }^{t} \sigma_{23} \\ { }^{t} \sigma_{31} & { }^{t} \sigma_{32} & { }^{t} \sigma_{33} \end{array}\right)\end{split}\]

其中, \({ }_{t}^{t}\{F\} = \int_{{}^t V}{ }_{t}^{t}\left[B_{\mathrm{L}}\right]^{\mathrm{T}} \ { }^t [\sigma] \ {}^{t} \mathrm{~d} V\)\(t\) 时刻的单元应力的等效结点力矢量。

其中, \({}^{t}\left\{\ddot{U}\right\}\)\(t\) 时刻的结点加速度矢量。

其中, \([M]=\int_{{}^0 V}[N]^{T}[N] \ {}^{0} \mathrm{~d} V\) 为与时间无关的质量矩阵。

其中, \({}^{t+\Delta t}\left\{\ddot{U}\right\}^{(i)}\)\(t+\Delta t\) 时刻对应于第 \(i\) 次迭代的结点加速度矢量。

注意:上述推导中,使用的应力矢量Vogit记法为:

()\[{ }_{0}^{t} \{ \bar S \}= [{ }_{0}^{t} S_{11} \ { }_{0}^{t} S_{22} \ { }_{0}^{t} S_{33} \ { }_{0}^{t} S_{12} \ { }_{0}^{t} S_{13} \ { }_{0}^{t} S_{23}]^{T}\]

因此,对于三维问题,上述推导中的线性应变矩阵与非线性应变矩阵已经做过对应交换,才是本程序计算出的结果。

参考文献:

[1] 连续体和结构的非线性有限元_Ted Belytschko等著 庄茁译_2002

[2] 非线性有限元分析-张汝清-1990

[3] Non-linear finite element analysis of solids and structures. 2012.

dimension: int
dof: Dof
dof_names: list[str]
element_average_field_variables: dict[str, ndarray]
element_ddof_values: ndarray
element_dof_ids: list[int]
element_dof_number: int
element_dof_values: ndarray
element_fint: ndarray
element_ftime: ndarray
element_id: int
element_stiffness: ndarray
iso_element_shape: IsoElementShape
material_data_list: list[BaseMaterial | MechanicalThermalExpansion | PhaseFieldDamage | PlasticKinematicHardening | ThermalIsotropic | ViscoElasticMaxwell | ElasticIsotropic | DiffusionIsotropic]
materials: list[Material]
method: str
ndi
node_coords: ndarray
nshr
ntens
qp_b_matrices: ndarray
qp_b_matrices_transpose: ndarray
qp_bnl_matrices: ndarray
qp_bnl_matrices_transpose: ndarray
qp_ddsddes: list[ndarray]
qp_deformation_gradients_0: ndarray
qp_deformation_gradients_1: ndarray
qp_dhdxes: ndarray
qp_dstrains: list[ndarray]
qp_field_variables: dict[str, ndarray]
qp_green_lagrange_strains_0: list[ndarray]
qp_green_lagrange_strains_1: list[ndarray]
qp_jacobi_dets: ndarray
qp_jacobi_dets_t: ndarray
qp_jacobi_invs: ndarray
qp_jacobi_invs_t: ndarray
qp_jacobis: ndarray
qp_jacobis_t: ndarray
qp_number: int
qp_state_variables: list[dict[str, ndarray]]
qp_state_variables_new: list[dict[str, ndarray]]
qp_strains: list[ndarray]
qp_stresses: list[ndarray]
qp_weight_times_jacobi_dets: ndarray
qp_weight_times_jacobi_dets_t: ndarray
section: Section
timer: Timer
topological_dimension: int
update_element_field_variables() None[源代码]
update_element_material_stiffness_fint(is_update_material: bool = True, is_update_stiffness: bool = True, is_update_fint: bool = True) None[源代码]
update_kinematics() None[源代码]

更新动力学参数

载荷步的初始时刻( \(X^t\) )构形对应的单元所有积分点处的历史变形梯度矩阵 qp_deformation_gradients_0 ,历史Green-Lagrange应变矩阵 qp_green_lagrange_strains_0

当前增量时刻( \(X^{t + \Delta t}\) )构形对应的单元所有积分点处的当前变形梯度矩阵 qp_deformation_gradients_1 ,当前Green-Lagrange应变矩阵 qp_green_lagrange_strains_1

单元内任意一点在 \(X^0\) 构形和 \(X^t\) 构形对应的坐标、位移和位移增量可通过形函数、节点坐标和节点位移表示为:

()\[\begin{split}\begin{gathered} ^0{x_i} = \sum\limits_{k = 1}^n {{N_k}} {\;^0}x_i^k,{\text{ }}i = 1,2,3 \hfill \\ ^t{x_i} = \sum\limits_{k = 1}^n {{N_k}} {\;^t}x_i^k,{\text{ }}i = 1,2,3 \hfill \\ ^t{u_i} = \sum\limits_{k = 1}^n {{N_k}} {\;^t}u_i^k,{\text{ }}i = 1,2,3 \hfill \\ \Delta {u_i} = \sum\limits_{k = 1}^n {{N_k}} \;\Delta u_i^k,{\text{ }}i = 1,2,3 \hfill \\ \end{gathered}\end{split}\]

其中, \(n\) 为单元节点总数。

1. 变形梯度张量计算

变形梯度的矩阵形式记为:

()\[\begin{split}\left[ F \right] = \left[ {\begin{array}{*{20}{c}} {{F_{11}}}&{{F_{12}}}&{{F_{13}}} \\ {{F_{21}}}&{{F_{22}}}&{{F_{23}}} \\ {{F_{31}}}&{{F_{32}}}&{{F_{33}}} \end{array}} \right]\end{split}\]

已知,使用位移向量 \(\mathbf{u}\) 表示的 \(X^t\) 时刻构形的变形梯度为:

()\[{\mathbf{F}} = \frac{{\partial {\;^t}{\mathbf{x}}}}{{\partial {\mathbf{X}}}} = {\mathbf{I}} + \frac{{\partial {\;^t}{\mathbf{u}}}}{{\partial {\mathbf{X}}}}\]

其中, \(\mathbf{X}\) 是变形构型中材料点空间坐标的向量。 \({}^t \mathbf{x}=\mathbf{\mathbf{X}}+{}^t \mathbf{u}\) 。以分量形式表示记为:

()\[{F_{ij}} = \frac{{\partial \left( {{X_i}{ + ^t}{u_i}} \right)}}{{\partial {X_j}}} = {\delta _{ij}} + \frac{{\partial {\;^t}{u_i}}}{{\partial {X_j}}} = {\delta _{ij}} + {\;^t}{l_{ij}}\]

其中, \(^t{l_{ij}}\) 是位移梯度张量,

()\[^t{l_{ij}} = \frac{{\partial {\;^t}{u_i}}}{{\partial {X_j}}} = \sum\limits_{k = 1}^n {{}_0{N_{k,j}}{\;}^tu_i^k}\]

整理后发现

()\[\left( {{\delta _{11}} + {l_{11}}} \right) = {F_{11}},\left( {{\delta _{21}} + {l_{21}}} \right) = 0 + {l_{21}} = {F_{21}}{\text{,}}\left( {{\delta _{31}} + {l_{31}}} \right) = 0 + {l_{31}} = {F_{31}} \cdots\]

使用位移向量 \(\mathbf{u}\) 表示当前时刻即, \(X^{{t{\text{ + }}\Delta t}}\) 时刻构形变形梯度为:

()\[{\mathbf{F}} = \frac{{\partial {\;^{t{\text{ + }}\Delta t}}{\mathbf{x}}}}{{\partial {\mathbf{X}}}} = {\mathbf{I}} + \frac{{\partial {\;^{t{\text{ + }}\Delta t}}{\mathbf{u}}}}{{\partial {\mathbf{X}}}}\]

以分量形式表示记为:

()\[{F_{ij}} = \frac{{\partial \left( {{X_i}{ + ^{t{\text{ + }}\Delta t}}{u_i}} \right)}}{{\partial {X_j}}} = {\delta _{ij}} + \frac{{\partial {\;^{t{\text{ + }}\Delta t}}{u_i}}}{{\partial {X_j}}} = {\delta _{ij}}{ + ^{t{\text{ + }}\Delta t}}{l_{ij}}\]

其中, \(X^{t + \Delta t}\) 时刻的位移梯度张量 \({}^{t + \Delta t}{l_{ij}}\) 表示为:

()\[^{t + \Delta t}{l_{ij}} = \frac{{\partial {\;^{t + \Delta t}}{u_i}}}{{\partial {X_j}}} = \sum\limits_{k = 1}^n {{}_0{N_{k,j}}{\;}^{t + \Delta t}u_i^k}\]
2. Green–Lagrange应变张量计算

使用变形梯度张量 \(\mathbf{F}\) 表示的 Green–Lagrange 应变张量 \(\mathbf{E}\) 为:

()\[{\mathbf{E}} = \frac{{{{\mathbf{F}}^{\text{T}}} \cdot {\mathbf{F}} - {\mathbf{I}}}}{2}\]

此处,只需使用对应的历史变形梯度矩阵qp_deformation_gradients_0和当前变形梯度矩阵qp_deformation_gradients_t即可计算得到对应的 历史Green-Lagrange应变矩阵 qp_green_lagrange_strains_0和当前Green-Lagrange应变矩阵 qp_green_lagrange_strains_t。

3. 工程 Green–Lagrange 应变张量和应变增量的 Vogit 记法

历史时刻,即 \(X^t\) 时刻构形对应的单元工程 Green-Lagrange 应变矩阵的Vogit向量表示记为 qp_strains 矩阵:

(1)二维

()\[_0{\{ E\} ^T} = \left[ {\begin{array}{*{20}{c}} {{}_0{E_{11}}}&{{}_0{E_{22}}}&{{2{}_0}{E_{12}}} \end{array}} \right]\]

对应的第二基尔霍夫(Kirchhoff)应力向量表示记为:

()\[{{}_0^t} {\{ \bar S\} ^T} = \left[ {\begin{array}{*{20}{c}} {{}_0^t{S_{11}}}&{{}_0^t{S_{22}}}&{{}_0^t{S_{12}}} \end{array}} \right]\]

(2)三维

()\[_0{\{ E\} ^T} = \left[ {\begin{array}{*{20}{l}} {{}_0{E_{11}}}&{{}_0{E_{22}}}&{{}_0{E_{33}}}&{{2{}_0}{E_{12}}}&{{2{}_0}{E_{13}}}&{{2{}_0}{E_{23}}} \end{array}} \right]\]

对应的第二基尔霍夫(Kirchhoff)应力向量表示记为:

()\[{}_0^t{\{ \bar S\} ^T} = \left[ {\begin{array}{*{20}{l}} {{}_0^t{S_{11}}}&{{}_0^t{S_{22}}}&{{}_0^t{S_{33}}}&{{}_0^t{S_{12}}}&{{}_0^t{S_{13}}}&{{}_0^t{S_{23}}} \end{array}} \right]\]

然后使用历史Green-Lagrange应变矩阵 qp_green_lagrange_strains_0和当前Green-Lagrange应变矩阵 qp_green_lagrange_strains_t即可 得到 \(X^t\) 时刻构形对应的单元工程 Green–Lagrange 应变增量 qp_dstrains 的Vogit记法。

()\[{\Delta {}_0}\{ E\} { = {}^{t+\Delta t}}\left( {{}_0\{ E\} } \right) - \; {}^t \left( {{}_0\{ E\} } \right)\]

若采用有限变形情况下的 U.L. 公式,则需要将参考构形下定义的第二基尔霍夫(Kirchhoff)应力张量和Green-Lagrange应变张量转换为 当前构形下定义的 Cauchy 应力张量和 Almansi 应变张量, \(X^t\) 时刻构形对应的单元应变矩阵的Vogit向量表示记为:

(1)二维

()\[{}_t{\{ e\} ^T} = \left[ {\begin{array}{*{20}{c}} {{}_t{e_{11}}}&{{}_t{e_{22}}}&{{2{}_t}{e_{12}}} \end{array}} \right]\]

对应的Cauchy 应力向量表示记为:

()\[{}^t{\{ \bar \sigma \} ^T} = \left[ {\begin{array}{*{20}{c}} {{}^t{\sigma_{11}}}&{{}^t{\sigma_{22}}}&{{}^t{\sigma_{12}}} \end{array}} \right]\]

(2)三维

()\[{}_t{\{ e\} ^T} = \left[ {\begin{array}{*{20}{l}} {{}_t{e_{11}}}&{{}_t{e_{22}}}&{{}_t{e_{33}}}&{{2{}_t}{e_{12}}}&{{2{}_t}{e_{13}}}&{{2{}_t}{e_{23}}} \end{array}} \right]\]

对应的 Cauchy 应力向量表示记为:

()\[ \begin{align}\begin{aligned}{}^t{\{ \bar \sigma \} ^T} = {[{}^t}{\sigma_{11}}{\;^t}{\sigma_{22}}{\;^t}{\sigma_{33}}{\;^t}{\sigma_{12}}{\;^t}{\sigma_{23}}{\;^t}{\sigma_{13}}]\\:math:`X^t` 时刻构形对应的单元应变增量 qp_dstrains 的 Vogit 记法:\end{aligned}\end{align} \]
()\[{\Delta {}_t}\{ e\} { = {}^{t+\Delta t}}\left( {{}_t\{ e\} } \right) - \; {}^t \left( {{}_t\{ e\} } \right)\]
voigt_to_block_diagonal_matrix(stress)[源代码]
pyfem.elements.SolidPhaseDamageSmallStrain module
class pyfem.elements.SolidPhaseDamageSmallStrain.SolidPhaseDamageSmallStrain(element_id: int, iso_element_shape: IsoElementShape, connectivity: ndarray, node_coords: ndarray, dof: Dof, materials: list[Material], section: Section, material_data_list: list[BaseMaterial | MechanicalThermalExpansion | PhaseFieldDamage | PlasticKinematicHardening | ThermalIsotropic | ViscoElasticMaxwell | ElasticIsotropic | DiffusionIsotropic], timer: Timer)[源代码]

基类:BaseElement

固体相场断裂单元。

变量:
  • qp_b_matrices (ndarray) – 积分点处的B矩阵列表

  • qp_b_matrices_transpose (ndarray) – 积分点处的B矩阵转置列表

  • qp_strains (list[ndarray]) – 积分点处的应变列表

  • qp_stresses (list[ndarray]) – 积分点处的应力列表

  • qp_phases (list[ndarray]) – 积分点处的相场变量列表

  • qp_phase_fluxes (list[ndarray]) – 积分点处的相场变量通量列表

  • qp_ddsddps (list[ndarray]) – 积分点处的相场刚度矩阵列表

  • dof_u (list[int]) – 单元位移自由度列表

  • dof_p (list[int]) – 单元相场自由度列表

  • ntens (int) – 总应力数量

  • ndi (int) – 轴向应力数量

  • nshr (int) – 剪切应力数量

()\[K_{ij}^\varphi = \int_V {\left[ {{g_c}{l_c}{{\left( {\nabla {N_i}} \right)}^T}\nabla {N_j} + \left( {\frac{{{g_c}}}{{{l_c}}} + 2H} \right){N_i}{N_j}} \right]{\text{d}}V}\]
()\[RHS_i^\varphi = \int_V {\left[ {{g_c}{l_c}{{\left( {\nabla {N_i}} \right)}^T}\nabla \varphi - \left( {2\left( {1 - \varphi } \right)H - \frac{{{g_c}}}{{{l_c}}}\varphi } \right){N_i}} \right]{\text{d}}V}\]
allowed_material_data_list: list[tuple]
allowed_material_number: int
assembly_conn: ndarray
connectivity: ndarray
create_qp_b_matrices() None[源代码]
dimension: int
dof: Dof
dof_names: list[str]
dof_p: list[int]
dof_u: list[int]
element_average_field_variables: dict[str, ndarray]
element_ddof_values: ndarray
element_dof_ids: list[int]
element_dof_number: int
element_dof_values: ndarray
element_fint: ndarray
element_ftime: ndarray
element_id: int
element_stiffness: ndarray
iso_element_shape: IsoElementShape
material_data_list: list[BaseMaterial | MechanicalThermalExpansion | PhaseFieldDamage | PlasticKinematicHardening | ThermalIsotropic | ViscoElasticMaxwell | ElasticIsotropic | DiffusionIsotropic]
materials: list[Material]
ndi
node_coords: ndarray
nshr
ntens
qp_b_matrices: ndarray
qp_b_matrices_transpose: ndarray
qp_ddsddes: list[ndarray]
qp_ddsddps: list[ndarray]
qp_dhdxes: ndarray
qp_energies: list[ndarray]
qp_field_variables: dict[str, ndarray]
qp_jacobi_dets: ndarray
qp_jacobi_invs: ndarray
qp_jacobis: ndarray
qp_number: int
qp_phase_fluxes: list[ndarray]
qp_phases: list[ndarray]
qp_state_variables: list[dict[str, ndarray]]
qp_state_variables_new: list[dict[str, ndarray]]
qp_strains: list[ndarray]
qp_stresses: list[ndarray]
qp_weight_times_jacobi_dets: ndarray
section: Section
timer: Timer
topological_dimension: int
update_element_field_variables() None[源代码]
update_element_material_stiffness_fint(is_update_material: bool = True, is_update_stiffness: bool = True, is_update_fint: bool = True) None[源代码]
pyfem.elements.SolidSmallStrain module
class pyfem.elements.SolidSmallStrain.SolidSmallStrain(element_id: int, iso_element_shape: IsoElementShape, connectivity: ndarray, node_coords: ndarray, dof: Dof, materials: list[Material], section: Section, material_data_list: list[BaseMaterial | MechanicalThermalExpansion | PhaseFieldDamage | PlasticKinematicHardening | ThermalIsotropic | ViscoElasticMaxwell | ElasticIsotropic | DiffusionIsotropic], timer: Timer)[源代码]

基类:BaseElement

固体小变形单元

变量:
  • qp_b_matrices (ndarray) – 积分点处的B矩阵列表

  • qp_b_matrices_transpose (ndarray) – 积分点处的B矩阵转置列表

  • qp_strains (list[ndarray]) – 积分点处的应变列表

  • qp_stresses (list[ndarray]) – 积分点处的应力列表

  • ntens (int) – 总应力数量

  • ndi (int) – 轴向应力数量

  • nshr (int) – 剪切应力数量

测试:比较当前代码和商业有限元软件 ABAQUS 的刚度矩阵,可以通过修改 ABAQUS inp文件,添加以下代码,将单元刚度矩阵输出到 ELEMENTSTIFFNESS.mtx 文件中:

*Output, history, variable=PRESELECT
*Element Matrix Output, Elset=Part-1-1.Set-All, File Name=ElementStiffness, Output File=User Defined, stiffness=yes

我们可以发现 ABAQUS 使用的单元刚度矩阵和当前代码计算的刚度矩阵有一定的差别,这是由于 ABAQUS 采用了 B-Bar 方法对 B 矩阵进行了修正。

注意:当前单元均为原始形式,存在剪切自锁,体积自锁,沙漏模式和零能模式等误差模式。几种误差模式的描述可以参考 https://blog.csdn.net/YORU_NO_KUNI/article/details/130370094

allowed_material_data_list: list[tuple]
allowed_material_number: int
assembly_conn: ndarray
connectivity: ndarray
create_qp_b_matrices() None[源代码]
dimension: int
dof: Dof
dof_names: list[str]
element_average_field_variables: dict[str, ndarray]
element_ddof_values: ndarray
element_dof_ids: list[int]
element_dof_number: int
element_dof_values: ndarray
element_fint: ndarray
element_ftime: ndarray
element_id: int
element_stiffness: ndarray
iso_element_shape: IsoElementShape
material_data_list: list[BaseMaterial | MechanicalThermalExpansion | PhaseFieldDamage | PlasticKinematicHardening | ThermalIsotropic | ViscoElasticMaxwell | ElasticIsotropic | DiffusionIsotropic]
materials: list[Material]
ndi
node_coords: ndarray
nshr
ntens
qp_b_matrices: ndarray
qp_b_matrices_transpose: ndarray
qp_ddsddes: list[ndarray]
qp_dhdxes: ndarray
qp_field_variables: dict[str, ndarray]
qp_jacobi_dets: ndarray
qp_jacobi_invs: ndarray
qp_jacobis: ndarray
qp_number: int
qp_state_variables: list[dict[str, ndarray]]
qp_state_variables_new: list[dict[str, ndarray]]
qp_strains: list[ndarray]
qp_stresses: list[ndarray]
qp_weight_times_jacobi_dets: ndarray
section: Section
timer: Timer
topological_dimension: int
update_element_field_variables() None[源代码]
update_element_material_stiffness_fint(is_update_material: bool = True, is_update_stiffness: bool = True, is_update_fint: bool = True) None[源代码]
pyfem.elements.SolidThermalSmallStrain module
class pyfem.elements.SolidThermalSmallStrain.SolidThermalSmallStrain(element_id: int, iso_element_shape: IsoElementShape, connectivity: ndarray, node_coords: ndarray, dof: Dof, materials: list[Material], section: Section, material_data_list: list[BaseMaterial | MechanicalThermalExpansion | PhaseFieldDamage | PlasticKinematicHardening | ThermalIsotropic | ViscoElasticMaxwell | ElasticIsotropic | DiffusionIsotropic], timer: Timer)[源代码]

基类:BaseElement

固体变形-温度场耦合单元。

变量:
  • qp_b_matrices (ndarray) – 积分点处的B矩阵列表

  • qp_b_matrices_transpose (ndarray) – 积分点处的B矩阵转置列表

  • qp_strains (list[ndarray]) – 积分点处的应变列表

  • qp_stresses (list[ndarray]) – 积分点处的应力列表

  • ntens (int) – 总应力数量

  • ndi (int) – 轴向应力数量

  • nshr (int) – 剪切应力数量

allowed_material_data_list: list[tuple]
allowed_material_number: int
assembly_conn: ndarray
connectivity: ndarray
create_qp_b_matrices() None[源代码]
dimension: int
dof: Dof
dof_T: list[int]
dof_names: list[str]
dof_u: list[int]
element_average_field_variables: dict[str, ndarray]
element_ddof_values: ndarray
element_dof_ids: list[int]
element_dof_number: int
element_dof_values: ndarray
element_fint: ndarray
element_ftime: ndarray
element_id: int
element_stiffness: ndarray
iso_element_shape: IsoElementShape
material_data_list: list[BaseMaterial | MechanicalThermalExpansion | PhaseFieldDamage | PlasticKinematicHardening | ThermalIsotropic | ViscoElasticMaxwell | ElasticIsotropic | DiffusionIsotropic]
materials: list[Material]
ndi
node_coords: ndarray
nshr
ntens
qp_b_matrices: ndarray
qp_b_matrices_transpose: ndarray
qp_ddsddes: list[ndarray]
qp_ddsddts: list[ndarray]
qp_dhdxes: ndarray
qp_field_variables: dict[str, ndarray]
qp_heat_fluxes: list[ndarray]
qp_jacobi_dets: ndarray
qp_jacobi_invs: ndarray
qp_jacobis: ndarray
qp_number: int
qp_state_variables: list[dict[str, ndarray]]
qp_state_variables_new: list[dict[str, ndarray]]
qp_strains: list[ndarray]
qp_stresses: list[ndarray]
qp_temperatures: list[ndarray]
qp_weight_times_jacobi_dets: ndarray
section: Section
timer: Timer
topological_dimension: int
update_element_field_variables() None[源代码]
update_element_material_stiffness_fint(is_update_material: bool = True, is_update_stiffness: bool = True, is_update_fint: bool = True) None[源代码]
pyfem.elements.Thermal module
class pyfem.elements.Thermal.Thermal(element_id: int, iso_element_shape: IsoElementShape, connectivity: ndarray, node_coords: ndarray, dof: Dof, materials: list[Material], section: Section, material_data_list: list[BaseMaterial | MechanicalThermalExpansion | PhaseFieldDamage | PlasticKinematicHardening | ThermalIsotropic | ViscoElasticMaxwell | ElasticIsotropic | DiffusionIsotropic], timer: Timer)[源代码]

基类:BaseElement

温度单元。

变量:
  • qp_temperatures (ndarray) – 积分点处的温度列表

  • qp_heat_fluxes (ndarray) – 积分点处的热流密度列表

  • qp_ddsddts (list[ndarray]) – 积分点处的材料热传导系数矩阵列表

  • ntens (int) – 总应力数量

  • ndi (int) – 轴向应力数量

  • nshr (int) – 剪切应力数量

allowed_material_data_list: list[tuple]
allowed_material_number: int
assembly_conn: ndarray
connectivity: ndarray
dimension: int
dof: Dof
dof_names: list[str]
element_average_field_variables: dict[str, ndarray]
element_ddof_values: ndarray
element_dof_ids: list[int]
element_dof_number: int
element_dof_values: ndarray
element_fint: ndarray
element_ftime: ndarray
element_id: int
element_stiffness: ndarray
iso_element_shape: IsoElementShape
material_data_list: list[BaseMaterial | MechanicalThermalExpansion | PhaseFieldDamage | PlasticKinematicHardening | ThermalIsotropic | ViscoElasticMaxwell | ElasticIsotropic | DiffusionIsotropic]
materials: list[Material]
ndi
node_coords: ndarray
nshr
ntens
qp_ddsddes: list[ndarray]
qp_ddsddts: list[ndarray]
qp_dhdxes: ndarray
qp_field_variables: dict[str, ndarray]
qp_heat_fluxes: list[ndarray]
qp_jacobi_dets: ndarray
qp_jacobi_invs: ndarray
qp_jacobis: ndarray
qp_number: int
qp_state_variables: list[dict[str, ndarray]]
qp_state_variables_new: list[dict[str, ndarray]]
qp_temperatures: list[ndarray]
qp_weight_times_jacobi_dets: ndarray
section: Section
timer: Timer
topological_dimension: int
update_element_field_variables() None[源代码]
update_element_material_stiffness_fint(is_update_material: bool = True, is_update_stiffness: bool = True, is_update_fint: bool = True) None[源代码]
pyfem.elements.get_element_data module
pyfem.elements.get_element_data.get_element_data(element_id: int, iso_element_shape: IsoElementShape, connectivity: ndarray, node_coords: ndarray, dof: Dof, materials: list[Material], section: Section, material_data_list: list[BaseMaterial | MechanicalThermalExpansion | PhaseFieldDamage | PlasticKinematicHardening | ThermalIsotropic | ViscoElasticMaxwell | ElasticIsotropic | DiffusionIsotropic], timer: Timer) BaseElement | SolidSmallStrain | SolidThermalSmallStrain | SolidPhaseDamageSmallStrain | Thermal | Diffusion[源代码]

工厂函数,用于根据材料、截面和单元属性生产不同的单元对象。

参数:
  • element_id (int) – 单元编号

  • iso_element_shape (IsoElementShape) – 等参元对象

  • connectivity (ndarray) – 单元节点序列

  • node_coords (ndarray) – 单元坐标列表

  • dof (Dof) – 自由度属性

  • materials (list[Material]) – 材料属性列表

  • section (Section) – 截面属性

  • material_data_list (list[MaterialData]) – 材料数据对象列表

  • timer (Timer) – 计时器对象

返回:

单元对象

返回类型:

ElementData

Module contents
pyfem.fem package
Submodules
pyfem.fem.Timer module
class pyfem.fem.Timer.Timer[源代码]

基类:object

计时器类,用于存储求解过程中的时间信息。

变量:
  • total_time (float) – 总时间

  • time0 (float) – 上一个载荷步的时间

  • time1 (float) – 当前载荷步的时间

  • dtime (float) – 当前载荷步的时间增量

  • increment (int) – 当前增量步

  • frame_ids (list[int]) – 帧列表

  • is_reduce_dtime (bool) – 是否缩短载荷步时间增量

TOL_TIME: float = 1e-09
dtime: float
frame_ids: list[int]
increment: int
is_done() bool[源代码]
is_reduce_dtime: bool
show() None[源代码]
time0: float
time1: float
to_string(level: int = 1) str[源代码]
total_time: float
pyfem.fem.constants module

定义常数

Module contents
pyfem.io package
Submodules
pyfem.io.Amplitude module
class pyfem.io.Amplitude.Amplitude[源代码]

基类:BaseIO

定义幅值。

变量:
  • name (str) – 幅值名称

  • type (str) – 幅值类型

  • start (float) – 幅值起始点

  • data (list[float]) – 幅值数据列表

data: list[float]
name: str
start: float
type: str
pyfem.io.BC module
class pyfem.io.BC.BC[源代码]

基类:BaseIO

定义边界条件。

变量:
  • name (str) – 边界条件名称

  • category (str) – 边界条件类别

  • type (str) – 边界条件类型

  • dof (list[str]) – 自由度列表

  • node_sets (list[str]) – 节点集合列表

  • element_sets (list[str]) – 单元集合列表

  • bc_element_sets (list[str]) – 边界单元集合列表

  • value (float) – 边界条件数值

  • amplitude_name (str) – 边界条件幅值名称

allowed_categories_types: dict = {'DirichletBC': [''], 'NeumannBC': ['Concentrated', 'Distributed', 'Pressure'], None: [None]}
amplitude_name: str
bc_element_sets: list[str]
category: str
dof: list[str]
element_sets: list[str]
name: str
node_sets: list[str]
type: str
value: float
pyfem.io.BaseIO module
class pyfem.io.BaseIO.BaseIO[源代码]

基类:object

属性配置基类。

当 self.is_read_only = True 时:BaseIO子类的所有属性在第一次被赋予非None值后变为只读状态,不能被修改或删除。

is_read_only: bool = True
set_io_values(io_dict: Dict) None[源代码]
set_io_values_from_toml(io_toml: str) None[源代码]
show() None[源代码]
to_dict() dict[源代码]
to_string(level: int = 1) str[源代码]
to_toml() str[源代码]
pyfem.io.Dof module
class pyfem.io.Dof.Dof[源代码]

基类:BaseIO

定义求解自由度。

变量:
  • names (list[str]) – 自由度名称列表

  • family (str) – 自由度名称类型

  • order (int) – 自由度阶次

family: str
names: list[str]
order: int
pyfem.io.Material module
class pyfem.io.Material.Material[源代码]

基类:BaseIO

定义材料属性。

变量:
  • name (str) – 材料名称

  • category (str) – 材料类别

  • type (str) – 材料类型

  • data (list[float]) – 材料数据列表

  • data_dict (dict[str, any]) – 材料数据字典

  • user_path (str) – 用户自定义材料路径

allowed_categories_types: dict = {'Diffusion': ['Isotropic'], 'Elastic': ['Isotropic'], 'MechanicalThermal': ['Expansion'], 'PhaseField': ['Damage'], 'Plastic': ['KinematicHardening', 'Crystal', 'CrystalGNDs'], 'Thermal': ['Isotropic'], 'User': [''], 'ViscoElastic': ['Maxwell'], None: [None]}
allowed_keys_values: dict = {'category': dict_keys([None, 'Elastic', 'Plastic', 'ViscoElastic', 'Thermal', 'PhaseField', 'MechanicalThermal', 'Diffusion', 'User']), 'type': [None, 'Isotropic', 'KinematicHardening', 'Crystal', 'CrystalGNDs', 'Maxwell', 'Isotropic', 'Damage', 'Expansion', 'Isotropic', '']}
category: str
data: list[float]
data_dict: dict
name: str
type: str
types = ['']
user_path: str
pyfem.io.Mesh module
class pyfem.io.Mesh.Mesh[源代码]

基类:BaseIO

定义需要读取的网格信息。

变量:
  • type (str) – 网格类型

  • file (str) – 网格文件路径

file: str
type: str
pyfem.io.Module module
pyfem.io.Output module
class pyfem.io.Output.Output[源代码]

基类:BaseIO

定义输出文件的格式和详细信息。

变量:
  • name (str) – 输出名称

  • type (str) – 输出类型

  • field_outputs (list[str]) – 输出场变量列表

  • is_save (bool) – 是否保存结果文件

allowed_types: list = ['hdf5', 'vtk']
field_outputs: list[str]
is_save: bool
name: str
type: str
pyfem.io.Parameter module
class pyfem.io.Parameter.Parameter[源代码]

基类:BaseIO

定义需要读取的参数信息。

变量:

file (str) – 参数文件路径

file: str
pyfem.io.Properties module
class pyfem.io.Properties.Properties[源代码]

基类:BaseIO

有限元算例的属性类,解析配置文件中定义的算例属性。

变量:
  • work_path (Path) – 工作目录

  • input_file (Path) – 算例输入文件路径

  • abs_input_file (Path) – 算例输入文件绝对路径

  • toml (Dict) – toml文件解析后的字典

  • title (str) – 算例标题

  • mesh (Mesh) – 网格属性

  • dof (Dof) – 自由度属性

  • materials (List[Material]) – 材料属性列表

  • sections (List[Section]) – 截面属性列表

  • amplitudes (List[Amplitude]) – 幅值属性列表

  • bcs (List[BC]) – 边界条件属性列表

  • solver (Solver) – 求解器属性

  • outputs (List[Output]) – 输出配置属性列表

  • mesh_data (MeshData) – 网格文件解析后的网格数据

  • parameter_filename (str) – 算例标题

  • parameters (Dict) – parameters.toml文件解析后的字典

abs_input_file: Path
amplitudes: List[Amplitude]
bcs: List[BC]
dof: Dof
input_file: Path
materials: List[Material]
mesh: Mesh
mesh_data: MeshData
outputs: List[Output]
parameter_filename: str
parameters: Dict
read_file(filename: Path | str) None[源代码]

读取 .toml 格式的配置文件。

sections: List[Section]
set_amplitudes(amplitudes_list: List) None[源代码]
set_bcs(bcs_list: List) None[源代码]
set_dofs(dofs_dict: Dict) None[源代码]
set_materials(materials_list: List) None[源代码]
set_mesh(mesh_dict: Dict) None[源代码]
set_outputs(outputs_list: List) None[源代码]
set_parameters(parameter_file: Path) None[源代码]
set_sections(sections_list: List) None[源代码]
set_solver(solver_dict: Dict) None[源代码]
set_title(title: str) None[源代码]
set_toml(toml: Dict) None[源代码]
show() None[源代码]
solver: Solver
title: str
to_dict() dict[源代码]
toml: Dict
verify() None[源代码]
work_path: Path
pyfem.io.Properties.extract_parameter_label(string: str) str[源代码]

从带有<>的字符串中提取参数标签

pyfem.io.Properties.substitute_parameters(data: dict | list, parameters: dict) None[源代码]

用参数字典中的数据替换toml字典中用<>定义的变量

pyfem.io.Section module
class pyfem.io.Section.Section[源代码]

基类:BaseIO

定义截面属性。

变量:
  • name (str) – 截面名称

  • category (str) – 截面类别

  • type (str) – 截面类型

  • option (str) – 截面选项

  • element_sets (list[str]) – 单元集合列表,一个截面可以包含多个单元集合

  • material_names (list[str]) – 材料列表,一个截面可以包含多个材料属性,例如热传导系数+弹性模量

  • data (list[float]) – 截面数据

  • data_dict (dict[str, any]) – 截面数据字典

allowed_categories_options: dict = {'Solid': ['SmallStrain', 'FiniteStrain'], 'SolidPhaseDamage': ['SmallStrain'], 'SolidThermal': ['SmallStrain'], 'Thermal': [''], None: [None]}
allowed_categories_types: dict = {'Solid': ['Volume', 'PlaneStress', 'PlaneStrain'], 'SolidPhaseDamage': ['Volume', 'PlaneStress', 'PlaneStrain'], 'SolidThermal': ['Volume', 'PlaneStress', 'PlaneStrain'], 'Thermal': [''], None: [None]}
category: str
data: list[float]
data_dict: dict[str, any]
element_sets: list[str]
material_names: list[str]
name: str
option: str
type: str
pyfem.io.Solver module
class pyfem.io.Solver.Solver[源代码]

基类:BaseIO

定义求解器属性。

变量:
  • type (str) – 求解器类型

  • option (str) – 求解器选项

  • total_time (float) – 总时间

  • start_time (float) – 开始时间

  • max_increment (int) – 最大增量步数量

  • initial_dtime (float) – 初始时间增量步长

  • max_dtime (float) – 最大时间增量步长

  • min_dtime (float) – 最小时间增量步长

initial_dtime: float
max_dtime: float
max_increment: int
min_dtime: float
option: str
start_time: float
total_time: float
type: str
pyfem.io.arguments module
pyfem.io.arguments.get_arguments() Namespace[源代码]
pyfem.io.write_hdf5 module
pyfem.io.write_vtk module
pyfem.io.write_vtk.write_pvd(assembly: Assembly) None[源代码]

将多个vtk文件信息写入pvd文件。

pyfem.io.write_vtk.write_vtk(assembly: Assembly) None[源代码]

将计算结果过写入vtk文件。

Module contents
pyfem.isoelements package
Submodules
pyfem.isoelements.IsoElementDiagram module
class pyfem.isoelements.IsoElementDiagram.IsoElementDiagram[源代码]

基类:object

等参元的形状示意图。

hex20 = '\n        7-------14------6\n       /|              /|\n     15 |     x2 x1  13 |\n     /  19    | /    /  18\n    4---+---12|/----5   |\n    |   |     +--x0 |   |\n    |   3-------10--+---2\n    16 /            17 /\n    |11             | 9\n    |/              |/\n    0-------8-------1'
hex8 = '\n        7---------------6\n       /|              /|\n      / |     x2 x1   / |\n     /  |     | /    /  |\n    4---+-----|/----5   |\n    |   |     +--x0 |   |\n    |   3-----------+---2\n    |  /            |  /\n    | /             | /\n    |/              |/\n    0---------------1'
line2 = '\n    0---------------1\n            +-->x0'
line3 = '\n    0-------1-------2\n            +-->x0'
quad4 = '\n    3---------------2\n    |       x1      |\n    |       |       |\n    |       +--x0   |\n    |               |\n    |               |\n    0---------------1'
quad8 = '\n    3-------6-------2\n    |       x1      |\n    |       |       |\n    7       +--x0   5\n    |               |\n    |               |\n    0-------4-------1'
quad9 = '\n    3-------6-------2\n    |       x1      |\n    |       |       |\n    7       9--x0   5\n    |               |\n    |               |\n    0-------4-------1'
tetra4 = '\n    3\n    * **\n    *   * *\n    *     *  *\n    *       *   2\n    *        **  *\n    x2    *     * *\n    |  x1         **\n    0--x0 * * * * * 1'
tetra4_zoom = '\n    3\n    * * *\n    *   *   *\n    *     *     *\n    *       *       2\n    *         *    * *\n    *           **    *\n    *          *  *    *\n    *        *      *   *\n    *      *          *  *\n    x2   x1             * *\n    |  *                  **\n    0--x0 * * * * * * * * * 1'
tria3 = '\n    2\n    * *\n    *   *\n    *     *\n    x1      *\n    |         *\n    0--x0 * * * 1'
tria6 = '\n    2\n    * *\n    *   *\n    5     4\n    x1      *\n    |         *\n    0--x0 3 * * 1'
pyfem.isoelements.IsoElementShape module
class pyfem.isoelements.IsoElementShape.IsoElementShape(element_type: str)[源代码]

基类:object

等参单元类,设置等参单元的形函数和积分点等信息。

当前支持的单元类型 [‘empty’, ‘line2’, ‘line3’, ‘tria3’, ‘tria6’, ‘quad4’, ‘quad8’, ‘tetra4’, ‘hex8’, ‘hex20’]

变量:
  • element_type (str) – 等参单元类型

  • coord_type (str) – 坐标类型

  • diagram (str) – 等参单元示意图(字符串形式)

  • dimension (int) – 等参单元空间维度

  • topological_dimension (int) – 等参单元拓扑维度,有些情况下拓扑维度不等于空间维度,例如处理空间曲面单元时,空间维度为3,但是单元拓扑维度为2

  • nodes_number (int) – 等参单元节点数目

  • order (int) – 等参单元插值阶次

  • shape_function (Callable) – 等参单元形函数

  • qp_number (int) – 等参单元积分点数量

  • qp_coords (ndarray) – 等参单元积分点坐标

  • qp_weights (ndarray) – 等参单元积分点权重

  • qp_shape_values (ndarray) – 等参单元积分点处形函数的值

  • qp_shape_gradients (ndarray) – 等参单元积分点处形函数对局部坐标梯度的值

  • bc_surface_number (int) – 等参单元边表面数量

  • bc_surface_nodes_dict (dict[str, tuple]) – 等参单元边表面节点编号

  • bc_surface_coord_dict (dict[str, tuple]) – 等参单元边表面节点坐标

  • bc_qp_coords_dict (dict[str, ndarray]) – 等参单元边表面积分点坐标

  • bc_qp_weights (ndarray) – 等参单元边表面积分点权重

  • bc_qp_shape_values_dict (dict[str, ndarray]) – 等参单元边表面积分点处形函数的值

  • bc_qp_shape_gradients_dict (dict[str, ndarray]) – 等参单元边表面积分点处形函数对局部坐标梯度的值

  • nodes_on_surface_dict (dict[str, ndarray]) – 单元节点与等参单元边表面的映射字典

allowed_element_type = ['empty', 'line2', 'line3', 'tria3', 'tria6', 'quad4', 'quad8', 'tetra4', 'hex8', 'hex20']
bc_qp_coords_dict: dict[str, ndarray]
bc_qp_shape_gradients_dict: dict[str, ndarray]
bc_qp_shape_values_dict: dict[str, ndarray]
bc_qp_weights: ndarray
bc_surface_coord_dict: dict[str, tuple]
bc_surface_nodes_dict: dict[str, tuple]
bc_surface_number: int
coord_type: str
diagram: str
dimension: int
element_type: str
nodes_number: int
nodes_on_surface_dict: dict[str, ndarray]
order: int
qp_coords: ndarray
qp_number: int
qp_shape_gradients: ndarray
qp_shape_values: ndarray
qp_weights: ndarray
set_hex20() None[源代码]
set_hex8() None[源代码]
set_line2() None[源代码]
set_line3() None[源代码]
set_quad4() None[源代码]
set_quad8() None[源代码]
set_tetra4() None[源代码]
set_tria3() None[源代码]
set_tria6() None[源代码]
shape_function: Callable
show() None[源代码]
to_string(level: int = 1) str[源代码]
topological_dimension: int
pyfem.isoelements.derive_shape_functions module
pyfem.isoelements.derive_shape_functions.shape_function_gradient(N: list, xi: list[Symbol]) None[源代码]

根据输入的形函数和局部坐标,计算形函数相对局部坐标的梯度表达式,并打印输出。

pyfem.isoelements.derive_shape_functions.shape_function_to_latex(N: list, xi: list[Symbol]) None[源代码]

根据输入的形函数,打印输出其latex数学表达式,用于注释。

pyfem.isoelements.get_iso_element_type module
pyfem.isoelements.get_iso_element_type.get_iso_element_type(node_coords: ndarray, dimension: int = -1) str[源代码]

根据单元节点坐标数组和单元空间维度返回默认的等参元名称。

参数:
  • node_coords (ndarray) – 单元节点坐标数组

  • dimension (int) – 单元空间维度

返回:

等参元名称

返回类型:

str

pyfem.isoelements.shape_functions module
pyfem.isoelements.shape_functions.get_shape_empty(xi: ndarray) tuple[ndarray, ndarray][源代码]
pyfem.isoelements.shape_functions.get_shape_hex20(xi: ndarray) tuple[ndarray, ndarray][源代码]

二十节点六面体单元形函数。

节点序号及局部坐标方向如图所示:

    7-------14------6
   /|              /|
 15 |     x2 x1  13 |
 /  19    | /    /  18
4---+---12|/----5   |
|   |     +--x0 |   |
|   3-------10--+---2
16 /            17 /
|11             | 9
|/              |/
0-------8-------1

对应节点的形函数表达式如下:

()\[N_{ 0 } = \left(0.125 - 0.125 x_{0}\right) \left(1.0 - x_{1}\right) \left(1.0 - x_{2}\right) \left(- x_{0} - x_{1} - x_{2} - 2\right)\]
()\[N_{ 1 } = \left(1.0 - x_{1}\right) \left(1.0 - x_{2}\right) \left(0.125 x_{0} + 0.125\right) \left(x_{0} - x_{1} - x_{2} - 2\right)\]
()\[N_{ 2 } = \left(1.0 - x_{2}\right) \left(0.125 x_{0} + 0.125\right) \left(x_{1} + 1.0\right) \left(x_{0} + x_{1} - x_{2} - 2\right)\]
()\[N_{ 3 } = \left(0.125 - 0.125 x_{0}\right) \left(1.0 - x_{2}\right) \left(x_{1} + 1.0\right) \left(- x_{0} + x_{1} - x_{2} - 2\right)\]
()\[N_{ 4 } = \left(0.125 - 0.125 x_{0}\right) \left(1.0 - x_{1}\right) \left(x_{2} + 1.0\right) \left(- x_{0} - x_{1} + x_{2} - 2\right)\]
()\[N_{ 5 } = \left(1.0 - x_{1}\right) \left(0.125 x_{0} + 0.125\right) \left(x_{2} + 1.0\right) \left(x_{0} - x_{1} + x_{2} - 2\right)\]
()\[N_{ 6 } = \left(0.125 x_{0} + 0.125\right) \left(x_{1} + 1.0\right) \left(x_{2} + 1.0\right) \left(x_{0} + x_{1} + x_{2} - 2\right)\]
()\[N_{ 7 } = \left(0.125 - 0.125 x_{0}\right) \left(x_{1} + 1.0\right) \left(x_{2} + 1.0\right) \left(- x_{0} + x_{1} + x_{2} - 2\right)\]
()\[N_{ 8 } = \left(0.25 - 0.25 x_{0}^{2}\right) \left(1.0 - x_{1}\right) \left(1.0 - x_{2}\right)\]
()\[N_{ 9 } = \left(1.0 - x_{1}^{2}\right) \left(1.0 - x_{2}\right) \left(0.25 x_{0} + 0.25\right)\]
()\[N_{ 10 } = \left(0.25 - 0.25 x_{0}^{2}\right) \left(1.0 - x_{2}\right) \left(x_{1} + 1.0\right)\]
()\[N_{ 11 } = \left(0.25 - 0.25 x_{0}\right) \left(1.0 - x_{1}^{2}\right) \left(1.0 - x_{2}\right)\]
()\[N_{ 12 } = \left(0.25 - 0.25 x_{0}^{2}\right) \left(1.0 - x_{1}\right) \left(x_{2} + 1.0\right)\]
()\[N_{ 13 } = \left(1.0 - x_{1}^{2}\right) \left(0.25 x_{0} + 0.25\right) \left(x_{2} + 1.0\right)\]
()\[N_{ 14 } = \left(0.25 - 0.25 x_{0}^{2}\right) \left(x_{1} + 1.0\right) \left(x_{2} + 1.0\right)\]
()\[N_{ 15 } = \left(0.25 - 0.25 x_{0}\right) \left(1.0 - x_{1}^{2}\right) \left(x_{2} + 1.0\right)\]
()\[N_{ 16 } = \left(0.25 - 0.25 x_{0}\right) \left(1.0 - x_{1}\right) \left(1.0 - x_{2}^{2}\right)\]
()\[N_{ 17 } = \left(1.0 - x_{1}\right) \left(1.0 - x_{2}^{2}\right) \left(0.25 x_{0} + 0.25\right)\]
()\[N_{ 18 } = \left(1.0 - x_{2}^{2}\right) \left(0.25 x_{0} + 0.25\right) \left(x_{1} + 1.0\right)\]
()\[N_{ 19 } = \left(0.25 - 0.25 x_{0}\right) \left(1.0 - x_{2}^{2}\right) \left(x_{1} + 1.0\right)\]
pyfem.isoelements.shape_functions.get_shape_hex8(xi: ndarray) tuple[ndarray, ndarray][源代码]

八节点六面体单元。

节点序号及局部坐标方向如图所示:

    7---------------6
   /|              /|
  / |     x2 x1   / |
 /  |     | /    /  |
4---+-----|/----5   |
|   |     o--x0 |   |
|   3-----------+---2
|  /            |  /
| /             | /
|/              |/
0---------------1

对应节点的形函数表达式如下:

()\[N_{ 0 } = \left(0.125 - 0.125 x_{0}\right) \left(1.0 - x_{1}\right) \left(1.0 - x_{2}\right)\]
()\[N_{ 1 } = \left(1.0 - x_{1}\right) \left(1.0 - x_{2}\right) \left(0.125 x_{0} + 0.125\right)\]
()\[N_{ 2 } = \left(1.0 - x_{2}\right) \left(0.125 x_{0} + 0.125\right) \left(x_{1} + 1.0\right)\]
()\[N_{ 3 } = \left(0.125 - 0.125 x_{0}\right) \left(1.0 - x_{2}\right) \left(x_{1} + 1.0\right)\]
()\[N_{ 4 } = \left(0.125 - 0.125 x_{0}\right) \left(1.0 - x_{1}\right) \left(x_{2} + 1.0\right)\]
()\[N_{ 5 } = \left(1.0 - x_{1}\right) \left(0.125 x_{0} + 0.125\right) \left(x_{2} + 1.0\right)\]
()\[N_{ 6 } = \left(0.125 x_{0} + 0.125\right) \left(x_{1} + 1.0\right) \left(x_{2} + 1.0\right)\]
()\[N_{ 7 } = \left(0.125 - 0.125 x_{0}\right) \left(x_{1} + 1.0\right) \left(x_{2} + 1.0\right)\]
pyfem.isoelements.shape_functions.get_shape_line2(xi: ndarray) tuple[ndarray, ndarray][源代码]

两节点直线单元。

节点序号及局部坐标方向如图所示:

0---------------1
        +-->x0

对应节点的形函数表达式如下:

()\[N_{ 0 } = 0.5 - 0.5 x_{0}\]
()\[N_{ 1 } = 0.5 x_{0} + 0.5\]
pyfem.isoelements.shape_functions.get_shape_line3(xi: ndarray) tuple[ndarray, ndarray][源代码]

三节点直线单元。

节点序号及局部坐标方向如图所示:

0-------1-------2
        +-->x0

对应节点的形函数表达式如下:

()\[N_{ 0 } = 0.5 x_{0}^{2} - 0.5 x_{0}\]
()\[N_{ 1 } = 1 - x_{0}^{2}\]
()\[N_{ 2 } = 0.5 x_{0}^{2} + 0.5 x_{0}\]
pyfem.isoelements.shape_functions.get_shape_quad4(xi: ndarray) tuple[ndarray, ndarray][源代码]

四节点四边形单元。

节点序号及局部坐标方向如图所示:

3---------------2
|       x1      |
|       |       |
|       o--x0   |
|               |
|               |
0---------------1

对应节点的形函数表达式如下:

()\[N_{ 0 } = \left(0.25 - 0.25 x_{0}\right) \left(1.0 - x_{1}\right)\]
()\[N_{ 1 } = \left(1.0 - x_{1}\right) \left(0.25 x_{0} + 0.25\right)\]
()\[N_{ 2 } = \left(0.25 x_{0} + 0.25\right) \left(x_{1} + 1.0\right)\]
()\[N_{ 3 } = \left(0.25 - 0.25 x_{0}\right) \left(x_{1} + 1.0\right)\]
pyfem.isoelements.shape_functions.get_shape_quad8(xi: ndarray) tuple[ndarray, ndarray][源代码]

八节点四边形单元。

节点序号及局部坐标方向如图所示:

3-------6-------2
|       x1      |
|       |       |
7       o--x0   5
|               |
|               |
0-------4-------1

对应节点的形函数表达式如下:

()\[N_{ 0 } = \left(1.0 - x_{1}\right) \left(0.25 x_{0} - 0.25\right) \left(x_{0} + x_{1} + 1.0\right)\]
()\[N_{ 1 } = \left(1.0 - x_{1}\right) \left(- 0.25 x_{0} - 0.25\right) \left(- x_{0} + x_{1} + 1.0\right)\]
()\[N_{ 2 } = \left(- 0.25 x_{0} - 0.25\right) \left(x_{1} + 1.0\right) \left(- x_{0} - x_{1} + 1.0\right)\]
()\[N_{ 3 } = \left(0.25 x_{0} - 0.25\right) \left(x_{1} + 1.0\right) \left(x_{0} - x_{1} + 1.0\right)\]
()\[N_{ 4 } = \left(0.5 - 0.5 x_{0}\right) \left(1.0 - x_{1}\right) \left(x_{0} + 1.0\right)\]
()\[N_{ 5 } = \left(1.0 - x_{1}\right) \left(0.5 x_{0} + 0.5\right) \left(x_{1} + 1.0\right)\]
()\[N_{ 6 } = \left(0.5 - 0.5 x_{0}\right) \left(x_{0} + 1.0\right) \left(x_{1} + 1.0\right)\]
()\[N_{ 7 } = \left(0.5 - 0.5 x_{0}\right) \left(1.0 - x_{1}\right) \left(x_{1} + 1.0\right)\]
pyfem.isoelements.shape_functions.get_shape_tetra4(xi: ndarray) tuple[ndarray, ndarray][源代码]

四节点四面体单元。

节点序号及局部坐标方向如图所示:

3
* **
*   * *
*     *  *
*       *   2
*        **  *
x2    *     * *
|  x1         **
0--x0 * * * * * 1

对应节点的形函数表达式如下:

()\[N_{ 0 } = - x_{0} - x_{1} - x_{2} + 1.0\]
()\[N_{ 1 } = x_{0}\]
()\[N_{ 2 } = x_{1}\]
()\[N_{ 3 } = x_{2}\]
pyfem.isoelements.shape_functions.get_shape_tetra4_barycentric(xi: ndarray) tuple[ndarray, ndarray][源代码]

四节点四面体单元。

节点序号及局部坐标方向如图所示:

3
* **
*   * *
*     *  *
*       *   2
*        **  *
*     *     * *
*  *          **
0 * * * * * * * 1

对应节点的形函数表达式如下:

()\[N_{ 0 } = - x_{0} - x_{1} - x_{2} + 1.0\]
()\[N_{ 1 } = x_{0}\]
()\[N_{ 2 } = x_{1}\]
()\[N_{ 3 } = x_{2}\]
pyfem.isoelements.shape_functions.get_shape_tria3(xi: ndarray) tuple[ndarray, ndarray][源代码]

三节点三角形单元。

节点序号及局部坐标方向如图所示:

2
* *
*   *
*     *
x1      *
|         *
0--x0 * * * 1

对应节点的形函数表达式如下:

()\[N_{ 0 } = - x_{0} - x_{1} + 1.0\]
()\[N_{ 1 } = x_{0}\]
()\[N_{ 2 } = x_{1}\]
pyfem.isoelements.shape_functions.get_shape_tria3_barycentric(xi: ndarray) tuple[ndarray, ndarray][源代码]

三节点三角形单元。

节点序号及局部坐标方向如图所示:

2
* *
*   *
*     *
*       *
*         *
0 * * * * * 1

对应节点的形函数表达式如下:

()\[N_{ 0 } = \lambda_{0}\]
()\[N_{ 1 } = \lambda_{1}\]
()\[N_{ 2 } = \lambda_{2}\]
pyfem.isoelements.shape_functions.get_shape_tria6(xi: ndarray) tuple[ndarray, ndarray][源代码]

六节点三角形单元。

节点序号及局部坐标方向如图所示:

2
* *
*   *
5     4
x1      *
|         *
0--x0 3 * * 1

对应节点的形函数表达式如下:

()\[N_{ 0 } = 2.0 x_{0}^{2} - x_{0}\]
()\[N_{ 1 } = 2.0 x_{1}^{2} - x_{1}\]
()\[N_{ 2 } = x_{0} + x_{1} + \left(- 2.0 x_{0} - 2.0 x_{1} + 2.0\right) \left(- x_{0} - x_{1} + 1.0\right) - 1.0\]
()\[N_{ 3 } = 4.0 x_{0} x_{1}\]
()\[N_{ 4 } = 4.0 x_{1} \left(- x_{0} - x_{1} + 1.0\right)\]
()\[N_{ 5 } = 4.0 x_{0} \left(- x_{0} - x_{1} + 1.0\right)\]
pyfem.isoelements.shape_functions.get_shape_tria6_barycentric(xi: ndarray) tuple[ndarray, ndarray][源代码]

六节点三角形单元。

节点序号及局部坐标方向如图所示:

2
* *
*   *
5     4
*       *
*         *
0 * * 3 * * 1

对应节点的形函数表达式如下:

()\[N_{ 0 } = 2.0 x_{0}^{2} - x_{0}\]
()\[N_{ 1 } = 2.0 x_{1}^{2} - x_{1}\]
()\[N_{ 2 } = x_{0} + x_{1} + \left(- 2.0 x_{0} - 2.0 x_{1} + 2.0\right) \left(- x_{0} - x_{1} + 1.0\right) - 1.0\]
()\[N_{ 3 } = 4.0 x_{0} x_{1}\]
()\[N_{ 4 } = 4.0 x_{1} \left(- x_{0} - x_{1} + 1.0\right)\]
()\[N_{ 5 } = 4.0 x_{0} \left(- x_{0} - x_{1} + 1.0\right)\]
Module contents
pyfem.materials package
Submodules
pyfem.materials.BaseMaterial module
class pyfem.materials.BaseMaterial.BaseMaterial(material: Material, dimension: int, section: Section)[源代码]

基类:object

材料对象的基类。

变量:
  • material (Material) – 材料属性

  • dimension (int) – 空间维度

  • section (Section) – 截面属性

  • allowed_section_types (tuple) – 当前材料许可的截面类型

  • tangent (ndarray) – 切线刚度矩阵

  • output (dict[str, ndarray]) – 输出变量字典

  • data_keys (list[str]) – 材料属性数据关键字列表

  • data_dict (dict[str, float]) – 材料属性数据字典

allowed_section_types: tuple
create_tangent() None[源代码]
data_dict: dict[str, float]
data_keys: list[str]
dimension: int
get_data_length_error_msg() str[源代码]
get_section_type_error_msg() str[源代码]
get_tangent(variable: dict[str, ndarray], state_variable: dict[str, ndarray], state_variable_new: dict[str, ndarray], element_id: int, iqp: int, ntens: int, ndi: int, nshr: int, timer: Timer) tuple[ndarray, dict[str, ndarray]][源代码]
material: Material
output: dict[str, ndarray]
section: Section
show() None[源代码]
tangent: ndarray
to_string(level: int = 1) str[源代码]
pyfem.materials.DiffusionIsotropic module
class pyfem.materials.DiffusionIsotropic.DiffusionIsotropic(material: Material, dimension: int, section: Section)[源代码]

基类:BaseMaterial

各项同性热传导材料。

支持的截面属性:(‘’, ‘Volume’, ‘PlaneStress’, ‘PlaneStrain’)

变量:

d (float) – Diffusion coefficient d

allowed_section_types: tuple
create_tangent()[源代码]
d: float
data_dict: dict[str, float]
data_keys: list[str]
dimension: int
get_tangent(variable: dict[str, ndarray], state_variable: dict[str, ndarray], state_variable_new: dict[str, ndarray], element_id: int, iqp: int, ntens: int, ndi: int, nshr: int, timer: Timer) tuple[ndarray, dict[str, ndarray]][源代码]
material: Material
output: dict[str, ndarray]
section: Section
tangent: ndarray
pyfem.materials.ElasticIsotropic module
class pyfem.materials.ElasticIsotropic.ElasticIsotropic(material: Material, dimension: int, section: Section)[源代码]

基类:BaseMaterial

各项同性弹性材料。

支持的截面属性:(‘Volume’, ‘PlaneStress’, ‘PlaneStrain’)

变量:
  • E (float) – Young’s modulus E

  • nu (float) – Poisson’s ratio nu

E: float
allowed_section_types: tuple
create_tangent()[源代码]
data_dict: dict[str, float]
data_keys: list[str]
dimension: int
get_tangent(variable: dict[str, ndarray], state_variable: dict[str, ndarray], state_variable_new: dict[str, ndarray], element_id: int, iqp: int, ntens: int, ndi: int, nshr: int, timer: Timer) tuple[ndarray, dict[str, ndarray]][源代码]
material: Material
nu: float
output: dict[str, ndarray]
section: Section
tangent: ndarray
pyfem.materials.ElasticIsotropic.get_bulk_from_lame(lam: float, mu: float) float[源代码]

Compute bulk modulus from Lamé parameters.

()\[\gamma = \lambda + {2 \over 3} \mu\]
pyfem.materials.ElasticIsotropic.get_bulk_from_young_poisson(E: float, nu: float, plane: str) float[源代码]

Compute bulk modulus corresponding to Young’s modulus and Poisson’s ratio.

pyfem.materials.ElasticIsotropic.get_lame_from_stiffness(stiffness: ndarray, plane: str) tuple[float, float][源代码]

Compute Lamé parameters from an isotropic stiffness tensor.

pyfem.materials.ElasticIsotropic.get_lame_from_young_poisson(E: float, nu: float, plane: str) tuple[float, float][源代码]

Compute Lamé parameters from Young’s modulus and Poisson’s ratio.

The relationship between Lamé parameters and Young’s modulus, Poisson’s ratio (see [1],[2]):

()\[\lambda = {\nu E \over (1+\nu)(1-2\nu)},\qquad \mu = {E \over 2(1+\nu)}\]

The plain stress hypothesis:

()\[\bar\lambda = {2\lambda\mu \over \lambda + 2\mu}\]

[1] I.S. Sokolnikoff: Mathematical Theory of Elasticity. New York, 1956.

[2] T.J.R. Hughes: The Finite Element Method, Linear Static and Dynamic Finite Element Analysis. New Jersey, 1987.

pyfem.materials.ElasticIsotropic.get_stiffness_from_lame(dimension: int, lam: float, mu: float) ndarray[源代码]

Compute stiffness tensor corresponding to Lamé parameters.

()\[\begin{split}{\bf D}_{(2D)} = \begin{bmatrix} \lambda + 2\mu & \lambda & 0\\ \lambda & \lambda + 2\mu & 0\\ 0 & 0 & \mu \end{bmatrix}\end{split}\]
()\[\begin{split}{\bf D}_{(3D)} = \begin{bmatrix} \lambda + 2\mu & \lambda & \lambda & 0 & 0 & 0\\ \lambda & \lambda + 2\mu & \lambda & 0 & 0 & 0 \\ \lambda & \lambda & \lambda + 2\mu & 0 & 0 & 0 \\ 0 & 0 & 0 & \mu & 0 & 0 \\ 0 & 0 & 0 & 0 & \mu & 0 \\ 0 & 0 & 0 & 0 & 0 & \mu\\ \end{bmatrix}\end{split}\]
pyfem.materials.ElasticIsotropic.get_stiffness_from_lame_mixed(dimension: int, lam: float, mu: float) ndarray[源代码]

Compute stiffness tensor corresponding to Lamé parameters for mixed formulation.

()\[\begin{split}{\bf D}_{(2D)} = \begin{bmatrix} \widetilde\lambda + 2\mu & \widetilde\lambda & 0\\ \widetilde\lambda & \widetilde\lambda + 2\mu & 0\\ 0 & 0 & \mu \end{bmatrix}\end{split}\]
()\[\begin{split}{\bf D}_{(3D)} = \begin{bmatrix} \widetilde\lambda + 2\mu & \widetilde\lambda & \widetilde\lambda & 0 & 0 & 0\\ \widetilde\lambda & \widetilde\lambda + 2\mu & \widetilde\lambda & 0 & 0 & 0 \\ \widetilde\lambda & \widetilde\lambda & \widetilde\lambda + 2\mu & 0 & 0 & 0 \\ 0 & 0 & 0 & \mu & 0 & 0 \\ 0 & 0 & 0 & 0 & \mu & 0 \\ 0 & 0 & 0 & 0 & 0 & \mu\\ \end{bmatrix}\end{split}\]

where

()\[\widetilde\lambda = -{2\over 3} \mu\]
pyfem.materials.ElasticIsotropic.get_stiffness_from_young_poisson(dimension: int, E: float, nu: float, plane: str) ndarray[源代码]

Compute stiffness tensor corresponding to Young’s modulus and Poisson’s ratio.

pyfem.materials.ElasticIsotropic.get_stiffness_from_young_poisson_mixed(dimension: int, E: float, nu: float, plane) ndarray[源代码]

Compute stiffness tensor corresponding to Young’s modulus and Poisson’s ratio for mixed formulation.

pyfem.materials.ElasticIsotropic.get_young_poisson_from_stiffness(stiffness: ndarray, plane: str) tuple[float, float][源代码]

Compute Young’s modulus and Poisson’s ratio from an isotropic stiffness tensor.

pyfem.materials.MechanicalThermalExpansion module
class pyfem.materials.MechanicalThermalExpansion.MechanicalThermalExpansion(material: Material, dimension: int, section: Section)[源代码]

基类:BaseMaterial

热膨胀材料。

支持的截面属性:(‘Volume’, ‘PlaneStress’, ‘PlaneStrain’)

变量:

alpha (float) – Coefficient of thermal expansion alpha

allowed_section_types: tuple
alpha: float
create_tangent()[源代码]
data_dict: dict[str, float]
data_keys: list[str]
dimension: int
get_tangent(variable: dict[str, ndarray], state_variable: dict[str, ndarray], state_variable_new: dict[str, ndarray], element_id: int, iqp: int, ntens: int, ndi: int, nshr: int, timer: Timer) tuple[ndarray, dict[str, ndarray]][源代码]
material: Material
output: dict[str, ndarray]
section: Section
tangent: ndarray
pyfem.materials.PhaseFieldDamage module
class pyfem.materials.PhaseFieldDamage.PhaseFieldDamage(material: Material, dimension: int, section: Section)[源代码]

基类:BaseMaterial

相场断裂材料。

支持的截面属性:(‘Volume’, ‘PlaneStress’, ‘PlaneStrain’)

变量:
  • gc (float) – surface energy to create a unit fracture surface gc

  • lc (float) – length scale parameter to measure the damage diffusion lc

allowed_section_types: tuple
data_dict: dict[str, float]
data_keys: list[str]
dimension: int
gc: float
lc: float
material: Material
output: dict[str, ndarray]
section: Section
tangent: ndarray
pyfem.materials.PlasticCrystal module
class pyfem.materials.PlasticCrystal.PlasticCrystal(material: Material, dimension: int, section: Section)[源代码]

基类:BaseMaterial

晶体塑性材料。

支持的截面属性:(‘Volume’, ‘PlaneStrain’)

变量:
  • tolerance (float) – 误差容限

  • total_number_of_slips (int) – 总滑移系数量

  • elastic (dict) – 弹性参数字典

  • C (ndarray) – 弹性矩阵

  • slip_system_name (list[str]) – 滑移系统名称

  • c_over_a (list[float]) – 晶体坐标系的c/a

  • theta (float) – 切线系数法参数

  • K (float) – 参考屈服强度

  • dot_gamma_0 (float) – 参考剪切应变率

  • p_s (float) – 强化指数

  • c_1 (ndarray) – 随动强化参数

  • c_2 (ndarray) – 随动强化参数

  • r_0 (ndarray) – 随动强化参数

  • b_s (ndarray) – 各向同性强化参数

  • Q_s (ndarray) – 各项同性强化参数

  • H (ndarray) – 硬化系数矩阵

  • u_global (ndarray) – 全局坐标系下的1号矢量

  • v_global (ndarray) – 全局坐标系下的2号矢量

  • w_global (ndarray) – 全局坐标系下的3号矢量

  • u_grain (ndarray) – 晶粒坐标系下的1号矢量

  • v_grain (ndarray) – 晶粒坐标系下的2号矢量

  • w_grain (ndarray) – 晶粒坐标系下的3号矢量

  • T (ndarray) – 坐标变换矩阵

  • T_voigt (ndarray) – Vogit坐标变换矩阵

  • m_s (ndarray) – 特征滑移系滑移方向

  • n_s (ndarray) – 特征滑移系滑移面法向

  • MAX_NITER (ndarray) – 最大迭代次数

C: ndarray
H
K: ndarray
MAX_NITER
Q_s: ndarray
T: ndarray
T_voigt: ndarray
allowed_section_types: tuple
b_s: ndarray
c_1: ndarray
c_2: ndarray
c_over_a: list[float]
create_elastic_stiffness(elastic: dict)[源代码]

定义局部晶系的弹性刚度矩阵

弹性刚度矩阵由弹性常数组成,对应的矩阵形式与弹性常数个数及材料对称性相关,相关参数由材料属性数据字典中的 elastic 字典给出。

(1)各向同性材料(Isotropic material):对于一般各向同性材料,其包含两个独立的弹性常数,即:杨氏模量(Young’s modulus) \(E\) 和泊松比(Poisson’s ratio) \(\nu\) , 进一步可得到这两个弹性常数与剪切模量 \(G = \mu\) 和拉梅常数 \(\lambda\) 的关系为([1],[2]):

()\[\lambda = \frac{{\nu E}}{{(1 + \nu )(1 - 2\nu )}},G = \mu = \frac{E}{{2(1 + \nu )}}\]

进而得到各向同性材料得到弹性矩阵形式为:

()\[\begin{split}{{\mathbf{C}}_{(2D)}} = \left[ {\begin{array}{*{20}{c}} {\lambda + 2\mu }&\lambda &0 \\ \lambda &{\lambda + 2\mu }&0 \\ 0&0&\mu \end{array}} \right]\end{split}\]
()\[\begin{split}{{\mathbf{C}}_{(3D)}} = \left[ {\begin{array}{*{20}{c}} {\lambda + 2\mu }&\lambda &\lambda &0&0&0 \\ \lambda &{\lambda + 2\mu }&\lambda &0&0&0 \\ \lambda &\lambda &{\lambda + 2\mu }&0&0&0 \\ 0&0&0&\mu &0&0 \\ 0&0&0&0&\mu &0 \\ 0&0&0&0&0&\mu \end{array}} \right]\end{split}\]

(2)立方材料(Cubic material):包含三个独立的材料参数 \({C_{11}},{C_{12}},{C_{44}}\) ,其弹性矩阵定义为:

()\[\begin{split}{{\mathbf{C}}_{(2D)}} = \left[ {\begin{array}{*{20}{c}} {{C_{11}}}&{{C_{12}}}&0 \\ {{C_{12}}}&{{C_{11}}}&0 \\ 0&0&{{C_{44}}} \end{array}} \right]\end{split}\]
()\[\begin{split}{{\mathbf{C}}_{(3D)}} = \left[ {\begin{array}{*{20}{c}} {{C_{11}}}&{{C_{12}}}&{{C_{12}}}&0&0&0 \\ {{C_{12}}}&{{C_{11}}}&{{C_{12}}}&0&0&0 \\ {{C_{12}}}&{{C_{12}}}&{{C_{11}}}&0&0&0 \\ 0&0&0&{{C_{44}}}&0&0 \\ 0&0&0&0&{{C_{44}}}&0 \\ 0&0&0&0&0&{{C_{44}}} \end{array}} \right]\end{split}\]

(3)正交材料(Orthotropic material):包含9个独立的材料参数,分别为:

()\[{C_{1111}},{C_{1122}},{C_{2222}},{C_{1133}},{C_{2233}},{C_{3333}},{C_{1212}},{C_{1313}},{C_{2323}}\]

与 ABAQUS 对各向同性材料的定义相同,其弹性矩阵定义为:

()\[\begin{split}{{\mathbf{C}}_{(2D)}} = \left[ {\begin{array}{*{20}{c}} {{C_{1111}}}&{{C_{1122}}}&0 \\ {{C_{1122}}}&{{C_{2222}}}&0 \\ 0&0&{{C_{1212}}} \end{array}} \right]\end{split}\]
()\[\begin{split}{{\mathbf{C}}_{(3D)}} = \left[ {\begin{array}{*{20}{c}} {{C_{1111}}}&{{C_{1122}}}&{{C_{1133}}}&0&0&0 \\ {{C_{1122}}}&{{C_{2222}}}&{{C_{2233}}}&0&0&0 \\ {{C_{1133}}}&{{C_{2233}}}&{{C_{3333}}}&0&0&0 \\ 0&0&0&{{C_{1212}}}&0&0 \\ 0&0&0&0&{{C_{1313}}}&0 \\ 0&0&0&0&0&{{C_{2323}}} \end{array}} \right]\end{split}\]

(4)各向异性材料(Anistropic material):包含21个独立的材料参数,分别为:

()\[{C_{1111}},{C_{1122}},{C_{2222}},{C_{1133}},{C_{2233}},{C_{3333}},{C_{1112}}\]
()\[{C_{2212}},{C_{3312}},{C_{1212}},{C_{1113}},{C_{2213}},{C_{3313}},{C_{1213}}\]
()\[{C_{1313}},{C_{1123}},{C_{2223}},{C_{3323}},{C_{1223}},{C_{1323}},{C_{2323}}\]

与 ABAQUS 对各向异性材料的定义相同,其弹性矩阵定义为:

()\[\begin{split}{{\mathbf{C}}_{(2D)}} = \left[ {\begin{array}{*{20}{c}} {{C_{1111}}}&{{C_{1122}}}&0 \\ {{C_{1122}}}&{{C_{2222}}}&0 \\ 0&0&{{C_{1212}}} \end{array}} \right]\end{split}\]
()\[\begin{split}{{\mathbf{C}}_{(3D)}} = \left[ {\begin{array}{*{20}{c}} {{C_{1111}}}&{{C_{1122}}}&{{C_{1133}}}&{{C_{1112}}}&{{C_{1113}}}&{{C_{1123}}} \\ {{C_{1122}}}&{{C_{2222}}}&{{C_{2233}}}&{{C_{2212}}}&{{C_{2213}}}&{{C_{2223}}} \\ {{C_{1133}}}&{{C_{2233}}}&{{C_{3333}}}&{{C_{3312}}}&{{C_{3313}}}&{{C_{3323}}} \\ {{C_{1112}}}&{{C_{2212}}}&{{C_{3312}}}&{{C_{1212}}}&{{C_{1213}}}&{{C_{1223}}} \\ {{C_{1113}}}&{{C_{2213}}}&{{C_{3313}}}&{{C_{1213}}}&{{C_{1313}}}&{{C_{1323}}} \\ {{C_{1123}}}&{{C_{2223}}}&{{C_{3323}}}&{{C_{1223}}}&{{C_{1323}}}&{{C_{2323}}} \end{array}} \right]\end{split}\]

[1] I.S. Sokolnikoff: Mathematical Theory of Elasticity. New York, 1956.

[2] T.J.R. Hughes: The Finite Element Method, Linear Static and Dynamic Finite Element Analysis. New Jersey, 1987.

data_dict: dict[str, float]
data_keys: list[str]
dimension: int
dot_gamma_0: ndarray
elastic: dict
get_tangent(variable: dict[str, ndarray], state_variable: dict[str, ndarray], state_variable_new: dict[str, ndarray], element_id: int, iqp: int, ntens: int, ndi: int, nshr: int, timer: Timer) tuple[ndarray, dict[str, ndarray]][源代码]

获得幂指数形式的晶体塑性本构模型

本模块中包含3个字典:variablestate_variablestate_variable_new

其中,字典 variable 存储自由度相关的变量,如应变 \(\varepsilon\) 和应变增量 \(\Delta \varepsilon\)

字典 state_variable 存储迭代过程中上一个收敛增量步 \(t\) 时刻的状态变量,如应力 \(\sigma\) 、分解剪应力 \(\tau\) 、 剪切应变 \(\gamma\) 、状态变量 \(\rho\) 、背应力项(随动强化项) \(\alpha\) 、各向同性强化项 \(r\) 、 特征滑移系滑移方向 \(m\_s\) 、特征滑移系滑移面法向 \(n\_s\) 。这些状态变量在当前增量步 \(t+\Delta t\) 计算收敛之前是不被更新的。

字典 state_variable_new 存储当前增量步 \(t+\Delta t\) 时刻的某个中间迭代步 \(k\) 的状态变量。

幂指数形式的晶体塑性本构模型
1. 引言

在晶体塑性本构中通常采用增量形式的本构方程,若全量形式的本构方程采用 \(\boldsymbol{\sigma}= \mathbb{C}:{{\boldsymbol{\varepsilon}}}\) , 其中, \(\boldsymbol{\sigma}\) 为 Cauchy 应力张量, \(\mathbb{C}\) 为弹性模量张量, \({{\boldsymbol{\varepsilon}}}\) 为应变张量。 对全量形式的本构方程求时间导数,可得到增量形式的本构方程 \({\boldsymbol{\dot \sigma}}= \mathbb{C}:{{\boldsymbol{D}}}\) , 其中, \({\boldsymbol{\dot \sigma}}\) 为Cauchy应力张量率, \({{\boldsymbol{D}}}\) 为变形率张量。 可以证明,上述增量形式的本构方程中 \({{\boldsymbol{D}}}\) 是客观张量,而 \(\dot {\boldsymbol{\sigma}}\) 不是客观张量。

要建立正确的材料本构关系必须遵守“客观性公理”这一基本前提。所谓客观性就是物质的力学性质与观察者无关,客观性又称为“标架无差异性”。遵守“客观性公理”的张量称为客观张量, 也可以定义为在时空变换中保持不变的张量,亦称“时空无差异张量”。用公式可以直接定义满足如下变换率的张量[1]:

()\[{\boldsymbol{\dot \Lambda }}^{*} = {\boldsymbol{ Q }}{\boldsymbol{\dot \Lambda }}{\boldsymbol{Q}^{T}}\]

为客观性张量。上式表示的是对张量的正交变换或时空变换, \(\boldsymbol{Q}\) 是时空变换矩阵。

我们知道 Cauchy 应力张量 \(\boldsymbol{\sigma}\) 是客观张量,即满足:

()\[{{{\boldsymbol{\sigma }}}^*} = {\boldsymbol{\dot Q }}{\boldsymbol{\sigma }}{\boldsymbol{ Q }^{T}}, {\boldsymbol{\dot Q }}{\boldsymbol{ Q }^{T}} = {\boldsymbol{I }}\]

\({{{\boldsymbol{\sigma }}}^*}\) 求时间导数:

()\[{{{\boldsymbol{\dot \sigma }}}^*} = {\boldsymbol{\dot Q }}{\boldsymbol{\sigma }}{\boldsymbol{ Q }^{T}} + {\boldsymbol{ Q }}{\boldsymbol{\dot \sigma }}{\boldsymbol{ Q }^{T}} + {\boldsymbol{ Q }}{\boldsymbol{\sigma }}{\boldsymbol{\dot Q }^{T}}\]

上面的时间导数表明,一般情况下, \({{{\boldsymbol{\dot \sigma }}}^*}\) 并不是客观时间导数,由于 \({{{\boldsymbol{\dot \sigma }}}^*} \ne {\boldsymbol{ Q }}{\boldsymbol{\dot \sigma }}{\boldsymbol{ Q }^{T}}\) , 只有当转动率为零, \({\boldsymbol{\dot Q }} {\text{ = }} 0\) ,也就是当 \({\boldsymbol{ Q }} {\text{ = }}\) 常量时, \({{{\boldsymbol{\dot \sigma }}}^*}\) 才满足Truesdell客观性的要求。

同理,可证明变形率 \({{\boldsymbol{D}}}\) 满足Truesdell客观性的要求。已知变形率 \({{\boldsymbol{D}}}\) 可以表示为:

()\[{\boldsymbol{D}} = \frac{{\boldsymbol{L}} + {\boldsymbol{L}}^{T}}{2}\]

式中, \({\boldsymbol{L}}\) 是速度梯度, \({\boldsymbol{L}}^{T}\) 是速度梯度的转置。对变形率 \({{\boldsymbol{D}}}\) 做时空变换:

()\[{{{\boldsymbol{D}}}^*} = \frac{{{{\boldsymbol{L}}}^*} + {{{\boldsymbol{L}}}^{T*}}}{2}\]

其中, \({{\boldsymbol{L}}^{*}}\) 是速度梯度的时空变换律, \({{\boldsymbol{L}}^{T*}}\) 是速度梯度转置的时空变换律,两者可表示为:

()\[{{{\boldsymbol{L}}}^*} = {\boldsymbol{ Q }}{\boldsymbol{L }}{\boldsymbol{ Q }^{T}} + {\boldsymbol{\Omega }}\]
()\[{{{\boldsymbol{L}}}^{T*}} = {\boldsymbol{ Q }}{\boldsymbol{L }}{\boldsymbol{ Q }^{T}} - {\boldsymbol{\Omega }},\]

式中, \({\boldsymbol{\Omega }}={\boldsymbol{ \dot Q }}{\boldsymbol{ Q }^{T}}\) 是一反对称张量。从上式可以看出, 速度梯度 \({\boldsymbol{L}}\) 不是客观张量。将其 \({{{\boldsymbol{L}}}^*}\)\({{{\boldsymbol{L}}}^{T*}}\) 代入变形率 \({{\boldsymbol{D}}}\) 的时空变换律,我们得到:

()\[{{{\boldsymbol{D}}}^*} = \frac{{{{\boldsymbol{L}}}^*} + {{{\boldsymbol{L}}}^{T*}}}{2} = {\boldsymbol{ Q }}\frac{{{{\boldsymbol{L}}}} + {{{\boldsymbol{L}}}^{T}}}{2}{\boldsymbol{ Q }^{T}} = {\boldsymbol{ Q }}{\boldsymbol{D }}{\boldsymbol{ Q }^{T}}\]

所以,普通的增量形式本构方程 \({\boldsymbol{\dot \sigma}}= \mathbb{C}:{{\boldsymbol{D}}}\) 由于 \(\dot {\boldsymbol{\sigma}}\) 不满足客观性, 因此不再适用,需要做出相应的改变。主要体现为:

选用客观的应力率取代普通的应力率,以保证客观性。本文采用 Cauchy 应力的 Zaremba-Jaumann 率 \(\hat{\boldsymbol{\sigma}}\) (一般地简称为 Jaumann 率[1,2])。 Jaumann 率是一种客观率(objective rate),它使得在刚体转动中,在初始参考系下,初始的应力状态保持不变。

下面详细介绍如何获得满足客观性要求的增量形式弹塑性本构关系。

2. 运动学

由于晶内部大量位错的存在,所以宏观上可以假设位错滑移在晶粒内部均匀分布。因而,在连续介质力学中,用变形梯度张量 \({\boldsymbol{F}}\) 来描述滑移变形的宏观效应。 \({\boldsymbol{F}}\) 里包含了变形的所有信息,包括弹性变形和塑性变形,也包括了拉伸和旋转。 采用 Hill 和 Rice 对晶体塑性变形几何学及运动学的理论表述方法,则晶体总的变形梯度 \({\boldsymbol{F}}\) —— 当前构型量 \({\boldsymbol{x}}\) 对参考构型量 \({\boldsymbol{X}}\) 的偏导,可表示为:

()\[{\boldsymbol{F}} =\frac{\partial {\boldsymbol{x}}}{\partial {\boldsymbol{X}}} = {{\boldsymbol{F}}^{\text{e}}}{{\boldsymbol{F}}^{\text{p}}}\]

其中, \({{\boldsymbol{F}}^{\text{e}}}\) 为晶格畸变和刚性转动产生的弹性变形梯度, \({{\boldsymbol{F}}^{\text{p}}}\) 表示晶体沿着滑移方向的均匀剪切所产生的塑性变形梯度。

图 1 晶体变形几何学示意图:

                              最终构型
                                               *
                                         *      *
                                   *      *
                             *      *      *     m^*
                       *      *      *      *
                        *      *      *             ^
                  n^*    *      *                     \
                   *      *                             \  F^e
            ^       *                                     \
           /                                                \
          /                                                   \
         /  F=F^eF^p                                            \
        /                                                         \
   *  *  *  *  *                       F^p                            *  *  *  *  *
n  *  *  *  *  *             ---------------------->            n     *  *  *  *  *
^  *  *  *  *  *                                                ^  *  *  *  *  *
|  *  *  *  *  *                                                |  *  *  *  *  *
----->m                                                         ----->m
初始构型                                                          中间构型

上图所示为晶体变形几何学的示意图。可以看出,晶体滑移过程中,晶格矢量没有发生变化;但晶格的畸变会造成晶格矢量的变化,包括伸长和转动。

\({\boldsymbol{m}}^{(\alpha )}\)\({\boldsymbol{n}}^{(\alpha )}\) 分别表示变形前第 \(\alpha\) 滑移系滑移方向和滑移面法向的单位向量。 用 \({\boldsymbol{m}}^{*\left( \alpha \right)}\)\({\boldsymbol{n}}^{*\left( \alpha \right)}\) 分别表示晶格畸变后第 \(\alpha\) 滑移系的滑移方向和滑移面法向的单位向量。变形前与变形后第 \(\alpha\) 滑移系的滑移方向和滑移面法向的单位向量存在下列关系:

()\[{{\boldsymbol{m}}^{*\left( \alpha \right)}} = {{\boldsymbol{F}}^{\text{e}}}{{\boldsymbol{m}}^{\left( \alpha \right)}}, {{\boldsymbol{n}}^{*\left( \alpha \right)}} = {{\boldsymbol{n}}^{\left( \alpha \right)}} {\left( {{{\boldsymbol{F}}^{\rm{e}}}} \right)^{{\rm{ - }}1}}\]

晶格畸变后,滑移面的滑移方向 \({\boldsymbol{m}}^{*\left( \alpha \right)}\) 和法线方向 \({\boldsymbol{n}}^{*\left( \alpha \right)}\) 不再是单位向量, 但仍保持正交。

自然的,可定义变形速度梯度,即变形速度 \({\boldsymbol{v}}\) 对当前构型 \({\boldsymbol{x}}\) 的导数,也被称为速度梯度张量 \({\boldsymbol{L}}\)

()\[{\boldsymbol{L}} = \frac{{\partial {\boldsymbol{v}}}}{{\partial {{\boldsymbol{x}}}}} = {\boldsymbol{\dot F}}{{\boldsymbol{F}}^{ - 1}}\]

从引言的推导我们得知,这个速度梯度张量 \({\boldsymbol{L}}\) 不是客观张量,但由其得到的变形率张量 \({\boldsymbol{D}}\) 和弹性变形率张量 \({\boldsymbol{D}}^{\rm{e}}\) 是客观张量。要得到弹性变形率张量 \({\boldsymbol{D}}^{\rm{e}}\) 需要对 \({\boldsymbol{L}}\) 进行分解。

对应于前述变形梯度的乘法分解,将速度梯度速度梯度张量 \({\boldsymbol{L}}\) 分解为与晶格畸变和刚体转动相对应的弹性部分 \({{\boldsymbol{L}}^{\rm{e}}}\) 和与滑移相对应的塑性部分 \({{\boldsymbol{L}}^{\rm{p}}}\)

()\[{\boldsymbol{L}} = {{\boldsymbol{L}}^{\text{e}}}{{\boldsymbol{L}}^{\text{p}}}\]

其中, \({{\boldsymbol{L}}^{\rm{e}}}\)\({{\boldsymbol{L}}^{\rm{p}}}\) 分别为:

()\[{{\boldsymbol{L}}^{\rm{e}}} = {{{\boldsymbol{\dot F}}}^{\rm{e}}}{\left( {{{\boldsymbol{F}}^{\rm{e}}}} \right)^{ - 1}},\]
()\[\boldsymbol{L}^{\mathrm{p}}=\boldsymbol{F}^{\mathrm{e}} \dot{\boldsymbol{F}}^{\mathrm{p}} \left(\boldsymbol{F}^{\mathrm{p}}\right)^{-1}\left(\boldsymbol{F}^{\mathrm{e}}\right)^{-1}\]

假设晶体整体的塑性变形由各滑移系中滑移引起的剪切应变所确定,在初始构型或中间构型上,有:

()\[{{\boldsymbol{L}}^{\rm{p}}} = \dot{\boldsymbol{F}}^{\mathrm{p}}\left(\boldsymbol{F}^{\mathrm{p}}\right)^{-1} = \sum\limits_{\alpha = 1}^N {{{\dot \gamma }^{\left( \alpha \right)}}} {{\boldsymbol{m}}^{\left( \alpha \right)}} \otimes {{\boldsymbol{n}}^{\left( \alpha \right)}}\]

其中, \({{{\dot \gamma }^{\left( \alpha \right)}}}\) 表示第 \(\alpha\) 个滑移系的滑移剪切率,求和将对所有激活的滑移系进行。

利用变形前与变形后第 \(\alpha\) 滑移系的滑移方向和滑移面法向单位向量的关系,得到最终构型的 \({{\boldsymbol{L}}^{\rm{p}}}\) 表达式为:

()\[{{\boldsymbol{L}}^{\rm{p}}} = \sum\limits_{\alpha = 1}^N {{{\dot \gamma }^{\left( \alpha \right)}}} {{\boldsymbol{F}}^{\rm{e}}}{{\boldsymbol{m}}^{\left( \alpha \right)}} \otimes {{\boldsymbol{n}}^{\left( \alpha \right)}}{\left( {{{\boldsymbol{F}}^{\rm{e}}}} \right)^{ - 1}} = \sum\limits_{\alpha = 1}^N {{{\dot \gamma }^{\left( \alpha \right)}}} {{\boldsymbol{m}}^{*\left( \alpha \right)}} \otimes {{\boldsymbol{n}}^{*\left( \alpha \right)}}\]

速度梯度可以进一步分解为对称部分和反对称部分之和:

()\[{\boldsymbol{L}} = \frac{1}{2}\left( {{\boldsymbol{L}} + {{\boldsymbol{L}}^{\rm{T}}}} \right) + \frac{1}{2}\left( {{\boldsymbol{L}} - {{\boldsymbol{L}}^{\rm{T}}}} \right)\]

将速度梯度的对称部分定义为变形率张量:

()\[{\boldsymbol{D}} = \frac{1}{2}\left( {{\boldsymbol{L}} + {{\boldsymbol{L}}^{\rm{T}}}} \right)={{\boldsymbol{D}}^{\rm{e}}}+{{\boldsymbol{D}}^{\rm{p}}}\]

将速度梯度的反对称部分定义为旋率张量:

()\[{\boldsymbol{W}} = \frac{1}{2}\left( {{\boldsymbol{L}} - {{\boldsymbol{L}}^{\rm{T}}}} \right)={{\boldsymbol{W}}^{\rm{e}}}{\rm{ + }}{{\boldsymbol{W}}^{\rm{p}}}\]

将变形率张量 \({\boldsymbol{D}}\) 分解得到弹性变形率张量 \({{\boldsymbol{D}}^{\rm{e}}}\) 与塑性变形率张量 \({{\boldsymbol{D}}^{\rm{p}}}\)

()\[{{\boldsymbol{D}}^{\rm{e}}}= \frac{1}{2}\left( {{{\boldsymbol{L}}^{\rm{e}}} + {{\left( {{{\boldsymbol{L}}^{\rm{e}}}} \right)}^{\rm{T}}}} \right) = \frac{1}{2}\left( {{{{\boldsymbol{\dot F}}}^{\rm{e}}}{{\left( {{{\boldsymbol{F}}^{\rm{e}}}} \right)}^{ - 1}} + {{\left( {{{{\boldsymbol{\dot F}}}^{\rm{e}}}{{\left( {{{\boldsymbol{F}}^{\rm{e}}}} \right)}^{ - 1}}} \right)}^{\rm{T}}}} \right)\]
()\[{{\boldsymbol{D}}^{\rm{p}}}= \frac{1}{2}\left( {{{\boldsymbol{L}}^{\rm{p}}} + {{\left( {{{\boldsymbol{L}}^{\rm{p}}}} \right)}^{\rm{T}}}} \right) = \frac{1}{2}\left( {\sum\limits_{\alpha = 1}^N {{{\dot \gamma }^{\left( \alpha \right)}}} {{\boldsymbol{m}}^{*\left( \alpha \right)}} \otimes {{\boldsymbol{n}}^{*\left( \alpha \right)}} + {{\left( {\sum\limits_{\alpha = 1}^N {{{\dot \gamma }^{\left( \alpha \right)}}} {{\boldsymbol{m}}^{*\left( \alpha \right)}} \otimes {{\boldsymbol{n}}^{*\left( \alpha \right)}}} \right)}^{\rm{T}}}} \right)\]
()\[{{\boldsymbol{D}}^{\rm{p}}} = \sum\limits_{\alpha = 1}^N {\frac{1}{2}\left( {{{\boldsymbol{m}}^{*\left( \alpha \right)}} \otimes {{\boldsymbol{n}}^{*\left( \alpha \right)}} + {{\boldsymbol{n}}^{*\left( \alpha \right)}} \otimes {{\boldsymbol{m}}^{* \left(\alpha \right)}}} \right){{\dot \gamma }^{\left( \alpha \right)}}} = \sum\limits_{\alpha = 1}^N {{{\boldsymbol{P}}^{\left( \alpha \right)}}{{\dot \gamma }^{\left( \alpha \right)}}}\]

其中, \({\boldsymbol{P}}^{\left( \alpha \right)}\) 类似施密特因子, \({\boldsymbol{P}}^{\left( \alpha \right)}\) 的表达式为:

()\[{{\boldsymbol{P}}^{\left( \alpha \right)}} = \frac{1}{2}\left( {{{\boldsymbol{m}}^{*\left( \alpha \right)}} \otimes {{\boldsymbol{n}}^{*\left( \alpha \right)}} + {{\boldsymbol{n}}^{*\left( \alpha \right)}} \otimes {{\boldsymbol{m}}^{*\left( \alpha \right)}}} \right)\]

同理,可以得到弹性旋率张量 \({{\boldsymbol{W}}^{\rm{e}}}\) 和塑性旋率张量 \({{\boldsymbol{W}}^{\rm{p}}}\)

()\[{{\boldsymbol{W}}^{\rm{e}}} = \frac{1}{2}\left( {{{\boldsymbol{L}}^{\rm{e}}} - {{\left( {{{\boldsymbol{L}}^{\rm{e}}}} \right)}^{\rm{T}}}} \right) = \frac{1}{2}\left( {{{{\boldsymbol{\dot F}}}^{\rm{e}}}{{\left( {{{\boldsymbol{F}}^{\rm{e}}}} \right)}^{ - 1}} - {{\left( {{{{\boldsymbol{\dot F}}}^{\rm{e}}}{{\left( {{{\boldsymbol{F}}^{\rm{e}}}} \right)}^{ - 1}}} \right)}^{\rm{T}}}} \right)\]
()\[{{\boldsymbol{W}}^{\rm{p}}} = \frac{1}{2}\left( {{{\boldsymbol{L}}^{\rm{p}}} - {{\left( {{{\boldsymbol{L}}^{\rm{p}}}} \right)}^{\rm{T}}}} \right) = \sum\limits_{\alpha = 1}^N {\frac{1}{2}\left( {{{\boldsymbol{m}}^{*\left( \alpha \right)}} \otimes {{\boldsymbol{n}}^{*\left( \alpha \right)}} - {{\boldsymbol{n}}^{*\left( \alpha \right)}} \otimes {{\boldsymbol{m}}^{* \left( \alpha \right)}}} \right){{\dot \gamma }^{\left( \alpha \right)}}} = \sum\limits_{\alpha = 1}^N {{{\boldsymbol{\Omega}}^{\left( \alpha \right)}}{{\dot \gamma }^{\left( \alpha \right)}}}\]

其中 \(\boldsymbol{\Omega}^{(\alpha)}\) 的表达式为:

()\[{{\boldsymbol{\Omega }}^{\left( \alpha \right)}}= \frac{1}{2}\left( {{{\boldsymbol{m}}^{*\left( \alpha \right)}} \otimes {{\boldsymbol{n}}^{*\left( \alpha \right)}}{\rm{ - }}{{\boldsymbol{n}}^{*\left( \alpha \right)}} \otimes {{\boldsymbol{m}}^{*\left( \alpha \right)}}} \right)\]

以上晶体变形动力学的基本方程建立起了各滑移系剪切应变率与晶体宏观变形率之间的关系。下面将应力率、变形率及滑移剪切应变率联系起来,建立满足“客观性公理”的增量形式弹塑性本构关系。

3. 弹塑性本构关系

假设晶体材料的弹性性能不受滑移变形的影响,我们可建立满足“客观性公理”的增量形式弹性本构关系,表达式为:

()\[\hat{\boldsymbol{\sigma}}^{\rm{e}} = \mathbb{C}:{{\boldsymbol{D}}^{\rm{e}}}\]

其中, \({{\boldsymbol{D}}^{\rm{e}}}\) 是变形率 \({{\boldsymbol{D}}}\) 的弹性部分,即弹性变形率张量。 相应的, \(\hat{\boldsymbol{\sigma}}^{\rm{e}}\) 是 Jaumann 率 \(\hat{\boldsymbol{\sigma}}\) 的弹性部分,即弹性 Jaumann 率张量。

以 图1 初始构形为基础的柯西应力张量的 Jaumann率 表达式为:

()\[{\boldsymbol {\hat \sigma }} = {\boldsymbol {\dot \sigma }} - {\boldsymbol{W}} \cdot {\boldsymbol{\sigma}} + {\boldsymbol{\sigma}} \cdot {\boldsymbol{W}}\]

相应的将 \(\hat{\boldsymbol{\sigma}}^{\rm{e}}\) 表示为以 图1 中间构形为基准状态的Kirchhoff应力张量的Jaumann导数,则有:

()\[\hat{\boldsymbol{\sigma}}^{\mathrm{e}} = {\boldsymbol {\dot \sigma }} - {{\boldsymbol{W}}^{\rm{e}}} \cdot {\boldsymbol{\sigma}} + {\boldsymbol{\sigma}} \cdot {{\boldsymbol{W}}^{\rm{e}}}\]

结合上述两式,将柯西应力率 \({\boldsymbol {\dot \sigma }}\) 作替换, \(\hat{\boldsymbol{\sigma}}\) 可以表示为:

()\[\hat{\boldsymbol{\sigma}} =\hat{\boldsymbol{\sigma}}^{\mathrm{e}}-\boldsymbol{W}^{\mathrm{p}} \cdot \boldsymbol{\sigma}+\boldsymbol{\sigma} \cdot \boldsymbol{W}^{\mathrm{p}} ={\mathbb{C}}:{{\boldsymbol{D}}^{\rm{e}}} -{{\boldsymbol{W}}^{\rm{p}}} \cdot {\boldsymbol{\sigma }} + {\boldsymbol{\sigma }} \cdot {{\boldsymbol{W}}^{\rm{p}}}\]

\({{\boldsymbol{D}}^{\rm{e}}}\)\({{\boldsymbol{W}}^{\rm{p}}}\) 作替换,得到:

()\[{\boldsymbol{\hat \sigma }} = \mathbb{C}:\left( {{\boldsymbol{D}} - {{\boldsymbol{D}}^{\rm{p}}}} \right) - \sum\limits_{\alpha = 1}^N {{{\boldsymbol{Q}}^{\left( \alpha \right)}}{{\dot \gamma }^{\left( \alpha \right)}}}\]

其中,

()\[{{\boldsymbol{Q}}^{\left( \alpha \right)}} = {{\boldsymbol {\Omega }}^{\left( \alpha \right)}} \cdot {\boldsymbol{\sigma}} - {\boldsymbol{\sigma}} \cdot {{\boldsymbol {\Omega }}^{\left( \alpha \right)}}\]

得到:

()\[{\boldsymbol{\hat \sigma }}= \mathbb{C}:\left( {{\boldsymbol{D}} - \sum\limits_{\alpha = 1}^N {{{\boldsymbol{P}}^{\left( \alpha \right)}}{{\dot \gamma }^{\left( \alpha \right)}}} } \right) - \sum\limits_{\alpha = 1}^N {{{\boldsymbol{Q}}^{\left( \alpha \right)}}{{\dot \gamma }^{\left( \alpha \right)}}}\]

定义 \(\boldsymbol {S}^{(\alpha)}\) 为:

()\[\boldsymbol {S}^{(\alpha)} = \mathbb{C}:{{\boldsymbol{P}}^{\left( \alpha \right)}} + {{\boldsymbol {\Omega }}^{\left( \alpha \right)}} \cdot {\boldsymbol{\sigma}} - {\boldsymbol{\sigma}} \cdot {{\boldsymbol {\Omega }}^{\left( \alpha \right)}}\]

最后得到Jaumann率表达式为:

()\[{\boldsymbol{\hat \sigma }}= \mathbb{C}:{\boldsymbol{D}} - \sum\limits_{\alpha = 1}^N {\left[ {\mathbb{C}: {{\boldsymbol{P}}^{\left( \alpha \right)}} + {{\boldsymbol{\Omega }}^{\left( \alpha \right)}} \cdot {\boldsymbol {\sigma }} - {\boldsymbol {\sigma }} \cdot {{\boldsymbol{\Omega }}^{\left( \alpha \right)}}} \right]{{\dot \gamma }^{\left( \alpha \right)}}} = \mathbb{C}:{\boldsymbol{D}} - \sum\limits_{\alpha = 1}^N { \boldsymbol {S}^{(\alpha)} {{\dot \gamma }^{\left( \alpha \right)}}}\]

上式将应力率、变形率及滑移剪切应变率联系起来,表示了应力率、变形率和滑移剪切应变率之间的定量关联,即增量形式的弹塑性本构关系。

下一步的核心为确定所有可能开动滑移系的滑移剪切应变率 \(\dot{\gamma}^{(\alpha)}\)

4. 建立滑移系剪切应变演化唯象模型

在晶体塑性本构模型中,需要通过各滑移系的剪切应变率计算应力率。因此,首先需要确定各滑移系剪切应变的演化方程。在剪切应变的硬化方程中,广泛地采用幂函数的形式, 并且为了考虑晶体的循环塑性变形,引入各向同性强化项和随动强化项,建立如下混合强化模型:

()\[{{\dot \gamma }^{\left( \alpha \right)}} = {{\dot \gamma }_{0}^{\left( \alpha \right)}}{f^{\left( \alpha \right)}} \left( {\frac{{\left| {{\tau ^{\left( \alpha \right)}} - {\alpha ^{\left( \alpha \right)}}} \right| - {r^{\left( \alpha \right)}}}}{{{K^{\left( \alpha \right)}}}}} \right) = {{\dot \gamma }_{0}^{\left( \alpha \right)}} {\rm{sign}}\left( {{\tau ^{\left( \alpha \right)}} - {\alpha ^{\left( \alpha \right)}}} \right){\left\langle {\frac{{\left| {{\tau ^{\left( \alpha \right)}} - {\alpha ^{\left( \alpha \right)}}} \right| - {r^{\left( \alpha \right)}}}}{{{K^{\left( \alpha \right)}}}}} \right\rangle ^{p_{\text{s}}}}\]

式中, \(\dot{\gamma}^{(\alpha)}\) 为滑移系 \(\alpha\) 的剪切应变率; \(\tau^{(\alpha)}\) 为滑移系 \(\alpha\) 的分解剪应力; \(\alpha^{(\alpha)}\)\(r^{(\alpha)}\) 分别为滑移系 \(\alpha\) 的背应力项(随动强化项)和各向同性强化项。 另外, \({{\dot \gamma }_{0}^{\left( \alpha \right)}}\) 为滑移系 \(\alpha\) 的参考剪切应变率, \({p_{\text{s}}}\) 为应变速率敏感指数, 当 \({p_{\text{s}}} \rightarrow \infty\) 时,接近于应变速率无关的情况,但此时计算不稳定。 \(K^{(\alpha)}\) 为参考屈服强度,是取决于温度和滑移系种类的材料常数。

下面介绍 \(\tau^{(\alpha)}\)\(\alpha^{(\alpha)}\)\(r^{(\alpha)}\) 的演化方程 \({{\dot \tau }^{\left( \alpha \right)}}\)\(\dot{\alpha}^{(\alpha)}\)\(\dot{r}^{(\alpha)}\)

首先确定 \({{\dot \tau }^{\left( \alpha \right)}}\) ,滑移系上的分解剪应力 \({\tau ^{\left( \alpha \right)}}\) 定义为:

()\[{\tau ^{\left( \alpha \right)}} = {{\boldsymbol{P}}^{\left( \alpha \right)}}:{\boldsymbol{\sigma}}\]

所以分解剪应力 \({\tau ^{\left( \alpha \right)}}\) 对时间的导数 \({\dot \tau }\) 的表达形式为:

()\[{{\dot \tau }^{\left( \alpha \right)}} = {{{\boldsymbol{\dot P}}}^{\left( \alpha \right)}}:{\boldsymbol{\sigma}} + {{\boldsymbol{P}}^{\left( \alpha \right)}}:{\boldsymbol{ \dot \sigma}}\]

其中, \({{{\boldsymbol{\dot P}}}^{\left( \alpha \right)}}\) 可用下列式子表示:

()\[{{{\boldsymbol{\dot P}}}^{\left( \alpha \right)}} = {{\boldsymbol{D}}^{\rm{e}}}{{\boldsymbol{\Omega }}^{\left( \alpha \right)}} + {{\boldsymbol{W}}^{\rm{e}}}{{\boldsymbol{P}}^{\left( \alpha \right)}} - {{\boldsymbol{\Omega }}^{\left( \alpha \right)}}{{\boldsymbol{D}}^{\rm{e}}} - {{\boldsymbol{P}}^{\left( \alpha \right)}}{{\boldsymbol{W}}^{\rm{e}}}\]

\({{{\boldsymbol{\dot P}}}^{\left( \alpha \right)}}\)\({\boldsymbol{ \dot \sigma}}\) 代入 \({\dot \tau }\) 的表达式,并化简得到:

()\[{{\dot \tau }^{\left( \alpha \right)}} =\left( {\mathbb{C}:{{\boldsymbol{P}}^{\left( \alpha \right)}} + {{\boldsymbol{\Omega }}^{\left( \alpha \right)}}{\boldsymbol{\sigma }} - {\boldsymbol{\sigma }} {{\boldsymbol{\Omega }}^{\left( \alpha \right)}}} \right):(\boldsymbol {D}-{{\boldsymbol{D}}^{\rm{p}}})\]

\(\boldsymbol {S}^{(\alpha)}\)\({{\boldsymbol{D}}^{\rm{p}}}\) 代入上式得到 \(\tau^{(\alpha)}\) 的演化方程:

()\[{{\dot \tau }^{\left( \alpha \right)}} = \boldsymbol {S}^{(\alpha)} :(\boldsymbol {D}-{{\boldsymbol{D}}^{\rm{p}}}) = \boldsymbol {S}^{(\alpha)} : \left( {\boldsymbol{D}} - \sum\limits_{\alpha = 1}^N {{{\boldsymbol{P}}^{\left( \alpha \right)}}{{\dot \gamma }^{\left( \alpha \right)}}} \right)\]

背应力 \(\dot{\alpha}^{(\alpha)}\) 的演化方程为:

()\[\dot{\alpha}^{(\alpha)}=c_{1} \dot{\gamma}^{(\alpha)}-c_{2}\left|\dot{\gamma}^{(\alpha)}\right| \alpha^{(\alpha)}\]

式中, \(c_{1} \dot{\gamma}^{(\alpha)}\) 为背应力 \(\dot{\alpha}^{(\alpha)}\) 关于剪切应变 \(\dot{\gamma}^{(\alpha)}\) 的线性项; \(c_{2}\left|\dot{\gamma}^{(\alpha)}\right| \alpha^{(\alpha)}\) 为背应力 \(\dot{\alpha}^{(\alpha)}\) 关于剪切应变 \(\dot{\gamma}^{(\alpha)}\) 的非线性项。 \(c_{1}\)\(c_{2}\) 为取决于温度和滑移系种类的材料常数。

其中各向同性强化项 \(\dot{r}^{(\alpha)}\) 的演化方程为:

()\[{{\dot r}^{\left( \alpha \right)}} = b_s Q_s \sum\limits_\beta {{h_{\alpha \beta }}{{\dot \rho }^{\left( \beta \right)}}}\]

式中,引入各向同性状态变量 \(\rho^{(\beta)}\) 描述晶体滑移中的位错硬化;引入交互作用系数矩阵 \(h_{\alpha \beta}\) 描述滑移系间的交叉硬化, 其对角线项表示滑移系的 “自硬化”,非对角线项表示由于滑移系间的耦合效应造成的 “潜在硬化”。对于给定的一组包含每个滑移系 \(\rho^{(\beta)}\) 的位错状态, 硬化将由系数 \(Q_s\) 来确定。 \(b_s\)\(Q_s\) 为取决于温度和滑移系种类的材料常数。因此有:

()\[r^{(\alpha)}=r_{0}^{(\alpha)}+b_s Q_s \sum_{\beta} h_{\alpha \beta} \rho^{(\beta)}\]

滑移系 \(\alpha\) 的各向同性强化项 \(r^{(\alpha)}\) 由滑移系 \(\alpha\) 的临界分解剪应力(初始阻应力) \(r_{0}^{(\alpha)}\) 和所有激活滑移系的位错状态变量 \(\rho^{(\beta)}\) 共同确定。从冶金学的角度来看, 该方程从左到右描述了基体带来的固溶硬化 \(r_{0}^{(\alpha)}\) 和位错硬化 \(b_s Q_s \sum_{\beta} h_{\alpha \beta} \rho^{(\beta)}\)

在各向同性强化项 \(\dot{r}^{(\alpha)}\) 中,采用非线性饱和形式的方程表示各向同性状态变量 \(\rho^{(\beta)}\),则有:

()\[\dot{\rho}^{(\beta)}=\left(1-b_s \rho^{(\beta)}\right)\left|\dot{\gamma}^{(\beta)}\right|\]

其中,状态变量 \(\rho^{(\beta)}\) 对应于可以进入 \(\gamma\) 通道的临界位错密度。

因此可以得到 \(\dot{r}^{(\alpha)}\)\(r^{(\alpha)}\) 的完整表达式:

()\[\dot{r}^{(\alpha)}=b_s Q_s \sum_{\beta} h_{\alpha \beta}\left(1-b_s \rho^{(\beta)}\right)\left|\dot{\gamma}^{(\beta)}\right|\]
()\[r^{(\alpha)}=r_{0}^{(\alpha)}+b_s Q_s \sum_{\beta} h_{\alpha \beta}\left(1-b_s \rho^{(\beta)}\right)\left|\gamma^{(\beta)}\right|\]

通过上述推导,方程 \({{\dot \gamma }^{\left( \alpha \right)}}\) 建立了能够描述晶体循环变形中各向同性强化和随动强化的剪切应变硬化方程。 利用计算得到的各滑移系中的剪切应变增量和晶体塑性理论中的本构关系,即可得到宏观应力增量,下面将详细介绍混合强化模型的数值离散过程。

5 数值离散求解

如果将晶体塑性本构模型与基于位移场的求解有限元软件相结合,主要包含两个基本任务:一是通过积分点处的变形计算应力值,二是更新当前积分点的一致性切线刚度矩阵。 而应力和切线刚度矩阵的更新则依赖于所有开动滑移系的剪切应变增量 \(\Delta \gamma^{(\alpha)}\) 的求解。

5.1 求解应力应变增量以及相关内变量初值

在速率相关晶体塑性本构模型的计算中,为了保证数值计算的稳定性,Peirce等人采用切线系数法改进方程 \({{\dot \gamma }^{\left( \alpha \right)}}\) 的计算。 令时间步长 \(\Delta t\) 对应的剪切应变增量为 \(\Delta \gamma^{(\alpha)}\) ,采用线性中心差分格式,则有:

()\[\Delta \gamma^{(\alpha)}=\Delta t\left[(1-\theta) \dot{\gamma}^{(\alpha)}(t)+\theta \dot{\gamma}^{(\alpha)}(t+\Delta t)\right]\]

其中, \(\theta\) 的取值范围为 0 至 1 \((0 \leqslant \theta \leqslant 1)\) ,其推荐取值范围为 0.5。 用式 \({{\dot \gamma }^{\left( \alpha \right)}}\) 的泰勒展开式近似地表示 \(\Delta \gamma^{(\alpha)}\) 中的最后一项:

()\[{{\dot \gamma }^{\left( \alpha \right)}}\left( {t + \Delta t} \right) = {{\dot \gamma }^{\left( \alpha \right)}}\left( t \right) + {\left. {\frac{{\partial {{\dot \gamma }^{(\alpha )}}}}{{\partial {\tau ^{(\alpha )}}}}} \right|_t}\Delta {\tau ^{\left( \alpha \right)}} +{\left. {\frac{{\partial {{\dot \gamma }^{(\alpha )}}}}{{\partial {\alpha ^{(\alpha )}}}}} \right|_t}\Delta {\alpha ^{\left( \alpha \right)}} + {\left. {\frac{{\partial {{\dot \gamma }^{(\alpha )}}}}{{\partial {r^{(\alpha )}}}}} \right|_t}\Delta {r^{\left( \alpha \right)}}\]

可得剪切应变增量方程 \(\Delta \gamma^{(\alpha)}\)

()\[\Delta {\gamma ^{\left( \alpha \right)}} = \Delta t\left[ {{{\dot \gamma }^{\left( \alpha \right)}}\left( t \right) + \theta {{\left. {\frac{{\partial {{\dot \gamma }^{(\alpha )}}}}{{\partial {\tau ^{(\alpha )}}}}} \right|}_t}\Delta {\tau ^{\left( \alpha \right)}} +\theta {{\left. {\frac{{\partial {{\dot \gamma }^{(\alpha )}}}} {{\partial {\alpha ^{(\alpha )}}}}} \right|}_t}\Delta {\alpha ^{\left( \alpha \right)}} + \theta {{\left. {\frac{{\partial {{\dot \gamma }^{(\alpha )}}}}{{\partial {r^{(\alpha )}}}}} \right|}_t}\Delta {r^{\left( \alpha \right)}}} \right]\]

下面,确定 \(\tau^{(\alpha)}\)\(\alpha^{(\alpha)}\)\(r^{(\alpha)}\) 的离散形式 \(\Delta \tau^{(\alpha)}\)\(\Delta \alpha^{(\alpha)}\)\(\Delta r^{(\alpha)}\)

\({\dot \tau }\) 进行积分,得到分解剪应力离散格式 \(\Delta \tau^{(\alpha)}\)

()\[\Delta \tau^{(\alpha)} = {{\dot \tau }^{\left( \alpha \right)}} \Delta t=\boldsymbol{S}^{(\alpha)}: \Delta \boldsymbol{\varepsilon}-\boldsymbol {S}^{(\alpha)}: \sum_{\beta=1}^{N} \boldsymbol {P}^{(\beta)} \Delta \gamma^{(\beta)} = \boldsymbol{S}^{(\alpha)}: \left(\Delta \boldsymbol{\varepsilon}- \sum_{\beta=1}^{N} \boldsymbol {P}^{(\beta)} \Delta \gamma^{(\beta)} \right)\]

\({\dot \alpha }\) 进行积分,得到背应力的离散格式 \(\Delta \alpha^{(\alpha)}\)

()\[\Delta \alpha^{(\alpha)}=c_{1} \Delta \gamma^{(\alpha)}-c_{2}\left|\Delta \gamma^{(\alpha)}\right| \alpha^{(\alpha)}\]

\({\dot r }\) 进行积分,得到各向同性强化项的离散格式 \(\Delta r^{(\alpha)}\)

()\[\Delta r^{(\alpha)}=b_s Q_s \sum_{\beta} h_{\alpha \beta}\left(1-b_s \rho^{(\beta)}\right)\left|\Delta \gamma^{(\beta)}\right|\]

令:

()\[\left\langle X^{\left( \alpha \right)} \right\rangle = \left\langle {\frac{{\left| {{\tau ^{\left( \alpha \right)}} - {\alpha ^{\left( \alpha \right)}}} \right| - {r^{\left( \alpha \right)}}}}{{{K^{\left( \alpha \right)}}}}} \right\rangle\]

得到混合强化模型:

()\[{f^{\left( \alpha \right)}} = {\rm{sign}}\left( {{\tau ^{\left( \alpha \right)}} - {\alpha ^{(\alpha )}}} \right){\left\langle X^{\left( \alpha \right)} \right\rangle ^{p_s}}\]

接下来采用链式法则,对每一项分别求导:

()\[\frac{{\partial {f^{\left( \alpha \right)}}}}{{\partial \left\langle X^{\left( \alpha \right)} \right\rangle }} = {\rm{sign}}\left( {{\tau ^{\left( \alpha \right)}} - {\alpha ^{(\alpha )}}} \right){p_{\text{s}}}{\left\langle X^{\left( \alpha \right)} \right\rangle ^{{p_s}{\rm{ - 1}}}}\]
()\[\frac{{\partial \left\langle X^{\left( \alpha \right)} \right\rangle }}{{\partial {\tau ^{\left( \alpha \right)}}}} = \frac{1}{{{K^{ \left( \alpha \right)}}}}{\rm{sign}}\left( {{\tau ^{\left( \alpha \right)}} - {\alpha ^{\left( \alpha \right)}}} \right) H(X^{\left( \alpha \right)})\]
()\[\frac{{\partial \left\langle X^{\left( \alpha \right)} \right\rangle }}{{\partial {\alpha ^{\left( \alpha \right)}}}} = - \frac{1}{{{K^{\left( \alpha \right)}}}}{\rm{sign}}\left( {{\tau ^{\left( \alpha \right)}} - {\alpha ^{\left( \alpha \right)}}} \right) H(X^{\left( \alpha \right)})\]
()\[\frac{{\partial \left\langle X^{\left( \alpha \right)} \right\rangle }}{{\partial {r^{\left( \alpha \right)}}}} = - \frac{1}{{{K^{\left( \alpha \right)}}}} H(X^{\left( \alpha \right)})\]

所以有:

()\[\frac{{\partial {{\dot \gamma }^{\left( \alpha \right)}}}}{{\partial {\tau ^{\left( \alpha \right)}}}} = {{\dot \gamma }_{0}^{\left( \alpha \right)}}\frac{{\partial {f^{\left( \alpha \right)}}}}{{\partial {\tau ^{\left( \alpha \right)}}}} = {{\dot \gamma }_{0}^{\left( \alpha \right)}}\frac{{\partial {f^{\left( \alpha \right)}}}} {{\partial \left| X^{\left( \alpha \right)} \right|}}\frac{{\partial \left| X^{\left( \alpha \right)} \right|}}{{\partial {\tau ^{\left( \alpha \right)}}}} = {{\dot \gamma }_{0}^{\left( \alpha \right)}}{p_{\text{s}}}{\left\langle X^{\left( \alpha \right)} \right\rangle ^{{p_s}{\rm{ - 1}}}}\frac{1}{{{K^{\left( \alpha \right)}}}} H(X^{\left( \alpha \right)})\]
()\[\frac{{\partial {{\dot \gamma }^{\left( \alpha \right)}}}}{{\partial {\alpha ^{\left( \alpha \right)}}}} = {{\dot \gamma }_{0}^{\left( \alpha \right)}}\frac{{\partial {f^{\left( \alpha \right)}}}}{{\partial {\alpha ^{\left( \alpha \right)}}}} = {{\dot \gamma }_{0}^{\left( \alpha \right)}}\frac{{\partial {f^{\left( \alpha \right)}}}} {{\partial \left| X^{\left( \alpha \right)} \right|}}\frac{{\partial \left| X^{\left( \alpha \right)} \right|}}{{\partial {\alpha ^{\left( \alpha \right)}}}} = - {{\dot \gamma }_{0}^{\left( \alpha \right)}}{p_{\text{s}}}{\left\langle X^{\left( \alpha \right)} \right\rangle ^{{p_s}{\rm{ - 1}}}}\frac{1}{{{K^{\left( \alpha \right)}}}} H(X^{\left( \alpha \right)})\]
()\[\frac{{\partial {{\dot \gamma }^{\left( \alpha \right)}}}}{{\partial {r^{\left( \alpha \right)}}}} = {{\dot \gamma }_{0}^{\left( \alpha \right)}}\frac{{\partial {f^{\left( \alpha \right)}}}}{{\partial {r^{\left( \alpha \right)}}}} = {{\dot \gamma }_{0}^{\left( \alpha \right)}}\frac{{\partial {f^{\left( \alpha \right)}}}}{{\partial \left| X^{\left( \alpha \right)} \right|}}\frac{{\partial \left| X^{\left( \alpha \right)} \right|}}{{\partial {r^{\left( \alpha \right)}}}} = - {{\dot \gamma }_{0}^{\left( \alpha \right)}}{p_{\text{s}}}{\left\langle X^{\left( \alpha \right)} \right\rangle ^{{p_s}{\rm{ - 1}}}}\frac{1}{{{K^{\left( \alpha \right)}}}}{\rm{sign}}\left( {{\tau ^{\left( \alpha \right)}} - {\alpha ^{(\alpha )}}} \right) H(X^{\left( \alpha \right)})\]

将上面的式子带入式 \(\Delta \gamma^{(\alpha)}\) ,将每个滑移系 \(\alpha\) 的剪切应变增量 \(\Delta \gamma^{(\alpha)}\) 写成矩阵形式,可得:

()\[\begin{split}\Delta {\gamma ^{\left( \alpha \right)}} = \Delta t\left[ \begin{array}{l} {{\dot \gamma }^{\left( \alpha \right)}}\left( t \right)\\ + \theta {{\dot \gamma }_{0}^{\left( \alpha \right)}}{p_{\text{s}}}{\left\langle X^{\left( \alpha \right)} \right\rangle ^{{p_s}{\rm{ - 1}}}}\frac{1}{{{K^{\left( \alpha \right)}}}} H(X^{\left( \alpha \right)}) \Delta {\tau ^{\left( \alpha \right)}} \\ - \theta {{\dot \gamma }_{0}^{\left( \alpha \right)}}{p_{\text{s}}}{\left\langle X^{\left( \alpha \right)} \right\rangle ^{{p_s}{\rm{ - 1}}}}\frac{1}{{{K^{\left( \alpha \right)}}}} H(X^{\left( \alpha \right)}) \Delta {\alpha ^{\left( \alpha \right)}}\\ - \theta {{\dot \gamma }_{0}^{\left( \alpha \right)}}{p_{\text{s}}}{\left\langle X^{\left( \alpha \right)} \right\rangle ^{{p_s}{\rm{ - 1}}}}\frac{1}{{{K^{\left( \alpha \right)}}}} H(X^{\left( \alpha \right)}) {\rm{sign}}\left( {{\tau ^{\left( \alpha \right)}} - {\alpha ^{(\alpha )}}} \right)\Delta {r^{\left( \alpha \right)}} \end{array} \right]\end{split}\]

进一步将 \(\Delta \tau^{(\alpha)}\)\(\Delta \alpha^{(\alpha)}\)\(\Delta r^{(\alpha)}\) 的表达式代入剪切应变增量方程 \(\Delta \gamma^{(\alpha)}\) ,同时注意到 \(\langle X^{\left( \alpha \right)}\rangle^{{p_s}-1} H(X^{\left( \alpha \right)})=\langle X^{\left( \alpha \right)}\rangle^{{p_s}-1}\) ,可以得到:

()\[\begin{split}\sum\limits_{\beta = 1}^N {{\delta _{\alpha \beta }}\Delta {\gamma ^{\left( \beta \right)}}} {\rm{ = }}\Delta t\left[ \begin{array}{l} {{\dot \gamma }^{\left( \alpha \right)}}\left( t \right)\\ + \theta {{\dot \gamma }_{0}^{\left( \alpha \right)}}{p_{\text{s}}}{\left\langle X^{\left( \alpha \right)} \right\rangle ^{{p_s}{\rm{ - 1}}}}\frac{1}{{{K^{\left( \alpha \right)}}}}\left[ {{{\boldsymbol{S}}^{\left( \alpha \right)}}:\Delta {\boldsymbol{\varepsilon }} - {{\boldsymbol{S}}^{\left( \alpha \right)}}:\sum\limits_{\beta = 1}^N {{{\boldsymbol{P}}^{\left( \beta \right)}}\Delta {\gamma ^{\left( \beta \right)}}} } \right]\\ - \theta {{\dot \gamma }_{0}^{\left( \alpha \right)}}{p_{\text{s}}}{\left\langle X^{\left( \alpha \right)} \right\rangle ^{{p_s}{\rm{ - 1}}}}\frac{1}{{{K^{\left( \alpha \right)}}}}\left( {{c_1}\sum\limits_{\beta = 1}^N {{\delta _{\alpha \beta }}\Delta {\gamma ^{\left( \beta \right)}}} - {c_2}{\rm{sign}}\left( {{{\dot \gamma }^{\left( \beta \right)}}} \right)\sum\limits_{\beta = 1}^N {{\delta _{\alpha \beta }}\Delta {\gamma ^{\left( \beta \right)}}} {\alpha ^{\left( \alpha \right)}}} \right)\\ - \theta {{\dot \gamma }_{0}^{\left( \alpha \right)}}{p_{\text{s}}}{\left\langle X^{\left( \alpha \right)} \right\rangle ^{{p_s}{\rm{ - 1}}}}\frac{1}{{{K^{\left( \alpha \right)}}}}{\rm{sign}}\left( {{\tau ^{\left( \alpha \right)}} - {\alpha ^{(\alpha )}}} \right)bQ\sum\limits_\beta {{h_{\alpha \beta }}\left( {1 - b_s{\rho ^{\left( \beta \right)}}} \right)\left| {\Delta {\gamma ^{\left( \beta \right)}}} \right|} \end{array} \right]\end{split}\]

合并式子:

()\[\begin{split}\begin{aligned} \begin{array}{l} \sum\limits_{\beta = 1}^N {\left[ \begin{array}{l} {\delta _{\alpha \beta }}\\ + \Delta t\theta {{\dot \gamma }_{0}^{\left( \alpha \right)}}{p_{\text{s}}}{\left\langle X^{\left( \alpha \right)} \right\rangle ^{{p_s}{\rm{ - 1}}}}\frac{1}{{{K^{\left( \alpha \right)}}}}{{\boldsymbol{S}}^{\left( \alpha \right)}}:{{\boldsymbol{P}}^{\left( \beta \right)}}\\ + \Delta t\theta {{\dot \gamma }_{0}^{\left( \alpha \right)}}{p_{\text{s}}}{\left\langle X^{\left( \alpha \right)} \right\rangle ^{{p_s}{\rm{ - 1}}}}\frac{1}{{{K^{\left( \alpha \right)}}}}{\delta _{\alpha \beta }}\left( {{c_1} - {c_2}{\rm{sign}}\left( {{{\dot \gamma }^{\left( \beta \right)}}} \right){\alpha ^{\left( \alpha \right)}}} \right)\\ + \Delta t\theta {{\dot \gamma }_{0}^{\left( \alpha \right)}}{p_{\text{s}}}{\left\langle X^{\left( \alpha \right)} \right\rangle ^{{p_s}{\rm{ - 1}}}}\frac{1}{{{K^{\left( \alpha \right)}}}}{\rm{sign}}\left( {{\tau ^{\left( \alpha \right)}} - {\alpha ^{(\alpha )}}} \right)bQ{h_{\alpha \beta }}\left( {1 - b_s{\rho ^{\left( \beta \right)}}} \right){\rm{sign}}\left( {{{\dot \gamma }^{\left( \beta \right)}}} \right) \end{array} \right]\Delta {\gamma ^{\left( \beta \right)}}} \\ = \Delta t{{\dot \gamma }^{\left( \alpha \right)}}\left( t \right) + \Delta t\theta {{\dot \gamma }_{0}^{\left( \alpha \right)}}{p_{\text{s}}}{\left\langle X^{\left( \alpha \right)} \right\rangle ^{{p_s}{\rm{ - 1}}}}\frac{1}{{{K^{\left( \alpha \right)}}}}{{\boldsymbol{S}}^{\left( \alpha \right)}}:\Delta {\boldsymbol{\varepsilon }} \end{array} \end{aligned}\end{split}\]

编程过程中为了简化计算,引入一些临时变量:

()\[term1 := \Delta t \theta\]
()\[term2 := term1 \cdot {{\dot \gamma }_{0}^{\left( \alpha \right)}} {p_{\text{s}}}\langle X^{\left( \alpha \right)}\rangle^{{p_s}-1} \cdot \frac{1}{{{K^{\left( \alpha \right)}}}}\]
()\[term4 := \boldsymbol{S}^{(\alpha)}: \boldsymbol{P}^{(\beta)}\]

整理得到引入线性背应力项(随动强化项)和各向同性强化模型的迭代格式为由 \(N\) 个末知数 \(\Delta \gamma^{(\beta)}\)\(N\) 个非线性方程组成的方程组:

()\[\begin{split}\begin{aligned} & \left[\begin{array}{l} \delta_{\alpha \beta} \\ +term2 \cdot term4\\ + term2 \cdot {\delta _{\alpha \beta }}\left( {{c_1} - {c_2}{\rm{sign}}\left( {{{\dot \gamma }^{\left( \beta \right)}}} \right){\alpha ^{\left( \alpha \right)}}} \right)\\ {\rm{ + }}term2 \cdot {\rm{sign}}\left( {{\tau ^{\left( \alpha \right)}} - {\alpha ^{(\alpha )}}} \right) \cdot bQ{h_{\alpha \beta }}\left( {1 - b_s{\rho ^{\left( \beta \right)}}} \right) \cdot {\rm{sign}}\left( {{{\dot \gamma }^{\left( \beta \right)}}} \right) \end{array}\right] \Delta \gamma^{(\alpha)} \\ & =\Delta t \dot{\gamma}^{(\alpha)}(t)+term2 \cdot \boldsymbol {S}^{(\alpha)}: \Delta {\boldsymbol{\varepsilon }} \end{aligned}\end{split}\]

其中,上标 \(\alpha\) 表示第 \(\alpha\) 个滑移系( \(\alpha=1 \sim N,N\) 为所有可能开动滑移系的数目), 等式右边的 \(\Delta {\boldsymbol{\varepsilon }}\) 为已知项。求解该非线性方程组可以得到所有滑移系的初始剪切应变增量 \(\Delta \gamma^{(\alpha)}\), 进而计算应力增量 \(\Delta \boldsymbol{\sigma}\) 和其他状态变量的初始增量。

将上面的方程组简写为以下形式:

()\[\boldsymbol {A} \Delta {\gamma ^{\left( \alpha \right)}} = \Delta t{{\dot \gamma }^{\left( \alpha \right)}}\left( t \right) + term2 \cdot {{\boldsymbol{S}}^{\left( \alpha \right)}}:\Delta {\boldsymbol{\varepsilon }}\]

方程两边对 \(\Delta {\boldsymbol{\varepsilon }}\) 求偏导得到:

()\[\boldsymbol {A} \frac{{\partial \Delta {\gamma ^{\left( \alpha \right)}}}}{{\partial \Delta {\boldsymbol{\varepsilon }}}} = term2 \cdot {{\boldsymbol{S}}^{\left( \alpha \right)}}\]

所以有:

()\[ddgdde^{(\alpha)} = \frac{{\partial \Delta {\gamma ^{\left( \alpha \right)}}}}{{\partial \Delta {\boldsymbol{\varepsilon }}}} = {{\boldsymbol {A}}^{ - 1}} \cdot term2 \cdot {{\boldsymbol{S}}^{\left( \alpha \right)}}\]

在第三节,我们已经得到 Jaumann率 表达式为:

()\[{\boldsymbol{\hat \sigma }} = \mathbb{C}:{\boldsymbol{D}} - \sum\limits_{\alpha = 1}^N { \boldsymbol {S}^{(\alpha)} {{\dot \gamma }^{\left( \alpha \right)}}}\]

对 Jaumann 率进行时间积分,我们得到:

()\[\Delta {\boldsymbol{\sigma}} = \mathbb{C}:{\Delta {\boldsymbol{\varepsilon }}} - \sum\limits_{\alpha = 1}^N {\boldsymbol {S}^{(\alpha)} {\Delta { \gamma }^{\left( \alpha \right)}}}\]

进而,我们可以得到,弹性模量张量的弹性部分, 即 \(ddsdde\) 矩阵为:

()\[ddsdde = \frac{\partial {\Delta {\boldsymbol{\sigma }^{(\alpha)}}}}{\partial {\Delta \boldsymbol{\varepsilon }}} = \mathbb{C} - \sum\limits_{\alpha = 1}^N { \boldsymbol {S}^{(\alpha)} \frac{{\partial \Delta {\gamma ^{\left( \alpha \right)}}}}{{\partial \Delta {\boldsymbol{\varepsilon }}}}} = \mathbb{C} - \sum\limits_{\alpha = 1}^N \boldsymbol {S}^{(\alpha)} \cdot ddgdde^{(\alpha)}\]
5.2 迭代求解剪切应变增量以及更新切线刚度矩阵

采用牛顿拉夫森迭代方法进行迭代求解。在上面的推导中,初始剪切应变增量 \({{{\left\{ {\Delta {\gamma ^{\left( \alpha \right)}}} \right\}}^{\left( k \right)}}}\) 是我们利用 5.1 节的非线性方程组求出的近似值。假设初始剪切应变增量与真实剪切应变增量 \(\Delta \gamma^{(\alpha)}\) 之间的误差 Residual为 \(R\)

我们可以写出 \(R\) 的表达式:

()\[R = F \left( {{{\left\{ {\Delta {\gamma ^{\left( \alpha \right)}}} \right\}}^{\left( k \right)}}} \right) = {{{\left\{ {\Delta {\gamma ^{\left( \alpha \right)}}} \right\}}^{\left( k \right)}}} - \Delta t\left( {1 - \theta } \right){{\dot \gamma }^{\left( \alpha \right)}}\left( t \right) - \Delta t\theta {{\dot \gamma }^{\left( \alpha \right)}}\left( {t + \Delta t} \right)\]

上式就是牛顿拉弗森法迭代的目标函数。我们要做的就是对这个函数上的点做切线,并求切线的零点。即使得Residual为 0 或接近我们的预设阈值 tolerance ,可用数学式表达为:

()\[F'\left( {{{\left\{ {\Delta {\gamma ^{\left( \alpha \right)}}} \right\}}^{\left( k \right)}}} \right) \cdot \Delta {\left\{ {\Delta {\gamma ^{\left( \alpha \right)}}} \right\}^{\left( {k + 1} \right)}} = 0 - F\left( {{{\left\{ {\Delta {\gamma ^{\left( \alpha \right)}}} \right\}}^{\left( k \right)}}} \right)\]

其中,

()\[{\left\{ {\Delta {\gamma ^{\left( \alpha \right)}}} \right\}^{\left( {k + 1} \right)}} = {\left\{ {\Delta {\gamma ^{\left( \alpha \right)}}} \right\}^{\left( k \right)}} + \Delta {\left\{ {\Delta {\gamma ^{\left( \alpha \right)}}} \right\}^{\left( {k + 1} \right)}}\]

当初值计算完成后,获得了新的 \(\left\{ {X^{\left( \alpha \right)}} \right\}^{\left( {k + 1} \right)}\)

()\[\left\{ {X^{\left( \alpha \right)}} \right\}^{\left( {k + 1} \right)} = \frac{{\left| {\tau _t^{\left( \alpha \right)} + {\left\{ {\Delta {\tau ^{\left( \alpha \right)}}} \right\}^{\left( {k + 1} \right)}} - \left( {\alpha _t^{\left( \alpha \right)} +{\left\{ {\Delta {\alpha ^{\left( \alpha \right)}}} \right\}^{\left( {k + 1} \right)}}} \right)} \right| - \left( {r_t^{\left( \alpha \right)} + {\left\{ {\Delta {r^{\left( \alpha \right)}}} \right\}^{\left( {k + 1} \right)}}} \right)}}{{{K^{\left( \alpha \right)}}}}\]

进而可得到即将用于牛顿拉夫森迭代的剪切应变速率表达式:

()\[{\left\{ {\dot \gamma _{t + \Delta t}^{\left( \alpha \right)}} \right\}^{\left( {k + 1} \right)}} = {{\dot \gamma }_{0}^{\left( \alpha \right)}}{\left\langle \left\{ {X^{\left( \alpha \right)}} \right\}^{\left( {k + 1} \right)} \right\rangle ^{p_s}}{\text{sign}}\left( {\tau _t^{\left( \alpha \right)} + {\left\{ {\Delta {\alpha ^{\left( \alpha \right)}}} \right\}^{\left( {k + 1} \right)}} - \left( {\alpha _t^{\left( \alpha \right)} +{\left\{ {\Delta {\alpha ^{\left( \alpha \right)}}} \right\}^{\left( {k + 1} \right)}}} \right)} \right)\]

参考 5.1 节的推导,最后我们得到迭代求解该非线性方程组的所有滑移系的剪切应变增量的方程组:

()\[{\boldsymbol{A}}^{\left( k + 1 \right)} \left( {{{\left\{ {\Delta {\gamma ^{\left( \alpha \right)}}} \right\}}^{\left( k \right)}}} \right) \cdot \Delta {\left\{ {\Delta {\gamma ^{\left( \alpha \right)}}} \right\}^{\left( {k + 1} \right)}} = \left\{ {rhs} \right\}^{\left( {k} \right)}\]

其中,刚度矩阵 \({\boldsymbol{A}}^{\left( k + 1 \right)} \left( {{{\left\{ {\Delta {\gamma ^{\left( \alpha \right)}}} \right\}}^{\left( k \right)}}} \right)\) 为:

()\[\begin{split}{\boldsymbol{A}}^{\left( k + 1 \right)} = F'\left( {{{\left\{ {\Delta {\gamma ^{\left( \alpha \right)}}} \right\}}^{\left( k \right)}}} \right) = \left[ {\begin{array}{*{20}{l}} {{\delta _{\alpha \beta }}} \\ { + term2 \cdot term4} \\ { + term2 \cdot {\delta _{\alpha \beta }}\left( {{c_1} - {c_2}{\alpha ^{(\alpha )}}{\text{sign}}\left( {{{\left\{ {\Delta {\gamma ^{\left( \alpha \right)}}} \right\}}^{\left( k \right)}}} \right)} \right)} \\ { + term2 \cdot bQ{h_{\alpha \beta }}\left( {1 - b_s{\rho ^{(\beta )}}} \right){\delta _{\alpha \beta }}{\text{sign}}\left( {{{\left\{ {\Delta {\gamma ^{\left( \alpha \right)}}} \right\}}^{\left( k \right)}}} \right){\text{sign}}\left( {\tau _t^{\left( \alpha \right)} + {{\left\{ {\Delta {\tau ^{\left( \alpha \right)}}} \right\}}^{\left( {k + 1} \right)}} - \left( {\alpha _t^{\left( \alpha \right)} + {{\left\{ {\Delta {\alpha ^{\left( \alpha \right)}}} \right\}}^{\left( {k + 1} \right)}}} \right)} \right)} \end{array}} \right]\end{split}\]

可以看出,用于迭代的刚度矩阵 \({\boldsymbol{A}}^{\left( k + 1 \right)}\) 与求解初值的刚度矩阵 \({\boldsymbol{A}}\) 形式一致。其中,

()\[term1 := \Delta t \theta\]
()\[term2 := term1 \cdot {{\dot \gamma }_{0}^{\left( \alpha \right)}} {p_{\text{s}}}\langle \left\{ {X^{\left( \alpha \right)}} \right\}^{\left( {k + 1} \right)} \rangle^{{p_s}-1} \cdot \frac{1}{{{K^{\left( \alpha \right)}}}}\]
()\[term4 := \boldsymbol{S}^{(\alpha)}: \boldsymbol{P}^{(\beta)}\]

方程组右边项 \(rhs\) 为:

()\[\left\{ {rhs} \right\}^{\left( {k} \right)} = - F\left( {{{\left\{ {\Delta {\gamma ^{\left( \alpha \right)}}} \right\}}^{\left( k \right)}}} \right) = \Delta t\left( {1 - \theta } \right){{\dot \gamma }^{\left( \alpha \right)}}\left( t \right) + \Delta t\theta {{\dot \gamma }^{\left( \alpha \right)}}\left( {t + \Delta t} \right) - {{{\left\{ {\Delta {\gamma ^{\left( \alpha \right)}}} \right\}}^{\left( k \right)}}}\]

下面列出本构模型中的变量或常数与程序中变量名或常数的对应关系:

应力 \(\sigma\) :stress

应力增量:delta_stress

应变 \(\varepsilon\) :strain

应变增量 \(\Delta \varepsilon\) :dstrain

应变增量 \(\Delta \varepsilon^{e}\) :delta_elastic_strain

分解剪应力 \(\tau\) :tau

状态变量 \(\rho\) :rho

背应力项(随动强化项) \(\alpha\) :alpha

各向同性强化项 \(r\) :r

滑移系滑移方向的单位向量 \({\boldsymbol{m}}\)\({\boldsymbol{m}}^{*}\) :m_s

滑移系滑移面法向的单位向量 \({\boldsymbol{n}}\)\({\boldsymbol{n}}^{*}\) :n_s

塑性旋率张量 \({{\boldsymbol{W}}^{\rm{p}}}\) 中的 \(\boldsymbol{\Omega}^{(\alpha)}\) :Omega

塑性变形率张量 \({{\boldsymbol{D}}^{\rm{p}}}\) 中的 \({\boldsymbol{P}}^{\left( \alpha \right)}\) :P

求解Jaumann率的中间项 \({{\boldsymbol {\Omega }}^{\left( \alpha \right)}} \cdot {\boldsymbol{\sigma}} - {\boldsymbol{\sigma}} \cdot {{\rm{\Omega }}^{\left( \alpha \right)}}\) :Q

Jaumann率中的旋转部分 \(\mathbb{C}:{{\boldsymbol{P}}^{\left( \alpha \right)}} + {{\boldsymbol {\Omega }}^{\left( \alpha \right)}} \cdot {\boldsymbol{\sigma}} - {\boldsymbol{\sigma}} \cdot {{\rm{\Omega }}^{\left( \alpha \right)}}\) :S

弹性模量张量 \(\mathbb{C}\) :C

剪切应变 \(\gamma\) :gamma

滑移系的剪切应变率 \(\dot{\gamma}\) :gamma_dot

滑移系的应变速率敏感指数 \({p_{\text{s}}}\) :p_s

滑移系的参考剪切应变率 \(\dot{a}\) :dot_gamma_0

参考屈服强度 \(K^{(\alpha)}\) :K

剪切应变速率初值 \(\Delta \gamma_{t}^{(\alpha)}\) :gamma_dot_t

用于迭代的剪切应变速率 \(\Delta \gamma_{t+\Delta t}^{(\alpha)}\) :gamma_dot

混合强化模型的中间变量 \(X^{\left( \alpha \right)}\) :X

背应力项参数 \(c_{1}\) :c_1

背应力项参数 \(c_{2}\) :c_2

各向同性强化项的临界分解剪应力(初始阻应力) \(r_{0}\) :r_0

各向同性强化项参数 \(b_s\) :b_s

各向同性强化项参数 \(Q\) :Q_s

参考文献:

[1] 近代连续介质力学. 赵亚溥.

[2] Nonlinear Finite Elements for Continua and Structures, Ted Belytschko.

m_s: ndarray
material: Material
n_s: ndarray
output: dict[str, ndarray]
p_s: ndarray
r_0: ndarray
section: Section
slip_system_name: list[str]
tangent: ndarray
theta: float
tolerance: float
total_number_of_slips: int
u_global: ndarray
u_grain: ndarray
v_global: ndarray
v_grain: ndarray
w_global: ndarray
w_grain: ndarray
pyfem.materials.PlasticCrystalGNDs module
class pyfem.materials.PlasticCrystalGNDs.PlasticCrystalGNDs(material: Material, dimension: int, section: Section)[源代码]

基类:BaseMaterial

晶体塑性材料。

支持的截面属性:(‘Volume’, ‘PlaneStrain’)

变量:
  • tolerance (float) – 误差容限

  • total_number_of_slips (int) – 总滑移系数量 [-]

  • elastic (dict) – 弹性参数字典

  • G (float) – 剪切模量 [Pa]

  • k_b (float) – 玻尔兹曼常数 [J/K]

  • temperature (float) – 温度 [K]

  • C (ndarray) – 弹性矩阵 [Pa]

  • slip_system_name (list[str]) – 滑移系统名称

  • c_over_a (list[float]) – 晶体坐标系的c/a [-]

  • theta (float) – 切线系数法参数

  • H (ndarray) – 硬化系数矩阵 [-]

  • tau_sol (ndarray) – 固溶强度 [Pa]

  • v_0 (ndarray) – 位错滑移参考速度 [m/s]

  • b_s (ndarray) – 位错滑移柏氏矢量长度 [m]

  • Q_s (ndarray) – 位错滑移激活能 [J]

  • p_s (ndarray) – 位错滑移阻力拟合参数 [-]

  • q_s (ndarray) – 位错滑移阻力拟合参数 [-]

  • d_grain (ndarray) – 平均晶粒尺寸 [m]

  • i_slip (ndarray) – 平均位错间隔拟合参数 [-]

  • c_anni (ndarray) – 位错湮灭拟合参数 [-]

  • Q_climb (ndarray) – 位错攀移激活能 [J]

  • D_0 (ndarray) – 自扩散系数因子 [m^2/s]

  • Omega_climb (ndarray) – 位错攀移激活体积 [m^3]

  • u_global (ndarray) – 全局坐标系下的1号矢量

  • v_global (ndarray) – 全局坐标系下的2号矢量

  • w_global (ndarray) – 全局坐标系下的3号矢量

  • u_grain (ndarray) – 晶粒坐标系下的1号矢量

  • v_grain (ndarray) – 晶粒坐标系下的2号矢量

  • w_grain (ndarray) – 晶粒坐标系下的3号矢量

  • T (ndarray) – 坐标变换矩阵

  • T_voigt (ndarray) – Vogit坐标变换矩阵

  • m_s (ndarray) – 特征滑移系滑移方向

  • n_s (ndarray) – 特征滑移系滑移面法向

  • MAX_NITER (ndarray) – 最大迭代次数 [-]

C: ndarray
D_0: ndarray
G: float
H: ndarray
MAX_NITER
Omega_climb: ndarray
Q_climb: ndarray
Q_s: ndarray
T: ndarray
T_voigt: ndarray
allowed_section_types: tuple
b_s: ndarray
c_anni: ndarray
c_over_a: list[float]
create_elastic_stiffness(elastic: dict)[源代码]

定义局部晶系的弹性刚度矩阵

弹性刚度矩阵由弹性常数组成,对应的矩阵形式与弹性常数个数及材料对称性相关,相关参数由材料属性数据字典中的 elastic 字典给出。

(1)各向同性材料(Isotropic material):对于一般各向同性材料,其包含两个独立的弹性常数,即:杨氏模量(Young’s modulus) \(E\) 和泊松比(Poisson’s ratio) \(\nu\) , 进一步可得到这两个弹性常数与剪切模量 \(G = \mu\) 和拉梅常数 \(\lambda\) 的关系为([1],[2]):

()\[\lambda = \frac{{\nu E}}{{(1 + \nu )(1 - 2\nu )}},G = \mu = \frac{E}{{2(1 + \nu )}}\]

进而得到各向同性材料得到弹性矩阵形式为:

()\[\begin{split}{{\mathbf{C}}_{(2D)}} = \left[ {\begin{array}{*{20}{c}} {\lambda + 2\mu }&\lambda &0 \\ \lambda &{\lambda + 2\mu }&0 \\ 0&0&\mu \end{array}} \right]\end{split}\]
()\[\begin{split}{{\mathbf{C}}_{(3D)}} = \left[ {\begin{array}{*{20}{c}} {\lambda + 2\mu }&\lambda &\lambda &0&0&0 \\ \lambda &{\lambda + 2\mu }&\lambda &0&0&0 \\ \lambda &\lambda &{\lambda + 2\mu }&0&0&0 \\ 0&0&0&\mu &0&0 \\ 0&0&0&0&\mu &0 \\ 0&0&0&0&0&\mu \end{array}} \right]\end{split}\]

(2)立方材料(Cubic material):包含三个独立的材料参数 \({C_{11}},{C_{12}},{C_{44}}\) ,其弹性矩阵定义为:

()\[\begin{split}{{\mathbf{C}}_{(2D)}} = \left[ {\begin{array}{*{20}{c}} {{C_{11}}}&{{C_{12}}}&0 \\ {{C_{12}}}&{{C_{11}}}&0 \\ 0&0&{{C_{44}}} \end{array}} \right]\end{split}\]
()\[\begin{split}{{\mathbf{C}}_{(3D)}} = \left[ {\begin{array}{*{20}{c}} {{C_{11}}}&{{C_{12}}}&{{C_{12}}}&0&0&0 \\ {{C_{12}}}&{{C_{11}}}&{{C_{12}}}&0&0&0 \\ {{C_{12}}}&{{C_{12}}}&{{C_{11}}}&0&0&0 \\ 0&0&0&{{C_{44}}}&0&0 \\ 0&0&0&0&{{C_{44}}}&0 \\ 0&0&0&0&0&{{C_{44}}} \end{array}} \right]\end{split}\]

(3)正交材料(Orthotropic material):包含9个独立的材料参数,分别为:

()\[{C_{1111}},{C_{1122}},{C_{2222}},{C_{1133}},{C_{2233}},{C_{3333}},{C_{1212}},{C_{1313}},{C_{2323}}\]

与 ABAQUS 对各向同性材料的定义相同,其弹性矩阵定义为:

()\[\begin{split}{{\mathbf{C}}_{(2D)}} = \left[ {\begin{array}{*{20}{c}} {{C_{1111}}}&{{C_{1122}}}&0 \\ {{C_{1122}}}&{{C_{2222}}}&0 \\ 0&0&{{C_{1212}}} \end{array}} \right]\end{split}\]
()\[\begin{split}{{\mathbf{C}}_{(3D)}} = \left[ {\begin{array}{*{20}{c}} {{C_{1111}}}&{{C_{1122}}}&{{C_{1133}}}&0&0&0 \\ {{C_{1122}}}&{{C_{2222}}}&{{C_{2233}}}&0&0&0 \\ {{C_{1133}}}&{{C_{2233}}}&{{C_{3333}}}&0&0&0 \\ 0&0&0&{{C_{1212}}}&0&0 \\ 0&0&0&0&{{C_{1313}}}&0 \\ 0&0&0&0&0&{{C_{2323}}} \end{array}} \right]\end{split}\]

(4)各向异性材料(Anistropic material):包含21个独立的材料参数,分别为:

()\[{C_{1111}},{C_{1122}},{C_{2222}},{C_{1133}},{C_{2233}},{C_{3333}},{C_{1112}}\]
()\[{C_{2212}},{C_{3312}},{C_{1212}},{C_{1113}},{C_{2213}},{C_{3313}},{C_{1213}}\]
()\[{C_{1313}},{C_{1123}},{C_{2223}},{C_{3323}},{C_{1223}},{C_{1323}},{C_{2323}}\]

与 ABAQUS 对各向异性材料的定义相同,其弹性矩阵定义为:

()\[\begin{split}{{\mathbf{C}}_{(2D)}} = \left[ {\begin{array}{*{20}{c}} {{C_{1111}}}&{{C_{1122}}}&0 \\ {{C_{1122}}}&{{C_{2222}}}&0 \\ 0&0&{{C_{1212}}} \end{array}} \right]\end{split}\]
()\[\begin{split}{{\mathbf{C}}_{(3D)}} = \left[ {\begin{array}{*{20}{c}} {{C_{1111}}}&{{C_{1122}}}&{{C_{1133}}}&{{C_{1112}}}&{{C_{1113}}}&{{C_{1123}}} \\ {{C_{1122}}}&{{C_{2222}}}&{{C_{2233}}}&{{C_{2212}}}&{{C_{2213}}}&{{C_{2223}}} \\ {{C_{1133}}}&{{C_{2233}}}&{{C_{3333}}}&{{C_{3312}}}&{{C_{3313}}}&{{C_{3323}}} \\ {{C_{1112}}}&{{C_{2212}}}&{{C_{3312}}}&{{C_{1212}}}&{{C_{1213}}}&{{C_{1223}}} \\ {{C_{1113}}}&{{C_{2213}}}&{{C_{3313}}}&{{C_{1213}}}&{{C_{1313}}}&{{C_{1323}}} \\ {{C_{1123}}}&{{C_{2223}}}&{{C_{3323}}}&{{C_{1223}}}&{{C_{1323}}}&{{C_{2323}}} \end{array}} \right]\end{split}\]

[1] I.S. Sokolnikoff: Mathematical Theory of Elasticity. New York, 1956.

[2] T.J.R. Hughes: The Finite Element Method, Linear Static and Dynamic Finite Element Analysis. New Jersey, 1987.

d_grain: ndarray
data_dict: dict[str, float]
data_keys: list[str]
dimension: int
elastic: dict
get_tangent(variable: dict[str, ndarray], state_variable: dict[str, ndarray], state_variable_new: dict[str, ndarray], element_id: int, iqp: int, ntens: int, ndi: int, nshr: int, timer: Timer) tuple[ndarray, dict[str, ndarray]][源代码]

获得基于位错演化强化的晶体塑性本构模型

本模块中包含3个字典:variablestate_variablestate_variable_new

其中,字典 variable 存储自由度相关的变量,如应变 \(\varepsilon\) 和应变增量 \(\Delta \varepsilon\)

字典 state_variable 存储迭代过程中上一个收敛增量步 \(t\) 时刻的状态变量,如应力 \(\sigma\) 、分解剪应力 \(\tau\) 、 热滑移阻力 \(\tau_{pass}\) 、剪切应变 \(\gamma\) 、位错偶极子密度 \(\rho_{di}\) 、可动位错密度 \(\rho_{m}\) 、 特征滑移系滑移方向 \(m\_s\) 、特征滑移系滑移面法向 \(n\_s\) 。这些状态变量在当前增量步 \(t+\Delta t\) 计算收敛之前是不被更新的。

字典 state_variable_new 存储当前增量步 \(t+\Delta t\) 时刻的某个中间迭代步 \(k\) 的状态变量。

基于位错演化强化的晶体塑性本构模型

目前的晶体塑性建模框架考虑了基于位错滑移的塑性变形机制,其中也涉及温度和应变速率的影响。这些机制包括:

  1. 位错滑移的热激活流动准则,该规则考虑了温度和应变率对晶体剪切速率的影响;

  2. 基于位错密度的滑移系统塑性变形强化;

  3. 基于滑移系统级可动和不可动位错密度的子结构演化;

  4. 基于物理的滑移系统级背应力演化,该反应力可能有助于循环变形过程中的晶内定向硬化,例如以鲍辛格效应的形式表现出来[1]。

1. 引言

在晶体塑性本构中通常采用增量形式的本构方程,若全量形式的本构方程采用 \(\boldsymbol{\sigma}= \mathbb{C}:{{\boldsymbol{\varepsilon}}}\) , 其中, \(\boldsymbol{\sigma}\) 为 Cauchy 应力张量, \(\mathbb{C}\) 为弹性模量张量, \({{\boldsymbol{\varepsilon}}}\) 为应变张量。 对全量形式的本构方程求时间导数,可得到增量形式的本构方程 \({\boldsymbol{\dot \sigma}}= \mathbb{C}:{{\boldsymbol{D}}}\) , 其中, \({\boldsymbol{\dot \sigma}}\) 为Cauchy应力张量率, \({{\boldsymbol{D}}}\) 为变形率张量。 可以证明,上述增量形式的本构方程中 \({{\boldsymbol{D}}}\) 是客观张量,而 \(\dot {\boldsymbol{\sigma}}\) 不是客观张量。

要建立正确的材料本构关系必须遵守“客观性公理”这一基本前提。所谓客观性就是物质的力学性质与观察者无关,客观性又称为“标架无差异性”。遵守“客观性公理”的张量称为客观张量, 也可以定义为在时空变换中保持不变的张量,亦称“时空无差异张量”。用公式可以直接定义满足如下变换率的张量[2]:

()\[{\boldsymbol{\dot \Lambda }}^{*} = {\boldsymbol{ Q }}{\boldsymbol{\dot \Lambda }}{\boldsymbol{Q}^{T}}\]

为客观性张量。上式表示的是对张量的正交变换或时空变换, \(\boldsymbol{Q}\) 是时空变换矩阵。

我们知道 Cauchy 应力张量 \(\boldsymbol{\sigma}\) 是客观张量,即满足:

()\[{{{\boldsymbol{\sigma }}}^*} = {\boldsymbol{\dot Q }}{\boldsymbol{\sigma }}{\boldsymbol{ Q }^{T}}, {\boldsymbol{\dot Q }}{\boldsymbol{ Q }^{T}} = {\boldsymbol{I }}\]

\({{{\boldsymbol{\sigma }}}^*}\) 求时间导数:

()\[{{{\boldsymbol{\dot \sigma }}}^*} = {\boldsymbol{\dot Q }}{\boldsymbol{\sigma }}{\boldsymbol{ Q }^{T}} + {\boldsymbol{ Q }}{\boldsymbol{\dot \sigma }}{\boldsymbol{ Q }^{T}} + {\boldsymbol{ Q }}{\boldsymbol{\sigma }}{\boldsymbol{\dot Q }^{T}}\]

上面的时间导数表明,一般情况下, \({{{\boldsymbol{\dot \sigma }}}^*}\) 并不是客观时间导数,由于 \({{{\boldsymbol{\dot \sigma }}}^*} \ne {\boldsymbol{ Q }}{\boldsymbol{\dot \sigma }}{\boldsymbol{ Q }^{T}}\) , 只有当转动率为零, \({\boldsymbol{\dot Q }} {\text{ = }} 0\) ,也就是当 \({\boldsymbol{ Q }} {\text{ = }}\) 常量时, \({{{\boldsymbol{\dot \sigma }}}^*}\) 才满足Truesdell客观性的要求。

同理,可证明变形率 \({{\boldsymbol{D}}}\) 满足Truesdell客观性的要求。已知变形率 \({{\boldsymbol{D}}}\) 可以表示为:

()\[{\boldsymbol{D}} = \frac{{\boldsymbol{L}} + {\boldsymbol{L}}^{T}}{2}\]

式中, \({\boldsymbol{L}}\) 是速度梯度, \({\boldsymbol{L}}^{T}\) 是速度梯度的转置。对变形率 \({{\boldsymbol{D}}}\) 做时空变换:

()\[{{{\boldsymbol{D}}}^*} = \frac{{{{\boldsymbol{L}}}^*} + {{{\boldsymbol{L}}}^{T*}}}{2}\]

其中, \({{\boldsymbol{L}}^{*}}\) 是速度梯度的时空变换律, \({{\boldsymbol{L}}^{T*}}\) 是速度梯度转置的时空变换律,两者可表示为:

()\[{{{\boldsymbol{L}}}^*} = {\boldsymbol{ Q }}{\boldsymbol{L }}{\boldsymbol{ Q }^{T}} + {\boldsymbol{\Omega }}\]
()\[{{{\boldsymbol{L}}}^{T*}} = {\boldsymbol{ Q }}{\boldsymbol{L }}{\boldsymbol{ Q }^{T}} - {\boldsymbol{\Omega }},\]

式中, \({\boldsymbol{\Omega }}={\boldsymbol{ \dot Q }}{\boldsymbol{ Q }^{T}}\) 是一反对称张量。从上式可以看出, 速度梯度 \({\boldsymbol{L}}\) 不是客观张量。将其 \({{{\boldsymbol{L}}}^*}\)\({{{\boldsymbol{L}}}^{T*}}\) 代入变形率 \({{\boldsymbol{D}}}\) 的时空变换律,我们得到:

()\[{{{\boldsymbol{D}}}^*} = \frac{{{{\boldsymbol{L}}}^*} + {{{\boldsymbol{L}}}^{T*}}}{2} = {\boldsymbol{ Q }}\frac{{{{\boldsymbol{L}}}} + {{{\boldsymbol{L}}}^{T}}}{2}{\boldsymbol{ Q }^{T}} = {\boldsymbol{ Q }}{\boldsymbol{D }}{\boldsymbol{ Q }^{T}}\]

所以,普通的增量形式本构方程 \({\boldsymbol{\dot \sigma}}= \mathbb{C}:{{\boldsymbol{D}}}\) 由于 \(\dot {\boldsymbol{\sigma}}\) 不满足客观性, 因此不再适用,需要做出相应的改变。主要体现为:

选用客观的应力率取代普通的应力率,以保证客观性。本文采用 Cauchy 应力的 Zaremba-Jaumann 率 \(\hat{\boldsymbol{\sigma}}\) (一般地简称为 Jaumann 率[2,3])。 Jaumann 率是一种客观率(objective rate),它使得在刚体转动中,在初始参考系下,初始的应力状态保持不变。

下面详细介绍如何获得满足客观性要求的增量形式弹塑性本构关系。

2. 运动学

由于晶内部大量位错的存在,所以宏观上可以假设位错滑移在晶粒内部均匀分布。因而,在连续介质力学中,用变形梯度张量 \({\boldsymbol{F}}\) 来描述滑移变形的宏观效应。 \({\boldsymbol{F}}\) 里包含了变形的所有信息,包括弹性变形和塑性变形,也包括了拉伸和旋转。 采用 Hill 和 Rice 对晶体塑性变形几何学及运动学的理论表述方法,则晶体总的变形梯度 \({\boldsymbol{F}}\) —— 当前构型量 \({\boldsymbol{x}}\) 对参考构型量 \({\boldsymbol{X}}\) 的偏导,可表示为:

()\[{\boldsymbol{F}} =\frac{\partial {\boldsymbol{x}}}{\partial {\boldsymbol{X}}} = {{\boldsymbol{F}}^{\text{e}}}{{\boldsymbol{F}}^{\text{p}}}\]

其中, \({{\boldsymbol{F}}^{\text{e}}}\) 为晶格畸变和刚性转动产生的弹性变形梯度, \({{\boldsymbol{F}}^{\text{p}}}\) 表示晶体沿着滑移方向的均匀剪切所产生的塑性变形梯度。

图 1 晶体变形几何学示意图:

                              最终构型
                                               *
                                         *      *
                                   *      *
                             *      *      *     m^*
                       *      *      *      *
                        *      *      *             ^
                  n^*    *      *                     \
                   *      *                             \  F^e
            ^       *                                     \
           /                                                \
          /                                                   \
         /  F=F^eF^p                                            \
        /                                                         \
   *  *  *  *  *                       F^p                            *  *  *  *  *
n  *  *  *  *  *             ---------------------->            n     *  *  *  *  *
^  *  *  *  *  *                                                ^  *  *  *  *  *
|  *  *  *  *  *                                                |  *  *  *  *  *
----->m                                                         ----->m
初始构型                                                          中间构型

上图所示为晶体变形几何学的示意图。可以看出,晶体滑移过程中,晶格矢量没有发生变化;但晶格的畸变会造成晶格矢量的变化,包括伸长和转动。

\({\boldsymbol{m}}^{(\alpha )}\)\({\boldsymbol{n}}^{(\alpha )}\) 分别表示变形前第 \(\alpha\) 滑移系滑移方向和滑移面法向的单位向量。 用 \({\boldsymbol{m}}^{*\left( \alpha \right)}\)\({\boldsymbol{n}}^{*\left( \alpha \right)}\) 分别表示晶格畸变后第 \(\alpha\) 滑移系的滑移方向和滑移面法向的单位向量。变形前与变形后第 \(\alpha\) 滑移系的滑移方向和滑移面法向的单位向量存在下列关系:

()\[{{\boldsymbol{m}}^{*\left( \alpha \right)}} = {{\boldsymbol{F}}^{\text{e}}}{{\boldsymbol{m}}^{\left( \alpha \right)}}, {{\boldsymbol{n}}^{*\left( \alpha \right)}} = {{\boldsymbol{n}}^{\left( \alpha \right)}} {\left( {{{\boldsymbol{F}}^{\rm{e}}}} \right)^{{\rm{ - }}1}}\]

晶格畸变后,滑移面的滑移方向 \({\boldsymbol{m}}^{*\left( \alpha \right)}\) 和法线方向 \({\boldsymbol{n}}^{*\left( \alpha \right)}\) 不再是单位向量, 但仍保持正交。

自然的,可定义变形速度梯度,即变形速度 \({\boldsymbol{v}}\) 对当前构型 \({\boldsymbol{x}}\) 的导数,也被称为速度梯度张量 \({\boldsymbol{L}}\)

()\[{\boldsymbol{L}} = \frac{{\partial {\boldsymbol{v}}}}{{\partial {{\boldsymbol{x}}}}} = {\boldsymbol{\dot F}}{{\boldsymbol{F}}^{ - 1}}\]

从引言的推导我们得知,这个速度梯度张量 \({\boldsymbol{L}}\) 不是客观张量,但由其得到的变形率张量 \({\boldsymbol{D}}\) 和弹性变形率张量 \({\boldsymbol{D}}^{\rm{e}}\) 是客观张量。要得到弹性变形率张量 \({\boldsymbol{D}}^{\rm{e}}\) 需要对 \({\boldsymbol{L}}\) 进行分解。

对应于前述变形梯度的乘法分解,将速度梯度速度梯度张量 \({\boldsymbol{L}}\) 分解为与晶格畸变和刚体转动相对应的弹性部分 \({{\boldsymbol{L}}^{\rm{e}}}\) 和与滑移相对应的塑性部分 \({{\boldsymbol{L}}^{\rm{p}}}\)

()\[{\boldsymbol{L}} = {{\boldsymbol{L}}^{\text{e}}}{{\boldsymbol{L}}^{\text{p}}}\]

其中, \({{\boldsymbol{L}}^{\rm{e}}}\)\({{\boldsymbol{L}}^{\rm{p}}}\) 分别为:

()\[{{\boldsymbol{L}}^{\rm{e}}} = {{{\boldsymbol{\dot F}}}^{\rm{e}}}{\left( {{{\boldsymbol{F}}^{\rm{e}}}} \right)^{ - 1}},\]
()\[\boldsymbol{L}^{\mathrm{p}}=\boldsymbol{F}^{\mathrm{e}} \dot{\boldsymbol{F}}^{\mathrm{p}} \left(\boldsymbol{F}^{\mathrm{p}}\right)^{-1}\left(\boldsymbol{F}^{\mathrm{e}}\right)^{-1}\]

假设晶体整体的塑性变形由各滑移系中滑移引起的剪切应变所确定,在初始构型或中间构型上,有:

()\[{{\boldsymbol{L}}^{\rm{p}}} = \dot{\boldsymbol{F}}^{\mathrm{p}}\left(\boldsymbol{F}^{\mathrm{p}}\right)^{-1} = \sum\limits_{\alpha = 1}^N {{{\dot \gamma }^{\left( \alpha \right)}}} {{\boldsymbol{m}}^{\left( \alpha \right)}} \otimes {{\boldsymbol{n}}^{\left( \alpha \right)}}\]

其中, \({{{\dot \gamma }^{\left( \alpha \right)}}}\) 表示第 \(\alpha\) 个滑移系的滑移剪切率,求和将对所有激活的滑移系进行。

利用变形前与变形后第 \(\alpha\) 滑移系的滑移方向和滑移面法向单位向量的关系,得到最终构型的 \({{\boldsymbol{L}}^{\rm{p}}}\) 表达式为:

()\[{{\boldsymbol{L}}^{\rm{p}}} = \sum\limits_{\alpha = 1}^N {{{\dot \gamma }^{\left( \alpha \right)}}} {{\boldsymbol{F}}^{\rm{e}}}{{\boldsymbol{m}}^{\left( \alpha \right)}} \otimes {{\boldsymbol{n}}^{\left( \alpha \right)}}{\left( {{{\boldsymbol{F}}^{\rm{e}}}} \right)^{ - 1}} = \sum\limits_{\alpha = 1}^N {{{\dot \gamma }^{\left( \alpha \right)}}} {{\boldsymbol{m}}^{*\left( \alpha \right)}} \otimes {{\boldsymbol{n}}^{*\left( \alpha \right)}}\]

速度梯度可以进一步分解为对称部分和反对称部分之和:

()\[{\boldsymbol{L}} = \frac{1}{2}\left( {{\boldsymbol{L}} + {{\boldsymbol{L}}^{\rm{T}}}} \right) + \frac{1}{2}\left( {{\boldsymbol{L}} - {{\boldsymbol{L}}^{\rm{T}}}} \right)\]

将速度梯度的对称部分定义为变形率张量:

()\[{\boldsymbol{D}} = \frac{1}{2}\left( {{\boldsymbol{L}} + {{\boldsymbol{L}}^{\rm{T}}}} \right)={{\boldsymbol{D}}^{\rm{e}}}+{{\boldsymbol{D}}^{\rm{p}}}\]

将速度梯度的反对称部分定义为旋率张量:

()\[{\boldsymbol{W}} = \frac{1}{2}\left( {{\boldsymbol{L}} - {{\boldsymbol{L}}^{\rm{T}}}} \right)={{\boldsymbol{W}}^{\rm{e}}}{\rm{ + }}{{\boldsymbol{W}}^{\rm{p}}}\]

将变形率张量 \({\boldsymbol{D}}\) 分解得到弹性变形率张量 \({{\boldsymbol{D}}^{\rm{e}}}\) 与塑性变形率张量 \({{\boldsymbol{D}}^{\rm{p}}}\)

()\[{{\boldsymbol{D}}^{\rm{e}}}= \frac{1}{2}\left( {{{\boldsymbol{L}}^{\rm{e}}} + {{\left( {{{\boldsymbol{L}}^{\rm{e}}}} \right)}^{\rm{T}}}} \right) = \frac{1}{2}\left( {{{{\boldsymbol{\dot F}}}^{\rm{e}}}{{\left( {{{\boldsymbol{F}}^{\rm{e}}}} \right)}^{ - 1}} + {{\left( {{{{\boldsymbol{\dot F}}}^{\rm{e}}}{{\left( {{{\boldsymbol{F}}^{\rm{e}}}} \right)}^{ - 1}}} \right)}^{\rm{T}}}} \right)\]
()\[{{\boldsymbol{D}}^{\rm{p}}}= \frac{1}{2}\left( {{{\boldsymbol{L}}^{\rm{p}}} + {{\left( {{{\boldsymbol{L}}^{\rm{p}}}} \right)}^{\rm{T}}}} \right) = \frac{1}{2}\left( {\sum\limits_{\alpha = 1}^N {{{\dot \gamma }^{\left( \alpha \right)}}} {{\boldsymbol{m}}^{*\left( \alpha \right)}} \otimes {{\boldsymbol{n}}^{*\left( \alpha \right)}} + {{\left( {\sum\limits_{\alpha = 1}^N {{{\dot \gamma }^{\left( \alpha \right)}}} {{\boldsymbol{m}}^{*\left( \alpha \right)}} \otimes {{\boldsymbol{n}}^{*\left( \alpha \right)}}} \right)}^{\rm{T}}}} \right)\]
()\[{{\boldsymbol{D}}^{\rm{p}}} = \sum\limits_{\alpha = 1}^N {\frac{1}{2}\left( {{{\boldsymbol{m}}^{*\left( \alpha \right)}} \otimes {{\boldsymbol{n}}^{*\left( \alpha \right)}} + {{\boldsymbol{n}}^{*\left( \alpha \right)}} \otimes {{\boldsymbol{m}}^{* \left(\alpha \right)}}} \right){{\dot \gamma }^{\left( \alpha \right)}}} = \sum\limits_{\alpha = 1}^N {{{\boldsymbol{P}}^{\left( \alpha \right)}}{{\dot \gamma }^{\left( \alpha \right)}}}\]

其中, \({\boldsymbol{P}}^{\left( \alpha \right)}\) 类似施密特因子, \({\boldsymbol{P}}^{\left( \alpha \right)}\) 的表达式为:

()\[{{\boldsymbol{P}}^{\left( \alpha \right)}} = \frac{1}{2}\left( {{{\boldsymbol{m}}^{*\left( \alpha \right)}} \otimes {{\boldsymbol{n}}^{*\left( \alpha \right)}} + {{\boldsymbol{n}}^{*\left( \alpha \right)}} \otimes {{\boldsymbol{m}}^{*\left( \alpha \right)}}} \right)\]

同理,可以得到弹性旋率张量 \({{\boldsymbol{W}}^{\rm{e}}}\) 和塑性旋率张量 \({{\boldsymbol{W}}^{\rm{p}}}\)

()\[{{\boldsymbol{W}}^{\rm{e}}} = \frac{1}{2}\left( {{{\boldsymbol{L}}^{\rm{e}}} - {{\left( {{{\boldsymbol{L}}^{\rm{e}}}} \right)}^{\rm{T}}}} \right) = \frac{1}{2}\left( {{{{\boldsymbol{\dot F}}}^{\rm{e}}}{{\left( {{{\boldsymbol{F}}^{\rm{e}}}} \right)}^{ - 1}} - {{\left( {{{{\boldsymbol{\dot F}}}^{\rm{e}}}{{\left( {{{\boldsymbol{F}}^{\rm{e}}}} \right)}^{ - 1}}} \right)}^{\rm{T}}}} \right)\]
()\[{{\boldsymbol{W}}^{\rm{p}}} = \frac{1}{2}\left( {{{\boldsymbol{L}}^{\rm{p}}} - {{\left( {{{\boldsymbol{L}}^{\rm{p}}}} \right)}^{\rm{T}}}} \right) = \sum\limits_{\alpha = 1}^N {\frac{1}{2}\left( {{{\boldsymbol{m}}^{*\left( \alpha \right)}} \otimes {{\boldsymbol{n}}^{*\left( \alpha \right)}} - {{\boldsymbol{n}}^{*\left( \alpha \right)}} \otimes {{\boldsymbol{m}}^{* \left( \alpha \right)}}} \right){{\dot \gamma }^{\left( \alpha \right)}}} = \sum\limits_{\alpha = 1}^N {{{\boldsymbol{\Omega}}^{\left( \alpha \right)}}{{\dot \gamma }^{\left( \alpha \right)}}}\]

其中 \(\boldsymbol{\Omega}^{(\alpha)}\) 的表达式为:

()\[{{\boldsymbol{\Omega }}^{\left( \alpha \right)}}= \frac{1}{2}\left( {{{\boldsymbol{m}}^{*\left( \alpha \right)}} \otimes {{\boldsymbol{n}}^{*\left( \alpha \right)}}{\rm{ - }}{{\boldsymbol{n}}^{*\left( \alpha \right)}} \otimes {{\boldsymbol{m}}^{*\left( \alpha \right)}}} \right)\]

以上晶体变形动力学的基本方程建立起了各滑移系剪切应变率与晶体宏观变形率之间的关系。下面将应力率、变形率及滑移剪切应变率联系起来,建立满足“客观性公理”的增量形式弹塑性本构关系。

3. 弹塑性本构关系

假设晶体材料的弹性性能不受滑移变形的影响,我们可建立满足“客观性公理”的增量形式弹性本构关系,表达式为:

()\[\hat{\boldsymbol{\sigma}}^{\rm{e}} = \mathbb{C}:{{\boldsymbol{D}}^{\rm{e}}}\]

其中, \({{\boldsymbol{D}}^{\rm{e}}}\) 是变形率 \({{\boldsymbol{D}}}\) 的弹性部分,即弹性变形率张量。 相应的, \(\hat{\boldsymbol{\sigma}}^{\rm{e}}\) 是 Jaumann 率 \(\hat{\boldsymbol{\sigma}}\) 的弹性部分,即弹性 Jaumann 率张量。

以 图1 初始构形为基础的柯西应力张量的 Jaumann率 表达式为:

()\[{\boldsymbol {\hat \sigma }} = {\boldsymbol {\dot \sigma }} - {\boldsymbol{W}} \cdot {\boldsymbol{\sigma}} + {\boldsymbol{\sigma}} \cdot {\boldsymbol{W}}\]

相应的将 \(\hat{\boldsymbol{\sigma}}^{\rm{e}}\) 表示为以 图1 中间构形为基准状态的Kirchhoff应力张量的Jaumann导数,则有:

()\[\hat{\boldsymbol{\sigma}}^{\mathrm{e}} = {\boldsymbol {\dot \sigma }} - {{\boldsymbol{W}}^{\rm{e}}} \cdot {\boldsymbol{\sigma}} + {\boldsymbol{\sigma}} \cdot {{\boldsymbol{W}}^{\rm{e}}}\]

结合上述两式,将柯西应力率 \({\boldsymbol {\dot \sigma }}\) 作替换, \(\hat{\boldsymbol{\sigma}}\) 可以表示为:

()\[\hat{\boldsymbol{\sigma}} =\hat{\boldsymbol{\sigma}}^{\mathrm{e}}-\boldsymbol{W}^{\mathrm{p}} \cdot \boldsymbol{\sigma}+\boldsymbol{\sigma} \cdot \boldsymbol{W}^{\mathrm{p}} ={\mathbb{C}}:{{\boldsymbol{D}}^{\rm{e}}} -{{\boldsymbol{W}}^{\rm{p}}} \cdot {\boldsymbol{\sigma }} + {\boldsymbol{\sigma }} \cdot {{\boldsymbol{W}}^{\rm{p}}}\]

\({{\boldsymbol{D}}^{\rm{e}}}\)\({{\boldsymbol{W}}^{\rm{p}}}\) 作替换,得到:

()\[{\boldsymbol{\hat \sigma }} = \mathbb{C}:\left( {{\boldsymbol{D}} - {{\boldsymbol{D}}^{\rm{p}}}} \right) - \sum\limits_{\alpha = 1}^N {{{\boldsymbol{Q}}^{\left( \alpha \right)}}{{\dot \gamma }^{\left( \alpha \right)}}}\]

其中,

()\[{{\boldsymbol{Q}}^{\left( \alpha \right)}} = {{\boldsymbol {\Omega }}^{\left( \alpha \right)}} \cdot {\boldsymbol{\sigma}} - {\boldsymbol{\sigma}} \cdot {{\boldsymbol {\Omega }}^{\left( \alpha \right)}}\]

得到:

()\[{\boldsymbol{\hat \sigma }}= \mathbb{C}:\left( {{\boldsymbol{D}} - \sum\limits_{\alpha = 1}^N {{{\boldsymbol{P}}^{\left( \alpha \right)}}{{\dot \gamma }^{\left( \alpha \right)}}} } \right) - \sum\limits_{\alpha = 1}^N {{{\boldsymbol{Q}}^{\left( \alpha \right)}}{{\dot \gamma }^{\left( \alpha \right)}}}\]

定义 \(\boldsymbol {S}^{(\alpha)}\) 为:

()\[\boldsymbol {S}^{(\alpha)} = \mathbb{C}:{{\boldsymbol{P}}^{\left( \alpha \right)}} + {{\boldsymbol {\Omega }}^{\left( \alpha \right)}} \cdot {\boldsymbol{\sigma}} - {\boldsymbol{\sigma}} \cdot {{\boldsymbol {\Omega }}^{\left( \alpha \right)}}\]

最后得到Jaumann率表达式为:

()\[{\boldsymbol{\hat \sigma }}= \mathbb{C}:{\boldsymbol{D}} - \sum\limits_{\alpha = 1}^N {\left[ {\mathbb{C}: {{\boldsymbol{P}}^{\left( \alpha \right)}} + {{\boldsymbol{\Omega }}^{\left( \alpha \right)}} \cdot {\boldsymbol {\sigma }} - {\boldsymbol {\sigma }} \cdot {{\boldsymbol{\Omega }}^{\left( \alpha \right)}}} \right]{{\dot \gamma }^{\left( \alpha \right)}}} = \mathbb{C}:{\boldsymbol{D}} - \sum\limits_{\alpha = 1}^N { \boldsymbol {S}^{(\alpha)} {{\dot \gamma }^{\left( \alpha \right)}}}\]

上式将应力率、变形率及滑移剪切应变率联系起来,表示了应力率、变形率和滑移剪切应变率之间的定量关联,即增量形式的弹塑性本构关系。

下一步的核心为确定所有可能开动滑移系的滑移剪切应变率 \(\dot{\gamma}^{(\alpha)}\)

4. 建立基于位错演化强化的晶体塑性模型

在晶体塑性本构模型中,需要通过各滑移系的剪切应变率计算应力率。因此,首先需要确定各滑移系剪切应变的演化方程。 根据 Orowan 方程[4],考虑位错演化机制的剪切应变速率 \(\dot{\gamma}^{\left( \alpha \right)}\) 由以下因素决定:

()\[{{\dot \gamma }^{\left( \alpha \right)}} = \rho _{\text{m}}^{\left( \alpha \right)}{b_{\text{s}}}{v_0}\exp \left\{ { - \frac{{{Q_{\text{s}}}}}{{{k_{\text{b}}}T}}{{\left[ {1 - {{\left\langle {\frac{{\left| {{\tau ^{\left( \alpha \right)}}} \right| - \tau _{{\text{pass}}}^{\left( \alpha \right)}}}{{\tau _{{\text{sol}}}^{\left( \alpha \right)}}}} \right\rangle }^{p_{\text{s}}}}} \right]}^{{q_{\text{s}}}}}} \right\}\operatorname{sign} \left( {{\tau ^{\left( \alpha \right)}}} \right)\]

式中, \(\rho^{(\alpha)}_{\rm{m}}\) 为滑移系 \(\alpha\) 的可动位错密度; \(\tau^{(\alpha)}\) 为滑移系 \(\alpha\) 的分解剪应力; \(\tau_{\rm{sol}}^{(\alpha)}\)\(\tau_{\rm{pass}}^{(\alpha)}\) 分别为滑移系 \(\alpha\) 的固溶强度和热滑移阻力。 另外, \(b_{\rm{s}}\) 是滑移的Burgers矢量长度, \(p_{\text{s}}\)\({q_{\text{s}}}\) 分别是控制位错滑移阻力曲线的拟合参数 (取值范围 \(0<p \leq 1\)\(1 \leq q \leq 2\) ,推荐值 p=0.5, q=1.5), \(v_0\) 是参考速度, \(Q_{\rm{s}}\) 是位错滑移的活化能, \(k_{\rm{b}}\) 是玻尔兹曼常数。

其中,热滑移阻力 \(\tau_{\rm{pass}}^{(\alpha)}\) 与位错密度行为相关:

()\[\tau _{{\text{pass}}}^{\left( \alpha \right)} = G{b_{\text{s}}}\sqrt {\sum\limits_{\beta = 1}^N {{h_{\alpha \beta }}} \left( {\rho _{\text{m}}^{\left( \beta \right)} + \rho _{{\text{di}}}^{\left( \beta \right)}} \right)}\]

式子中, \(G\) 是剪切模量, \(N_{\rm{s}}\) 是总滑移系统数, \(h_{\alpha \beta}\) 是滑移系统 \(\alpha\)\(\beta\) 相互作用的系数矩阵; 滑移系统 \(\beta\) 上的总位错密度 \(\rho^{(\beta)}\) 由移动位错密度 \(\rho^{(\beta)}_{\rm{m}}\) 和位错偶极子密度 \(\rho^{(\beta)a}_{\rm{di}}\) 组成。

将可动位错密度 \(\rho^{(\alpha)}_{\rm{m}}\) 和位错偶极子密度 \(\rho^{(\alpha)}_{\rm{di}}\) 相加定义为 \(\rho^{(\alpha)}\)

()\[{\rho ^{\left( \alpha \right)}}{\text{ = }}\rho _{\text{m}}^{\left( \alpha \right)} + \rho _{{\text{di}}}^{\left( \alpha \right)}\]

则热滑移阻力 \(\tau_{\rm{pass}}^{(\alpha)}\) 的表达式可以改写为:

()\[\tau _{{\text{pass}}}^{\left( \alpha \right)} = G{b_{\text{s}}}\sqrt {\sum\limits_{\beta = 1}^N {{h_{\alpha \beta }}} \left( {\rho _{\text{m}}^{\left( \beta \right)} + \rho _{{\text{di}}}^{\left( \beta \right)}} \right)} = G{b_{\text{s}}}\sqrt {\sum\limits_{\beta = 1}^N {{h_{\alpha \beta }}} {\rho ^{\left( \beta \right)}}}\]

进一步,将热滑移阻力 \(\tau_{\rm{pass}}^{(\alpha)}\) 对时间求导,得到其演化方程:

()\[\dot \tau _{{\text{pass}}}^{\left( \alpha \right)} = G{b_{\text{s}}}\frac{1}{{2\sqrt {\sum\limits_{\beta = 1}^N {{h_{\alpha \beta }}} {\rho ^{\left( \beta \right)}}} }}\sum\limits_{\beta = 1}^N {{h_{\alpha \beta }}} {{\dot \rho }^{\left( \beta \right)}} = \frac{{{{\left( {G{b_{\text{s}}}} \right)}^2}}}{{2\tau _{{\text{pass}}}^{ \left( \alpha \right)}}}\sum\limits_{\beta = 1}^N {{h_{\alpha \beta }}} {{\dot \rho }^{\left( \beta \right)}}\]

根据 Blum 和 Eisenlohr[5] 以及 Ma 和 Roters[6] 的研究,位错密度的演变是位错生长、湮灭和偶极子形成的综合结果。对于可动位错来说, 它们的湮灭是由两个Burgers矢量方向相反的位错相互靠近或形成偶极子造成的。它们的演化率如下:

位错增殖:

()\[\dot{\rho}_{\rm{multip}}^{\left( \alpha \right)} = \frac{\left|\dot{\gamma}^{\left( \alpha \right)}\right|}{b_{\rm{s}} \lambda^{\left( \alpha \right)}}\]

位错偶极子行成:

()\[\dot{\rho}_{\rm{diform}}^{\left( \alpha \right)} = \frac{2 \rho_{\rm{m}}^{\left( \alpha \right)} \left|\dot{\gamma}^{\left( \alpha \right)}\right|}{b_{\rm{s}} }\left(d_{\rm{di}}^{\left( \alpha \right)}-d_{\rm{min}}^{\left( \alpha \right)} \right)\]

位错湮灭:

()\[\dot{\rho}_{\rm{anni}}^{\left( \alpha \right)} = \frac{2 \rho_{\rm{m}}^{\left( \alpha \right)} \left|\dot{\gamma}^{\left( \alpha \right)}\right|} {b_{\rm{s}} }d_{\rm{min}}^{\left( \alpha \right)}\]

对于可动位错:

()\[\dot{\rho}_{\rm{m}}^{\left( \alpha \right)} = \frac{\left|\dot{\gamma}^{\left( \alpha \right)} \right|}{b_{\rm{s}} \lambda^{\left( \alpha \right)}}-\frac{2 \rho^{\left( \alpha \right)}_{\rm{m}} \left|\dot{\gamma}^{\left( \alpha \right)}\right|}{b_{\rm{s}}}d^{\left( \alpha \right)}_{\rm{di}}\]

而对于位错偶极子来说,位错密度降低是由异号位错湮灭或攀移引起的:

()\[\dot{\rho}^{\left( \alpha \right)}_{\rm{di}}=\frac{2\rho^{\left( \alpha \right)}_{\rm{m}} \left|\dot{\gamma}^{\left( \alpha \right)}\right|}{b_{\rm{s}}} \left(d_{\rm{di}}^{\left( \alpha \right)}-d_{\rm{min}}^{\left( \alpha \right)} \right) -\frac{2\rho^{\left( \alpha \right)}_{\rm{di}} \left|\dot{\gamma}^{\left( \alpha \right)} \right|}{b_{\rm{s}}} d^{\left( \alpha \right)}_{\rm{min}} - \frac{4 \rho^{\left( \alpha \right)}_{\rm{di}} \nu_{\rm{clim}}^{\left( \alpha \right)}}{d^{\left( \alpha \right)}_{\rm{di}}-d^{\left( \alpha \right)}_{\rm{min}}}\]

其中, \({{\lambda ^{\left( \alpha \right)}}}\) 是位错滑移的平均自由程,它受到位错与晶界和其他位错相互作用的影响; \(d_{{\text{di}}}^{\left( \alpha \right)}\) 是两个位错可形成稳定偶极子的滑移面最大间距; \(d_{{\text{min}}}^{\left( \alpha \right)}\) 是两个异号位错湮灭的最小间距; \(\nu _{{\text{clim}}}^{\left( \alpha \right)}\) 是位错攀移速度。 这些变量的计算公式如下:

()\[\frac{1}{{{\lambda ^{\left( \alpha \right)}}}} = \frac{1}{d} + \frac{1}{{{i_{{\text{slip}}}}}}\sqrt {\sum\limits_{\beta = 1}^N {{h_{\alpha \beta }}} {\rho ^{\left( \beta \right)}}} = \frac{1}{d} + \frac{1}{{{i_{{\text{slip}}}}}}\frac{{\tau _{{\text{pass}}}^{\left( \alpha \right)}}}{{G{b_{\text{s}}}}}\]
()\[d_{{\text{di}}}^{\left( \alpha \right)} = \frac{{3G{b_{\text{s}}}}}{{16\pi \left| {{\tau ^{\left( \alpha \right)}}} \right|}}\]
()\[d_{{\text{min}}}^{\left( \alpha \right)} = {c_{{\text{anni}}}}{b_{\text{s}}}\]
()\[\nu _{{\text{clim}}}^{\left( \alpha \right)} = \frac{{3G{D_0}{\Omega _{{\text{clim}}}}}}{{2\pi {k_{\text{b}}}T (d_{{\text{di}}}^{\left( \alpha \right)} + d_{{\text{min}}}^{\left( \alpha \right)})}}\exp ( - \frac{{{Q_{{\text{clim}}}}}}{{{k_{\text{b}}}T}})\]

其中, \(d\) 为平均晶粒尺寸; \({{D_0}}\) 为材料的自扩散系数(受空位机制控制); \({{\Omega _{{\text{clim}}}}}\)\(Q_{\rm{clim}}\) 分别为位错攀移激活体积和激活能; \(i_{\rm{slip}}\) 为平均位错滑移间距系数; \(c_{\rm{anni}}\) 为位错湮灭的拟合参数。

最后,结合公式 \(\dot \rho _{\text{m}}^{\left( \alpha \right)}\) , \(\frac{1}{{{\lambda ^{\left( \alpha \right)}}}}\) 和公式 \(d_{{\text{di}}}^{\left( \alpha \right)}\) ,得到可动位错密度演化为:

()\[\dot \rho _{\text{m}}^{\left( \alpha \right)} = \frac{{\left| {{{\dot \gamma }^{\left( \alpha \right)}}} \right|}}{{{b_{\text{s}}}{\lambda ^{\left( \alpha \right)}}}} - \frac{{2\rho _{\text{m}}^{\left( \alpha \right)}\left| {{{\dot \gamma }^{\left( \alpha \right)}}} \right|}}{{{b_{\text{s}}}}}d_{{\text{di}}}^{\left( \alpha \right)}\]

结合公式 \(\dot \rho _{\text{m}}^{\left( \alpha \right)}\)\(\frac{1}{{{\lambda ^{\left( \alpha \right)}}}}\) 和 公式 \(d_{{\text{di}}}^{\left( \alpha \right)}\)\(d_{{\text{min}}}^{\left( \alpha \right)}\)\(\nu _{{\text{clim}}}^{\left( \alpha \right)}\) 位错偶极子密度演化为:

()\[\dot \rho _{{\text{di}}}^{\left( \alpha \right)} = \frac{{2\rho _{\text{m}}^{\left( \alpha \right)}\left| {{{\dot \gamma }^{\left( \alpha \right)}}} \right|}}{{{b_{\text{s}}}}}\left( {d_{{\text{di}}}^{\left( \alpha \right)} - d_{{\text{min}}}^{\left( \alpha \right)}} \right) - \frac{{2\rho _{{\text{di}}}^{\left( \alpha \right)}\left| {{{\dot \gamma }^{\left( \alpha \right)}}} \right|}}{{{b_{\text{s}}}}}d_{{\text{min}}}^{\left( \alpha \right)} - \frac{{4\rho _{{\text{di}}}^{\left( \alpha \right)}\nu _{{\text{clim}}}^{\left( \alpha \right)}}}{{d_{{\text{di}}}^{\left( \alpha \right)} - d_{{\text{min}}}^{\left( \alpha \right)}}}\]

接下来,求解 \(\tau^{(\alpha)}\) 的演化方程 \(\dot{\tau}^{(\alpha)}\)

滑移系上的分解剪应力 \({\tau ^{\left( \alpha \right)}}\) 定义为:

()\[{\tau ^{\left( \alpha \right)}} = {{\boldsymbol{P}}^{\left( \alpha \right)}}:{\boldsymbol{\sigma}}\]

所以分解剪应力 \({\tau ^{\left( \alpha \right)}}\) 对时间的导数 \({\dot \tau }\) 的表达形式为:

()\[{{\dot \tau }^{\left( \alpha \right)}} = {{{\boldsymbol{\dot P}}}^{\left( \alpha \right)}}:{\boldsymbol{\sigma}} + {{\boldsymbol{P}}^{\left( \alpha \right)}}:{\boldsymbol{ \dot \sigma}}\]

其中, \({{{\boldsymbol{\dot P}}}^{\left( \alpha \right)}}\) 可用下列式子表示:

()\[{{{\boldsymbol{\dot P}}}^{\left( \alpha \right)}} = {{\boldsymbol{D}}^{\rm{e}}}{{\boldsymbol{\Omega }}^{\left( \alpha \right)}} + {{\boldsymbol{W}}^{\rm{e}}}{{\boldsymbol{P}}^{\left( \alpha \right)}} - {{\boldsymbol{\Omega }}^{\left( \alpha \right)}}{{\boldsymbol{D}}^{\rm{e}}} - {{\boldsymbol{P}}^{\left( \alpha \right)}}{{\boldsymbol{W}}^{\rm{e}}}\]

\({{{\boldsymbol{\dot P}}}^{\left( \alpha \right)}}\)\({\boldsymbol{ \dot \sigma}}\) 代入 \({\dot \tau }\) 的表达式,并化简得到:

()\[{{\dot \tau }^{\left( \alpha \right)}} =\left( {\mathbb{C}:{{\boldsymbol{P}}^{\left( \alpha \right)}} + {{\boldsymbol{\Omega }}^{\left( \alpha \right)}}{\boldsymbol{\sigma }} - {\boldsymbol{\sigma }} {{\boldsymbol{\Omega }}^{\left( \alpha \right)}}} \right):(\boldsymbol {D}-{{\boldsymbol{D}}^{\rm{p}}})\]

\(\boldsymbol {S}^{(\alpha)}\)\({{\boldsymbol{D}}^{\rm{p}}}\) 代入上式得到 \(\tau^{(\alpha)}\) 的演化方程:

()\[{{\dot \tau }^{\left( \alpha \right)}} = \boldsymbol {S}^{(\alpha)} :(\boldsymbol {D}-{{\boldsymbol{D}}^{\rm{p}}}) = \boldsymbol {S}^{(\alpha)} : \left( {\boldsymbol{D}} - \sum\limits_{\alpha = 1}^N {{{\boldsymbol{P}}^{\left( \alpha \right)}}{{\dot \gamma }^{\left( \alpha \right)}}} \right)\]

通过上述推导,方程 \({{\dot \gamma }^{\left( \alpha \right)}}\) 建立了能够描述晶体循环变形中位错演化强化的剪切应变硬化方程。 利用计算得到的各滑移系中的剪切应变增量和晶体塑性理论中的本构关系,即可得到宏观应力增量,下面将详细介绍位错演化模型的数值离散过程。

5 数值离散求解

如果将晶体塑性本构模型与基于位移场的求解有限元软件相结合,主要包含两个基本任务:一是通过积分点处的变形计算应力值,二是更新当前积分点的一致性切线刚度矩阵。 而应力和切线刚度矩阵的更新则依赖于所有开动滑移系的剪切应变增量 \(\Delta \gamma^{(\alpha)}\) 的求解。

5.1 求解应力应变增量以及相关内变量初值

在速率相关晶体塑性本构模型的计算中,为了保证数值计算的稳定性,Peirce等人采用切线系数法改进方程 \({{\dot \gamma }^{\left( \alpha \right)}}\) 的计算。 令时间步长 \(\Delta t\) 对应的剪切应变增量为 \(\Delta \gamma^{(\alpha)}\) ,采用线性中心差分格式,则有:

()\[\Delta \gamma^{(\alpha)}=\Delta t\left[(1-\theta) \dot{\gamma}^{(\alpha)}(t)+\theta \dot{\gamma}^{(\alpha)}(t+\Delta t)\right]\]

其中, \(\theta\) 的取值范围为 0 至 1 \((0 \leqslant \theta \leqslant 1)\) ,其推荐取值范围为 0.5。 用式 \({{\dot \gamma }^{\left( \alpha \right)}}\) 的泰勒展开式近似地表示 \(\Delta \gamma^{(\alpha)}\) 中的最后一项:

()\[{{\dot \gamma }^{\left( \alpha \right)}}\left( {t + \Delta t} \right) = {{\dot \gamma }^{\left( \alpha \right)}}\left( t \right) + {\left. {\frac{{\partial {{\dot \gamma }^{\left( \alpha \right)}}}}{{\partial \rho _{\text{m}}^{\left( \alpha \right)}}}} \right|_t}\Delta \rho _{\text{m}}^{\left( \alpha \right)} + {\left. {\frac{{\partial {{\dot \gamma }^{\left( \alpha \right)}}}}{{\partial {\tau ^{\left( \alpha \right)}}}}} \right|_t}\Delta {\tau ^{\left( \alpha \right)}} + {\left. {\frac{{\partial {{\dot \gamma }^{\left( \alpha \right)}}}}{{\partial \tau _{{\text{pass}}}^{\left( \alpha \right)}}}} \right|_t}\Delta \tau_{{\text{pass}}}^{\left( \alpha \right)}\]

可得剪切应变的离散格式 \(\Delta \gamma^{(\alpha)}\)

()\[\Delta {\gamma ^{\left( \alpha \right)}} = \Delta t\left[ {{{\dot \gamma }^{\left( \alpha \right)}}\left( t \right) + {{\left. {\theta \frac{{\partial {{\dot \gamma }^{\left( \alpha \right)}}}}{{\partial \rho _{\text{m}}^{\left( \alpha \right)}}}} \right|}_t}\Delta \rho _{\text{m}}^{\left( \alpha \right)} + \theta {{\left. {\frac{{\partial {{\dot \gamma }^{\left( \alpha \right)}}}}{{\partial {\tau ^{\left( \alpha \right)}}}}} \right|}_t}\Delta {\tau ^{\left( \alpha \right)}} + {{\left. {\theta \frac{{\partial {{\dot \gamma }^{\left( \alpha \right)}}}}{{\partial \tau _{{\text{pass}}}^{\left( \alpha \right)}}}} \right|}_t}\Delta \tau _{{\text{pass}}}^{\left( \alpha \right)}} \right]\]

\(\dot \tau _{{\text{pass}}}^{\left( \alpha \right)}\) 进行积分,得到热滑移阻力的离散格式:

()\[\Delta \tau _{{\text{pass}}}^{\left( \alpha \right)} = \frac{{{{\left( {G{b_{\text{s}}}} \right)}^2}}}{{2 \tau _{{\text{pass}}}^{\left( \alpha \right)}}}\sum\limits_{\beta = 1}^N {{h_{\alpha \beta }}} \Delta {\rho ^{\left( \beta \right)}}\]

\(\dot \rho _{\text{m}}^{\left( \alpha \right)}\) 进行积分,得到可动位错密度离散格式:

()\[\Delta \rho _{\text{m}}^{\left( \alpha \right)} = \left[ {\frac{1}{{{b_{\text{s}}}{\lambda ^{\left( \alpha \right)}}}} - \frac{{2\rho _{\text{m}}^{\left( \alpha \right)}d_{{\text{di}}}^{\left( \alpha \right)}}}{{{b_{\text{s}}}}}} \right]\left| {\Delta {\gamma ^{\left( \alpha \right)}}} \right|\]

\(\dot \rho _{{\text{di}}}^{\left( \alpha \right)}\) 进行积分,得到位错偶极子密度离散格式:

()\[\Delta \rho _{di}^{\left( \alpha \right)} = 2\left[ {\rho _{\text{m}}^{\left( \alpha \right)}d_{{\text{di}}}^{\left( \alpha \right)} - \left( {\rho _{\text{m}}^{\left( \alpha \right)} + \rho _{{\text{di}}}^{\left( \alpha \right)}} \right)d_{{\text{min}}}^{\left( \alpha \right)}} \right]\frac{{\left| {\Delta {\gamma ^{\left( \alpha \right)}}} \right|}}{{{b_{\text{s}}}}} - \frac{{4\rho _{{\text{di}}}^{\left( \alpha \right)}\nu _{{\text{clim}}}^{\left( \alpha \right)}}}{{d_{{\text{di}}}^{\left( \alpha \right)} - d_{{\text{min}}}^{\left( \alpha \right)}}}\Delta t\]

对上式进行化简:

()\[\Delta \rho _{di}^{\left( \alpha \right)} = 2\left[ {\rho _{\text{m}}^{\left( \alpha \right)}d_{{\text{di}}}^{\left( \alpha \right)} - {\rho ^{\left( \alpha \right)}}d_{{\text{min}}}^{\left( \alpha \right)}} \right]\frac{{\left| {\Delta {\gamma ^{\left( \alpha \right)}}} \right|}}{{{b_{\text{s}}}}} - \frac{{4\rho _{{\text{di}}}^{\left( \alpha \right)} \nu _{{\text{clim}}}^{\left( \alpha \right)}}}{{d_{{\text{di}}}^{\left( \alpha \right)} - d_{{\text{min}}}^{\left( \alpha \right)}}}\Delta t\]

将位错偶极子密度与可动位错密度的离散格式相加,得到位错密度离散格式:

()\[\Delta {\rho ^{\left( \alpha \right)}} = \Delta \rho _{{\text{di}}}^{\left( \alpha \right)} + \Delta \rho _{\text{m}}^{\left( \alpha \right)} = \left[ {\frac{1}{{{b_{\text{s}}}{\lambda ^{\left( \alpha \right)}}}} - 2d_{{\text{min}}}^{\left( \alpha \right)}\frac{{{\rho ^{\left( \alpha \right)}}}} {{{b_{\text{s}}}}}} \right]\left| {\Delta {\gamma ^{\left( \alpha \right)}}} \right| - \frac{{4\rho _{{ \text{di}}}^{\left( \alpha \right)}\nu _{{\text{clim}}}^{\left( \alpha \right)}}}{{d_{{\text{di}}}^{\left( \alpha \right)} - d_{{\text{min}}}^{\left( \alpha \right)}}}\Delta t\]

接下来,对 \({\dot \tau }\) 进行积分,得到分解剪应力离散格式:

()\[\Delta \tau^{(\alpha)} = {{\dot \tau }^{\left( \alpha \right)}} \Delta t=\boldsymbol{S}^{(\alpha)}: \Delta \boldsymbol{\varepsilon}-\boldsymbol {S}^{(\alpha)}: \sum_{\beta=1}^{N} \boldsymbol {P}^{(\beta)} \Delta \gamma^{(\beta)} = \boldsymbol{S}^{(\alpha)}: \left(\Delta \boldsymbol{\varepsilon}- \sum_{\beta=1}^{N} \boldsymbol {P}^{(\beta)} \Delta \gamma^{(\beta)} \right)\]

令:

()\[X^{\left( \alpha \right)} = \frac{{\left| {{\tau ^{\left( \alpha \right)}}} \right| - \tau _{{\text{pass}}}^{\left( \alpha \right)}}}{{\tau _{{\text{sol}}}^{\left( \alpha \right)}}}, {A_s} = \frac{{{Q_{\text{s}}}}}{{{k_{\text{b}}}T}}\]

得到位错演化强化模型:

()\[{{\dot \gamma }^{\left( \alpha \right)}} = \rho _{\text{m}}^{\left( \alpha \right)}{b_{\text{s}}}{v_0}\exp \left[ { - {A_s}{{\left( {1 - {{\left\langle X^{\left( \alpha \right)} \right\rangle }^{p_{\text{s}}}}} \right)}^{q_{\text{s}}}}} \right]\operatorname{sign} \left( {{\tau ^{\left( \alpha \right)}}} \right)\]

接下来采用链式法则,对每一项分别求导:

()\[\frac{{\partial {{\dot \gamma }^{\left( \alpha \right)}}}}{{\partial \left\langle X^{\left( \alpha \right)} \right\rangle }} = {A_s}\rho _m^{\left( \alpha \right)}{b_s}pq{v_0}{\left\langle X^{\left( \alpha \right)} \right\rangle ^{p_{\text{s}} - 1}}{\left( {1 - {{\left\langle X^{\left( \alpha \right)} \right\rangle }^{p_{\text{s}}}}} \right)^{{q_{\text{s}}} - 1}}{e^{ - {A_s}{{\left( {1 - {{\left\langle X^{\left( \alpha \right)} \right\rangle }^{p_{\text{s}}}}} \right)}^{q_{\text{s}}}}}}\operatorname{sign} \left( {{\tau ^{\left( \alpha \right)}}} \right)\]
()\[\frac{{\partial \left\langle X^{\left( \alpha \right)} \right\rangle }}{{\partial {\tau ^{\left( \alpha \right)}}}} = \frac{1}{{\tau _{{\text{sol}}}^{\left( \alpha \right)}}}\operatorname{sign} \left( {{\tau ^{\left( \alpha \right)}}} \right)H\left( X^{\left( \alpha \right)} \right)\]
()\[\frac{{\partial \left\langle X^{\left( \alpha \right)} \right\rangle }}{{\partial \tau _{{\text{pass}}}^{\left( \alpha \right)}}} = - \frac{1}{{\tau _{{\text{sol}}}^{\left( \alpha \right)}}}H\left( X^{\left( \alpha \right)} \right)\]
()\[\frac{{\partial {{\dot \gamma }^{\left( \alpha \right)}}}}{{\partial \rho _{\text{m}}^{\left( \alpha \right)}}} = {b_{\text{s}}}{v_0}\exp \left\{ { - {A_s}{{\left[ {1 - {{\left\langle X^{\left( \alpha \right)} \right\rangle }^{p_{\text{s}}}}} \right]}^{q_{\text{s}}}}} \right\}\operatorname{sign} \left( {{\tau ^{\left( \alpha \right)}}} \right)\]

所以有:

()\[\Delta {\gamma ^{\left( \alpha \right)}} = \Delta t{{\dot \gamma }^{\left( \alpha \right)}}\left( t \right) + \Delta t\theta \left( {\frac{{\partial {{\dot \gamma }^{\left( \alpha \right)}}}}{{\partial \left\langle X^{\left( \alpha \right)} \right\rangle }}\frac{{\partial \left\langle X^{\left( \alpha \right)} \right\rangle }}{{\partial \Delta \rho _{\text{m}}^{\left( \alpha \right)}}}\Delta \rho _{\text{m}}^{\left( \alpha \right)} + \frac{{\partial {{\dot \gamma }^{\left( \alpha \right)}}}}{{\partial \left\langle X^{\left( \alpha \right)} \right\rangle }}\frac{{\partial \left\langle X^{\left( \alpha \right)} \right\rangle }} {{\partial {\tau ^{\left( \alpha \right)}}}}\Delta {\tau ^{\left( \alpha \right)}} + \frac{{\partial {{\dot \gamma }^{\left( \alpha \right)}}}}{{\partial \left\langle X^{\left( \alpha \right)} \right\rangle }}\frac{{\partial \left\langle X^{\left( \alpha \right)} \right\rangle }}{{\partial \Delta \tau _{{\text{pass}}}^{\left( \alpha \right)}}}\Delta \tau_{{\text{pass}}}^{\left( \alpha \right)}} \right)\]

\(\Delta \rho _{\text{m}}^{\left( \alpha \right)}\)\(\Delta \tau _{{\text{pass}}}^{\left( \alpha \right)}\)\(\Delta \tau^{(\alpha)}\) 代入 \(\Delta \gamma^{(\alpha)}\) ,再将其写成矩阵形式,可得:

()\[\begin{split}\left[ {\begin{array}{*{20}{l}} {{\delta _{\alpha \beta }}} \\ { - term1 \cdot term2 \cdot term5 \cdot {b_{\text{s}}}{v_0}\exp \left\{ { - {A_s}{{\left[ {1 - {{\left\langle X^{\left( \alpha \right)} \right\rangle }^{p_{\text{s}}}}} \right]}^{q_{\text{s}}}}} \right\}{\delta _{\alpha \beta }}} \\ { + term1 \cdot term2 \cdot term3 \cdot term4 \cdot \operatorname{sign} \left( {{\tau ^{\left( \alpha \right)}}} \right)} \\ { + term1 \cdot term2 \cdot term3 \cdot term8 \cdot {h_{\alpha \beta }}\left[ {{\delta _{\alpha \beta }} \cdot term6 \cdot {\text{sign}}\left( {\Delta {\tau ^{\left( \beta \right)}}} \right)} \right]} \end{array}} \right]\Delta {\gamma ^{\left( \alpha \right)}} = \Delta t{{\dot \gamma }^{\left( \alpha \right)}}\left( t \right) + term1 \cdot term2 \cdot term3 \cdot \operatorname{sign} \left( {{\tau ^{\left( \alpha \right)}}} \right) \cdot {{\boldsymbol{S}}^{\left( \alpha \right)}}:\Delta {\boldsymbol{\varepsilon }} + term1 \cdot term2 \cdot term3 \cdot term8 \cdot \sum\limits_{\beta = 1}^N {{h_{\alpha \beta }} \cdot term7}\end{split}\]

整理得到引入位错演化强化的晶体塑性模型迭代格式为由 \(N\) 个末知数 \(\Delta \gamma^{(\alpha)}\)\(N\) 个非线性方程组成的方程组。 其中 \(term1-8\) 是编程过程中为了简化计算引入的一些临时变量:

()\[term1 := \Delta t \theta\]
()\[term2 := {A_s}\rho _m^{\left( \alpha \right)}{b_s}pq{v_0}{\left\langle X^{\left( \alpha \right)} \right\rangle ^{{p_{\text{s}}} - 1}}{\left( {1 - {{\left\langle X^{\left( \alpha \right)} \right\rangle }^{p_{\text{s}}}}} \right)^{{q_{\text{s}}} - 1}}{e^{ - {A_s}{{\left( {1 - {{\left\langle X^{\left( \alpha \right)} \right\rangle }^{p_{\text{s}}}}} \right)}^{q_{\text{s}}}}}}\operatorname{sign} \left( {{\tau ^{\left( \alpha \right)}}} \right)\]
()\[term3 := \frac{{H\left( X^{\left( \alpha \right)} \right)}}{{\tau _{{\text{sol}}}^{\left( \alpha \right)}}}\]
()\[term4 := {{\boldsymbol{S}}^{\left( \alpha \right)}}:{{\boldsymbol{P}}^{\left( \beta \right)}}\]
()\[term5 := \frac{1}{{{b_{\text{s}}}{\lambda ^{\left( \alpha \right)}}}} - 2d_{{\text{di}}}^{\left( \alpha \right)}\frac{{\rho _{\text{m}}^{\left( \alpha \right)}}}{{{b_{\text{s}}}}}\]
()\[term6 := \frac{1}{{{b_{\text{s}}}{\lambda ^{\left( \alpha \right)}}}} - 2d_{\min }^{\left( \alpha \right)}\frac{{{\rho ^{\left( \alpha \right)}}}}{{{b_{\text{s}}}}}\]
()\[term7 := \frac{{4\rho _{{\text{di}}}^{\left( \beta \right)}\nu _{{\text{clim}}}^{\left( \beta \right)}}}{{d_{{\text{di}}}^{\left( \beta \right)} - d_{{\text{min}}}^{\left( \beta \right)}}}\Delta t\]
()\[term8 := \frac{{{{\left( {G{b_{\text{s}}}} \right)}^2}}}{{2\tau _{{\text{pass}}}^{\left( \alpha \right)}}}\]

上标 \(\alpha\) 表示第 \(\alpha\) 个滑移系( \(\alpha=1 \sim N,N\) 为所有可能开动滑移系的数目), 等式右边的 \(\Delta {\boldsymbol{\varepsilon }}\) 为已知项。求解该非线性方程组可以得到所有滑移系的初始剪切应变增量 \(\Delta \gamma^{(\alpha)}\), 进而计算应力增量 \(\Delta \boldsymbol{\sigma}\) 和其他状态变量的初始增量。

将上面的方程组简写为以下形式:

()\[\boldsymbol {A} \Delta {\gamma ^{\left( \alpha \right)}} = \Delta t{{\dot \gamma }^{\left( \alpha \right)}} \left( t \right) + term1\cdot term2\cdot term3\cdot \operatorname{sign} \left( {{\tau ^{\left( \alpha \right)}}} \right) {{\boldsymbol{S}}^{\left( \alpha \right)}}:\Delta {\boldsymbol{\varepsilon }} + term1\cdot term2\cdot term3\cdot term8\cdot \sum\limits_{\beta = 1}^N {{h_{\alpha \beta }}\cdot term7}\]

方程两边对 \(\Delta {\boldsymbol{\varepsilon }}\) 求偏导得到:

()\[\boldsymbol {A} \frac{{\partial \Delta {\gamma ^{\left( \alpha \right)}}}}{{\partial \Delta {\boldsymbol{\varepsilon }}}} = term1 \cdot term2 \cdot term3 \cdot \operatorname{sign} \left( {{\tau ^{\left( \alpha \right)}}} \right) \cdot {{\boldsymbol{S}}^{\left( \alpha \right)}}\]

所以有:

()\[ddgdde = \frac{{\partial \Delta {\gamma ^{\left( \alpha \right)}}}}{{\partial \Delta {\boldsymbol{\varepsilon }}}} = {{\boldsymbol {A}}^{ - 1}} \cdot term1 \cdot term2\cdot term3\cdot \operatorname{sign} \left( {{\tau ^{\left( \alpha \right)}}} \right) \cdot {{\boldsymbol{S}}^{\left( \alpha \right)}}\]

在第3节,我们已经得到 Jaumann率 表达式为:

()\[{\boldsymbol{\hat \sigma }} = \mathbb{C}:{\boldsymbol{D}} - \sum\limits_{\alpha = 1}^N { \boldsymbol {S}^{(\alpha)} {{\dot \gamma }^{\left( \alpha \right)}}}\]

对 Jaumann 率进行时间积分,我们得到:

()\[\Delta {\boldsymbol{\sigma}} = \mathbb{C}:{\Delta {\boldsymbol{\varepsilon }}} - \sum\limits_{\alpha = 1}^N {\boldsymbol {S}^{(\alpha)} {\Delta { \gamma }^{\left( \alpha \right)}}}\]

进而,我们可以得到,弹性模量张量的弹性部分, 即 \(ddsdde\) 矩阵为:

()\[ddsdde = \frac{\partial {\Delta {\boldsymbol{\sigma }^{(\alpha)}}}}{\partial {\Delta \boldsymbol{\varepsilon }}} = \mathbb{C} - \sum\limits_{\alpha = 1}^N { \boldsymbol {S}^{(\alpha)} \frac{{\partial \Delta {\gamma ^{\left( \alpha \right)}}}}{{\partial \Delta {\boldsymbol{\varepsilon }}}}} = \mathbb{C} - \sum\limits_{\alpha = 1}^N \boldsymbol {S}^{(\alpha)} \cdot ddgdde^{(\alpha)}\]
5.2 迭代求解剪切应变增量以及更新切线刚度矩阵

采用牛顿拉夫森迭代方法进行迭代求解。在上面的推导中,初始剪切应变增量 \({{{\left\{ {\Delta {\gamma ^{\left( \alpha \right)}}} \right\}}^{\left( k \right)}}}\) 是我们利用 5.1 节的非线性方程组求出的近似值。假设初始剪切应变增量与真实剪切应变增量 \(\Delta \gamma^{(\alpha)}\) 之间的误差 Residual为 \(R\)

我们可以写出 \(R\) 的表达式:

()\[R = F \left( {{{\left\{ {\Delta {\gamma ^{\left( \alpha \right)}}} \right\}}^{\left( k \right)}}} \right) = {{{\left\{ {\Delta {\gamma ^{\left( \alpha \right)}}} \right\}}^{\left( k \right)}}} - \Delta t\left( {1 - \theta } \right){{\dot \gamma }^{\left( \alpha \right)}}\left( t \right) - \Delta t\theta {{\dot \gamma }^{\left( \alpha \right)}}\left( {t + \Delta t} \right)\]

上式就是牛顿拉弗森法迭代的目标函数。我们要做的就是对这个函数上的点做切线,并求切线的零点。即使得Residual为 0 或接近我们的预设阈值 tolerance ,可用数学式表达为:

()\[F'\left( {{{\left\{ {\Delta {\gamma ^{\left( \alpha \right)}}} \right\}}^{\left( k \right)}}} \right) \cdot \Delta {\left\{ {\Delta {\gamma ^{\left( \alpha \right)}}} \right\}^{\left( {k + 1} \right)}} = 0 - F\left( {{{\left\{ {\Delta {\gamma ^{\left( \alpha \right)}}} \right\}}^{\left( k \right)}}} \right)\]

其中,

()\[{\left\{ {\Delta {\gamma ^{\left( \alpha \right)}}} \right\}^{\left( {k + 1} \right)}} = {\left\{ {\Delta {\gamma ^{\left( \alpha \right)}}} \right\}^{\left( k \right)}} + \Delta {\left\{ {\Delta {\gamma ^{\left( \alpha \right)}}} \right\}^{\left( {k + 1} \right)}}\]

当初值计算完成后,获得了新的 \(\left\{ {X^{\left( \alpha \right)}} \right\}^{\left( {k + 1} \right)}\)

()\[{\left\{ {{X^{\left( \alpha \right)}}} \right\}^{\left( {k + 1} \right)}} = \frac{{\left| {\tau _t^{\left( \alpha \right)} + {{\left\{ {\Delta {\tau ^{\left( \alpha \right)}}} \right\}}^{\left( {k + 1} \right)}}} \right| - \left( {\tau _{{\text{pass}},t}^{\left( \alpha \right)} + {{\left\{ {\Delta \tau _{{\text{pass}}}^{\left( \alpha \right)}} \right\}}^{\left( {k + 1} \right)}}} \right)}}{{\tau _{{\text{sol}}}^{\left( \alpha \right)}}}\]

进而可得到即将用于牛顿拉夫森迭代的剪切应变速率表达式:

()\[{\left\{ {\dot \gamma _{t + \Delta t}^{\left( \alpha \right)}} \right\}^{\left( {k + 1} \right)}} = \left( {\rho _{{\text{m}},t}^{\left( \alpha \right)} + {{\left\{ {\Delta \rho _{\text{m}}^{\left( \alpha \right)}} \right\}}^{\left( {k + 1} \right)}}} \right){b_{\text{s}}}{v_0} \exp \left\{ { - {A_{\text{s}}}{{\left[ {1 - {{\left\langle {{{\left\{ {\Delta {\tau ^{\left( \alpha \right)}}} \right\}}^{\left( {k + 1} \right)}}} \right\rangle }^{{p_{\text{s}}}}}} \right]}^{{q_{\text{s}}}}}} \right\}\operatorname{sign} \left( {\tau _t^{\left( \alpha \right)} + {{\left\{ {\Delta {\tau ^{\left( \alpha \right)}}} \right\}}^{\left( {k + 1} \right)}}} \right)\]

参考 5.1 节的推导,最后我们得到迭代求解该非线性方程组的所有滑移系的剪切应变增量的方程组:

()\[{\boldsymbol{A}}^{\left( k + 1 \right)} \left( {{{\left\{ {\Delta {\gamma ^{\left( \alpha \right)}}} \right\}}^{\left( k \right)}}} \right) \cdot \Delta {\left\{ {\Delta {\gamma ^{\left( \alpha \right)}}} \right\}^{\left( {k + 1} \right)}} = \left\{ {rhs} \right\}^{\left( {k} \right)}\]

其中,刚度矩阵 \({\boldsymbol{A}}^{\left( k + 1 \right)} \left( {{{\left\{ {\Delta {\gamma ^{\left( \alpha \right)}}} \right\}}^{\left( k \right)}}} \right)\) 为:

()\[\begin{split}{\boldsymbol{A}}^{\left( k + 1 \right)} = F'\left( {{{\left\{ {\Delta {\gamma ^{\left( \alpha \right)}}} \right\}}^{\left( k \right)}}} \right) = \left[ {\begin{array}{*{20}{l}} {{\delta _{\alpha \beta }}} \\ { - term1 \cdot term2 \cdot term5 \cdot {b_{\text{s}}}{v_0}\exp \left\{ { - {A_s}{{\left[ {1 - {{\left\langle {{{\left\{ {{X^{\left( \alpha \right)}}} \right\}}^{\left( {k + 1} \right)}}} \right\rangle }^{{p_{\text{s}}}}}} \right]}^{{q_{\text{s}}}}}} \right\}{\delta _{\alpha \beta }}} \\ { + term1 \cdot term2 \cdot term3 \cdot term4 \cdot \operatorname{sign} \left( {{{\left\{ {{\tau ^{\left( \alpha \right)}}} \right\}}^{\left( {k + 1} \right)}}} \right)} \\ { + term1 \cdot term2 \cdot term3 \cdot term8 \cdot {h_{\alpha \beta }}\left[ {term6 \cdot {\text{sign}}\left( {{{\left\{ {{\tau ^{\left( \alpha \right)}}} \right\}}^{\left( {k + 1} \right)}}} \right) \cdot {\delta _{\alpha \beta }}} \right]} \end{array}} \right]\end{split}\]

可以看出,用于迭代的刚度矩阵 \({\boldsymbol{A}}^{\left( k + 1 \right)}\) 与求解初值的刚度矩阵 \({\boldsymbol{A}}\) 形式一致。

其中,临时变量 \(term1-8\) 为:

()\[term1 := \Delta t \theta\]
()\[term2: = {A_s}{\left\{ {\Delta \rho _{\text{m}}^{\left( \alpha \right)}} \right\}^{\left( {k + 1} \right)}}{b_s}pq{v_0}{\left\langle {{{\left\{ {{X^{\left( \alpha \right)}}} \right\}}^{\left( {k + 1} \right)}}} \right\rangle ^{{p_{\text{s}}} - 1}}{\left( {1 - {{\left\langle {{{\left\{ {{X^{\left( \alpha \right)}}} \right\}}^{\left( {k + 1} \right)}}} \right\rangle }^{{p_{\text{s}}}}}} \right)^{{q_{\text{s}}} - 1}}{e^{ - {A_s}{{\left( {1 - {{\left\langle {{{\left\{ {{X^{\left( \alpha \right)}}} \right\}}^{\left( {k + 1} \right)}}} \right\rangle }^{{p_{\text{s}}}}}} \right)}^{{q_{\text{s}}}}}}}{\text{sign}}\left( {{{\left\{ {{\tau ^{\left( \alpha \right)}}} \right\}}^{\left( {k + 1} \right)}}} \right)\]
()\[term3 := \frac{{H\left( {{{\left\{ {{X^{\left( \alpha \right)}}} \right\}}^{\left( {k + 1} \right)}}} \right)}}{{\tau _{{\text{sol}}}^{\left( \alpha \right)}}}\]
()\[term4 := {{\boldsymbol{S}}^{\left( \alpha \right)}}:{{\boldsymbol{P}}^{\left( \beta \right)}}\]
()\[term5: = \frac{1}{{{b_{\text{s}}}{{\left\{ {{\lambda ^{\left( \alpha \right)}}} \right\}}^{\left( {k + 1} \right)}}}} - 2d_{{\text{di}}}^{\left( \alpha \right)}\frac{{{{\left\{ {\rho _{\text{m}}^{\left( \alpha \right)}} \right\}}^{\left( {k + 1} \right)}}}}{{{b_{\text{s}}}}}\]
()\[term6: = \frac{1}{{{b_{\text{s}}}{{\left\{ {{\lambda ^{\left( \alpha \right)}}} \right\}}^{\left( {k + 1} \right)}}}} - 2{d_{{{\min }^{\left( \alpha \right)}}}}\frac{{{{\left\{ {{\rho ^{\left( \alpha \right)}}} \right\}}^{\left( {k + 1} \right)}}}}{{{b_{\text{s}}}}}\]
()\[term7: = \frac{{4{{\left\{ {\rho _{{\text{di}}}^{\left( \beta \right)}} \right\}}^{\left( {k + 1} \right)}}\nu _{{\text{clim}}}^{\left( \beta \right)}}}{{d_{{\text{di}}}^{\left( \beta \right)} - d_{{\text{min}}}^{\left( \beta \right)}}}\Delta t\]
()\[term8: = \frac{{{{\left( {G{b_{\text{s}}}} \right)}^2}}}{{2{{\left\{ {\tau _{{\text{pass}}}^{\left( \alpha \right)}} \right\}}^{\left( {k + 1} \right)}}}}\]

方程组右边项 \(rhs\) 为:

()\[\left\{ {rhs} \right\}^{\left( {k} \right)} = - F\left( {{{\left\{ {\Delta {\gamma ^{\left( \alpha \right)}}} \right\}}^{\left( k \right)}}} \right) = \Delta t\left( {1 - \theta } \right){{\dot \gamma }^{\left( \alpha \right)}}\left( t \right) + \Delta t\theta {{\dot \gamma }^{\left( \alpha \right)}}\left( {t + \Delta t} \right) - {{{\left\{ {\Delta {\gamma ^{\left( \alpha \right)}}} \right\}}^{\left( k \right)}}}\]

下面列出本构模型中的变量或常数与程序中变量名或常数的对应关系:

应力 \(\sigma\) :stress [Pa]

应力增量:delta_stress [Pa]

应变 \(\varepsilon\) :strain [-]

应变增量 \(\Delta \varepsilon\) :dstrain [-]

弹性应变增量 \(\Delta \varepsilon^{e}\) :delta_elastic_strain [-]

分解剪应力 \(\tau\) :tau [Pa]

位错密度 \(\rho\) :rho [1/m^2]

可动位错密度 \(\rho_{m}\) :rho_m [1/m^2]

位错偶极子密度 \(\rho_{di}\) :rho_di [1/m^2]

热滑移阻力项 \(\tau_{pass}\) :tau_pass [Pa]

滑移系滑移方向的单位向量 \({\boldsymbol{m}}\)\({\boldsymbol{m}}^{*}\) :m_s

滑移系滑移面法向的单位向量 \({\boldsymbol{n}}\)\({\boldsymbol{n}}^{*}\) :n_s

塑性旋率张量 \({{\boldsymbol{W}}^{\rm{{p_{\text{s}}}}}}\) 中的 \(\boldsymbol{\Omega}^{(\alpha)}\) :Omega

塑性变形率张量 \({{\boldsymbol{D}}^{\rm{{p_{\text{s}}}}}}\) 中的 \({\boldsymbol{P}}^{\left( \alpha \right)}\) :P

求解Jaumann率的中间项 \({{\boldsymbol {\Omega }}^{\left( \alpha \right)}} \cdot {\boldsymbol{\sigma}} - {\boldsymbol{\sigma}} \cdot {{\rm{\Omega }}^{\left( \alpha \right)}}\) :Q

Jaumann率中的旋转部分 \(\mathbb{C}:{{\boldsymbol{P}}^{\left( \alpha \right)}} + {{\boldsymbol {\Omega }}^{\left( \alpha \right)}} \cdot {\boldsymbol{\sigma}} - {\boldsymbol{\sigma}} \cdot {{\rm{\Omega }}^{\left( \alpha \right)}}\) :S

弹性模量张量 \(\mathbb{C}\) :C [Pa]

剪切应变 \(\gamma\) :gamma [-]

滑移系的剪切应变率 \(\dot{\gamma}\) :gamma_dot [1/s]

剪切应变速率初值 \(\Delta \gamma_{t}^{(\alpha)}\) :gamma_dot_t [1/s]

用于迭代的剪切应变速率 \(\Delta \gamma_{t+\Delta t}^{(\alpha)}\) :gamma_dot [1/s]

模型中间变量 \(X^{\left( \alpha \right)}\) :X [-]

剪切模量 \(G\) :G [Pa]

温度 \(T\) :temperature [K]

固溶强度 \(\tau_{sol}\) :tau_sol [Pa]

位错滑移速度 \(v_0\) :v_0 [m/s]

平均晶粒尺寸 \(d\) :d_grain [m]

玻尔兹曼常数 \(k_b\) :k_b [J/K]

位错滑移阻力拟合参数 \({q_{\text{s}}}\) :q_s [-]

位错滑移阻力拟合参数 \({p_{\text{s}}}\) :p_s [-]

位错滑移激活能 \(Q_s\) :Q_s [J]

位错滑移柏氏矢量长度 \(b_s\) :b_s [m]

位错攀移激活能 \(Q_{climb}\) :Q_climb [J]

位错湮灭拟合参数 \(c_{anni}\) :c_anni [-]

平均位错间隔拟合参数 \(i_{slip}\) :i_slip [-]

自扩散系数因子 \(D_0\) :D_0 [m^2/s]

位错攀移激活体积 \(\Omega_{climb}\) :Omega_climb [m^3]

硬化系数矩阵 \(H\) :H [-]

参考文献:

[1] A Patra, S Chaudhary, N Pai, et al., ρ-CP: Open source dislocation density based crystal plasticity framework for simulating temperature- and strain rate-dependent deformation, Comput. Mater. Sci., 2023, 224:112182.

[2] 近代连续介质力学. 赵亚溥.

[3] Nonlinear Finite Elements for Continua and Structures, Ted Belytschko.

[4] E Orowan, Zur Kristallplastizitat. I-III, Z. für Phys., 1934, 89(9-10):605-613.

[5] W Blum and P Eisenlohr, Dislocation mechanics of creep, Mater. Sci. Eng. A, 2009, 510-511:7–13.

[6] A Ma and F Roters, A constitutive model for fcc single crystals based on dislocation densities and its application to uniaxial compression of aluminium single crystals, Acta Mater., 2004, 52(12):3603-3612.

i_slip: ndarray
k_b: float
m_s: ndarray
material: Material
n_s: ndarray
output: dict[str, ndarray]
p_s: ndarray
q_s: ndarray
section: Section
slip_system_name: list[str]
tangent: ndarray
tau_sol: ndarray
temperature: float
theta: float
tolerance: float
total_number_of_slips: int
u_global: ndarray
u_grain: ndarray
v_0: ndarray
v_global: ndarray
v_grain: ndarray
w_global: ndarray
w_grain: ndarray
pyfem.materials.PlasticKinematicHardening module
class pyfem.materials.PlasticKinematicHardening.PlasticKinematicHardening(material: Material, dimension: int, section: Section)[源代码]

基类:BaseMaterial

随动强化塑性材料。

支持的截面属性:(‘Volume’, ‘PlaneStress’, ‘PlaneStrain’)

变量:
  • E (float) – Young’s modulus E

  • nu (float) – Poisson’s ratio nu

  • yield_stress (float) – Yield stress

  • hard (float) – Hardening coefficient

  • EBULK3 (float) – 3倍体积模量

  • EG (float) – 剪切模量

  • EG2 (float) – 2倍剪切模量

  • EG3 (float) – 3倍剪切模量

  • ELAM (float) – 拉梅常数

  • tolerance (float) – 判断屈服的误差容限

E: float
EBULK3: float
EG: float
EG2: float
EG3: float
ELAM: float
allowed_section_types: tuple
create_tangent()[源代码]
data_dict: dict[str, float]
data_keys: list[str]
dimension: int
get_tangent(variable: dict[str, ndarray], state_variable: dict[str, ndarray], state_variable_new: dict[str, ndarray], element_id: int, iqp: int, ntens: int, ndi: int, nshr: int, timer: Timer) tuple[ndarray, dict[str, ndarray]][源代码]
hard: float
material: Material
nu: float
output: dict[str, ndarray]
section: Section
tangent: ndarray
tolerance: float
yield_stress: float
pyfem.materials.PlasticKinematicHardening.get_smises(s: ndarray) float[源代码]
pyfem.materials.ThermalIsotropic module
class pyfem.materials.ThermalIsotropic.ThermalIsotropic(material: Material, dimension: int, section: Section)[源代码]

基类:BaseMaterial

各项同性热传导材料。

支持的截面属性:(‘’, ‘Volume’, ‘PlaneStress’, ‘PlaneStrain’)

变量:
  • k (float) – Conductivity k

  • cp (float) – Capacity cp

allowed_section_types: tuple
cp: float
create_tangent()[源代码]
data_dict: dict[str, float]
data_keys: list[str]
dimension: int
get_tangent(variable: dict[str, ndarray], state_variable: dict[str, ndarray], state_variable_new: dict[str, ndarray], element_id: int, iqp: int, ntens: int, ndi: int, nshr: int, timer: Timer) tuple[ndarray, dict[str, ndarray]][源代码]
k: float
material: Material
output: dict[str, ndarray]
section: Section
tangent: ndarray
pyfem.materials.UMAT module
pyfem.materials.ViscoElasticMaxwell module
class pyfem.materials.ViscoElasticMaxwell.ViscoElasticMaxwell(material: Material, dimension: int, section: Section)[源代码]

基类:BaseMaterial

广义Maxwell粘弹性材料。

支持的截面属性:(‘Volume’, ‘PlaneStress’, ‘PlaneStrain’)

变量:
  • E0 (float) – 弹性单元的弹性模量

  • E1 (float) – 第1个粘弹性单元的弹性模量

  • E2 (float) – 第2个粘弹性单元的弹性模量

  • E3 (float) – 第3个粘弹性单元的弹性模量

  • TAU1 (float) – 第1个粘弹性单元的时间系数

  • TAU2 (float) – 第2个粘弹性单元的时间系数

  • TAU3 (float) – 第3个粘弹性单元的时间系数

  • nu (float) – 泊松比

本构方程的一维标量形式[1]:

()\[\sigma \left( t \right) = {E_0}{\varepsilon _0} + \sum\limits_{i = 1}^n {\left( {{E_i}{e^{ - \frac{t}{{{\tau _i}}}}}} \right){\varepsilon _0} + } {E_0}\left[ {\varepsilon \left( t \right) - {\varepsilon _0}} \right] + \int_0^t {\sum\limits_{i = 1}^n {\left( {{E_i}{e^{ - \frac{{t - s}}{{{\tau _i}}}}}} \right)} \frac{{\partial \varepsilon \left( s \right)}}{{\partial s}}{\text{d}}s}\]

本构方程的三维离散格式:

()\[\left\{ {\sigma \left( {{t_{n + 1}}} \right)} \right\} = \left[ {{C^{\text{e}}}} \right]\{ \varepsilon \left( {{t_n}} \right)\} + \sum\limits_{i = 1}^N {{e^{ - \frac{{\Delta {t_{n + 1}}}}{{{\tau _i}}}}}{h_i}\left( {{t_n}} \right)} + \left[ {1 + \sum\limits_{i = 1}^N {{\gamma _i}{\tau _i}\left( {1 - {e^{ - \frac{{\Delta {t_{n + 1}}}}{{{\tau _i}}}}}} \right)} } \right]\left[ {{C^{\text{e}}}} \right]\left\{ {\Delta \varepsilon \left( {{t_{n + 1}}} \right)} \right\}\]

其中,

()\[\begin{split}\left\{ \begin{gathered} {\tau _i} = \frac{{{\eta _i}}}{{{E_i}}} \hfill \\ {\gamma _i} = \frac{{{E_i}}}{{{E_0}}} \hfill \\ {h_i}\left( t \right) = {E_i}\int_0^t {{e^{ - \frac{{t - s}}{{{\tau _i}}}}}\frac{{\partial \varepsilon \left( s \right)}}{{\partial s}}{\text{d}}s} \hfill \\ \end{gathered} \right.\end{split}\]
()\[\begin{split}\left[ {{C^{\text{e}}}} \right] = \left[ {\begin{array}{*{20}{c}} {K + \frac{4}{3}{\mu _0}}&{K - \frac{2}{3}{\mu _0}}&{K - \frac{2}{3}{\mu _0}}&0&0&0 \\ {K - \frac{2}{3}{\mu _0}}&{K + \frac{4}{3}{\mu _0}}&{K - \frac{2}{3}{\mu _0}}&0&0&0 \\ {K - \frac{2}{3}{\mu _0}}&{K - \frac{2}{3}{\mu _0}}&{K + \frac{4}{3}{\mu _0}}&0&0&0 \\ 0&0&0&{{\mu _0}}&0&0 \\ 0&0&0&0&{{\mu _0}}&0 \\ 0&0&0&0&0&{{\mu _0}} \end{array}} \right]\end{split}\]

编写get_tangent函数时用到的积分格式:

()\[h_i^{n + 1} = {e^{ - \frac{{\Delta t}}{{{\tau _i}}}}}h_i^n + {\gamma _i}\frac{{\left( {1 - {e^{ - \frac{{\Delta t}}{{{\tau _i}}}}}} \right)}}{{\frac{{\Delta t}}{{{\tau _i}}}}}{{\mathbf{C}}^{\text{e}}}{\text{:}}\Delta {{\mathbf{\varepsilon }}^{n + 1}}\]
()\[{{\mathbf{\sigma }}^{n + 1}} = {{\mathbf{C}}^{\text{e}}}{\text{:}}{{\mathbf{\varepsilon }}^n} + \sum\limits_{i = 1}^N {{e^{ - \frac{{\Delta t}}{{{\tau _i}}}}}} h_i^n + \left[ {1 + \sum\limits_{i = 1}^N {\frac{{{\gamma _i}{\tau _i}}}{{\Delta t}}\left( {1 - {e^{ - \frac{{\Delta t}}{{{\tau _i}}}}}} \right)} } \right]{{\mathbf{C}}^{\text{e}}}{\text{:}}\Delta {{\mathbf{\varepsilon }}^{n + 1}}\]

材料的一致性刚度矩阵 ddsdde:

()\[\frac{{\partial \Delta {\mathbf{\sigma }}}}{{\partial \Delta {\mathbf{\varepsilon }}}} = \left[ {1 + \sum\limits_{i = 1}^N {\frac{{{\gamma _i}{\tau _i}}}{{\Delta t}}\left( {1 - {e^{ - \frac{{\Delta t}}{{{\tau _i}}}}}} \right)} } \right]{{\mathbf{C}}^{\text{e}}}\]

[1] Gillani A. Development of Material Model Subroutines for Linear and Nonlinear Response of Elastomers[D]. The University of Western Ontario (Canada), 2018.

E0: float
E1: float
E2: float
E3: float
TAU1: float
TAU2: float
TAU3: float
allowed_section_types: tuple
create_tangent()[源代码]
data_dict: dict[str, float]
data_keys: list[str]
dimension: int
get_tangent(variable: dict[str, ndarray], state_variable: dict[str, ndarray], state_variable_new: dict[str, ndarray], element_id: int, iqp: int, ntens: int, ndi: int, nshr: int, timer: Timer) tuple[ndarray, dict[str, ndarray]][源代码]
material: Material
nu: float
output: dict[str, ndarray]
section: Section
tangent: ndarray
pyfem.materials.crystal_slip_system module

提供晶体变形系统的信息

本模块中包含3个字典:slip_dictcleavage_dicttwin_dict

其中,字典 slip_dict 支持的键值为:

fcc{111}<110>
fcc{110}<110>
bcc{110}<111>
bcc{112}<111>
bcc{123}<111>
hcp{001}<-1-10>
hcp{1-10}<-1-10>
hcp{-111}<-1-10>
hcp{-101}<113>
hcp{-112}<113>
bct{100}<001>
bct{110}<001>
bct{100}<010>
bct{110}<1-11>
bct{110}<1-10>
bct{100}<011>
bct{001}<010>
bct{001}<110>
bct{011}<01-1>
bct{011}<1-11>
bct{011}<100>
bct{211}<01-1>
bct{211}<-111>

字典 twin_dict 支持的键值为:

fcc{111}<112>
bcc{112}<111>
hcp{102}<-101>
hcp{-1-1-1}<116>
hcp{101}<10-2>
hcp{112}<11-3>

字典 cleavage_dict 支持的键值为:

fcc{001}<001>
bcc{001}<001>

对于 FCC(Face Centered Cubic)、BCC(Body Centered Cubic)、BCT(Face Centered Tetragonal) 晶系, 3个字典的返回值为晶体变形系统三轴直角坐标系的晶向指数和晶面法向指数组成的元组 (ndarray, ndarray)。 根据变形系统的类型,首先通过 generate_mn 函数获得存储在字典中的晶向指数与晶面法向指数,然后再对元组中的元素归一化, 最终获得变形系统的变形数目以及单位化的晶体晶向指数和晶面法向指数。

对于 HCP(Hexagonal Close Packed) 晶系,3个字典的返回值为晶体变形系统的方向指数和平面指数组成的元组 (ndarray, ndarray)。 其方向指数和平面指数都是在非正交的四轴坐标系中用密勒-布喇菲指数表示的,但在有限元软件中一般使用笛卡尔直角坐标系,所以对于 HCP 晶系, 想要获得晶体的晶向指数与晶面法向指数,还需要进行坐标系的转换。具体流程为:第一步,根据晶体变形系统的类型,通过 generate_mn 函数获得存储在字典中的方向指数和平面指数。 第二步,将四轴坐标系的方向指数和平面指数转换为笛卡尔直角坐标系的晶向指数和晶面法向指数。第三步,对元组中的元素归一化,最终获得变形系统的变形数目以及单位化的晶体晶向指数和晶面法向指数。

以下为转化过程:

  1. 将六方晶系四轴坐标系的方向指数与平面指数转化为三轴坐标系的晶向指数与晶面法向指数。

假设四轴坐标系的方向指数为 \(\left[ {u{\text{ }}v{\text{ }}t{\text{ }}w} \right]\) , 则三轴坐标系的晶向指数 \(\left[ {U{\text{ }}V{\text{ }}W} \right]\) 用四轴坐标系的方向指数表示为:

()\[\begin{split}\left( {\begin{array}{*{20}{c}} U \\ V \\ W \end{array}} \right) = \left[ {\begin{array}{*{20}{c}} 2&1&0&0 \\ 1&2&0&0 \\ 0&0&0&1 \end{array}} \right]\left( {\begin{array}{*{20}{c}} u \\ v \\ t \\ w \end{array}} \right) = {A^{\left( 1 \right)}}\left( {\begin{array}{*{20}{c}} u \\ v \\ t \\ w \end{array}} \right)\end{split}\]

其中, \({A^{\left( 1 \right)}}\) 为四轴坐标系方向指数与三轴坐标系晶向指数的转换矩阵。

假设四轴坐标系的平面指数为 \(\left( {h{\text{ }}k{\text{ }}i{\text{ }}l} \right)\) ,其对应的三轴坐标系的平面指数只需要去掉第三个指数, 即三轴坐标系的平面指数 \(\left( {{h^{\left( 1 \right)}}{\text{ }}{k^{\left( 1 \right)}}{\text{ }}{l^{\left( 1 \right)}}} \right)\) 为:

()\[\begin{split}\left( {\begin{array}{*{20}{c}} {{h^{\left( 1 \right)}}} \\ {{k^{\left( 1 \right)}}} \\ {{l^{\left( 1 \right)}}} \end{array}} \right) = \left[ {\begin{array}{*{20}{c}} 1&0&0&0 \\ 0&1&0&0 \\ 0&0&0&1 \end{array}} \right]\left( {\begin{array}{*{20}{c}} h \\ k \\ i \\ l \end{array}} \right) = {B^{\left( 1 \right)}}\left( {\begin{array}{*{20}{c}} h \\ k \\ i \\ l \end{array}} \right)\end{split}\]

其中, \({B^{\left( 1 \right)}}\) 为四轴坐标平面指数与三轴坐标平面指数的变换矩阵。

由于六方晶系三轴坐标系的平面指数和晶面法向指数不同,根据倒易点阵的相关知识,三轴坐标系的晶面法向指数 \(\left( {{h^3}{\text{ }}{k^3}{\text{ }}{l^3}} \right)\) 可用三轴坐标系的平面指数表示为:

()\[\begin{split}\left( {\begin{array}{*{20}{c}} {{h^3}} \\ {{k^3}} \\ {{l^3}} \end{array}} \right) = T\left( {\begin{array}{*{20}{c}} {{h^{\left( 1 \right)}}} \\ {{k^{\left( 1 \right)}}} \\ {{l^{\left( 1 \right)}}} \end{array}} \right) = \left[ {\begin{array}{*{20}{c}} {\frac{4}{3}}&{\frac{2}{3}}&0 \\ {\frac{2}{3}}&{\frac{4}{3}}&0 \\ 0&0&{{{\left( {\frac{a}{c}} \right)}^2}} \end{array}} \right]{B^{\left( 1 \right)}}\left( {\begin{array}{*{20}{c}} h \\ k \\ i \\ l \end{array}} \right) = \left[ {\begin{array}{*{20}{c}} {\frac{4}{3}}&{\frac{2}{3}}&0&0 \\ {\frac{2}{3}}&{\frac{4}{3}}&0&0 \\ 0&0&0&{{{\left( {\frac{a}{c}} \right)}^2}} \end{array}} \right]\left( {\begin{array}{*{20}{c}} h \\ k \\ i \\ l \end{array}} \right) = {B^{\left( 2 \right)}}\left( {\begin{array}{*{20}{c}} h \\ k \\ i \\ l \end{array}} \right)\end{split}\]

其中, \(c/a\) 为六方晶系的晶轴比, \(T\) 为六方晶系三轴坐标系平面指数与三轴坐标系晶面法向指数的转换矩阵, 由倒易点阵性质求得,见相关知识的补充。 \({B^{\left( 2 \right)}}\) 为六方晶系四轴坐标系平面指数与三轴坐标系晶面法向指数的变换矩阵。

  1. 将三轴坐标系的晶向指数 \(\left[ {U{\text{ }}V{\text{ }}W} \right]\) 和晶面法向指数 \(\left( {{h^3}{\text{ }}{k^3}{\text{ }}{l^3}} \right)\) 转换为直角坐标系的晶向指数与晶面法向指数。

六方晶系三轴坐标系和直角坐标系的相对位置如下图所示:

                       z, c
                       *
                       *
                       *
                       *
                       *
                       *
                       *
                       *
                       *
                       *
                       *
                       *
                       *
                       *
                       o * * * * * * * * * * * * * * * * y, a2
                     **   |
                   * *---90°
                 *  *
               *   *
             *    *
           *     *
         *      *
       *\      *
     *   30°--*
   *         *
a1          *
           *
          x

其中,六方晶系的三轴坐标系是将单胞的 \({\mathbf{a}}\)\({\mathbf{b}}\) 轴标为 \({{{\mathbf{a}}_1}}\)\({{{\mathbf{a}}_2}}\) 轴, \({\mathbf{c}}\) 轴保持不变。 \({\mathbf{c}}\) 轴 垂直于 \({{{\mathbf{a}}_1}} - {{{\mathbf{a}}_2}}\) 平面, \({{{\mathbf{a}}_1}} - {{{\mathbf{a}}_2}}\) 轴的夹角为 \({120^ \circ }\)\({{{\mathbf{a}}_1}} - {{{\mathbf{a}}_2}}\) 轴基矢 的模: \(\left| {{{\mathbf{a}}_1}} \right| = \left| {{{\mathbf{a}}_2}} \right| = a\)\({\mathbf{c}}\) 轴基矢的模: \(\left| {\mathbf{c}} \right| = c\)

三轴坐标系的 \({{{\mathbf{a}}_2}}\) 轴与直角坐标系的 \({\mathbf{y}}\) 轴平行,三轴坐标系的 \({\mathbf{c}}\) 轴与直角坐标系的 \({\mathbf{z}}\) 轴平行, \({\mathbf{x}}\) 轴与 \({{{\mathbf{a}}_1}}\) 轴之间的夹角为 \({30^ \circ }\) 。 得到转换公式:

()\[\begin{split}\left( {\begin{array}{*{20}{c}} x \\ y \\ z \end{array}} \right) = \left[ {\begin{array}{*{20}{c}} {\cos ({{30}^ \circ })}&0&0 \\ { - \sin ({{30}^ \circ })}&1&0 \\ 0&0&{\frac{c}{a}} \end{array}} \right]\left( {\begin{array}{*{20}{c}} {{a_1}} \\ {{a_2}} \\ c \end{array}} \right) = \left[ {\begin{array}{*{20}{c}} {\frac{{\sqrt 3 }}{2}}&0&0 \\ { - \frac{1}{2}}&1&0 \\ 0&0&{\frac{c}{a}} \end{array}} \right]\left( {\begin{array}{*{20}{c}} {{a_1}} \\ {{a_2}} \\ c \end{array}} \right) = C\left( {\begin{array}{*{20}{c}} {{a_1}} \\ {{a_2}} \\ c \end{array}} \right)\end{split}\]

其中,矩阵 \(C\) 是三轴坐标系和直角坐标系的变换矩阵。

利用变换矩阵 \(C\) 并结合之前计算得到的三轴坐标系晶向指数 \(\left[ {U{\text{ }}V{\text{ }}W} \right]\) 和晶面法向指数 \(\left( {{h^3}{\text{ }}{k^3}{\text{ }}{l^3}} \right)\) , 可计算得出直角坐标系的晶向指数 \(\left[ {{w^r}{\text{ }}{v^r}{\text{ }}{w^r}} \right]\) 为:

()\[\begin{split}\left( {\begin{array}{*{20}{c}} {{u^r}} \\ {{v^r}} \\ {{w^r}} \end{array}} \right) = C\left( {\begin{array}{*{20}{c}} U \\ V \\ W \end{array}} \right) = C{A^{\left( 1 \right)}}\left( {\begin{array}{*{20}{c}} u \\ v \\ t \\ w \end{array}} \right) = \left[ {\begin{array}{*{20}{c}} {\sqrt 3 }&{\frac{{\sqrt 3 }}{2}}&0&0 \\ 0&{\frac{3}{2}}&0&0 \\ 0&0&0&{\frac{c}{a}} \end{array}} \right]\left( {\begin{array}{*{20}{c}} u \\ v \\ t \\ w \end{array}} \right) = \left( {\begin{array}{*{20}{c}} {\frac{{\sqrt 3 }}{2}\left( {2u + v} \right)} \\ {\frac{3}{2}v} \\ {\frac{c}{a}w} \end{array}} \right)\end{split}\]

直角坐标系的晶面法向指数 \(\left( {{h^r}{\text{ }}{k^r}{\text{ }}{l^r}} \right)\) 为:

()\[\begin{split}\left( {\begin{array}{*{20}{c}} {{h^r}} \\ {{k^r}} \\ {{l^r}} \end{array}} \right) = C\left( {\begin{array}{*{20}{c}} {{h^3}} \\ {{k^3}} \\ {{l^3}} \end{array}} \right) = C{B^{\left( 2 \right)}}\left( {\begin{array}{*{20}{c}} h \\ k \\ i \\ l \end{array}} \right) = \left[ {\begin{array}{*{20}{c}} {\frac{2}{{\sqrt 3 }}}&{\frac{1}{{\sqrt 3 }}}&0&0 \\ 0&1&0&0 \\ 0&0&0&{\frac{a}{c}} \end{array}} \right]\left( {\begin{array}{*{20}{c}} h \\ k \\ i \\ l \end{array}} \right) = \left( {\begin{array}{*{20}{c}} {\frac{1}{{\sqrt 3 }}\left( {2h + k} \right)} \\ k \\ 0 \\ {\frac{a}{c}l} \end{array}} \right)\end{split}\]

最后对直角坐标系的晶向指数 \(\left[ {{w^r}{\text{ }}{v^r}{\text{ }}{w^r}} \right]\) 和晶面法向指数 \(\left( {{h^r}{\text{ }}{k^r}{\text{ }}{l^r}} \right)\) 归一化, 得到六方晶系直角坐标系下单位化的晶向指数和晶面法向指数,即可应用于后续计算。

倒易矩阵相关知识补充:

  1. 定义

有两种点阵,它们的点阵参数分别为 \({\mathbf{a}},{\mathbf{b}},{\mathbf{c}},\alpha ,\beta ,\gamma\)\({{\mathbf{a}}^*},{{\mathbf{b}}^*},{{\mathbf{c}}^*},{\alpha ^*},{\beta ^*},{\gamma ^*}\) 。 用符号 \(\left( {\square ,\square } \right)\) 表示两个矢量的内积。两种点阵的点阵参数之间存在以下关系:

()\[\left( {{\mathbf{a}},{{\mathbf{a}}^*}} \right) = \left( {{\mathbf{b}},{{\mathbf{b}}^*}} \right) = \left( {{\mathbf{c}},{{\mathbf{c}}^*}} \right) = 1\]
()\[\left( {{\mathbf{a}},{{\mathbf{b}}^*}} \right) = \left( {{\mathbf{a}},{{\mathbf{c}}^*}} \right) = \left( {{\mathbf{b}},{{\mathbf{c}}^*}} \right) = \left( {{\mathbf{b}},{{\mathbf{a}}^*}} \right) = \left( {{\mathbf{c}}, {{\mathbf{a}}^*}} \right) = \left( {{\mathbf{c}},{{\mathbf{b}}^*}} \right) = 0\]

则这两个点阵互为倒易。如果 \({\mathbf{a}},{\mathbf{b}},{\mathbf{c}},\alpha ,\beta ,\gamma\) 确定的点阵是真实点阵(正点阵)的点阵参数, 则 \({{\mathbf{a}}^*},{{\mathbf{b}}^*},{{\mathbf{c}}^*} ,{\alpha ^*},{\beta ^*},{\gamma ^*}\) 确定的点阵是前者的倒易点阵。根据定义, \({{\mathbf{a}}^*},{{\mathbf{b}}^*},{{\mathbf{c}}^*}\) 分别垂直于 \(bc,ca,ab\) 平面。

  1. 倒易矢量在晶体学几何关系中的应用

2.1 求点阵平面的法线方向指数

对于六方晶系,由于正点阵中的面 \(\left( {{h}{\text{ }}{k}{\text{ }}{l}} \right)\) 与其晶面法向指数 \(\left( {{h^*}{\text{ }}{k^*}{\text{ }}{l^*}} \right)\) 一般不同名, 但是, \(\left( {{h}{\text{ }}{k}{\text{ }}{l}} \right)\) 一定和与它同名的倒易矢量 \({\left( {h{\text{ }}k{\text{ }}l} \right)^*}\) 垂直,即 \(\left( {{h^*}{\text{ }}{k^*}{\text{ }}{l^*}} \right)\parallel {\left( {h{\text{ }}k{\text{ }}l} \right)^*}\) 。 当只考虑方向,不考虑矢量的绝对长度,有

()\[h{{\mathbf{a}}^*} + k{{\mathbf{b}}^*} + l{{\mathbf{c}}^*} = {h^*}{\mathbf{a}} + {k^*}{\mathbf{b}} + {l^*}{\mathbf{c}}\]

\({{\mathbf{a}}^*},{{\mathbf{b}}^*},{{\mathbf{c}}^*}\) 同时点乘上式两端,根据点阵参数之间的性质,得到:

()\[\begin{split}\begin{gathered} {h^*} = h({{\mathbf{a}}^*},{{\mathbf{a}}^*}) + k({{\mathbf{a}}^*},{{\mathbf{b}}^*}) + l({{\mathbf{a}}^*},{{\mathbf{c}}^*}) \hfill \\ {k^*} = h({{\mathbf{b}}^*},{{\mathbf{a}}^*}) + k({{\mathbf{b}}^*},{{\mathbf{b}}^*}) + l({{\mathbf{b}}^*},{{\mathbf{c}}^*}) \hfill \\ {l^*} = h({{\mathbf{c}}^*},{{\mathbf{a}}^*}) + k({{\mathbf{c}}^*},{{\mathbf{b}}^*}) + l({{\mathbf{c}}^*},{{\mathbf{c}}^*}) \hfill \\ \end{gathered}\end{split}\]

把上面三个式子写成矩阵形式:

()\[\begin{split}\left( {\begin{array}{*{20}{l}} {{h^*}} \\ {{k^*}} \\ {{l^*}} \end{array}} \right) = \left[ {\begin{array}{*{20}{c}} {({{\mathbf{a}}^*},{{\mathbf{a}}^*})}&{({{\mathbf{a}}^*},{{\mathbf{b}}^*})}&{({{\mathbf{a}}^*},{{\mathbf{c}}^*})} \\ {({{\mathbf{b}}^*},{{\mathbf{a}}^*})}&{({{\mathbf{b}}^*},{{\mathbf{b}}^*})}&{({{\mathbf{b}}^*},{{\mathbf{c}}^*})} \\ {({{\mathbf{c}}^*},{{\mathbf{a}}^*})}&{({{\mathbf{c}}^*},{{\mathbf{b}}^*})}&{({{\mathbf{c}}^*},{{\mathbf{c}}^*})} \end{array}} \right]\left( {\begin{array}{*{20}{l}} h \\ k \\ l \end{array}} \right) = D\left( {\begin{array}{*{20}{l}} h \\ k \\ l \end{array}} \right)\end{split}\]

其中, \(D\) 是平面指数和晶面法向指数的变换矩阵。当知道倒易点阵基矢 \({{\mathbf{a}}^*},{{\mathbf{b}}^*},{{\mathbf{c}}^*}\) 后就可求平面 \(\left( {{h}{\text{ }}{k}{\text{ }}{l}} \right)\) 的 法线方向指数(晶面法向指数) \(\left( {{h^*}{\text{ }}{k^*}{\text{ }}{l^*}} \right)\)

同理,可由晶面法线方向指数 \(\left( {{h^*}{\text{ }}{k^*}{\text{ }}{l^*}} \right)\) 得到平面指数 \(\left( {{h}{\text{ }}{k}{\text{ }}{l}} \right)\) 。即:

()\[\begin{split}\left( {\begin{array}{*{20}{l}} h \\ k \\ l \end{array}} \right) = \left[ {\begin{array}{*{20}{c}} {({\mathbf{a}},{\mathbf{a}})}&{({\mathbf{a}},{\mathbf{b}})}&{({\mathbf{a}},{\mathbf{c}})} \\ {({\mathbf{b}},{\mathbf{a}})}&{({\mathbf{b}},{\mathbf{b}})}&{({\mathbf{b}},{\mathbf{c}})} \\ {({\mathbf{c}},{\mathbf{a}})}&{({\mathbf{c}},{\mathbf{b}})}&{({\mathbf{c}},{\mathbf{c}})} \end{array}} \right]\left( {\begin{array}{*{20}{l}} {{h^*}} \\ {{k^*}} \\ {{l^*}} \end{array}} \right) = E\left( {\begin{array}{*{20}{l}} {{h^*}} \\ {{k^*}} \\ {{l^*}} \end{array}} \right) = {D^{ - 1}}\left( {\begin{array}{*{20}{l}} {{h^*}} \\ {{k^*}} \\ {{l^*}} \end{array}} \right)\end{split}\]

对于六方晶系,通过查表或者按照定义直接求解,得到 \({{\mathbf{a}}^*},{{\mathbf{b}}^*},{{\mathbf{c}}^*}\) 的长度分别为 \(\frac{2}{{\sqrt 3 }}a,\frac{2}{{\sqrt 3 }}a,\frac{1}{c}\) ,此处 \(a,c\) 分别对应三轴坐标系 \({{{\mathbf{a}}_1}},{{{\mathbf{a}}_2}}\)\({\mathbf{c}}\) 轴的模长。 代入平面指数与晶面法向指数变换矩阵 \(D\) ,得到:

()\[\begin{split}{D_{{\text{HCP}}}} = \left[ {\begin{array}{*{20}{c}} {\frac{4}{3}{a^2}}&{\frac{2}{3}{a^2}}&0 \\ {\frac{2}{3}{a^2}}&{\frac{4}{3}{a^2}}&0 \\ 0&0&{\frac{1}{{{c^2}}}} \end{array}} \right]\end{split}\]

\(D_{{\text{HCP}}}\) 乘以 \({{a}^2}\) ,即得到与三轴坐标系晶面法向指数和三轴坐标系平面指数转换矩阵 \(T\) 相同的形式。

参考书:材料科学基础-第2版-余永宁,P35-48

pyfem.materials.crystal_slip_system.generate_mn(system_type: str, system_name: str, c_over_a: float) tuple[int, ndarray, ndarray][源代码]
pyfem.materials.crystal_slip_system.process_string(string)[源代码]
pyfem.materials.get_material_data module
pyfem.materials.get_material_data.get_material_data(material: Material, dimension: int, section: Section) BaseMaterial | MechanicalThermalExpansion | PhaseFieldDamage | PlasticKinematicHardening | ThermalIsotropic | ViscoElasticMaxwell | ElasticIsotropic | DiffusionIsotropic[源代码]

工厂函数,用于根据材料属性生产不同的材料对象。

参数:
  • material (Material) – 材料属性

  • dimension (int) – 空间维度

  • section (Section) – 截面属性

返回:

材料对象

返回类型:

MaterialData

Module contents
pyfem.mesh package
Submodules
pyfem.mesh.MeshData module
class pyfem.mesh.MeshData.MeshData[源代码]

基类:object

网格数据类。

变量:
  • dimension (int) – 空间维度

  • mesh (meshio.Mesh) – meshio返回的网格对象

  • nodes (ndarray) – 节点数组

  • elements (list[ndarray]) – 单元数组列表

  • bc_elements (list[ndarray]) – 边界单元数组列表

  • node_sets (dict[str, list[int]]) – 节点集合字典

  • element_sets (dict[str, list[int]]) – 单元集合字典

  • bc_element_sets (dict[str, list[int]]) – 边界单元集合字典

add_to_node_sets(node_set_name: str, node_ids: list[int]) None[源代码]
bc_element_sets: dict[str, list[int]]
bc_elements: list[ndarray]
dimension: int
element_sets: dict[str, list[int]]
elements: list[ndarray]
mesh: Mesh
node_sets: dict[str, list[int]]
nodes: ndarray
read_file(**kwargs)
show() None[源代码]
to_string(level: int = 1) str[源代码]
Module contents
pyfem.quadrature package
Submodules
pyfem.quadrature.BaseQuadrature module
class pyfem.quadrature.BaseQuadrature.BaseQuadrature(order: int, dimension: int)[源代码]

基类:object

数值积分基类。

变量:
  • dimension (int) – 空间维度

  • order (int) – 插值阶次

  • qp_coords (ndarray) – 积分点坐标

  • qp_weights (ndarray) – 积分点权重

dimension: int
get_quadrature_coords_and_weights() tuple[ndarray, ndarray][源代码]
order: int
qp_coords: ndarray
qp_number: int
qp_weights: ndarray
show() None[源代码]
to_string(level: int = 1) str[源代码]
pyfem.quadrature.GaussLegendreQuadrature module
class pyfem.quadrature.GaussLegendreQuadrature.GaussLegendreQuadrature(order: int, dimension: int)[源代码]

基类:BaseQuadrature

基于 Gauss-Legendre 多项式计算笛卡尔坐标系下标准线段、正方形和立方体的积分点坐标和权重。

标准线段:

(-1)    (0)     (1)
 0---------------1
         +-->ξ

标准正方形:

(-1,1)           (1,1)
  3---------------2
  |       η       |
  |       |       |
  |       o--ξ    |
  |               |
  |               |
  0---------------1
(-1,-1)          (1,-1)

标准正六面体:

             (-1,1,1)        (1,1,1)
              7---------------6
             /|              /|
            / |     ζ  η    / |
           /  |     | /    /  |
(-1,-1,1) 4---+-----|/----5 (1,-1,1)
          |   |     o--ξ  |   |
          |   3-----------+---2 (1,1,-1)
          |  /(-1,1,-1)   |  /
          | /             | /
          |/              |/
          0---------------1
         (-1,-1,-1)      (1,-1,-1)
dimension: int
order: int
qp_coords: ndarray
qp_number: int
qp_weights: ndarray
pyfem.quadrature.PyramidQuadrature module
class pyfem.quadrature.PyramidQuadrature.PyramidQuadrature(order: int, dimension: int)[源代码]

基类:BaseQuadrature

计算笛卡尔坐标系下标准金字塔的积分点坐标和权重。

dimension: int
order: int
qp_coords: ndarray
qp_number: int
qp_weights: ndarray
pyfem.quadrature.TetrahedronQuadrature module
class pyfem.quadrature.TetrahedronQuadrature.TetrahedronQuadrature(order: int, dimension: int)[源代码]

基类:BaseQuadrature

计算笛卡尔坐标系下标准四面体的积分点坐标和权重:

(0,0,1)
 3
 * **
 *   * *
 *     *  *
 *       *   2 (0,1,0)
 *        **  *
 ζ     *     * *
 |  η          **
 0---ξ * * * * * 1
(0,0,0)         (1,0,0)
dimension: int
order: int
qp_coords: ndarray
qp_number: int
qp_weights: ndarray
pyfem.quadrature.TetrahedronQuadratureBarycentric module
class pyfem.quadrature.TetrahedronQuadratureBarycentric.TetrahedronQuadratureBarycentric(order: int, dimension: int)[源代码]

基类:BaseQuadrature

计算重心坐标系下标准四面体的积分点坐标和权重:

(0,0,0,1)
 3
 * **
 *   * *
 *     *  *
 *       *   2 (0,0,1,0)
 *        **  *
 *     *     * *
 *  *          **
 0 * * * * * * * 1
(1,0,0,0)       (0,1,0,0)
dimension: int
order: int
qp_coords: ndarray
qp_number: int
qp_weights: ndarray
pyfem.quadrature.TriangleQuadrature module
class pyfem.quadrature.TriangleQuadrature.TriangleQuadrature(order: int, dimension: int)[源代码]

基类:BaseQuadrature

计算笛卡尔坐标系下标准三角形的积分点坐标和权重:

(0,1)
 2
 * *
 *   *
 *     *
 η       *
 |         *
 0---ξ * * * 1
(0,0)       (1,0)

参考文献[1][2]中给出了重心坐标下的三角形积分点坐标和权重,我们将其转换为笛卡尔坐标。

参考文献:

[1] Dunavant D A .High degree efficient symmetrical Gaussian quadrature rules for the triangle[J].International Journal for Numerical Methods in Engineering, 2010, 21(6): 1129-1148. https://onlinelibrary.wiley.com/doi/10.1002/nme.1620210612

[2] D. M. Williams, L. Shunn, A. Jameson. Symmetric quadrature rules for simplexes based on sphere close packed lattice arrangements[J]. Journal of Computational and Applied Mathematics, 2014, 266: 18-38. https://www.sciencedirect.com/science/article/pii/S0377042714000211

dimension: int
order: int
qp_coords: ndarray
qp_number: int
qp_weights: ndarray
pyfem.quadrature.TriangleQuadratureBarycentric module
class pyfem.quadrature.TriangleQuadratureBarycentric.TriangleQuadratureBarycentric(order: int, dimension: int)[源代码]

基类:BaseQuadrature

计算笛卡尔坐标系下标准三角形的积分点坐标和权重:

(0,1)
 2
 * *
 *   *
 *     *
 η       *
 |         *
 0---ξ * * * 1
(0,0)       (1,0)

参考文献[1][2]中给出了重心坐标下的三角形积分点坐标和权重,我们将其转换为笛卡尔坐标。

参考文献:

[1] Dunavant D A .High degree efficient symmetrical Gaussian quadrature rules for the triangle[J].International Journal for Numerical Methods in Engineering, 2010, 21(6): 1129-1148. https://onlinelibrary.wiley.com/doi/10.1002/nme.1620210612

[2] D. M. Williams, L. Shunn, A. Jameson. Symmetric quadrature rules for simplexes based on sphere close packed lattice arrangements[J]. Journal of Computational and Applied Mathematics, 2014, 266: 18-38. https://www.sciencedirect.com/science/article/pii/S0377042714000211

dimension: int
order: int
qp_coords: ndarray
qp_number: int
qp_weights: ndarray
Module contents
pyfem.solvers package
Submodules
pyfem.solvers.ArcLengthSolver module
class pyfem.solvers.ArcLengthSolver.ArcLengthSolver(assembly: Assembly, solver: Solver)[源代码]

基类:BaseSolver

非线性求解器。

变量:
  • PENALTY (float) – 罚系数

  • FORCE_TOL (float) – 残差容限

  • MAX_NITER (int) – 最大迭代次数

  • BC_METHOD (str) – 边界条件施加方式

对于准静态过程,需要求解的线性系统可以表示为:

()\[{{\mathbf{f}}_{{\text{ext}}}} - {{\mathbf{f}}_{{\text{int}}}} = {\mathbf{0}}\]

虽然在静态力学过程中,时间不再起作用,但是我们仍然需要一个参数来排列事件的顺序。出于这个原因,我们将继续在静态力学过程中使用“时间”的概念来表示加载顺序。特别地,时间的概念可以用来将完整的外部载荷分解为若干个增量加载步骤。这样做的原因如下:

  1. 从非线性连续体模型的离散化得到的代数方程组是非线性的,因此需要使用迭代过程来求解。对于非常大的加载步骤(例如在一个增量步中施加整个载荷),通常很难获得一个正确收敛的解。对于大多数常用的迭代过程,包括牛顿-拉夫逊方法,其收敛半径都是有限的。

  2. 实验证明,大多数材料表现出路径相关的行为。这意味着根据所遵循的应变路径获得的应力值是不同的。例如,当我们首先对一个平板施加拉伸应变增量,然后施加剪切应变增量时,所得到的应力可能会不同,或者当以相反的顺序施加相同的应变增量时,结果应力也可能不同。显然,只有在应变增量相对较小的情况下,才能正确预测结构行为,以便尽可能地按照应变路径进行。

参考文献:

[1] Non‐Linear Finite Element Analysis of Solids and Structures, John Wiley & Sons, Ltd, 2012, 31-62, https://doi.org/10.1002/9781118375938.ch2

BC_METHOD: str
FORCE_TOL: float
MAX_NITER: int
PENALTY: float
assembly: Assembly
da_old
database: Database
dlam_old
dof_solution: ndarray
factor
incremental_iterative_solve(option: str) int[源代码]
lam: float
run() int[源代码]
solver: Solver
pyfem.solvers.BaseSolver module
class pyfem.solvers.BaseSolver.BaseSolver[源代码]

基类:object

求解器基类。

变量:
  • assembly (Assembly) – 装配体对象

  • solver (Solver) – 求解器属性

  • dof_solution (ndarray) – 求解得到自由度的值

assembly: Assembly
database: Database
dof_solution: ndarray
run() int[源代码]
show() None[源代码]
solve() int[源代码]
solver: Solver
to_string(level: int = 1) str[源代码]
pyfem.solvers.LinearSolver module
class pyfem.solvers.LinearSolver.LinearSolver(assembly: Assembly, solver: Solver)[源代码]

基类:BaseSolver

线性求解器。

变量:

PENALTY (float) – 罚系数

PENALTY: float
assembly: Assembly
database: Database
dof_solution: ndarray
run() int[源代码]
solve() int[源代码]
solver: Solver
pyfem.solvers.NonlinearSolver module
class pyfem.solvers.NonlinearSolver.NonlinearSolver(assembly: Assembly, solver: Solver)[源代码]

基类:BaseSolver

非线性求解器。

变量:
  • PENALTY (float) – 罚系数

  • FORCE_TOL (float) – 残差容限

  • MAX_NITER (int) – 最大迭代次数

  • BC_METHOD (str) – 边界条件施加方式

对于准静态过程,需要求解的线性系统可以表示为:

()\[{{\mathbf{f}}_{{\text{ext}}}} - {{\mathbf{f}}_{{\text{int}}}} = {\mathbf{0}}\]

虽然在静态力学过程中,时间不再起作用,但是我们仍然需要一个参数来排列事件的顺序。出于这个原因,我们将继续在静态力学过程中使用“时间”的概念来表示加载顺序。特别地,时间的概念可以用来将完整的外部载荷分解为若干个增量加载步骤。这样做的原因如下:

  1. 从非线性连续体模型的离散化得到的代数方程组是非线性的,因此需要使用迭代过程来求解。对于非常大的加载步骤(例如在一个增量步中施加整个载荷),通常很难获得一个正确收敛的解。对于大多数常用的迭代过程,包括牛顿-拉夫逊方法,其收敛半径都是有限的。

  2. 实验证明,大多数材料表现出路径相关的行为。这意味着根据所遵循的应变路径获得的应力值是不同的。例如,当我们首先对一个平板施加拉伸应变增量,然后施加剪切应变增量时,所得到的应力可能会不同,或者当以相反的顺序施加相同的应变增量时,结果应力也可能不同。显然,只有在应变增量相对较小的情况下,才能正确预测结构行为,以便尽可能地按照应变路径进行。

参考文献:

[1] Non‐Linear Finite Element Analysis of Solids and Structures, John Wiley & Sons, Ltd, 2012, 31-62, https://doi.org/10.1002/9781118375938.ch2

BC_METHOD: str
FORCE_TOL: float
MAX_NITER: int
PENALTY: float
assembly: Assembly
database: Database
dof_solution: ndarray
incremental_iterative_solve(option: str) int[源代码]
run() int[源代码]
solver: Solver
pyfem.solvers.TimeIntegrationNonlinearSolver module
class pyfem.solvers.TimeIntegrationNonlinearSolver.TimeIntegrationNonlinearSolver(assembly: Assembly, solver: Solver)[源代码]

基类:BaseSolver

非线性求解器。

变量:
  • PENALTY (float) – 罚系数

  • FORCE_TOL (float) – 残差容限

  • MAX_NITER (int) – 最大迭代次数

  • BC_METHOD (str) – 边界条件施加方式

对于准静态过程,需要求解的线性系统可以表示为:

()\[{{\mathbf{f}}_{{\text{ext}}}} - {{\mathbf{f}}_{{\text{int}}}} = {\mathbf{0}}\]

虽然在静态力学过程中,时间不再起作用,但是我们仍然需要一个参数来排列事件的顺序。出于这个原因,我们将继续在静态力学过程中使用“时间”的概念来表示加载顺序。特别地,时间的概念可以用来将完整的外部载荷分解为若干个增量加载步骤。这样做的原因如下:

  1. 从非线性连续体模型的离散化得到的代数方程组是非线性的,因此需要使用迭代过程来求解。对于非常大的加载步骤(例如在一个增量步中施加整个载荷),通常很难获得一个正确收敛的解。对于大多数常用的迭代过程,包括牛顿-拉夫逊方法,其收敛半径都是有限的。

  2. 实验证明,大多数材料表现出路径相关的行为。这意味着根据所遵循的应变路径获得的应力值是不同的。例如,当我们首先对一个平板施加拉伸应变增量,然后施加剪切应变增量时,所得到的应力可能会不同,或者当以相反的顺序施加相同的应变增量时,结果应力也可能不同。显然,只有在应变增量相对较小的情况下,才能正确预测结构行为,以便尽可能地按照应变路径进行。

参考文献:

[1] Non‐Linear Finite Element Analysis of Solids and Structures, John Wiley & Sons, Ltd, 2012, 31-62, https://doi.org/10.1002/9781118375938.ch2

BC_METHOD: str
FORCE_TOL: float
MAX_NITER: int
PENALTY: float
assembly: Assembly
database: Database
dof_solution: ndarray
incremental_iterative_solve(option: str) int[源代码]
run() int[源代码]
solver: Solver
pyfem.solvers.get_solver_data module
pyfem.solvers.get_solver_data.get_solver_data(assembly: Assembly, solver: Solver) BaseSolver | LinearSolver | NonlinearSolver | ArcLengthSolver[源代码]

工厂函数,用于根据求解器属性生产不同的求解器对象。

参数:
  • assembly (Assembly) – 装配体对象

  • solver (Solver) – 求解器属性

返回:

求解器对象

返回类型:

SolverData

Module contents
pyfem.utils package
Submodules
pyfem.utils.IntKeyDict module
class pyfem.utils.IntKeyDict.IntKeyDict[源代码]

基类:dict

关键字只能为整数(Integer)类型的字典,已经存在的键值无法通过赋值方法(__setitem__)更改。

add_item_by_id(id_: int, item: Any) None[源代码]
get_ids_by_indices(indices: List[int]) List[int][源代码]
get_indices_by_ids(ids: List[int]) List[int][源代码]
get_items_by_ids(ids: List[int]) List[Any][源代码]
ids_to_indices: Dict[int, int]
indices_to_ids: Dict[int, int]
update_indices() None[源代码]
pyfem.utils.colors module

定义色彩关键字,用于对字符串着色。

pyfem.utils.colors.error_style(error_msg: str) str[源代码]
pyfem.utils.colors.info_style(info_msg: str) str[源代码]
pyfem.utils.colors.warn_style(info_msg: str) str[源代码]
pyfem.utils.logger module
pyfem.utils.logger.set_logger(logger: Logger, abs_input_file: Path, level: int = 10) Logger | None[源代码]

设置 logging 模块的基础配置,并返回一个 logger 对象。

参数:
  • logger – 要配置的logger对象

  • abs_input_file – Job配置文件的绝对路径

  • level – 输出日志的最低级别,默认是 DEBUG 级别

pyfem.utils.logger.set_logger_sta(logger: Logger, abs_input_file: Path, level: int = 20) Logger | None[源代码]

设置 logging 模块的基础配置,并返回一个 logger 对象。

参数:
  • logger – 要配置的logger对象

  • abs_input_file – Job配置文件的绝对路径

  • level – 输出日志的最低级别,默认是 DEBUG 级别

pyfem.utils.mechanics module
pyfem.utils.mechanics.get_decompose_energy(strain: ndarray, stress: ndarray, dimension: int)[源代码]

获取正的应变能密度

定义一种基于应变能谱分解的应变能分解方式(miehe)分解方法

参数:
  • strain (ndarray) – Voigt记法数组

  • stress (ndarray) – Voigt记法数组

  • dimension (int) – 单元维度

返回:

energy_positive

返回类型:

ndarray

返回:

energy_negative

返回类型:

ndarray

对于相场演化方程,如何选取合适的驱动力是尤为重要的。下面介绍一种通过能量分解的方法,在应变能中发掘驱动材料损伤的分量。

2010年,miehe等[1]给出了一种基于应变张量谱分解的应变能分解方式,使用这种分解方式,可以得到一种拉压破坏模式不一致的相场模型,并且能够防止裂纹面的相互侵入问题。

应变张量的谱分解表示为:

()\[{{\mathbf{\varepsilon}} }{\text{ = }}\sum\limits_{i = 1}^3 { \varepsilon _i } {n_i } \otimes {n_i }\]

其中, \({\varepsilon _i}(i = 1,2,3)\) 为三个主应变分量。一个变形张量可以分解为三个不包含剪切变形,只拉伸或压缩变形的状态,这三个方向称为主应变方向,对应的大小为主应变。 主应变及其方向可以通过求解应变矩阵的特征根来获得。下面求解应变张量不变量与主应变分量[2]。定义一个二阶应变张量为:

()\[\begin{split}{\mathbf{\varepsilon }} = \left[ {\begin{array}{*{20}{c}} {{\varepsilon _{11}}}&{{\varepsilon _{12}}}&{{\varepsilon _{13}}} \\ {{\varepsilon _{21}}}&{{\varepsilon _{22}}}&{{\varepsilon _{23}}} \\ {{\varepsilon _{31}}}&{{\varepsilon _{32}}}&{{\varepsilon _{33}}} \end{array}} \right]\end{split}\]

令主应变为 \({\varepsilon _e}(e = 1,2,3)\) ,则 \({\varepsilon _e}\) 可由下列方程求得

()\[\begin{split}\left| {\begin{array}{*{20}{c}} {{\varepsilon _{11}} - {\varepsilon _e}}&{{\varepsilon _{12}}}&{{\varepsilon _{13}}} \\ {{\varepsilon _{21}}}&{{\varepsilon _{22}} - {\varepsilon _e}}&{{\varepsilon _{23}}} \\ {{\varepsilon _{31}}}&{{\varepsilon _{32}}}&{{\varepsilon _{33}} - {\varepsilon _e}} \end{array}} \right| = 0\end{split}\]

上式可写为如下形式:

()\[\varepsilon _e^3 - {J_1}\varepsilon _e^2 + {J_2}{\varepsilon _e} - {J_3} = 0\]

其中,方程的三个根即为三个主应变 \({\varepsilon _1},{\varepsilon _2},{\varepsilon _3}\) 。通常按照 \({\varepsilon _1} \geqslant {\varepsilon _2} \geqslant {\varepsilon _3}\) 来排列。 系数项 \({J_1}, {J_2}, {J_3}\) 分别称为应变张量的第一、第二、第三不变量。

其中,第一不变量 \({J_1}\) 定义为应变张量的迹 \({J_1} = trace({\mathbf{\varepsilon }})\) ;

()\[{J_1} = {\varepsilon _{11}} + {\varepsilon _{22}} + {\varepsilon _{33}} = {\varepsilon _1} + {\varepsilon _2} + {\varepsilon _3} = trace({\mathbf{\varepsilon }})\]

第二不变量 \({J_2}\) 通常称为等效应变, \({J_2} = \frac{1}{2}\left[ {{{\left( {trace\left( {\mathbf{\varepsilon }} \right)} \right)}^2} - trace\left( {{{\mathbf{\varepsilon }}^2}} \right)} \right]\) ;

()\[\begin{split}{J_2} = \left| {\begin{array}{*{20}{c}} {{\varepsilon _{22}}}&{{\varepsilon _{23}}} \\ {{\varepsilon _{32}}}&{{\varepsilon _{33}}} \end{array}} \right| + \left| {\begin{array}{*{20}{c}} {{\varepsilon _{11}}}&{{\varepsilon _{13}}} \\ {{\varepsilon _{31}}}&{{\varepsilon _{33}}} \end{array}} \right| + \left| {\begin{array}{*{20}{c}} {{\varepsilon _{11}}}&{{\varepsilon _{12}}} \\ {{\varepsilon _{21}}}&{{\varepsilon _{22}}} \end{array}} \right| = {\varepsilon _1}{\varepsilon _2} + {\varepsilon _2}{\varepsilon _3} + {\varepsilon _3}{\varepsilon _1} = \frac{1}{2}\left[ {{{\left( {trace\left( {\mathbf{\varepsilon }} \right)} \right)}^2} - trace\left( {{{\mathbf{\varepsilon }}^2}} \right)} \right]\end{split}\]

第三不变量 \({J_3}\) 定义为矩阵行列式, \({J_3} = \det ({\mathbf{\varepsilon }})\)

()\[\begin{split}{J_3} = \left| {\begin{array}{*{20}{c}} {{\varepsilon _{11}}}&{{\varepsilon _{12}}}&{{\varepsilon _{13}}} \\ {{\varepsilon _{21}}}&{{\varepsilon _{22}}}&{{\varepsilon _{23}}} \\ {{\varepsilon _{31}}}&{{\varepsilon _{32}}}&{{\varepsilon _{33}}} \end{array}} \right| = {\varepsilon _1}{\varepsilon _2}{\varepsilon _3} = \det ({\mathbf{\varepsilon }})\end{split}\]

用主应变分量可将应变能密度函数表示为:

()\[\psi ({\mathbf{\varepsilon }}) = \frac{1}{2}\lambda {\left( {{\varepsilon _1} + {\varepsilon _2} + {\varepsilon _3}} \right)^2} + \mu \left( {\varepsilon _1^2 + \varepsilon _2^2 + \varepsilon _3^2} \right)\]

将上面的名义应变能密度函数分解为受拉和受压两个部分:

()\[\psi = {\psi ^ + } + {\psi ^ - }\]

对于各向同性线弹性材料,应变能密度函数可用应变张量表示为:

()\[{\psi ^ \pm }({\mathbf{\varepsilon }}) = \frac{1}{2}\lambda \left\langle {trace\left( {\mathbf{\varepsilon }} \right)} \right\rangle _ \pm ^2 + \mu {\text{ }}trace\left( {\left\langle {\varepsilon } \right\rangle _ \pm ^2} \right)\]

即:

()\[{\psi ^ \pm }({\mathbf{\varepsilon }}) = \frac{1}{2}\lambda \left\langle {{\varepsilon _1} + {\varepsilon _2} + {\varepsilon _3}} \right\rangle _ \pm ^2 + \mu \left( {\left\langle {{\varepsilon _1}} \right\rangle _ \pm ^2 + \left\langle {{\varepsilon _2}} \right\rangle _ \pm ^2 + \left\langle {{\varepsilon _3}} \right\rangle _ \pm ^2} \right)\]

其中, \({\left\langle \cdot \right\rangle _ \pm }\) 为Macaulay括号,表示为:

()\[{\left\langle x \right\rangle _ + }: = \left( {\left| x \right| + x} \right)/2; {\left\langle x \right\rangle _ - }: = \left( {\left| x \right| - x} \right)/2\]

图像描述为:

            <x>_{+}                                                <x>_{-}
               |                                                      |
               |                *              *                      |
               |              *                  *                    |
               |            *                       *                 |
               |          *                            *              |
               |        *                                 *           |
               |      *                                      *        |
               |    *                                           *     |
               |  *                                                *  |
----***********0--x-------------------->   ---------------------------0**x**************-------->

在分解后的应变能密度中,假设只有受拉应变能 \({\psi ^ + }\) 驱动相场的演化。而受压部分并不引起相场的演化,于是相场的驱动方程

()\[{F_d} = - {w^{'}}(d) {\psi }( \varepsilon )\]

可以改写为:

()\[{F_d} = - {w^{'}}(d) {\psi ^ + }( \varepsilon )\]

参考文献:

[1] miehe, et.al., Thermodynamically consistent phase-field models of fracture: Variational principles and multi-field FE implementations. 2010. https://onlinelibrary.wiley.com/doi/abs/10.1002/nme.2861

[2] 固体力学 [尹祥础 编] 2011年版

pyfem.utils.mechanics.get_transformation(u: ndarray, v: ndarray, w: ndarray, u_prime: ndarray, v_prime: ndarray, w_prime: ndarray) ndarray[源代码]

计算空间变换矩阵

参数:
  • u (ndarray) – \(\left( {{{{\mathbf{\hat e}}}_1},{{{\mathbf{\hat e}}}_2},{{{\mathbf{\hat e}}}_3}} \right)\) 坐标系下的1号矢量

  • v (ndarray) – \(\left( {{{{\mathbf{\hat e}}}_1},{{{\mathbf{\hat e}}}_2},{{{\mathbf{\hat e}}}_3}} \right)\) 坐标系下的2号矢量

  • w (ndarray) – \(\left( {{{{\mathbf{\hat e}}}_1},{{{\mathbf{\hat e}}}_2},{{{\mathbf{\hat e}}}_3}} \right)\) 坐标系下的3号矢量

  • u_prime (ndarray) – \(\left( {{{{\mathbf{\hat e'}}}_1},{{{\mathbf{\hat e'}}}_2},{{{\mathbf{\hat e'}}}_3}} \right)\) 坐标系下的1号矢量

  • v_prime (ndarray) – \(\left( {{{{\mathbf{\hat e'}}}_1},{{{\mathbf{\hat e'}}}_2},{{{\mathbf{\hat e'}}}_3}} \right)\) 坐标系下的2号矢量

  • w_prime (ndarray) – \(\left( {{{{\mathbf{\hat e'}}}_1},{{{\mathbf{\hat e'}}}_2},{{{\mathbf{\hat e'}}}_3}} \right)\) 坐标系下的3号矢量

返回:

空间变换矩阵(线性)

返回类型:

ndarray

\(\left( {{{{\mathbf{\hat e}}}_1},{{{\mathbf{\hat e}}}_2},{{{\mathbf{\hat e}}}_3}} \right)\)\(\left( {{{{\mathbf{\hat e'}}}_1},{{{\mathbf{\hat e'}}}_2},{{{\mathbf{\hat e'}}}_3}} \right)\) 是空间 \({{\mathbb{R}}^3}\) 的两组基。 如果矩阵 \(\mathbf{T}\) 描述了两组基对应的线性变换 \({{\mathbb{R}}^3} \Rightarrow {{\mathbb{R}}^3}\),则对于空间中的三个任意矢量有:

()\[\begin{split}\left[ {\begin{array}{*{20}{c}} {{T_{11}}}&{{T_{12}}}&{{T_{13}}} \\ {{T_{21}}}&{{T_{22}}}&{{T_{23}}} \\ {{T_{31}}}&{{T_{32}}}&{{T_{33}}} \end{array}} \right]\left\{ {\begin{array}{*{20}{c}} {{u_1}} \\ {{u_2}} \\ {{u_3}} \end{array}} \right\} = \left\{ {\begin{array}{*{20}{c}} {{{u'}_1}} \\ {{{u'}_2}} \\ {{{u'}_3}} \end{array}} \right\}\end{split}\]
()\[\begin{split}\left[ {\begin{array}{*{20}{c}} {{T_{11}}}&{{T_{12}}}&{{T_{13}}} \\ {{T_{21}}}&{{T_{22}}}&{{T_{23}}} \\ {{T_{31}}}&{{T_{32}}}&{{T_{33}}} \end{array}} \right]\left\{ {\begin{array}{*{20}{c}} {{v_1}} \\ {{v_2}} \\ {{v_3}} \end{array}} \right\} = \left\{ {\begin{array}{*{20}{c}} {{{v'}_1}} \\ {{{v'}_2}} \\ {{{v'}_3}} \end{array}} \right\}\end{split}\]
()\[\begin{split}\left[ {\begin{array}{*{20}{c}} {{T_{11}}}&{{T_{12}}}&{{T_{13}}} \\ {{T_{21}}}&{{T_{22}}}&{{T_{23}}} \\ {{T_{31}}}&{{T_{32}}}&{{T_{33}}} \end{array}} \right]\left\{ {\begin{array}{*{20}{c}} {{w_1}} \\ {{w_2}} \\ {{w_3}} \end{array}} \right\} = \left\{ {\begin{array}{*{20}{c}} {{{w'}_1}} \\ {{{w'}_2}} \\ {{{w'}_3}} \end{array}} \right\}\end{split}\]

合并可得:

()\[\begin{split}\left[ {\begin{array}{*{20}{c}} {{T_{11}}}&{{T_{12}}}&{{T_{13}}} \\ {{T_{21}}}&{{T_{22}}}&{{T_{23}}} \\ {{T_{31}}}&{{T_{32}}}&{{T_{33}}} \end{array}} \right]\left[ {\begin{array}{*{20}{c}} {{u_1}}&{{v_1}}&{{w_1}} \\ {{u_2}}&{{v_2}}&{{w_2}} \\ {{u_3}}&{{v_3}}&{{w_3}} \end{array}} \right] = \left[ {\begin{array}{*{20}{c}} {{{u'}_1}}&{{{v'}_1}}&{{{w'}_1}} \\ {{{u'}_2}}&{{{v'}_2}}&{{{w'}_2}} \\ {{{u'}_3}}&{{{v'}_3}}&{{{w'}_3}} \end{array}} \right]\end{split}\]

因此变换矩阵 \(\mathbf{T}\) 可以表示为:

()\[\begin{split}\left[ {\begin{array}{*{20}{c}} {{T_{11}}}&{{T_{12}}}&{{T_{13}}} \\ {{T_{21}}}&{{T_{22}}}&{{T_{23}}} \\ {{T_{31}}}&{{T_{32}}}&{{T_{33}}} \end{array}} \right] = \left[ {\begin{array}{*{20}{c}} {{{u'}_1}}&{{{v'}_1}}&{{{w'}_1}} \\ {{{u'}_2}}&{{{v'}_2}}&{{{w'}_2}} \\ {{{u'}_3}}&{{{v'}_3}}&{{{w'}_3}} \end{array}} \right]{\left[ {\begin{array}{*{20}{c}} {{u_1}}&{{v_1}}&{{w_1}} \\ {{u_2}}&{{v_2}}&{{w_2}} \\ {{u_3}}&{{v_3}}&{{w_3}} \end{array}} \right]^{ - 1}}\end{split}\]

记为:

()\[{\mathbf{T}} = {\mathbf{A'}} \cdot {\left( {\mathbf{A}} \right)^{ - 1}}\]

特殊的,对于两个空间直角坐标系的映射,即 \(\left( {{{{\mathbf{\hat e}}}_1},{{{\mathbf{\hat e}}}_2},{{{\mathbf{\hat e}}}_3}} \right)\)\(\left( {{{{\mathbf{\hat e'}}}_1},{{{\mathbf{\hat e'}}}_2},{{{\mathbf{\hat e'}}}_3}} \right)\) 均为单位正交基,且变换需要满足 \({{\mathbb{R}}^3} \Rightarrow {{\mathbb{R}}^3}\) ,则 \({\mathbf{A}}\)\({{\mathbf{A'}}}\) 必须满秩且为正交矩阵。

pyfem.utils.mechanics.get_voigt_transformation(transformation: ndarray) ndarray[源代码]

获取旋转矩阵的Voigt形式

参数:

transformation (ndarray) – Voigt记法数组

返回:

voigt_transformation

返回类型:

ndarray

pyfem.utils.mechanics.inverse(qp_jacobis: ndarray, qp_jacobi_dets: ndarray) ndarray[源代码]

求逆矩阵

参数:
  • qp_jacobis (ndarray) – 积分点处的雅克比矩阵列表

  • qp_jacobi_dets (ndarray) – 积分点处的雅克比矩阵行列式列表

返回:

逆矩阵列表

返回类型:

ndarray

当输入为 2×2 和 3×3 的矩阵直接通过解析式计算,其余的情况返回 numpy.linalg.inv() 函数的计算结果。

对于 2×2 的矩阵:

()\[\begin{split}{\mathbf{A}} = \left[ {\begin{array}{*{20}{c}} {{A_{11}}}&{{A_{12}}} \\ {{A_{21}}}&{{A_{22}}} \end{array}} \right]\end{split}\]
()\[\begin{split}{{\mathbf{A}}^{ - 1}} = \frac{1}{{\det \left( {\mathbf{A}} \right)}}\left[ {\begin{array}{*{20}{c}} {{A_{22}}}&{ - {A_{12}}} \\ { - {A_{21}}}&{{A_{11}}} \end{array}} \right]\end{split}\]

对于 3×3 的矩阵:

()\[\begin{split}{\mathbf{A}} = \left[ {\begin{array}{*{20}{c}} {{A_{11}}}&{{A_{12}}}&{{A_{13}}} \\ {{A_{21}}}&{{A_{22}}}&{{A_{23}}} \\ {{A_{31}}}&{{A_{32}}}&{{A_{33}}} \end{array}} \right]\end{split}\]
()\[\begin{split}{{\mathbf{A}}^{ - 1}} = \frac{1}{{\det \left( {\mathbf{A}} \right)}}\left[ {\begin{array}{*{20}{c}} {{A_{22}}{A_{33}} - {A_{23}}{A_{32}}}&{{A_{13}}{A_{32}} - {A_{12}}{A_{33}}}&{{A_{12}}{A_{23}} - {A_{13}}{A_{22}}} \\ {{A_{23}}{A_{31}} - {A_{21}}{A_{33}}}&{{A_{11}}{A_{33}} - {A_{13}}{A_{31}}}&{{A_{13}}{A_{21}} - {A_{11}}{A_{23}}} \\ {{A_{21}}{A_{32}} - {A_{22}}{A_{31}}}&{{A_{12}}{A_{31}} - {A_{11}}{A_{32}}}&{{A_{11}}{A_{22}} - {A_{12}}{A_{21}}} \end{array}} \right]\end{split}\]
pyfem.utils.mechanics.operations_for_symtensor_antisymtensor(sym_tensor: ndarray, antisym_tensor: ndarray) ndarray[源代码]

获取反对称张量乘以对称张量减去对称张量乘以反对称张量的结果

参数:
  • sym_tensor (ndarray) – \(\left[ {{a_{11}}{\text{ }}{a_{22}}{\text{ }}{a_{33}}{\text{ }}{a_{12}}{\text{ }}{a_{13}}{\text{ }}{a_{23}}} \right]\) 采用 Vogit 记法的对称张量数组

  • antisym_tensor (ndarray) – \(\left[ {0{\text{ }}0{\text{ }}0{\text{ }}{b_{12}}{\text{ }}{b_{13}}{\text{ }}{b_{23}}} \right]\) 采用类似 Vogit 记法的反对称张量数组

返回:

反对称张量乘以对称张量减去对称张量乘以反对称张量的结果

返回类型:

ndarray

首先分别将对称张量数组 \(\left[ {{a_{11}}{\text{ }}{a_{22}}{\text{ }}{a_{33}}{\text{ }}{a_{12}}{\text{ }}{a_{13}}{\text{ }}{a_{23}}} \right]\) 和 反对称张量数组 \(\left[ {0{\text{ }}0{\text{ }}0{\text{ }}{b_{12}}{\text{ }}{b_{13}}{\text{ }}{b_{23}}} \right]\) 写成矩阵形式:

()\[\begin{split}A_{sym} = \left[ {\begin{array}{*{20}{c}} {{a_{11}}}&{{a_{12}}}&{{a_{13}}} \\ {{a_{12}}}&{{a_{22}}}&{{a_{23}}} \\ {{a_{13}}}&{{a_{23}}}&{{a_{33}}} \end{array}} \right],B_{antisym} = \left[ {\begin{array}{*{20}{c}} 0&{{b_{12}}}&{{b_{13}}} \\ { - {b_{12}}}&0&{{b_{23}}} \\ { - {b_{13}}}&{ - {b_{23}}}&0 \end{array}} \right]\end{split}\]

计算结果 \({B_{antisym}}{A_{sym}} - {A_{sym}}{B_{antisym}}\) 表示为:

()\[\begin{split}\begin{gathered} {B_{antisym}}{A_{sym}} - {A_{sym}}{B_{antisym}} = \left[ {\begin{array}{*{20}{c}} 0&0&0&{2{b_{12}}}&{2{b_{13}}}&0 \\ 0&0&0&{ - 2{b_{12}}}&0&{2{b_{23}}} \\ 0&0&0&0&{ - 2{b_{13}}}&{ - 2{b_{23}}} \\ { - {b_{12}}}&{{b_{12}}}&0&0&{{b_{23}}}&{{b_{13}}} \\ { - {b_{13}}}&0&{{b_{13}}}&{ - {b_{23}}}&0&{{b_{12}}} \\ 0&{ - {b_{23}}}&{{b_{23}}}&{ - {b_{13}}}&{ - {b_{12}}}&0 \end{array}} \right]\left[ \begin{gathered} {a_{11}} \hfill \\ {a_{22}} \hfill \\ {a_{33}} \hfill \\ {a_{12}} \hfill \\ {a_{13}} \hfill \\ {a_{23}} \hfill \\ \end{gathered} \right] \hfill \\ = \left[ \begin{gathered} 2{b_{12}}{a_{12}} + 2{b_{13}}{a_{13}} \hfill \\ - 2{b_{12}}{a_{12}} + 2{b_{23}}{a_{23}} \hfill \\ - 2{b_{13}}{a_{13}} - 2{b_{23}}{a_{23}} \hfill \\ - {b_{12}}{a_{11}} + {b_{12}}{a_{22}} + {b_{23}}{a_{13}} + {b_{13}}{a_{23}} \hfill \\ - {b_{13}}{a_{11}} + {b_{13}}{a_{33}} - {b_{23}}{a_{12}} + {b_{12}}{a_{23}} \hfill \\ - {b_{23}}{a_{22}} + {b_{23}}{a_{33}} - {b_{13}}{a_{12}} - {b_{12}}{a_{13}} \hfill \\ \end{gathered} \right] = T{A_{sym}} \hfill \\ \end{gathered}\end{split}\]
pyfem.utils.mechanics.voigt_array_to_tensor(voigt_array: ndarray, dimension: int) ndarray[源代码]

Voigt记法数组转换为2阶张量

参数:
  • voigt_array (ndarray) – Voigt记法数组

  • dimension (int) – 空间维度

返回:

2阶张量

返回类型:

ndarray

映射方式:

()\[\begin{split}\left\{ {\begin{array}{*{20}{c}} {{T_{11}}} \\ {{T_{22}}} \\ {{T_{12}}} \end{array}} \right\} \to \left[ {\begin{array}{*{20}{c}} {{T_{11}}}&{{T_{12}}}} \\ {{T_{21}}}&{{T_{22}}} \end{array}} \right]\end{split}\]
()\[\begin{split}\left\{ {\begin{array}{*{20}{c}} {{T_{11}}} \\ {{T_{22}}} \\ {{T_{33}}} \\ {{T_{12}}} \\ {{T_{13}}} \\ {{T_{23}}} \end{array}} \right\} \to \left[ {\begin{array}{*{20}{c}} {{T_{11}}}&{{T_{12}}}&{{T_{13}}} \\ {{T_{21}}}&{{T_{22}}}&{{T_{23}}} \\ {{T_{31}}}&{{T_{32}}}&{{T_{33}}} \end{array}} \right]\end{split}\]
pyfem.utils.visualization module

程序及对象的结构可视化,便于开发者查看数据结构。

pyfem.utils.visualization.get_ordinal_number(num: int) str[源代码]
pyfem.utils.visualization.insert_spaces(n: int, text: str) str[源代码]
pyfem.utils.visualization.object_dict_to_string(obj, level: int = 1) str[源代码]
pyfem.utils.visualization.object_dict_to_string_assembly(obj, level: int = 1) str[源代码]
pyfem.utils.visualization.object_dict_to_string_ndarray(obj, level: int = 1) str[源代码]
pyfem.utils.visualization.object_slots_to_string(obj, level: int = 1) str[源代码]
pyfem.utils.visualization.object_slots_to_string_assembly(obj, level: int = 1) str[源代码]
pyfem.utils.visualization.object_slots_to_string_ndarray(obj, level: int = 1) str[源代码]
pyfem.utils.visualization.print_slots_dict(slots_dict: dict) None[源代码]
pyfem.utils.wrappers module

定义一些函数装饰器

pyfem.utils.wrappers.show_running_time(func)[源代码]
pyfem.utils.wrappers.trace_calls(func)[源代码]
Module contents

Submodules

pyfem.Job module

class pyfem.Job.Job(filename: Path | str)[源代码]

基类:object

求解器基类。

变量:
  • input_file (Path) – 输入文件路径

  • work_directory (Path) – 工作目录

  • abs_input_file (Path) – 输入文件绝对路径

  • props (Properties) – 属性对象

  • assembly (Assembly) – 装配体属性

  • solver_data (SolverData) – 求解器对象

abs_input_file: Path
assembly: Assembly
input_file: Path
props: Properties
run() int[源代码]
show() None[源代码]
solver_data: BaseSolver | LinearSolver | NonlinearSolver | ArcLengthSolver
to_string(level: int = 1) str[源代码]
work_directory: Path

Module contents

Indices and tables 索引和表格