瞬态非线性热传导问题
关键词: 瞬态 非线性 热传导 向后差分 迭代 多种材料 第三类边界
本节以二维非线性瞬态热传导问题为例,讲解如何使用 FEtch 系统对非线性抛物型方程进行求解,以及如何自定义函数。
控制方程
微分形式
对于二维直角坐标系,瞬态非线性热传导服从如下偏微分方程 \(\rho c(u) \frac{\partial u}{\partial t}-\frac{\partial}{\partial x}\left(k(u) \frac{\partial u}{\partial x}\right)-\frac{\partial}{\partial y}\left(k(u) \frac{\partial u}{\partial y}\right)=\rho Q\ \left(\text{in } \Omega\right) \tag{1}\label{eq1}\) 边界条件为:
第一类边界条件 \(u=\bar{u}\ \left(\text{on } \Gamma_1\right)\)
第二类边界条件 \(-k(u)\frac{\partial u}{\partial \mathbf{n}} \cdot \mathbf{n}= -q\ \left(\text{on } \Gamma_2\right)\)
第三类边界条件 \(-k(u)\frac{\partial u}{\partial \mathbf{n}} \cdot \mathbf{n}=a(u-b)\ \left(\text{on } \Gamma_3\right)\) 其中,$u$ 表示温度,$\rho$ 表示材料密度,$c(u)$ 为材料的比热,$k(u)$ 是热传导系数,$Q$ 为热源密度,$\bar{u}$ 和 $q$ 为边界上的温度和热流值,$\mathbf{n}$ 为边界上的单位外法向量,$a$ 和 $b$ 为边界换热常数。$x$ 和 $y$ 为二维直角坐标系下的坐标变量,$t$ 为时间。
初始条件为 \(u=u_0 \ \left(\text{in } \Omega\right)\)
其中,$u_0$ 为求解域内初始的温度分布。
弱形式
运用变分原理,由方程 $\eqref{eq1}$ 得 \(\int_{\Omega}\left(\rho c(u) \frac{\partial u}{\partial t}-\frac{\partial}{\partial x}\left(k(u) \frac{\partial u}{\partial x}\right)-\frac{\partial}{\partial y}\left(k(u) \frac{\partial u}{\partial y}\right)-\rho Q\right) \delta u d \Omega=0\) 将其化为弱形式,可得 \(\int_{\Omega} \rho c(u) \frac{\partial u}{\partial t} \delta u d \Omega+\int_{\Omega}\left(k(u) \frac{\partial u}{\partial x} \frac{\partial \delta u}{\partial x}+k(u) \frac{\partial u}{\partial y} \frac{\partial \delta u}{\partial y}\right) d \Omega \\=\int_{\Omega} \rho Q \delta u d \Omega+\int_{\Gamma} k(u) \frac{\partial u}{\partial \mathbf{n}}\cdot \mathbf{n} \delta u d \Gamma\) 代入边界条件,可得 \(\int_{\Omega} \rho c(u) \frac{\partial u}{\partial t} \delta u d \Omega+\int_{\Omega}\left(k(u) \frac{\partial u}{\partial x} \frac{\partial \delta u}{\partial x}+k(u) \frac{\partial u}{\partial y} \frac{\partial \delta u}{\partial y}\right) d \Omega+\int_{\Gamma_3} au \delta u d \Gamma\\=\int_{\Omega} \rho Q \delta u d \Omega+\int_{\Gamma_2} q \delta u d \Gamma+\int_{\Gamma_3} ab \delta u d \Gamma \tag{2}\label{eq2}\)
离散化
式 $\eqref{eq2}$ 进行空间离散化后,可写成矩阵形式 \(M(U) \dot{U}+S(U)U=F\) 其中 $U$ 为温度向量,$\dot{U}$ 为温度对时间的导数向量,$M(U)$ 为质量矩阵, $S(U)$ 为刚度矩阵,$F$ 为载荷向量。采用向后差分法进行时域离散,可将上式改写为 \(M(U) \frac{U^{t+\Delta t}-U^{t}}{\Delta t}+S(U) U^{t+\Delta t}=F^{t+\Delta t}\) 整理得 \(\left(M(U)+S(U) \Delta t\right) U^{t+\Delta t}=F^{t+\Delta t} \Delta t+M(U) U^{t} \tag{3}\label{eq3}\) 其中,上标 $t+\Delta t$ 代表当前时间步,$t$ 代表上一时间步。$M(U)$ 和 $S(U)$ 均为 $U$ 的函数,因此,式 $\eqref{eq3}$ 是一个非线性方程组,无法直接求解,需要引入迭代过程。
最常用的处理方法是采用直接迭代法(也称 Picard 法),将式 $\eqref{eq3}$ 线性化,得 \(\left(M(U^i)+S(U^i) \Delta t\right) U^{i+1,t+\Delta t}=F^{t+\Delta t} \Delta t+M(U^i) U^{t} \tag{4}\label{eq4}\)
其中,上标 $i$ 表示 $t+\Delta t$ 时间步下的迭代步数。上式在每个时间步下都需要反复地迭代计算,直至误差 $\Vert U^{i+1}-U^i\Vert$ 小于某一设定的阈值。直接迭代法可以通过使用松弛因子,有效地提高收敛速度。松弛迭代法已被写入 NFE 算法模板库,是 FEtch 系统默认的非线性迭代算法。
可以看出,迭代过程的引入是非线性问题较线性问题计算量明显增大的主要原因。因此,如何在保证计算稳定性的同时提高收敛速度,一直是非线性求解领域永恒的话题。
材料本构模型
非线性问题远比线性问题要复杂。由于非线性参数的函数形式千变万化,所以通常需要针对具体的问题专门地设计程序。对于 FEtch 系统而言,由于脚本文件是完全自主可控的,只要基本框架搭好,后面需要改动的地方极少。
为后续算例的计算需要,这里考虑铸钢这种非线性材料。它的比热和密度的乘积为
\[\rho c(u)=-0.44\times10^{-5}-0.95\times10^{-5}u+0.11\times10^{-7} u^{2}\]导热系数为
\[k(u)=1.44+1.236 \times 10^{-3} u-4.63 \times 10^{-7} u^{2}\]可见,铸钢的材料参数包含了两个依赖于自变量温度 $u$ 的函数,$\rho c(u)$ 和 $k(u)$ 。用户需认真体会有限元语言是如何定义和使用这些函数的。
脚本编写
一个具体问题的有限元语言表述,通常需要包含 5 种类型的文件:PDE、FBC、MDI、GCN 和 NFE。下面依次给出详细介绍。
PDE 和 FBC 文件
在这个例子中,只有一个物理场,需要给出温度场对应的 PDE 文件和 FBC 文件。根据有限元语言的语法规则,将方程 $\eqref{eq2}$ 的体积分项写入 PDE 文件如下。
heat.pde | 说明 |
---|---|
defi disp u coor x y shap %1 %2 gaus %3 mass %1 ec coef un mate itag ek ec eq 1 2.5e-2 7.112e-2 0.0 stif $c6 if (itag.eq.2) then $c6 ek=ek_func(un) $c6 ec=ec_func(un) $c6 endif dist = +[u/x;u/x]*ek +[u/y;u/y]*ek load = +[u]*eq end fort function ek_func(tn) implicit real*8 (a-h,o-z) ek_func = 1.44d0+1.236d-3*tn-4.63d-7*tn*tn end function ec_func(tn) implicit real*8 (a-h,o-z) ec_func = -0.44d-5-0.95d-5*tn+0.11d-7*tn*tn end |
系统段落关键字(信息定义) 定义未知量 定义坐标分量 定义采用的形函数 定义采用的积分方式 定义单元的集中质量矩阵 定义非线性变量,引入上一迭代步的温度值 定义用到的材料参数和参数值 (空一行) 系统段落关键字(单元刚度矩阵表达式定义) 铸钢材料类型为 2 调用铸钢材料的自定义函数 计算非线性系数 刚度矩阵 荷载向量 (空一行) 系统关键字(文件结束) 附加 Fortran 源代码 自定义函数 热传导系数函数 $k(u)$ 热容系数函数 $\rho c(u)$ |
这里将 shap 、gaus 和 mass 行的参数设为待定,参数值 %1、%2 和 %3 将从 MDI 文件中取得。
同样地,将方程 $\eqref{eq2}$ 的边界积分项写入 FBC 文件如下。
heat.fbc | 说明 |
---|---|
defi disp u coor x shap %1 %2 gaus %3 mate eq ea eb 0.0 1.4e-2 8.0e1 stif dist = +[u;u]*ea load = +[u]*(eq+ea*eb) end |
系统段落关键字(信息定义) 定义未知量 定义坐标分量 定义采用的形函数 定义采用的积分方式 定义用到的材料参数和参数值 (空一行) 系统段落关键字(单元刚度矩阵表达式定义) 刚度矩阵项,对应式 $\eqref{eq2}$ 左侧第 3 项 (空一行) 荷载向量项,对应式 $\eqref{eq2}$ 右侧第 2 、3 项 (空行) 系统关键字(文件结束) |
MDI 文件
MDI 文件负责组织 PDE 和 FBC 文件,声明程序具体使用的坐标系统、单元类型和积分方法。这里文件命名为 np.mdi,具体内容如下。
np.mdi | 说明 |
---|---|
2dxy #a 1 1 u pde heat q4g2 fbc heat l2g2 # |
在二维直角坐标系下求解 a 场,1 个初值,1 个自由度,自由度名称为 u 调用 heat.pde,采用 4 节点四边形单元,2点高斯积分 调用 heat.fbc,采用 2 节点线单元,2点高斯积分 (文件结束符,可留空) |
注意,同一个场的 PDE 和 FBC 的单元类型和积分方法需要保证匹配,否则会导致计算精度降低,甚至计算失败的情况发生。MDI 文件声明的单元类型和积分方式将以参数的形式传递给 PDE 和 FBC 文件中的的 %1、%2 和 %3。如果后续想要使用其他的单元类型或者积分方法,只需修改 MDI 文件即可。
GCN 文件
GCN 文件给出计算流程信息,系统规定其文件名字要与 MDI 文件一致。非线性抛物方程的计算流程较为复杂,包含两大循环过程,时间步循环和迭代步循环。对应的 GCN 文件和说明如下。
np.gcn | 说明 |
---|---|
defi a nparb cc = 1.0 errb = 1.0e-8 itnmax = 30 open(1,file='time.dat') read(1,*) dt,tmax close(1) time = 0.0 it = 1 #startsin a do while (time <= tmax-1e-8) time = time + dt if (time > tmax) then dt = dt-(time-tmax) time = tmax endif iend=0 itn = 1 do while(iend==0) #solvsin a itn = itn+1 enddo it = it+1 if(itn .le. 5) dt = dt*1.02 enddo |
算法引入段 场 a,采用线性抛物问题的算法 nparb.nfe 空行,开始命令流段 迭代变量赋值 误差阈值 最大迭代次数 从time.dat文件读取时间步参数 对时间 time 赋初始值 对时间步数 it 赋初始值 初始化场 a 时间步循环开始 更新 time 越界修正 迭代结束标志赋初值 迭代步数赋初值 迭代步循环开始 求解 a 场 更新 itn 迭代步循环结束 更新 it 变更时间步长 时间步循环结束 |
NFE 文件
GCN 文件使用了 nparb 算法,系统会基于模板文件自动生成以下的 npa.nfe 文件。如果用户有其他需要,可以在此基础上进一步地修改。
nparb.nfe | 说明 |
---|---|
defi stif s mass m load f coef u equation vect u1,u,du read(s,unod) u1,u,du matrix = [s]*dt+[m] forc = [f]*dt+[m]*[u1] solution v vect ue [ue] = [v]-[u] $c6 aa = 0.0 $c6 ab = 0.0 $c6 bb = 0.0 %nod %dof aa = aa+[ue]*[ue] ab = ab+[ue]*[du] bb = bb+[du]*[du] %dof %nod $c6 if (itn.eq.1 .or. cc.le.0) then $c6 cc = 1.0 $c6 else $c6 rab = sqrt(aa)*sqrt(bb) $c6 if (ab.gt.0.707*rab) cc = cc*sqrt(2.0) $c6 if (ab.lt.0.0) cc = cc/sqrt(2.0) $c6 endif $c6 if (cc.gt.1.0) cc = 1.0 $c6 err = aa $c6 ul = 0.0 [u] = [u]+[ue]*cc %nod %dof ul = ul + [u]*[u] %dof %nod $c6 write(*,"('itn,cc,err=',i3,2e12.3)") itn,cc,err $c6 if (err.lt.errb .or. err.lt.errb*ul & $c6 .or. itn.ge.itnmax) then $c6 if (cc .ne. 1.0) then $c6 cc = -1 $c6 else $c6 open(17,file='err.txt',position='append') $c6 if(it.eq.1) rewind(17) $c6 write(17,"(2i3,1e12.3)") it,itn,err $c6 close(17) $c6 iend=1 gidpost("u",time) u(1) [u1]=[u] [ue]=0.0 $c6 endif $c6 endif write(s,unod) u1,u,ue end |
DEFI段 定义刚度矩阵名为 s 定义质量矩阵名为 m 定义载荷向量名为 f (空行) 耦合的场向量 (空行) EQUATION段 定义场向量 读入上一时间步、上一迭代步的结果 方程组左端矩阵,对应式 $\eqref{eq4}$ 左侧 方程组右端向量,对应式 $\eqref{eq4}$ 右侧 (空行) SOLUTION段 定义求解的场向量 计算当前迭代步增量 ue 循环所有节点上的所有自由度 计算 ue 的模的平方和 aa 计算 ue 与 du 的广义内积 ab 计算 du 的模的平方和 bb 依据当前迭代步增量 ue与 上一迭代步增量 du 之间的夹角, 来调整松弛因子 当夹角为锐角时,适当放大 cc 当夹角为钝角时,则适当缩小 cc 用松弛因子调整计算结果 收敛判断 继续迭代标记,保证收敛时的 cc = 1 记录每个时间步的迭代收敛情况 迭代结束标志更新 将计算结果写入 GiD 后处理文件 临时存储当前的结果,供下一迭代步读取 (空行) 结束标记 |
算例
这里给出一个经典算例,在 FEPG 的文献资料中经常被引用。《 FEPG 有限元应用深入剖析》一书的内容就是围绕本算例展开的。
一钢铸件及其砂模的横截面尺寸如图所示。砂模的导热系数是 $2.5\times10^{-2}$,比热和密度的乘积是 $7.112\times10^{-2}$;铸钢的材料参数已写入程序内部,材料号标记为 2,可直接调用。铸钢的初始温度为 $2875 { }^{\circ} \mathrm{C}$,砂模的初始温度为 $80 { }^{\circ} \mathrm{C}$;砂模的外边界为对流边界条件,其中对流系数为 $0.014$,环境温度为 $80 { }^{\circ} \mathrm{C}$。求 3 个时刻内铸钢及砂模的温度场的演化过程。
前处理
填写材料参数文件
系统自动生成了 np.mat 文件,用于设置材料参数。参数初始值全部为 PDE 和 FBC 文件给出的默认值。可根据具体问题进行修改。对于本算例,修改完成后的文件内容如下。
np.mat | 说明 |
---|---|
2 5 aeq4g2 num itag ek ec eq 1 1 2.5e-2 7.112e-2 0.0 2 2 0.0 0.0 0.0 # 1 4 all2g2 num eq ea eb 1 0.0 1.4e-2 8.0e1 # |
4 节点四边形面单元 材料参数 砂模参数值 铸钢参数值 分隔符 2 节点线形边界单元 材料参数 参数值 分隔符 |
注意,对于铸钢材料,由于它的参数是由自定义函数计算得到的,仅需要保证标记参数 itag 的值为 2 即可,其他的参数并不发挥作用,可随意取值。
填写时间步长文件
由 np.gcn 文件可知,用户自定义了时间步长文件 time.dat,给出时间步长和终止时间。文件内容如下:
0.001 3
可知, 初始时间步长为 0.001,结束时间为 3。
赋单元材料
赋初始条件
为避免歧义,继续明确定义交界位置的初始条件。
施加第三类边界条件
第二类边界条件以线单元的形式施加
网格剖分
根据所开发程序的计算要求,网格剖分采用 4 节点等参单元。网格大小为 $0.5\times 0.5$,共使用了 864 个单元,925 个节点。
计算结果
通过自动改变时间步长,变化范围从 0.001 到 0.059,总共使用了 211 个时间步。对计算结果稍加整理,效果如下。
温度场的演化过程
可以看到,伴随着传热过程,铸钢温度逐渐下降,向着全域等温的稳态发展。整个变化过程是平滑和稳定的,在一定程度上证明了算法和程序的有效性。
小结
对本章的计算思路做一下总结。对于瞬态非线性热传导问题,当材料的物性参数随温度变化时,离散方程式的系数也随温度变化,故每次迭代计算时需要更新物性参数。在每个时间步里温度场收敛了,才能进入下一时间步的迭代。在某个时间步内的迭代计算思路为:
- 根据上一次迭代计算得到的温度(第一次迭代之前应该是初始温度) 计算(更新)物性参数;
- 根据新物性参数计算温度场;
- 计算当前时间步长内结果是否收敛;
- 若收敛,进入下一时间步长迭代计算;若不收敛,继续更新物性参数,迭代计算温度场,直到收敛。
以上过程的实现需要 PDE、NFE 和 GCN 这 3 种文件的相互协调配合。建议用户仔细研读本章用到的脚本文件的源代码,充分理解后再去尝试求解其他的瞬态非线性问题,稳扎稳打,避免踩坑。