空间曲线上的面积最小曲面问题

关键词: 稳态 非线性 Laplace方程

非线性偏微分方程的求解是有限元方法的重要应用领域。本节以空间曲线上的面积最小曲面问题为例,讲解如何使用 FEtch 系统求解非线性椭圆型偏微分方程。

问题描述

给定一条空间曲线,以此空间曲线为边界,张在它上面的曲面有无数多个。那么,其中哪个曲面的面积是最小的呢?

此问题用数学语言描述为:在 $XY$ 平面区域 $\Omega$ 的边界 $\partial \Omega$ 上给定函数值 $\varphi(x, y)$,求张在这一条曲线上的曲面,使得曲面的面积最小。

即 \(A(u)=\operatorname{inf} \int_{\Omega} \sqrt{1+|\nabla u|^{2}} \mathrm{~d} \Omega=\operatorname{inf} \iint_{\Omega} \sqrt{1+\left(\frac{\partial u}{\partial x}\right)^{2}+\left(\frac{\partial u}{\partial y}\right)^{2}} \mathrm{~d} x \mathrm{~d} y\)

\[\forall u \in\left\{u \in C^{1}(\bar{\Omega}),\left.u\right|_{\partial \Omega}=\varphi(x, y)\right\}\]

控制方程

微分形式

基于 Euler-Lagrange 方程,可将上述问题转化为求解非线性的 Laplace 方程 \(\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)=0\ \left(\text{in } \Omega\right) \tag{1}\label{eq1}\)

\[u=\varphi(x, y)\ \left(\text{on } \partial \Omega\right)\]

其中,系数 $k(u)$ 为 \(k(u)=1/\sqrt{1+\left(\frac{\partial u}{\partial x}\right)^{2}+\left(\frac{\partial u}{\partial y}\right)^{2}}\)

弱形式

运用变分原理,由微分方程 $\eqref{eq1}$ 两端乘以 $u$ 的变分,并在全域上积分,得 \(\int_{\Omega}\left(\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)\right) \delta u d \Omega=0\) 对于二阶导数的部分,利用分部积分将其中的一阶导数转化到 $u$ 的变分上,得 \(\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=0 \tag{2}\label{eq2}\)

这就是最终的弱解形式。

离散化

式 $\eqref{eq2}$ 进行空间离散化后,可写成矩阵形式 \(S(U)U=0\tag{3}\label{eq3}\) 其中,$S(U)$ 为刚度矩阵,$U$​ 为待求解的未知向量。该式一个非线性方程组,无法直接求解,需要引入迭代过程。

最常用的处理方法是采用直接迭代法(也称 Picard 法),将式 $\eqref{eq3}$ 线性化,得 \(S(U^i) U^{i+1}=0 \tag{4}\label{eq4}\)

其中,上标 $i$ 表示迭代步数。上式需要反复地迭代计算,直至误差 $\Vert U^{i+1}-U^i\Vert$ 小于某一设定的阈值。直接迭代法可以通过使用松弛因子,有效地提高收敛速度。松弛迭代法已被写入 NFE 算法模板库,是 FEtch 系统默认的非线性迭代算法。

可以看出,迭代过程的引入是非线性问题较线性问题计算量明显增大的主要原因。因此,如何在保证计算稳定性的同时提高收敛速度,一直是非线性求解领域永恒的话题。

脚本编写

一个具体问题的有限元语言表述,通常需要包含 5 种类型的文件:PDE、FBC、MDI、GCN 和 NFE。由于方程 $\eqref{eq2}$ 不存在边界积分项,所以不需要编写 FBC 文件。下面依次给出其他 4 个文件的详细介绍。

PDE 文件

在这个例子中,只有一个物理场,需要给出温度场对应的 PDE 文件和 FBC 文件。根据有限元语言的语法规则,将方程 $\eqref{eq2}$ 的体积分项写入 PDE 文件如下。

laplace.pde 说明
defi
disp u
coor x y
shap %1 %2
gaus %3
coef un
mate ek 1.0

stif
$cv ek=1/dsqrt(1d0+{un/x}**2+{un/y}**2)
dist = +[u/x;u/x]*ek+[u/y;u/y]*ek

load = +[u]*0

end
系统关键字(信息定义)
定义未知量
定义坐标分量
定义采用的形函数
定义采用的积分方式
定义非线性变量,引入上一迭代步的结果
定义用到的材料参数和默认参数值
(空行)
系统关键字(单元刚度矩阵表达式定义)
计算非线性系数
刚度矩阵项,对应式 $\eqref{eq2}$ 左侧
(空行)
荷载向量项,对应式 $\eqref{eq2}$ 右侧
(空行)
系统关键字(文件结束)

这里将 shap 行和 gaus 行的参数设为待定,参数值 %1、%2 和 %3 将从 MDI 文件中取得。

MDI 文件

MDI 文件负责组织 PDE 和 FBC 文件,声明程序具体使用的坐标系统、单元类型和积分方法。这里文件命名为 nlap.mdi,具体内容如下。

nlap.mdi 说明
2dxy
#a 1 1 u
pde laplace q4g2
#
在二维直角坐标系下求解
a场,1 个初值,1 个自由度,自由度名称为 u
调用 laplace.pde,采用 4 节点四边形单元,2 点高斯积分
(文件结束符,可留空)

MDI 文件声明的单元类型和积分方式将以参数的形式传递给 PDE 文件中的的 %1、%2 和 %3。如果后续想要使用其他的单元类型或者积分方法,只需修改 MDI 文件即可。

GCN 文件

GCN 文件给出计算流程信息,系统规定其文件名字要与 MDI 文件一致。作为线性椭圆方程,稳态热传导问题的计算流程非常简单,只需填写少量代码,具体内容如下。

nlap.gcn 说明
defi
a nell

cc = 1.0
errb = 1.0e-8
itnmax = 100

#startsin a
iend = 0
itn = 1
do while(iend==0)
#solvsin a
itn = itn+1
enddo
算法引入段
a 场,采用的算法模板文件为 nell.nfe
空行,开始命令流段
迭代变量赋值
误差阈值
最大迭代次数

初始化 a 场
迭代结束标志赋初值
迭代步数赋初值
迭代步循环开始
 求解 a 场
 更新 itn
迭代步循环结束

NFE 文件

GCN 文件使用了 nell 算法,系统会基于模板文件自动生成以下的 nlapa.nfe 文件。如果用户有其他需要,可以在此基础上进一步地修改。

nlapa.nfe 说明
defi
stif s
load f

coef u1

equation
vect u1,du
read(s,unod) u1,du
matrix = [s]
forc=[f]

solution u
vect ue
[ue]=[u]-[u1]
$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.5*rab) cc = cc*2.0
$c6 if (ab.gt.0.8*rab) cc = cc*2.0
$c6 if (ab.lt.0.0) cc = cc*0.5
$c6 if (ab.lt.-0.40*rab) cc = cc*0.5
$c6 if (ab.lt.-0.80*rab) cc = cc*0.5
$c6 endif
$c6 if (cc.gt.1.0) cc = 1.0
$c6 err = aa
$c6 ul = 0.0
[u] = [u1]+[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 .or. itn.ge.itnmax) then
$c6 if (cc .ne. 1.0) then
$c6 cc = -1
$c6 else
$c6 iend=1
gidpost("u",1.0) u(1)
[ue]=0.0
$c6 endif
$c6 endif
write(s,unod) u,ue

end
DEFI段
定义刚度矩阵名为 s
定义载荷向量名为 f
(空行)
耦合的场向量
(空行)
EQUATION段
定义场向量
读入上一迭代步的结果
方程组左端矩阵,对应式 $\eqref{eq4}$ 左侧
方程组右端向量,对应式 $\eqref{eq4}$ 右侧
(空行)
SOLUTION段 定义求解的场向量

计算当前迭代步增量 ue




循环所有节点上的所有自由度
计算 ue 的模的平方和 aa
计算 ue 与 du 的广义内积 ab
计算 du 的模的平方和 bb



依据当前迭代步增量 ue与
上一迭代步增量 du 之间的夹角,
来调整松弛因子
当夹角为锐角时,适当放大 cc
当夹角为钝角时,则适当缩小 cc







用松弛因子调整计算结果





收敛判断

继续迭代标记,保证收敛时的 cc = 1



迭代结束标志更新
将计算结果写入 GiD 后处理文件


临时存储当前的结果,供下一迭代步读取
(空行)
结束标记

算例

问题描述

在本例中,取 $\Omega$ 为位于坐标原点的一个单位圆盘,边界上的 $\varphi(x, y)=x^2$,求此时面积最小的曲面。

前处理

填写材料参数文件

系统自动生成了 nlap.mat 文件,用于设置材料参数。参数初始值全部为 PDE 文件给出的默认值。可根据具体问题进行修改。对于本算例,文件内容如下。

nlap.mat 说明
1 2 aeq4g2
num ek
1 1.0
#
4 节点四边形面单元
材料参数
参数值
分隔符

赋单元材料号

赋迭代初始值

施加边界条件

其中:
u-I 为边界类型,-1 表示约束,1 表示自由
u-D 为相应的约束值或荷载值

网格剖分

根据所开发程序的计算要求,采用四边形线性单元进行网格剖分。共 1203 个单元,1292 个节点。

计算结果

可以看到,限制在单位圆区域,以 $x^2$ 为边界的面积最小的曲面是马鞍面。计算结果与理论解完全一致,充分证明了算法和程序的有效性。




打赏一个
取消

感谢您的支持,我们会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝或微信扫一扫,即可进行扫码打赏哦