如何在有限元实现中实现点源或体源

计算科学 有限元 数字 数值建模 平流扩散 微流体
2021-12-09 22:40:24

我正在尝试做一个简单的实现来研究直管中的对流-扩散-反应动力学。 在此处输入图像描述

我沿着管道的长度放置了点(上图中的蓝点)。

我遇到了一个博客(链接),它解释了如何实现点源。但是,我不确定在这种情况下如何适应它。

捕捉浓度动态的方程如下

在此处输入图像描述

RHS最后一项中的R对应sink/source,单位一般定义为mol/m^3 s。我想定义 R = kc,其中 k 的单位是每秒。但我只想在蓝色的点上定义 R(即仅作为点源/汇而不是线源或汇)。

我想就如何完成这个实现征求建议。

编辑:我想将 1D 直管模拟对流扩散动力学的 FEM 结果与位于管道长度上的点汇(上面发布的问题)与解析解进行比较。

关于可以比较数值结果的解析表达式的建议将非常有帮助。

2个回答

@user21 的回答相反,我认为您不需要为点负载做任何特别的事情。让我们看看为什么。

点载荷可以表示为狄拉克增量“函数”所以,在你的情况下,它会像

R=ρδ(xxi),

其中是源的强度,是位置。ρxi

如果我们对有限元方法使用加权残差,您最终会得到以下“体”源的积分

b=ΩR(x)w(x),

权重函数。如果w(x)R(x)=ρδ(xxi)

b=Ωρδ(xxi)w(x)=ρw(xi).

因此,在点评估您的权重函数就足够了。对于“普通”有限元,我们使用插值函数。这意味着以下xi

b={ρfor nodes,ρϕj(ri)otherwise,

其中表示参考元素中点的位置。ri

请注意以下事项:

  • 对于与节点重合的点(您的情况),源仅对向量中的一个条目做出贡献。但是对于元素内的点,它对与该元素相关的所有节点都有贡献,每个函数一个。bϕj

  • 对于线性元素,但对于高阶元素并非如此。ϕj(ri)>0

关于一个人是否应该使用点源及其物理解释的问题......我认为这是另一回事,与问题的物理学更相关。尊重您在问题末尾提到的单位,我认为您没有提供足够的信息来评估它。

看到您在mathematica stackexchange上也有一个帐户,我将展示一个使用Mathematica 的实现。这当然不是你能做到的唯一方法,但希望能让你开始。

我们首先创建一个 1D 网格

Needs["NDSolve`FEM`"]
region = Line[{{0}, {1}}];
includePoints = {{1/3}, {2/3}};
mesh = ToElementMesh[region, "IncludePoints" -> includePoints, 
  "MaxCellMeasure" -> 0.0008]

网格在 1/3 和 2/3 处包含点。这是我们稍后将放置点源的地方。我还改进了网格,因为我要添加一个对流项,这将使这个 PDE 对流占主导地位(大 Peclet 数)。

我们设置了因变量、质量浓度、时间变量和空间自变量还定义了一些材料属性。ctx

vars = {c[t, x], t, {x}};
pars = <|"DiffusionCoefficient" -> 1, 
   "MassConvectionVelocity" -> {100}|>;

对于点源,想法是使用正则化 delta 函数。Dirac delta 函数在使用 FEM 实现的数值模拟中提出了一个问题,该函数不准备将其作为输入。这是因为 Dirac delta 函数在源位置处是奇异的,并且需要与 FEM 处理其他项的方式不同的特殊处理。这可以通过对 Dirac delta 函数的近似来避免。逼近狄拉克δ函数的过程称为正则化。Xs

RegularizedDeltaPoint[g_, X_List, Xs_List] := 
 Piecewise[{{Times @@ Thread[1/(4 g) (1 + Cos[\[Pi]/(2 g) (X - Xs)])],
     And @@ Thread[RealAbs[X - Xs] <= 2 g]}, {0, True}}]

有关这方面的更多信息,请参阅传热教程大众运输的过程是相同的。因此,如果您还想对源进行批量处理,您可以按照该教程中提到的相同方式进行操作。

Subscript[h, mesh] = Sqrt[Min[mesh["MeshElementMeasure"]]];
Subscript[gamma, reg] = Subscript[h, mesh]/2;

正则化函数需要一个基于最小元素直径的参数 gamma。让我们在第一个包含点处构建点源并将其可视化。

temp = RegularizedDeltaPoint[Subscript[gamma, reg], {x}, 
  includePoints[[1]]];
Plot[temp, {x, 0, 1}]

在此处输入图像描述

您会看到这是对 delta 分布的理想化近似。注意

Integrate[temp, {x, 0, 1}]
1.

Comsol 方法使用了一个弱公式。那是一种不同的方法。我试图表明(点)源可以以不同的方式设置。

Qp = 10;
pars["MassSource"] = 
  RegularizedDeltaPoint[Subscript[gamma, reg], {x}, 
     includePoints[[1]]]*Qp +
   RegularizedDeltaPoint[Subscript[gamma, reg], {x}, 
     includePoints[[2]]]*If[t > 1/2*10^-3, 5*Qp, 0];

Qp是点源强度。单位将是 [ ],因为正则化函数的维度少,源具有与整体 PDE 组件相同的单位,请参见此处第一个点源始终处于活动状态,而第二个点源仅在特定时间开始但更强。mol/(m3s)

我们设置 PDE 并解决它。

pde = {MassTransportPDEComponent[vars, pars] == 0, c[0, x] == 0};
tEnd = 10^-3;
cfun = NDSolveValue[pde, c, {t, 0, tEnd}, {x} \[Element] mesh];

可视化/探索结果。

Manipulate[
 Plot[cfun[t, x], {x} \[Element] region, 
  PlotRange -> {{0, 1}, {0, 1/2}}], {t, 0, tEnd}]

在此处输入图像描述

更多信息可以在MassTransport教程MassTransportPDEComponent中找到。

我希望这对你有用。

旧版本更新:

我在上面发布的代码适用于 12.3 版。由于 OP 有 12.0 以下是相同的代码,适用于 12.0 版本。本质上MassTransportPDEComponent12.0 中不可用。但这不是问题,因为可以手动编写 PDE。这是完整的代码:

第一部分与以前相同:

RegularizedDeltaPoint[g_, X_List, Xs_List] := 
  Piecewise[{{Times @@ 
      Thread[1/(4 g) (1 + Cos[\[Pi]/(2 g) (X - Xs)])], 
     And @@ Thread[RealAbs[X - Xs] <= 2 g]}, {0, True}}];

Needs["NDSolve`FEM`"]
region = Line[{{0}, {1}}];
includePoints = {{1/3}, {2/3}};
mesh = ToElementMesh[region, "IncludePoints" -> includePoints, 
   "MaxCellMeasure" -> 0.0008];

Subscript[h, mesh] = Sqrt[Min[mesh["MeshElementMeasure"]]];
Subscript[gamma, reg] = Subscript[h, mesh]/2;

这部分是事情发生变化的地方。我添加了一个参数部分并添加了 PDE 的手动形式。

parameters = {kappa -> {{1}}, v1 -> 100, 
   gamma -> Subscript[gamma, reg], Qp -> 10};
pde = {Derivative[1, 0][c][t, x] + 
      Inactive[Div][(-kappa) . 
        Inactive[Grad][c[t, x], {x}], {x}] + {v1} . 
       Inactive[Grad][c[t, x], {x}] - 
      Qp*RegularizedDeltaPoint[gamma, {x}, {1/3}] - 
      If[t > 1/2000, 5*Qp, 0]*
       RegularizedDeltaPoint[gamma, {x}, {2/3}] == 0, 
    c[0, x] == 0} /. parameters;

tEnd = 10^-3;
cfun = NDSolveValue[pde, c, {t, 0, tEnd}, {x} \[Element] mesh];

这应该在版本 12.0 中为您提供相同的结果。

更新:云版

另一种选择是使用 wolfram 云。这是笔记本的云版本